docker mysql +GTID双主+keepalived

基本思路:
先停掉原mysql,把这个文件夹压缩了传到另一台机器。
然后解压,用docker直接挂载解压后的文件夹。
机器1:192.168.10.2
机器2:192.168.10.3

一,两个库的准备

    1. 采用离线备份文件夹的方式先停原mysql,然后把文件夹压缩了(我这里该文件夹名为bak1223,里面包含了所有的数据文件和日志文件,所以只用传输这一个文件夹即可)
      tar -zcvf bak1223.tar.gz ./bak1223/
    1. 解压到data目录下,去掉前导目录(相当于换了原文件夹名称)
      tar -xzvf bak1223.tar.gz --strip-components 2 -C ./data
    1. 采用GTID模式配置my.cnf (在我这里取名为 hl.cnf ,把他放在宿主机上,然后通过docker volumes挂载到配置文件目录下面即可)
[mysqld]
lower_case_table_names=1
max_connections=1024
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
default-time_zone = '+8:00'

log-bin = /var/lib/mysql/mysql-bin.log
expire-logs-days = 5
max-binlog-size = 1024M
server-id = 1  #第一台机器填1 第二台机器填2
#log_slave_updates=true    #MySQL5.7可以不启用此参数,5.7版本使用了gtid_executed表记录同步复制的信息,避免两次写入relay-log和binlog,降低了从库磁盘I/O
gtid_mode=on
enforce_gtid_consistency=ON
slave_parallel_type=logical_clock #MySQL5.7新增加的值,配置基于表的组提交并行复制,默认值为database(基于库进行多线程复制,MySQL5.6是基于库的方式进行多线程方式复制)建议改为logical_clock,基于表的组方式复制,提高复制的效率。

replicate-ignore-db = mysql                                            
replicate-ignore-db = information_schema
replicate-ignore-db = performance_schema
  • 3.1 注意,如果是按照冷备份直接拷贝文件夹的方式,还需要改data/auto.cnf
    把里面的server-uuid改为两机器不一样

  • 4.编辑docker_compose.yml

mysql: 
    image: sameersbn/mysql:5.7.26-0
    restart: always
    container_name: mysql57
    volumes:
        - /mnt/data:/var/lib/mysql
        - /mnt/conf/hualv.conf:/etc/mysql/mysql.conf.d/hl.cnf
    ports:
        - "3306:3306"
    environment:         
        - MYSQL_ROOT_PASSWORD=xx66xxx123

PS:注意yml的格式,key:[空格]value,key冒号后面要加空格。 另外每一行通过空格来区分层次关系

  • 5.两台机器都按照上面把cnf和yml配好,配置的不同的地方已经在注释中写明。然后启动mysql:
docker-compose pull && docker-compose up -d

二、配置GTID模式的双主

    1. 创建复制账号
      在两个mysql上分别执行,注意要创建不同的用户名
      注:可以把'%'改为对方ip,进行精细权限控制
机器1mysql>grant replication client,replication slave on *.* to repl103@'%' IDENTIFIED BY '123asd!@#ASD';
mysql> flush privileges;
机器2mysql>grant replication client,replication slave on *.* to repl102@'%' IDENTIFIED BY '123asd!@#ASD';
mysql> flush privileges;
    1. GTID不用再对齐binlog同步点
      所以不用再记录show master status 的结果
      在下面的主从连接配置中(各自配置对方的用户名):
---机器1mysql>
change master to master_host='192.168.10.3', master_user='repl102', master_password='123asd!@#ASD', master_port=3306, master_auto_position=1;
---机器1mysql>
reset slave;
start slave;

---机器2mysql>
change master to master_host='192.168.10.2', master_user='repl103', master_password='123asd!@#ASD', master_port=3306, master_auto_position=1;
reset slave;
start slave;

配置完以后,要两个Yes才算成功:


docker mysql +GTID双主+keepalived_第1张图片
SHOW SLAVE STATUS

然后可以检查一下是否双主同步成功:


三、配置虚拟IP漂移

  • 8 .安装keepalived
    centos :yum -y install keepalived

    ubuntu:apt-get -y install keepalived

vi /etc/keepalived/keepalived.conf

vrrp_script chk_mysql {     #检测mysql服务是否在运行。有很多方式,比如进程,用脚本检测等等
    script "/opt/chk_mysql.sh"   #这里通过脚本监测(见9.1)
    interval 2                   #脚本执行间隔,每2s检测一次
    weight -5                    #脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级 -5
    fall 2                    #检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间)
    rise 1                    #检测1次成功就算成功。但不修改优先级
}
vrrp_instance VI_1 {
    state MASTER  #机器1写 MASTER 机器2写BACKUP
    interface ens18  #指定虚拟ip的网卡接口, 根据ifconfig确定
    virtual_router_id 57 #路由器标识,MASTER和BACKUP必须是一致的
    priority 100 #定义优先级,数字越大,优先级越高,在同一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优先级。这样MASTER故障恢复后,就可以将VIP资源再次抢回来
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 111
    }
    virtual_ipaddress {
        192.168.10.10
    }
    track_script {
       chk_mysql
    }
}

如上配置,两台机器只有两个地方不一样,一是state ;二是priority 。

  • 9.1 检测mysql是否存活
    前置条件:宿主机安装了mysql客户端:sudo apt-get install mysql-client
    vi /opt/chk_mysql.sh
#! /bin/bash
#! /bin/bash
MYSQL_PASS=XX66xxx123
MYSQL_PING=`mysqladmin -u root -p${MYSQL_PASS} -h192.168.10.3 ping`
MYSQL_OK="mysqld is alive"

if [[ "$MYSQL_PING" != "$MYSQL_OK" ]]
    then
        echo "mysql not ok"
        docker restart mysql57
        sleep 5 
        if [[ "$MYSQL_PING" != "$MYSQL_OK" ]]
         then    
            killall keepalived    
         fi   
    else
        echo "mysql is ok"
fi

给脚本加上执行权限:
chomod +x chk_mysql.sh
注意修改对应mysql的ip。

    1. 启动keepalived(两台机器都要启动)
      systemctl start keepalived
    1. 验证虚拟ip是否正常
      在机器1上(MASTER),ip addr:
      docker mysql +GTID双主+keepalived_第2张图片
      ip绑定成功

可以看到,除了原本自己的10.2,还多了一个10.10

通过mysql客户端可以直接连接IP:10.10

至此,全部配置完毕,想要验证高可用就自行启停机器试试吧。

你可能感兴趣的:(docker mysql +GTID双主+keepalived)