基于docker的mariadb多源复制实践

去年加入 ssyer.com 我也从Android工程师变身服务端工程师,从此再也不用考虑是否偏移了一两个像素,哈哈。不过随着业务的增大,我们需要在香港部署一套,很显然,香港这套系统需要和国内的系统同步数据,简单的说就是互相同步,至于数据库选型,似乎除了mariadb也没有更好的选择,Percona或许也不错,但我更相信原班人马的力量。

下面进入主题,首先我们需要安装docker,然后下载mariadb的镜像,接着run一个实例,最后实现多源复制。

首先,安装docker:sudo apt install docker.io

接下来,我们运行一个 mariadb 实例:

docker run -p 2000:3306 --name mariadb -e MYSQL_ROOT_PASSWORD=123456 -itd docker.io/mariadb:latest

这里 123456 是数据库 root 用户的密码,2000是本机端口,-p 2000:3306 指将本机的 2000 端口映射到 docker 实例的 3306 端口。

接着进入这个 docker:sudo docker exec -it mariadb /bin/bash

然后配置my.conf:vim /etc/mysql/my.cnf

搜索 auto_increment_increment ,本文使用的是 10.2.13 在 my.conf 的 115 行附近找到了

# The following can be used as easy to replay backup logs or for replication.
# note: if you are setting up a replication slave, see README.Debian about

然后改为:

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 = ssyer 是指需要同步的数据库名字,可以有多个,binlog-ignore-db = mysql 是指 忽略的 数据库名字,mariadb 多源复制 要求不能有同名数据库,但已经忽略了默认的。

退出并重启 docker:先 exit 退出 docker 实例,然后 sudo docker restart mariadb

然后重新进入 docker:sudo docker exec -it mariadb /bin/bash

接着进入 mysql 控制台:mysql -u root -p,并执行:

create database ssyer;
grant replication slave on *.* TO 'ssyer'@'%' identified BY 'ssyer';

执行完以上命令,会创建一个用户 ssyer 密码 ssyer 并允许在所有机器上连接,你也可以指定 % 是别的值。然后在创建一个 docker 实例B 映射到本机的 2001 端口并重复以上操作,但记得修改 my.conf 比如 server_id report_host 等等。假设先前创建的是A,现在进入A实例并执行:show master status;  记录下 Position 、File 的值也可以再打开一个终端一起操作。然后登录 B 执行

change master 'm1' to MASTER_HOST='192.168.1.105', MASTER_PORT=2000, MASTER_USER='ssyer',MASTER_PASSWORD='ssyer', MASTER_LOG_FILE = 'mariadb-bin.000001', MASTER_LOG_POS=1511;
start all slaves;
show all slaves status\G;

这里的 mariadb-bin.000001 以及 1511 是 A 服务器上 show master status 返回的 File、Position 然后在A服务器上执行相同的操作即可。如果 show all slaves status\G; 返回的数据里有:

Slave_IO_Running: Yes
Slave_SQL_Running: Yes

说明一切正常,可以同步。然后试试在ssyer数据库里新建一个tables 看看 另一个数据库里是否也会出现:

create table test (id int unsigned NOT NULL AUTO_INCREMENT, PRIMARY KEY ( id ), name varchar(32) ) CHARACTER SET utf8;

如果出现,再试试插入数据,更新数据,删除数据。比如:

insert into test (name) values ('haha');
update test set name = 'delete' where id = 1;

OK,今天就到这里了。

 

本博客若无特殊说明则由 full-stack-trip 原创发布
转载请点名出处:全栈之旅 > 基于docker的mariadb多源复制实践
本文地址:https://www.kpromise.top/mariadb-muiltil-source-replication/

发表评论

电子邮件地址不会被公开。 必填项已用*标注