佈署方案說明redis
一、sentinel負責對redis集羣中的主從服務監控、提醒和自動故障轉移
二、redis集羣負責對外提供相關服務
Sentinel原理介紹服務器
原理:架構
sentinel是一個分佈式系統,能夠在一個架構中運行多個sentinel進程,這些進程使用流言協議(gossip protocols)來接收關於rdis主服務器是否下線的信息,並使用投票協議(agreement protocols)來決定是否執行自動故障遷移,以及選舉哪一個從服務器成爲新的主服務器。分佈式
流言協議:
sentinel服務經過ping命令來確認監控的服務器是否正常,主觀下線(Subjectively Down, 簡稱 SDOWN)指的是單個 Sentinel 實例對服務器作出的下線判斷。客觀下線(Objectively Down, 簡稱 ODOWN)指的是多個 Sentinel 實例在對同一個服務器作出 SDOWN 判斷。測試
投票協議:spa
其實就選舉,sentinel集羣根據必定的規則從redis羣中選擇一個新的服務器成爲主服務器,並使其它的服務器作爲新的從服務器,並修改自身的配置文件。3d
服務器佈署規劃日誌
實驗環境採用兩臺服務器模擬集羣環境code
服務器系統環境server
Centos 6.6 x86_64
Master服務器 10.0.0.3/24
Redis-Mster 10.0.0.3:6379 Redis-Slave1 10.0.0.3:63791 Redis-Slave2 10.0.0.3:63792
Sentinel服務
s 10.0.0.3:26379 s1 10.0.0.3:26378
Slave服務器 10.0.0.4/24
Redis-Slave3 10.0.0.4:63793 Redis-Slave4 10.0.0.4:63794
Sentinel服務
s2 10.0.0.4:26379 s3 10.0.0.4:26378
故障切換先後邏輯圖
Redis-sentinel服務配置
主服務器上安裝佈署過程
安裝redis服務
mkdir /usr/local/redis/data cd /usr/local/src wget http://download.redis.io/releases/redis-2.8.9.tar.gz tar zxf redis-2.8.9.tar.gz cd redis-2.8.9 make && make install
複製配置文件
cp redis.conf /usr/local/bin/ cd /usr/local/bin cp redis.conf redis-slave1 cp redis.conf redis-slave2
修改配置文件
[root@master bin]#vi redis.conf daemonize yes ** #開啓後臺運行模式** pidfile /var/run/redis.pid bind 10.0.0.3 **dbfilename dump.rdb** dir /usr/local/redis/data **port 6379** [root@master bin]#vi redis-slave1 daemonize yes **pidfile /var/run/redis-slave1.pid** **port 63791** bind 10.0.0.3 **dbfilename dump-slave1.rdb** dir /usr/local/redis/data **slaveof 10.0.0.3 6379** **slave-read-only yes** [root@master bin]#vi redis-slave2 daemonize yes pidfile /var/run/redis-slave2.pid port 63792 bind 10.0.0.3 dbfilename dump-slave2.rdb dir /usr/local/redis/data slaveof 10.0.0.3 6379
配置redis-sentinel服務
mkdir /var/log/redis -p cp /usr/local/src/redis-2.8.9/src/redis-sentinel /usr/bin/ cp /usr/local/src/redis-2.8.9/src/sentinel.conf /usr/local/bin/ cd /usr/local/bin cp sentinel.conf sentinel-s1.conf
修改配置文件
[root@master bin]# egrep -v "^#|^$" sentinel.conf port 26379 daemonize yes logfile /var/log/redis/sentinel.log sentinel monitor mymaster 10.0.0.3 6379 2 sentinel down-after-milliseconds mymaster 30000 sentinel parallel-syncs mymaster 1 sentinel failover-timeout mymaster 180000 [root@master bin]# egrep -v "^#|^$" sentinel-s1.conf port 26378 daemonize yes logfile /var/log/redis/sentinel-s1.log sentinel monitor mymaster 10.0.0.3 6379 2 sentinel down-after-milliseconds mymaster 30000 sentinel parallel-syncs mymaster 1 sentinel failover-timeout mymaster 180000 #以上配置從服務器操做過程同上
啓動服務
啓動redis服務
[root@master bin]# redis-server redis.conf [root@master bin]# redis-server redis-slave1 [root@master bin]# redis-server redis-slave2 [root@master bin]# ps -ef|grep redis root 2579 1 0 23:55 ? 00:00:00 redis-server 10.0.0.3:6379 root 2585 1 0 23:55 ? 00:00:00 redis-server 10.0.0.3:63792 root 2590 1 0 23:55 ? 00:00:00 redis-server 10.0.0.3:63791 root 2597 2479 0 23:56 pts/0 00:00:00 grep --color=auto redis [root@slave bin]# redis-server redis-slave3 [root@slave bin]# redis-server redis-slave4 [root@slave bin]# ps -ef|grep redis root 2576 1 0 23:56 ? 00:00:00 redis-server 10.0.0.4:63793 root 2580 1 0 23:56 ? 00:00:00 redis-server 10.0.0.4:63794 root 2584 2502 0 23:56 00:00:00 grep --color=auto redis
啓動redis-sentinel服務
[root@master bin]# redis-sentinel sentinel.conf [root@master bin]# redis-sentinel sentinel-s1.conf [root@master bin]# ps -ef|grep redis-sentinel root 2638 1 0 01:05 ? 00:00:04**redis-sentinel *:26379** root 2646 1 0 01:13 ? 00:00:00**redis-sentinel *:26378** root 2650 2479 0 01:13 00:00:00 grep --color=auto redis [root@slave bin]# redis-sentinel sentinel-s2.conf [root@slave bin]# redis-sentinel sentinel-s3.conf [root@slave bin]# ps -ef|grep redis-sentinel root 2644 1 1 01:14 ? 00:00:00**redis-sentinel *:26378** root 2649 1 0 01:14 ? 00:00:00**redis-sentinel *:26379** root 2653 2502 0 01:15 00:00:00 grep --color=auto redis-sentinel
查看日誌觀察啓動過程
[root@master bin]# tail -f /var/log/redis/sentinel.log \`-.\_\_.-' [2664] 12 May 01:20:11.036 # Sentinel runid is c327be464ef36e670566a0d76c9dc85bac7f33b1 [2664] 12 May 01:20:11.036 #+monitor master mymaster 10.0.0.3 6379 quorum 2 [2664] 12 May 01:20:11.123 * -dup-sentinel master mymaster 10.0.0.3 6379 #duplicate of 10.0.0.3:26378 or fb1fbe73b51a0a6e71a8ceae57d34ef773d086e3 [2664] 12 May 01:20:11.123 *+sentinel sentinel 10.0.0.3:26378 10.0.0.3 26378 @ mymaster 10.0.0.3 6379 [2664] 12 May 01:20:21.410 * -dup-sentinel master mymaster 10.0.0.3 6379 #duplicate of 10.0.0.4:26379 or 3d43ddea4d4ba8de7dd30e2d332723508f6d4c19 [2664] 12 May 01:20:21.410 *+sentinel sentinel 10.0.0.4:26379 10.0.0.4 26379 @ mymaster 10.0.0.3 6379 [2664] 12 May 01:20:25.103 * -dup-sentinel master mymaster 10.0.0.3 6379 #duplicate of 10.0.0.4:26378 or 6d134d9a3e53c0cb70de842281de8aaf17a84c00 [2664] 12 May 01:20:25.103 *+sentinel sentinel 10.0.0.4:26378 10.0.0.4 26378 @ mymaster 10.0.0.3 6379 **能夠看出有其它監控服務器加入到集羣中來**
查看配置文件是否有變化
root@master bin]# egrep -v "^#|^$" sentinel-s1.conf port 26378 daemonize yes logfile "/var/log/redis/sentinel-s1.log" sentinel monitor mymaster 10.0.0.3 6379 2 sentinel config-epoch mymaster 0 sentinel leader-epoch mymaster 0 sentinel known-slave mymaster 10.0.0.3 63792 dir "/usr/local/bin" sentinel known-slave mymaster 10.0.0.4 63793 sentinel known-slave mymaster 10.0.0.4 63794 sentinel known-slave mymaster 10.0.0.3 63791 sentinel known-sentinel mymaster 10.0.0.3 26379 c327be464ef36e670566a0d76c9dc85bac7f33b1 sentinel known-sentinel mymaster 10.0.0.4 26379 3d43ddea4d4ba8de7dd30e2d332723508f6d4c19 sentinel known-sentinel mymaster 10.0.0.4 26378 6d134d9a3e53c0cb70de842281de8aaf17a84c00 sentinel current-epoch 0
經過日誌觀察故障切換過程
模擬主服務器故障並查看故障切換
[root@master bin]# redis-cli -h 10.0.0.3 -p 6379 shutdown [root@master bin]# ps -ef|grep redis root 2585 1 0 May11 ? 00:00:07 redis-server 10.0.0.3:63792 root 2590 1 0 May11 ? 00:00:07 redis-server 10.0.0.3:63791 root 2660 1 0 01:20 ? 00:00:02 redis-sentinel *:26378 root 2664 1 0 01:20 ? 00:00:02 redis-sentinel *:26379 root 2676 2479 0 01:30 00:00:00 grep --color=auto redis
此時發現主服務器進程不存在,說明服務有故障
清空原來的日誌並查看故障切換過程
[root@slave bin]# > /var/log/redis/sentinel-s3.log [root@slave bin]# tail -f /var/log/redis/sentinel-s3.log [2669] 12 May 01:30:55.203 #+sdown master mymaster 10.0.0.3 6379 [2669] 12 May 01:30:55.276 # +new-epoch 1 [2669] 12 May 01:30:55.280 # +vote-for-leader c327be464ef36e670566a0d76c9dc85bac7f33b1 1 [2669] 12 May 01:30:56.329 # +odown master mymaster 10.0.0.3 6379 #quorum 4/2 [2669] 12 May 01:30:57.547 #+switch-master mymaster 10.0.0.3 6379 10.0.0.3 63792 [2669] 12 May 01:30:57.548 * +slave slave 10.0.0.4:63794 10.0.0.4 63794 @ mymaster 10.0.0.3 63792 [2669] 12 May 01:30:57.553 * +slave slave 10.0.0.4:63793 10.0.0.4 63793 @ mymaster 10.0.0.3 63792 [2669] 12 May 01:30:57.556 * +slave slave 10.0.0.3:63791 10.0.0.3 63791 @ mymaster 10.0.0.3 63792 [2669] 12 May 01:30:57.561 * +slave slave 10.0.0.3:6379 10.0.0.3 6379 @ mymaster 10.0.0.3 63792 [2669] 12 May 01:31:27.620 # +sdown slave 10.0.0.3:6379 10.0.0.3 6379 @ mymaster 10.0.0.3 63792 **能夠看出斷定master主觀下線(+sdown),sentinel選舉10.0.0.3 63792爲新的主服務器,其它slave自動執行slaveof ,故障轉移成功**
恢復原主服務器
[root@master bin]# redis-server redis.conf [root@master bin]# ps -ef|grep redis root 2585 1 0 May11 ? 00:00:08 redis-server 10.0.0.3:63792 root 2590 1 0 May11 ? 00:00:08 redis-server 10.0.0.3:63791 root 2660 1 0 01:20 ? 00:00:05 redis-sentinel *:26378 root 2664 1 0 01:20 ? 00:00:05 redis-sentinel *:26379 root 2683 1 0 01:36 ? 00:00:00 redis-server 10.0.0.3:6379 root 2689 2479 0 01:36 00:00:00 grep --color=auto redis [root@slave bin]# tail -f /var/log/redis/sentinel-s3.log [2673] 12 May 01:36:21.925 # -sdown slave 10.0.0.3:6379 10.0.0.3 6379 @ mymaster 10.0.0.3 63792 **當原來主服務器故障恢復後,自動以從角色加入到集羣,並不會搶佔主服務器的角色**
測試讀寫分離
[root@master bin]# redis-cli -h 10.0.0.3 -p 63792 10.0.0.3:63792> get key "test" 10.0.0.3:63792> set key file OK 10.0.0.3:63792> get key "file" [root@master bin]# redis-cli -h 10.0.0.3 -p 6379 10.0.0.3:6379> get key "file" 10.0.0.3:6379> set key file1 (error) READONLY You can't write against a read only slave. #說明新主是提高成功的,原來的主故障恢復後已經是從服務器,並且也是隻讀狀態,沒有破壞以前的主寫從讀的狀態
至此整個佈署過程結束,實現了集羣監控與自動故障切換、讀寫分離的功能