使用Docker Swarm部署PXC+HAProxy高可用集群(三节点)

news2024/10/6 16:20:12

使用Docker Swarm部署PXC+HAProxy高可用集群(三节点)

1. 部署规划

当前规划中,只启动一个HAProxy服务,主要用来做MySQL节点的负载均衡和代理,但是HAProxy可能会出现单点故障,后续需要启动多个HAProxy节点,然后结合Keepalived来进行 设置虚拟IP 做故障转移

节点名称节点主机名IP地址角色运行服务
cluster01cluster01192.168.12.48Docker Swarm Manager & NodeHAProxy MySQL-Node01
cluster01cluster02192.168.12.49Docker Swarm Manager & NodeMySQL-Node02
cluster01cluster03192.168.12.50Docker Swarm Manager & NodeMySQL-Node03

下面部署文档中,需要执行的指令所在节点,将会说明在以上规划的某个节点执行,均已节点名称代替。

2. 安装Docker和Docker Swarm

安装Docker和Docker Swarm。Docker是用于构建、发布和运行容器化应用程序的开源工具,而Docker Swarm是Docker的一种编排和集群管理方式,用于实现容器化应用程序的高可用性和负载均衡。

需要多节点,那么在多个节点上安装Docker和Docker Swarm

可以通过以下命令来安装Docker和Docker Swarm

  • cluster01、cluster02、cluster03节点执行
# 安装Docker
$ curl -sSL https://get.docker.com/ | sh

# 启动Docker
$ systemctl start docker

# 安装Docker Swarm
$ docker pull swarm:latest

3. 创建Docker Swarm集群

创建Docker Swarm集群。Docker Swarm集群由一组Docker主机组成,其中有一台主机作为管理节点,其它主机作为工作节点

3.1. 创建Docker Swarm集群

如果配置多节点,需要在多个节点创建Docker Swarm集群

cluster01 节点执行

# 创建Docker Swarm管理节点 
$ docker swarm init \
      --advertise-addr=192.168.12.48
  • 执行输出如下:
    在这里插入图片描述

注意:三个节点我们都规划成了manager管理节点并且充当node节点,也会为了访问单点故障,所以下面执行的指令,我们将不通过已经指令执行,我们通过获取manager的加入指令来操作

cluster01节点执行

$ docker swarm join-token manager

# 将指令的输出结果复制,将作为后续其他cluster02、cluster03的加入操作指令

在这里插入图片描述

3.2. 将工作节点加入Docker Swarm集群

复制上面通过docker swarm join-token manager管理节点的初始化输出指令

cluster02、cluster03 节点执行

# 创建Docker Swarm其他管理节点
$ docker swarm join \
      --token=TOKEN MANAGER_IP:2377

3.3. 查看集群运行状态

# 查询Docker Swarm集群的状态
$ docker node ls
  • 以下输出则表示Docker Swarm 3个节点均已成功加入集群,三个管理节点,其中cluster01为主节点
    在这里插入图片描述

4. 创建共享数据持久化卷

共享存储卷,可以使用外部NFS做为共享卷来存储服务的持久化数据,也是可以Docker Swarm的本地volume卷来存储数据,这里两种方式都有具体操作,但是建议使用本地volume来存储。

下面所有步骤关于共享卷的使用,本文档选择本地Volume的方式,其他方式可以自行配置即可。

4.1. 配置一台共享的NFS服务

首先你需要配置一台NFS服务器,本地挂载一块大容量磁盘,并格式化分区作为NFS Server的对外共享卷,以备后续Docker Swarm来挂载作为集群共享卷使用,这里你也可以直接在Docker Swarm的启动一个节点,可以是管理节点或工作节点配置NFS Server,但是建议是额外单独的一台机器。

4.2. 创建共享存储卷 - NFS

这里的device:/mysql-data 则为NFS Server 共享的目录,可以多个服务所使用的单独目录,用来存放不同应用的数据,这里的就以192.168.1.10位NFS服务器

4.2.1. 节点01 cluster01 上执行共享卷挂载

### 在cluster01节点执行 ##
# 配置mysql的共享卷
$ docker volume create \
      --driver=rexray/nfs \
      --opt type=nfs4 \
      --opt o=nfsvers=4.1,addr=192.168.1.10,rw=true \
      --opt device=:/mysql-data/192.168.12.48/cluster01 \
      cluster01-mysql-data

4.2.2. 节点02 cluster02 上执行共享卷挂载

### 在cluster02节点执行 ##
# 配置mysql的共享卷
$ docker volume create \
      --driver=rexray/nfs \
      --opt type=nfs4 \
      --opt o=nfsvers=4.1,addr=192.168.1.10,rw=true \
      --opt device=:/mysql-data/192.168.12.49/cluster02 \
      cluster02-mysql-data

4.2.3. 节点03 cluster03 上执行共享卷挂载

### 在cluster03节点执行 ##
# 配置mysql的共享卷
$ docker volume create \
      --driver=rexray/nfs \
      --opt type=nfs4 \
      --opt o=nfsvers=4.1,addr=192.168.1.10,rw=true \
      --opt device=:/mysql-data/192.168.12.50/cluster03 \
      cluster03-mysql-data

4.3. 创建共享存储卷 - local

Docker Swarm 的共享存储卷功能会自动在集群中的多个节点之间分布共享存储卷的数据,并保证数据的一致性和可用性。它内部使用了分布式文件系统来存储数据,并提供一个统一的接口,让容器可以访问存储卷中的数据。

总之,Docker Swarm 的共享存储卷功能可以方便地解决容器之间共享数据的问题,并保证数据的安全性和可用性。

4.3.1. 使用 Docker 命令行工具创建共享存储卷 - MySQL

cluster01、cluster02、cluster03节点执行

# 初始化一个本地目录做数据共享
$ mkdir -p /data/mysql-data

# 执行挂载挂载映射指令
$ docker volume create --driver local \
      --opt type=none \
      --opt device=/data/mysql-data \
      --opt o=bind \
      cluster<01、02、03>-mysql-data

上面的命令将创建一个名为 cluster<01、02、03>-mysql-data 的共享存储卷,并将它挂载到本地主机的 /data/mysql-data 目录

5. 创建节点间通信共享overlay网络

5.1. 创建服务共享网络

这里的 mysql_network、rabbitmq_network、redis_network 为三个节点直接共享所使用的网络名称,分别为三个服务创建单独通信的网络,后续将会使用这个网络节点之间的网络通信,名称可以自定义,但后续在创建服务时需要查询使用

cluster01节点执行

  • 创建mysql服务使用网络
$ docker network create -d overlay --attachable mysql_network

6. 创建PXC MySQL服务

6.1. 拉取PXC镜像

cluster01、cluster02、cluster03节点执行

$ docker pull percona/percona-xtradb-cluster:5.7.21

6.2. 创建PXC服务

6.2.1. 在cluster01节点创建PXC服务

使用 docker run 命令来创建一个运行 Mysql 的服务,是否配置参数如下:

配置参数配置值解析
-p3306:3306指定服务映射端口,表示宿主机端口:内部容器服务端口,这里是宿主机3306映射到容器的3306端口
-e MYSQL_ROOT_PASSWORDroot123.指定MYSQL容器启动后的root管理员密码
-e CLUSTER_NAMEPXC指定PXC集群的名称,如果同属于一个集群,那么所有节点都需要保持一致
-e XTRABACKUP_PASSWORDroot123.指定备份工具的访问密码
-vcluster01-mysql-data:/var/lib/mysql指定本地映射目录,将cluster01-mysql-data的本地volume卷映射到容器内部/var/lib/mysql目录作为数据存储目录使用【cluster01-mysql-data就是上面给mysql所创建的卷名称】
–namemysql-node01指定容器服务启动的名称
–networkmysql_network指定容器服务所使用的网络【mysql_network就是上面给mysql通信所创建的网络】

cluster01节点执行

$ docker run -d -p 3306:3306 \
     -e MYSQL_ROOT_PASSWORD=root123. \
     -e CLUSTER_NAME=PXC \
     -e XTRABACKUP_PASSWORD=root123. \
     -v cluster01-mysql-data:/var/lib/mysql \
     --name=mysql-node01 \
     --network=mysql_network \
     percona/percona-xtradb-cluster:5.7.21
  • 查看服务信息

通过指令查看mysql-node01的容器服务是否正常启动

# 查看mysql-node01服务的所有配置信息
$ docker inspect mysql-node01
  • 确认Mysql服务正常启动,数据库一切正常
$ docker exec -ti mysql-node01 bash

$ mysql -uroot -proot123. -e "show databases;"

执行以上指令来确认数据库服务正常启动,并可以连接使用。 如果有以下输出则表示数据库正常。
在这里插入图片描述

6.2.2. 在cluster02节点创建PXC服务

使用 docker run 命令来创建一个运行 Mysql 的服务,是否配置参数如下:

