溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

【Redis】Sentinel 高可用架構(gòu)

發(fā)布時間:2020-08-11 15:09:06 來源:ITPUB博客 閱讀:171 作者:weilihua2817 欄目:關(guān)系型數(shù)據(jù)庫
一 前言
   Redis-Sentinel是Redis官方推薦的高可用性(HA)解決方案,當(dāng)用Redis做Master-slave的高可用方案時,假如master宕機了,Redis本身(包括它的很多客戶端)都沒有實現(xiàn)自動進(jìn)行主備切換,而Redis-sentinel本身也是一個獨立運行的進(jìn)程,它能監(jiān)控多個master-slave集群,發(fā)現(xiàn)master宕機后能進(jìn)行自懂切換。它的主要功能有:
  1. 1 不時地監(jiān)控redis是否按照預(yù)期良好地運行;
  2. 2 如果發(fā)現(xiàn)某個redis節(jié)點運行出現(xiàn)狀況,能夠通知另外一個進(jìn)程(例如它的客戶端);
  3. 3 能夠進(jìn)行自動切換。當(dāng)一個master節(jié)點不可用時,能夠選舉出master的多個slave(如果有超過一個slave的話)中的一個來作為新的master,其它的slave節(jié)點會將它所追隨的master的地址改為被提升為master的slave的新地址。
二 實踐
 本文介紹搭建主從復(fù)制以及三節(jié)點的sentinel 構(gòu)建redis的高可用系統(tǒng)。其中 redis 一套主從 ,sentinel 三個節(jié)點 因為機器資源限制 ,兩個sentinel 節(jié)點和 redis復(fù)用。
2.1 環(huán)境準(zhǔn)備
  1. Redis版本:Redis-3.2.8
  2. OS 版本 CentOS 6
  3. redis、sentinel
  4. 10.9.34.172 reids master
  5. 10.9.43.207 reids slave
  6. sentinel
  7. 10.9.34.252 sentinel
2.2 軟件安裝
  1. wget http://download.redis.io/releases/redis-3.2.8.tar.gz
  2. tar zxvf redis-3.2.8.tar.gz
  3. mv redis-3.2.8 /usr/local/redis
  4. cd /usr/local/redis
  5. make PREFIX=/usr/local/redis install
  6. cd src && make test
  7. 創(chuàng)建軟連接
  8. ln -s /usr/local/redis/bin/redis-cli /usr/local/bin/redis-cli ;
  9. ln -s /usr/local/redis/bin/redis-sentinel /usr/local/bin/redis-sentinel ;
  10. ln -s /usr/local/redis/bin/redis-server /usr/local/bin/redis-server ;
2.3 配置文件
復(fù)制源碼包里中的sentinel.conf和redis.conf文件到 /etc/redis 目錄,我們需要重寫編寫配置文件,進(jìn)行配置主從.
  1. mkdir -p /etc/redis
  2. cp /usr/local/redis/redis.conf /etc/redis/redis_7021.conf
  3. cp /usr/local/redis/sentinel.conf /etc/redis/sentinel_17021.conf
  4. cp /usr/local/redis/utils/redis_init_script /etc/init.d/redis
