Redis部署及主從集羣架構

Redis部署及主從集羣架構

1)機器信息
Redis主從結構支持一主多從,這裏使用一主一從
主節點 192.168.4.205 master-node
從節點 192.168.4.206 slave-node1

2)安裝redis
兩臺節點機的安裝步驟一樣
(切換到根目錄)
[root@localhost ~]# wget http://download.redis.io/redis-stable.tar.gz
[root@localhost ~]# tar -zvxf redis-stable.tar.gz
[root@localhost ~]# cd redis-stable
[root@master-node redis-stable]# make
[root@master-node redis-stable]# cd src/

然後新建目錄,存放配置文件
[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=11205
EXEC=/usr/local/bin/redis-server
CLIEXEC=/usr/local/bin/redis-cli

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

3)主從複製配置
master-node
[root@localhost ~]# vim /etc/redis/redis.conf
.......
port 11205
.......
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_11205.pid
.......
logfile /var/redis/log/redis_11205.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 192.168.4.205 11205

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

登陸主節點master-node的redis,查看狀態

[root@localhost ~]# redis-cli -h 127.0.0.1 -p 11205
127.0.0.1:11205> info
......
......

Replication

role:master //節點在集羣中的狀態
connected_slaves:2 //slave節點的個數
slave0:ip=192.168.4.206,port=11206,state=online,offset=26325,lag=1
slave0:ip=192.168.4.207,port=11207,state=online,offset=26325,lag=1........

登錄從節點slave-node1的redis,查看狀態
[root@slave-node1 ~]# redis-cli -h 127.0.0.1 -p 11206
127.0.0.1:11206> info
.......
.......
#Replication
role:slave
master_host:192.168.4.205
master_port:11205
master_link_status:up
......

登錄從節點slave-node2的redis,查看狀態
[root@slave-node2 ~]# redis-cli -h 127.0.0.1 -p 11207
127.0.0.1:11207> info
......
#Replication
role:slave
master_host:192.168.4.205
master_port:11205
master_link_status:up
......

4)測試數據同步

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

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

[root@slave-node2 ~]# redis-cli -h 127.0.0.1 -p 11207
127.0.0.1:11207> get name
"wangshibo"

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

[root@slave-node2 ~]# redis-cli -h 127.0.0.1 -p 11207
127.0.0.1:11207> set name liudehua
(error) READONLY You can't write against a read only slave.

5)主從切換

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

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

這時候master-node節點已經故障了,而另一個從節點slave-node2還跟它有主從關係。此時slave-node1已經變成主redis了,所以可以將slave-node2的主從關係中的主節點
配置修改爲slave-node1(即192.168.4.205)

5.2)原來的主redis恢復正常了,要重新切換回去
比如原來的主redis節點master-node現在恢復了
[root@localhost ~]# /etc/init.d/redis start
Starting Redis server...
[root@localhost ~]# redis-cli -h 127.0.0.1 -p 11205
127.0.0.1:11205> info
......
#Replication
role:master //原來的主節點恢復了,發現只有一個從節點save-node2。另一個從節點slave-node1在master-node故障期間臨時變爲主節點
connected_slaves:1
slave0:ip=192.168.4.207,port=11207,state=online,offset=1,lag=0
......

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

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

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

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

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

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

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章