配置参数配置值解析
-p3306:3306指定服务映射端口,表示宿主机端口:内部容器服务端口,这里是宿主机3306映射到容器的3306端口
-e MYSQL_ROOT_PASSWORDroot123.指定MYSQL容器启动后的root管理员密码
-e CLUSTER_NAMEPXC指定PXC集群的名称,如果同属于一个集群,那么所有节点都需要保持一致
-e CLUSTER_JOINmysql-node01指定加入主节点的集群
-e XTRABACKUP_PASSWORDroot123.指定备份工具的访问密码
-vcluster02-mysql-data:/var/lib/mysql指定本地映射目录,将cluster02-mysql-data的本地volume卷映射到容器内部/var/lib/mysql目录作为数据存储目录使用【cluster02-mysql-data就是上面给mysql所创建的卷名称】
–namemysql-node02指定容器服务启动的名称
–networkmysql_network指定容器服务所使用的网络【mysql_network就是上面给mysql通信所创建的网络】

cluster02节点执行

$ docker run -d -p 3306:3306 \
     -e MYSQL_ROOT_PASSWORD=root123. \
     -e CLUSTER_NAME=PXC \
     -e CLUSTER_JOIN=mysql-node01 \
     -e XTRABACKUP_PASSWORD=root123. \
     -v cluster02-mysql-data:/var/lib/mysql \
     --name=mysql-node02 \
     --network=mysql_network \
     percona/percona-xtradb-cluster:5.7.21
  • 查看服务信息

通过指令查看mysql-node02的容器服务是否正常启动

# 查看mysql-node02服务的所有配置信息
$ docker inspect mysql-node02
  • 确认Mysql服务正常启动,数据库一切正常
$ docker exec -ti mysql-node02 bash

$ mysql -uroot -proot123. -e "show databases;"

6.2.3. 在cluster03节点创建PXC服务

使用 docker run 命令来创建一个运行 Mysql 的服务,是否配置参数如下:

配置参数配置值解析
-p3306:3306指定服务映射端口,表示宿主机端口:内部容器服务端口,这里是宿主机3306映射到容器的3306端口
-e MYSQL_ROOT_PASSWORDroot123.指定MYSQL容器启动后的root管理员密码
-e CLUSTER_NAMEPXC指定PXC集群的名称,如果同属于一个集群,那么所有节点都需要保持一致
-e CLUSTER_JOINmysql-node01指定加入主节点的集群
-e XTRABACKUP_PASSWORDroot123.指定备份工具的访问密码
-vcluster03-mysql-data:/var/lib/mysql指定本地映射目录,将cluster03-mysql-data的本地volume卷映射到容器内部/var/lib/mysql目录作为数据存储目录使用【cluster03-mysql-data就是上面给mysql所创建的卷名称】
–namemysql-node03指定容器服务启动的名称
–networkmysql_network指定容器服务所使用的网络【mysql_network就是上面给mysql通信所创建的网络】

cluster02节点执行

$ docker run -d -p 3306:3306 \
     -e MYSQL_ROOT_PASSWORD=root123. \
     -e CLUSTER_NAME=PXC \
     -e CLUSTER_JOIN=mysql-node01 \
     -e XTRABACKUP_PASSWORD=root123. \
     -v cluster03-mysql-data:/var/lib/mysql \
     --name=mysql-node03 \
     --network=mysql_network \
     percona/percona-xtradb-cluster:5.7.21
  • 查看服务信息

通过指令查看mysql-node03的容器服务是否正常启动

# 查看mysql-node03服务的所有配置信息
$ docker inspect mysql-node03
  • 确认Mysql服务正常启动,数据库一切正常
$ docker exec -ti mysql-node03 bash

$ mysql -uroot -proot123. -e "show databases;"

7. 检查PXC集群状态

完成以上cluster01、cluster02、cluster03三个节点的PXC服务的启动,并且都可以登录访问数据库,这里再次确认整个数据库集群是否已经初始化完成,所有节点都已经同步至数据,切集群状态是正常状态;

在 cluster01 节点指令以下查询指令

$ docker exec -ti mysql-node01 bash

$ mysql -uroot -proot123. -e "show status like 'wsrep%';"

查询指令输出如下:

