环境准备     

  Mysql01

**.**.**.**

  Mysql02

**.**.**.**

  Vip 

**.**.**.**

       注意:需要设置SELINUX及防火墙

       #setenforce 0

       编辑/etc/selinux/config文件,将SELINUX值修改为disabled
       防火墙允许端口:3306/4444/4567/4568或关闭防火墙

      firewall-cmd --zone=public --add-port=3306/tcp --permanent (--permanent永久生效,没有此参数重启后失效)
      systemctl disable firewalld && systemctl stop firewalld

一、安装mysql

1、在mysql01和mysql02上分别安装docker,安装docker的步骤略

2、编写docker-yml文件,首先先创建mysql相关文件夹:mkdir -p /opt/fit2cloud/data/mysqldb /opt/fit2cloud/conf,其次在fit2cloud目录下新建docker-compose.yml文件

docker-compose.yml

version: '3'

services:

  mysql:

    image: mysql:5.7.24

container_name: mysql

    ports:

      - 3306:3306

env_file:

     - ./conf/mysql.env

    volumes:

      - /opt/fit2cloud/conf/my.cnf:/etc/mysql/conf.d/my.cnf

      - /opt/fit2cloud/data/mysqldb:/var/lib/mysql

   networks:

     - cmp-network

networks:

cmp-network:

3.编写配置文件my.cnf和mysql.env

my.cnf

[mysqld]

data=/var/lib/mysql


default-storage-engine=INNODB

character_set_server=utf8

lower_case_table_names=1    #不区分大小写

symbolic-links=0

query_cache_size=16M

thread_cache_size=8

table_open_cache=128

max_connections=600

innodb_file_per_table=1

bind-address=0.0.0.0    #允许远程访问此数据库


sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION


server-id=1 #本机序列号,1代表Master  mysql02改为2

log-bin=mysql-bin   #打开二进制日志

binlog-do-db=fit2cloud 

replicate-do-db=fit2cloud   #需要复制的数据库

binlog-ignore-db=mysql

binlog-ignore-db=information_schema

binlog-ignore-db=performance_schema

binlog-ignore-db=sys

log-slave-updates

slave-skip-errors=all

sync_binlog=1

auto_increment_increment=2

auto_increment_offset=1    #mysql02改为2

skip-name-resolve   #禁止MySQL对外部连接进行DNS解析,使用这一选项可以消除MySQL进行DNS解析的时间。


binlog_format=ROW

relay_log=mysql-relay-bin

master_info_repository=TABLE

relay_log_info_repository=TABLE

relay_log_recovery=ON


[mysql]

default-character-set=utf8


[mysql.server]

default-character-set=utf8

        注意:relay-log中继日志是连接master和slave的核心,relay-log的结构和binlog非常相似,只不过他多了一个master.info和relay-log.info的文件。master.info记录了上一次读取到master同步过来的binlog的位置,以及连接master和启动复制必须的所有信息。relay-log.info记录了文件复制的进度,下一个事件从什么位置开始,由sql线程负责更新.避免宕机后mysql主主同步无法自动同步更新,还需手动配置

mysql.env

MYSQL_ROOT_PASSWORD=123456

chk_mysql_port.sh

#!/bin/sh

counter=$(netstart -na|grep "LISTEN"|grep "3306"|wc -l)


if ["${counter}" -eq 0 ]; then
      systemctl stop keepalived
fi

4、启动mysql

docker go iris 部署 docker部署keepalived_docker

     # cd /opt/fit2cloud

     # docker-compose up -d

5、同样的方法启动mysql02

在启动mysql02的数据库之前,需要修改my.cnf的配置文件,需要修改server-id和auto_increment_offset的参数

二、配置mysql01同步mysql02

1、进入到mysql01的容器中    

2、创建mysql的同步账号,该同步账号主要是给MySQL02使用

3、查看mysql01的master状态,并记录mater_log_file和master_log_pos的值,在mysql02中执行同步命令时候需要用到

docker go iris 部署 docker部署keepalived_mysql_02

4、进入mysql02,在mysql2中执行同步命令

# docker exec -it mysql mysql -uroot -p123456

mysql>flush table with read lock\G   #锁表

mysq>change master to master_host='192.168.0.120', master_user='clusteruser', master_password='123456', master_log_file='mysql-bin.000001', master_log_pos=154;

mysql>start slave;       #开启同步

mysql>show slave status\G        #查看同步状态

mysql>unlock tables;       #解锁

docker go iris 部署 docker部署keepalived_docker_03

三、配置mysql02同步到mysql01

1、进入到mysql01的容器中

2、创建mysql的同步账号,该同步账号主要是给MySQL01使用,建议同mysql01设置成一样,否则容易搞混淆

3、查看mysql02的master状态

docker go iris 部署 docker部署keepalived_mysql_04

4、进入mysql02,在mysql2中执行同步命令

# docker exec -it mysql mysql -uroot -p123456

mysql>flush table with read lock\G       #先锁表再配置同步

mysq>change master to master_host='192.168.0.121', master_user='clusteruser', master_password='123456', master_log_file='mysql-bin.000004', master_log_pos=1070;

mysql>start slave;       #开启同步

mysql>show slave status\G        #查看同步状态

mysql>unlock tables;       #解锁

docker go iris 部署 docker部署keepalived_docker_05

四、安装keepalived并配置

1、通过yum安装keepalived

2、修改keepalived配置文件vim /etc/keepalived/keepalived.conf

keepalived.conf

! Configuration File for keepalived

global_defs {

notification_email {

test@test.com

}

notification_email_from admin@test.com

smtp_server 127.0.0.1

smtp_connect_timeout 30

router_id MYSQL_HA #标识,双主相同

}

vrrp_instance VI_1 {

state BACKUP #两台都设置BACKUP

interface ens33     #本机业务网卡名称

virtual_router_id 51 #主备相同

priority 100 #优先级,backup设置90

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

virtual_ipaddress {

192.168.0.119     #VIP

}

}

virtual_server 192.168.0.119 3306 {     #VIP

delay_loop 2

#lb_algo rr #LVS算法,用不到,我们就关闭了

#lb_kind DR #LVS模式,如果不关闭,备用服务器不能通过VIP连接主MySQL

persistence_timeout 50 #同一IP的连接60秒内被分配到同一台真实服务器

protocol TCP

real_server 192.168.0.120 3306 {    #本机实际IP

weight 3

notify_down /opt/fitcloud/script/chk_mysql_port.sh #当mysq服down时,执行此脚本,杀死keepalived实现切换

TCP_CHECK {

connect_timeout 3 #连接超时

nb_get_retry 3 #重试次数

delay_before_retry 3 #重试间隔时间

}

}

}

4、启动keepalived,确认为Running,请输入ip,查看绑定网卡上是否有绑定的VIP

docker go iris 部署 docker部署keepalived_sql_06

docker go iris 部署 docker部署keepalived_docker_07

  

5、重复上述操作启动mysql02的keepalived