基于 docker 的 mariadb 多源复制实践
本文介绍如何使用 docker 运行多个 mariadb 实例,并双向数据同步。
docker 运行 mariadb
docker run -p 2000:3306 --name mariadb -e MYSQL_ROOT_PASSWORD=123456 -itd mariadb:latest
修改 mariadb 自增
修改 /etc/mysql/my.cnf 搜索 auto_increment_increment,本文使用的是 10.2.13 在 my.conf 的 115 行附近找到了,修改后如下:
server-id = 1
report_host = master1
auto_increment_increment = 2
auto_increment_offset = 1
log_bin = /var/log/mysql/mariadb-bin
log_bin_index = /var/log/mysql/mariadb-bin.index
slave-skip-errors=all
binlog-do-db = ssyer
binlog-ignore-db = mysql
# not fab for performance, but safer
sync_binlog = 1
expire_logs_days = 10
max_binlog_size = 100M
# slaves
relay_log = /var/log/mysql/relay-bin
relay_log_index = /var/log/mysql/relay-bin.index
relay_log_info_file = /var/log/mysql/relay-bin.info
log_slave_updates
#read_only
这里,请注意 auto_increment_increment 和 auto_increment_offset 两个参数 如果设置了 ID 自增,那么当两个数据库同步的时候完全可能重复,这时候就很有用了,auto_increment_increment 是指每次增加的数字,一般你有几台服务器做同步你就设置为几,auto_increment_offset 是指 id 的初始值,比如 auto_increment_increment 均为 3, A 服务器 auto_increment_offset 为 1, B 服务器为 2,C 服务器为 3,那么 A 服务器生成的 id 则是 1、4、7、10 B 服务器是 2、5、8、11 C 服务器则是 3、6、9、12 三台互相同步后则是 1-12 完美解决 id 冲突。
log_slave_updates 这项需要去掉注释,不然更新数据不同步, slave-skip-errors=all 是指如果同步过程发生了错误则忽略错误继续同步。binlog-do-db = test 是指需要同步的数据库名字,可以有多个,binlog-ignore-db = mysql 是指忽略的数据库名字,mariadb 多源复制要求不能有同名数据库,但已经忽略了默认的。
mariadb 新建同步账号
执行完以上命令,会创建一个用户 test 密码 test 并允许在所有机器上连接,你也可以指定 % 是别的值。然后在创建一个 docker 实例 B 映射到本机的 2001 端口并重复以上操作,但记得修改 my.conf 比如 server_id report_host 等等。假设先前创建的是 A,现在进入 A 实例并执行:show master status; 记录下 Position 、File 的值也可以再打开一个终端一起操作。然后登录 B 执行:
这里的 mariadb-bin.000001 以及 1511 是 A 服务器上 show master status 返回的 File、Position 然后在 A 服务器上执行相同的操作即可。如果 show all slaves status\G; 返回的数据里有:
说明一切正常,可以同步。然后试试在 test 数据库里新建一个 tables 看看 另一个数据库里是否也会出现:
create table test (id int unsigned NOT NULL AUTO_INCREMENT, PRIMARY KEY ( id ), name varchar(32) ) CHARACTER SET utf8;
如果出现,再试试插入数据,更新数据,删除数据。比如: