一、redis复制介绍?
(1)、配置很简单,主服务器上不需要任何额外配置,正常启动
slave-serve-stale-data yes|no
|
?当slave和master之间的连接断开或slave正在于master同步时,如果有slave请求,当slave-serve-stale-data配置为yes时,slave可以相应客户端请求;当为no时,slave将要响应错误,默认是yes
|
slave-read-only?yes|no
|
从服务器是否只读。设置为no时,可以接受客户端写命令,事实上从服务器写指令之后并不会同步到主服务器,而从服务器会周期性的同步主服务器的数据,很有可能这个写的数据会丢失。因为redis设置复制时,就没有考虑master-master这种架构。这个命令纯属鸡肋,并没有什么卵用。默认是yes
|
repl-diskless-sync yes|no
|
复制集同步策略:磁盘或者socket
当新slave连接或者老slave重新连接时候不能只接收不同,得做一个全同步。需要一个新的RDB文件dump出来,然后从master传到slave。可以有两种情况:
(1)、基于硬盘(disk-backed):master创建一个新进程dump RDB,然后由父进程(即主进程)增量传给slaves。?
?
(2)、基于socket(diskless):master创建一个新进程直接dump RDB到slave的socket,不经过主进程,不经过硬盘。
?
使用建议:
(1)、基于硬盘的话,RDB文件创建后,一旦创建完毕,可以同时服务更多的
slave。基于socket的话, 新slave来了后,得排队(如果超出了repl-diskless-sync-delay还没来),结束一个再进行下一个。如果一个主多个从,强烈建议使用基于硬盘的方案。
?(2)、当用diskless的时候,master等待一个repl-diskless-sync-delay的秒数,如果没slave来的话,就直接传,后来的得排队等了。否则就可以一起传。
(3)、disk较慢,并且网络较快的时候,可以用diskless。(默认用disk-based)
?
ps:配置高性能的硬盘,使用默认基于硬盘即可,这样节省网络。
默认为no
|
repl-diskless-sync-delay 5
|
设置成0的话,传输开始立马进行下一个。 默认为5。
|
repl-ping-slave-period 10
|
Slave发送ping给master。默认10s
|
repl-timeout 60
|
超时时间,包括从master看slave,从slave看master,要大于上边的repl-ping-slave-period
|
repl-disable-tcp-nodelay no
|
SYNC完毕后,在slave的socket里关闭TCP_NODELAY。
如果是yes,reids发送少量的TCP包给slave,但可能导致最高40ms的数据延迟。
?如果是no,那可能在复制的时候,会消耗 少量带宽。
?默认我们是为了低延迟优化而设置成no,如果主从之间有很多网络跳跃。那设置成yes吧。
|
repl-backlog-size 1mb
|
复制集后台backlog大小,越大,slave可以丢失的时间就越长。
|
repl-backlog-ttl 3600
|
多久释放backlog,当确认master不再需要slave的时候,多久释放。0是永远不释放。
|
slave-priority 100
|
当master不可用,Sentinel会根据slave的优先级选举一个master。最低的优先级的slave,当选master。而配置成0,永远不会被选举。(必须≥0)。默认是100。可以在配置集群时使用。
|
min-slaves-to-write 3
min-slaves-max-lag 10
|
slave小于几个,网络lag大于几秒的时候,master停止接受write请求。默认对slave数目无限制,给0。网络延迟给10s
|
(2)、当主从链路由于某些原因断开时,从服务器可以自动重连。如果主服务器收到多个并发的从服务器的同步请求,只会执行一个后台保存来服务所有从服务器。?
在实际生产中,多数系统使用主从配置即可达到大部分的系统性能要求,如果要求主从自动切换,使用类似keepalived就足以满足需求了。
原文:http://haoran-10.iteye.com/blog/2262393