docker swarm集群搭建高可用mysql主备
docker swarm集群搭建高可用mysql主备
前提:为了避免mysql单点故障,很有必要引进mysql主备。主和备分别在不同机器,并且需要保持数据一致性
技术:这里用到nginx+mysql+mysql做高可用的主备,利用nginx做反向代理,当其中一台mysql服务器宕机后,自动切换另一台,注意这里不能做负载均衡,因为高并发是有存在问题的。
一,启动docker swarm集群
1,docker stack 配置如下图,如果不会搭建docker swarm 集群的,参考文章:搭建docker swarm高可用集群以及常用命令
#mysql1服务
mysql-1:
image: mysql:5.7
ports:
- 3310:3306
networks:
#指定容器加入的网络
- network
environment:
#最好使用此设定时区,其它静像也可以使用
- TZ=CST-8
#指定mysql的访问密码
- MYSQL_ROOT_PASSWORD=123456
#可以加--default-time-zone='+8:00'设定时区
volumes:
#本地文件目录,持久化
- /home/AuthenticationCenter/new_mysql/mone/data:/var/lib/mysql
#指定开启binlog的配置文件
- /home/AuthenticationCenter/new_mysql/mone/conf/my.cnf:/etc/mysql/my.cnf
command: --character-set-server=utf8
--collation-server=utf8_general_ci
--sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO"
deploy:
placement:
constraints:
#该hostname为指定容器在哪个主机启动
- node.hostname == ecs2d8ed9c368b9
#mysql2服务
mysql-2:
image: mysql:5.7
ports:
- 3311:3306
networks:
#指定容器加入的网络
- network
environment:
#最好使用此设定时区,其它静像也可以使用
- TZ=CST-8
#指定mysql的访问密码
- MYSQL_ROOT_PASSWORD=123456
#可以加--default-time-zone='+8:00'设定时区
volumes:
#本地文件目录挂载,持久化
- /home/AuthenticationCenter/new_mysql/mtwo/data:/var/lib/mysql
#指定开启binlog的配置文件
- /home/AuthenticationCenter/new_mysql/mtwo/conf/my.cnf:/etc/mysql/my.cnf
command: --character-set-server=utf8
--collation-server=utf8_general_ci
--sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO"
deploy:
placement:
constraints:
#该hostname为指定容器在哪个主机启动
- node.hostname == ecseafe0d11214a
#mysql-nginx服务
mysql_nginx:
image: nginx:1.19.2
ports:
- 33060:3306
networks:
- network
volumes:
#本地文件目录
- /home/AuthenticationCenter/new_mysql/nginx/nginx.conf:/etc/nginx/nginx.conf
- /home/AuthenticationCenter/new_mysql/nginx/data:/var/www/html/upload
deploy:
mode: replicated
#这里开启两个副本,防止nginx单点故障
replicas: 2
placement:
constraints: [node.role == manager]
depends_on:
- mysql-1
查找mysql-1和mysql-2的hostname,可以通过manager管理节点执行下面命令查看, 结果如下图
命令:docker nodel ls
mysql-1的my.cnf配置:
[mysqld]
server_id=1
log-bin= mysql-bin
replicate-ignore-db=mysql
replicate-ignore-db=sys
replicate-ignore-db=information_schema
replicate-ignore-db=performance_schema
read-only=0
relay_log=mysql-relay-bin
log-slave-updates=on
auto-increment-offset=1
auto-increment-increment=2
!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/
mysql-2的my.cnf配置:
[mysqld]
server_id=2
log-bin= mysql-bin
replicate-ignore-db=mysql
replicate-ignore-db=sys
replicate-ignore-db=information_schema
replicate-ignore-db=performance_schema
read-only=0
relay_log=mysql-relay-bin
log-slave-updates=on
auto-increment-offset=2
auto-increment-increment=2
!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/
利用nginx做第四层的反向代理,也可以使用Haproxy
nginx的配置如下
user www-data;
worker_processes auto;
pid /run/nginx.pid;
events {
use epoll;
worker_connections 1024;
}
stream {
upstream mysql {
#backup为备用mysql,当mysql-1故障后自动切换mysql-2,达到主备效果,
server mysql-1:3306 max_fails=3 fail_timeout=30s;
server mysql-2:3306 backup;
}
server {
listen 3306;
proxy_connect_timeout 3000s;
proxy_timeout 6000s;
proxy_pass mysql;
}
}
通过命令启动docker swarm 集群: docker stack deploy -c docker-stack-test.yml mysqltest
二,开启mysql主主同步,
1, 在对应的主机执行以下命令,进入mysql-1和mysql-2容器
查看docker的容器id: docker ps -f “name=mysql-1” 或者 docker ps -f “name=mysql-2”
进入容器:docker exec -it (容器ID) /bin/bash (容器ID为下图红框位置)
2, 分别进入mysql-1和mysql-2容器后执行以下命令进入mysql服务 (密码:123456)
进入mysql服务:mysql -u root -p
输入密码:123456
3,mysql-1和mysql-2分别执行以下命令,允许其他slave的 io thread进行监听自己的binlog文件,原理如下图
GRANT REPLICATION SLAVE ON *.* to ‘slave’@’%’ identified by ‘123456’;
4, 执行以下命令记录mysql-1同步的binlog文件状态
show master status;
如下图:记录mysql-bin.000003 和 3825
5,mysql-2执行以下命令,开启IO线程监听mysql-1的binlog文件,黄色信息为mysql-1记录的信息
解释:master_host:这里可以指定容器名,因为在同个docker swarm集群,
master\_password: 访问**mysql-1或者mysql-2**的密码
命令:change master to master_host=’mysql-1’,master_user=’slave’,master_password=’123456’,master_log_file=’mysql-bin.000003’,master_log_pos=3825,master_port=3306;
6,mysql-2 中开启同步
start slave ;
7,记录mysql-2同步的binlog文件状态
show master status;
如下图:记录mysql-bin.000004 和 3161
8,在mysql-1中执行以下命令,黄色信息为mysql-2记录的信息
change master to master_host=’mysql-2’,master_user=’slave’,master_password=’123456’,master_log_file=’mysql-bin.000004’,master_log_pos=3161,master_port=3306;
9,mysql-1开启同步
start slave ;
10,分别在mysql-1和mysql-2中执行以下命令查看是否开启成功。
show slave status\G;
如下图:如果两个都是yes , 说明成功。
疑问:
1,通过进入对应MySQL容器配置MySQL主从配置,下次重启后还需不需要重新配置, 答:不需要重新配置,因为配置文件已经持久化到宿主机了,重启不影响。
2,加入某台MySQL宕机了,当这台MySQL重启后会不会自动同步之前未同步的数据 搭:会的,因为会记录对应master的binlog同步的位置,positon的位置。
#
三,mysql数据恢复
如果当某个MySQL服务器数据丢失了,需要重新做数据恢复,并且需要重新配置MySQL主主,这一块我们下期讲。。。。。。。
还没有评论,来说两句吧...