+----------------------------------+------------------------------------------------+
| Variable_name                    | Value                                          |
+----------------------------------+------------------------------------------------+
| wsrep_local_state_uuid           | 3b982143-7c5f-11ed-86d5-b77967adc009           |
| wsrep_protocol_version           | 8                                              |                                 |
| wsrep_local_state                | 4                                              |
| wsrep_local_state_comment        | Synced                                         |
| wsrep_cert_index_size            | 0                                              |
| wsrep_cert_bucket_count          | 22                                             |
| wsrep_gcache_pool_size           | 1456                                           |
| wsrep_causal_reads               | 0                                              |
| wsrep_cert_interval              | 0.000000                                       |
| wsrep_ist_receive_status         |                                                |
| wsrep_ist_receive_seqno_start    | 0                                              |
| wsrep_ist_receive_seqno_current  | 0                                              |
| wsrep_ist_receive_seqno_end      | 0                                              |
| wsrep_incoming_addresses         | 10.0.13.26:3306,10.0.13.23:3306,10.0.13.6:3306 |
| wsrep_desync_count               | 0                                              |
| wsrep_evs_delayed                |                                                |
| wsrep_evs_evict_list             |                                                |
| wsrep_evs_repl_latency           | 0/0/0/0/0                                      |
| wsrep_evs_state                  | OPERATIONAL                                    |
| wsrep_gcomm_uuid                 | 4830fe4c-7c5f-11ed-9ca9-c23a8b01a1d4           |
| wsrep_cluster_conf_id            | 11                                             |
| wsrep_cluster_size               | 3                                              |
| wsrep_cluster_state_uuid         | 3b982143-7c5f-11ed-86d5-b77967adc009           |
| wsrep_cluster_status             | Primary                                        |
| wsrep_connected                  | ON                                             |
| wsrep_local_bf_aborts            | 0                                              |
| wsrep_local_index                | 1                                              |
| wsrep_provider_name              | Galera                                         |
| wsrep_provider_vendor            | Codership Oy <info@codership.com>              |
| wsrep_provider_version           | 3.26(rac090bc)                                 |
| wsrep_ready                      | ON                                             |
+----------------------------------+------------------------------------------------+

如果执行查询输出中,wsrep_incoming_addresses 值为三个节点的对应容器服务IP地址,则表述PXC的数据集群状态正常。也可以通过 wsrep_cluster_size 值为3,则表示目标集群中3个节点在线。

测试三个节点数据库是否在任意一个节点执行操作,其他数据库都可以同步,包含库、表等,达到底层的强一致性。

最终结果:在任意一个节点连接数据库执行操作,其他库都可以同步执行操作和数据。

8. 配置HAProxy服务

三个节点的PXC MySQL服务集群正常之后,已经完成高可用配置,但是在使用过程中,不能让使用MySQL的程序连接三个地址,所以我们还需要一个代理服务器,来配置代理转发做到负载均衡,在使用中客户端只需要连接代理服务器的地址,由代理服务器根据策略来负责分发到后台的三个节点进行数据库的访问,而且可以持续监测后台三个PXC MySQL服务的状态,如果某一个节点挂掉之后,自动负载到其他可用节点。上线之后重新加入到集群,并持续监听,来实现负载均衡高可用。

做代理服务可以有多种选,例如:HAProxy、ProxySQL、Nginx都可以实现,这里我们选择HAProxy来实现代理服务,其他配置实现可以自定查阅相关资料来配置。

8.1. 拉取HAProxy镜像

这里我们选择最新的HAProxy的镜像,版本为2.7.0 ,其他版本可以通过访问 https://haproxy.org 来获取

具体版本:HAProxy version 2.7.0-437fd28 2022/12/01

cluster01 节点执行

目前只在一个节点HAProxy服务,会存在一个单点故障的问题,由于所有客户端都会通过HAProxy来转发到后端服务,所以后续将结合Keepalived来实现高可用。

$ docker pull haproxy:latest

8.2. 配置HAProxy配置文件

HAProxy镜像服务内部没有配置文件,需要在容器启动之前将haproxy.cfg配置文件按照需要配置完成,再启动服务时映射到容器内部使用

cluster01节点执行

8.2.1. 创建一个宿主机映射配置文件目录

$ mkdir -p /data/haproxy

8.2.2. 数据库创建haproxy访问用户

MySQL中创建一个没有权限的haproxy用户,密码为空。Haproxy使用这个账户对MySQL数据库心跳检测

cluster01 节点执行

# 登录到数据库容器
$ docker exec -it mysql-node01 bash

#登录mysql
$ mysql -u root -proot123.

#指定数据库
mysql> use mysql;

#创建用户
mysql> create user 'haproxy'@'%' identified by '';

# 刷新权限
mysql> flush privileges;

8.2.3. 编写HAProxy配置文件

配置文件中,需要修改的内容主要是 listen proxy-mysql 段,这里需要将PXC的三个节点的MySQL地址进行配置,具体IP地址为容器的内部地址,可以在每个节点通过**docker inspect mysql-node<01/02/03>**来获取,也可以通过前边查询数据库集群状态的输出的wsrep_incoming_addresses 值来获取,IP地址获取后配置到文件中即可,其他haproxy的配置参数,也可以根据具体环境来进行配置。

这里配置的负载模式为:roundrobin,轮训算法,可以根据实际环境自行配置其他模式即可

cluster01 节点执行

$ vim /data/haproxy/haproxy.cfg
# ---- 配置文件内容如下 ----
global
    #日志文件,使用rsyslog服务中local5日志设备(/var/log/local5),等级info
    log 127.0.0.1 local5 info
    #守护进程运行
    daemon

defaults
    log    global
    mode    http
    #日志格式
    option    httplog
    #日志中不记录负载均衡的心跳检测记录
    option    dontlognull
    #连接超时(毫秒)
    timeout connect 5000
    #客户端超时(毫秒)
    timeout client  50000
    #服务器超时(毫秒)
    timeout server  50000

#监控界面
listen  admin_stats
    #监控界面的访问的IP和端口
    bind  0.0.0.0:8888
    #访问协议
    mode        http
    #URI相对地址
    stats uri   /dbs
    #统计报告格式
    stats realm     Global\ statistics
    #登陆帐户信息, 用于web浏览器的访问用户名密码
    stats auth  admin:root123.
#数据库负载均衡
listen  proxy-mysql
    #访问的IP和端口
    bind  0.0.0.0:3306
    #网络协议
    mode  tcp
    #负载均衡算法(轮询算法)
    #轮询算法:roundrobin
    #权重算法:static-rr
    #最少连接算法:leastconn
    #请求源IP算法:source
    balance  roundrobin
    #日志格式
    option  tcplog
    #在MySQL中创建一个没有权限的haproxy用户,密码为空。Haproxy使用这个账户对MySQL数据库心跳检测
    option  mysql-check user haproxy
    server  MySQL_Node01 10.0.13.23:3306 check weight 1 maxconn 2000 inter 5000 rise 2 fall 2
    server  MySQL_Node02 10.0.13.26:3306 check weight 1 maxconn 2000 inter 5000 rise 2 fall 2
    server  MySQL_Node03 10.0.13.6:3306 check weight 1 maxconn 2000 inter 5000 rise 2 fall 2
    #使用keepalive检测死链
    option  tcpka

8.3. 创建HAProxy服务

使用 docker run 命令来创建一个运行 HAProxy 的服务,是否配置参数如下:

配置参数配置值解析
-p4001:8888指定服务映射端口,表示宿主机端口:内部容器服务端口,这里是宿主机4001映射到容器的8888端口,这个端口后续用来访问haproxy服务的浏览器可视化监控页面
-p4002:3306指定服务映射端口,表示宿主机端口:内部容器服务端口,这里是宿主机4002映射到容器的3306端口,这个端口主要对外客户端访问外部端口,通过这个端口转发至容器内部来访问后端的3个MySQL集群。
-v/data/haproxy:/usr/local/etc/haproxy指定本地映射目录,将/data/haproxy的本地目录映射到容器内部/usr/local/etc/haproxy目录作为haproxy的配置文件目录使用
–namehaproxy指定容器服务启动的名称
–networkmysql_network指定容器服务所使用的网络【mysql_network就是上面给mysql通信所创建的网络】

cluster01 节点执行

$ docker run -d \
     -p 4001:8888 \
     -p 4002:3306 \
     -v /data/haproxy:/usr/local/etc/haproxy \
     --name=haproxy \
     --net=mysql_network \
     --privileged \
     haproxy:latest

9. 测试HAProxy服务功能

HAProxy服务启动后,可以通过访问cluster01节点宿主机的http://:4001/dbs来访问HAProxy服务的浏览器可视化监控页面来查看后端MySQL服务的监测及数据转发负责情况,通过页面可以看到目前后端的节点数量以及状态是否正常等相关信息。
在这里插入图片描述

10. 配置其他应用程序访问MySQL服务

截止到当前,MySQL的PXC+HAProxy实现的高可用负载集群就配置完成,那么内部及外部其他应用客户端可以访问HAProxy服务的对外地址及端口来访问后端的MySQL数据库。

外部服务访问地址:192.168.12.48 4002 端口,即可访问到数据库,后面就由HAProxy来根据配置的轮训算法来转发到后端的三台MySQL数据库服务**(192.168.12.48 为cluster01节点宿主机的IP地址)**