當(dāng)然如果是想MySQL單機多實例那樣,redis配置文件還可以放到redis 的實例里面 比如 /data/redis7021/redis.conf ,跟著redis實例走。
redis_7021.conf 的內(nèi)容
需要注意的是 本人為了圖方便 去掉了權(quán)限以及 bind 并且設(shè)置了protected-mode 為no ,安裝測試的過程中因為這兩個參數(shù)導(dǎo)致額外的幾個問題。生產(chǎn)上還是建議啟用這兩個參數(shù)的。還要記得本例子是主庫,從庫還要加上
slaveof  master_ip port
  1. #redis.conf
  2. #Redis configuration file example.
  3. #./redis-server /path/to/redis.conf

  4. ################################## INCLUDES ###################################
  5. #這在你有標(biāo)準(zhǔn)配置模板但是每個redis服務(wù)器又需要個性設(shè)置的時候很有用。
  6. # include /path/to/local.conf
  7. # include /path/to/other.conf

  8. ################################ GENERAL #####################################
  9. #是否在后臺執(zhí)行,yes:后臺運行;no:不是后臺運行(老版本默認(rèn))
  10. daemonize yes
  11. #3.2里的參數(shù),是否開啟保護(hù)模式,默認(rèn)開啟。要是配置里沒有指定bind和密碼。開啟該參數(shù)后,redis只會本地進(jìn)行訪問,拒絕外部訪問。要是開啟了密碼 和bind,可以開啟。否 則最好關(guān)閉,設(shè)置為no。
  12. protected-mode no

  13. #redis的進(jìn)程文件
  14. pidfile "/data/redis_7021/run/redis.pid"

  15. #redis監(jiān)聽的端口號。
  16. port 7021

  17. #此參數(shù)確定了TCP連接中已完成隊列(完成三次握手之后)的長度, 當(dāng)然此值必須不大于Linux系統(tǒng)定義的/proc/sys/net/core/somaxconn值,默認(rèn)是511,而Linux的默認(rèn)參數(shù)值是128。當(dāng)系統(tǒng)并發(fā)量大并且客戶端速度緩慢的時候,可以將這二個參數(shù)一起參考設(shè)定。該內(nèi)核參數(shù)默認(rèn)值一般是128,對于負(fù)載很大的服務(wù)程序來說大大的不夠。一般會將它修改為2048或者更大。在/etc/sysctl.conf中添加:net.core.somaxconn = 2048,然后在終端中執(zhí)行sysctl -p。
  18. tcp-backlog 511

  19. #指定 redis 只接收來自于該 IP 地址的請求,如果不進(jìn)行設(shè)置,那么將處理所有請求
  20. #bind 10.9.34.172

  21. #配置unix socket來讓redis支持監(jiān)聽本地連接。
  22. unixsocket "/data/redis_7021/run/redis.sock"
  23. #配置unix socket使用文件的權(quán)限
  24. # unixsocketperm 700

  25. # 此參數(shù)為設(shè)置客戶端空閑超過timeout,服務(wù)端會斷開連接,為0則服務(wù)端不會主動斷開連接,不能小于0。
  26. timeout 0

  27. #tcp keepalive參數(shù)。如果設(shè)置不為0,就使用配置tcp的SO_KEEPALIVE值,使用keepalive有兩個好處:檢測掛掉的對端。降低中間設(shè)備出問題而導(dǎo)致網(wǎng)絡(luò)看似連接卻已經(jīng)與對端端口的問題。在Linux內(nèi)核中,設(shè)置了keepalive,redis會定時給對端發(fā)送ack。檢測到對端關(guān)閉需要兩倍的設(shè)置值。
  28. tcp-keepalive 0

  29. #指定了服務(wù)端日志的級別。級別包括:debug(很多信息,方便開發(fā)、測試),verbose(許多有用的信息,但是沒有debug級別信息多),notice(適當(dāng)?shù)娜罩炯墑e,適合生產(chǎn)環(huán)境),warn(只有非常重要的信息)
  30. loglevel notice

  31. #指定了記錄日志的文件??兆址脑挘罩緯蛴〉綐?biāo)準(zhǔn)輸出設(shè)備。后臺運行的redis標(biāo)準(zhǔn)輸出是/dev/null。
  32. logfile "/data/redis_7021/log/alert.log"

  33. #是否打開記錄syslog功能
  34. # syslog-enabled no

  35. #syslog的標(biāo)識符。
  36. # syslog-ident redis

  37. #日志的來源、設(shè)備
  38. # syslog-facility local0

  39. #數(shù)據(jù)庫的數(shù)量,默認(rèn)使用的數(shù)據(jù)庫是DB 0??梢酝ㄟ^”SELECT “命令選擇一個db
  40. databases 16

  41. ################################ SNAPSHOTTING ################################
  42. # 快照配置
  43. # 注釋掉“save”這一行配置項就可以讓保存數(shù)據(jù)庫功能失效
  44. # 設(shè)置sedis進(jìn)行數(shù)據(jù)庫鏡像的頻率。
  45. # 900秒(15分鐘)內(nèi)至少1個key值改變(則進(jìn)行數(shù)據(jù)庫保存--持久化)
  46. # 300秒(5分鐘)內(nèi)至少10個key值改變(則進(jìn)行數(shù)據(jù)庫保存--持久化)
  47. # 60秒(1分鐘)內(nèi)至少10000個key值改變(則進(jìn)行數(shù)據(jù)庫保存--持久化)
  48. #save 900 1
  49. #save 300 10
  50. #save 60 10000

  51. #當(dāng)RDB持久化出現(xiàn)錯誤后,是否依然進(jìn)行繼續(xù)進(jìn)行工作,yes:不能進(jìn)行工作,no:可以繼續(xù)進(jìn)行工作,可以通過info中的rdb_last_bgsave_status了解RDB持久化是否有錯誤
  52. stop-writes-on-bgsave-error yes

  53. #使用壓縮rdb文件,rdb文件壓縮使用LZF壓縮算法,yes:壓縮,但是需要一些cpu的消耗。no:不壓縮,需要更多的磁盤空間
  54. rdbcompression yes

  55. #是否校驗rdb文件。從rdb格式的第五個版本開始,在rdb文件的末尾會帶上CRC64的校驗和。這跟有利于文件的容錯性,但是在保存rdb文件的時候,會有大概10%的性能損耗,所以如果你追求高性能,可以關(guān)閉該配置。
  56. rdbchecksum no

  57. #rdb文件的名稱
  58. dbfilename "dump.rdb"

  59. #數(shù)據(jù)目錄,數(shù)據(jù)庫的寫入會在這個目錄。rdb、aof文件也會寫在這個目錄
  60. dir "/data/redis_7021/data"

  61. ################################# REPLICATION #################################
  62. #復(fù)制選項,slave復(fù)制對應(yīng)的master。
  63. # slaveof <masterip> <masterport>

  64. #如果master設(shè)置了requirepass,那么slave要連上master,需要有master的密碼才行。masterauth就是用來配置master的密碼,這樣可以在連上master后進(jìn)行認(rèn)證。
  65. #masterauth "youzan"

  66. #當(dāng)從庫同主機失去連接或者復(fù)制正在進(jìn)行,從機庫有兩種運行方式:1) 如果slave-serve-stale-data設(shè)置為yes(默認(rèn)設(shè)置),從庫會繼續(xù)響應(yīng)客戶端的請求。2) 如果slave-serve-stale-data設(shè)置為no,除去INFO和SLAVOF命令之外的任何請求都會返回一個錯誤”SYNC with master in progress”。
  67. slave-serve-stale-data yes

  68. #作為從服務(wù)器,默認(rèn)情況下是只讀的(yes),可以修改成NO,用于寫(不建議)。
  69. slave-read-only yes

  70. #是否使用socket方式復(fù)制數(shù)據(jù)。目前redis復(fù)制提供兩種方式,disk和socket。如果新的slave連上來或者重連的slave無法部分同步,就會執(zhí)行全量同步,master會生成rdb文件。有2種方式:disk方式是master創(chuàng)建一個新的進(jìn)程把rdb文件保存到磁盤,再把磁盤上的rdb文件傳遞給slave。socket是master創(chuàng)建一個新的進(jìn)程,直接把rdb文件以socket的方式發(fā)給slave。disk方式的時候,當(dāng)一個rdb保存的過程中,多個slave都能共享這個rdb文件。socket的方式就的一個個slave順序復(fù)制。在磁盤速度緩慢,網(wǎng)速快的情況下推薦用socket方式。
  71. repl-diskless-sync no

  72. #diskless復(fù)制的延遲時間,防止設(shè)置為0。一旦復(fù)制開始,節(jié)點不會再接收新slave的復(fù)制請求直到下一個rdb傳輸。所以最好等待一段時間,等更多的slave連上來。
  73. repl-diskless-sync-delay 5

  74. #slave根據(jù)指定的時間間隔向服務(wù)器發(fā)送ping請求。時間間隔可以通過 repl_ping_slave_period 來設(shè)置,默認(rèn)10秒。
  75. repl-ping-slave-period 5

  76. #復(fù)制連接超時時間。master和slave都有超時時間的設(shè)置。master檢測到slave上次發(fā)送的時間超過repl-timeout,即認(rèn)為slave離線,清除該slave信息。slave檢測到上次和master交互的時間超過repl-timeout,則認(rèn)為master離線。需要注意的是repl-timeout需要設(shè)置一個比repl-ping-slave-period更大的值,不然會經(jīng)常檢測到超時。
  77. repl-timeout 60

  78. #是否禁止復(fù)制tcp鏈接的tcp nodelay參數(shù),可傳遞yes或者no。默認(rèn)是no,即使用tcp nodelay。如果master設(shè)置了yes來禁止tcp nodelay設(shè)置,在把數(shù)據(jù)復(fù)制給slave的時候,會減少包的數(shù)量和更小的網(wǎng)絡(luò)帶寬。但是這也可能帶來數(shù)據(jù)的延遲。默認(rèn)我們推薦更小的延遲,但是在數(shù)據(jù)量傳輸很大的場景下,建議選擇yes。
  79. repl-disable-tcp-nodelay no

  80. #復(fù)制緩沖區(qū)大小,這是一個環(huán)形復(fù)制緩沖區(qū),用來保存最新復(fù)制的命令。這樣在slave離線的時候,不需要完全復(fù)制master的數(shù)據(jù),如果可以執(zhí)行部分同步,只需要把緩沖區(qū)的部分?jǐn)?shù)據(jù)復(fù)制給slave,就能恢復(fù)正常復(fù)制狀態(tài)。緩沖區(qū)的大小越大,slave離線的時間可以更長,復(fù)制緩沖區(qū)只有在有slave連接的時候才分配內(nèi)存。沒有slave的一段時間,內(nèi)存會被釋放出來,默認(rèn)1m。
  81. repl-backlog-size 32mb

  82. #master沒有slave一段時間會釋放復(fù)制緩沖區(qū)的內(nèi)存,repl-backlog-ttl用來設(shè)置該時間長度。單位為秒。
  83. repl-backlog-ttl 3600

  84. #當(dāng)master不可用,Sentinel會根據(jù)slave的優(yōu)先級選舉一個master。最低的優(yōu)先級的slave,當(dāng)選master。而配置成0,永遠(yuǎn)不會被選舉。
  85. slave-priority 100

  86. #redis提供了可以讓master停止寫入的方式,如果配置了min-slaves-to-write,健康的slave的個數(shù)小于N,mater就禁止寫入。master最少得有多少個健康的slave存活才能執(zhí)行寫命令。這個配置雖然不能保證N個slave都一定能接收到master的寫操作,但是能避免沒有足夠健康的slave的時候,master不能寫入來避免數(shù)據(jù)丟失。設(shè)置為0是關(guān)閉該功能。
  87. # min-slaves-to-write 3

  88. #延遲小于min-slaves-max-lag秒的slave才認(rèn)為是健康的slave。
  89. # min-slaves-max-lag 10

  90. # 設(shè)置1或另一個設(shè)置為0禁用這個特性。
  91. # Setting one or the other to 0 disables the feature.
  92. # By default min-slaves-to-write is set to 0 (feature disabled) and
  93. # min-slaves-max-lag is set to 10.

  94. ################################## SECURITY ###################################
  95. #requirepass配置可以讓用戶使用AUTH命令來認(rèn)證密碼,才能使用其他命令。這讓redis可以使用在不受信任的網(wǎng)絡(luò)中。為了保持向后的兼容性,可以注釋該命令,因為大部分用戶也不需要認(rèn)證。使用requirepass的時候需要注意,因為redis太快了,每秒可以認(rèn)證15w次密碼,簡單的密碼很容易被攻破,所以最好使用一個更復(fù)雜的密碼。
  96. #requirepass "youzan"

  97. #把危險的命令給修改成其他名稱。比如CONFIG命令可以重命名為一個很難被猜到的命令,這樣用戶不能使用,而內(nèi)部工具還能接著使用。
  98. # rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52
  99. rename-command SHUTDOWN REDIS_SHUTDOWN
  100. rename-command FLUSHDB REDIS_FLUSHDB
  101. rename-command FLUSHALL REDIS_FLUSHALL
  102. rename-command KEYS REDIS_KEYS
  103. #rename-command CONFIG REDIS_CONFIG
  104. #rename-command SLAVEOF REDIS_SLAVEOF
  105. #設(shè)置成一個空的值,可以禁止一個命令
  106. # rename-command CONFIG ""
  107. ################################### LIMITS ####################################

  108. # 設(shè)置能連上redis的最大客戶端連接數(shù)量。默認(rèn)是10000個客戶端連接。由于redis不區(qū)分連接是客戶端連接還是內(nèi)部打開文件或者和slave連接等,所以maxclients最小建議設(shè)置到32。如果超過了maxclients,redis會給新的連接發(fā)送’max number of clients reached’,并關(guān)閉連接。
  109. # maxclients 10000

  110. #redis配置的最大內(nèi)存容量。當(dāng)內(nèi)存滿了,需要配合maxmemory-policy策略進(jìn)行處理。注意slave的輸出緩沖區(qū)是不計算在maxmemory內(nèi)的。所以為了防止主機內(nèi)存使用完,建議設(shè)置的maxmemory需要更小一些。
  111. maxmemory 512mb

  112. #內(nèi)存容量超過maxmemory后的處理策略。
  113. #volatile-lru:利用LRU算法移除設(shè)置過過期時間的key。
  114. #volatile-random:隨機移除設(shè)置過過期時間的key。
  115. #volatile-ttl:移除即將過期的key,根據(jù)最近過期時間來刪除(輔以TTL)
  116. #allkeys-lru:利用LRU算法移除任何key。
  117. #allkeys-random:隨機移除任何key。
  118. #noeviction:不移除任何key,只是返回一個寫錯誤。
  119. #上面的這些驅(qū)逐策略,如果redis沒有合適的key驅(qū)逐,對于寫命令,還是會返回錯誤。redis將不再接收寫請求,只接收get請求。寫命令包括:set setnx setex append incr decr rpush lpush rpushx lpushx linsert lset rpoplpush sadd sinter sinterstore sunion sunionstore sdiff sdiffstore zadd zincrby zunionstore zinterstore hset hsetnx hmset hincrby incrby decrby getset mset msetnx exec sort。
  120. maxmemory-policy allkeys-lru

  121. #lru檢測的樣本數(shù)。使用lru或者ttl淘汰算法,從需要淘汰的列表中隨機選擇sample個key,選出閑置時間最長的key移除。
  122. # maxmemory-samples 5

  123. ############################## APPEND ONLY MODE ###############################
  124. #默認(rèn)redis使用的是rdb方式持久化,這種方式在許多應(yīng)用中已經(jīng)足夠用了。但是redis如果中途宕機,會導(dǎo)致可能有幾分鐘的數(shù)據(jù)丟失,根據(jù)save來策略進(jìn)行持久化,Append Only File是另一種持久化方式,可以提供更好的持久化特性。Redis會把每次寫入的數(shù)據(jù)在接收后都寫入 appendonly.aof 文件,每次啟動時Redis都會先把這個文件的數(shù)據(jù)讀入內(nèi)存里,先忽略RDB文件。
  125. appendonly no

  126. #aof文件名
  127. appendfilename "appendonly.aof"

  128. #aof持久化策略的配置
  129. #no表示不執(zhí)行fsync,由操作系統(tǒng)保證數(shù)據(jù)同步到磁盤,速度最快。
  130. #always表示每次寫入都執(zhí)行fsync,以保證數(shù)據(jù)同步到磁盤。
  131. #everysec表示每秒執(zhí)行一次fsync,可能會導(dǎo)致丟失這1s數(shù)據(jù)。
  132. appendfsync everysec

  133. # 在aof重寫或者寫入rdb文件的時候,會執(zhí)行大量IO,此時對于everysec和always的aof模式來說,執(zhí)行fsync會造成阻塞過長時間,no-appendfsync-on-rewrite字段設(shè)置為默認(rèn)設(shè)置為no。如果對延遲要求很高的應(yīng)用,這個字段可以設(shè)置為yes,否則還是設(shè)置為no,這樣對持久化特性來說這是更安全的選擇。設(shè)置為yes表示rewrite期間對新寫操作不fsync,暫時存在內(nèi)存中,等rewrite完成后再寫入,默認(rèn)為no,建議yes。Linux的默認(rèn)fsync策略是30秒??赡軄G失30秒數(shù)據(jù)。
  134. no-appendfsync-on-rewrite yes

  135. #aof自動重寫配置。當(dāng)目前aof文件大小超過上一次重寫的aof文件大小的百分之多少進(jìn)行重寫,即當(dāng)aof文件增長到一定大小的時候Redis能夠調(diào)用bgrewriteaof對日志文件進(jìn)行重寫。當(dāng)前AOF文件大小是上次日志重寫得到AOF文件大小的二倍(設(shè)置為100)時,自動啟動新的日志重寫過程。
  136. auto-aof-rewrite-percentage 100
  137. #設(shè)置允許重寫的最小aof文件大小,避免了達(dá)到約定百分比但尺寸仍然很小的情況還要重寫
  138. auto-aof-rewrite-min-size 64mb

  139. #aof文件可能在尾部是不完整的,當(dāng)redis啟動的時候,aof文件的數(shù)據(jù)被載入內(nèi)存。重啟可能發(fā)生在redis所在的主機操作系統(tǒng)宕機后,尤其在ext4文件系統(tǒng)沒有加上data=ordered選項(redis宕機或者異常終止不會造成尾部不完整現(xiàn)象。)出現(xiàn)這種現(xiàn)象,可以選擇讓redis退出,或者導(dǎo)入盡可能多的數(shù)據(jù)。如果選擇的是yes,當(dāng)截斷的aof文件被導(dǎo)入的時候,會自動發(fā)布一個log給客戶端然后load。如果是no,用戶必須手動redis-check-aof修復(fù)AOF文件才可以。
  140. aof-load-truncated yes

  141. ################################ LUA SCRIPTING ###############################
  142. # 如果達(dá)到最大時間限制(毫秒),redis會記個log,然后返回error。當(dāng)一個腳本超過了最大時限。只有SCRIPT KILL和SHUTDOWN NOSAVE可以用。第一個可以殺沒有調(diào)write命令的東西。要是已經(jīng)調(diào)用了write,只能用第二個命令殺。
  143. lua-time-limit 5000

  144. ################################ REDIS CLUSTER ###############################
  145. #集群開關(guān),默認(rèn)是不開啟集群模式。
  146. #cluster-enabled yes

  147. #集群配置文件的名稱,每個節(jié)點都有一個集群相關(guān)的配置文件,持久化保存集群的信息。這個文件并不需要手動配置,這個配置文件有Redis生成并更新,每個Redis集群節(jié)點需要一個單獨的配置文件,請確保與實例運行的系統(tǒng)中配置文件名稱不沖突
  148. #cluster-config-file nodes-7021.conf

  149. #節(jié)點互連超時的閥值。集群節(jié)點超時毫秒數(shù)
  150. #cluster-node-timeout 30000

  151. #在進(jìn)行故障轉(zhuǎn)移的時候,全部slave都會請求申請為master,但是有些slave可能與master斷開連接一段時間了,導(dǎo)致數(shù)據(jù)過于陳舊,這樣的slave不應(yīng)該被提升為master。該參數(shù)就是用來判斷slave節(jié)點與master斷線的時間是否過長。判斷方法是:
  152. #比較slave斷開連接的時間和(node-timeout * slave-validity-factor) + repl-ping-slave-period
  153. #如果節(jié)點超時時間為三十秒, 并且slave-validity-factor為10,假設(shè)默認(rèn)的repl-ping-slave-period是10秒,即如果超過310秒slave將不會嘗試進(jìn)行故障轉(zhuǎn)移
  154. #可能出現(xiàn)由于某主節(jié)點失聯(lián)卻沒有從節(jié)點能頂上的情況,從而導(dǎo)致集群不能正常工作,在這種情況下,只有等到原來的主節(jié)點重新回歸到集群,集群才恢復(fù)運作
  155. #如果設(shè)置成0,則無論從節(jié)點與主節(jié)點失聯(lián)多久,從節(jié)點都會嘗試升級成主節(jié)
  156. #cluster-slave-validity-factor 10

  157. #master的slave數(shù)量大于該值,slave才能遷移到其他孤立master上,如這個參數(shù)若被設(shè)為2,那么只有當(dāng)一個主節(jié)點擁有2 個可工作的從節(jié)點時,它的一個從節(jié)點會嘗試遷移。
  158. #主節(jié)點需要的最小從節(jié)點數(shù),只有達(dá)到這個數(shù),主節(jié)點失敗時,它從節(jié)點才會進(jìn)行遷移。
  159. # cluster-migration-barrier 1

  160. #默認(rèn)情況下,集群全部的slot有節(jié)點分配,集群狀態(tài)才為ok,才能提供服務(wù)。設(shè)置為no,可以在slot沒有全部分配的時候提供服務(wù)。不建議打開該配置,這樣會造成分區(qū)的時候,小分區(qū)的master一直在接受寫請求,而造成很長時間數(shù)據(jù)不一致。
  161. #在部分key所在的節(jié)點不可用時,如果此參數(shù)設(shè)置為”yes”(默認(rèn)值), 則整個集群停止接受操作;如果此參數(shù)設(shè)置為”no”,則集群依然為可達(dá)節(jié)點上的key提供讀操作
  162. #cluster-require-full-coverage yes

  163. ################################## LOG ###################################
  164. ###slog log是用來記錄redis運行中執(zhí)行比較慢的命令耗時。當(dāng)命令的執(zhí)行超過了指定時間,就記錄在slow log中,slog log保存在內(nèi)存中,所以沒有IO操作。
  165. #執(zhí)行時間比slowlog-log-slower-than大的請求記錄到slowlog里面,單位是微秒,所以1000000就是1秒。注意,負(fù)數(shù)時間會禁用慢查詢?nèi)罩?,?則會強制記錄所有命令。
  166. slowlog-log-slower-than 10000

  167. #慢查詢?nèi)罩鹃L度。當(dāng)一個新的命令被寫進(jìn)日志的時候,最老的那個記錄會被刪掉。這個長度沒有限制。只要有足夠的內(nèi)存就行。你可以通過 SLOWLOG RESET 來釋放內(nèi)存。
  168. slowlog-max-len 128

  169. ################################ LATENCY MONITOR ##############################
  170. #延遲監(jiān)控功能是用來監(jiān)控redis中執(zhí)行比較緩慢的一些操作,用LATENCY打印redis實例在跑命令時的耗時圖表。只記錄大于等于下邊設(shè)置的值的操作。0的話,就是關(guān)閉監(jiān)視。默認(rèn)延遲監(jiān)控功能是關(guān)閉的,如果你需要打開,也可以通過CONFIG SET命令動態(tài)設(shè)置。
  171. latency-monitor-threshold 0

  172. ############################# EVENT NOTIFICATION ##############################
  173. #鍵空間通知使得客戶端可以通過訂閱頻道或模式,來接收那些以某種方式改動了 Redis 數(shù)據(jù)集的事件。因為開啟鍵空間通知功能需要消耗一些 CPU ,所以在默認(rèn)配置下,該功能處于關(guān)閉狀態(tài)。
  174. #notify-keyspace-events 的參數(shù)可以是以下字符的任意組合,它指定了服務(wù)器該發(fā)送哪些類型的通知:
  175. ##K 鍵空間通知,所有通知以 __keyspace@__ 為前綴
  176. ##E 鍵事件通知,所有通知以 __keyevent@__ 為前綴
  177. ##g DEL 、 EXPIRE 、 RENAME 等類型無關(guān)的通用命令的通知
  178. ##$ 字符串命令的通知
  179. ##l 列表命令的通知
  180. ##s 集合命令的通知
  181. ##h 哈希命令的通知
  182. ##z 有序集合命令的通知
  183. ##x 過期事件:每當(dāng)有過期鍵被刪除時發(fā)送
  184. ##e 驅(qū)逐(evict)事件:每當(dāng)有鍵因為 maxmemory 政策而被刪除時發(fā)送
  185. ##A 參數(shù) g$lshzxe 的別名
  186. #輸入的參數(shù)中至少要有一個 K 或者 E,否則的話,不管其余的參數(shù)是什么,都不會有任何 通知被分發(fā)。詳細(xì)使用可以參考http://redis.io/topics/notifications

  187. notify-keyspace-events "e"

  188. ############################### ADVANCED CONFIG ###############################
  189. #數(shù)據(jù)量小于等于hash-max-ziplist-entries的用ziplist,大于hash-max-ziplist-entries用hash
  190. hash-max-ziplist-entries 512
  191. #value大小小于等于hash-max-ziplist-value的用ziplist,大于hash-max-ziplist-value用hash。
  192. hash-max-ziplist-value 64

  193. #數(shù)據(jù)量小于等于list-max-ziplist-entries用ziplist,大于list-max-ziplist-entries用list。
  194. list-max-ziplist-entries 512
  195. #value大小小于等于list-max-ziplist-value的用ziplist,大于list-max-ziplist-value用list。
  196. list-max-ziplist-value 64

  197. #數(shù)據(jù)量小于等于set-max-intset-entries用iniset,大于set-max-intset-entries用set。
  198. set-max-intset-entries 512

  199. #數(shù)據(jù)量小于等于zset-max-ziplist-entries用ziplist,大于zset-max-ziplist-entries用zset。
  200. zset-max-ziplist-entries 128
  201. #value大小小于等于zset-max-ziplist-value用ziplist,大于zset-max-ziplist-value用zset。
  202. zset-max-ziplist-value 64

  203. #value大小小于等于hll-sparse-max-bytes使用稀疏數(shù)據(jù)結(jié)構(gòu)(sparse),大于hll-sparse-max-bytes使用稠密的數(shù)據(jù)結(jié)構(gòu)(dense)。一個比16000大的value是幾乎沒用的,建議的value大概為3000。如果對CPU要求不高,對空間要求較高的,建議設(shè)置到10000左右。
  204. hll-sparse-max-bytes 3000

  205. #Redis將在每100毫秒時使用1毫秒的CPU時間來對redis的hash表進(jìn)行重新hash,可以降低內(nèi)存的使用。當(dāng)你的使用場景中,有非常嚴(yán)格的實時性需要,不能夠接受Redis時不時的對請求有2毫秒的延遲的話,把這項配置為no。如果沒有這么嚴(yán)格的實時性要求,可以設(shè)置為yes,以便能夠盡可能快的釋放內(nèi)存。
  206. activerehashing yes

  207. ##對客戶端輸出緩沖進(jìn)行限制可以強迫那些不從服務(wù)器讀取數(shù)據(jù)的客戶端斷開連接,用來強制關(guān)閉傳輸緩慢的客戶端。
  208. #對于normal client,第一個0表示取消hard limit,第二個0和第三個0表示取消soft limit,normal client默認(rèn)取消限制,因為如果沒有尋問,他們是不會接收數(shù)據(jù)的。
  209. client-output-buffer-limit normal 0 0 0
  210. #對于slave client和MONITER client,如果client-output-buffer一旦超過256mb,又或者超過64mb持續(xù)60秒,那么服務(wù)器就會立即斷開客戶端連接。
  211. client-output-buffer-limit slave 256mb 64mb 60
  212. #對于pubsub client,如果client-output-buffer一旦超過32mb,又或者超過8mb持續(xù)60秒,那么服務(wù)器就會立即斷開客戶端連接。
  213. client-output-buffer-limit pubsub 32mb 8mb 60
