主Redis寫入數據時,從Redis會經過Redis Sync機制,同步數據,確保數據一致。而且Redis有哨兵(Sentinel)機制,Redis主掛掉會自動幫咱們提高從爲主,不過哨兵我發現只適用一主多從,不太適合級聯模式。redis
主Redis寫入數據時,從Redis會經過Redis Sync機制,同步數據,確保數據一致。而且Redis有哨兵(Sentinel)機制,Redis主掛掉會自動幫咱們提高從爲主,不過哨兵我發現只適用一主多從,不太適合級聯模式。redis
1,有了主從,那咱們須要對其進行監控,Sentinel會不斷地檢查你的主服務器和從服務器是否運做正常。某個節點故障後,Sentinel 會開始一次自動故障遷移操做, 它會將失效主服務器的其中一個從服務器升級爲新的主服務器, 並讓失效主服務器的其餘從服務器改成複製新的主服務器; 當客戶端試圖鏈接失效的主服務器時, 集羣也會向客戶端返回新主服務器的地址, 使得集羣可使用新主服務器代替失效服務器。Redis Sentinel 是一個分佈式系統, 你能夠在一個架構中運行多個 Sentinel 進程(Progress), 這些進程使用流言協議(Gossip Protocols)來接收關於主服務器是否下線的信息, 並使用投票協議(Agreement Protocols)來決定是否執行自動故障遷移, 以及選擇哪一個從服務器做爲新的主服務器。雖然 Redis Sentinel 釋出爲一個單獨的可執行文件 redis-sentinel , 但實際上它只是一個運行在特殊模式下的 Redis 服務器。vim
2,哨兵是個分佈式系統,經過配置文件能夠多個哨兵合做,以實現它的健壯性:安全
主節點IP:192.168.198.131服務器
從節點IP:192.168.198.132架構
從節點IP:192.168.198.133app
端口使用默認6379(若是是虛擬機測試,一臺機器拷貝3個redis目錄進行配置啓動就能夠了)分佈式
編譯redispost
cd /usr/local/src/測試
wget http://download.redis.io/releases/redis-3.0.5.tar.gzui
tar zxvf ./redis-3.0.5.tar.gz
cd redis-3.0.5
make
make install
主從配置
- 將主從redis配置文件redis.conf中的aemonize no 改成 yes
- 從redis配置文件添加slaveof 192.168.198.131 6379 的配置
- 主從開啓AOF機制 appendoly yes
cd /usr/local/src/redis-3.0.5
vim redis.conf #修改如下內容,不是必須的
bind 127.0.0.1 192.168.198.131 #兩臺主機分別改成本身的IP
logfile "/usr/local/src/redis-3.0.3/redis.log"
daemonize yes #啓用守護模式
appendonly yes #開啓aof持久化
slave-read-only yes #slave 默認就是隻讀的,這裏不用管。
protected-mode no #protected-mode 是3.2 以後加入的新特性,爲了禁止公網訪問redis cache,增強redis安全的。根據本身須要配置,它啓用的條件,有兩個,沒有bind IP 以及沒有設置訪問密碼。
#requirepass "admin.123" #設置redis登陸密碼 這個看本身需求能夠不要
#masterauth "admin.123" #主從認證密碼,不然主從不能同步,這個看本身需求能夠不要
啓用主從模式只有Redis Slave 添加一行,啓動服務主從就配置好了。
slaveof 192.168.198.131 6379
主redis:
[root@localhost redis-3.0.5]# ./src/redis-server redis.conf
從redis:
[root@localhost redis-3.0.5]# ./src/redis-server redis.conf
從redis:
[root@localhost redis-3.0.5]# ./src/redis-server redis.conf
~]# redis-cli -c -h 192.168.198.131 -p 6379
192.168.198.131:6379> info
.......
# Replication #中間省略了內容,本身能夠看看,主要是找到這一段,看主從狀態。
role:master
connected_slaves:1
slave0:ip=192.168.198.132,port=6379,state=online,offset=5700675,lag=0
slave0:ip=192.168.198.133,port=6379,state=online,offset=5700676,lag=1
master_repl_offset:5700675
repl_backlog_active:1
repl_backlog_size:10000000
repl_backlog_first_byte_offset:1
repl_backlog_histlen:5707674
.......
測試數據同步
主redis:
[root@localhost redis-3.0.5]# src/redis-cli -p 6379
127.0.0.1:6379> set name abc
OK
127.0.0.1:6379> get name
"abc"
127.0.0.1:6379>
從redis:
[root@localhost redis-3.0.5]# src/redis-cli -p 6379
127.0.0.1:6379> get name
"abc"
127.0.0.1:6379>127.0.0.1:6379>
從redis:
[root@localhost redis-3.0.5]# src/redis-cli -p 6379
127.0.0.1:6379> get name
"abc"
127.0.0.1:6379>
默認是讀寫分離的
在從redis:
[root@localhost redis-3.0.5]# src/redis-cli -p 6379
127.0.0.1:6379> set name 123
(error) READONLY You can't write against a read only slave.
Redis Sentinel 配置
首先咱們cp一份redis目錄這樣好區分開來,一臺服務器開啓多個redis服務也是這樣拷貝目錄配置端口啓動
cp /usr/local/src/redis-3.0.5 /usr/local/src/redis-3.0.5-sentinel1
cd /usr/local/src/redis-3.0.5-sentinel1
vim sentinel.conf #在redis的跟目錄下
port 26379
daemonize yes
protected-mode no #保護模式若是開啓只接受迴環地址的ipv4和ipv6地址連接,拒絕外部連接,並且正常應該配置多個哨兵,避免一個哨兵出現獨裁狀況,若是配置多個哨兵那若是開啓也會拒絕其餘sentinel的鏈接。致使哨兵配置沒法生效。
logfile "/usr/local/src/redis-3.0.5-sentinel1/sentinel.log" #指明日誌文件
dir "/usr/local/src/redis-3.0.5-sentinel1" ## 哨兵sentinel的工做目錄
sentinel monitor mymaster 192.168.198.131 6379 1 #哨兵監控的master,選擇新主須要幾個哨兵投票
sentinel down-after-milliseconds mymaster 5000 #master或者slave多少時間(默認30秒)不能使用標記爲down狀態。
sentinel failover-timeout mymaster 18000 #若哨兵在配置值內未能完成故障轉移操做,則任務本次故障轉移失敗。
sentinel auth-pass mymaster redispass #若是redis配置了密碼,那這裏必須配置認證,不然不能自動切換
sentinel parallel-syncs mymaster 1 # 這個配置項指定了在發生failover主備切換時最多能夠有多少個slave同時對新的master進行 同步,這個數字越小,完成failover所需的時間就越長, 可是若是這個數字越大,就意味着越 多的slave由於replication而不可用。能夠經過將這個值設爲 1 來保證每次只有一個slave 處於不能處理命令請求的狀態[root@master redis-3.0.5-sentinel1]# /usr/local/src/redis-3.0.5-sentinel1/src/redis-sentinel /usr/local/src/redis-3.0.5-sentinel1/sentinel.conf #啓動服務
若是有下面報錯 啓動命令後面要加上 --sentinel
*** FATAL CONFIG FILE ERROR ***
Reading the configuration file, at line 6
>>> 'sentinel monitor mymaster 192.168.198.131 6379 1'
sentinel directive while not in sentinel mode哨兵無需配置slave,只須要指定master,哨兵會自動發現slave
檢查哨兵狀態:
[root@localhost redis-3.0.5-sentinel1]# ./src/redis-cli -p 26379
127.0.0.1:26379> info Sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
master0:name=mymaster,status=ok,address=127.0.0.1:6379,slaves=2,sentinels=1
127.0.0.1:26379>
就這樣,分佈式完成了,啓動,而後殺死主redis, 而後就從哨兵中看到了redis的選舉新主redis切換了,將如今的主redis的數據進行save保存,而後將如今的主redis根目錄下dump.rdb文件拷貝覆蓋到原來主redis的根目錄下dump.rdb (若是是aof持久化則直接拷貝aof文件覆蓋原來主熱地上的根目錄下並重啓),而後咱們啓動殺死的主redis,發現以前的主redis變成了新主的從redis了,就這樣整個過程就完成了。
rdb持久化數據同步步驟以下:
1)將如今的主redis的數據進行保存
[root@localhost redis-3.0.5]# src/redis-cli -p 6379
127.0.0.1:6379> save
OK
127.0.0.1:6379>2)將如今的主redis根目錄下dump.rdb文件拷貝覆蓋到原來主redis的根目錄下dump.rdb
3)啓動原來的主redis
[root@localhost redis-3.0.5]# ./src/redis-server redis.conf
4)info replication命令查看主從複製信息,以前的主redis變成了新主的從redis了
主Redis宕機測試(大概流程以下,本身測試,從redis宕機重啓slave從新加入到了主從複製中)
把主redis的進程kill掉,觀察sentinel控制檯輸出信息:2461:X 18 Jul 08:29:19.276 # +sdown master mymaster 127.0.0.1 6380【 master服務已經宕機 】2461:X 18 Jul 08:29:19.276 # +odown master mymaster 127.0.0.1 6380 #quorum 1/12461:X 18 Jul 08:29:19.276 # +new-epoch 12461:X 18 Jul 08:29:19.276 # +try-failover master mymaster 127.0.0.1 6380【嘗試恢復master】2461:X 18 Jul 08:29:19.282 # +vote-for-leader 236f14b361fc5a0dc0621cf88823ed6e6252b2f3 1 【 投票選舉哨兵leader,如今就一個哨兵因此leader就本身 】2461:X 18 Jul 08:29:19.282 # +elected-leader master mymaster 127.0.0.1 6380 【選出leader】2461:X 18 Jul 08:29:19.282 # +failover-state-select-slave master mymaster 127.0.0.1 6380 【選中其中的一個slave當作master】2461:X 18 Jul 08:29:19.345 # +selected-slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6380【選中6381當master】2461:X 18 Jul 08:29:19.345 * +failover-state-send-slaveof-noone slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6380 【發送slaveof no one命令】2461:X 18 Jul 08:29:19.401 * +failover-state-wait-promotion slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6380 【等待升級master】2461:X 18 Jul 08:29:20.291 # +promoted-slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6380 【升級6381爲master】2461:X 18 Jul 08:29:20.291 # +failover-state-reconf-slaves master mymaster 127.0.0.1 63802461:X 18 Jul 08:29:20.361 * +slave-reconf-sent slave 127.0.0.1:6382 127.0.0.1 6382 @ mymaster 127.0.0.1 63802461:X 18 Jul 08:29:20.666 * +slave-reconf-inprog slave 127.0.0.1:6382 127.0.0.1 6382 @ mymaster 127.0.0.1 63802461:X 18 Jul 08:29:21.694 * +slave-reconf-done slave 127.0.0.1:6382 127.0.0.1 6382 @ mymaster 127.0.0.1 63802461:X 18 Jul 08:29:21.770 # +failover-end master mymaster 127.0.0.1 6380【 故障恢復完成 】2461:X 18 Jul 08:29:21.770 # +switch-master mymaster 127.0.0.1 6380 127.0.0.1 6381【master 從6380切換到6381】2461:X 18 Jul 08:29:21.771 * +slave slave 127.0.0.1:6382 127.0.0.1 6382 @ mymaster 127.0.0.1 6381 【添加6382爲6381的從庫】2461:X 18 Jul 08:29:21.771 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6381 【添加6380爲6381的從庫】2461:X 18 Jul 08:29:51.828 # +sdown slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6381 【 發現6380已經宕機,等待6380的恢復 】
查看主從複製信息能夠看出,如今6381爲master,有一個從庫
127.0.0.1:6381> info replication# Replicationrole:masterconnected_slaves:1slave0:ip=127.0.0.1,port=6382,state=online,offset=35213,lag=1master_repl_offset:35346repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:2repl_backlog_histlen:35345把6380恢復
[root@master redis-master-slave]# /usr/local/bin/redis-server /opt/redis/redis-master-slave/6380/redis.conf觀察sentinel控制檯輸出信息:2461:X 18 Jul 08:42:35.202 # -sdown slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 63812461:X 18 Jul 08:42:45.207 * +convert-to-slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6381
查看主從複製信息:
127.0.0.1:6381> info replication# Replicationrole:masterconnected_slaves:2slave0:ip=127.0.0.1,port=6382,state=online,offset=56432,lag=0slave1:ip=127.0.0.1,port=6380,state=online,offset=56432,lag=0master_repl_offset:56432repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:2repl_backlog_histlen:56431
啓動三個哨兵(redis-3.0.3-sentinel1, redis-3.0.3-sentinel2, redis-3.0.3-sentinel3)cp /usr/local/src/redis-3.0.3-sentinel1 /usr/local/src/redis-3.0.3-sentinel2cp /usr/local/src/redis-3.0.3-sentinel1 /usr/local/src/redis-3.0.3-sentinel3配置(三個配置基本類似, 就端口號的地方改一下)vim sentinel.conf #在redis的跟目錄下
port 26379 # 對應第sentinel1port 26380 # 對應第sentinel2port 26381 # 對應第sentinel3啓動sentinel服務[root@master redis-3.0.3-sentinel1]# /usr/local/src/redis-3.0.3-sentinel1/src/redis-sentinel /usr/local/src/redis-3.0.3-sentinel1/sentinel.conf #啓動服務[root@master redis-3.0.3-sentinel2]# /usr/local/src/redis-3.0.3-sentinel2/src/redis-sentinel /usr/local/src/redis-3.0.3-sentinel2/sentinel.conf #啓動服務[root@master redis-3.0.3-sentinel3]# /usr/local/src/redis-3.0.3-sentinel3/src/redis-sentinel /usr/local/src/redis-3.0.3-sentinel3/sentinel.conf #啓動服務