目录
Day5
常见的mysql集群解决方案
1. Replication方案
- 速度快
- 弱一致性:存储数据时,主节点存储成功后直接回复成功,其他节点同步情况不影响回复结果(数据同步是异步的)
- 适合存储低价值数据
- 例如:系统日志、新闻、帖子
2. PXC方案
- 速度慢
- 强一致性:存储数据时,数据同步都完成后回复成功,有一个节点不成功都回复失败
- 适合存储高价值数据
- 例如:订单 账户 财务
两种集群方案是互补的关系。
PXC集群方案
- 全称 percona-xtradb-cluster
1、拉取pxc镜像
- 拉取镜像
docker pull percona/percona-xtradb-cluster
- 做镜像副本
docker tag percona/percona-xtradb-cluster pxc
- 删除原镜像
docker rmi percona/percona-xtradb-cluster
2、创建新的网络
- 出于安全考虑,将pxc集群部署在另一个局域网
- redis集群部署在172.17.0.1这个局域网内
- 把pxc集群部署在172.18.0.1这个局域网内
- 用docker新建一个局域网
docker network create --subnet=172.18.0.1/24 net_pxc
172.18.0.1是新建的网络虚拟网卡地址
/24是子网掩码 → 255.255.255.0
3、创建5个volume挂载卷
docker volume create pxc_v1
docker volume create pxc_v2
docker volume create pxc_v3
docker volume create pxc_v4
docker volume create pxc_v5
4、启动5个pxc容器
- 启pxc1容器
docker run -d -p 3001:3306
-e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC
-e XTRABACKUP_PASSWORD=root -v pxc_v1:/var/lib/mysql
–privileged --name=pxc1 --net=net_pxc --ip 172.18.0.11 pxc
- -p 3001:3306 端口映射【改】
- -e MYSQL_ROOT_PASSWORD=root 指定mysql的密码
- -e CLUSTER_NAME=PXC 指定集群的名字
- -e XTRABACKUP_PASSWORD=root 指定集群中节点同步密码
- -v pxc_v1:/var/lib/mysql 指定挂载卷【改】
- –privileged 赋予权限
- –name=pxc1指定容器名字【改】
- –net=net_pxc 指定网络(如果不指定,默认是docker0网络,即172.17.0.1)
- –ip 172.18.0.11 指定容器ip地址(如果不指定,会随机分配)【改】
- pxc 镜像的名字
以pxc1为集群的第一个节点,其他节点都加入pxc1节点,所以在启其他pxc容器都要加一个参数(-e CLUSTER_JOIN=pxc1),pxc1容器启动后,不能立即创建pxc2,因为pxc1容器创建后,容器中的mysql服务还处于启动中,集群的状态也处于启动中,如果立即创建pxc2,可能会创建失败,需要用navicat工具验证pxc1是否完全启动成功。
- 启pxc2/pxc3/pxc4/pxc5容器
docker run -d -p 3002:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=root -e CLUSTER_JOIN=pxc1 -v pxc_v2:/var/lib/mysql --privileged --name=pxc2 --net=net_pxc --ip 172.18.0.12 pxc
docker run -d -p 3003:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=root -e CLUSTER_JOIN=pxc1 -v pxc_v3:/var/lib/mysql --privileged --name=pxc3 --net=net_pxc --ip 172.18.0.13 pxc
docker run -d -p 3004:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=root -e CLUSTER_JOIN=pxc1 -v pxc_v4:/var/lib/mysql --privileged --name=pxc4 --net=net_pxc --ip 172.18.0.14 pxc
docker run -d -p 3005:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=root -e CLUSTER_JOIN=pxc1 -v pxc_v5:/var/lib/mysql --privileged --name=pxc5 --net=net_pxc --ip 172.18.0.15 pxc
- 同理,用navicat工具连接5个容器数据库,在pxc1中创建school数据库,在数据库中创建school表,增加数据后查看其它容器数据库是否同步。
任意一个节点的数据改变都会同步给其他的容器数据库
- 被连接的节点工作量比较大,不仅需要存储数据还要将数据同步给其他节点
解决方法:负载均衡,用haproxy,程序连接haproxy代理节点间接连接pxc mysql集群。
制作haproxy镜像
1、不使用官方的haproxy镜像的原因
- 官方的haproxy镜像使用Ubuntu操作系统,不是centOS7,不方便使用
2、制作haproxy镜像的步骤
- 下载haproxy镜像安装包
https://www.haproxy.org/download/2.0/src/ - 新建目录并下载安装包
mkdir haproxy
wget https://www.haproxy.org/download/2.0/src/haproxy-2.0.5.tar.gz
- 将Dockerfile和haproxy.cffg文件拷贝到安装包同级目录下
- 写Dockerfile文件【改-y和暴露端口8888】
FROM centos:7 #指定centos7为基础镜像
#将同级目录下的文件haproxy-2.0.5.tar.gz拷贝到该目录下
ADD haproxy-2.0.5.tar.gz /usr/local/etc/
## 安装编译工具,开始安装编译haproxy
RUN yum install -y gcc gcc-c++ glibc glibc-devel pcre \
pcre-devel openssl openssl-devel systemd-devel \
net-tools vim iotop bc zip unzip zlib-devel lrzsz \
tree screen lsof tcpdump wget ntpdate –y \
&& cd /usr/local/etc/haproxy-2.0.5 \
&& make ARCH=x86_64 TARGET=linux-glibc \
USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 \
USE_SYSTEMD=1 USE_CPU_AFFINITY=1 \
PREFIX=/usr/local/haproxy \
&& make install PREFIX=/usr/local/haproxy \
&& cp haproxy /usr/sbin/ \
&& mkdir /usr/local/haproxy/run
# 将Dockerfile同级目录下的haproxy.cfg配置文件拷贝到镜像的该目录下
ADD haproxy.cfg /etc/haproxy/
ADD haproxy.cfg /usr/local/etc/haproxy-2.0.5/
# 将 run_haproxy.sh 启动脚本文件拷贝到镜像的该目录下
ADD run_haproxy.sh /usr/bin
# 赋予 run_haproxy.sh 运行权限
RUN chmod +x /usr/bin/run_haproxy.sh
# 向外暴露 80 和 8888 端口
EXPOSE 80 8888
#执行 run_haproxy.sh 脚本
CMD ["/usr/bin/run_haproxy.sh"]
- 写 haproxy.cfg 配置文件【改路径src和ip/端口11:3306/12:3306…】
global
#工作目录
chroot /usr/local/etc/haproxy-2.0.5
#日志文件,使用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:admin
#数据库负载均衡
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 pxc_node1 172.18.0.11:3306 check weight 1 maxconn 2000
server pxc_node2 172.18.0.12:3306 check weight 1 maxconn 2000
server pxc_node3 172.18.0.13:3306 check weight 1 maxconn 2000
server pxc_node4 172.18.0.14:3306 check weight 1 maxconn 2000
server pxc_node5 172.18.0.15:3306 check weight 1 maxconn 2000
#使用keepalive检测死链
option tcpka
- 写run_haproxy.sh 脚本
#!/bin/bash
haproxy -f /etc/haproxy/haproxy.cfg
tail -f /etc/hosts
- 执行构建haproxy镜像命令
docker build -t mars/haproxy .
.表示执行该目录下的Dockerfile文件
- 使用mars/haproxy镜像启动一个容器
docker run -d -p 80:80 -p 3000:8888 mars/haproxy
因为已经配置了haproxy.cfg,所以容器启动后会自动代理pxc集群
- 访问haproxy的监控界面
192.168.87.101:3000/dbs
3、在 pxc集群中创建一个用户给 haproxy使用
CREATE USER 'haproxy'@'%' IDENTIFIED BY '';
这个用户创建好后,会自动同步给其他的pxc节点
- 需要指定haproxy节点和pxc集群节点在同一个局域网中
重新启动一个haproxy容器
docker run -d -p 80:80 -p 8888:8888 -p 3306:3306 --name haproxy --privileged --net=net_pxc --ip 172.18.0.10 mars/haproxy
此时镜像代理成功
- 暂停pxc2和pxc4检查检测页面
docker pause pxc2
docker pause pxc4
- 恢复pxc2和pxc4检查检测页面
docker unpause pxc2
docker unpause pxc4
4、集群的伸缩:在 pxc集群中再添加一个pxc6节点
- 创建新的volume挂载卷
docker volume create pxc_v6
- 启动新的pxc节点6
docker run -d -p 3006:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=root -e CLUSTER_JOIN=pxc1 -v pxc_v6:/var/lib/mysql --privileged --name=pxc6 --net=net_pxc --ip 172.18.0.16 pxc
- 此时发现监控页面中并没有代理到pxc6:原因是haproxy.cfg配置文件中只配置了pxc1-pxc5,需要修改haproxy.cfg配置文件
- 加入 server pxc_node6 172.18.0.16:3306 check weight 1 maxconn 2000
- 保存退出文件
- 删除haproxy容器
docker rm -f haproxy容器ID
- 重新启动一个haproxy容器,并挂载haproxy.cfg文件到容器中
docker run -d -p 80:80 -p 8888:8888 -p 3306:3306 -v /root/docker/haproxy/haproxy.cfg:/etc/haproxy/haproxy.cfg --name haproxy --privileged --net=net_pxc --ip 172.18.0.10 mars/haproxy
4、启一个tomcat部署EasyBuy项目访问haproxy节点
EasyBuy项目访问的mysql地址是haproxy代理地址
注册用户,查看是否能在每个pxc节点中添加数据