sentinel_17021.conf 的內(nèi)容
master 的名稱為youzan
  1. port 17021
  2. dir "/data/sentinel_17021"
  3. logfile "/data/sentinel_17021/log/alert.log"
  4. daemonize yes
  5. protected-mode no
  6. sentinel monitor youzan 10.9.34.172 7021 2
  7. sentinel down-after-milliseconds youzan 5000
  8. sentinel failover-timeout youzan 120000
  9. #sentinel client-reconfig-script youzan /opt/bin/notify.py
  10. rename-command SHUTDOWN REDIS_SHUTDOWN
  11. #sentinel auth-pass youzan xxx
/etc/init.d/redis 的內(nèi)容

  1. #!/bin/sh
  2. #
  3. # Simple Redis init.d script conceived to work on Linux systems
  4. # as it does use of the /proc filesystem.
  5. REDISPORT=7021
  6. EXEC=/usr/local/bin/redis-server
  7. CLIEXEC=/usr/local/bin/redis-cli
  8. PIDFILE=/data/redis_${REDISPORT}/run/redis.pid
  9. CONF="/etc/redis/redis_${REDISPORT}.conf"
  10. HOST=`hostname -i`
  11. case "$1" in
  12.     start)
  13.         if [ -f $PIDFILE ]
  14.         then
  15.                 echo "$PIDFILE exists, process is already running or crashed"
  16.         else
  17.                 echo "Starting Redis server..."
  18.                 su redis -c "$EXEC $CONF"
  19.         fi
  20.         ;;
  21.     stop)
  22.         if [ ! -f $PIDFILE ]
  23.         then
  24.                 echo "$PIDFILE does not exist, process is not running"
  25.         else
  26.                 PID=$(cat $PIDFILE)
  27.                 echo "Stopping ..."
  28.                 $CLIEXEC -h $HOST -p $REDISPORT redis_shutdown
  29.                 while [ -x /proc/${PID} ]
  30.                 do
  31.                     echo "Waiting for Redis to shutdown ..."
  32.                     sleep 1
  33.                 done
  34.                 echo "Redis stopped"
  35.         fi
  36.         ;;
  37.     *)
  38.         echo "Please use start or stop as first argument"
  39.         ;;
  40. esac
