redis主從配置初步:簡單主從切換(哨兵模式)
問題:主從配置,其中一臺宕機了,咋辦?
官網給我們提供了一個工具sentinel(哨兵)
。
1、sentinel在哪裡?
回憶一下,我們下載的redis原始碼。
2、在redis可執行檔案的目錄中有一個redis-sentinel
/usr/local/redis/bin/
就是通過它來啟動我們的”哨兵”,可以啟動多個『哨兵』。
3、sentinel的概念
使用者管理多個redis伺服器(instance),該系統執行以下3個任務:
監控(Monitoring):不斷的檢查你的主伺服器和從伺服器是否執行正常;
通知(Notification):當被監控的某個redis伺服器出現問題時,Sentinel可以通過API向管理員或者其他應用程式傳送通知;
自動故障遷移(Automatic failover):當一個主伺服器不能正常工作時,sentinel會開始一次自動故障遷移操作,它會將失效的主伺服器的其中一個從伺服器升級為新的主伺服器,並讓失效主伺服器的其他從伺服器為複製新的主伺服器。當客戶端試圖連線失效的主伺服器時,叢集也會向客戶端返回新主伺服器地址,使得叢集可以使用新主伺服器代替失效伺服器。
4、sentinel的配置
先拷貝配置檔案過來(從redis原始碼目錄中)
sudo cp sentinel.conf /usr/local/redis/conf/
cd /usr/local/redis/conf/
基本配置項說明:
port xxxooo //埠
sentinel monitor master 127.0.0.1 6379 2
sentinel down-after-milliseconds master 30000
sentinel failover-timeout master 180000
sentinel parallel-syncs master
sentinel notification-script
第二行:指定要檢測的例項,別名+iP地址+埠。2表示至少2個sentinel例項同時檢測到redis server異常,才判斷為宕機
第三行:指定某個sentinel例項監控到某個redis例項持續異常多少時間(毫秒),才判斷狀態為down。
第四行:若sentinel在該配置內未能完成failover操作(故障時master/slave自動切換),則認為本次failover失敗。
第五行:指定failover過程中,同時被sentinel reconfigure的最大slave例項數,由於reconfigure過沖中,對應的slave會中斷響應客戶端請求,故為了避免所有slave同時不可用,該值需適當配小。
第六行:指定sentinel檢測到master-name指向的例項異常時,呼叫的報警指令碼。該配置專案可選,但生成環境建議配置。
我們這裡,先來簡單點兒,只需要配置前面幾項。
vi sentinel.conf
修改或增加如下內容:
dir /tmp
修改工作目錄為:
dir /usr/local/redis/tmp #等下我們去建立這個目錄
sentinel monitor mymaster 127.0.0.1 6379 2
修改為:
sentinel monitor mymaster 127.0.0.1 6379 1 #因為我現在沒有2個哨兵
sentinel down-after-milliseconds mymaster 30000
修改為:
sentinel down-after-milliseconds mymaster 10000 #30秒修改為10秒
5、啟動2個服務
/usr/local/redis/bin/redis-server /usr/local/redis/conf/6379.conf
/usr/local/redis/bin/redis-server /usr/local/redis/conf/6380.conf
為了方便啟動,我們可以在/usr/local/redis/bin/
目錄下新建一個可執行的指令碼檔案,
比如叫start
,內容就是上面的2條命令。
然後需要給這個start
檔案許可權:
sudo chmod +x start
這樣我們就可以執行/usr/local/redis/bin/start
這個命令,來代替那2行了。
6、啟動sentinel
第一種啟動方式:
/usr/local/redis/bin/redis-sentinel /usr/local/redis/conf/sentinel.conf
注意:我這裡有個報錯,你不一定有。
You requested maxclients of 10000 requiring at least 10032 max file descriptors.
….
做如下操作即可:
sudo vi /etc/security/limits.conf
新增如下2行:
admin soft nofile 10032
admin hard nofile 10032
注意:admin是我這裡的使用者名稱
重啟當前使用者終端連線即可(不需要重啟伺服器)
7、操練
連線6379(主伺服器),設定一個值
/usr/local/redis/bin/redis-cli -h 127.0.0.1 -p 6379
set name zhangsan
連線從伺服器,獲取值
/usr/local/redis/bin/redis-cli -h 127.0.0.1 -p 6380
get name
預設從服務是不能set
的。
這個時候假設我們的主機(6379這個)宕機了
我們觀察著sentinel服務,會提示我們把6380切換到了主服務:
這時候,我們連上6380這個服務,發生竟然可以set了
/usr/local/redis/bin/redis-cli -h 127.0.0.1 -p 6380
set name lisi
好神奇,這就完成了redis的主從切換了。
我們可以重新把6379
這個redis服務給啟動起來:
/usr/local/redis/bin/redis-server /usr/local/redis/conf/6379.conf
然後我們連上6379這個服務:
/usr/local/redis/bin/redis-cli -h 127.0.0.1 -p 6379
我們發現我們現在只能get到6380機器
設定的值,不能set了。
現在不是主機,是從機了。
這就是最簡單的主從切換(2個節點的主從切換),其實我們還可以來更多節點:6379、6380、6381、6382。