【RabbitMQ】7、RabbitMQ主备复制是异步还是同步?

转自:https://yq.aliyun.com/articles/73040?spm=5176.100240.searchblog.116.RcXYdl

我们知道RabbitMQ可以配置成Queue做主从复制(按照官方的说法叫配置mirror queue),对master queue的写操作会被复制到其他slave上去(也就是复制到mirror queue上去)。这对rabbitmq的这个特性,有些人会问这样的问题,rabbitmq的主从复制是同步的还是异步的?

为什么有些人会问这个问题那?主要这些人往往是将rabbitmq这个主从复制过程和mysql的主从复制做类比。我们知道mysql主从同步是支持同步、半同步、异步3种模式的。采用哪种模式,决定了mysql的数据可靠性。如果是异步方式主从同步,client发请求给主,当主将数据写入后,从就复制主上的这条的数据,与此同时,主就会告知客户端数据保存成功,但是这时从可能还没有成功的存储这条数据。如果这时主挂掉了,我们进行主从切换就会丢数据。在要求保证数据可靠性的场景下,我们不能采用异步模式,我们需要采用同步模式或者半同步模式,这里我们就不再展开同步模式和半同步模式了。这些人将mysql的分析方式放到了rabbitmq,用同样的方式分析rabbitmq的数据可靠性,所以就提出了这样的问题。

实际上,rabbitmq的主从复制是异步的,但是rabbitmq并不存在mysql这种场景的丢数据(这句话不是说rabbitmq保证不丢数据)。在这里,我们来分析一下RabbitMQ的副本复制的过程。

首先,我们来说一下mysql和rabbitmq的使用接口是不同的,这时很关键的一点。mysql是同步的接口,也就是说client将sql发给server,server处理sql后将结果返回给client,在server返回client结果前,client不能发起下一个sql的请求。对于rabbitmq来说,访问接口是异步的。client(我们这里说的是publisher)向rabbitmq server publish一条消息,在默认的情况下server是不返回成功还是失败的,也就是说client在不到成功还是失败的情况下就可以发起下一个请求。如果client关心server是否成功处理完这条消息,可以开启confirm模式,server会异步的返回ack通知client消息投递成功还是失败。但是client仍然不必等待收到当前消息的ack就可以继续发下一条。

接下来,我们来说rabbitmq的主从复制过程。实际上,RabbitMQ主从之间的数据复制是异步的,但是在rabbitmq中不会出现mysql那种丢数据的情况,这是因为rabbitmq的接口也是异步的,主收到一条消息写入本地存储,然后在发起写入从的请求。当所有从写入成功后,主才会给client返回ack说这次写入成功了。所以可以看出,虽然rabbitmq的主从复制是异步的,但是并且不会出现mysql丢数据的场景。只要客户端收到ack,就说明这条消息已经写入主和从了。

所以需要强调的一点是,同步和异步并非是决定数据可靠性的关键点。客户端收到成功通知时,所有副本是否写入成功才是判断数据可靠的关键点。因为mysql的接口是同步,所以才需要在主从复制同步还是异步上做出选择。rabbitmq的接口本身就是异步的接口,所以rabbitmq的主从复制就自然而然的是异步的方式。

时间: 2024-08-23 01:42:22

【RabbitMQ】7、RabbitMQ主备复制是异步还是同步?的相关文章

mysql+mycat搭建稳定高可用集群,负载均衡,主备复制,读写分离

主要思路 测试环境 实现mysql主备复制 配置A主mysql 配置B备mysql 验证同步配置结果 验证是否同步 关闭B备mysql的同步,验证读写分离 实现读写分离 安装mycat 配置mycat 启动mycat 测试读写分离 验证是否同步 关闭B备mysql的同步,验证读写分离 数据库性能优化普遍采用集群方式,oracle集群软硬件投入昂贵,今天花了一天时间搭建基于mysql的集群环境. 主要思路 简单说,实现mysql主备复制-->利用mycat实现负载均衡. 比较了常用的读写分离方式,

mysql+myca搭建稳定高可用集群,负载均衡,主备复制,读写分离

数据库性能优化普遍采用集群方式,oracle集群软硬件投入昂贵,今天花了一天时间搭建基于mysql的集群环境. 主要思路 简单说,实现mysql主备复制-->利用mycat实现负载均衡. 比较了常用的读写分离方式,推荐mycat,社区活跃,性能稳定. 测试环境 MYSQL版本:Server version: 5.5.53,到官网可以下载WINDWOS安装包. 注意:确保mysql版本为5.5以后,以前版本主备同步配置方式不同. linux实现思路类似,修改my.cnf即可. A主mysql.19

MySQL建立双向主备复制服务器配置方法

1.环境描述 服务器A(主) 192.85.1.175 服务器B(从) 192.85.1.176 Mysql版本:5.1.61 系统版本:System OS:ubuntu 10.10 X86 (系统安装及数据环境搭建,省略) 2. 创建同步用户: 在服务B命令行执行 : grant replication slave on *.* to 'replication'@'%' identified by 'mysqlsync'; flush privileges; grant FILE,SELECT

mysql主备复制搭建(使用mysqld_muti)

这里我使用单台服务器上的两个mysql实例进行搭建,主要用到了mysql自带的mysqld_multi 一.复制原理 开始搭建前有个mysql复制原理的基础知识需要补充: mysql进行主备复制使用到了三个线程: 1.主库上的转存储线程: 会将mysql server提交的事务写入到二进制文件中,这个二进制文件就叫做binlog. 2.备库上的连接线程: 备库启动后,负责和主库通信,读取binlog,同时,将binlog存储进自己的一个叫中继日志的relaylog中. 3.备库上的relaylo

MySQL建立双向主备复制server配置方法

1.环境描写叙述 serverA(主) 192.85.1.175 serverB(从) 192.85.1.176 Mysql版本号:5.1.61 系统版本号:System OS:ubuntu 10.10 X86 (系统安装及数据环境搭建,省略) 2. 创建同步用户: 在服务B命令行运行 : grant replication slave on *.* to 'replication'@'%' identified by 'mysqlsync'; flush privileges; grant F

MYSQL主备复制结构搭建

1 选择两个服务器,分别作为主备数据库 2 登陆到服务器, yum install mysql ; yum install mysql-server; 3 启动服务器 service  mysqld start 4 分别root登陆mysql 执行如下命令,增加复制用户并授权(主备都在192.168.119.*网段,为了方便主备切换,两边都建立) GRANT  REPLICATION SLAVE,REPLICATION CLIENT on *.* to [email protected]'192

Redis主备复制

Redis 支持 Master-Slave(主从)模式,Redis Server 可以设置为另一个 Redis Server 的主机(从机),从机定期从主机拿数据.特殊的,一个从机同样可以设置为一个 Redis Server 的主机,这样一来 Master-Slave 的分布看起来就是一个有向无环图,形成 Redis Server 集群,无论是主机还是从机都是 Redis Server,都可以提供服务. 在配置后,主机Master可负责读写服务,从机Slave只负责读.Redis 提高这种配置方

mysql主备配置方法

主备复制配置 1,主备创建账号 GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO [email protected]’172.16.0.%’ IDENTIFIED BY ‘rep’; 2,配置主库 My.cnf log_bin=mysql-bin server_id=10 innodb_flush_log_at_trx_commit=1 sync_binlog=1 3,配置从库 log_bin=mysql-bin server_id=2 r

请不要用SECONDS_BEHIND_MASTER来衡量MYSQL主备的延迟时间【转】

本文来自:http://www.woqutech.com/?p=1116 MySQL 本身通过 show slave status 提供了 Seconds_Behind_Master ,用于衡量主备之间的复制延迟,但是 今天碰到了一个场景,发现 Seconds_Behind_Master 为 0 , 备库的 show slave status 显示IO/SQL 线程都是正常的 , MySQL 的主库上的变更却长时间无法同步到备库上.如果没有人为干预,直到一个小时以后, MySQL 才会自动重连主