php mysql replication

2025-12-07 0 787

PHP-MYSQL复制

MySQL复制协议的纯PHP实现。这使您可以接收事件,例如插入,更新,删除其数据和RAW SQL查询。

基于创作者的精彩作品:https://github.com/noplay/python-mysqlreplication和https://git***hub.com/fengxiangyun/mysql-replication

安装

在您的项目中

composer require krowinski/php-mysql-replication

或独立

git clone https://*gith**ub.com/krowinski/php-mysql-replication.git

composer install -o

兼容性(基于集成测试)

php

  • PHP 8.2
  • PHP 8.3

mysql

  • mysql 5.5
  • mysql 5.6
  • mysql 5.7
  • mysql 8.0(mysql_native_password和caching_sha2_password支持)
  • Mariadb 5.5
  • Mariadb 10.0
  • Mariadb 10.1
  • 可能是基于本机Mysql的Percona版本

MySQL服务器设置

在您的MySQL Server配置文件中,您需要启用复制:

 [mysqld]
server-id        = 1
log_bin          = /var/log/mysql/mysql-bin.log
expire_logs_days = 10
max_binlog_size  = 100M
binlog-format    = row #Very important if you want to receive write, update and delete row events

MySQL复制事件解释了https://dev.*my**sql.com/doc/internals/en/event-meanings.html

MySQL用户特权:

 GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO \'user\'@\'host\';

GRANT SELECT ON `dbName`.* TO \'user\'@\'host\';

配置

使用ConfigBuilder或ConfigFactory创建配置。可用选项:

“用户” – 您的MySQL用户(强制性)

“ IP”或“主机” – 您的MySQL主机/IP(强制性)

“密码” – 您的MySQL密码(强制性)

\’端口\’ – 您的MySQL主机端口(默认3306)

\’charset\’ – DB连接charset(默认UTF8)

\’gtid\’ – GTID标记(S)从(格式9B1C8D18D18-2A76-11E5-A26B-000C2976F3F3:1-177592)开始

\’Mariadbgtid\’ – Mariadb GTID标记(S)从(格式1-1-3,0-1-88)开始

“从属” – 标识的脚本从ID(默认:666)(显示从主机)

\’binlogfilename\’ – bin日志文件名是要从

“ binlogposition” – 从

\’eventsonly\’ – 在事件上收听的数组(consteventtype.php文件中的完整列表)

“ Eventsignore” – 忽略事件的数组(consteventtype.php文件中的完整列表)

\’tablesonly\’ – 数组仅在给定表上收听(默认所有表)

“数据库” – 仅在给定数据库上收听的数组(默认所有数据库)

“ tablecachesize” – 一些数据是从信息模式中收集的,该数据被缓存。

“自定义” – 如果必须在扩展/实现的类中设置某些参数

“ HeartBeatPeriod” – 在复制心跳之间以秒为单位设置间隔。每当大师的二进制日志随着事件更新时,重置下一个心跳的等待时间。间隔是一个十进制值,其范围为0到4294967秒,并且分辨率为毫秒。最小的非零值为0.001。仅当二进制日志文件中没有未发生事件的时间比间隔时间长的时间内,主人是由主发送的。

\’SaveUuid\’ – 设置从属uuid进行识别(默认值:0015D2B6-8A06-4E5E-8C07-207-206EF3FBD274)

类似的项目

Ruby:https://github.com/y310/kodama

Java:https://github.com/shyiko/mysql-binlog-connector-java

去:https://github.com/siddontang/go-mysql

Python:https://github.com/noplay/python-mysql-replication

.net:https://github.com/rusuly/mysqlcdc

例子

所有示例都可以在示例目录中使用

此示例将把所有复制事件都转移到控制台:

请记住为用户,主机和密码更改配置。

用户应具有复制特权[复制客户端,选择]

php example/dump_events.php

对于测试SQL事件:

 CREATE DATABASE php_mysql_replication ;
