redis 主從叢集說明及配置

來源:互聯網
上載者:User

標籤:redis 主從

架構圖如下:

650) this.width=650;" src="http://s4.51cto.com/wyfs02/M00/7F/97/wKiom1cjPE-jZb1QAADi_DezMAw835.png" title="redis.png" alt="wKiom1cjPE-jZb1QAADi_DezMAw835.png" />

1.sentinel 說明

 (1)監控(Monitoring): Sentinel 會不斷地檢查你的主伺服器和從伺服器是否運作正常。

 (2)提醒(Notification): 當被監控的某個 Redis 伺服器出現問題時, Sentinel 可以通過 API 向管理員或者其他應用程式發送通知。

 (3)自動故障遷移(Automatic failover): 當一個主伺服器不能正常工作時, Sentinel 會開始一次自動故障遷移操作, 它會將失效主伺服器的其中一個從伺服器升級為新的主伺服器, 並讓失效主伺服器的其他從伺服器改為複製新的主伺服器; 當用戶端試圖串連失效的主伺服器時, 叢集也會向用戶端返回新主伺服器的地址, 使得叢集可以使用新主伺服器代替失效伺服器。


Redis Sentinel 是一個分布式系統, 你可以在一個架構中運行多個 Sentinel 進程(progress), 這些進程使用流言協議(gossip protocols)來接收關於主伺服器是否下線的資訊, 並使用投票協議(agreement protocols)來決定是否執行自動故障遷移, 以及選擇哪個從伺服器作為新的主伺服器。


2.redis 主從同步原理

(1)Slave伺服器串連到master伺服器.

(2)Slave伺服器發送SYCN命令.

(3)Master伺服器備份資料庫到.rdb檔案.

(4)Master伺服器把.rdb檔案傳輸給Slave伺服器.

(5)Slave伺服器把.rdb檔案資料匯入到資料庫中.


3.架構規劃

master:10.1.1.8:6379

salve1:10.1.1.11:6379

salve2:10.1.1.12:6379

salve3:10.1.1.13:6379


sentinel:10.1.1.11:26379

sentinel:10.1.1.12:26379

sentinel:10.1.1.13:26379


4.主從配置

安裝redis略過

3.1.配置主從

配置主:

master:10.1.1.8

vim /etc/redis.confdaemonize yes  //守護進程pidfile "/var/run/redis.conf.pid"  //pid路徑port 6379   //監聽連接埠bind 0.0.0.0  //綁定地址timeout 300  //逾時時間loglevel notice //記錄層級logfile "/data/redis/redis-server.log" //日誌路徑databases 16  //執行個體個數save 900 1  //900秒有1個變化寫磁碟save 300 10  //300秒有10個變化寫磁碟save 60 10000 //60秒有10000個變化寫磁碟rdbcompression yes  //支援RDB壓縮dbfilename "dump.rdb" //DB檔案名稱dir "/data/redis/lib" //RDB路徑slave-serve-stale-data yes  //如果 slave-serve-stale-data 設定成 ‘yes‘ (the default) slave會仍然響應用戶端請求,此時可能會有問題。appendonly no  //AOF關閉appendfsync everysec  //每秒進行一次寫磁碟no-appendfsync-on-rewrite no //append only 檔案的自動重寫, 當AOF 記錄檔即將增長到指定百分比時,Redis可以通過調用BGREWRITEAOF 來自動重寫append only檔案。list-max-ziplist-entries 512 list-max-ziplist-value 64 //如果set中整型元素的數量不超過512時,Redis將會採用該特殊編碼set-max-intset-entries 512activerehashing yes //指定是否啟用重設雜湊,預設為開啟masterauth "456789" //認證密碼requirepass "456789"


配置slave1:

salve1:10.1.1.11:6379

daemonize yespidfile "/var/run/redis/redis-server.pid"port 6379bind 0.0.0.0timeout 300loglevel noticelogfile "/data/redis/redis-server.log"databases 16save 900 1save 300 10save 60 10000rdbcompression yesdbfilename "dump.rdb"dir "/data/redis/lib"slave-serve-stale-data yesappendonly noappendfsync everysecno-appendfsync-on-rewrite nolist-max-ziplist-entries 512list-max-ziplist-value 64set-max-intset-entries 512activerehashing yesmasterauth "456789"requirepass "456789"slaveof 10.1.1.8 6379