2.4 添加redis和 sentinel 賬號。
避免使用root賬號直接啟動 redis (存在相關(guān)安全隱患 利用Redis配置不當(dāng)?shù)穆┒磳inux服務(wù)器root提權(quán)體驗 ) 
  1. useradd redis
  2. mkdir -p /data/redis_7021/{data,log,run} ;
  3. mkdir -p /data/sentinel_17021/{log,run} ;
  4. chown -R redis.redis /data/redis_7021/ ;
  5. chown -R redis.redis /etc/redis/ ;
  6. useradd sentinel ;
  7. chown -R sentinel.sentinel /data/sentinel_17021/ ;
  8. chown -R sentinel.sentinel /etc/redis/sentinel_17021.conf ;
  9. chmod 664 /etc/redis/sentinel_17021.conf
2.5 部署其他節(jié)點
上面的過程是配置redis主庫和其中的一個sentinel,復(fù)制上面的過程在10.9.43.207 重新執(zhí)行一遍進(jìn)行安裝redis和sentinel,不過需要注意的是 我們設(shè)置10.9.43.207為redis的slave節(jié)點 ,所以要在配置文件redis_7021.conf中加上 slaveof  10.9.34.172  7021 。對于安裝第三個sentinel節(jié)點10.9.34.252,只需選取上面步驟中的 sentinel相關(guān)的步驟就好。