11. 其他高可用解决方案参考

  • Kubernetes:Kubernetes 是一个开源的容器编排工具,可以构建和管理复杂的容器集群。它可以通过多种方式保证容器的高可用性,例如负载均衡、容错和自动扩展等。
  • Mesos:Mesos 是一个分布式的资源管理框架,可以统一管理多个机器上的资源,并方便地实现资源调度和容器编排。可以使用 Mesos 在一个大的集群中运行 MySQL服务。

12. 附录 PXC集群故障恢复

12.1. 主节点故障

说明:mysql-node01宕机后,集群正常运行,会选举出新的主节点。如果修改参数safe_to_bootstrap=1以最开始mysql-node01为主节点创建启动PXC的命令那么会分裂新的集群,毫无意义。

12.1.1. 重建主节点PXC服务 - 处理方案一

  1. 删除cluster01节点cluster01-mysql-data卷下的grastate.dat文件
  2. 删除mysql-node01容器。
  3. 新建mysql-node01容器,并加入其它任何一个正常运行的节点,例如:mysql-node02、mysql-node03、因为复用cluster01-mysql-data数据卷,以此方式创建容器,只需在原mysql-node01宕机前已有的数据与其它节点做增量同步,效率高。
$ docker rm mysql-node01

$ docker run -d -p 3306:3306 \
     -e MYSQL_ROOT_PASSWORD=root123. \
     -e CLUSTER_NAME=PXC \
     -e CLUSTER_JOIN=mysql-node02 \
     -e XTRABACKUP_PASSWORD=root123. \
     -v cluster01-mysql-data:/var/lib/mysql \
     --name=mysql-node01 \
     --network=mysql_network \
     percona/percona-xtradb-cluster:5.7.21

# 重点:‐e CLUSTER_JOIN=mysql-node02

12.1.2. 创建全新的节点 - 处理方案二

  1. 创建全新的mysql-node04节点,形成一个mysql-node02、mysql-node03、mysql-node04的新集群。
  2. 新建mysql-node04容器,端口3006。并加入其它任何一个正常运行的节点,例如:mysql-node02、mysql-node03,做全量数据同步。

cluster01 节点执行

# 创建cluster01-mysql-data-node04卷
$ docker volume create cluster01-mysql-data-node04

# 创建服务
$ docker run -d -p 3306:3306 \
     -e MYSQL_ROOT_PASSWORD=root123. \
     -e CLUSTER_NAME=PXC \
     -e CLUSTER_JOIN=mysql-node02 \
     -e XTRABACKUP_PASSWORD=root123. \
     -v cluster01-mysql-data-node04:/var/lib/mysql \
     --name=mysql-node04 \
     --network=mysql_network \
     percona/percona-xtradb-cluster:5.7.21

12.2. 其他节点故障

以下根据创建的cluster集群做宕机分析及重启操作。

12.2.1. 主节点正常,停掉其他两个节点

场景1:停掉mysql-node02(或者mysql-node03),stop成功后重启

cluster02 节点执行

 $ docker stop mysql-node02

确认容器挂掉后重启,使用start 或者restart,结果是可以启动成功的,并且其他节点的数据会同步成功。

 $ docker start mysql-node02

**结论:**mysql-node01正常运作的情况下 ,mysql-node02或者mysql-node03宕机都是可以通过start命令成功重启,并同步增量数据。

12.2.2. 主节点故障,其他两个节点正常

场景2:停掉mysql-node01,保持mysql-node02及mysql-node03正常运行。stop成功后重启

cluster01 节点执行

$ docker stop mysql-node01

确认容器挂掉后重启,使用start 或者restart,结果是无法重启成功的,启动后会闪退。

 docker start mysql-node01

结论: mysql-node01作为启动时的主节点,如果优先其他宕机,无法通过start类命令启动成功 。这是什么原因?网上有一些成功启动的方法,修改cluster01-mysql-data卷下文件grastate.dat的参数safe_to_bootstrap=1后,可以重启成功, 但是在实际使用中毫无意义 。在实际项目中,因为在mysql-node01宕机后,mysql-node02及mysql-node03必然会继续工作写入数据等做操作。safe_to_bootstrap是pxc集群安全策略的参数:”是否是安全启动节点”。 如果强制修改文件的参数启动后,会发现mysql-node02及mysql-node03在mysql-node01宕机后产生的数据不会同步到mysql-node01。因为以这种强制方式启动mysql-node01会直接分裂成第二个集群,与之前搭建的集群不产生任何关系。正确操作方式参考 12.1.1. 主节点故障 章节内容

12.2.3. 主节点和其他一个节点故障

