特征说明:
1.一个master可以同步多个slave,实现主从复制.
2.一个slave同时也可以接收其它slave的链接和同步请求,以缓解Master同步的压力.
3.Master server是以非阻塞的方式为slave提供服务,所以其在与slave同步时,也可以接受正常的查询和修改的指令.
4.slave server同样也是以非阻塞方式完成数据同步,在同步期间可以继续接受客户端的查询请求.
5.Master可以将数据保存操作交给slave完成,从而避免了在Master中要有独立的进程来完成操作.
下面主要讲述单IP多节点实现主从复制(条件有限)
1.首先需要两个redis实例在一台机器上运行,一个是Master,一个是slave.
1.1安装时自带的redis.conf(也可以改为端口名命名6379.conf)作为master服务.
1.2 copy一份redis.conf配置文件可以改名为redis_slave.conf(也可以改为端口名命名6380.conf)作为slave服务.
2.更改slave服务的配置文件redis_slave.conf
2.1 将port的值改为6380
2.2 添加slaveof {Master ip} {Master port},此命令可以将当前服务转变为从属服务,如果当前服务已经是某个主服务的从属服务,那么执行此命令将使当前服务停止对旧主服务的同步并丢弃旧数据集,转而开始对新主服务进行同步,另外,对一个从属服务执行slaveof no one命令将使得这个从属服务关闭复制功能并转变为主服务,原来同步的数据集不会丢失,所以利用[slaveof no one 不会丢弃同步所得数据集]这个特性,可以在主服务器失败的时候,将从属服务器作为新的主服务器,从而实现无间断运行.
2.3 修改数据库文件名称dbfilename,避免和redis.conf中的一致,以免主从数据库文件冲突或者覆盖,如果不改文件名称可以更改存放数据库文件的路径dir配置.
2.4 修改slave-read-only为yes,默认也是yes为从服务只进行读,不建议改为no,因为复制是单向的,只能主节点到从节点,而对于从节点的数据更改主节点是无法感知的,所以会造成主从数据不一致的情况.
2.5 根据实际情况修改repl-disable-tcp-nodelay,为no则表示启用TCP_NODELAY,那么主节点产生的命令数据无论大小都会及时的发送给从节点,主从之间延迟会很小,但是增加了网络宽带消耗.为yes则禁用TCP_NODELAY,那么主节点会合并较小的tcp数据包从而减少传输次数来减少网络宽带消耗,这样会造成一定的时间间隔,间隔时间取决于系统内核,linux一般在40毫秒.所以要求低延迟你就关闭,高灾备你就开启.
2.6 根据实际情况修改repl-ping-slave-period(默认10s)和repl-timeout(默认60s),此为主从复制时保持的一种心跳机制,从节点会每10秒发送一个ping命令给主节点,来判断存活性和连接状态,从节点在主线程中每隔1秒发送replconf ack {offset}自动上报自己当前复制偏移量,而从主节点就会通过统计信息中的lag信息来查看与从节点最后一次通信延迟的秒数,如果超过了repl-timeout就认为从节点下线并且断开复制连接,所以repl-timeout的值要比repl-ping-slave-period大.
2.7根据实际情况修改repl-backlog-size和repl-backlog-ttl,repl-backlog-size为Master的同步队列长度,就是一个复制积压缓冲区,只有在至少一个slave时才会分配,主从节点断开后,Master会把数据写到复制积压缓冲区,slave再次连上后会从缓冲区中同步数据.ttl是主从断开后缓冲区有效期时间,默认1小时,如果设为0则永远不会释放积压缓冲区.
2.8 根据实际情况修改slave-priority,此配置在集群时,主节点挂了后从节点选举为主的优先级,值最小则当选为新的Master,如果设为0则弃权.
2.9 根据时间情况修改slave-serve-stale-data,当主从断开或者正在进行同步时,如果对slave发送客户端情况,设置为yes则slave依然正常提供服务,设置为no则除正常应答"info"和"slaveof"命令外会返回错误提示消息.
2.10 根据实际情况修改repl-diskless-sync和repl-diskless-sync-delay,是否采用无盘复制方式,no为不,yes为是.repl-diskless-sync-delay的值为等待slave多少秒,如果没有新的slave连接则直接一起传,否则后来的需要到队列中等待.
2.11根据实际情况修改Masterauth,如果Master配置了requirepass安全密码认证,那么slave此处需要填写一致,否则可不填写.
3.进入终端,使用命令开启Master和slave实例
$redis-server dir/redis.conf --启动Master实例
$redis-server dir/redis_slave.conf --启动slave实例
4.开启对应的客户端进行验证(Master进行写,slave进行读)
$redis-cli -p 6379 --进入Master客户端并进行键值对的set操作,设值成功.
$redis-cli -p 6380 --进入slave客户端并进行get操作,获取成功.
5. 复制流程大致如下:
A.从节点执行slaveof命令后会保存主节点的地址信息.
B.从节点通过每秒运行的定时任务维护着复制相关逻辑,会建立一个socket用于与主节点链接,如果与主节点无法连接则从节点会无限期的重试直到成功或者被slaveof no one命令取消.
C.从节点给主节点发送ping命令检测连接是否可用.
D.主节点设置了requirepass参数下需要进行密码验证,验证失败则从节点重新发送复制请求.
E. 从节点发送psync命令开始数据同步,无论是全量复制还是部分复制都依据如下几点:
E.1 主从节点建立复制后,从节点默认每10秒发送一次ping命令给主节点来检测连接状态,时间间隔为从节点repl-ping-slave-period参数配置.
E.2 主节点在有从节点的情况下会创建一个复制积压缓冲区,有写命令时不光发送给从节点还保存到此队列中,在主从断开重连后的复制中使用.
E.3 主节点保存已处理命令字节长度的累加记录和从节点通过replconf ack {offset} 命令上报的复制偏移量,从节点会保存自身当期累加复制偏移量,主从节点都将这些信息保存在统计信息(info replcation)中.
E.4 从节点发送psync命令,并附带主节点复制时的唯一标识ID和复制偏移量,第一次的复制偏移量默认为-1,并根据主节点的响应内容来判断是进行全量复制还是部分复制.
E.5 主节点创建子进程保存RDB文件到本地,并发送给从节点,从节点接收RDB文件并保存使用.如果主节点配置了无盘复制模式(repl-diskless-sync)则不保存到本地而是直接发送给从节点.
E.6 在从节点接收RDB文件开始到结束期间,主节点中新的写命令会存入复制积压缓冲区,待从节点接收完成再次发送.如果复制积压缓冲区溢出则会导致主从断开,复制失败.
E.7 从节点接收完RDB文件后会清空自身旧的数据并加载RDB文件.
E.8 从节点加载完RDB文件后,如果从节点开启来AOF持久话功能,从节点会立即进行重写(bgrewriteaof)操作.
注意事项:
1.主从节点复制统计信息中延时lag的值或者主从网络连接中断的时间超过配置的repl-timeout,都会造成主从节点断开,复制失败.
2.slave客户端复制积压缓冲区client-output-buffer-limit的大小一定要调整合适