一:原理
主要是通过master server持久化的rdb文件实现的。master server 先dump出内存快照文件,然后将rdb文件传给slave server,slave server 根据rdb文件重建内存表。
redis复制过程如下:
1)slave server启动连接到master server之后,salve server主动发送SYNC命令给master server
2)master server接受SYNC命令之后,判断,是否有正在进行内存快照的子进程,如果有,则等待其结束,否则,fork一个子进程,子进程把内存数据保存为文件,并发送给slave server
3)master server子进程进程做数据快照时,父进程可以继续接收client端请求写数据,此时,父进程把新写入的数据放到待发送缓存队列中
4)slave server 接收内存快照文件之后,清空内存数据,根据接收的快照文件,重建内存表数据结构
5)master server把快照文件发送完毕之后,发送缓存队列中保存的子进程快照期间改变的数据给slave server,slave server做相同处理,保存数据一致性
6)master server 后续接收的数据,都会通过步骤1建立的连接,把数据发送到slave server
注意:slave server如果因为网络或其他原因断与master server的连接,当slave server重新连接时,需要重新获取master server的内存快照文件,slave server的数据会自动全部清空,然后再重新建立内存表,这样会让slave server 启动恢复服务比较慢,同时也给master server带来较大压力,可以看出redis的复制没有增量复制的概念,这是redis主从复制的一个主要弊端,在实际环境中,尽量规避中途增加从库。redis2.8之前不支持增量,到2.8之后就支持增量了!
二:说明
1、准备两台服务器
master:192.168.0.128
slave:192.168.0.129
2、关闭防火墙
iptables -F
# getenforce
Disabled
三、安装配置
1、分别都安装redis
参考我之前写的文章:Redis数据库的安装与配置
<a href="http://msiyuetian.blog.51cto.com/8637744/1717983" target="_blank">http://msiyuetian.blog.51cto.com/8637744/1717983</a>
2、master配置文件不用动,slave配置文件上加一行
slaveof 192.168.0.128 6379 //主IP
masterauth 123456 //如果主上设置了密码,若密码为123456,则要加这行
3、分别启动master和slave上的redis
四、验证主从
在从上查看日志
[root@slave ~]# tail /usr/local/redis/var/redis.log
[6117] 03 Dec 11:52:12.034 * Full resync from master: 37031d932827c403dfd2be6df445901ae3b67a65:1
[6117] 03 Dec 11:52:12.385 * MASTER <-> SLAVE sync: receiving 18 bytes from master
[6117] 03 Dec 11:52:12.385 * MASTER <-> SLAVE sync: Flushing old data
[6117] 03 Dec 11:52:12.385 * MASTER <-> SLAVE sync: Loading DB in memory
[6117] 03 Dec 11:52:12.385 * MASTER <-> SLAVE sync: Finished with success
[6117] 03 Dec 11:52:17.108 - 1 clients connected (0 slaves), 276592 bytes in use
[6117] 03 Dec 11:52:22.169 - 1 clients connected (0 slaves), 276592 bytes in use
[6117] 03 Dec 11:52:27.219 - 1 clients connected (0 slaves), 276592 bytes in use
[6117] 03 Dec 11:52:32.308 - 1 clients connected (0 slaves), 276592 bytes in use
[6117] 03 Dec 11:52:37.390 - 1 clients connected (0 slaves), 276592 bytes in use
若出现上面类似的信息,说明主从配置成功了。下面要进行示例验证
示例验证:
在主上创建数据
[root@master ~]# redis-cli -a 123456
127.0.0.1:6379> set key1 123
OK
127.0.0.1:6379> set key2 456
127.0.0.1:6379> sadd set1 aaa
(integer) 1
127.0.0.1:6379> sadd set1 bbb
127.0.0.1:6379> sadd set1 ccc
127.0.0.1:6379> keys *
1) "set1"
2) "key2"
3) "key1"
在从上查看
[root@slave ~]# redis-cli
1) "key2"
2) "set1"
127.0.0.1:6379> get key1
"123"
127.0.0.1:6379> get key2
"456"
127.0.0.1:6379> smembers set1
1) "ccc"
2) "aaa"
3) "bbb"
由上可知,实现了主从同步。
五、主从其他相关配置
1)slave-read-only yes //让从只读
2)repl-ping-slave-period 10 //设置slave向master发起ping的频率,每10s发起一次
3)repl-timeout 60 //设置slave ping不通master多少秒后就超时
4)repl-disable-tcp-nodelay no //是否开启tcp_nodelay,开启后将会使用更少的带宽,但会有延迟,所以建议关闭
5)repl-backlog-size 1mb //同步队列的长度,backuplog是master的一个缓冲区,主从断开后,master会先把数据写入到缓冲区,slave再次连接会从缓冲区中同步数据
6)repl-backlog-ttl 3600 //主从断开后,缓冲区的有效期,默认1小时
7)slave-priority 100 //多个slave是可以设置优先级的,数值越小优先级越高,应用于集群中,支持slave切换为master,优先级最高的才会切换
8)min-slaves-to-write 3 //和下面的一起使用,它的意思是master发现有超过3个slave的延迟高于10s,那么master就会暂停写操作。这两个数值任何一个为0,则关闭该功能,默认第一个数值是0
9)min-slaves-max-lag 10
本文转自 M四月天 51CTO博客,原文链接:http://blog.51cto.com/msiyuetian/1719176,如需转载请自行联系原作者