场景3:停掉mysql-node01后,再停掉mysql-node02,保持mysql-node03正常运行。stop成功后,重启mysql-node02重启

$ docker stop mysql-node01
$ docker stop mysql-node02

确认容器挂掉后重启,使用start 或者restart,结果是无法重启成功的,启动后会闪退。

 docker start mysql-node02

为什么mysql-node02节点也启动不了?原因是创建mysql-node02容器的时候,mysql-node02加入的是以mysql-node01为主节点的集群,现在mysql-node01运行不正常,当然mysql-node02无法启动。

结论: 这个场景仍需要将mysql-node01、mysql-node02 按照 12.1.1. 主节点故障 章节内容,将两个节点进行重建,重建时指定-e CLUSTER_JOIN=mysql-node02 加入mysql-node03节点,则可以正常加入集群,并重新同步数据。

12.3 PXC节点故障详细场景分析

可以参考如下文章,使用6个案例来说明PXC集群故障的恢复方法。
用6个案例说明如何恢复PXC集群

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/683710.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【动态规划算法练习】day5

文章目录 一、309. 最佳买卖股票时机含冷冻期1.题目简介2.解题思路3.代码4.运行结果 二、714. 买卖股票的最佳时机含手续费1.题目简介2.解题思路3.代码4.运行结果 三、123. 买卖股票的最佳时机 III1.题目简介2.解题思路3.代码4.运行结果 四、188. 买卖股票的最佳时机 IV1.题目简…

ES6-Map()对象

Map是一个键值对的集合和Object类似&#xff0c;Object 结构提供了“字符串—值”的对应&#xff0c;Map 结构提供了“值—值”的对应&#xff0c;是一种更完善的 Hash 结构实现。Map做为构造函数&#xff0c;可以通过全局对象获取到需要通过new操作创建实例对象。 map与Objec…

移动端适配方案

文章目录 像素设备像素(物理像素)设备独立像素&#xff08;逻辑像素&#xff09;CSS像素像素之间的关系 分辨率设备分辨率逻辑分辨率 移动端开发分类自适应响应式视口布局视口&#xff08;layout viewport&#xff09;视觉视口&#xff08;visual layout&#xff09;理想视口&a…

数据结构-哈希-位图与布隆过滤器

位图与布隆过滤器 一&#xff0c;位图题目分析位图设计位图代码经典题目 二&#xff0c;布隆过滤器布隆过滤器概念布隆过滤器的插入布隆过滤器的结构布隆过滤器总结经典题目 三&#xff0c;哈希切割 一&#xff0c;位图 题目分析 &#x1f680;给40亿个不重复的无符号整数&am…

【UE 从零开始制作坦克】11-坦克炮塔机枪

效果 步骤 1. 复制一份坦克炮弹的蓝图&#xff0c;重命名为“MachineGunBullets”&#xff0c;作为坦克炮塔机枪子弹的蓝图 2. 打开“MachineGunBullets”&#xff0c;由于美M2勃朗宁重机枪的口径是12.7毫米&#xff0c;这里取12毫米&#xff0c;也就是1.2cm&#xff0c;半径是…

Stream流中Map方法的使用

map函数的作用就是针对管道流中的每一个数据元素进行转换操作。 主要有三种用法 一、Stream管道流map的基础用法 将集合中的每个字符串&#xff0c;全部转化成大写&#xff01; 不使用流 List<String> list Arrays.asList("Monkey", "Lion", &…

你知道免费mp3格式转换器有哪些吗

小明是一个音乐爱好者&#xff0c;经常下载一些高质量的无损音频文件。但他发现有些音频文件格式并不支持他的播放器&#xff0c;这让他很苦恼。有一天&#xff0c;他听说了mp3格式转换器这个神奇的工具&#xff0c;可以将音频文件格式转换成mp3&#xff0c;从而方便他在各种设…

Jetpack Compose:构建现代Android应用的BottomNavigation

Jetpack Compose是Google推出的一种全新的声明式UI框架&#xff0c;它引领了Android开发的新风潮。在这篇博客中&#xff0c;我将详细介绍如何使用Jetpack Compose来构建一个具有底部导航栏&#xff08;BottomNavigation&#xff09;的现代Android应用。 首先&#xff0c;让我们…

【C++学习】内联函数 | nullptr空指针 | 初步认识面向对象 | 类访问限定符 | 封装 | 类对象的内存对齐

写在前面&#xff1a; 上一篇文章我介绍了引用和auto相关的知识&#xff0c; 如果有兴趣的话可以去看看&#xff1a;http://t.csdn.cn/j6jsI 这篇文章大概能够讲完C入门的一些语法&#xff0c;开始类和对象的学习之旅。 目录 写在前面&#xff1a; 1. 内联函数 2. nullp…

