基于Docker的PXC实现

最近 尝试MySQL集群
在本机Docker搭建测试环境
使用PXC实现

本人电脑的基础配置👇

1
2
3
4
5
6
7
8
<?php
$info = [
'macOS10.13',
'8G DDR4',
'I5-6300HQ',
'960EVO 250G SSD'
];
?>

常见的MySQL集群方案

WX20190411-023733.png

准备步骤

先安装好docker环境并了解docker的基础命令行

安装 pxc镜像

  • 拉取PXC镜像
1
docker pull percona/percona-xtradb-cluster
  • 为了后期方便使用 可以修改镜像名称为PXC
1
docker tag percona/percona-xtradb-cluster pxc
  • 修完后 不要忘记删除原来的镜像 因为不再使用了哦
1
docker rmi percona/percona-xtradb-cluster
  • 可以查看下镜像信息
1
docker images

创建内部网络

  • 出于安全考虑 给PXC集群实例创建Docker内部网络
1
docker network create --subnet=172.18.0.0/24 net1

如果出现报错 可参考链接 Docker创建network问题

创建Docker卷

目的:解决容器中PXC节点映射数据目录

1
2
3
4
# 创建 v1-v5 Docker卷 因为本次测试使用5个数据库节点
docker volume create --name v1
...
docker volume create --name v5

创建MySQL集群容器

  • 创建第一个MySQL集群节点
参数解析 @LiKachung
参数 意义
-d 后台运行
-p 映射端口 宿主机:Docker容器
MYSQL_ROOT_PASSWORD 该MySQL节点密码
CLUSTER_NAME 集群名称
XTRABACKUP_PASSWORD 集群间连接密码
-v 映射数据目录
privileged 分配最高权限
name 节点名称
net 容器所在网络
ip 容器ip
CLUSTER_JOIN (后续用到)加入node1节点集群
1
2
3
4
5
6
7
8
9
10
docker run -d -p 3306:3306 -e \
MYSQL_ROOT_PASSWORD=test -e \
CLUSTER_NAME=PXC -e \
XTRABACKUP_PASSWORD=test \
-v v1:/var/lib/mysql \
--privileged \
--name=node1 \
--net=net1 \
--ip 172.18.0.2 \
pxc

第一个实例需要的时间相对较长
** 必须等到第一个实例完成初始化成功 才能继续实例别的PXC节点
否则 当实例别的PXC节点时挂载master节点会失败 导致无法集群**

  • 查看是否实例成功


利用数据库可视化工具 本人使用了 Navicat


连接凭证为上面初始化的参数
当能连通数据库即为成功


WX20190411-025415.png

  • 创建其他MySQL节点

需要修改
映射端口「否则宿主机端口冲突」
映射数据目录挂载的Docker卷
ip地址
新增
CLUSTER_JOIN 参数

  • 第二个节点
1
2
3
4
5
6
7
8
9
10
11
docker run -d -p 3307:3306 -e \
MYSQL_ROOT_PASSWORD=test -e \
CLUSTER_NAME=PXC -e \
XTRABACKUP_PASSWORD=test -e\
CLUSTER_JOIN=node1 \
-v v2:/var/lib/mysql \
--privileged \
--name=node2 \
--net=net1 \
--ip 172.18.0.3 \
pxc
  • 直到第五个节点创建成功

WX20190411-031146.png

实现效果

在对某一个数据库节点改动时 其他节点会同步

注意事项

一、PXC集群在超过一半数量的节点宕机 集群会不可用
即满足 可用节点数量 > 总节点数量/2
二、PXC集群设计时 节点数量控制在奇数个

  • 防止由脑裂造成的集群不可用

集群的脑裂通常是发生在节点之间通信不可达的情况下
集群会分裂成不同的小集群 小集群各自选出自己的master节点
导致原有的集群出现多个master节点的情况
举例:
5个节点 脑裂成1,4或2,3均可继续提供集群服务
4个节点 脑裂成1,3可提供集群服务 2,2不提供集群服务

  • 在容错能力相同的情况下 奇数更节省资源

举例:
3个节点 可容错1个节点 否则不提供集群服务
4个节点 可容错1个节点 否则不提供集群服务

后续优化

  • 增强数据安全性 添加冗余设计

数据库服务器双机热备 即每节点充当master 都有个slave
master会主动争抢请求

增加心跳检测
当master宕机时 slave自动升级成master
当原master恢复时 slave自动降级回来

  • 数据库负载均衡 Haproxy

将请求均匀分发每个节点 避免某个节点因负载过大而宕机

2019.04.11 03:46
Done.

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×