redis主從復制過程
當配置好slave后,slave與master建立連接佛点,然后發(fā)送sync命令朽寞。無論是第一次連接還是重新連接,master都會啟動一個后臺進程吹埠,將 數(shù)據(jù)庫快照保存到文件中第步,同時master主進程會開始收集新的寫命令并緩存。后臺進程完成寫文件后缘琅,master就發(fā)送文件給slave粘都,slave將 文件保存到硬盤上,再加載到內(nèi)存中刷袍,接著master就會把緩存的命令轉發(fā)給slave翩隧,后續(xù)master將收到的寫命令發(fā)送給slave。
如果master同時收到多個slave發(fā)來的同步連接命令呻纹,master只會啟動一個進程來寫數(shù)據(jù)庫鏡像堆生,然后發(fā)送給所有的slave专缠。master同步數(shù)據(jù)時是非阻塞式的,可以接收用戶的讀寫請求淑仆。然而在slave端是阻塞模式的涝婉,slave在同步master數(shù)據(jù)時,并不能夠響應客戶端的查詢蔗怠。
可以在master禁用數(shù)據(jù)持久化嘁圈,只需要注釋掉master 配置文件中的所有save配置,然后只在slave上配置數(shù)據(jù)持久化
擁有主從服務器的好處(從服務器是只讀的蟀淮,可以一主多從)
1. ? ?主服務器進行讀寫時最住,會轉移到從讀,減輕服務器壓力
2. ? ?熱備份 主從都可以設置密碼怠惶,也可以密碼不一致
進入/usr/data/redis/slave
創(chuàng)建 master ?slave1 ?slave2
1.復制redis.conf到3個目錄涨缚,修改端口 1000,2000策治,3000
2.修改pid路徑脓魏,日志路徑
pidfile /usr/data/redis/slave/master/redis.pid
logfile /usr/data/redis/slave/master/redis.log
ps -ef | grep redis
root ? ? 19000 ? ? 1 ?0 08:27 ? ? ? ? ?00:00:00 redis-server 192.168.1.1:1000
root ? ? 19012 ? ? 1 ?0 08:27 ? ? ? ? ?00:00:00 redis-server 192.168.1.1:2000
root ? ? 19016 ? ? 1 ?0 08:27 ? ? ? ? ?00:00:00 redis-server 192.168.1.1:3000
連接客戶端
[root@iZ23pv5rps8Z ~]# redis-cli -h 192.168.1.1 -p 3000
查看權限
192.168.1.1:3000> info
3臺服務器都是 ?# Replication ? role:master
設置從服務器方式
1.命令方式
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.1.1,port=2000,state=online,offset=113,lag=0
slave1:ip=192.168.1.1,port=3000,state=online,offset=113,lag=0
master_repl_offset:113
# Replication
role:slave
master_host:192.168.1.1
master_port:1000
master_link_status:up
服務器停止,主從就不起作用
2.配置文件
# slaveof
slaveof 192.168.1.1 1000
服務器停止通惫,主從依然起作用
主從同步茂翔,2者密碼可以不一致
192.168.1.1:1000>?set lyg945?liuyonggang
192.168.1.1:1000>?get?lyg945
"liuyonggang"
192.168.1.1:2000>?get?lyg945
"liuyonggang"
192.168.1.1:3000>?get?lyg945
"liuyonggang"
Redis的主從架構,如果master發(fā)現(xiàn)故障了履腋,還得手動將slave切換成master繼續(xù)服務珊燎,手動的方式容易造成失誤,導致數(shù)據(jù)丟失遵湖,那Redis有沒有一種機制可以在master和slave進行監(jiān)控悔政,并在master發(fā)送故障的時候,能自動將slave切換成master呢延旧?有的谋国,那就是哨兵。
哨兵的作用:
1迁沫、監(jiān)控redis進行狀態(tài)芦瘾,包括master和slave
2、當master down機集畅,能自動將slave切換成master
下面配置哨兵監(jiān)控redis進程近弟,假如我們已經(jīng)配置好了Master和Slave,具體詳細配置參
手動切換master
master ?SLAVEOF NO ONE
slave??SLAVEOF 192.168.1.1 3000
創(chuàng)建哨兵
touch sentinel.conf 內(nèi)容如下
sentinel monitor 主機名 ? ? ? 主機ip ? ? ? ? ? ? ? ?主機端口 票數(shù)n ? ? ? ? 票數(shù)多余n的從機作為主機
sentinel monitor mymaster 192.168.1.1 ? ?1000 ? ? ? ?1
啟動哨兵
redid-sentinel sentinel.conf
20526:X?20?Nov?13:24:29.243?# WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
20526:X?20?Nov?13:24:29.303?# Sentinel ID is 5d351f7edc80148f60036a6c0c2e74510ece4221
20526:X?20?Nov?13:24:29.303?# +monitor master mymaster 192.168.1.1 1000 quorum 1
20526:X?20?Nov?13:24:29.304?* +slave?slave?192.168.1.1:2000?192.168.1.1?2000?@?mymaster?192.168.1.1?1000
20526:X?20?Nov?13:24:29.317?* +slave?slave?192.168.1.1:3000?192.168.1.1?3000?@?mymaster?192.168.1.1?1000
將3000 kill掉
redis-cli?-h?192.168.1.1?-p?3000
Could?not?connect?to?Redis?at?192.168.1.1:3000:?Connection refused
Could?not?connect?to?Redis?at?192.168.1.1:3000:?Connection?refused
192.168.1.1:1000>?set?zhangsan?1
192.168.1.1:1000>?get?zhangsan
"1"
192.168.1.1:2000>?get?zhangsan
"1"
3000重啟
192.168.1.1:3000>?get?zhangsan
"1"
2.將master(1000) kill掉
redis-cli -h 192.168.1.1 -p 1000
Could not connect to Redis at 192.168.1.1:1000: Connection refused
查看哨兵后臺打印信息
20526:X?20?Nov?13:27:40.550?# +sdown master mymaster 192.168.1.1 1000
20526:X?20?Nov?13:27:40.550?# +odown master mymaster 192.168.1.1 1000 #quorum 1/1
20526:X?20?Nov?13:27:40.550?# +new-epoch 1
20526:X?20?Nov?13:27:40.550?# +try-failover master mymaster 192.168.1.1 1000
20526:X?20?Nov?13:27:40.559?# +vote-for-leader 5d351f7edc80148f60036a6c0c2e74510ece4221 1
20526:X?20?Nov?13:27:40.559?# +elected-leader master mymaster 192.168.1.1 1000
20526:X?20?Nov?13:27:40.559?# +failover-state-select-slave master mymaster 192.168.1.1 1000
20526:X?20?Nov?13:27:40.612?# +selected-slave slave 192.168.1.1:2000 192.168.1.1 2000 @ mymaster 192.168.1.1 1000
20526:X?20?Nov?13:27:40.612?* +failover-state-send-slaveof-noone?slave?192.168.1.1:2000?192.168.1.1?2000?@?mymaster?192.168.1.1?1000
20526:X?20?Nov?13:27:40.688?* +failover-state-wait-promotion?slave?192.168.1.1:2000?192.168.1.1?2000?@?mymaster?192.168.1.1?1000
20526:X?20?Nov?13:27:40.766?# +promoted-slave slave 192.168.1.1:2000 192.168.1.1 2000 @ mymaster 192.168.1.1 1000
20526:X?20?Nov?13:27:40.766?# +failover-state-reconf-slaves master mymaster 192.168.1.1 1000
20526:X?20?Nov?13:27:40.818?* +slave-reconf-sent?slave?192.168.1.1:3000?192.168.1.1?3000?@?mymaster?192.168.1.1?1000
20526:X?20?Nov?13:27:41.813?* +slave-reconf-inprog?slave?192.168.1.1:3000?192.168.1.1?3000?@?mymaster?192.168.1.1?1000
20526:X?20?Nov?13:27:41.813?* +slave-reconf-done?slave?192.168.1.1:3000?192.168.1.1?3000?@?mymaster?192.168.1.1?1000
20526:X?20?Nov?13:27:41.896?# +failover-end master mymaster 192.168.1.1 1000
20526:X?20?Nov?13:27:41.896?# +switch-master mymaster 192.168.1.1 1000 192.168.1.1 2000
20526:X?20?Nov?13:27:41.896?* +slave?slave?192.168.1.1:3000?192.168.1.1?3000?@?mymaster?192.168.1.1?2000
20526:X?20?Nov?13:27:41.896?* +slave?slave?192.168.1.1:1000?192.168.1.1?1000?@?mymaster?192.168.1.1?2000
20526:X?20?Nov?13:28:11.907?# +sdown slave 192.168.1.1:1000 192.168.1.1 1000 @ mymaster 192.168.1.1 2000
192.168.1.1:2000> info ?變成了主
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.1.1,port=3000,state=online,offset=1625,lag=0
192.168.1.1:2000> set aa 11
OK
192.168.1.1:2000> get aa
“11”
192.168.1.1:3000> info ?還是從
# Replication
role:slave
master_host:192.168.1.1
master_port:2000
master_link_status:up
192.168.1.1:3000> get aa
“11”
重啟1000原來的master服務器
查看哨兵
20526:X?20?Nov?13:42:51.554?# -sdown slave 192.168.1.1:1000 192.168.1.1 1000 @ mymaster 192.168.1.1 2000
20526:X?20?Nov?13:43:01.604?* +convert-to-slave?slave?192.168.1.1:1000?192.168.1.1?1000?@?mymaster?192.168.1.1?2000
192.168.1.1:1000> info ?變成從
# Replication
role:slave
master_host:192.168.1.1
master_port:2000
master_link_status:up
192.168.1.1:1000> get aa
“11”
Redis-sentinel高可用
Redis-Sentinel是Redis官方推薦的高可用性(HA)解決方案牡整,當用Redis做Master-slave的高可用方案時藐吮,假如master宕機了溺拱,Redis本身(包括它的很多客戶端)都沒有實現(xiàn)自動進行主備切換逃贝,而Redis-sentinel本身也是一個獨立運行的進程谣辞,它能監(jiān)控多個master-slave集群,發(fā)現(xiàn)master宕機后能進行自動切換沐扳。
它的主要功能有以下幾點
不時地監(jiān)控redis是否按照預期良好地運行;
如果發(fā)現(xiàn)某個redis節(jié)點運行出現(xiàn)狀況泥从,能夠通知另外一個進程(例如它的客戶端);
能夠進行自動切換。當一個master節(jié)點不可用時沪摄,能夠選舉出master的多個slave(如果有超過一個slave的話)中的一個來作為新的master,其它的slave節(jié)點會將它所追隨的master的地址改為被提升為master的slave的新地址躯嫉。
需要注意的是,配置文件在sentinel運行期間是會被動態(tài)修改的杨拐,例如當發(fā)生主備切換時候祈餐,配置文件中的master會被修改為另外一個slave。這樣哄陶,之后sentinel如果重啟時帆阳,就可以根據(jù)這個配置來恢復其之前所監(jiān)控的redis集群的狀態(tài)。
sentinel monitor?mymaster?192.168.1.1?1000?1
sentinel?down-after-milliseconds?mymaster?60000
#sentinel?can-failover?mymaster yes
sentinel?failover-timeout?mymaster?180000
sentinel?parallel-syncs?mymaster?1
當sentinel集群式屋吨,解決這個問題的方法就變得很簡單蜒谤,只需要多個sentinel互相溝通來確認某個master是否真的死了,這個2代表至扰,當集群中有2個sentinel認為master死了時鳍徽,才能真正認為該master已經(jīng)不可用了。
down-after-milliseconds
sentinel會向master發(fā)送心跳PING來確認master是否存活敢课,如果master在“一定時間范圍”內(nèi)不回應PONG 或者是回復了一個錯誤消息阶祭,那么這個sentinel會主觀地(單方面地)認為這個master已經(jīng)不可用了(subjectively down, 也簡稱為SDOWN)。而這個down-after-milliseconds就是用來指定這個“一定時間范圍”的直秆,單位是毫秒胖翰。
can-failover
no 表示當前sentinel是一個觀察者,只參與投票不參與實施failover
全局中至少有一個是yes
parallel-syncs
當新master產(chǎn)生時切厘,同時進行“slaveof”到新master并進行“SYNC”的slave個數(shù)
默認為1,建議保持默認值
在salve執(zhí)行salveof與同步時萨咳,將會終止客戶端請求
failover-timeout
failover過期時間,當failover開始后疫稿,在此時間內(nèi)仍然沒有觸發(fā)任何failover操作
當前sentinel將會認為此次failoer失敗