用Python带你制作小时候玩的“大富翁”(文末赠书)

名字&#xff1a;阿玥的小东东 学习&#xff1a;Python、C/C 主页链接&#xff1a;阿玥的小东东的博客_CSDN博客-python&&c高级知识,过年必备,C/C知识讲解领域博主 目录 首先 接下来需要定义各种类型的物业&#xff0c;包括普通物业、铁路、公用事业等等。 接下来需…

【Spring 】项目创建和使用

哈喽&#xff0c;哈喽&#xff0c;大家好~ 我是你们的老朋友&#xff1a;保护小周ღ 谈起Java 圈子里的框架&#xff0c;最年长最耀眼的莫过于 Spring 框架啦&#xff0c;如今已成为最流行、最广泛使用的Java开发框架之一。不知道大家有没有在使用 Spring 框架的时候思考过这…

强化学习从基础到进阶-常见问题和面试必知必答[5]::梯度策略、添加基线(baseline)、优势函数、动作分配合适的分数(credit)

【强化学习原理项目专栏】必看系列&#xff1a;单智能体、多智能体算法原理项目实战、相关技巧&#xff08;调参、画图等、趣味项目实现、学术应用项目实现 专栏详细介绍&#xff1a;【强化学习原理项目专栏】必看系列&#xff1a;单智能体、多智能体算法原理项目实战、相关技巧…

Spring Cloud - Nacos 注册发现、分级模型、配置集群、环境隔离、原理

目录 一、Nacos 安装和配置 二、Nacos 服务注册发现 2.1、将服务注册到 nacos 中 2.2、执行效果 三、Nacos 的服务分级模型及配置 3.1、分级模型 3.2、配置集群 3.3、配置 Nacos 负载均衡策略 3.4、Nacos 服务实例的权重设置 3.5、环境隔离——namespace 四、Nacos注…

真实企业做自动化测试做法,从测试用例到测试报告...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 首先&#xff0c;…

SAP MM 组织结构配置

1.定义公司代码 创建公司代码一般来说是财务去配置&#xff0c;但是我们需要去有一个基本的了解&#xff0c;这样&#xff0c;你才能理清公司代码和MM 组织的关系 配置&#xff1a;SAP IMG Enterprise Structure -》Definition -> Financial Accounting -> Edit, Copy, …

深度学习(26)——YOLO系列(5)

深度学习&#xff08;26&#xff09;——YOLO-v7&#xff08;5&#xff09; 文章目录 深度学习&#xff08;26&#xff09;——YOLO-v7&#xff08;5&#xff09;絮絮叨叨1. conv和BN的融合2. 3*3卷积的替换&#xff08;1&#xff09;1*1卷积有什么作用&#xff1f;&#xff08…

解决方案 | 照明行业数字化营销CRM平台

“数字中国”作为二十大报告的“关键词”&#xff0c;也成为各行各业的高质量发展的主旋律&#xff0c;历史悠久的中国照明产业也积极拥抱“数字化”&#xff0c;以驱动高质量发展 。作为照明行业的领军企业&#xff0c;某照明行业客户很早就意识到企业数字化转型的重要性&…

Spring事务源码详解-spring原码(二)

上篇文章介绍了事务开启&#xff0c;前面介绍了解析adviors。 spring事务源码详解-spring原码&#xff08;一&#xff09;https://blog.csdn.net/ke1ying/article/details/131360060 事务源码 先从缓存里获取&#xff0c;主要是判断循环依赖是否创建动态代理 进去wrapIfNeces…

【MOOC 作业】第3章 传输层

不是标答也不是参考答案 仅从个人理解出发去做题 1、(20分) ‍主机甲和主机乙之间已建立一个 TCP 连接&#xff0c;TCP 最大段长度为 1000 字节&#xff0c;若主机甲的当前拥塞窗口为 5000 字节&#xff0c;在主机甲向主机乙连接发送 2 个最大段后&#xff0c;成功收到主机乙发…

Java微服务金融项目智牛股 项目简介与金融知识介绍及技术特点

项目简介 金融交易平台服务于金融衍生产品&#xff0c; 包含外汇、贵金属、期货、股票。 各产品具有不同属性与交易规则&#xff0c; 本项目对标MT4等大型交易平台&#xff0c; 遵循FIX全球最广泛的金融市场通用协议。 实现从证券注册开户、行情订阅与呈现&#xff0c; 股票撮合…