1.redis主備叢集
本文所用redis版本為3.2.1
1.1下載下傳redis
連結:https://pan.baidu.com/s/1bjdoi1LO9qcC1mbPe9ts-Q
提取碼:isc9
1.2下載下傳完成後解壓,目錄如圖
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2cs0TP3hlZ5YkY0QmMMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLyAzN0IjMwETMyEzMwkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
1.3複制一份解壓後的redis,目錄如圖
第一個redis的配置檔案不用修改,點開第二個檔案夾,修改redis.windows.conf
首先找到port,修改端口号為6380
然後找到slaveof <masterip> <masterport>,修改為slaveof 127.0.0.1 6379,并将前面的注釋去掉,點選儲存
1.4啟動redis
分别執行2個檔案夾下面的start.bat
啟動第一個如圖:
啟動第二個如圖:
可以看到顯示對外連結接端口号為6379的資訊,接下來就來驗證一下
1.5驗證主備叢集
打開DOS指令視窗,切換到這倆随便一個檔案夾下面
輸入 redis-cli -h 127.0.0.1 -p 6379,或者輸入redis-cli.exe也能切換到6379下
接着輸入 info replication 指令檢視資訊
我們先在6379下面設定一個鍵值對,看在6380下面能否看到。
set k1 v1
get k1
沒問題的話Ctrl+C退出,redis-cli -h 127.0.0.1 -p 6380 切換到6380下面
輸入 get k1,發現也可以得到v1
接着輸入info replication
現在我們把6379關掉,繼續get k1,發現還可以讀到v1。
實際上至此redis主從叢集已經完成了,但是當6379挂掉以後,想往6380存入資料,發現報錯((error) READONLY You can't write against a read only slave.),然後輸入info replication指令,發現6380還是備,并沒有升成主
這就有點難堪了o(╯□╰)o
我們想要的是主備都可以寫資料,而且主挂掉以後備可以自動升成主,當挂掉的那個主重新開機的時候會降為備,那麼這時候我們就要引入redis哨兵模式了。
2.Redis哨兵模式
Redis哨兵模式,用現在流行的話可以說就是一個“哨兵機器人”,給“哨兵機器人”進行相應的配置之後,這個"機器人"可以7*24小時工作,它能能夠自動幫助你做一些事情,如監控,提醒,自動處理故障等。
每個哨兵(sentinel) 會向其它哨兵(sentinel)、master、slave定時發送消息,以确認對方是否”活”着,如果發現對方在指定時間(可配置)内未回應,則暫時認為對方已挂(所謂的”主觀認為當機” Subjective Down,簡稱sdown).
若“哨兵群”中的多數sentinel,都報告某一master沒響應,系統才認為該master"徹底死亡"(即:客觀上的真正down機,Objective Down,簡稱odown),通過一定的vote算法,從剩下的slave節點中,選一台提升為master,然後自動修改相關配置.
關于redis哨兵的具體原理就不贅述了,文末會放上參考連結。本文主要說明一下如何搭建,其實很簡單,隻需要加一個配置檔案就可以了。
2.1建立sentinel.conf檔案
redis解壓目錄下是沒有這個檔案的,需要我們自己建立
# 這個是Redis6379配置内容,其他檔案同理新增然後改一下端口即可,26380
#目前Sentinel服務運作的端口
protected-mode no
port 26381
# 哨兵監聽的主伺服器 後面的1表示主機挂掉以後進行投票,隻需要1票就可以從機變主機
sentinel monitor mymaster 127.0.0.1 6379 2
# 3s内mymaster無響應,則認為mymaster當機了
sentinel down-after-milliseconds mymaster 3000
#如果10秒後,mysater仍沒啟動過來,則啟動failover
sentinel failover-timeout mymaster 10000
# 執行故障轉移時, 最多有1個從伺服器同時對新的主伺服器進行同步
sentinel parallel-syncs mymaster 1
# 設定哨兵sentinel 連接配接主從的密碼 注意必須為主從設定一樣的驗證密碼,沒有的話不用設定
sentinel auth-pass mymaster 123456
在2個檔案夾下面都放入此檔案,隻是端口不同
分别啟動2個redis以及2個哨兵,哨兵啟動指令為redis-server.exe sentinel.conf --sentinel
我們會發現報錯Creating Server TCP listening socket *:26379: listen: UnKnown error
經過網上查詢得知是沒有配置bind參數的原因,增加bind參數後sentinel.conf檔案如下
# 這個是Redis6379配置内容,其他檔案同理新增然後改一下端口即可,26380 26381
#目前Sentinel服務運作的端口
port 26381
bind 127.0.0.1
# 哨兵監聽的主伺服器
sentinel monitor mymaster 127.0.0.1 6379 2
# 3s内mymaster無響應,則認為mymaster當機了
sentinel down-after-milliseconds mymaster 3000
#如果10秒後,mysater仍沒啟動過來,則啟動failover
sentinel failover-timeout mymaster 10000
# 執行故障轉移時, 最多有1個從伺服器同時對新的主伺服器進行同步
sentinel parallel-syncs mymaster 1
現在我們分别啟動2個redis以及2個哨兵
注意,啟動redis主備叢集時要先啟動主,後啟動從,啟動哨兵先啟動哪個都可以。
啟動哨兵指令:redis-server.exe sentinel.conf --sentinel ,後面的“--sentinel”也要打上
都啟動成功之後,就可以進行測試了。
這裡有一個自己踩過的坑告訴大家,當測試主挂掉的時候,發現從可以正常的升為主,但是主重新開機的時候,如果你設定了redis密碼,會發現報錯:Master does not understand REPLCONF capa: -NOAUTH Authentication required。
這是因為配置主備叢集時,在redis.window.conf中,你隻給從配置了masterauth "12345",這種情況在主沒挂掉時可以用,但當主挂掉後重新開機時會變為從,沒有密碼連不上叢集,是以會報這個錯,是以需要在主的redis.window.conf中也加上這句話。
參考連結:
https://blog.csdn.net/u010648555/article/details/79430105
https://blog.csdn.net/u011872945/article/details/82928329
http://www.cnblogs.com/sammyliu/p/6929066.html
https://blog.csdn.net/Derek_Yam/article/details/81286637