Redis安裝及HA(High Availability)配置


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月


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM