redis(四)-主从复制

参考资料:
redis 4.x cookbook 中文版;
redis官方文档
注: 本文redis的版本为: 5.0.3

redis学习路径

主从复制:

在没有哨兵的情况下,redis的主从复制,如果主服务器挂掉之后,需要人工将从服务器晋升;

#使用 replicaof ip 端口 配置此redis的主服务器;
#replicaof <masterip> <masterport>

#redis的主从同步是异步进行的,不需要用户操作;
#可以设置当主服务器连接的副本服务器个数低于一定数量时,拒绝写入数据;
#当副本服务器与主服务器丢失连接的时间很短时,副本服务器依然可以从主服务器执行部分重新同步;
#出现断网情况,副本服务器会自动发起重连,以求与主服务器进行同步;

#配置主服务器的密码,如果主服务器配置密码,而副本服务器没有下面的配置,主服务器将拒绝同步;
#masterauth <master-password>

#当副本服务器正在与主服务器进行同步中,或者与主服务器断开时,正好有客户端查询数据:
#配置为yes,将给客户端返回副本服务器存储的数据,
#(这些数据可能是历史数据,如果正在进行第一次同步,也许会是空)
#配置为no,将给查询数据的连接返回错误"SYNC WITH MASTER IN PROGING";
replica-serve-stale-data yes

#配置为yes时,副本服务器只读;在redis2.6之前,副本服务器默认只读;
#如果配置为no,将会出现写在副本服务器上的数据,被主从同步后的数据覆盖;
#配置成只读以后也不能暴露给外网,这里只读只是一个保护层,很容易被攻击;
#可以通过"rename-command"来隐藏危险(涉及修改服务器或者数据)的命令,只留下读命令来提高安全性;
replica-read-only yes

#在redis中有两种同步策略,disk(磁盘)或者socket(直接网络传输)
#目前socket模式仅试验,所以默认是磁盘同步;
#redis的主从同步其实上是rdb的快照文件的传输;
#磁盘(disk)模式,主服务器将会使用子进程来创建一个rdb快照文件到磁盘,当快照文件生成后,
#会通过父进程发送给各个副本(这个动作是增量的,通常只发送上次同步时间之后的数据);
#无盘(socket网络传输)模式,子进程直接与各个副本服务器进行socket连接(可并行),发送数据,
#不生成rdb文件到磁盘;
#在慢磁盘,高速网络的情况下,无盘更有优势,但是目前还在实验中;
#diskless-无盘,所以,设置为no表示磁盘同步;
repl-diskless-sync no

#开启无盘同步时,副本服务器与主服务器建立同步连接的延迟时间,单位为秒;
#这里有一点很重要,主服务器一旦开始本次同步传输后,后面的副本服务器只能等下次同步才能再次同步;
#默认为5秒;设置为0时,将不延迟;
repl-diskless-sync-delay 5

#设置副本服务器给主服务器发送ping的间隔,单位为秒;默认为10;
repl-ping-replica-period 10 

#设置主从同步的超时时间,注意此处的值,必须大于repl-ping-replica-period,
#如果小于的话传输量不大的时候,每次都会检测到超时;
repl-timeout 60

#配置主从同步时,tcp传输是否有延迟;
#选择yes,意味着不允许tcp延迟,但是这样redis主服务器将会以少量的数据包占用少量的带宽传输数据;
#这样tcp虽然不会延迟,但是多批次的发送数据,将会导致数据完整到达副本服务器会出现延时;
#选择no,将会用更大的带宽传输数据,但是数据完整到达副本服务器的时间会更快;
#在大流量或者高频次同步时,选择yes会更好;
#因为大流量时,可能每次同步花费的时间会更多;
#高频次时允许延迟可能会出现问题;
repl-disable-tcp-nodelay no

#当有副本服务器断开后,主服务器就开始累积未同步数据到缓冲区;
#当副本服务器连接到主服务器时,它们使用PSYNC命令来发送旧的主服务器复制ID和它们到目前为止处理的偏移量.
#这样,主设备可以只发送所需的增量部分.但是,如果主缓冲区中没有足够的积压(需要的数据比缓冲区多),
#或者如果复制副本引用的是不再已知的历史记录(复制ID),则会发生完全重新同步:
#在这种情况下,复制副本将从头开始获取数据集的完整副本.
#主机启动后台保存进程以生成RDB文件.同时,它开始缓冲从客户端接收的所有新的写命令.
#后台保存完成后,主服务器将数据库文件传输到副本服务器,副本服务器将其保存在磁盘上后将其加载到内存中.
#然后,主服务器将向副本服务器发送所有缓冲的命令.这是作为命令流完成的,并且与Redis协议本身的格式相同.
#这里设置的就是这个缓冲区的大小,默认就是1MB;
repl-backlog-size 1mb

