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才算成功:


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:
      ip绑定成功

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

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

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容