2.6 啟動redis和sentinel
啟動redis
/etc/init.d/redis start
關(guān)閉redis
/etc/init.d/redis stop
su sentinel -c "redis-sentinel /etc/redis/sentinel_17021.conf"
啟動sentinel之后的日志如下
  1. 32126:X 31 Jul 23:28:41.570 # Sentinel ID is b28ca1bb3d722e09d0de905caa380397455e8e3c
  2. 32126:X 31 Jul 23:28:41.570 # +monitor master youzan 10.9.34.172 7021 quorum 2
  3. 32126:X 31 Jul 23:28:41.571 * +slave slave 10.9.43.207:7021 10.9.43.207 7021 @ youzan 10.9.34.172 7021
  4. 32126:X 31 Jul 23:28:54.484 * +sentinel sentinel 5c44560584c3245590e86fa78880eacccdfe8318 10.9.34.252 17021 @ youzan 10.9.34.172 7021
2.7 進(jìn)行故障演練
在主庫上進(jìn)行
  1. 10.9.34.172:7021> debug sleep 30
  2. OK
  3. (30.01s)
觀察sentinel的log輸出
32126:X 01 Aug 09:24:12.752 # +sdown master youzan 10.9.34.172 7021
32126:X 01 Aug 09:24:12.828 # +odown master youzan 10.9.34.172 7021 #quorum 2/2
32126:X 01 Aug 09:24:12.828 # +new-epoch 1
32126:X 01 Aug 09:24:12.828 # +try-failover master youzan 10.9.34.172 7021
32126:X 01 Aug 09:24:12.838 # +vote-for-leader b28ca1bb3d722e09d0de905caa380397455e8e3c 1
32126:X 01 Aug 09:24:12.842 # 5c44560584c3245590e86fa78880eacccdfe8318 voted for b28ca1bb3d722e09d0de905caa380397455e8e3c 1
32126:X 01 Aug 09:24:12.928 # +elected-leader master youzan 10.9.34.172 7021
32126:X 01 Aug 09:24:12.928 # +failover-state-select-slave master youzan 10.9.34.172 7021
32126:X 01 Aug 09:24:12.995 # +selected-slave slave 10.9.43.207:7021 10.9.43.207 7021 @ youzan 10.9.34.172 7021
32126:X 01 Aug 09:24:12.995 * +failover-state-send-slaveof-noone slave 10.9.43.207:7021 10.9.43.207 7021 @ youzan 10.9.34.172 7021
32126:X 01 Aug 09:24:13.047 * +failover-state-wait-promotion slave 10.9.43.207:7021 10.9.43.207 7021 @ youzan 10.9.34.172 7021
32126:X 01 Aug 09:24:13.893 # +promoted-slave slave 10.9.43.207:7021 10.9.43.207 7021 @ youzan 10.9.34.172 7021
32126:X 01 Aug 09:24:13.893 # +failover-state-reconf-slaves master youzan 10.9.34.172 7021
32126:X 01 Aug 09:24:13.942 # +failover-end master youzan 10.9.34.172 7021
32126:X 01 Aug 09:24:13.942 # +switch-master youzan 10.9.34.172 7021 10.9.43.207 7021
32126:X 01 Aug 09:24:13.943 * +slave slave 10.9.34.172:7021 10.9.34.172 7021 @ youzan 10.9.43.207 7021
32126:X 01 Aug 09:24:18.986 # +sdown slave 10.9.34.172:7021 10.9.34.172 7021 @ youzan 10.9.43.207 7021
32126:X 01 Aug 09:24:37.041 # -sdown slave 10.9.34.172:7021 10.9.34.172 7021 @ youzan 10.9.43.207 7021
32126:X 01 Aug 09:24:47.041 * +convert-to-slave slave 10.9.34.172:7021 10.9.34.172 7021 @ youzan 10.9.43.207 7021
觀察sentinel 的配置文件以及被修改重寫.

三 總結(jié)
  本文算是一篇入門級別的how to文檔,介紹如何安裝部署redis sentinel 高可用架構(gòu),內(nèi)容比較淺顯,需要注意的是運維一套數(shù)據(jù)庫存儲系統(tǒng)肯定不會這么簡單,還要涉及到相關(guān)進(jìn)程,日志,性能監(jiān)控等等,本文的案例距離生產(chǎn)實踐還有一大段路要走,繼續(xù)學(xué)習(xí)。

四 參考文章
[1] Redis之Sentinel高可用安裝部署 
[2] Redis Sentinel機制與用法(一) 
[3] Redis Sentinel機制與用法(二)

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI