mysql主从一致性保证
MySQL实战问题03 mysql如何保证主备一致
MySQL主备的基本原理主备流程切换
在状态1中,客户端的读写都直接访问节点A,而节点B是A的备库,只是将A的更新都同步过来,到本地执行。这样可以保持节点B和A的数据是相同的
当需要切换的时候,就切成状态2。这时候客户端读写访问的都是节点B,而节点A是B的备库。
M-S模式中,为什么建议把备库设为readonly?有时候一些运营类的查询语句会被放到备库上去查,设置为只读可以防止误操作;防止切换逻辑有bug,比如切换过程中出现双写,造成主备不一致可以用readonly状态,来判断节点的角色。把备库设置成只读了,还怎么跟主库保持同步更新呢?
因为readonly设置对超级(super)权限用户是无效的,而用于同步更新的线程,就拥有超级权限。
节点A到B这条线的内部流程是什么样的
下图画出的就是一个update语句在节点A执行,然后同步到节点B的完整流程图
备库B跟主库A之间维持了一个长连接。主库A内部有一个线程,专门用于服务备库B的这个长连接
一个事务日志同步的完整过程是这样的:在备库B上通过changemaster命令,设置主库A的IP、端口、用户名、密码,以及要从哪个位置开始请求binlog,这个位置包含文件名和日志偏移量。在备库B上执行startslave命令,这时候备库会启动两个线程,就是图中的io_thread和sql_thread。其中io_thread负责与主库建立连接。主库A校验完用户名、密码后,开始按照备库B传过来的位置,从本地读取binlog,发给B。备库B拿到binlog后,写到本地文件,称为中转日志(relaylog)。sql_thread读取中转日志,解析出日志里的命令,并执行。binlog的三种格式对比
三种格式分别是:statementrowmixed
为了便于描述binlog的这三种格式间的区别,创建并初始化一个表
mysql>CREATETABLE`t`(`id`int(11)NOTNULL,`a`int(11)DEFAULTNULL,`t_modified`timestampNOTNULLDEFAULTCURRENT_TIMESTAMP,PRIMARYKEY(`id`),KEY`a`(`a`),KEY`t_modified`(`t_modified`))ENGINE=InnoDB;insertintotvalues(1,1,’2018-11-13’);insertintotvalues(2,2,’2018-11-12’);insertintotvalues(3,3,’2018-11-11’);insertintotvalues(4,4,’2018-11-10’);insertintotvalues(5,5,’2018-11-09’);
删除一行,分析binlog
mysql>deletefromt/*comment*/wherea>=4andt_modified<=’2018-11-10’limit1;查询binlog命令:mysql>showbinlogeventsin’master.000001’;当binlog_format=statement时
binlog里面记录的就是SQL语句的原文:
分析一下上图输出的结果:第一行可以先忽略.第二行是一个BEGIN,跟第四行的commit对应,表示中间是一个事务;第三行是真实的执行语句,在delete命令前,还有一个usetest命令,是mysql自动添加的.最后一行是一个COMMIT,包含一个xid.如果使用statement格式,记录到binlog的是语句原文.会有什么问题出现呢?
如果delete带有limit,很可能出出现住主备数据库不一致的情况
在主库执行这条SQL语句的时候,用的是索引a;而在备库执行这条SQL语句的时候,却使用了索引t_modified
当binlog_format=
与statement相比,begin与commit是一致的,但是row格式没有记录原文,而是替换成了两个event,粉笔是table_map与delete_rows
Table_mapevent,用于说明接下来要操作的表是test库的表t;Delete_rowsevent,用于定义删除的行为。使用mysqlbinlog工具分析解析binlog中内容mysqlbinlog-vvdata/master.000001—start-position=8900;
解析结果:
serverid1,表示这个事务是在server_id=1的这个库上执行的。每个event都有CRC32的值,这是因为参数binlog_checksum设置成了CRC32。Table_mapevent显示了接下来要打开的表,map到数字226。现在我们这条SQL语句只操作了一张表,如果要操作多张表呢?每个表都有一个对应的Table_mapevent、都会map到一个单独的数字,用于区分对不同表的操作。在mysqlbinlog的命令中,使用了-vv参数是为了把内容都解析出来,所以从结果里面可以看到各个字段的值(比如,@1=4、@2=4这些值)。binlog_row_image的默认配置是FULL,因此Delete_event里面,包含了删掉的行的所有字段的值。如果把binlog_row_image设置为MINIMAL,则只会记录必要的信息,在这个例子里,就是只会记录id=4这个信息。最后的Xidevent,用于表示事务被正确地提交了。为什么会有mixed格式的binlog?为什么会有mixed这种binlog格式的存在场景?因为有些statement格式的binlog可能会导致主备不一致,所以要使用row格式。但row格式的缺点是,很占空间。比如你用一个delete语句删掉10万行数据,用statement的话就是一个SQL语句被记录到binlog中,占用几十个字节的空间。但如果用row格式的binlog,就要把这10万条记录都写到binlog中。这样做,不仅会占用更大的空间,同时写binlog也要耗费IO资源,影响执行速度。所以,MySQL就取了个折中方案,也就是有了mixed格式的binlog。mixed格式的意思是,MySQL自己会判断这条SQL语句是否可能引起主备不一致,如果有可能,就用row格式,否则就用statement格式。如何解决双M结构的循环复制问题解决两个节点间的循环复制的问题的逻辑规定两个库的serverid必须不同,如果相同,则它们之间不能设定为主备关系;一个备库接到binlog并在重放的过程中,生成与原binlog的serverid相同的新的binlog;每个库在收到从自己的主库发过来的日志后,先判断serverid,如果跟自己的相同,表示这个日志是自己生成的,就直接丢弃这个日志。按照这个逻辑,如果我们设置了双M结构,日志的执行流就会变成这样:从节点A更新的事务,binlog里面记的都是A的serverid;传到节点B执行一次以后,节点B生成的binlog的serverid也是A的serverid;再传回给节点A,A判断到这个serverid与自己的相同,就不会再处理这个日志。所以,死循环在这里就断掉了。
MySQL实战问题03 mysql如何保证主备一致
MySQL主备的基本原理主备流程切换
在状态1中,客户端的读写都直接访问节点A,而节点B是A的备库,只是将A的更新都同步过来,到本地执行。这样可以保持节点B和A的数据是相同的
当需要切换的时候,就切成状态2。这时候客户端读写访问的都是节点B,而节点A是B的备库。
M-S模式中,为什么建议把备库设为readonly?有时候一些运营类的查询语句会被放到备库上去查,设置为只读可以防止误操作;防止切换逻辑有bug,比如切换过程中出现双写,造成主备不一致可以用readonly状态,来判断节点的角色。把备库设置成只读了,还怎么跟主库保持同步更新呢?
因为readonly设置对超级(super)权限用户是无效的,而用于同步更新的线程,就拥有超级权限。
节点A到B这条线的内部流程是什么样的
下图画出的就是一个update语句在节点A执行,然后同步到节点B的完整流程图
备库B跟主库A之间维持了一个长连接。主库A内部有一个线程,专门用于服务备库B的这个长连接
一个事务日志同步的完整过程是这样的:在备库B上通过changemaster命令,设置主库A的IP、端口、用户名、密码,以及要从哪个位置开始请求binlog,这个位置包含文件名和日志偏移量。在备库B上执行startslave命令,这时候备库会启动两个线程,就是图中的io_thread和sql_thread。其中io_thread负责与主库建立连接。主库A校验完用户名、密码后,开始按照备库B传过来的位置,从本地读取binlog,发给B。备库B拿到binlog后,写到本地文件,称为中转日志(relaylog)。sql_thread读取中转日志,解析出日志里的命令,并执行。binlog的三种格式对比
三种格式分别是:statementrowmixed
为了便于描述binlog的这三种格式间的区别,创建并初始化一个表
mysql>CREATETABLE`t`(`id`int(11)NOTNULL,`a`int(11)DEFAULTNULL,`t_modified`timestampNOTNULLDEFAULTCURRENT_TIMESTAMP,PRIMARYKEY(`id`),KEY`a`(`a`),KEY`t_modified`(`t_modified`))ENGINE=InnoDB;insertintotvalues(1,1,’2018-11-13’);insertintotvalues(2,2,’2018-11-12’);insertintotvalues(3,3,’2018-11-11’);insertintotvalues(4,4,’2018-11-10’);insertintotvalues(5,5,’2018-11-09’);
删除一行,分析binlog
mysql>deletefromt/*comment*/wherea>=4andt_modified<=’2018-11-10’limit1;查询binlog命令:mysql>showbinlogeventsin’master.000001’;当binlog_format=statement时
binlog里面记录的就是SQL语句的原文:
分析一下上图输出的结果:第一行可以先忽略.第二行是一个BEGIN,跟第四行的commit对应,表示中间是一个事务;第三行是真实的执行语句,在delete命令前,还有一个usetest命令,是mysql自动添加的.最后一行是一个COMMIT,包含一个xid.如果使用statement格式,记录到binlog的是语句原文.会有什么问题出现呢?
如果delete带有limit,很可能出出现住主备数据库不一致的情况
在主库执行这条SQL语句的时候,用的是索引a;而在备库执行这条SQL语句的时候,却使用了索引t_modified
当binlog_format=
与statement相比,begin与commit是一致的,但是row格式没有记录原文,而是替换成了两个event,粉笔是table_map与delete_rows
Table_mapevent,用于说明接下来要操作的表是test库的表t;Delete_rowsevent,用于定义删除的行为。使用mysqlbinlog工具分析解析binlog中内容mysqlbinlog-vvdata/master.000001—start-position=8900;
解析结果:
serverid1,表示这个事务是在server_id=1的这个库上执行的。每个event都有CRC32的值,这是因为参数binlog_checksum设置成了CRC32。Table_mapevent显示了接下来要打开的表,map到数字226。现在我们这条SQL语句只操作了一张表,如果要操作多张表呢?每个表都有一个对应的Table_mapevent、都会map到一个单独的数字,用于区分对不同表的操作。在mysqlbinlog的命令中,使用了-vv参数是为了把内容都解析出来,所以从结果里面可以看到各个字段的值(比如,@1=4、@2=4这些值)。binlog_row_image的默认配置是FULL,因此Delete_event里面,包含了删掉的行的所有字段的值。如果把binlog_row_image设置为MINIMAL,则只会记录必要的信息,在这个例子里,就是只会记录id=4这个信息。最后的Xidevent,用于表示事务被正确地提交了。为什么会有mixed格式的binlog?为什么会有mixed这种binlog格式的存在场景?因为有些statement格式的binlog可能会导致主备不一致,所以要使用row格式。但row格式的缺点是,很占空间。比如你用一个delete语句删掉10万行数据,用statement的话就是一个SQL语句被记录到binlog中,占用几十个字节的空间。但如果用row格式的binlog,就要把这10万条记录都写到binlog中。这样做,不仅会占用更大的空间,同时写binlog也要耗费IO资源,影响执行速度。所以,MySQL就取了个折中方案,也就是有了mixed格式的binlog。mixed格式的意思是,MySQL自己会判断这条SQL语句是否可能引起主备不一致,如果有可能,就用row格式,否则就用statement格式。如何解决双M结构的循环复制问题解决两个节点间的循环复制的问题的逻辑规定两个库的serverid必须不同,如果相同,则它们之间不能设定为主备关系;一个备库接到binlog并在重放的过程中,生成与原binlog的serverid相同的新的binlog;每个库在收到从自己的主库发过来的日志后,先判断serverid,如果跟自己的相同,表示这个日志是自己生成的,就直接丢弃这个日志。按照这个逻辑,如果我们设置了双M结构,日志的执行流就会变成这样:从节点A更新的事务,binlog里面记的都是A的serverid;传到节点B执行一次以后,节点B生成的binlog的serverid也是A的serverid;再传回给节点A,A判断到这个serverid与自己的相同,就不会再处理这个日志。所以,死循环在这里就断掉了。
如何保证田间施肥的一致性?
复合肥田间施肥方法
如何保证报告缺陷的严重性和优先级的一致性?
为了保证报告缺陷的严重性和优先级的一致性,质量保证人员需要经常检查测试和开发人员对于这两个指标的分配和处理情况,发现问题,及时反馈给项目负责人,及时解决
如何保证redis集群和mysql的数据一致性
是一种数据库的数据类型,blob是按二进制来存储的。
mysql中,blob是个类型系列,包括:tinyblob、blob、mediumblob、longblob,这几个类型之间的唯一区别是在存储文件的最大大小上不同。
tinyblob 最大 255字节
blob 最大 65k
mediumblob 中等16m
longblob 最大 4g展开全部
如何保证redis集群和mysql的数据一致性
如果要“保证”数据的安全性,那么会带来开销的进一步提升,以至于使用redis带来的性能优势都会丧失。正确的做法是区分不同的业务,使得并不需要“保证”数据一致性的场合,可以使用redis优化。而敏感的场合依然使用mysql。
如何保证数据库的安全性和一致性?
关系型数据库有四个显著的特征,即安全性、完整性、并发性和监测性。数据库的安全性就是要保证数据库中数据的安全,防止未授权用户随意修改数据库中的数据,确保数据的安全。在大多数数据库管理系统中,主要是通过许可来保证数据库的安全性。完整性是数据库的一个重要特征,也是保证数据库中的数据切实有效、防止错误、实现商业规则的一种重要机制。在数据库中,区别所保存的数据是无用的垃圾还是有价值的信息,主要是依据数据库的完整性是否健全。在SQL Server 7.0中,数据的完整性是通过一系列逻辑来保障的,这些逻辑分为三个方面,即实体完整性、域完整性和参考完整性。对任何系统都可以这样说,没有监测,就没有优化。这句话用在数据库管理系统方面,也是切合实际的。只有通过对数据库进行全面的性能监测,也才能发现影响系统性能的因素和瓶颈,才能针对瓶颈因素,采取切合实际策略,解决问题,提高系统的性能。并发性也是一个非常重要的概念,它是用来解决多个用户对同一数据进行操作时的问题。特别是对于网络数据库来说,这个特点更加突出。提高数据库的处理速度,单单依靠提高计算机的物理速度是不够的,还必须充分考虑数据库的并发性问题,提高数据库并发性的效率。那么如何保证并发性呢?在这个面向下一世纪的数据库产品SQL Server 7.0中,通过使用事务和锁机制,解决了数据库的并发性问题。
本文来自: 中国网管联盟(bitsCN.com) 详细出处参考:安全性:如果是java的话你可以用接口,接口不能反向访问,保证数据安全 一致性:如果是多线程的话,进行同步 个人见解
还没有评论,来说两句吧...