• 3_docker部署mysql主主备份


    docker部署mysql主主备份

    docker部署mysql主主备份

    docker部署mysql主主备份(keepalived)跨主机自动切换

    docker部署mysql主主备份 haproxy代理(swarm)

    环境准备

    • centos7系统
    • docker环境
    • docker-compose环境

    主主同步原理

    在这里插入图片描述

    ​ 主主复制即在两台MySQL主机内都可以变更数据,而且另外一台主机也会做出相应的变更。聪明的你也许已经想到该怎么实现了。对,就是将两个主从复制有机合并起来就好了。只不过在配置的时候我们需要注意一些问题,例如,主键重复,server-id不能重复等等。

    ​ 两台MySQL之间互为彼此的从库,同时又是主库。这种方案,既做到了访问量的压力分流,同时也解决了“单点故障”问题。任何一台故障,都还有另外一套可供使用的服务。

    主主复制----->互为主从

    预期目标

    搭建一个两主的Mysql环境

    从属关系容器名称服务器端口
    mysql-master1192.168.56.1003306
    mysql-master2192.168.56.1013306

    搭建配置

    主1服务器(56.100)

    开放端口

    主从都需要执行

    firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.56.101" port protocol="tcp" port="3306" accept"
    systemctl restart firewalld.service
    firewall-cmd --list-all
    systemctl restart docker
    
    • 1
    • 2
    • 3
    • 4
    docker-compose.yml
    mkdir -p /home/scsdm/services/mysql
    vi /home/scsdm/services/mysql/docker-compose.yml
    
    • 1
    • 2
    version: '3'
    services:
      node1:
        image: mysql:5.7.23
        hostname: mysql-master1
        container_name: mysql-master1
        restart: always
        ports:
          - "3306:3306"
        network_mode: host
        environment:
          - MYSQL_ROOT_PASSWORD=hancloud1234!
          - TZ=Asia/Shanghai
        volumes:
          - $PWD/mysql_master1/slowSql:/data/mysql
          - $PWD/mysql_master1/data:/var/lib/mysql
          - $PWD/mysql_master1/logs:/var/log/mysql
          - $PWD/mysql_master1/conf/my.cnf:/etc/mysql/my.cnf
        privileged: true
        command: ['mysqld','--character-set-server=utf8mb4', '--collation-server=utf8mb4_unicode_ci','--default-time-zone=+08:00']
      	entrypoint: bash -c "chown -R mysql:mysql /var/log/mysql && exec /entrypoint.sh mysqld"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    配置
    mkdir -p /home/scsdm/services/mysql/mysql_master1/conf
    vi /home/scsdm/services/mysql/mysql_master1/conf/my.cnf
    
    • 1
    • 2
    !includedir /etc/mysql/conf.d/ 
    !includedir /etc/mysql/mysql.conf.d/
    [client]
    default-character-set=utf8
    
    [mysql]
    default-character-set=utf8
    
    [mysqld]
    character-set-server=utf8mb4
    collation-server=utf8mb4_unicode_ci
    default-time-zone=+08:00
    max_connections=1000
    
    # 开启binlog
    log-bin=mysql-bin
    log-bin-index=mysql-bin.index
    # 服务器唯一id,默认值1
    server-id=1
    max_binlog_size=1G
    max_binlog_cache_size=1G
    # 设置日志格式,默认值ROW
    binlog_format=mixed
    expire_logs_days=7
    # 开启慢查询
    slow_query_log=1
    long_query_time=2
    slow_query_log_file=/data/mysql/slow.log
    # 错误日志
    log_error=/var/log/mysql/error.log
    # 设置需要复制的数据库,默认复制全部数据库
    #binlog-do-db=mcp_manager
    # 设置不需要复制的数据库
    binlog-ignore-db=mysql
    binlog-ignore-db=infomation_schema
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    启动主1服务器
    cd /home/scsdm/services/mysql
    # my.cnf 权限不能是777,会被忽略
    chmod 644 /home/scsdm/services/mysql/mysql_master1/conf/my.cnf
    docker-compose up -d
    
    • 1
    • 2
    • 3
    • 4
    进入容器
    #进入容器:env LANG=C.UTF-8 避免容器中显示中文乱码
    docker exec -it mysql-master1 env LANG=C.UTF-8 /bin/bash
    #进入容器内的mysql命令行
    mysql -uroot -p
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    创建用户用于备份
    -- 创建slave用户
    CREATE USER 'slave'@'%';
    -- 设置密码
    ALTER USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY 'hancloud@1234';
    -- 授予复制权限
    GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%';
    -- 刷新权限
    FLUSH PRIVILEGES;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    查看创建的用户信息

    select host,user from mysql.user;
    
    • 1

    在这里插入图片描述

    主机中查询master1状态

    执行完此步骤后不要再操作主服务器MYSQL,防止主服务器状态值变化

    SHOW MASTER STATUS;
    
    • 1

    记下FilePosition的值。

    执行完此步骤后不要再操作主服务器MYSQL,防止主服务器状态值变化。

    在这里插入图片描述

    主2服务器(56.101)

    开放端口

    主从都需要执行

    firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.56.100" port protocol="tcp" port="3306" accept"
    systemctl restart firewalld.service
    firewall-cmd --list-all
    systemctl restart docker
    
    • 1
    • 2
    • 3
    • 4
    docker-compose.yml
    mkdir -p /home/scsdm/services/mysql
    vi /home/scsdm/services/mysql/docker-compose.yml
    
    • 1
    • 2
    version: '3'
    services:
      node1:
        image: mysql:5.7.23
        hostname: mysql-master2
        container_name: mysql-master2
        restart: always
        ports:
          - "3306:3306"
        network_mode: host
        environment:
          - MYSQL_ROOT_PASSWORD=hancloud1234!
          - TZ=Asia/Shanghai
        volumes:
          - $PWD/mysql_master2/slowSql:/data/mysql
          - $PWD/mysql_master2/data:/var/lib/mysql
          - $PWD/mysql_master2/logs:/var/log/mysql
          - $PWD/mysql_master2/conf/my.cnf:/etc/mysql/my.cnf
        privileged: true
        command: ['mysqld','--character-set-server=utf8mb4', '--collation-server=utf8mb4_unicode_ci','--default-time-zone=+08:00']
      	entrypoint: bash -c "chown -R mysql:mysql /var/log/mysql && exec /entrypoint.sh mysqld"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    配置
    mkdir -p /home/scsdm/services/mysql/mysql_master2/conf
    vi /home/scsdm/services/mysql/mysql_master2/conf/my.cnf
    
    • 1
    • 2
    !includedir /etc/mysql/conf.d/ 
    !includedir /etc/mysql/mysql.conf.d/
    [client]
    default-character-set=utf8
    
    [mysql]
    default-character-set=utf8
    
    [mysqld]
    character-set-server=utf8mb4
    collation-server=utf8mb4_unicode_ci
    default-time-zone=+08:00
    max_connections=1000
    
    # 开启binlog
    log-bin=mysql-bin
    log-bin-index=mysql-bin.index
    # 服务器唯一id,默认值1
    server-id=2
    max_binlog_size=1G
    max_binlog_cache_size=1G
    # 设置日志格式,默认值ROW
    binlog_format=mixed
    expire_logs_days=7
    # 开启慢查询
    slow_query_log=1
    long_query_time=2
    slow_query_log_file=/data/mysql/slow.log
    # 错误日志
    log_error=/var/log/mysql/error.log
    # 设置需要复制的数据库,默认复制全部数据库
    #binlog-do-db=mcp_manager
    # 设置不需要复制的数据库
    binlog-ignore-db=mysql
    binlog-ignore-db=infomation_schema
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    启动主2服务器
    cd /home/scsdm/services/mysql
    # my.cnf 权限不能是777,会被忽略
    chmod 644 /home/scsdm/services/mysql/mysql_master2/conf/my.cnf
    docker-compose up -d
    
    • 1
    • 2
    • 3
    • 4
    进入容器
    #进入容器:env LANG=C.UTF-8 避免容器中显示中文乱码
    docker exec -it mysql-master2 env LANG=C.UTF-8 /bin/bash
    #进入容器内的mysql命令行
    mysql -uroot -p
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    创建用户用于备份
    -- 创建slave用户
    CREATE USER 'slave'@'%';
    -- 设置密码
    ALTER USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY 'hancloud@1234';
    -- 授予复制权限
    GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%';
    -- 刷新权限
    FLUSH PRIVILEGES;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    主机中查询master2状态

    执行完此步骤后不要再操作主服务器MYSQL,防止主服务器状态值变化

    SHOW MASTER STATUS;
    
    • 1

    记下FilePosition的值。

    在这里插入图片描述

    配置主2 主
    # 配置主Mysql地址
    CHANGE MASTER TO MASTER_HOST='192.168.56.100', 
    # 配置主Mssql创建的用于备份的用户名和密码和端口
    MASTER_USER='slave',MASTER_PASSWORD='hancloud@1234', MASTER_PORT=3306,
    # 配置主Mssql的binlog日志名称和当前所在位置(上面记录的位置)
    MASTER_LOG_FILE='mysql-bin.000003',MASTER_LOG_POS=959; 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    启动主2复制功能
    START SLAVE;
    
    -- 查看状态(不需要分号)
    SHOW SLAVE STATUS\G
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

    配置主1 主
    # 配置主Mysql地址
    CHANGE MASTER TO MASTER_HOST='192.168.56.101', 
    # 配置主Mssql创建的用于备份的用户名和密码和端口
    MASTER_USER='slave',MASTER_PASSWORD='hancloud@1234', MASTER_PORT=3306,
    # 配置主Mssql的binlog日志名称和当前所在位置(上面记录的位置)
    MASTER_LOG_FILE='mysql-bin.000003',MASTER_LOG_POS=959; 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    启动主1复制功能
    START SLAVE;
    
    -- 查看状态(不需要分号)
    SHOW SLAVE STATUS\G
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

    关闭主主复制
    -- 在从机上执行。功能说明:停止I/O 线程和SQL线程的操作。
    stop slave; 
    
    -- 在从机上执行。功能说明:用于删除SLAVE数据库的relaylog日志文件,并重新启用新的relaylog文件。
    reset slave;
    
    -- 在主机上执行。功能说明:删除所有的binglog日志文件,并将日志索引文件清空,重新开始所有新的日志文件。
    -- 用于第一次进行搭建主从库时,进行主库binlog初始化工作;
    reset master;
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    测试同步

    主1Mysql中创建数据

    CREATE DATABASE mcp_manager;
    USE mcp_manager;
    CREATE TABLE t_user (
     id BIGINT AUTO_INCREMENT,
     uname VARCHAR(30),
     PRIMARY KEY (id)
    );
    INSERT INTO t_user(uname) VALUES('xiaohong');
    INSERT INTO t_user(uname) VALUES('xiaoming');
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    查看数据库

    在这里插入图片描述

    在这里插入图片描述

    主2Mysql中新增数据

    INSERT INTO t_user(uname) VALUES('xiaohong2');
    INSERT INTO t_user(uname) VALUES('xiaoming2');
    
    • 1
    • 2

    查看数据库

    在这里插入图片描述

    在这里插入图片描述

    脚本模式

    tar -zcvf mysqlPackage.tar.gz ./mysqlPackage
    
    • 1

    脚本文件地址 :

    链接:https://pan.baidu.com/s/1ezBfa3WDYG3-Ur3NDbLvCA
    提取码:1234

    前提:

    1、上传

    将文件 mysqlPackage主主.zip上传到服务器上

    2、解压
    unzip mysqlPackage主主.zip
    
    • 1
    3、修改配置

    修改mysqlPackage文件夹里面的install.conf配置

    #安装之前需要配置如下信息
    master1Ip="192.168.56.100"
    master2Ip="192.168.56.101"
    base_dir="/home/scsdm/services/mysql"
    
    • 1
    • 2
    • 3
    • 4
    • master1Ip: 主1节点ip
    • master2Ip: 主2节点ip
    • base_dir: 安装的根目录
    4、开始执行

    主1服务器

    cd mysqlPackage
    chmod +x install.sh
    ./install.sh
    
    • 1
    • 2
    • 3

    主1执行后到主2

    主2服务器

    cd /root/mysqlPackage
    chmod +x installMaster2.sh
    ./installMaster2.sh
    
    • 1
    • 2
    • 3

    安装过程中如有停顿等待输入,输入yes即可

    在这里插入图片描述

    5、检查是否安装是否成功

    (1)在主1服务器执行下面的命令查看

    docker exec -i mysql-master1 bash -c "mysql -uroot -phancloud1234! -e \"SHOW SLAVE STATUS\G\"" | grep "Slave_SQL_Running:"
    docker exec -i mysql-master1 bash -c "mysql -uroot -phancloud1234! -e \"SHOW SLAVE STATUS\G\"" | grep "Slave_IO_Running:"
    
    • 1
    • 2

    (2)在主2服务器执行下面的命令查看

    docker exec -i mysql-master2 bash -c "mysql -uroot -phancloud1234! -e \"SHOW SLAVE STATUS\G\"" | grep "Slave_SQL_Running:"
    docker exec -i mysql-master2 bash -c "mysql -uroot -phancloud1234! -e \"SHOW SLAVE STATUS\G\"" | grep "Slave_IO_Running:"
    
    • 1
    • 2
  • 相关阅读:
    【制作数字人】零门槛通过三维重建技术生成个人三维模型
    Wpf知识小结
    【OpenCV实战】一小时就学会了人脸识别项目,我居然被老板重用了...(python+opencv)
    mmlab 做实验
    Python之Pands数据分析,从0到掌握
    坚鹏:中国邮政储蓄银行金融科技前沿技术发展与应用场景第4期
    【基础篇】ClickHouse 表引擎之集成Kafka
    C语言19弹--交换数组元素
    机器学习面试中常见问题整理
    【Linux】gcc和g++的区别
  • 原文地址:https://blog.csdn.net/qq_36120342/article/details/127731904