Docker 搭建mysql pxc集群 + haproxy + keepalived 高可用

本文介绍如何使用PerconaXtraDBCluster(PXC)搭建数据库集群,并通过Haproxy实现负载均衡,确保高可用性和数据一致性。PXC提供同步复制、多主复制和自动节点配置等功能,而Haproxy则负责监控和平衡各节点负载。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是PXC

Percona XtraDB Cluster是MySQL的数据库集群解决方案。它确保高可用性,防止停机和数据丢失,并为不断增长的环境提供线性可伸缩性。

  • 同步复制

    数据同时写入所有节点,或者即使在单个节点上失败也不会写入。

  • 多原版复制

    任何节点都可以触发数据更新。

  • 真正的并行复制

    从属服务器上的多个线程在行级别执行复制。

  • 自动节点配置

    您只需添加一个节点,它就会自动同步。

  • 资料一致性

    不再有未同步的节点。

   对比mysql的主从复制

 

  • 1.安装
docker pull percona/percona-xtradb-cluster:5.7
  • 2.命名太长,重新命名容器名
docker tag percona/percona-xtradb-cluster:5.7 pxc:5.7
  • 3.删除容器
docker rmi percona/percona-xtradb-cluster:5.7
  • 4.创建 Docker 网络,用于 PXC 集群独立使用
docker network create --subnet=172.18.0.0/24 pxc-network

 --subnet属性用来指定这个pxc-network的网断,不然后面不能指定固定的ip ,在MySQL中查看集群的变量,是看不到具体的ip地址,而为容器的id(查看容器的ip信息  docker inspect 容器名,会输出这个容器的信息,包括ip等等信息)

查看(docker network inspect pxc-network)

删除(docker network rm pxc-network)

  • 5.创建数据卷用于mysql挂载

       创建三个用于集群

docker volume create v1
docker volume create v2
docker volume create v3
  • 6.创建第一个节点
docker run -di --name=pn1 --net=pxc-network --ip 172.18.0.2 -p 9000:3306 -v v1:/var/lib/mysql --privileged -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=cluster1 -e XTRABACKUP_PASSWORD=123456  pxc:5.7

 --name容器名称

--net容器网络

--ip容器ip

-p 外部端口:内部端口

-v 数据卷:容器里面的数据位置(就是容器在往容器这个路径存的时候,放入到外部 宿主机的位置,当我们对容器删除的时候数据不会丢失)

因为后续节点的添加需要关联到第一个节点,所以需要等待数据库启动完成。通过 docker logs pn1 查看日志,如果出现下面的输出,证明启动成功:

2019-09-04T06:27:30.085880Z 0 [Note] InnoDB: Buffer pool(s) load completed at 190904  6:27:30
  • 7.加入第二个节点
docker run -di --name=pn2 --net=pxc-network --ip 172.18.0.3 -p 9001:3306 -v v2:/var/lib/mysql --privileged -e MYSQL_ROOT_PASSWORD=123456  -e CLUSTER_NAME=cluster1 -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=pn1 pxc:5.7

需要注意是第二个节点开始需要增加 e CLUSTER_JOIN=pn1 参数,表示与 pn1 节点同步,否则 pn1 容器会自动关闭。

当 PXC集群中存在两个节点以上之后就没有主节点的概念了。集群中最后一个退出的节点就会变为主节点,在 /var/lib/mysql/grastate.dat 文件中属性 safe_to_bootstrap 的值 会从 0 被设置为 1 表示该节点是主节点。

  • 8.加入第三个节点
docker run -di --name=pn3 --net=pxc-network --ip 172.18.0.4 -p 9002:3306 -v v3:/var/lib/mysql --privileged -e MYSQL_ROOT_PASSWORD=123456  -e CLUSTER_NAME=cluster1 -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=pn2 pxc:5.7  

 如果主节点的服务宕机后,那么他就启动不起来,因为他不是最后一个的退出的,主节点已经不是他,如果硬要启动,修改

 /var/lib/mysql/grastate.dat 文件中属性 safe_to_bootstrap修改为1 ,在进行启动。

不过有个问题,强制启动这个节点,其他节点未同步的数据将不会进行同,这显然不是我们想要的。

解决办法:

删除这个节点,重新创建容器 以节点的方式挂载到这个之前节点的数据卷位置 v1。

启动后 过会数据将会全部进行同步。

 

安装Haproxy

1.

docker pull haproxy:2.2.1

2.创建haproxy.cfg到/home/config

编辑

# haproxy.cfg
global
    #工作目录
    chroot /usr/local/etc/haproxy
    #日志文件,使用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
    #登陆帐户信息
    stats auth  admin:123456
#数据库负载均衡
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_1 172.18.0.2:3306 check weight 1 maxconn 2000  
    server  MySQL_2 172.18.0.3:3306 check weight 1 maxconn 2000  
    server  MySQL_3 172.18.0.4:3306 check weight 1 maxconn 2000
    #使用keepalive检测死链
    option  tcpka

3.

create user 'haproxy'@'%' identified by '';

4.创建Haproxy容器(name=h1的原因是为了高可用)

# 这里要加 --privileged
docker run -it -d -p 4001:8888 -p 4002:3306 -v /home/config:/usr/local/etc/haproxy --name h1 --net=pxc-network --ip 172.18.0.117 --privileged haproxy:2.2.1

 

5.进入容器

docker exec -it h1 bash

6.在容器bash中启动Haproxy

haproxy -f /usr/local/etc/haproxy/haproxy.cfg

退出容器 命令行输入exit 或者 ctrl+p+q

浏览器访问这个主机192.168.149.111:4001/dbs,用户名密码为刚配置文件中的用户名密码,访问后出现下面界面

可以看到有三个数据库

navicat通过 4002端口进行连接mysql

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值