配置salve2:

salve1:10.1.1.12:6379

配置同slave1一致


配置salve3:

salve1:10.1.1.13:6379

配置同slave1一致


4.啟動進程

啟動master:10.1.1.8:

/usr/local/bin/redis-server /etc/redis.conf

啟動salve1:10.1.1.11:6379

/usr/local/bin/redis-server /etc/redis.conf

啟動salve2:10.1.1.12:6379

/usr/local/bin/redis-server /etc/redis.conf

啟動salve3:10.1.1.13:6379

/usr/local/bin/redis-server /etc/redis.conf

查看master日誌:

cat /data/redis/redis-server.log....16337:M 29 Apr 16:40:00.335 * DB loaded from disk: 0.000 seconds16337:M 29 Apr 16:40:00.335 * The server is now ready to accept connections on port 637916337:M 29 Apr 16:40:14.757 * Slave 10.1.1.11:6379 asks for synchronization16337:M 29 Apr 16:40:14.757 * Full resync requested by slave 10.1.1.11:637916337:M 29 Apr 16:40:14.757 * Starting BGSAVE for SYNC with target: disk16337:M 29 Apr 16:40:14.757 * Background saving started by pid 1634616346:C 29 Apr 16:40:14.765 * DB saved on disk16346:C 29 Apr 16:40:14.766 * RDB: 6 MB of memory used by copy-on-write16337:M 29 Apr 16:40:14.864 * Background saving terminated with success16337:M 29 Apr 16:40:14.864 * Synchronization with slave 10.1.1.11:6379 succeeded //salve1 同步ok16337:M 29 Apr 16:40:33.200 * Slave 10.1.1.12:6379 asks for synchronization16337:M 29 Apr 16:40:33.200 * Full resync requested by slave 10.1.1.12:637916337:M 29 Apr 16:40:33.200 * Starting BGSAVE for SYNC with target: disk16337:M 29 Apr 16:40:33.201 * Background saving started by pid 1634716347:C 29 Apr 16:40:33.219 * DB saved on disk16347:C 29 Apr 16:40:33.220 * RDB: 6 MB of memory used by copy-on-write16337:M 29 Apr 16:40:33.308 * Background saving terminated with success16337:M 29 Apr 16:40:33.308 * Synchronization with slave 10.1.1.12:6379 succeeded //salve2 同步ok16337:M 29 Apr 16:40:35.257 * Slave 10.1.1.13:6379 asks for synchronization16337:M 29 Apr 16:40:35.257 * Full resync requested by slave 10.1.1.13:637916337:M 29 Apr 16:40:35.258 * Starting BGSAVE for SYNC with target: disk16337:M 29 Apr 16:40:35.260 * Background saving started by pid 1634816348:C 29 Apr 16:40:35.274 * DB saved on disk16348:C 29 Apr 16:40:35.275 * RDB: 8 MB of memory used by copy-on-write16337:M 29 Apr 16:40:35.315 * Background saving terminated with success16337:M 29 Apr 16:40:35.315 * Synchronization with slave 10.1.1.13:6379 succeeded //salve3 同步ok

登入主查看同步資訊:

127.0.0.1:6379> info....# Replicationrole:master    //角色未主connected_slaves:3  //3個slave解決slave0:ip=10.1.1.11,port=6379,state=online,offset=71,lag=1 //salve1資訊slave1:ip=10.1.1.12,port=6379,state=online,offset=71,lag=1 //slave2資訊slave2:ip=10.1.1.13,port=6379,state=online,offset=71,lag=1 //slave3資訊master_repl_offset:71  //複製位移量repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:2repl_backlog_histlen:70....

5.測試主從:

主上插入資料:

# /usr/local/bin/redis-cli 127.0.0.1:6379> set name "ckl"OK

salve1查看:

