iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >MySQL的一致性如何检测及实现数据同步
  • 550
分享到

MySQL的一致性如何检测及实现数据同步

2024-04-02 19:04:59 550人浏览 独家记忆
摘要

本文主要给大家简单讲讲Mysql的一致性如何检测及实现数据同步,相关专业术语大家可以上网查查或者找一些相关书籍补充一下,这里就不涉猎了,我们就直奔主题吧,希望mysql的一致性如何检测及实现数据同步这篇文章

本文主要给大家简单讲讲Mysql的一致性如何检测及实现数据同步,相关专业术语大家可以上网查查或者找一些相关书籍补充一下,这里就不涉猎了,我们就直奔主题吧,希望mysql的一致性如何检测及实现数据同步这篇文章可以给大家带来一些实际帮助。

一. 部署percona tookit

  1. 下载安装包
    ~]# wget https://www.percona.com/downloads/percona-toolkit/3.0.5/binary/redhat/7/x86_64/percona-toolkit-3.0.5-1.el7.x86_64.rpm

  2. 安装
    ~]# yum install percona-toolkit-3.0.5-1.el7.x86_64.rpm

二. 一致性检测工具pt-table-checksum

1. 一致性检测原理

pt-table-checksum是percona-toolkit系列工具中的一个,用于检测主从数据库中的一致性。一次只工作在一张表上,会将主库上的表切割成一个一个的chunk,这种切割要依赖于表上的index。所以在检测时不需要大量的内存和前期工作,而且还可以在数据尖峰是通过指数衰减算法,快速选择适合的chunk大小,减轻云服务器压力。将表切割成一个一个的chunk接下来会对chunk进行checksum,并记录下来。并对比从库上的checksum是否一致,从而判断数据是否一致。并且在检测过程中会自动判断master负载,以及slave延迟,一旦超过阈值就会停止下来。对于线上的环境影响不大。而且他还可以随时停止,只需在重启时加入--resume就会从上次的检测重新开始。接下来介绍其详细过程。

1) 表结构的检查

表结构的检查也称之为单行数据checksum值的计算,并获取每一列的数据类型,把所有数据类型都转化为字符串,然后用concat_ws()函数进行连接,由此计算出该行的checksum值。checksum默认采用crc32计算。

2) 数据块checksum的计算

pt-table-sync会智能分析表上的索引,然后把表的数据split成若干个chunk,计算的时候以chunk为单位。可以理解为把chunk内所有行的数据拼接起来,再计算crc32的值,即得到该chunk的checksum值。所以它把checksum结果存储到统计表,然后把执行过的sql语句记录到binlog中,任务就算完成。然后从云服务器会读取到binlog的SQL语句依次执行,并将checksum保存在表中。

2. 校验

1)授权

Create database pt CHARACTER SET utf8;
GRANT UPDATE,INSERT,DELETE,SELECT, PROCESS, SUPER, REPLICATioN SLAVE ON . TO 'checksums'@'192.168.239.135' identified by 'check_pass';
GRANT ALL ON pt.* TO 'checksums'@'192.168.%';
在这里我们创建了一个数据库,用于存储一致性检测生成的数据。主从同步工具pt-table-sync根据此数据库中的数据查找有不一致的数据,并同步。其中135为主,136为从。

2)校验(Master云服务器运行)

pt-table-checksum --nocheck-binlog-fORMat --nocheck-plan --nocheck-replication-filters --replicate=pt.checksums --set-vars innodb_lock_wait_timeout=120 --databases newtable -u'checksums' -p'checksums' -h292.168.239.135
#-h -u -p -P -S -d 连接信息
#--nocheck-replication-filters 检测中忽略mysql 配置参数binlog_ignore_db等。
#--nocheck-binlog-format 不检测日志格式,默认是使用statement 格式,如果binlog的日志与默认不同将会检测失败。所以我们会关闭binlog格式的检测
#--replicate 指定checksum 存储的db和表, 如test.checksum
#--chunk-size, --chunk-size-limit 用于指定检测块的大小。 可控性更强,Number of rows to select for each checksum query。默认是1000。对于--chunk-size-limit来说,他可以避免当主云服务器为空,而从服务数据很大时造成的从延时过大。
#--lock-wait-timeout innodb 的超时设定, 默认为1
#--max-load : Examine SHOW GLOBAL STATUS after every chunk, and pause if any status variables are higher than their thresholds
#--replicate-check-only 只输出数据不一致的信息。
#--resume: pt-table-checksum停止后,使用此参数可以接着停止的地方开始。

注意:
pt-table-checksum前提假设主从的表和表结构是一致的,如果不一致pt-table-checksum会失败

三. 数据同步工具pt-table-sync