#下面这个设置是指,从上次所有副本服务器都断开后,主服务器有一段时间没有副本服务器连接,
#将会清除缓冲区积压的数据;
#单位为秒;设置为0时意味着永不释放积压数据的缓冲区;
#值得注意的是,副本服务器因为有可能会被提升为主服务器然后与其他副本服务器进行部分同步,
#所以副本服务器应该设置为0;(这里有个疑问,当副本服务器被提升为主服务器后,这个字段如何处理?)
Repl-backlog-ttl 3600

#副本优先级,当主服务器挂掉之后,redis-Sentinel(哨兵)将会提升优先级数字最低的称为新的主服务器;
#注意,0是特殊优先级,具有此优先级的副本,将永远不会被提升为主服务器;
#此设置必须为整数;默认设置为100;
replica-priority 100

#下面两个设置必须同时满足,否则主服务器将拒绝写入数据;
#只要下面两个设置,有一个设置为0就可以关闭该功能,默认情况下,该功能是关闭的;
#下面的意思是:最少需要3个副本服务器与主服务器之间的ping的最大延迟不能超过10s,才进行写操作;
min-replicas-to-write 3
min-replicas-max-lag 10

#下面这俩有点难搞,我也没明白啥意思,反正是跟哨兵有关的;可能是用来监听副本服务器存活之类的吧;
#有懂得大佬可以说一下...
#replica-announce-ip 5.5.5.5
#replica-announce-port 1234

在redis的每个实例中都会保存自身的信息:

#主服务器信息
127.0.0.1:6379> keys *
1) "key1"
127.0.0.1:6379> info replication
# Replication
#自身角色
role:master
#连接到本主服务器的从服务器数量;
connected_slaves:1
#从服务器的信息:ip,端口,在线状态,偏移量(相对数据库中第一个字节),延迟
slave0:ip=127.0.0.1,port=6380,state=online,offset=140,lag=1
#两个复制id,都是很长的伪随机字符串;
master_replid:5c1942b0633673e5475144131028209f2aca1746
master_replid2:0000000000000000000000000000000000000000
#主服务器的偏移量
master_repl_offset:140
#第二复制id的偏移量;
second_repl_offset:-1
#复制缓冲区信息:是否活跃,缓冲区大小,缓冲区字节相对数据库第一个字节的偏移量,缓冲区长度;
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:140

#副本服务器信息
127.0.0.1:6380> slaveof 127.0.0.1 6379
OK
127.0.0.1:6380> keys *
1) "key1"
127.0.0.1:6380> info replication
# Replication
#自身角色
role:slave
#主服务器信息
master_host:127.0.0.1
master_port:6379
master_link_status:up
#上一次同步时间
master_last_io_seconds_ago:3
#主服务器同步进程数
master_sync_in_progress:0
#副本服务器信息:偏移量,优先级,只读,连接到此服务器的副本服务器;
slave_repl_offset:126
slave_priority:100
slave_read_only:1
connected_slaves:0
#两个复制id,都是很长的伪随机字符串;副本服务器的复制id与主服务器保持一致;
master_replid:5c1942b0633673e5475144131028209f2aca1746
master_replid2:0000000000000000000000000000000000000000
#主服务器的偏移量
master_repl_offset:126
#第二复制id的偏移量;
second_repl_offset:-1
#复制缓冲区信息:是否活跃,缓冲区大小,缓冲区字节相对数据库第一个字节的偏移量,缓冲区长度;
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:126

当主服务器挂掉或断开连接之后,副本服务器可能会提升成主服务器,然后会重新生成自己的两个复制id;
因为在redis系统中,复制id一致,表示是同一个主机的不同角色(master/slave);
如下情况可以解释为什么需要两个复制id:
当主A,从1,从2组成主从复制;主A因网络问题断掉连接,从1升级为主1,同时加入了从3;
这时候主1需要担负起从2的复制责任,也要为从3复制数据;
[从1升级为主1时,会将自己原本的主复制id放到第二复制id,然后生成一个新复制id,作为主复制id]
这时,主1给从3复制数据时使用的是新的主复制id;主1给从2复制数据时使用的是原先的复制id(第二个复制id)
于此同时,主A在另一片网络中还是主服务器;如果从1晋升为主1后不改变主复制id,就会违背规则:redis中复制id相同,偏移量相同,它们就是同一个数据库.(偏移量一致是很可能发生的)

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