安裝:
這裡對源碼編譯進行一下說明,本文執行個體的作業系統是Ubuntu16.04,使用Redis的版本是3.2.0。安裝步驟如下:
下載下傳源碼包:w g et h tt p:/ /d o wn loa d.redis.io/releases/redis-3.2.0.tar.gz
安裝依賴包:sudo apt-get install gcc tcl
解壓編譯 :
注意:這裡很可能會在make test 這步出現一個錯誤:
[err]: Test replication partial resync: ok psync (diskless: yes, reconnect: 1) in tests/integration/replication-psync.tcl
Expected condition '[s -1 sync_partial_ok] > 0' to be true ([s -1 sync_partial_ok] > 0)
出現這個問題的原因可能是"測試點在配置比較低的機器上會因為逾時而過不了",本文的環境是一個lxc的虛拟機。不過有2個方法可以避免:
到此redis編譯安裝完成。
編譯檔案的目錄裡有2個配置:
redis.conf、sentinel.conf,配置檔案說明請見這篇文章。
本文測試的環境架構:
3個redis執行個體1主、2從、3sentinel。M:10.0.3.110、S:10.0.3.92、10.0.3.66,每個redis執行個體上配置一個sentinel執行個體。修改配置檔案:
redis.conf
View Code
sentinel.conf
配置檔案儲存在 /etc/redis/目錄下,按照配置檔案建立相應的目錄。和Redis 複制、Sentinel的搭建和原理說明這裡不同的是各個redis執行個體都配置了密碼通路的限制(requirepass)。
注意:當一個master配置需要密碼才能連接配接時,用戶端和slave在連接配接時都需要提供密碼。master通過requirepass設定自身的密碼,不提供密碼無法連接配接到這個master。slave通過masterauth來設定通路master時的密碼。用戶端需要auth提供密碼,但是當使用了sentinel時,由于一個master可能會變成一個slave,一個slave也可能會變成master,是以需要同時設定上述兩個配置項,并且sentinel需要連接配接master和slave,需要設定參數:sentinel auth-pass <master_name> xxxxx。
建立redis使用者群組,把配置檔案裡指定的目錄均授權。
開啟各個redis執行個體
注意:開啟的時redis的日志會報幾個WARNING:
WARNING說明:
建立好複制後(slaveof)開啟各個sentinel執行個體
注意:這裡出現一個問題,這個問題罪魁禍首是參數:protected-mode。看下日志:
從日志裡可以看到,除了本地的sentinel正常,其他2個sentinel都主觀不可用了(SDOWN),時間剛好15秒(down-after-milliseconds 15000),sentinel會向master發送心跳PING來确認master是否存活,如果master在“一定時間範圍”内不回應PONG 或者是回複了一個錯誤消息,那麼這個sentinel會主觀地(單方面地)認為這個master已經不可用了(subjectively down, 也簡稱為SDOWN)。而這個down-after-milliseconds就是用來指定這個“一定時間範圍”的,機關是毫秒。
通過時間點的判斷可以看到,sentinel之間發現不了對方,導緻SDOWN(從Redis 複制、Sentinel的搭建和原理說明裡介紹的發現機制)。因為沒有錯誤資訊,這裡找了半天原因都沒發現什麼問題。最後登陸sentinel上檢視一下:
這裡看到一大串的資訊,總的就是在說redis在沒有開啟bind和密碼的情況下,保護模式被開啟。然後Redis的隻接受來自環回IPv4和IPv6位址的連接配接。拒絕外部連接配接,使使用者知道發生了什麼錯誤。其實應該為使用者提供了線索,而不是拒絕連接配接。具體的說明可以看作者的讨論,最後作者給出的建議是關閉保護模式:--portected-mode no。是以最後我們這裡的錯誤資訊可以得到解釋:由于sentinel沒有指定bind和密碼通路,是以被開啟了protected-mode保護模式,拒絕其他sentinel的連接配接。導緻進入了ODWON。在sentinel.conf裡加入:
問題得到解決。portected-mode是3.2被引入,預設開啟。具體的資訊如下:
開啟sentinel,檢視日志:(成功開啟)
檢視狀态,驗證sentinel是否建立成功。(任意登陸一個sentinel檢視)
上面粗體的字說明sentinel開啟成功。
測試:
注意:因為上面的虛拟機連不了郵件伺服器,是以更換了環境。新環境:版本2.8.4,3個redis執行個體1主、2從、3sentinel。M:192.168.200.208<6379>、S:192.168.200.199、192.168.200.73,每個redis執行個體上配置一個sentinel<7379>執行個體。
① 檢視:info
② 驗證failover
kill 掉 master,通過日志檢視是切換過程的資訊:
start 老的master,通過日志檢視:
更多的日志資訊見上一篇文章。在sentinel裡有個選項client-reconfig-script,接下來說明下。
failover腳本:高可用,通過參數 client-reconfig-script 指定腳本:failover發生時候執行的腳本。
該參數的解釋:
傳回的參數:
腳本的目的是在發生failover之後,發送郵件報警,并且把vip切換到新的master上,有點類似MySQL的MHA,腳本比較簡單,沒有做其他多餘的判斷,也可以根據複雜的情況加強這個腳本。實作方法:
①:首先在三台redis執行個體上建立信任用密碼登陸。
這裡需要注意:因為測試中的sentinel執行個體和redis執行個體是放一起的,要是本地的sentinel要操作(down,up VIP)redis執行個體,也需要本地也可以通路本地,即自己ssh-keygen建立的公鑰也要放到自己的authorized_keys中,最後每個伺服器的authorized_keys都互相包含(三行)。
②:第一次執行的時候需要在master上先設定vip,即搭好redis sentinel之後,就需要在master上設定好vip。
③:通過收集日志,取得所需要的ip。
④:發送、記錄日志,并且遠端執行up、down VIP。
在此之前首先要安裝paramiko子產品:easy_install paramiko,需要依賴包:apt-get install python-setuptools python-dev build-essential libffi-dev libssl-dev;或則直接執行:apt-get install python-paramiko。
具體腳本如下:
當發生切換時,最終郵件報警的内容如下:
日志裡記錄的資訊如下:
BTW:程式可以直接連vip通路Redis,實作一定的高可用:當vip切換的時候,服務會斷開,多久不可用主要看設定的檢測時間(down-after-milliseconds:預設30秒,可以設定更低,如5000即5秒)和程式重連的時間。當然也可以直接用java的jedis用戶端通路,直接實作高可用(通過sentinel中的資訊得到master,再連master)。
本文轉自 sshpp 51CTO部落格,原文連結:http://blog.51cto.com/12902932/1927047,如需轉載請自行聯系原作者