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-1mysql-2hostname,可以通过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-1mysql-2容器

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

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

 

 

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

 

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

show slave status\G;

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

疑问:


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

 

 

三,mysql数据恢复

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

 

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要搭建 Docker Swarm 集群,你可以按照以下步骤进行操作: 1. 安装 Docker:在每个节点上安装 Docker,可以按照 Docker 官方文档的指引进行安装。确保所有节点上都安装了相同版本的 Docker。 2. 初始化 Swarm:选择其中一个节点作为 Swarm Manager,运行以下命令初始化 Swarm: ``` docker swarm init ``` 这将生成一个 Token,用于其他节点加入 Swarm。 3. 加入节点:在其他节点上运行以下命令,将它们加入 Swarm: ``` docker swarm join --token <token> <manager-ip>:<manager-port> ``` `<token>` 是在初始化 Swarm 时生成的 Token,`<manager-ip>` 和 `<manager-port>` 是 Swarm Manager 的 IP 地址和端口。 4. 部署服务:使用 Docker Stack 或 Docker Compose 编写服务的配置文件,并使用以下命令在 Swarm 上部署服务: ``` docker stack deploy -c <compose-file> <stack-name> ``` `<compose-file>` 是服务配置文件的路径,`<stack-name>` 是你给服务取的名称。 5. 扩展和管理集群:使用 Docker 命令扩展、更新、删除服务,以及管理集群中的节点。例如: - 扩展服务的副本数:`docker service scale <service-name>=<replica-count>` - 更新服务:`docker service update <service-name> --image <new-image>` - 删除服务:`docker stack rm <stack-name>` - 查看集群状态:`docker node ls` 这些步骤可以帮助你搭建一个简单的 Docker Swarm 集群。你可以根据实际需求进行配置和管理。如果需要更详细的指导,可以参考 Docker 官方文档中关于 Swarm 的内容。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值