
準(zhǔn)備條件
| 系統(tǒng)版本 | 內(nèi)核版本 | Redis版本 |
|---|---|---|
| CentOS release 6.4 (Final) | 2.6.32-358.el6.x86_64 | redis-2.8.9 |
硬件服務(wù)器配置:
| Cpu | 內(nèi)存 | 硬盤(pán) |
|---|---|---|
| 4c 2.1GHZ | 6G | 200G |
部署規(guī)劃
主節(jié)點(diǎn):172.16.0.1
從節(jié)點(diǎn):172.16.0.2
一 Redis 主從復(fù)制
主從復(fù)制是指將一臺(tái) Redis 服務(wù)器的數(shù)據(jù),復(fù)制到其它的 Redis 服務(wù)器。
前者稱為主節(jié)點(diǎn)(master),后者稱為從節(jié)點(diǎn)(slave);數(shù)據(jù)的復(fù)制是單向的,只能由主節(jié)點(diǎn)到從節(jié)點(diǎn)。
默認(rèn)情況下,每臺(tái) Redis 服務(wù)器都是主節(jié)點(diǎn),且一個(gè)主節(jié)點(diǎn)可以有多個(gè)從節(jié)點(diǎn)(或沒(méi)有從節(jié)點(diǎn)),但一個(gè)從節(jié)點(diǎn)只能有一個(gè)主節(jié)點(diǎn)。

主從復(fù)制的作用:
數(shù)據(jù)冗余:主從復(fù)制實(shí)現(xiàn)了數(shù)據(jù)的熱備份,是持久化之外的一種數(shù)據(jù)冗余方式
故障恢復(fù):當(dāng)主節(jié)點(diǎn)出現(xiàn)問(wèn)題時(shí),可以由從節(jié)點(diǎn)提供服務(wù),實(shí)現(xiàn)快速的故障恢復(fù),但實(shí)際上是一種服務(wù)的冗余
負(fù)載均衡:在主從復(fù)制的基礎(chǔ)上,配合讀寫(xiě)分離,可以由主節(jié)點(diǎn)提供寫(xiě)服務(wù),由從節(jié)點(diǎn)提供讀服務(wù)(即寫(xiě)Redis數(shù)據(jù)時(shí)應(yīng)用連接主節(jié)點(diǎn),讀Redis數(shù)據(jù)時(shí)應(yīng)用連接從節(jié)點(diǎn)),分擔(dān)服務(wù)器負(fù)載;尤其是在寫(xiě)少讀多的場(chǎng)景下,通過(guò)多個(gè)從節(jié)點(diǎn)分擔(dān)讀負(fù)載,可以大大提高Redis服務(wù)器的并發(fā)量
高可用:主從復(fù)制還是哨兵和集群能夠?qū)嵤┑幕A(chǔ),因此說(shuō)主從復(fù)制是Redis高可用的基礎(chǔ)
1、Redis配置步驟
本次實(shí)現(xiàn)1主1從節(jié)點(diǎn)部署 (以下配置需兩臺(tái)同樣操作)
1.1首先確認(rèn)系統(tǒng)中是否存在c語(yǔ)言的編譯環(huán)境
#gcc --version
或者#g++ --version
yum -y install gcc
1.2下載redis
wget http://download.redis.io/releases/redis-2.8.9.tar.gz
1.3 解壓
# tar zxvf redis-2.8.9.tar.gz
# mv redis-2.8.9 /usr/local/redis
# cd redis
1.4安裝
# make
# make test
遇到報(bào)錯(cuò)1
.Executing test client: NOREPLICAS Not enough good slaves to write..
可以修改文件tests/integration/replication-2.tcl,將after 1000改為after 10000以延長(zhǎng)等待時(shí)間。
報(bào)錯(cuò)2
make[1]: Entering directory/usr/local/redis/src' You need tcl 8.5 or newer in order to run the Redis test make[1]: *** [test] Error 1 make[1]: Leaving directory/usr/local/redis/src'
解決2 wget http://downloads.sourceforge.net/tcl/tcl8.6.1-src.tar.gz
tar xzvf tcl8.6.1-src.tar.gz -C /usr/local/
cd /usr/local/tcl8.6.1/unix/
./configure
make
make install
# make test
# make install PREFIX=/usr/local/redis PREFIX安裝指定目錄 否則安裝到/usr/local/bin里面了
1.5修改配置文件
vim /usr/local/redis/redis.conf
bind 0.0.0.0
port 6379
timeout 0
daemonize yes
pidfile /var/run/redis6379.pid
loglevel debug
logfile /var/log/redis6379.log
1.6 啟動(dòng)
# cd /usr/local/redis/bin
# ./redis-server ../redis.conf &
檢查端口是否運(yùn)行
netstat -unltp | grep redis
連接redis
redis-cli
quit
2、redis主從部署
1.1配置master
vim /usr/local/redis/redis.conf
daemonize yes
pidfile "/var/run/redis6379.pid"
port 6379
bind 0.0.0.0
timeout 0
tcp-keepalive 0
loglevel notice
logfile "/var/log/redis6379.log"
databases 16
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename "dump_6379.rdb"
#dir /usr/local/redis/dir/redis_6379"
maxmemory 4gb
slave-read-only yes
slave-serve-stale-data yes
repl-disable-tcp-nodelay no
slave-priority 100
appendonly no
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-entries 512
list-max-ziplist-value 64
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes
殺掉之前的redis
netstat -unltp | grep redis #查看進(jìn)程pid號(hào)
kill -9 pid號(hào)
啟動(dòng)master的redis
# cd /usr/local/redis/bin
# ./redis-server ../redis.conf &
netstat -unltp |grep redis
驗(yàn)證是否為master
redis-cli -p 6379 info | grep role
1.2 配置slave
vim /usr/local/redis/redis.conf
#配置和主配置一樣,需要在下面添加
slaveof 172.16.0.1 6379 #指定主節(jié)點(diǎn)服務(wù)器
slaveof <masterip> <masterport> 永久為從
在配置文件中直接修改 slaveof 屬性,直接配置主服務(wù)器的ip 地址,和端口號(hào),如果這里主服務(wù)器有配置連接密碼可以通過(guò)配置masterauth 來(lái)設(shè)置連接密碼
殺掉之前的redis
netstat -unltp | grep redis #查看進(jìn)程pid號(hào)
kill -9 pid號(hào)
啟動(dòng)master的redis
# cd /usr/local/redis/bin
# ./redis-server ../redis.conf &
netstat -unltp |grep redis
驗(yàn)證是否為master
redis-cli -p 6379 info | grep role
驗(yàn)證主從是否同步(1:6379和2:6379)
# redis-cli -h 172.16.0.1 -p 6379
172.16.0.1:6379> set ma right
OK
172.16.0.1:6379> set Li class2
OK
172.16.0.1:6379> keys *
1) "ma"
2) "Li"
172.16.0.1:6379>
[root@bogon redis]# redis-cli -h 172.16.0.2 -p 6379
172.16.0.2:6379> keys *
1) "ma"
2) "Li"
3) "fangchan"
172.16.0.2:6379>
主從同步正常
從庫(kù)默認(rèn)是只讀的
172.16.0.1:6379> set lll beaty
(error) READONLY You can't write against a read only slave.
3 redis主從切換測(cè)試
172.16.0.1:6379 主,172.16.0.2:6379從
步驟 1、停止主庫(kù)redis
# redis-cli -h 172.16.0.1 -p 6379 shutdown
步驟 2、將從172.16.0.2 redis設(shè)為主redis
[root@bogon redis]# redis-cli -h 172.16.0.2 -p 6379 slaveof NO ONE
OK
步驟 3、測(cè)試從redis是否切換為主redis
[root@bogon redis6379]# redis-cli -h 172.16.0.2 -p 6379
172.16.0.2:6379> set apu new
OK
172.16.0.2:6379> get apu
"new"
172.16.0.2:6379>
從庫(kù)可以寫(xiě)入,切換成功
步驟 4、原來(lái)的主redis重新恢復(fù)正常,需要重新切換回去
1.將現(xiàn)在的主redis數(shù)據(jù)進(jìn)行保存
[root@bogon redis]# redis-cli -h 172.16.0.2 -p 6379
172.16.0.2:6379> set apu new
OK
172.16.0.2:6379> get apu
"new"
172.16.0.2:6379> save
2.將現(xiàn)在的主172.16.0.2 redis數(shù)據(jù)目錄下dump.rdb文件拷貝覆蓋原來(lái)主172.16.0.1 redis 數(shù)據(jù)目錄下面
3.啟動(dòng)原來(lái)的172.16.0.1 redis
# cd /usr/local/redis
# bin/redis-server redis.conf &
4.將現(xiàn)在的主172.16.0.2 redis切換為從庫(kù)
[root@]# redis-cli -h 172.16.0.2 -p 6379 slaveof 172.16.0.1 6379
OK
步驟 5、查看主庫(kù)redis是否正常
之前在從庫(kù)中添加的key,此時(shí)在主庫(kù)6379中都可以查看
步驟 6、驗(yàn)證主從同步是否正常
主172.16.0.1 redis寫(xiě)入,從172.16.0.2 redis可正常同步;
從redis只支持讀,不支持寫(xiě)入
二 哨兵模式
假設(shè)我們的主機(jī)宕機(jī)了,此時(shí)沒(méi)有主機(jī)了,我們需要手動(dòng)去配置,這樣無(wú)疑是很復(fù)雜的,此時(shí)redis給出的解決方案就是哨兵模式(sentinel)
1、什么是哨兵模式
Redis-sentinel是Redis的作者antirez,因?yàn)镽edis集群的被各大公司使用,每個(gè)公司要寫(xiě)自己的集群管理工具,于是antirez花了幾個(gè)星期寫(xiě)出了Redis-sentinel。
Sentinel集群拓?fù)鋱D

Redis 的 Sentinel 系統(tǒng)用于管理多個(gè) Redis 服務(wù)器(instance),Redis 的 Sentinel 為Redis提供了高可用性。使用哨兵模式創(chuàng)建一個(gè)可以不用人為干預(yù)而應(yīng)對(duì)各種故障的Redis部署。
于是,在 Redis 2.8 版本開(kāi)始,引入了哨兵(Sentinel)這個(gè)概念,在主從復(fù)制的基礎(chǔ)上,哨兵實(shí)現(xiàn)了自動(dòng)化故障恢復(fù)。如上圖所示,哨兵模式由兩部分組成,哨兵節(jié)點(diǎn)和數(shù)據(jù)節(jié)點(diǎn):
哨兵節(jié)點(diǎn):哨兵節(jié)點(diǎn)是特殊的 Redis 節(jié)點(diǎn),不存儲(chǔ)數(shù)據(jù);
數(shù)據(jù)節(jié)點(diǎn):主節(jié)點(diǎn)和從節(jié)點(diǎn)都是數(shù)據(jù)節(jié)點(diǎn)。
該系統(tǒng)執(zhí)行以下三個(gè)任務(wù):
監(jiān)控(Monitoring):Sentinel會(huì)不斷地檢查你的主服務(wù)器和從服務(wù)器是否允許正常。
提醒(Notification):當(dāng)被監(jiān)控的某個(gè)Redis服務(wù)器出現(xiàn)問(wèn)題時(shí),Sentinel可以通過(guò)API向管理員或者其他應(yīng)用程序發(fā)送通知。
自動(dòng)故障遷移(Automatic failover):
(1)當(dāng)一個(gè)主服務(wù)器不能正常工作時(shí),Sentinel會(huì)開(kāi)始一次自動(dòng)故障遷移操作,他會(huì)將失效主服務(wù)器的其中一個(gè)從服務(wù)器升級(jí)為新的主服務(wù)器,并讓失效主服務(wù)器的其他從服務(wù)器改為復(fù)制新的主服務(wù)器;
(2)客戶端試圖連接失敗的主服務(wù)器時(shí),集群也會(huì)向客服端返回新主服務(wù)器的地址,是的集群可以使用新主服務(wù)器代替失效服務(wù)器。
2、實(shí)現(xiàn)原理:
哨兵啟動(dòng)后會(huì)與要監(jiān)控的主數(shù)據(jù)庫(kù)建立兩條連接

和主數(shù)據(jù)庫(kù)連接建立完成后,哨兵會(huì)使用連接2發(fā)送如下命令:
每10秒鐘哨兵會(huì)向主數(shù)據(jù)庫(kù)和從數(shù)據(jù)庫(kù)發(fā)送INFO 命令
每2秒鐘哨兵會(huì)向主數(shù)據(jù)庫(kù)和從數(shù)據(jù)的sentinel:hello頻道發(fā)送自己的消息。
每1秒鐘哨兵會(huì)向主數(shù)據(jù)、從數(shù)據(jù)庫(kù)和其他哨兵節(jié)點(diǎn)發(fā)送PING命令。
??首先,發(fā)送INFO命令會(huì)返回當(dāng)前數(shù)據(jù)庫(kù)的相關(guān)信息(運(yùn)行id,從數(shù)據(jù)庫(kù)信息等)從而實(shí)現(xiàn)新節(jié)點(diǎn)的自動(dòng)發(fā)現(xiàn),前面提到的配置哨兵時(shí)只需要監(jiān)控Redis主數(shù)據(jù)庫(kù)即可,因?yàn)樯诒梢越柚鶬NFO命令來(lái)獲取所有的從數(shù)據(jù)庫(kù)信息(slave),進(jìn)而和這兩個(gè)從數(shù)據(jù)庫(kù)分別建立兩個(gè)連接。在此之后哨兵會(huì)每個(gè)10秒鐘向已知的主從數(shù)據(jù)庫(kù)發(fā)送INFO命令來(lái)獲取信息更新并進(jìn)行相應(yīng)的操作。 ??接下來(lái)哨兵向主從數(shù)據(jù)庫(kù)的sentinel:hello 頻道發(fā)送信息來(lái)與同樣監(jiān)控該數(shù)據(jù)庫(kù)的哨兵分享自己的信息。發(fā)送信息內(nèi)容為:
<哨兵的地址>,<哨兵的端口>,<哨兵的運(yùn)行ID>,<哨兵的配置版本>,<主數(shù)據(jù)庫(kù)的名字>,<主數(shù)據(jù)庫(kù)的地址>,<主數(shù)據(jù)庫(kù)的端口>,<主數(shù)據(jù)庫(kù)的配置版本>