127.0.0.1:6379> get name"ckl"127.0.0.1:6379>

salve2查看:

127.0.0.1:6379> get name"ckl"127.0.0.1:6379>

salve3查看:

127.0.0.1:6379> get name"ckl"127.0.0.1:6379>

6.配置sentinel

配置sentinel:10.1.1.11:26379:

port 26379  daemonize yes   sentinel monitor ckl_master 10.1.1.12 6379 2 sentinel failover-timeout ckl_master 900000 sentinel auth-pass ckl_master 456789 sentinel config-epoch ckl_master 1   sentinel leader-epoch ckl_master 1  logfile "/data/redis/sentinel.log"

設定檔解釋:

port 26379  #指定啟動的連接埠daemonize yes   #後台守護進程啟動sentinel monitor ckl_master 10.1.1.12 6379 2 #讓sentinel去監控名稱為ckl_master 的主節點,ip為10.1.1.8 連接埠為6379 當兩個sentinel檢測到失敗,才執行切換sentinel failover-timeout ckl_master 900000 #sentinel判斷master斷開時間,預設為毫秒sentinel auth-pass ckl_master 456789 #設定認證密碼sentinel config-epoch ckl_master 1   #從節點由於容錯移轉事件被提升為主節點時,為了取代它那失效的主節點,會把 configEpoch 設定為它贏得選舉的時候的 configEpoch值。logfile "/data/redis/sentinel.log"  #指定日誌路徑

配置sentine2:10.1.1.12:26379:

同sentinel配置一致


配置sentine3:10.1.1.13:26379:

同sentinel配置一致


7.啟動sentinel

啟動sentine1:10.1.1.11:26379:

/usr/local/bin/redis-sentinel /etc/sentinel.conf

啟動sentine2:10.1.1.12:26379:

/usr/local/bin/redis-sentinel /etc/sentinel.conf

啟動sentine3:10.1.1.13:26379:

/usr/local/bin/redis-sentinel /etc/sentinel.conf

查看進程:

# ps -ef | grep redisroot     11360     1  0 16:40 ?        00:00:03 /usr/local/bin/redis-server 0.0.0.0:6379   root     11437     1  0 18:06 ?        00:00:00 /usr/local/bin/redis-sentinel *:26379           root     11443 11306  0 18:07 pts/1    00:00:00 grep redis

查看sentinel日誌:

...[11501] 29 Apr 18:06:23.656 # Sentinel runid is 2535af9a6926391270af19cb872c93a1cd499ea9[11501] 29 Apr 18:06:23.656 # +monitor master ckl_master 10.1.1.8 6379 quorum 2[11501] 29 Apr 18:06:23.657 * +slave slave 10.1.1.11:6379 10.1.1.11 6379 @ ckl_master 10.1.1.8 6379 //salve1同主的資訊[11501] 29 Apr 18:06:23.704 * +slave slave 10.1.1.12:6379 10.1.1.12 6379 @ ckl_master 10.1.1.8 6379 //salve2同主的資訊[11501] 29 Apr 18:06:23.711 * +slave slave 10.1.1.13:6379 10.1.1.13 6379 @ ckl_master 10.1.1.8 6379 //salve3同主的資訊[11501] 29 Apr 18:06:23.973 * +sentinel sentinel 10.1.1.12:26379 10.1.1.12 26379 @ ckl_master 10.1.1.8 6379[11501] 29 Apr 18:06:25.133 * +sentinel sentinel 10.1.1.11:26379 10.1.1.11 26379 @ ckl_master 10.1.1.8 6379...

發現sentinel設定檔發生變化,增加了如下:

# Generated by CONFIG REWRITEdir "/home/chenkangle"sentinel known-slave ckl_master 10.1.1.13 6379 sentinel known-slave ckl_master 10.1.1.11 6379sentinel known-slave ckl_master 10.1.1.12 6379sentinel known-sentinel ckl_master 10.1.1.12 26379 3feafdc8dd9dd92bc01034ce2d059db517c2feeesentinel known-sentinel ckl_master 10.1.1.13 26379 2535af9a6926391270af19cb872c93a1cd499ea9sentinel current-epoch 1

