Redis 主從配置心得及其高可用方案

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失敗

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末培他,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子遗座,更是在濱河造成了極大的恐慌舀凛,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件途蒋,死亡現(xiàn)場離奇詭異猛遍,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門懊烤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來梯醒,“玉大人,你說我怎么就攤上這事腌紧∪紫埃” “怎么了?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵壁肋,是天一觀的道長号胚。 經(jīng)常有香客問我,道長浸遗,這世上最難降的妖魔是什么猫胁? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮跛锌,結果婚禮上杜漠,老公的妹妹穿的比我還像新娘。我一直安慰自己察净,他們只是感情好驾茴,可當我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著氢卡,像睡著了一般锈至。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上译秦,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天峡捡,我揣著相機與錄音,去河邊找鬼筑悴。 笑死们拙,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的阁吝。 我是一名探鬼主播砚婆,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼突勇!你這毒婦竟也來了装盯?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤甲馋,失蹤者是張志新(化名)和其女友劉穎埂奈,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體定躏,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡账磺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年芹敌,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片垮抗。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡氏捞,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出借宵,到底是詐尸還是另有隱情,我是刑警寧澤矾削,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布壤玫,位于F島的核電站,受9級特大地震影響哼凯,放射性物質(zhì)發(fā)生泄漏欲间。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一断部、第九天 我趴在偏房一處隱蔽的房頂上張望猎贴。 院中可真熱鬧,春花似錦蝴光、人聲如沸她渴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽趁耗。三九已至,卻和暖如春疆虚,著一層夾襖步出監(jiān)牢的瞬間苛败,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工径簿, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留罢屈,地道東北人。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓篇亭,卻偏偏與公主長得像缠捌,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子译蒂,可洞房花燭夜當晚...
    茶點故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內(nèi)容