redis主從復制


最近在看付磊,張益軍老師的《Redis開發與運維》。學到了很多,也遇到了很多坑,這里我想把比較重要的主從復制這一章節,我把自己的理解與實踐記錄下來,方便自己的學習,也為社區做一點貢獻。

(1):一主二仆

概念:

主從復制最經典的結構就是 "一主二仆"。即一個master主機,兩個slave從機。一個master主機負責寫入數據,而兩個從機slave只負責讀數據,真正實現了讀寫分離。在高並發下減輕了一台redis的壓力。                                            

 

部署:

1:首先我們先開啟三台redis服務器。端口分別為665,666,667

2:其次將666, 667端口的服務器掛在665 master主機上。

具體可以用這個命令設置:slaveof host port (eg..   SLAVEOF 127.0.0.1 665)。最終結果如下圖

 

 

 

 

 

 

 

 

 

(2)哨兵

現在出現了一個問題啦。如果master在夜晚凌晨突然宕機了,怎么辦怎么辦????而我們的開發人員都還在睡覺呢???

此時出現而哨兵可以進行巡邏,發現問題然后解決問題???這句話怎么這么熟悉

1:首先建立一個名為 sentinel.conf 的配置文件。

sentinel monitor host12581 127.0.0.1 667 1

//  sentinel monitor 哨兵名字 監控ip地址 監控端口號 投票超過多少才當選為leader

sentinel failover-timeout host12581 1800   //  投票失敗后多少秒后進行重拾  默認30s
sentinel auth-pass host12581 changwenbo // 密碼

2:其次用 redis-sentinel sentinel.conf 啟動即可。

啟動后他就會自動巡邏監控redis端口為665master,和666,667slave的服務器

3:此時我突然kill掉端口為665的master主機。

通過查看日志,我在  12580:M 16 May 14:59:23.294 # User requested shutdown...  59分23秒的時候shutdown掉了665master機子。

 

是不是可以看出來,在23秒宕機后,哨兵在30s后,即53秒立刻發現了master已經連接不上出現了問題。

首先進行了投票選舉,誰得到的票多,誰就成為新的老大,帶領大家。可以看出來667當選了。然后他就成功當選了master,並且有了一個666的slave的小弟。

4:那突然此時已經宕機的665殺回來怎么辦?

 

通過看日志,明顯可以看出來,在04分46秒我開啟了665服務,在47秒哨兵偵測到。然后跟665舊的master說,不好意思,我們已經又老大了,老大是667,你去當667的小弟吧。最后665就是667的小弟了。最后的結果為:

最終哨兵完成了自動化部署,減輕了開發人員的壓力,你好我也好。

(3)總結與問題:

問題:當我開啟哨兵以后,master主機宕機以后,哨兵並沒有起作用,日志大概就是不能發現slave,不知道確定哪個slave當選master。經過不寫努力的檢查,發覺配置文件里面的這一句話:

################################## NETWORK #####################################

# By default, if no "bind" configuration directive is specified, Redis listens
# for connections from all the network interfaces available on the server.
# It is possible to listen to just one or multiple selected interfaces using
# the "bind" configuration directive, followed by one or more IP addresses.
#
# Examples:
#
# bind 192.168.1.100 10.0.0.1
# bind 127.0.0.1 ::1
#
# ~~~ WARNING ~~~ If the computer running Redis is directly exposed to the
# internet, binding to all the interfaces is dangerous and will expose the
# instance to everybody on the internet. So by default we uncomment the
# following bind directive, that will force Redis to listen only into
# the IPv4 lookback interface address (this means Redis will be able to
# accept connections only from clients running into the same computer it
# is running).
#
# IF YOU ARE SURE YOU WANT YOUR INSTANCE TO LISTEN TO ALL THE INTERFACES
# JUST COMMENT THE FOLLOWING LINE.
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

用我的渣英文翻譯大概如下:

默認的,如果沒有bind的配置指令,redis監聽服務上的所有連接,如果你僅僅監聽一個或者多個的話,bind的配置,按照如下的一個或者多個ip的方式
警告:如果電腦上的redis直接暴露給網絡,綁定所有的了地址是危險的並且將會暴露給在網路上的每一個人。所以我們默認的取消注釋,強制的配置了一個IPV4的回環地址。(那就意味着在redis運行時只可以接收來自本電腦的連接)。

但是:

我的Java客戶端連接遠程的redis必須要把bind注釋掉,那么所有網絡外網均可訪問。但是這樣的話,當master掛掉之后,哨兵需要連接到slave,那么必須指定為localhost,負責找不到slave。親測必須不能注銷掉bind 127.0.0.1

眾所周知,校園網是沒有ip的,只有一個全局ip通過NAT分配端口,實現聯網的。那么如何配置只有特定的ip可以連接redis呢?

這里我必須把bind注銷掉才可以遠程連接,但哨兵正常工作又不能注銷掉bind的,惆悵啊。有大佬能給一個不錯的解決方案么?

總結:

redis是一個強大的緩存系統,有很多很不錯的功能,搞得想看其中的源碼了。但我一個Java程序員完全不懂C++那一套指針跑來跑去的。還有這個主從復制服務器我知道怎么配了,但客戶端還不是很清楚,還需要繼續學習。如何配置多端口的redis,掛掉了怎么實現客戶端自動切換端口等一系列操縱。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM