1. 程式人生 > >redis的主從配置與故障切換恢復操作

redis的主從配置與故障切換恢復操作

key 兩臺 5.1 配置 slave 文件 dump.rdb 停止 man

1)機器信息
Redis主從結構支持一主多從,這裏我使用一主兩從(一主一從也行,配置一樣)
主節點 172.16.0.237 master-node
從節點 172.16.0.131 slave-node1

關閉兩個節點機的iptables防火墻和selinux

2)安裝redis
三臺節點機的安裝步驟一樣
[root@master-node ~]# wget http://download.redis.io/redis-stable.tar.gz
[root@master-node ~]# tar -zvxf redis-stable.tar.gz
[root@master-node ~]# cd redis-stable

[root@master-node redis-stable]# make
[root@master-node redis-stable]# cd src/
[root@master-node src]# cp redis-server redis-cli redis-check-aof redis-check-rdb redis-sentinel redis-trib.rb /usr/local/bin/

然後新建目錄,存放配置文件
[root@master-node src]# mkdir /etc/redis
[root@master-node src]# mkdir /var/redis
[root@master-node src]# mkdir /var/redis/log

[root@master-node src]# mkdir /var/redis/run
[root@master-node src]# mkdir /var/redis/redis

在redis解壓根目錄中找到配置文件模板
[root@master-node src]# cd ../
[root@master-node redis-stable]# cp redis.conf /etc/redis/redis.conf

設置啟動腳本
[root@master-node redis-stable]# cp utils/redis_init_script /etc/init.d/redis
[root@master-node redis-stable]# chmod 755 /etc/init.d/redis

修改腳本pid及conf路徑為實際路徑
[root@master-node redis-stable]# vim /etc/init.d/redis
......
REDISPORT=6379
EXEC=/usr/local/bin/redis-server
CLIEXEC=/usr/local/bin/redis-cli

PIDFILE=/var/redis/run/redis_6379.pid
CONF="/etc/redis/redis.conf"
.......

3)主從復制配置
master-node
[root@master-node ~]# vim /etc/redis/redis.conf
.......
port 6379
.......
daemonize yes //這個修改為yes
.......
bind 0.0.0.0 //綁定的主機地址。說明只能通過這個ip地址連接本機的redis。最好綁定0.0.0.0;註意這個不能配置成127.0.0.1,否則復制會失敗!用0.0.0.0或者本機ip地址都可以
.......
pidfile /var/redis/run/redis_6379.pid
.......
logfile /var/redis/log/redis_6379.log
.......
dir /var/redis/redis #redis數據目錄
.......
appendonly yes #啟用AOF持久化方式
appendfilename "appendonly.aof" #AOF文件的名稱,默認為appendonly.aof
appendfsync everysec #每秒鐘強制寫入磁盤一次,在性能和持久化方面做了很好的折中,是受推薦的方式。
.....
save 900 1 #啟用RDB快照功能,默認就是啟用的
save 300 10
save 60 10000 #即在多少秒的時間內,有多少key被改變的數據添加到.rdb文件裏
.......
dbfilename dump.rdb #快照文件名稱
......

slave-node1和slave-node2兩個從節點相比於master-node主節點的redis.conf配置,只是多了下面一行配置,其它都一樣:
slaveof 172.16.0.237 6379

啟動三個節點的redis(啟動命令一樣)
[root@master-node ~]# /etc/init.d/redis start
Starting Redis server...
[root@master-node ~]# lsof -i:6379
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
redis-ser 10475 root 4u IPv4 88640 0t0 TCP localhost:6379 (LISTEN)

登陸主節點master-node的redis,查看狀態
[root@master-node ~]# redis-cli -h 127.0.0.1 -p 6379 //使用172.16.0.237也可以登錄,或者直接使用redis-cli也可以登錄
127.0.0.1:6379> info
......
......
#Replication
role:master //節點在集群中的狀態
connected_slaves:1 //slave節點的個數
slave0:ip=172.16.0.131,port=6379,state=online,offset=1,lag=1
........
技術分享圖片

登錄從節點slave-node1的redis,查看狀態
[root@slave-node1 ~]# redis-cli -h 127.0.0.1 -p 6379
127.0.0.1:6379> info
.......
.......
#Replication
role:slave
master_host:172.16.0.237
master_port:6379
master_link_status:up
......
技術分享圖片

4)測試數據同步

主節點master-node上寫入新數據
[root@master-node ~]# redis-cli -h 127.0.0.1 -p 6379
127.0.0.1:6379> set name lichao
OK
127.0.0.1:6379> get name
"lichao"

然後到兩臺從節點上查看是否同步了上面寫入的數據
[root@slave-node1 ~]# redis-cli -h 127.0.0.1 -p 6379
127.0.0.1:6379> get name
"lichao"

redis主從復制默認是讀寫分離的,即:
主節點上可以讀寫操作;從節點上只能進行讀操作,不能寫數據
[root@slave-node1 ~]# redis-cli -h 127.0.0.1 -p 6379
127.0.0.1:6379> set name chenzixiu
(error) READONLY You can‘t write against a read only slave.

5)主從切換

5.1)停止主節點master-node的redis
[root@master-node ~]# redis-cli -h 127.0.0.1 -p 6379 shutdown
[root@master-node ~]# redis-cli -h 127.0.0.1 -p 6379
Could not connect to Redis at 127.0.0.1:6379: Connection refused
Could not connect to Redis at 127.0.0.1:6379: Connection refused

將從節點slave-node1的redis設成主redis
[root@slave-node1 ~]# redis-cli -h 127.0.0.1 -p 6379 slaveof NO ONE //這條命了只是臨時將該節點設置為主節點;當redis重啟後,就會失效;可以登錄redis,通過info信息查看!
OK
[root@slave-node1 ~]# redis-cli -h 127.0.0.1 -p 6379 //變為主redis後,slave-node1就可以進行寫入操作了
127.0.0.1:6379> set name chenzixiu
OK
127.0.0.1:6379> info
......
#Replication
role:master //可知已經變成master主節點了
connected_slaves:0
master_repl_offset:0

這時候master-node節點已經故障了,此時slave-node1已經變成主redis了
配置修改為slave-node1

5.2)原來的主redis恢復正常了,要重新切換回去
比如原來的主redis節點master-node現在恢復了
[root@master-node ~]# /etc/init.d/redis start
Starting Redis server...
[root@master-node ~]# redis-cli -h 127.0.0.1 -p 6379
127.0.0.1:6379> info
......
#Replication
role:master 從節點slave-node1在master-node故障期間臨時變為主節點
connected_slaves:0
......

那麽現在要重新將主節點切換回去。步驟如下:

a)登錄臨時切換的主節點slave-node1
[root@slave-node1 ~]# redis-cli -h 127.0.0.1 -p 6379
127.0.0.1:6379> set name chenchen
OK
127.0.0.1:6379> get name
"chenchen"
127.0.0.1:6379> save //將數據保存
OK

b)將現在的主redis(即slave-node1節點,臨時設置的主節點)根目錄下app文件和dump.rdb文件拷貝覆蓋到原來主redis的根目錄(覆蓋前將原來主redis下的持久化文件備份下)
[root@slave-node1 ~]# rsync -e "ssh -p22" -avpgolr /var/redis/redis/dump.rdb 172.16.0.237:/var/redis/redis/
[root@slave-node1 ~]# rsync -e "ssh -p22" -avpgolr /var/redis/redis/appendonly.aof 172.16.0.237:/var/redis/redis/

c)重啟原來的主redis(即master-node節點)
[root@master-node ~]# /etc/init.d/redis stop
[root@master-node ~]# /etc/init.d/redis start

d)在現在的主redis(即slave-node1)中切換(或者直接重啟該節點的redis,因為redis.conf文件中已經配置了;如果不想重啟redis,就使用下面的命令)
[root@slave-node1 ~]# redis-cli -h 127.0.0.1 -p 6379 slaveof 172.16.0.237 6379
OK

e)登錄原來的主redis(也就是master-node)查看
[root@master-node ~]# redis-cli -h 127.0.0.1 -p 6379
127.0.0.1:6379> info
.......
#Replication
role:master
connected_slaves:1
slave0:ip=172.16.0.131,port=6379,state=online,offset=1,lag=0
master_repl_offset:1
......

註意事項
如果使用主從復制,那麽要確保你的master激活了持久化,或者確保它不會在當掉後自動重啟,原因:
a)slave是master的完整備份,因此如果master通過一個空數據集重啟,slave也會被清掉。
b)在配置redis復制功能的時候,如果主數據庫設置了密碼,需要在從數據的配置文件中通過masterauth參數設置主數據庫的密碼,這樣從數據庫在連接
主數據庫時就會自動使用auth命令認證了。相當於做了一個免密碼登錄。

redis的主從配置與故障切換恢復操作