docker swarm集群搭建高可用mysql主备

£神魔★判官ぃ 2022-12-28 11:22 624阅读 0赞

docker swarm集群搭建高可用mysql主备

前提:为了避免mysql单点故障,很有必要引进mysql主备。主和备分别在不同机器,并且需要保持数据一致性

技术:这里用到nginx+mysql+mysql做高可用的主备,利用nginx做反向代理,当其中一台mysql服务器宕机后,自动切换另一台,注意这里不能做负载均衡,因为高并发是有存在问题的。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjUzMzg1Ng_size_16_color_FFFFFF_t_70

一,启动docker swarm集群

1,docker stack 配置如下图,如果不会搭建docker swarm 集群的,参考文章:搭建docker swarm高可用集群以及常用命令

  1. #mysql1服务
  2. mysql-1:
  3. image: mysql:5.7
  4. ports:
  5. - 3310:3306
  6. networks:
  7. #指定容器加入的网络
  8. - network
  9. environment:
  10. #最好使用此设定时区,其它静像也可以使用
  11. - TZ=CST-8
  12. #指定mysql的访问密码
  13. - MYSQL_ROOT_PASSWORD=123456
  14. #可以加--default-time-zone='+8:00'设定时区
  15. volumes:
  16. #本地文件目录,持久化
  17. - /home/AuthenticationCenter/new_mysql/mone/data:/var/lib/mysql
  18. #指定开启binlog的配置文件
  19. - /home/AuthenticationCenter/new_mysql/mone/conf/my.cnf:/etc/mysql/my.cnf
  20. command: --character-set-server=utf8
  21. --collation-server=utf8_general_ci
  22. --sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO"
  23. deploy:
  24. placement:
  25. constraints:
  26. #该hostname为指定容器在哪个主机启动
  27. - node.hostname == ecs2d8ed9c368b9
  28. #mysql2服务
  29. mysql-2:
  30. image: mysql:5.7
  31. ports:
  32. - 3311:3306
  33. networks:
  34. #指定容器加入的网络
  35. - network
  36. environment:
  37. #最好使用此设定时区,其它静像也可以使用
  38. - TZ=CST-8
  39. #指定mysql的访问密码
  40. - MYSQL_ROOT_PASSWORD=123456
  41. #可以加--default-time-zone='+8:00'设定时区
  42. volumes:
  43. #本地文件目录挂载,持久化
  44. - /home/AuthenticationCenter/new_mysql/mtwo/data:/var/lib/mysql
  45. #指定开启binlog的配置文件
  46. - /home/AuthenticationCenter/new_mysql/mtwo/conf/my.cnf:/etc/mysql/my.cnf
  47. command: --character-set-server=utf8
  48. --collation-server=utf8_general_ci
  49. --sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO"
  50. deploy:
  51. placement:
  52. constraints:
  53. #该hostname为指定容器在哪个主机启动
  54. - node.hostname == ecseafe0d11214a
  55. #mysql-nginx服务
  56. mysql_nginx:
  57. image: nginx:1.19.2
  58. ports:
  59. - 33060:3306
  60. networks:
  61. - network
  62. volumes:
  63. #本地文件目录
  64. - /home/AuthenticationCenter/new_mysql/nginx/nginx.conf:/etc/nginx/nginx.conf
  65. - /home/AuthenticationCenter/new_mysql/nginx/data:/var/www/html/upload
  66. deploy:
  67. mode: replicated
  68. #这里开启两个副本,防止nginx单点故障
  69. replicas: 2
  70. placement:
  71. constraints: [node.role == manager]
  72. depends_on:
  73. - mysql-1

查找mysql-1mysql-2hostname,可以通过manager管理节点执行下面命令查看, 结果如下图

命令:docker nodel ls

20201216201624957.png

mysql-1的my.cnf配置:

  1. [mysqld]
  2. server_id=1
  3. log-bin= mysql-bin
  4. replicate-ignore-db=mysql
  5. replicate-ignore-db=sys
  6. replicate-ignore-db=information_schema
  7. replicate-ignore-db=performance_schema
  8. read-only=0
  9. relay_log=mysql-relay-bin
  10. log-slave-updates=on
  11. auto-increment-offset=1
  12. auto-increment-increment=2
  13. !includedir /etc/mysql/conf.d/
  14. !includedir /etc/mysql/mysql.conf.d/

mysql-2的my.cnf配置:

  1. [mysqld]
  2. server_id=2
  3. log-bin= mysql-bin
  4. replicate-ignore-db=mysql
  5. replicate-ignore-db=sys
  6. replicate-ignore-db=information_schema
  7. replicate-ignore-db=performance_schema
  8. read-only=0
  9. relay_log=mysql-relay-bin
  10. log-slave-updates=on
  11. auto-increment-offset=2
  12. auto-increment-increment=2
  13. !includedir /etc/mysql/conf.d/
  14. !includedir /etc/mysql/mysql.conf.d/

利用nginx做第四层的反向代理,也可以使用Haproxy

nginx的配置如下

  1. user www-data;
  2. worker_processes auto;
  3. pid /run/nginx.pid;
  4. events {
  5. use epoll;
  6. worker_connections 1024;
  7. }
  8. stream {
  9. upstream mysql {
  10. #backup为备用mysql,当mysql-1故障后自动切换mysql-2,达到主备效果,
  11. server mysql-1:3306 max_fails=3 fail_timeout=30s;
  12. server mysql-2:3306 backup;
  13. }
  14. server {
  15. listen 3306;
  16. proxy_connect_timeout 3000s;
  17. proxy_timeout 6000s;
  18. proxy_pass mysql;
  19. }
  20. }

通过命令启动docker swarm 集群: docker stack deploy -c docker-stack-test.yml mysqltest

二,开启mysql主主同步,

1, 在对应的主机执行以下命令,进入mysql-1mysql-2容器

查看docker的容器id: docker ps -f “name=mysql-1” 或者 docker ps -f “name=mysql-2”

进入容器:docker exec -it (容器ID) /bin/bash (容器ID为下图红框位置)

20201216203847832.png

2, 分别进入mysql-1mysql-2容器后执行以下命令进入mysql服务 (密码:123456)

进入mysql服务:mysql -u root -p

输入密码:123456

3,mysql-1mysql-2分别执行以下命令,允许其他slaveio thread进行监听自己的binlog文件,原理如下图

GRANT REPLICATION SLAVE ON *.* to ‘slave’@’%’ identified by ‘123456’;

这里写图片描述

4, 执行以下命令记录mysql-1同步的binlog文件状态

show master status;

如下图:记录mysql-bin.000003 和 3825

2020121620464518.png

5,mysql-2执行以下命令,开启IO线程监听mysql-1的binlog文件黄色信息为mysql-1记录的信息

解释:master_host:这里可以指定容器名,因为在同个docker swarm集群,

  1. 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

20201216205135303.png

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-1mysql-2中执行以下命令查看是否开启成功。

show slave status\G;

如下图:如果两个都是yes , 说明成功。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjUzMzg1Ng_size_16_color_FFFFFF_t_70 1

疑问:

1,通过进入对应MySQL容器配置MySQL主从配置,下次重启后还需不需要重新配置, 答:不需要重新配置,因为配置文件已经持久化到宿主机了,重启不影响。
2,加入某台MySQL宕机了,当这台MySQL重启后会不会自动同步之前未同步的数据 搭:会的,因为会记录对应master的binlog同步的位置,positon的位置。

#

三,mysql数据恢复

如果当某个MySQL服务器数据丢失了,需要重新做数据恢复,并且需要重新配置MySQL主主,这一块我们下期讲。。。。。。。

发表评论

表情:
评论列表 (有 0 条评论,624人围观)

还没有评论,来说两句吧...

相关阅读

    相关 docker-swarm

    最近一直在忙公司应用docker化部署,所以很久没发博文了。今天刚好有空,就来介绍下swarm集群,在部署swarm集群之前我一直在考虑用那种集群方式,k8s还是swarm,最