1. 程式人生 > >redis配置讀寫分離以及利用哨兵sentinel進行自動主從切換

redis配置讀寫分離以及利用哨兵sentinel進行自動主從切換

redis利用哨兵(sentinel)進行主從切換,斷斷續續,自己終於通過配置驗證了一下該功能,其中遇到過一些的問題,也是耗費了大量的時間才解決,接下來分享下配置的過程以及遇到的問題和解決方法。希望對各位有所幫助。
首先說一下實驗環境:
redis軟體:redis-3.2.1(安裝在虛擬機器的linux系統中)
宿主主機:window8.1 x64
secureCRT:宿主主機安裝此軟體來操作linux,這只是個人喜歡,大家可以不裝。

對於redis在linux如何安裝這裡不進行說明,不懂的朋友可以自己百度,相信網上有很多相關的資料。在這裡將要搭建的是一個主伺服器,兩個從伺服器以及三個哨兵(sentinel)。其中主伺服器用的埠為預設埠6379,兩個從伺服器的埠分別為6380和6381;三個哨兵(sentinel)的埠分別為26379、26380和26381.
安裝好redis之後,我們拷貝三份出來,並且修改名字加以區分,這裡分出幾個資料夾,是比較清晰一點。如下:

這裡寫圖片描述

redis-3.2.1:這個資料夾用作主伺服器
redis_6380:這個資料夾用作從伺服器
redis_6381:這個資料夾用作從伺服器
redis_sentinel:這個資料夾用作哨兵配置

幾個檔案裡的檔案是一樣的,內容如下:
這裡寫圖片描述

配置主伺服器
首先,我們進入到redis-3.2.1資料夾進行主伺服器的配置,修改redis.conf檔案如下:
1、bind 127.0.0.1 修改為bind 0.0.0.0,這樣是允許任何機器都可以訪問該伺服器
這裡寫圖片描述
2、daemonize no 修改為daemonize yes ,redis將以守護程序的方式執行,這樣可以在redis服務啟動的視窗中再可以進行其它操作
這裡寫圖片描述


3、增加masterauth “redis”,這是設定從伺服器和哨兵連線主伺服器需要的密碼,我這裡設定為”redis“
這裡寫圖片描述
4、增加requirepass “redis”,這是設定redis客戶端或者遠端機器連線redis伺服器需要的密碼,這裡同樣設為“redis”
這裡寫圖片描述

至此,主伺服器就算是配置好了。

配置從伺服器
進入到redis_6380資料夾進行從伺服器的配置,修改redis.conf檔案如下:
1、bind 127.0.0.1 修改為bind 0.0.0.0
2、port 6379 修改為port 6380
這裡寫圖片描述
3、daemonize no 修改為daemonize yes
4、增加slaveof 192.168.81.129 6379,指定當前伺服器是哪個伺服器的從伺服器,這裡指定當前伺服器的主伺服器是192.168.81.129:6379
這裡寫圖片描述


5、增加masterauth “redis”,設定連線主伺服器的密碼
這裡寫圖片描述
6、增加requirepass “redis”,這是設定redis客戶端或者遠端機器連線redis伺服器需要的密碼,這裡同樣設為“redis”(6381的密碼也設為“redis”)

至此,6380這臺從伺服器的配置檔案就修改完成了。
對於6381這臺從伺服器與修改6380的步驟一樣,只是在第二步中記得把埠改為6381

至此,一個主伺服器和兩個從伺服器的配置已經完成了。在這裡我們先驗證下配置是否正確:
1、首先啟動主伺服器(按照圖中命令順序輸入即可,命令含義不懂自己百度):
這裡寫圖片描述
通過info replication命令我們可以看到,當前的伺服器角色是主伺服器(role master),並且沒有從伺服器(connected_slaves:0)
2、新開一個secureCRT視窗,並進入到6380從伺服器資料夾中,啟動6380redis伺服器:
這裡寫圖片描述

通過info replication命令我們可以看到,當前伺服器的角色是從伺服器,並且主伺服器是192.168.81.129:6379,這跟我們在配置檔案中配置的一致(slaveof 192.168.81.129 6379),所以主從配置是正確的。用同樣的方法啟動6381的從伺服器:

這裡寫圖片描述
這時候,我們再回到主伺服器的視窗執行info replication命令,可以看到已經有兩個從伺服器已經連上來了:
這裡寫圖片描述
當我們在主伺服器中設定一個鍵,在從伺服器中可以讀到這個鍵的值,並且從伺服器不能進行寫入操作,這就實現了主寫從讀的效果(讀寫分離):
主伺服器寫:
這裡寫圖片描述
從伺服器讀:
這裡寫圖片描述
從伺服器寫入被拒絕:
這裡寫圖片描述

