Redis安裝及HA(High Availability)配置

Morven.Huang發表於2014-12-25

Redis是一種記憶體資料庫,以KEY-VALUE(即鍵值對)的形式儲存資料。這篇文章主要介紹的是Redis安裝及配置,所以不對Redis本身作詳細介紹了。

 

http://redis.io/download (另外,Redis作者有一部落格:http://antirez.com/latest/0,有興趣的可以關注)

 

以redis-2.8.19.tar.gz為例,解壓放在某目錄下,這裡選擇/usr/local目錄。

 

編譯

進入/usr/local/redis-2.8.19,執行

#make

如遇到gcc: Command not found錯誤,表示需要安裝gcc

#yum install gcc

如遇到zmalloc.h:50:31: error: jemalloc/jemalloc.h: No such file or directory錯誤,則要進入deps目錄,執行:

#make hiredis

#make jemalloc

#make linenoise

#make lua

然後再回到上級目錄執行make即可。

 

啟動

make成功之後,會在src目錄生成redis-server等可執行檔案,執行:

#src/redis-server

#src/redis-server &//加&為了可以讓滑鼠退出Redis的命令列

 

#ps aux|grep redis//檢視是否有相應的程式

#telnet localhost 6379//登入Redis

或更常用的

#src/redis-cli//進入Redis互動命令列

這裡介紹三個最基本的Redis命令(1)keys *,顯示資料庫中所有的key;(2)set foo bar,即為鍵foo設定值bar;(3)get foo,檢視鍵foo的值。

 

關閉

#src/redis-cli shutdown

 

日誌

不管對什麼應用程式,日誌對於診斷工作有很大的作用,所以這裡提一下Redis的日誌。我們發現按上面的方法啟動Redis,我們在系統中找不到Redis的日誌,即便我們配置了/usr/local/redis-2.8.19/redis.conf檔案中的logfile,指向/var/log/redis.log,仍然找不到日誌。

同時,通過src/redis-cli CONFIG GET *來檢視配置項,則提示命令引數錯誤ERR Wrong number of arguments for CONFIG GET

其實,造成這些問題的原因是在啟動Redis時沒有明確指定配置檔案,可以這樣指定:

#src/redis-server redis.conf &//可以使用絕對路徑來指定redis.conf

這樣就一切正常了,日誌檔案也生成了。

 

HA配置

我們先介紹Redis怎麼配置Replication,這裡準備了兩臺機器:redisha1(153.65.171.99),這個作master;redisha2(153.65.170.156),這個我們用來作slave,修改它的redis.conf:

slaveof 153.65.171.99 6379

表示我是redisha1的slave。這樣設定之後,如果我們在redisha1中通過set foo bar2,在redisha2中通過get foo就可以取到值bar2。Redis自動完成了同步。

需要注意的是,配置完Replication後,作為slave的redisha2則進入read-only模式,也就是我們不能在redisha2上使用set命令寫入資料了,set操作會收到(error) READONLY You can't write against a read only slave。

 

配置完Replication並不意味著就萬事大吉了,試想如果redisha1當機了,則基本意味著這套Redis系統失效了,因為這個時候剩下的redisha2是一個read-only的slave。

我們期望能有一個監控程式可以自動完成Redis Replication系統中的角色切換,而這正是我們要介紹的Redis Sentinel的設計目的(sentinel本身有哨兵、放哨之意)。同樣,也準備了兩臺機器,都用來執行Sentinel:redisha3(153.65.171.168),redisha4(153.65.170.145),並且和前面的redisha1和redisha2一樣,都部署了redis-2.8.19,所不同的是,我們並不改動redis.conf進行,要改動的是sentinel.conf:

sentinel monitor test 153.65.171.99   6379   2

這一行配置表示我要監控153.65.171.99這臺機器上的Redis例項,併為它取了一個暱稱叫test(預設是mymaster,如果你改動了,注意要搜尋這個檔案中所有mymaster的地方,並都改過來)。6379則是99上Redis監聽的埠。

最後的2這個數字則是quorum數,對於一個Redis主從系統,可以有多個sentinel同時監控它,以避免當唯一的一個sentinel宕掉後影響redis系統的執行。多個sentinel之間採用一種“投票”機制,即某一sentinel發現某一redis例項宕掉了,它不能直接將它移出系統,而要詢問所有的sentinel,只有當n個sentinel都投票同意說這個redis例項確實宕掉了,才能將它移出。而這個這n值正是由quorum引數指定。

 

啟動Sentinel

在redisha3與redisha4上,進入/usr/local/redis-2.8.19目錄,執行:

#src/redis-server sentinel.conf --sentinel

 

測試

關閉redisha1上的redis例項,則在sentinel的視窗中:

+switch-master test 153.65.171.99 6379 153.65.170.156 6379

也就是說原來的redisha1(153.65.171.99)的master角色現在由於redisha2(153.65.170.156)來承擔了。

同時你會發現看到redisha2的redis.conf中的slaveof配置被移除了,因為它現在是master了。

 

啟動redisha1上的redis,redisha1會被以slave的身份加入到redis系統中,可以在sentinel的視窗中看到:

+convert-to-slave slave 153.65.171.99:6379 153.65.171.99 6379 @ test 153.65.170.156 6379

而redisha1中的redis.conf檔案的最後一行會被自動新增上slaveof配置,指向現在的master即redisha2。

需要注意的是,這個自動發現新redis例項並把它作為slave加入到系統中的功能,在2.6版本中是沒有的。

 

關閉redisha4上的sentinel,redisha3上可以看到:

+sdown sentinel 153.65.170.145:26379 153.65.170.145 26379 @ test 153.65.170.156 6379

這個時候我關閉redisha2(它現在是master),sentinel無法進行自動角色切換了,這跟quorum的配置有關,因為它現在沒有辦法收到2個投票,這個上面介紹過了。

 

SDOWN, ODOWN:

在sentinel的輸出中,經常可以看到這兩個狀態:

Subjectively Down condition (SDOWN) 主觀覺得某redis例項已停止,即當前sentinel判斷某redis例項已經停止。

Objectively Down condition (ODOWN) 客戶判斷某redis例項已停止,quorum引數指定的數量n,噹噹前有n個sentinel投票此redis已經宕了,則進入ODOWN狀態。

 

其它幾個命令:

#redis-cli -h {IP} -p 26379 info Sentinel//檢視sentinel的資訊

#redis-cli -h {IP} -p 6379 info Replication//檢視replication的資訊

#redis-cli -h {IP} -p 26379 sentinel slaves test//檢視所有slave的資訊。test是sentinel.conf中配置的master的暱稱

 


送書了,送書了,關注公眾號“程式設計師雜書館”,送出O'Reilly《Spark快速大資料分析》紙質書(亦有一批PDF分享)! —— 2018年12月

相關文章