登入到3個sentinel中的一個查看資訊:

# /usr/local/bin/redis-cli -p 26379 127.0.0.1:26379> info......# Sentinelsentinel_masters:1sentinel_tilt:0sentinel_running_scripts:0sentinel_scripts_queue_length:0master0:name=qm_master,status=ok,address=10.1.1.8:6379,slaves=3,sentinels=3....

8.sentinel檢測主節點下線原理

主觀下線和客觀下線

    (1)主觀下線(Subjectively Down, 簡稱 SDOWN)指的是單個 Sentinel 執行個體對伺服器做出的下線判斷。

    (2)客觀下線(Objectively Down, 簡稱 ODOWN)指的是多個 Sentinel 執行個體在對同一個伺服器做出 SDOWN 判斷, 並且通過 SENTINEL is-master-down-by-addr 命令互相交流之後, 得出的伺服器下線判斷。


客觀下線條件只適用於主伺服器: 對於任何其他類型的 Redis 執行個體, Sentinel 在將它們判斷為下線前不需要進行協商, 所以從伺服器或者其他 Sentinel 永遠不會達到客觀下線條件。

只要一個 Sentinel 發現某個主伺服器進入了客觀下線狀態, 這個 Sentinel 就可能會被其他 Sentinel 推選出, 並對失效的主伺服器執行自動故障遷移操作。


每個Sentinel執行個體都執行的定時任務

    (1) 每個 Sentinel 以每秒鐘一次的頻率向它所知的主伺服器、從伺服器以及其他 Sentinel 執行個體發送一個 PING 命令。

    (2)  如果一個執行個體(instance)距離最後一次有效回複 PING 命令的時間超過 down-after-milliseconds 選項所指定的值, 那麼這個執行個體會被 Sentinel 標記為主觀下線。 一個有效回複可以是: +PONG 、 -LOADING 或者 -MASTERDOWN 。

    (3) 如果一個主伺服器被標記為主觀下線, 那麼正在監視這個主伺服器的所有 Sentinel 要以每秒一次的頻率確認主伺服器的確進入了主觀下線狀態。

    (4)  如果一個主伺服器被標記為主觀下線, 並且有足夠數量的 Sentinel (至少要達到設定檔指定的數量)在指定的時間範圍內同意這一判斷, 那麼這個主伺服器被標記為客觀下線。

    (5)  在一般情況下, 每個 Sentinel 會以每 10 秒一次的頻率向它已知的所有主伺服器和從伺服器發送 INFO 命令。 當一個主伺服器被 Sentinel 標記為客觀下線時, Sentinel 向下線主伺服器的所有從伺服器發送 INFO 命令的頻率會從 10 秒一次改為每秒一次。

    (6)  當沒有足夠數量的 Sentinel 同意主伺服器已經下線, 主伺服器的客觀下線狀態就會被移除。 當主伺服器重新向 Sentinel 的 PING 命令返回有效回複時, 主伺服器的主管下線狀態就會被移除。


9.類比測試主節點down掉:

# /usr/local/bin/redis-cli 127.0.0.1:6379> SHUTDOWN

查看sentinel日誌:

