MySQL 复制协议的纯 PHP 实现。这允许您接收插入、更新、删除等事件及其数据和原始 SQL 查询。
基于创作者的伟大作品:https://github.com/noplay/python-mysql-replication 和 https://github.com/fengxiangyun/mysql-replication
在你的项目中
composer require krowinski/php-mysql-replication
或独立的
git clone https://github.com/krowinski/php-mysql-replication.git
composer install -o
PHP
数据库管理系统
在 MySQL 服务器配置文件中,您需要启用复制:
[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.mysql.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 创建配置。可用选项:
'user' - 你的 mysql 用户(强制)
'ip' 或 'host' - 你的 mysql 主机/IP(必填)
'password' - 你的 mysql 密码(必填)
'port' - 你的 mysql 主机端口(默认 3306)
'charset' - 数据库连接字符集(默认utf8)
'gtid' - GTID 标记(格式 9b1c8d18-2a76-11e5-a26b-000c2976f3f3:1-177592)
'mariaDbGtid' - MariaDB GTID 标记(格式 1-1-3,0-1-88)
'slaveId' - 用于识别的脚本从机 ID(默认值:666)(显示从机主机)
'binLogFileName' - 开始的 bin 日志文件名
'binLogPosition' - bin 日志位置开始
'eventsOnly' - 监听事件的数组(ConstEventType.php 文件中的完整列表)
'eventsIgnore' - 忽略事件的数组(ConstEventType.php 文件中的完整列表)
'tablesOnly' - 仅监听给定表的数组(默认所有表)
'databasesOnly' - 仅侦听给定数据库的数组(默认所有数据库)
'tableCacheSize' - 从信息模式收集一些数据,这些数据被缓存。
'custom' - 如果某些参数必须在扩展/实现自己的类中设置
'heartbeatPeriod' - 设置复制心跳之间的时间间隔(以秒为单位)。每当主服务器的二进制日志有事件更新时,下一次心跳的等待时间就会重置。间隔是一个十进制值,范围为 0 到 4294967 秒,分辨率为毫秒;最小的非零值为 0.001。仅当二进制日志文件中没有超过间隔时间的未发送事件时,主服务器才会发送心跳。
'saveUuid' - 设置从属 uuid 用于识别(默认值:0015d2b6-8a06-4e5e-8c07-206ef3fbd274)
红宝石: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
所有示例都可以在示例目录中找到
此示例将所有复制事件转储到控制台:
请记住更改您的用户、主机和密码的配置。
用户应具有复制权限 [ REPLICATION CLIENT, SELECT]
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 关闭/打开):
=== 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
在虚拟机上测试
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)
首先,MYSQL 不会给你异步调用。您通常需要在应用程序中对此进行编程(通过事件分派并添加到某些队列系统,如果您的数据库有许多入口点,例如 Web、后端其他微服务,向所有这些微服务添加处理并不总是便宜的。但是使用 mysql 复制您可以侦听写入事件并异步处理(最好的组合是将项目添加到某些队列系统,如rabbitmq、redis 或kafka)以及无效缓存、搜索引擎复制、实时分析和审计。
首先,您需要知道可能会发生很多事件,例如,如果您更新表“bar”中的 1 000 000 条记录,并且您需要从表“foo”中插入一条记录,那么所有事件都必须由脚本处理,并且您需要等待数据。这是正常现象,也是如此。您可以使用配置选项来加快速度。另外,如果脚本崩溃,您需要不时从 binlog(或 gtid)中保存位置,以便在再次运行此脚本时从该位置开始,以避免重复。
就像我在1点使用队列系统(如rabbitmq、redis或kafka)中提到的那样,它们将使您能够在多个脚本中处理数据。
创建一个问题,我会在空闲时间尝试解决它:)
它像从属模式下的任何其他 MYSQL 一样工作,并且提供相同的开销。
解决这个问题的最佳方法是将数据库配置net_read_timeout
和net_write_timeout
增加到 3600。(tx Bijimon)
在 my.conf binlog_row_image=full
中设置以修复仅接收部分更新的问题。
在 my.conf 中设置log_slave_updates=on
来修复此问题 (#71)(#66)
默认 MYSQL 设置生成一大块流,这需要更多 RAM/CPU,您可以使用变量binlog_row_event_max_size
更改此设置以获得较小的流 [https://dev.mysql.com/doc/refman/8.0/en/replication-options-binary- log.html#sysvar_binlog_row_event_max_size] 分割成更小的块