主主复制,就是在mariadb主从架构上让mariadb主实现监测从的日志变化,从而实现两台机器相互同步。
-
拉取mariadb镜像
docker pull mariadb
-
创建好数据卷及相关文件
L--Docker_MariaDB_HAProxy L--haproxy L--haroxy.cfg L--logs L--mariadb1 L--conf.d L--data L--mariadb2 L--conf.d L--data
-
运行容器1
docker run --name mariadb1 -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=mydata -dit -p 33071:3306 -v /home/lxj/DockerFile_test/Docker_MariaDB_HAProxy/mariadb1/data:/var/lib/mysql -v /home/lxj/DockerFile_test/Docker_MariaDB_HAProxy/mariadb1/log:/var/log/mysql -h mariadb1 mariadb
-
进入容器1执行(添加备份的账号)
docker exec -it master /bin/bash mysql -uroot -p123456 MariaDB [(none)]> grant replication slave on *.* to 'backup'@'%' identified by '123456'; MariaDB [(none)]> flush privileges;
-
从容器中拷贝一份mariadb配置文件
sudo docker cp mariadb1:/etc/mysql/my.cnf /home/lxj/DockerFile_test/Docker_MariaDB_HAProxy/mariadb1/conf.d/my.cnf
-
修改my.cnf,在 [mysqld] 节点下添加
[mysqld] server-id = 101 log_bin = mysql-bin binlog_do_db = mydata bind-address = 0.0.0.0 character_set_server = utf8 collation_server = utf8_general_ci
-
复制my.cnf并覆盖mariadb1中的my.cnf
docker cp /home/lxj/DockerFile_test/Docker_MariaDB_HAProxy/mariadb1/conf.d/my.cnf mariadb1:/etc/mysql/my.cnf
-
重启容器1
docker restart mariadb1
-
运行主容器2
docker run --name mariadb2 -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=mydata -dit -p 33072:3306 -v /home/lxj/DockerFile_test/Docker_MariaDB_HAProxy/mariadb2/data:/var/lib/mysql -v /home/lxj/DockerFile_test/Docker_MariaDB_HAProxy/mariadb2/log:/var/log/mysql -h mariadb2 mariadb
-
进入主容器2执行(添加备份的账号)
MariaDB [(none)]> grant replication slave on *.* to 'backup'@'%' identified by '123456'; MariaDB [(none)]> flush privileges;
-
拷贝一份MariaDB配置文件
sudo docker cp mariadb2:/etc/mysql/my.cnf /home/lxj/DockerFile_test/Docker_MariaDB_HAProxy/mariadb2/conf.d/my.cnf
-
修改my.cnf,在 [mysqld] 节点下添加
[mysqld] server-id = 102 log_bin = mysql-bin binlog_do_db = mydata bind-address = 0.0.0.0 character_set_server = utf8 collation_server = utf8_general_ci
-
复制my.cnf并覆盖mariadb2中的my.cnf
docker cp /home/lxj/DockerFile_test/Docker_MariaDB_HAProxy/mariadb2/conf.d/my.cnf mariadb2:/etc/mysql/my.cnf
-
重启容器2
docker restart mariadb2
-
连接两个docker容器
# 提取容器mariadb2的ip地址 mariadb2ip=$(docker inspect --format '{{ .NetworkSettings.IPAddress }}' mariadb2) # 添加mariadb2的ip到mariadb1中的hosts文件中 docker exec -i mariadb1 sh -c "echo '$mariadb2ip mariadb2 mariadb2' >> /etc/hosts" # 提取容器mariadb1的ip地址 mariadb1ip=$(docker inspect --format '{{ .NetworkSettings.IPAddress }}' mariadb1) # 添加mariadb1的ip到mariadb2中的hosts文件中 docker exec -i mariadb2 sh -c "echo '$mariadb1ip mariadb1 mariadb1' >> /etc/hosts" # 确认上面的命令是否成功执行 docker exec -i mariadb1 sh -c "cat /etc/hosts" docker exec -i mariadb2 sh -c "cat /etc/hosts" # 确认容器是否链接成功 保证连接成功之后再进行接下里的操作 docker exec -ti mariadb2 sh -c "ping mariadb1" docker exec -ti mariadb1 sh -c "ping mariadb2"
如果出现ping not find的话进入容器执行
apt-get update
然后安装ping工具
apt-get install iputils-ping
-
进入容器1执行
MariaDB [(none)]> SHOW MASTER status;
-
查找master的log文件及其地址
如File 为master-bin.000005 Position为4719
-
进入容器2执行
MariaDB [(none)]> SHOW MASTER status;
-
查找master2的log文件及其地址
如File 为master2-bin.000001 Position为330
-
容器1执行
MariaDB [(none)]> change master to MASTER_HOST='mariadb2', master_user='root', master_password='123456', master_log_file='master2-bin.000001', MASTER_LOG_POS=330; MariaDB [(none)]> start SLAVE; MariaDB [(none)]> show slave status;
-
容器1执行
MariaDB [(none)]> change master to MASTER_HOST='mariadb1', master_user='root', master_password='123456', master_log_file='master-bin.000005', MASTER_LOG_POS=4719; MariaDB [(none)]> start SLAVE; MariaDB [(none)]> show slave status;
-
查看结果
当结果中的Slave_IO_Running与Slave_SQL_Running都为Yes时表示配置成功。
-
进行测试
在任意一个容器的mydata数据库中做增删改操作,另一个数据库中进行了通过,说明主主互备已经成功
部署成功
-
准备日志收集容器
docker pull voxxit/rsyslog docker run --name haproxy-logger -dit -h haproxy-logger -v /home/lxj/DockerFile_test/Docker_MariaDB_HAProxy/logs:/var/log/ voxxit/rsyslog
-
准备HAProxy容器
准备配置文件haproxy.cfg
global log haproxy-logger local0 notice # user haproxy # group haproxy defaults log global retries 2 timeout connect 3000 timeout server 5000 timeout client 5000 listen mysql-cluster bind 0.0.0.0:3306 mode tcp option tcp-check balance roundrobin server mariadb1 mariadb1:3306 check server mariadb2 mariadb2:3306 check listen mysql-clusterstats bind 0.0.0.0:8080 mode http stats enable stats uri / stats realm Strictly\ Private stats auth status:keypas5
-
启动HAProxy容器
docker run --name mysql-cluster -dit -h mysql-cluster --link mariadb1:mariadb1cl --link mariadb2:mariadb2cl --link haproxy-logger:haproxy-loggercl -v /home/lxj/DockerFile_test/Docker_MariaDB_HAProxy/haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro -p 33070:3306 -p 38080:8080 haproxy:latest
-
确认容器是否工作正常
运行
docker ps
如果四个容器工作正常,说明服务启动正常。 -
egg连接及测试
具体查看egg.js连接操作MariaDB,这里给出配置信息:
config.sequelize = { dialect: 'mysql', host: '127.0.0.1', port: 33070,//此处为HAProxy的mysql端口而非监听端口 password: '123456', database: 'mydata', timezone: '+08:00', };
在代码中具体操作主主能够互备,停掉任意一个容器,服务依旧能够运行表示部署成功。
-
容器还原
只需根据备份主库原有数据内容和本节内容即可完成容器的主主互备的还原。
-
注意
如果容器重启之后,请先执行本节的容器连接部分内容(应该能指定容器的ip地址,然后创建数据卷保存下来,使该步再重启之后不用执行),并完成互为从库的配置即可。容器重启的顺序为mariadb1=mariadb2>haproxy-logger>mysql-cluster。