搭建mysql集群

mysql 集群搭建 一般会采用以下两种方案

概念#

Replication#

特点:1.速度快  2.弱一致性  3.低价值

      速度快 : 储存数据速度快

   弱一致性: 存储一致性弱 在mysql集群节点A存储的数据 replication集群方案无法保证一定分发到节点B 这就可能导致我在A节点昔日如数据 在B节点无法查询到

   低价值:因为弱一致性的特点 就导致我们不能再replication集群方案中保存价值高的重要数据

应用: replication 集群方案可以应用于 日志 新闻 帖子 等场景

 

 

 

 如图在在负责写入的Master节点中写入的数据 数据会同步到 另一个负责读的Slave节点中 但是Slave节点中写入的数据不会同步到Master节点 Master节点是读不到的 

 

PXC#

特点:1.速度慢  2.强一致性  3.高价值

      速度慢  : 储存数据速度较于Replication方案较慢

   强一致性: 存储一致性强 在mysql集群节点A存储的数据 可以保证一定分发到数据库集群的所有节点 

   低价值:强一致性的特点使得PXC方案可以保存价值高的重要数据

应用: PXC 集群方案可以应用于 订单 账户 财务 等

 

 

 如图 在PXC集群方案中所有节点的读写都是同步的 事务在所有节点要么同时提交 要么都不提交 而replication 采用的是异步复制 无法保证数据一致性

 

 

 

 

本次我们采用的是PXC方案

PXC集群中任一节点对数据都是可读可写的 在任一节点写入数据 

 

 

 

 搭建#

在docker中安装 PXC镜像

docker的镜像仓库中包含了PXC数据库镜像 下载即可    https://hub.docker.com/r/percona/percona-xtradb-cluster/  

 

 

 

出于安全考虑 需要给pxc集群实例创建docker内部网络

##创建网段net1
docker network create net1

##查看网段net1
docker network inspect net1

##删除网段net1
docker network rm net1

 

ps:在docker容器中最好不要保存业务数据 可以通过目录映射保存到映射目录里 这样容器故障后只需重新启动一个新的docker容器将目录映射上  PXC无法直接映射 那我们可以采用 docker 卷

创建docker卷  

##创建docker卷
docker volume create --name v1

##查看docker卷
docker volume inspect --name v1

##删除docker卷
docker volume rm --name v1

 

 

创建PXC容器

复制代码
docker run -d -p 3306:3306                          ##-d 后台运行 -p 端口映射
-v v1:/var/lib/mysql                                ##-v  路径映射 将v1数据卷映射容器内MySQL目录
-e MYSQL_ROOT_PASSWORD=yourpass                     ##用户密码
-e CLUSTER_NAME=PXC                                 ##PXC集群名字
-e XTRABACKUP_PASSWORD=yourpass                     ##节点同步密码
--privileged                                        ##权限
--name=node1                                        ##容器名称                           
--net=net1                                          ##网段
--ip 172.18.0.2                                     ##网段ip
pxc
复制代码

 

实际命令 

复制代码
docker run -d -p 3306:3306 
-v zxx.cms_server_v_node1:/var/lib/mysql 
-e MYSQL_ROOT_PASSWORD=HelloWorld@123
-e CLUSTER_NAME=zxx.cms_server_pxc 
-e XTRABACKUP_PASSWORD=HelloWorld@123 
--privileged 
--name=zxx.cms_server_node1 
--net=zxx.cms_server_pxc_net 
--ip 172.20.0.2 
pxc
复制代码

但是需要注意创建第二个PXC容器的时候 需要更改指令

复制代码
docker run -d -p 3307:3306                          ##-d 后台运行 -p 端口映射不能以3306 因为3306已经被被一个容器起占用了
-v v2:/var/lib/mysql                                ##-v  路径映射 注意此处应该改为第二个docker卷 将v2数据卷映射容器内MySQL目录
-e CLUSTER_JOIN=node1                   ## 此处多个一个CLUSTER_JOIN参数 因为他要加入集群和第一个数据库节点同步
-e MYSQL_ROOT_PASSWORD=yourpass ##用户密码 -e CLUSTER_NAME=PXC ##PXC集群名字 -e XTRABACKUP_PASSWORD=yourpass ##节点同步密码 --privileged ##权限 --name=node2 ##容器名称也需修改 --net=net1 ##网段 --ip 172.18.0.3 ##网段ip也需修改 pxc
复制代码

实际创建命令

复制代码
docker run -d -p 3307:3306 
-v zxx.cms_server_v_node2:/var/lib/mysql
-e CLUSTER_JOIN=zxx.cms_server_node1
-e MYSQL_ROOT_PASSWORD=HelloWorld@123
-e CLUSTER_NAME=zxx.cms_server_pxc
-e XTRABACKUP_PASSWORD=HelloWorld@123
--privileged --name=zxx.cms_server_node2
--net=zxx.cms_server_pxc_net
--ip 172.20.0.3
pxc
复制代码

这里要注意 当创建完第一个节点 需要稍等一下 容器创建很快 但是容器内数据库初始化需要一定的时间 如果第一个节点数据库没有构建完成 就创建第二个 可能会引发故障

 

 

 通过navicat 已经可以连接到搭建的6个实例 并且所有节点数据都是同步的 

负载均衡#

虽然已经搭建完基于PXC方案的mysql 集群 但是 如果我们不采用负载均衡 单节点处理所有的请求 那么我们搭建的集群好像并没有什么实际意义 单节点负载高 性能差

这里可以使用Haproxy 他不是数据库 只是一个请求转发器

 

 

 

 

 

 这样就可以把请求转发给所有的Pxc节点 当时其他的负载均衡中间件还有很多 

以下是几种常见的负载均衡中间件对比 

 

 

 

1.安装haproxy

docker pull haproxy

2.创建Haproxy配置文件

touch /home/haproxy/haproxy.cfg

配置文件具体内容 可以参考 https://zhangge.net/5125.html 写的很详#configure 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:abc123456
#数据库负载均衡
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
server MySQL_4 172.18.0.5:3306 check weight 1 maxconn 2000
server MySQL_5 172.18.0.6:3306 check weight 1 maxconn 2000
#使用keepalive检测死链
option tcpka


复制代码

3.创建Haproxy容器

复制代码
docker run -it -d 
-p 4001:8888 -p 4002:3306
-v /home/soft/haporxy:/usr/local/etc/haproxy
--name haproxy_node1
--privileged
--net=zxx.cms_server_pxc_net
haproxy

docker exec -it haproxy_node1 bash
haproxy
-f /usr/local/etc/haproxy
复制代码

  

ps:此处遇到问题1 在启动haproxy容器后 集群节点A挂掉(原因未知) 重启容器后立刻退出  查阅资料后有几个解决方案

  1.删除数据卷重建 测试可行 但是数据丢失 不推荐

  2.删除容器 重新创建 

  3.进入数据卷目录 /var/lib/docker/volumes/v1/_data  找到 grastate.dat 修改safe_to_bootstrap: 1,便能成功启动了。其余节点都是关联的node1节点,只要node1节点启动了,在创建其余节点严格按照步骤来的话,应该是能成功启动的。(原因为节点未能正常退出 safe_to_bootstrap为0 修改为1就可以了)

这里可能会担心 节点一挂掉了 其他是不是都不可用了 不是的 我停掉了 节点一的容器 修改节点2的数据 其他节点仍可以同步

 

posted @   Felix-Zhang  阅读(609)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
点击右上角即可分享
微信分享提示
CONTENTS