至此,就實現了主從伺服器的讀寫分離,接下來將介紹如何利用哨兵對主從進行自動切換。
首先,另開一個secureCRT視窗,進入到redis_sentinel資料夾中,資料夾裡有一個配置檔案sentinel.conf。這個配置檔案就是哨兵的配置檔案,我們對這個檔案拷貝出來三份,名字分別為:sentinel_6379.conf、sentinel_6380.conf和sentinel_6381.conf:
這裡寫圖片描述

編輯sentinel_6379.conf配置檔案:
1、新增 bind 0.0.0.0 配置資訊,這是為了遠端機器可以連線當前哨兵;如果不需要被遠端機器連線,可以不配置此選項;
這裡寫圖片描述
2、新增要監控主機的資訊:
這裡寫圖片描述
對”sentinel monitor mymaster 192.168.81.129 6379 2“解釋:
mymaster :為主伺服器起的名字;
192.168.81.129 6379:主伺服器的ip和埠號
2:代表有2個哨兵認為主伺服器主觀下線時,則認為主伺服器是客觀下線了,可以執行主從切換,並進行故障轉移操作

對“sentinel auth-pass mymaster redis”解釋:
mymaster :為主伺服器起的名字;
redis:為連線主伺服器需要的密碼,即主伺服器redis.conf中的masterauth屬性的值

至此,一個哨兵的配置就已經完成了。對sentinel_6380.conf和sentinel_6381的修改步驟與sentinel_6379.conf的修改步驟一致。但是sentinel_6380.conf檔案裡的埠要配為26380:
這裡寫圖片描述
sentinel_6381.conf檔案裡的埠要配為26381:
這裡寫圖片描述

至此,主從配置和哨兵配置的任務就算全部完成了。下面將驗證下當主伺服器斷線時候,哨兵是否能自動進行主從切換和故障轉移。

首先我們先啟動主伺服器並連上客戶端:
這裡寫圖片描述
接著新開一個secureCRT視窗,啟動6380的從伺服器並啟動客戶端:
這裡寫圖片描述
接著新開一個secureCRT視窗,啟動6381的從伺服器並啟動客戶端:
這裡寫圖片描述
接著新開一個secureCRT視窗,進入到redis_sentinel資料夾,啟動埠號為26379的哨兵:
這裡寫圖片描述
從列印的日誌我們可以知道,當前哨兵的ID,哨兵監控的主伺服器配置以及從伺服器配置
用同樣的方法啟動埠號為26380和26381的哨兵:
這裡寫圖片描述
這裡寫圖片描述

至此,我們添加了三個哨兵對主伺服器(192.168.81.129 6379)進行監控。

故障演示
回到啟動主伺服器的secureCRT視窗,並shutdown掉主伺服器:
這裡寫圖片描述
等30秒時間(30秒是在哨兵的配置檔案“sentinel down-after-milliseconds mymaster 30000”這一行指定的,當哨兵發通訊訊息給主伺服器,如果30秒之後沒有收到主伺服器的回覆,則認為主觀下線)我們分別看下三個哨兵列印的日誌資訊:
26379日誌資訊:
這裡寫圖片描述
26380日誌資訊:
這裡寫圖片描述
26381日誌資訊:
這裡寫圖片描述
這三個哨兵列印的資訊基本上一致,從日誌中我們可以看到,現在主伺服器已經切換到192.168.81.129:6380這臺redis伺服器,我們在6380上通過info replicaiton檢視是否已經是正確切換:
這裡寫圖片描述
從顯示的資訊中可以知道,6380這臺redis伺服器確實升級為主伺服器了。當我們重新啟動6379這臺redis伺服器,那麼它將會被降級為從伺服器,成為新的主伺服器的從伺服器:
這裡寫圖片描述
可以看到,6379重新啟動後確實變成了從伺服器,而且主伺服器是192.168.81.129:6380。從伺服器是隻讀的,所以我們通過set name “redis”會報錯。

至此,利用redis的哨兵(sentinel)對主伺服器進行監控,並且當主伺服器down掉的時候哨兵能自動進行主從切換就算演示完成了。這整個過程的配置都是我已經試驗成功之後的,下面將描述下我在配置過程中遇到的問題:

1、主伺服器設定了密碼(redis.conf檔案中的masterauth有設定),如果在哨兵的配置檔案(sentinel_6379.conf、sentinel_6380.conf、sentinel_6381.conf)中沒有指定連線主伺服器的密碼(通過sentinel auth-pass mymaster redis指定),那麼哨兵將不能連線主伺服器,哨兵就會判斷主伺服器是主觀下線的。例如我們註釋掉26381配置連線主伺服器的密碼那一行:
這裡寫圖片描述
可以看到主伺服器是主觀下線,但事實上主伺服器並沒有下線:
這裡寫圖片描述

2、如果在外部程式碼需要獲取哨兵資訊,必須在哨兵的配置檔案中配置bind 0.0.0.0,要不然外部程式碼連不上哨兵。