环境准备
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 |
4、启动mysql
# 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中执行同步命令时候需要用到
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; #解锁 |
三、配置mysql02同步到mysql01
1、进入到mysql01的容器中
2、创建mysql的同步账号,该同步账号主要是给MySQL01使用,建议同mysql01设置成一样,否则容易搞混淆
3、查看mysql02的master状态
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; #解锁 |
四、安装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
5、重复上述操作启动mysql02的keepalived