use php_mysql_replication;
CREATE TABLE test4 (id int NOT NULL AUTO_INCREMENT, data VARCHAR ( 255 ), data2 VARCHAR ( 255 ), PRIMARY KEY (id));
INSERT INTO test4 (data,data2) VALUES ( \" Hello \" , \" World \" );
UPDATE test4 SET data = \" World \" , data2 = \" Hello \" WHERE id = 1 ;
DELETE FROM test4 WHERE id = 1 ;

输出将与此相似(取决于配置,例如GTID OFF/ON):

 === Event format description ===
Date: 2017-07-06T13:31:11+00:00
Log position: 0
Event size: 116
Memory usage 2.4 MB

=== Event gtid ===
Date: 2017-07-06T15:23:44+00:00
Log position: 57803092
Event size: 48
Commit: true
GTID NEXT: 3403c535-624f-11e7-9940-0800275713ee:13675
Memory usage 2.42 MB

=== Event query ===
Date: 2017-07-06T15:23:44+00:00
Log position: 57803237
Event size: 145
Database: php_mysql_replication
Execution time: 0
Query: CREATE DATABASE php_mysql_replication
Memory usage 2.45 MB

=== Event gtid ===
Date: 2017-07-06T15:23:44+00:00
Log position: 57803285
Event size: 48
Commit: true
GTID NEXT: 3403c535-624f-11e7-9940-0800275713ee:13676
Memory usage 2.45 MB

=== Event query ===
Date: 2017-07-06T15:23:44+00:00
Log position: 57803500
Event size: 215
Database: php_mysql_replication
Execution time: 0
Query: CREATE TABLE test4 (id int NOT NULL AUTO_INCREMENT, data VARCHAR(255), data2 VARCHAR(255), PRIMARY KEY(id))
Memory usage 2.45 MB

=== Event gtid ===
Date: 2017-07-06T15:23:44+00:00
Log position: 57803548
Event size: 48
Commit: true
GTID NEXT: 3403c535-624f-11e7-9940-0800275713ee:13677
Memory usage 2.45 MB

=== Event query ===
Date: 2017-07-06T15:23:44+00:00
Log position: 57803637
Event size: 89
Database: php_mysql_replication
Execution time: 0
Query: BEGIN
Memory usage 2.45 MB

=== Event tableMap ===
Date: 2017-07-06T15:23:44+00:00
Log position: 57803708
Event size: 71
Table: test4
Database: php_mysql_replication
Table Id: 866
Columns amount: 3
Memory usage 2.71 MB

=== Event write ===
Date: 2017-07-06T15:23:44+00:00
Log position: 57803762
Event size: 54
Table: test4
Affected columns: 3
Changed rows: 1
Values: Array
(
    [0] => Array
        (
            [id] => 1
            [data] => Hello
            [data2] => World
        )

)

Memory usage 2.74 MB

=== Event xid ===
Date: 2017-07-06T15:23:44+00:00
Log position: 57803793
Event size: 31
Transaction ID: 662802
Memory usage 2.75 MB

=== Event gtid ===
Date: 2017-07-06T15:23:44+00:00
Log position: 57803841
Event size: 48
Commit: true
GTID NEXT: 3403c535-624f-11e7-9940-0800275713ee:13678
Memory usage 2.75 MB

=== Event query ===
Date: 2017-07-06T15:23:44+00:00
Log position: 57803930
Event size: 89
Database: php_mysql_replication
Execution time: 0
Query: BEGIN
Memory usage 2.76 MB

=== Event tableMap ===
Date: 2017-07-06T15:23:44+00:00
Log position: 57804001
Event size: 71
Table: test4
Database: php_mysql_replication
Table Id: 866
Columns amount: 3
Memory usage 2.75 MB

=== Event update ===
Date: 2017-07-06T15:23:44+00:00
Log position: 57804075
Event size: 74
Table: test4
Affected columns: 3
Changed rows: 1
Values: Array
(
    [0] => Array
        (
            [before] => Array
                (
                    [id] => 1
                    [data] => Hello
                    [data2] => World
                )

            [after] => Array
                (
                    [id] => 1
                    [data] => World
                    [data2] => Hello
                )

        )

)

Memory usage 2.76 MB

=== Event xid ===
Date: 2017-07-06T15:23:44+00:00
Log position: 57804106
Event size: 31
Transaction ID: 662803
Memory usage 2.76 MB

=== Event gtid ===
Date: 2017-07-06T15:23:44+00:00
Log position: 57804154
Event size: 48
Commit: true
GTID NEXT: 3403c535-624f-11e7-9940-0800275713ee:13679
Memory usage 2.76 MB

=== Event query ===
Date: 2017-07-06T15:23:44+00:00
Log position: 57804243
Event size: 89
Database: php_mysql_replication
Execution time: 0
Query: BEGIN
Memory usage 2.76 MB

=== Event tableMap ===
Date: 2017-07-06T15:23:44+00:00
Log position: 57804314
Event size: 71
Table: test4
Database: php_mysql_replication
Table Id: 866
Columns amount: 3
Memory usage 2.76 MB

=== Event delete ===
Date: 2017-07-06T15:23:44+00:00
Log position: 57804368
Event size: 54
Table: test4
Affected columns: 3
Changed rows: 1
Values: Array
(
    [0] => Array
        (
            [id] => 1
            [data] => World
            [data2] => Hello
        )

)

Memory usage 2.77 MB

=== Event xid ===
Date: 2017-07-06T15:23:44+00:00
Log position: 57804399
Event size: 31
Transaction ID: 662804
Memory usage 2.77 MB

基准

在VM上测试

 Debian 8.7
PHP 5.6.30
Percona 5.6.35
inxi
 CPU(s)~4 Single core Intel Core i5-2500Ks (-SMP-) clocked at 5901 Mhz Kernel~3.16.0-4-amd64 x86_64 Up~1 day Mem~1340.3/1996.9MB HDD~41.9GB(27.7% used) Procs~122 Client~Shell inxi~2.1.28
php example/benchmark.php
 Start insert data
7442 event by seconds (1000 total)
7679 event by seconds (2000 total)
7914 event by seconds (3000 total)
7904 event by seconds (4000 total)
7965 event by seconds (5000 total)
8006 event by seconds (6000 total)
8048 event by seconds (7000 total)
8038 event by seconds (8000 total)
8040 event by seconds (9000 total)
8055 event by seconds (10000 total)
8058 event by seconds (11000 total)
8071 event by seconds (12000 total)

常问问题

  1. 为什么以及何时需要PHP-MYSQL复制?

首先,MySQL不会给您异步的电话。 You usually need to program this in your application (by event dispatching and adding to some queue system and if your db have many point of entry like web, backend other microservices its not always cheap to add processing to all of them. But using mysql replication protocol you can listen on write events and process then asynchronously (the best combo it\’s to add item to some queue system like rabbitmq, redis or kafka). Also in invalidate缓存,搜索引擎复制,实时分析和审核。

  1. 太棒了!但是捕获量是多少?

首先,您需要知道,可能会发生很多事件,例如,如果您更新表“ bar”中的1 000 000记录,并且您需要从表“ foo”中插入此插件,那么所有这些都必须通过脚本处理,并且需要等待数据。这是正常的,这是如何工作的。您可以使用配置选项加快加速。另外,如果脚本崩溃,您需要不时保存binlog(或gtid)的时间位置,以便在您再次运行此脚本以避免重复时从此位置开始。

  1. 我需要处理1 000 000的记录,并且它永远使用!!

就像我在1点中提到的使用队列系统(如RabbitMQ,Redis或Kafka)一样,它们将使您能够在多个脚本中处理数据。

  1. 我有问题吗?您的脚本缺少一些东西!我找到了一个错误!

创建一个问题,我将在空闲时间尝试解决问题:)

  1. 它给MySQL Server的开销多少?

它像从奴隶模式下的任何其他MySQL一样工作,并且给出了同样的开销。

  1. 插座超时错误

最好的解决方法是将DB配置增加net_read_timeoutnet_write_timeout到3600。(TX Bijimon)

  1. 部分更新修复

在my.conf binlog_row_image=full中设置为仅修复部分更新。

  1. 连接到副本服务器时没有复制事件

在my.conf log_slave_updates=on中设置以修复此(#71)(#66)

  1. “大”更新 /插入

Default MYSQL setting generates one big blob of stream this require more RAM/CPU you can change this for smaller stream using variable binlog_row_event_max_size [https://dev.my**sq*l.com/doc/refman/8.0/en/replication-options-binary-log.html#sysvar_binlog_row_event_max_size]分成较小的块

下载源码

通过命令行克隆项目:

git clone https://github.com/krowinski/php-mysql-replication.git

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

申明:本文由第三方发布,内容仅代表作者观点,与本网站无关。对本文以及其中全部或者部分内容的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。本网发布或转载文章出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,也不代表本网对其真实性负责。

左子网 开发教程 php mysql replication https://www.zuozi.net/31973.html

NG6 starter
下一篇: NG6 starter
常见问题
  • 1、自动:拍下后,点击(下载)链接即可下载;2、手动:拍下后,联系卖家发放即可或者联系官方找开发者发货。
查看详情
  • 1、源码默认交易周期:手动发货商品为1-3天,并且用户付款金额将会进入平台担保直到交易完成或者3-7天即可发放,如遇纠纷无限期延长收款金额直至纠纷解决或者退款!;
查看详情
  • 1、描述:源码描述(含标题)与实际源码不一致的(例:货不对板); 2、演示:有演示站时,与实际源码小于95%一致的(但描述中有”不保证完全一样、有变化的可能性”类似显著声明的除外); 3、发货:不发货可无理由退款; 4、安装:免费提供安装服务的源码但卖家不履行的; 5、收费:价格虚标,额外收取其他费用的(但描述中有显著声明或双方交易前有商定的除外); 6、其他:如质量方面的硬性常规问题BUG等。 注:经核实符合上述任一,均支持退款,但卖家予以积极解决问题则除外。
查看详情
  • 1、左子会对双方交易的过程及交易商品的快照进行永久存档,以确保交易的真实、有效、安全! 2、左子无法对如“永久包更新”、“永久技术支持”等类似交易之后的商家承诺做担保,请买家自行鉴别; 3、在源码同时有网站演示与图片演示,且站演与图演不一致时,默认按图演作为纠纷评判依据(特别声明或有商定除外); 4、在没有”无任何正当退款依据”的前提下,商品写有”一旦售出,概不支持退款”等类似的声明,视为无效声明; 5、在未拍下前,双方在QQ上所商定的交易内容,亦可成为纠纷评判依据(商定与描述冲突时,商定为准); 6、因聊天记录可作为纠纷评判依据,故双方联系时,只与对方在左子上所留的QQ、手机号沟通,以防对方不承认自我承诺。 7、虽然交易产生纠纷的几率很小,但一定要保留如聊天记录、手机短信等这样的重要信息,以防产生纠纷时便于左子介入快速处理。
查看详情

相关文章

猜你喜欢
发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务