pt-table-sync是MySQL数据同步工具,并不仅仅是同步主从数据,任意主机上的表都可以同步。
pt-table-checksum只是校验,所以它把checksum结果存储到统计表,然后把执行过的sql语句记录到binlog中,任务就算完成。
pt-table-sync则不同,工作流程如下:

  • a) 连接到主库:pt工具连接到主库,然后自动发现主库的所有从库。默认采用show full processlist来查找从库,但是这只有在主从实例端口相同的情况下才有效
  • b) 在主库上对每一个chunk,在校验时加上for update锁。一旦获得锁,就记录下当前主库的show master status值。在从库上执行select master_pos_wait()函数,等待从库sql线程执行到show master status得到的位置。以此保证,主从上关于这个chunk的内容均不再改变。
  • c) 对这个chunk执行checksum,然后与主库的checksum进行比较
  • d) 如果checksum相同,说明主从数据一致,就继续下一个chunk
  • e) 如果checksum不同,说明该chunk有不一致。深入chunk内部,逐行计算checksum并比较
  • f) 如果发现某行不一致,则标记下来。继续检测剩余行,直到这个chunk结束
  • g) 对找到的主从不一致的行,采用replace into(如果数据不存在则插入,存在则更新,避免了主键约束)语句,在主库执行一遍以生成该行全量的binlog,并同步到从库,这会以主库数据为基准来修复从库;对于主库有的行而从库没有的行,采用replace在主库上插入(必须不能是insert);于从库有而主库没有的行,通过在主库执行delete来删除(pt-table-sync强烈建议所有的数据修复都只在主库进行,而不建议直接修改从库数据;但是也有特例,后面会讲到)。
  • h) 直到修复该chunk所有不一致的行。继续检查和修复下一个chunk
  • i) 直到这个从库上所有的表修复结束。开始修复下一个从库

四. 实验示例

1. 实验环境

  • 主机IP : 192.168.239.135 192.168.239.136
  • 主机系统 :  Centos7.2
  • MySQL版本 :  5.5.56
    两台主机已经配置好主从,其中135为主,136为从
    MySQL的一致性如何检测及实现数据同步

2. 主从数据一致性检查

  • 1)授权(master主机上)
    mysql> CREATE DATABASE pt;      #创建数据库pt用于存放checksum的值
    mysql> GRANT UPDATE,INSERT,SELECT,PROCESS,SUPER,REPLICATION SLAVE ON . 'checksum'@'192.168.%' IDENTIFIED BY "check_pass";    #创建checksum用户用于执行检测,以及分配检测时要用的权限。
    mysql> GRANT ALL ON pt.* TO checksum@'192.168.%';       #checksum用户要将checksum的值写入pt数据库中所以需要分配权限给checksum用户。
    权限解释:
    select     //查看所有库的表,原理可加 explain选项查看
    process    //show processlist
    super      //set binlog_format='statement'
    replication slave   //show slave hosts

    注意 : 在master上执行一致性检测时,master会通过show processlist查看slave主机,并通过连接master的账号和密码连接slave,所以master上一致性检测的账号在slave上一定要有。

  • 2)在master上执行一致性检测
    首先我们需要人为创造不一致,在slave中删除一条记录
    MySQL的一致性如何检测及实现数据同步
    执行一致性检测(主从上都可执行)
    ~]# pt-table-checksum --nocheck-binlog-format --nocheck-plan --nocheck-replication-filters --replicate=pt.checksums --databases=hellodb -u 'checksum' -p 'check_pass' -h 192.168.239.135
                       TS ERRORS  DIFFS     ROWS  CHUNKS SKIPPED    TIME TABLE
    03-14T16:25:21               0      1                  8              1       0           0.011 hellodb.classes
    03-14T16:25:21               0      0                 14             1       0           0.017 hellodb.coc
    03-14T16:25:21               0      0                 7               1       0           0.032 hellodb.courses
    03-14T16:25:21               0      0                15              1       0          0.015 hellodb.scores
    03-14T16:25:21               0      0                25              1       0          0.016 hellodb.students
    03-14T16:25:21               0      0                4                1       0          0.018 hellodb.teachers
    03-14T16:25:21               0      0                0                1       0          0.016 hellodb.toc

    显示数据解释
    TS : 完成检测表时的时间,不显示年份。
    ERRORS : 在checksum时发生的错误和警告的次数
    DIFFS : 主从之间chunk不同的个数,如果不为0,表明主从数据有不一致的。
    ROWS : 检测表时一个chunk有多少行。如果使用了-where选项,一个表中的chunk可能不同
    CHUNKS : 表被切割成了多少个chunk
    SKIPPED : 由于某种原因跳过检测chunk的数量
    TIME : checksum此表所花的时间。
    TABLE : 被checksum的表明
    由上可知classes表中有数据不一致。

3. 主从同步

主从实现同步,往往都是借助pt-table-checksum产生的checksum表来说实现数据同步。

1)手动同步

~]# pt-table-sync --print --sync-to-master h=192.168.239.136,u=checksum,p=check_pass --databases=hellodb --replicate=pt.checksums
h=192.168.239.136,u=checksum,p=check_pass 指明需要同步的slave主机,以及登录的用户名和密码
--databases=hellodb:指明同步的数据
--replicate=pt.checksums:同步时使用的checksum数据库。
--sync-to-master:会通过show slave status去自动找主云服务器同步数据,如果没有此参数,我们需要通过h p u同时指明master和slave,即两组h p u。
--print:主从不同的数据仅打印出来,并不在从上执行。
此命令在主从上都可执行。输出信息如下:
MySQL的一致性如何检测及实现数据同步
我们只需在从云服务器上执行REPLACE INTO hellodb.classes(classid, class, numofstu) VALUES ('1', 'Shaolin Pai', '10')这条sql语句即可

2)自动同步

~]# pt-table-sync --execute --sync-to-master h=192.168.239.136,u=checksum,p=check_pass --databases=hellodb --replicate=pt.checksums
--execute:自动修复主从不同的数据
自动同步出现如下错误:
MySQL的一致性如何检测及实现数据同步
pt-table-sync在实现同时时并不会直接在slave上进行操作,都是在master上执行命令,进而影响slave,这种修改数据的方式更加安全。所以master需要在slave上有对应的权限。
上图显示master在slave上没有delete权限,查看slave分配的权限,如下图可知确实没有delete权限,只需在master上将checksum用户添加delete权限即可
MySQL的一致性如何检测及实现数据同步

在master上修改checksum的权限,由于主从同步,slave也会修改对应用户权限

mysql GRANT UPDATE,INSERT,SELECT,DELETE,PROCESS,SUPER,REPLICATION SLAVE ON . TO 'checksum'@'192.168.%';

执行数据同步,再次执行checksum检测,可以看到没有不同,而且查看slave中classes数据发现删除的数据又出现了
MySQL的一致性如何检测及实现数据同步

MySQL的一致性如何检测及实现数据同步

MySQL的一致性如何检测及实现数据同步就先给大家讲到这里,对于其它相关问题大家想要了解的可以持续关注我们的数据库。我们的板块内容每天都会捕捉一些行业新闻及专业知识分享给大家的。

您可能感兴趣的文档:

--结束END--

本文标题: MySQL的一致性如何检测及实现数据同步

本文链接: https://www.lsjlt.com/news/35048.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何实现redis数据一致性
    小编给大家分享一下如何实现redis数据一致性,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、缓存一致的必要性还是接上篇来说,我们已经解决了redis缓存穿透的...
    99+
    2023-06-29
  • kafka如何实现数据一致性
    Kafka是一个分布式流处理平台,它通过分布式发布-订阅系统来实现高可靠性和高吞吐量的数据传输。由于Kafka的设计目标是提供高效的...
    99+
    2023-09-14
    kafka
  • Linux 上的 PHP 框架同步:如何确保数据一致性?
    对于运行在 Linux 上的 PHP 应用程序,框架同步是一个非常重要的问题。在多个服务器上运行的应用程序需要确保数据的一致性,同时还需要满足高可用性的要求。在这篇文章中,我们将探讨如何确保 PHP 应用程序的数据一致性。 一、使用 Re...
    99+
    2023-09-18
    同步 linux 框架
  • canal如何实现mysql的数据同步
    这篇文章将为大家详细讲解有关canal如何实现mysql的数据同步,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。canal是什么?canal [kə'næl],译...
    99+
    2024-04-02
  • 如何实现MySQL数据库同步
    这篇文章主要介绍了如何实现MySQL数据库同步,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。MySQL 的数据同步,在 MySQL 官方网站...
    99+
    2024-04-02
  • mysql数据库同步如何实现
    MySQL数据库同步可以通过多种方式实现,以下是一些常用的方法: 使用主从复制:主从复制是MySQL自带的一种数据库同步方法,通...
    99+
    2024-04-09
    mysql
  • MySQL同步数据Replication如何实现
    今天小编给大家分享一下MySQL同步数据Replication如何实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。MySQ...
    99+
    2023-07-05
  • MySQL到DB2: 如何实现数据的完整转移和一致性?
    MySQL和DB2是两种广泛使用的关系型数据库管理系统(RDBMS),在某些情况下,我们可能需要将数据从MySQL迁移到DB2。本文将介绍如何实现数据的完整转移和一致性,确保迁移过程顺利进行。数据迁移计划的制定在开始数据迁移之前,我们需要制...
    99+
    2023-10-22
    数据迁移 数据一致性 数据转移
  • PHP开发中如何处理分布式数据同步和一致性
    摘要:在现代分布式系统中,数据同步和一致性是两个关键问题。本文将介绍如何在PHP开发中处理分布式数据同步和一致性,并提供一些具体的代码示例。引言:随着互联网的快速发展,分布式系统越来越普遍。在一个分布式系统中,数据是被分割和存储在不同的节点...
    99+
    2023-10-21
    分布式 一致性 数据同步
  • MySQL同步数据Replication的实现步骤
    目录一、同步复制数据基本原理二、同步数据示例1、修改主从mysql配置文件2、主机建立同步账号,并查看主库状态信息3、从机同步配置4、查看同步配置效果MySQL提供了Replication功能,可以实现将一个数据库的数据...
    99+
    2023-03-24
    MySQL同步数据Replication MySQL Replication同步
  • 数据库同步的艺术:掌握数据一致性和可靠性的秘诀
    在现代数据驱动的世界中,确保数据库系统之间的同步至关重要。数据同步使企业能够实时共享数据,从而消除延迟、避免冗余并提供一致的用户体验。本文将探讨数据库同步的艺术,提供掌握数据一致性和可靠性的秘诀。 变更数据捕获 (CDC) CDC 是数...
    99+
    2024-02-29
    数据库同步、数据一致性、数据可靠性、变更数据捕获、实时复制
  • Redis 和 MySQL 如何保持数据一致性?
    在高并发的场景下,大量的请求直接访问MySQL很容易造成性能问题。所以,我们都会用Redis来做数据的缓存,削减对数据库的请求。但是,MySQL和Redis是两种不同的数据库,如何保证不同数据库之间数据的一致性就非常关键了。 一、导致...
    99+
    2023-09-16
    mysql redis
  • MySQL和Redis如何保证数据一致性
    MySQL与Redis都是常用的数据存储和缓存系统。为了提高应用程序的性能和可伸缩性,很多应用程序将MySQL和Redis一起使用,其中MySQL作为主要的持久存储,而Redis作为主要的缓存。在这种情况下,应用程序需要确保MySQL和Re...
    99+
    2023-08-22
    mysql redis 数据库
  • redis数据一致性的实现示例
    前言 所谓的redis数据一致性即当进行修改或者保存、删除之后,redis中的数据也应该进行相应变化,不然用户再次查询的时候很可能查询出已经删除过的脏数据。 一、缓存一致的必要性 还...
    99+
    2024-04-02
  • Java分布式系统中的路径同步:如何确保数据的一致性?
    随着互联网的迅速发展,分布式系统越来越成为软件开发的主流。分布式系统是由多个独立计算机组成的,这些计算机通过网络相互连接,并共享资源。分布式系统的优点是可以提高系统的可靠性、可扩展性和性能。但是,分布式系统也存在一些挑战,例如数据一致性和...
    99+
    2023-08-17
    path 分布式 同步
  • golang如何实现一个高性能的心跳检测
    今天小编给大家分享一下golang如何实现一个高性能的心跳检测的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。使用 Golan...
    99+
    2023-07-05
  • 详解Mysql如何实现数据同步到Elasticsearch
    目录一、同步原理二、logstash-input-jdbc三、go-mysql-elasticsearch四、elasticsearch-jdbc五、logstash-input-j...
    99+
    2024-04-02
  • MySQL中如何确保数据的一致性和完整性
    在MySQL中,可以通过以下方式来确保数据的一致性和完整性: 使用主键和外键约束:定义主键和外键可以确保数据表之间的关系,避免数...
    99+
    2024-04-09
    MySQL
  • PHP 文件同步:如何解决响应速度和数据一致性的矛盾?
    在现代 Web 应用程序中,文件同步是一个关键的问题,因为在多台服务器上运行的应用程序必须共享相同的文件。但是,文件同步通常会面临响应速度和数据一致性之间的矛盾。本文将介绍如何使用 PHP 解决这个问题,同时提高响应速度和数据一致性。 ...
    99+
    2023-09-02
    响应 同步 文件
  • 【ElasticSearch】ES与MySQL数据同步方案及Java实现
    文章目录 一、同步实现思路1、方案一:同步调用2、方案二:异步通知3、方案三:监听binlog 二、实现ES与MySQL数据同步1、导入hotel-admin工程2、项目分析3、SpringAMQP整合4、声明队列和交换机5、发...
    99+
    2023-08-30
    elasticsearch mysql java
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作