您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

Redis主备同步

2024/6/20 3:03:44发布44次查看
slave状态变迁 #define redis_repl_none 0 /* no active replication */#define redis_repl_connect 1 /* must connect to master */#define redis_repl_connecting 2 /* connecting to master */#define redis_repl_receive_pong 3 /* wait for ping reply
slave状态变迁#define redis_repl_none 0 /* no active replication */#define redis_repl_connect 1 /* must connect to master */#define redis_repl_connecting 2 /* connecting to master */#define redis_repl_receive_pong 3 /* wait for ping reply */#define redis_repl_transfer 4 /* receiving .rdb from master */#define redis_repl_connected 5 /* connected to master */
server.repl_state储存slave当前的复制状态
* redis启动时初始化为redis_repl_none
* 当接受到slaveof命令后,该redis转换为slave,同时状态变为redis_repl_connect
周期性执行的replicationcron会检查slave当前的状态,来执行不同的操作
如果slave处于redis_repl_connect,调用connectwithmaster建立到master的连接,状态转换为redis_repl_connecting连接建立后,向master发送ping,状态转换为redis_repl_receive_pong接受到pong后,如果master配置了需要认证,则slave发送auth消息,auth通过后;slave发送replconf listening-port消息到master告知自身监听的端口;最后向master发送sync命令来请求同步rdb文件,同时状态转换为redis_repl_transfer。当master向slave发送rdb后,slave就开始读取rdb文件(master发送rdb前会先告知rdb文件的总长度),slave接受完rdb文件后,会emptydb清空数据库,然后调用rdbload加载从master接受到的rdb文件,加载完成后状态变为redis_repl_connected,接下来slave会继续接受从master同步过来的新操作,以保证主备的一致性。master状态变迁#define redis_repl_wait_bgsave_start 6 /* we need to produce a new rdb file. */#define redis_repl_wait_bgsave_end 7 /* waiting rdb file creation to finish. */#define redis_repl_send_bulk 8 /* sending rdb file to slave. */#define redis_repl_online 9 /* rdb file transmitted, sending just updates. */
server.slaves里维护所有的slave列表,slave.replstate里记录着每个slave当前的同步状态(从master的视角看)。
当master接受到slave发来的sync/psync命令时,将该slave的状态转换为redis_repl_wait_bgsave_startmaster为该slave后台启动rdbsavebackground,并将该slave的状态转换为redis_repl_wait_bgsave_end (如果master己收到sync时,master正在为某个slave转储rdb文件,则新的slave可以直接进入redis_repl_wait_bgsave_end状态)当rdbsavebackground完成后,slave的状态转换为redis_repl_send_bulk,master开始将rdb文件发送给slave,发送前会先发送rdb文件的长度信息。当rdb文件发送完成后,slave的状态转换为redis_repl_online。master在为slave启动rdbsavebackground后,master上的更新会累积到slave的连接缓冲区,等到slave接受完rdb文件之后,将缓冲区里累积的更新同步到slave上
主备同步时序管理员向server发送slaveof master-ip master-port,将该server变为master的slaveslave建立到master的网络连接slave向master发送ping检测网络状态,master回复+pongslave向master发送auth进行认证(可选),master恢复+okslave向master发送replconf listening-port,master恢复+okslave向master发送sync/psync,master开始后台转储rdb文件master转储rdb完成后,向slave发送rdb文件,slave接受rdb文件并清空数据库,load从master接受到的rdb文件master将rdb转储及传输期间累积的更新操作同步到slavemaster与slave数据到达一致,接下来master接受到的所有更新操作都会同步到slave主备同步状态维护master周期性的ping slave(默认10s),当ping不通slave超过60s(默认)后,就会认为slave挂掉了,便会断开与该slave的连接;同理,slave如果超过一定时间没有接受到master的ping,会认为master挂掉了,便会断开与master的连接。
当master、slave连接断开后,slave需要重新向master请求同步rdb文件;2.8版本里redis一定程度支持增量同步,master将同步数据同步给slave时,会同时存储到一个环形缓冲区(默认1m大小),这个缓冲区永远存储最新的同步数据;另外master、slave都会记录当前同步的offset。
当slave与master断开后,slave会先尝试进行psync增量同步,如果连接断开期间,master没有重启过,并且slave的offset在master的环形缓冲区内,则可直接进行增量同步,比如:
假设环形缓冲区的长度为1000, master的同步offset为10000,此时缓冲区里记录的是9001-10000的同步数据,slave同步到9500时,与master断开了连接;slave重新建立与master连接后,会带上offset 9500,请求增量同步,master发现该slave的offset在9001-10000之间,可以进行增量同步,将9501-10000的同步数据发送给slave,以达到主备一致的状态。
the post redis主备同步 appeared first on yun notes.
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product