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

系统管理员 2023-03-02 04:50 79阅读 0赞

什么是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 查看日志,如果出现下面的输出,证明启动成功:

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

  1. docker pull haproxy:2.2.1

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

编辑

  1. # haproxy.cfg
  2. global
  3. #工作目录
  4. chroot /usr/local/etc/haproxy
  5. #日志文件,使用rsyslog服务中local5日志设备(/var/log/local5),等级info
  6. log 127.0.0.1 local5 info
  7. #守护进程运行
  8. daemon
  9. defaults
  10. log global
  11. mode http
  12. #日志格式
  13. option httplog
  14. #日志中不记录负载均衡的心跳检测记录
  15. option dontlognull
  16. #连接超时(毫秒)
  17. timeout connect 5000
  18. #客户端超时(毫秒)
  19. timeout client 50000
  20. #服务器超时(毫秒)
  21. timeout server 50000
  22. #监控界面
  23. listen admin_stats
  24. #监控界面的访问的IP和端口
  25. bind 0.0.0.0:8888
  26. #访问协议
  27. mode http
  28. #URI相对地址
  29. stats uri /dbs
  30. #统计报告格式
  31. stats realm Global\ statistics
  32. #登陆帐户信息
  33. stats auth admin:123456
  34. #数据库负载均衡
  35. listen proxy-mysql
  36. #访问的IP和端口
  37. bind 0.0.0.0:3306
  38. #网络协议
  39. mode tcp
  40. #负载均衡算法(轮询算法)
  41. #轮询算法:roundrobin
  42. #权重算法:static-rr
  43. #最少连接算法:leastconn
  44. #请求源IP算法:source
  45. balance roundrobin
  46. #日志格式
  47. option tcplog
  48. #在MySQL中创建一个没有权限的haproxy用户,密码为空。Haproxy使用这个账户对MySQL数据库心跳检测
  49. option mysql-check user haproxy
  50. server MySQL_1 172.18.0.2:3306 check weight 1 maxconn 2000
  51. server MySQL_2 172.18.0.3:3306 check weight 1 maxconn 2000
  52. server MySQL_3 172.18.0.4:3306 check weight 1 maxconn 2000
  53. #使用keepalive检测死链
  54. option tcpka

3.

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

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

  1. # 这里要加 --privileged
  2. 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.进入容器

  1. docker exec -it h1 bash

6.在容器bash中启动Haproxy

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

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

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

20200727183830246.png

可以看到有三个数据库

navicat通过 4002端口进行连接mysql

20200727185924831.png

发表评论

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

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

相关阅读

    相关 dockerpxc

    前言 随着mysql存储的数据量越来越大,mysql查询单表时的响应速度也会随之变慢,尤其是当单节点承载的数据量超出一定的范围后,比如单表超过2000万之后,查询响应速度