redis虽然有着卓越的性能,但咱们仍然能够经过master/slave这种简单架构,进行读写分离,进一步挖掘redis的性能,提升系统的可用性。
redis怎么进行主从复制呢?redis复制主要是经过master server持久化的rdb文件实现的。master server 先dump出内存快照文件,而后将rdb文件传给slave server,slave server 根据rdb文件重建内存表。redis复制过程以下:
一、slave server启动链接到master server以后,salve server主动发送SYNC命令给master server
二、master server接受SYNC命令以后,判断,是否有正在进行内存快照的子进程,若是有,则等待其结束,不然,fork一个子进程,子进程把内存数据保存为文件,并发送给slave server
三、master server子进程进程作数据快照时,父进程能够继续接收client端请求写数据,此时,父进程把新写入的数据放到待发送缓存队列中
四、slave server 接收内存快照文件以后,清空内存数据,根据接收的快照文件,重建内存表数据结构
五、master server把快照文件发送完毕以后,发送缓存队列中保存的子进程快照期间改变的数据给slave server,slave server作相同处理,保存数据一致性
六、master server 后续接收的数据,都会经过步骤1创建的链接,把数据发送到slave server
须要注意:slave server若是由于网络或其余缘由断与master server的链接,当slave server从新链接时,须要从新获取master server的内存快照文件,slave server的数据会自动所有清空,而后再从新创建内存表,这样会让slave server 启动恢复服务比较慢,同时也给master server带来较大压力,能够看出redis的复制没有增量复制的概念,这是redis主从复制的一个主要弊端,在实际环境中,尽可能规避中途增长从库。
经过上面的介绍,咱们对redis的主从复制有了个大概了解,下面讲讲具体怎么配置master/slave。因为条件限制,这里用一台机器,启动两个进程来进行主从复制。
master server 配置文件master.conf, 主要配置以下:
daemonize yes
pidfile /var/run/redis_6379.pid
port 6379
#save 900 1
#save 300 10
#save 60 10000
dbfilename dump.rdb
dir /var/lib/redis/6379
slave server 配置文件slave.conf,主要配置以下:
daemonize yes
pidfile /var/run/redis_6379.pid
port 6380
save 900 1
save 300 10
save 60 10000
dbfilename dump.rdb
dir /var/lib/redis/6380
slaveof 127.0.0.1 6379
slave.conf中,主要经过slaveof指定其master的ip和端口。启动master和slave:
/usr/local/bin/redis-server /etc/redis/master.conf
/usr/local/bin/redis-server /etc/redis/slave.conf
链接master server,写入数据:
[root@xsf001 ~]# redis-cli -p 6379
redis 127.0.0.1:6379> set user.1.name zhangsan
OK
链接 slave server,读数据:
[root@xsf001 ~]# redis-cli -p 6380
redis 127.0.0.1:6380> get user.1.name
"zhangsan"
从测试结果看,数据确实自动复制了。经过复制功能,咱们能够在master上只写数据,在slave上读数据,关闭master的持久化(或aof)功能(在salve上开启),从而分担master服务器读压力,提升master服务器性能,同时,master挂了,能够快速地用slave server来替换master server,提升系统的可用性。
在实际环境中,咱们能够根据redis复制特色,定制适合咱们本身的复制架构。好比,采用master server ->slave server ->slave server ->slave server这种一拖一【或一拖一再拖多】的方式,和常规的一拖多方式相比,这种方式更能减小master server在复制数据时的压力。固然,因为redis复制的自然缺陷,咱们也能够采用主动复制的方式【经过redis代理层,client在写master时,写多个master】来改造优化redis自带的复制策略,不过,主动复制,怎么保持数据的一致性也是个不小的挑战。web