Docker:MariaDB/Mysql的主主互备高可用方案(MariaDB/Mysql+HAProxy)

7 篇文章 0 订阅
2 篇文章 0 订阅

主主复制,就是在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。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值