搜索

Redis主备同步

Jun 07, 2016 pm 04:41 PM
redis变迁同步状态

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状态变迁

<code>#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 */
</code>

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状态变迁

<code>#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. */
</code>

server.slaves里维护所有的slave列表,slave.replstate里记录着每个slave当前的同步状态(从master的视角看)。

  • 当master接受到slave发来的sync/psync命令时,将该slave的状态转换为REDIS_REPL_WAIT_BGSAVE_START
  • master为该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上

主备同步时序

  1. 管理员向server发送slaveof master-ip master-port,将该server变为master的slave
  2. slave建立到master的网络连接
  3. slave向master发送PING检测网络状态,master回复+PONG
  4. slave向master发送AUTH进行认证(可选),master恢复+OK
  5. slave向master发送REPLCONF listening-port,master恢复+OK
  6. slave向master发送sync/psync,master开始后台转储rdb文件
  7. master转储rdb完成后,向slave发送rdb文件,slave接受rdb文件并清空数据库,load从master接受到的rdb文件
  8. master将rdb转储及传输期间累积的更新操作同步到slave
  9. master与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.

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
如何向新的MySQL用户授予权限如何向新的MySQL用户授予权限May 09, 2025 am 12:16 AM

TograntpermissionstonewMySQLusers,followthesesteps:1)AccessMySQLasauserwithsufficientprivileges,2)CreateanewuserwiththeCREATEUSERcommand,3)UsetheGRANTcommandtospecifypermissionslikeSELECT,INSERT,UPDATE,orALLPRIVILEGESonspecificdatabasesortables,and4)

如何在MySQL中添加用户:逐步指南如何在MySQL中添加用户:逐步指南May 09, 2025 am 12:14 AM

toadduserInmysqleffectection andsecrely,theTheSepsps:1)USEtheCreateuserStattoDaneWuser,指定thehostandastrongpassword.2)GrantNectalRevileSaryPrivilegesSustate,usiveleanttatement,AdheringTotheTeprinciplelastPrevilegege.3)

mysql:添加具有复杂权限的新用户mysql:添加具有复杂权限的新用户May 09, 2025 am 12:09 AM

toaddanewuserwithcomplexpermissionsinmysql,loldtheSesteps:1)创建eTheEserWithCreateuser'newuser'newuser'@''localhost'Indedify'pa ssword';。2)GrantreadAccesstoalltablesin'mydatabase'withGrantSelectOnMyDatabase.to'newuser'@'localhost';。3)GrantWriteAccessto'

mysql:字符串数据类型和coltrationsmysql:字符串数据类型和coltrationsMay 09, 2025 am 12:08 AM

MySQL中的字符串数据类型包括CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT,排序规则(Collations)决定了字符串的比较和排序方式。1.CHAR适合固定长度字符串,VARCHAR适合可变长度字符串。2.BINARY和VARBINARY用于二进制数据,BLOB和TEXT用于大对象数据。3.排序规则如utf8mb4_unicode_ci忽略大小写,适合用户名;utf8mb4_bin区分大小写,适合需要精确比较的字段。

MySQL:我应该在Varchars上使用什么长度?MySQL:我应该在Varchars上使用什么长度?May 09, 2025 am 12:06 AM

最佳的MySQLVARCHAR列长度选择应基于数据分析、考虑未来增长、评估性能影响及字符集需求。1)分析数据以确定典型长度;2)预留未来扩展空间;3)注意大长度对性能的影响;4)考虑字符集对存储的影响。通过这些步骤,可以优化数据库的效率和扩展性。

mysql blob:有什么限制吗?mysql blob:有什么限制吗?May 08, 2025 am 12:22 AM

mysqlblobshavelimits:tinyblob(255bytes),blob(65,535 bytes),中间布洛布(16,777,215个比例),andlongblob(4,294,967,967,295 bytes).tousebl观察性:1)考虑performance impactsandSandStorelargeblobsextern; 2)管理backbackupsandreplication carecration; 3)usepathsinst

MySQL:自动化用户创建的最佳工具是什么?MySQL:自动化用户创建的最佳工具是什么?May 08, 2025 am 12:22 AM

自动化在MySQL中创建用户的最佳工具和技术包括:1.MySQLWorkbench,适用于小型到中型环境,易于使用但资源消耗大;2.Ansible,适用于多服务器环境,简单但学习曲线陡峭;3.自定义Python脚本,灵活但需确保脚本安全性;4.Puppet和Chef,适用于大规模环境,复杂但可扩展。选择时需考虑规模、学习曲线和集成需求。

mysql:我可以在斑点内搜索吗?mysql:我可以在斑点内搜索吗?May 08, 2025 am 12:20 AM

是的,YouCansearchInIdeAblobInMysqlusingsPecificteChniques.1)转换theblobtoautf-8StringWithConvertFunctionWithConvertFunctionandSearchusiseLike.2)forCompresseBlyblobs,useuncompresseblobs,useuncompressbeforeconversion.3)acpperformance impperformance imperformance imptactsanddataEccoding.4)

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

安全考试浏览器

安全考试浏览器

Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

螳螂BT

螳螂BT

Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )专业的PHP集成开发工具