# tailf /data/redis/sentinel.log ...[11501] 29 Apr 18:23:17.377 # +sdown master ckl_master10.1.1.8 6379[11501] 29 Apr 18:23:17.435 # +odown master ckl_master10.1.1.8 6379 #quorum 3/2  //3分之2檢測到節點down掉[11501] 29 Apr 18:23:17.435 # +new-epoch 2[11501] 29 Apr 18:23:17.435 # +try-failover master ckl_master10.1.1.8 6379  //主解決容錯移轉[11501] 29 Apr 18:23:17.442 # +vote-for-leader 2535af9a6926391270af19cb872c93a1cd499ea9 2[11501] 29 Apr 18:23:17.455 # 10.1.1.12:26379 voted for 2535af9a6926391270af19cb872c93a1cd499ea9 2[11501] 29 Apr 18:23:17.456 # 10.1.1.11:26379 voted for 2535af9a6926391270af19cb872c93a1cd499ea9 2[11501] 29 Apr 18:23:17.534 # +elected-leader master ckl_master10.1.1.8 6379[11501] 29 Apr 18:23:17.534 # +failover-state-select-slave master ckl_master10.1.1.8 6379[11501] 29 Apr 18:23:17.634 # +selected-slave slave 10.1.1.11:6379 10.1.1.116379 @ ckl_master10.1.1.8 6379 //選舉新的主節點[11501] 29 Apr 18:23:17.635 * +failover-state-send-slaveof-noone slave 10.1.1.11:6379 10.1.1.116379 @ ckl_master10.1.1.8 6379[11501] 29 Apr 18:23:17.711 * +failover-state-wait-promotion slave 10.1.1.11:6379 10.1.1.116379 @ ckl_master10.1.1.8 6379[11501] 29 Apr 18:23:18.535 # +promoted-slave slave 10.1.1.11:6379 10.1.1.116379 @ ckl_master10.1.1.8 6379[11501] 29 Apr 18:23:18.535 # +failover-state-reconf-slaves master ckl_master10.1.1.8 6379[11501] 29 Apr 18:23:18.541 * +slave-reconf-sent slave 10.1.1.13:6379 10.1.1.136379 @ ckl_master10.1.1.8 6379 //重設配置指定新的主節點[11501] 29 Apr 18:23:19.532 * +slave-reconf-inprog slave 10.1.1.13:6379 10.1.1.136379 @ ckl_master10.1.1.8 6379 [11501] 29 Apr 18:23:19.532 * +slave-reconf-done slave 10.1.1.13:6379 10.1.1.136379 @ ckl_master10.1.1.8 6379[11501] 29 Apr 18:23:19.584 # -odown master ckl_master10.1.1.8 6379[11501] 29 Apr 18:23:19.584 * +slave-reconf-sent slave 10.1.1.12:6379 10.1.1.12 6379 @ ckl_master10.1.1.8 6379 //重設配置指定新的主節點[11501] 29 Apr 18:23:20.589 * +slave-reconf-inprog slave 10.1.1.12:6379 10.1.1.12 6379 @ ckl_master10.1.1.8 6379[11501] 29 Apr 18:23:20.589 * +slave-reconf-done slave 10.1.1.12:6379 10.1.1.12 6379 @ ckl_master10.1.1.8 6379[11501] 29 Apr 18:23:20.640 # +failover-end master ckl_master10.1.1.8 6379[11501] 29 Apr 18:23:20.640 # +switch-master ckl_master10.1.1.8 6379 10.1.1.116379[11501] 29 Apr 18:23:20.640 * +slave slave 10.1.1.13:6379 10.1.1.136379 @ ckl_master10.1.1.116379[11501] 29 Apr 18:23:20.640 * +slave slave 10.1.1.12:6379 10.1.1.12 6379 @ ckl_master10.1.1.116379[11501] 29 Apr 18:23:20.641 * +slave slave 10.1.1.8:6379 10.1.1.8 6379 @ ckl_master10.1.1.116379[11501] 29 Apr 18:23:50.669 # +sdown slave 10.1.1.8:6379 10.1.1.8 6379 @ ckl_master10.1.1.116379

查看新選舉的主節點資訊:

10.1.1.11

# /usr/local/bin/redis-cli127.0.0.1:6379> info....# Replicationrole:masterconnected_slaves:2slave0:ip=10.1.1.13,port=6379,state=online,offset=67708,lag=0slave1:ip=10.1.1.12,port=6379,state=online,offset=67852,lag=0master_repl_offset:67852repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:2repl_backlog_histlen:67851

測試新的主從同步:

10.1.1.11:6379

# /usr/local/bin/redis-cli127.0.0.1:6379> set port "1090"


10.1.1.12:6379

127.0.0.1:6379> get port"1090"


10.1.1.13:6379

127.0.0.1:6379> get port"1090"

本文出自 “營運菜鳥” 部落格,請務必保留此出處http://ckl893.blog.51cto.com/8827818/1769094

redis 主從叢集說明及配置

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.