搭建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的数据 其他节点仍可以同步
作者: Felix-Zhang
出处:https://www.cnblogs.com/zhangxiaoxia/p/13123514.html
版权:本站使用「CC BY 4.0」创作共享协议,转载请在文章明显位置注明作者及出处。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探