搭建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的数据 其他节点仍可以同步