哨兵通過(guò)監(jiān)聽(tīng)的sentinel:hello頻道接收到其他哨兵發(fā)送的消息后會(huì)判斷哨兵是不是新發(fā)現(xiàn)的哨兵,如果是則將其加入已發(fā)現(xiàn)的哨兵列表中并創(chuàng)建一個(gè)到其的連接(哨兵與哨兵只會(huì)創(chuàng)建用來(lái)發(fā)送PING命令的連接,不會(huì)創(chuàng)建訂閱頻道的連接)。
3、配置redis哨兵
1.1新增配置文件
哨兵模式是在redis 主從基礎(chǔ)上添加配置文件
vim /usr/local/redis/sentinel.conf
daemonize yes
bind 0.0.0.0
port 26379
sentinel monitor mymaster 172.16.0.1 6379 1
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
1.2 啟動(dòng)redis-sentinel
(主從服務(wù)器全部啟動(dòng))
redis-sentinel /usr/local/redis/sentinel.conf #指定redis-sentinel配置文件
或者:
# cd /usr/local/redis/bin
# ./redis-server ../sentinel.conf --sentinel &
1.3 附加項(xiàng)(哨兵使用)
連接哨兵
redis-cli -p 26379
命令:
sentinel的基本狀態(tài)信息
INFO
列出所有被監(jiān)視的主服務(wù)器,以及這些主服務(wù)器的當(dāng)前狀態(tài)
SENTINEL masters
列出給定主服務(wù)器的所有從服務(wù)器,以及這些從服務(wù)器的當(dāng)前狀態(tài)
SENTINEL slaves
返回給定名字的主服務(wù)器的 IP 地址和端口號(hào)
SENTINEL get-master-addr-by-name
重置所有名字和給定模式 pattern 相匹配的主服務(wù)器。重置操作清除主服務(wù)器目前的所有狀態(tài), 包括正在執(zhí)行中的故障轉(zhuǎn)移, 并移除目前已經(jīng)發(fā)現(xiàn)和關(guān)聯(lián)的, 主服務(wù)器的所有從服務(wù)器和 Sentinel 。
SENTINEL reset
當(dāng)主服務(wù)器失效時(shí), 在不詢問(wèn)其他 Sentinel 意見(jiàn)的情況下, 強(qiáng)制開(kāi)始一次自動(dòng)故障遷移,但是它會(huì)給其他sentinel發(fā)送一個(gè)最新的配置,其他sentinel會(huì)根據(jù)這個(gè)配置進(jìn)行更新
SENTINEL failover
1.4 測(cè)試
[root@redis_1 ~ ] redis-cli -p 6379
<127.0.0.1:6379> info replication
role:master
connected_slaves:1
[root@redis_1 ~ ] kill -9 pid號(hào) #只kill掉redis的進(jìn)程就可以
[root@redis_2 ~ ] redis-cli -p 6379
<127.0.0.1:6379>info replication
role:master
connected_slaves:0
可以清晰的看到slave升到了master,證明哨兵沒(méi)有問(wèn)題,再來(lái)啟動(dòng)原主看看
[root@redis_1 ~ ] nohup redis-server /usr/local/redis/bin/redis.conf &> /tmp/redis.log &
[root@redis_2 ~ ] redis-cli -p 6379
<127.0.0.1:6379>info replication
role:slave
[root@redis_1 ~ ] redis-cli -p 6379
<127.0.0.1:6379>info replication
role:master
connected_slaves:1