1.MySQL集群介绍
常见 MYSQL 集群方案
PXC原理
Percona XtraDB Cluster提供了MySQL高可用数据高一致性的一种实现方法。PXC集群以节点组成(推荐至少3节点,便于故障恢复,后面会讨论两节点的情况),每个节点都是基于常规的 MySQL/Percona Server,意味着你可以从集群中分离出某节点单独使用。集群中每个节点都包含完整的数据。
Replication原理
Replication的思想是将数据在集群的多个节点同步、备份,以提高集群数据的可用性(HA);Mysql使用Replication架构来实现上述目的,同时可以提升了集群整体的并发能力。5.6版本作为一个里程碑,对replication做了不少的优化调整,提高了集群数据的一致性、同步的性能以及数据自动恢复(recovery)的能力。
Replication架构通常由一个master和一个或者多个slaves构成,master接收应用的writes操作(事务中的read、write操作均有master处理),slaves接收read操作。在master上发生的数据变更,都将会复制给slaves,从直观而言,replication架构解决了)数据多点备份,提高数据可用性)读写分流,提高集群的并发能力。(并非是负载均衡))让一些非实时的数据操作,转移到slaves上进行
PXC 方案与 Replication 方案的对比
PXC 的数据强一致性
- 同步复制,事务在所有集群节点要么同时提交,要么不提交 Replication
- 采用异步复制,无法保证数据的一致性
Replication | PXC |
数据同步是单向的,master负责写,然后异步复制给slave;如果slave写入数据,不会复制给master。 | 数据同步时双向的,任何一个mysql节点写入数据,都会同步到集群中其它的节点。 |
异步复制,从和主无法保证数据的一致性 | 同步复制,事务在所有集群节点要么同时提交,要么同时不提交 |
2.创建 MySql 集群
2.1 拉取PXC镜像
#拉取5.7.20版本的PXC镜像
docker pull percona/percona-xtradb-cluster:5.7.20
#拉取下来的镜像名字太长了,改一下名字
docker tag percona/percona-xtradb-cluster:5.7.20 pxc5720:5.7.20
2.2创建内部网络
出于安全考虑,需要给 PXC 集群实例创建 Docker 内部网络
#创建网段,假设创建网段172.18.0.0(默认:172.17.0.0),子网掩码是24位
docker network create --subnet=172.18.0.0/24 net1
#查看网段
docker network inspect net1
# 删除网段,这里不需要删除
docker network inspect net1
2.3创建docker数据卷
Docker 卷是容器中的 PXC 节点映射数据目录的解決办法
- 一旦创建出docker容器,尽量不要把业务数据存在容器内,因为出问题的话数据可能就找不到了。
- 可以把业务数据保存在宿主机内,通过映射技术将宿主机上的目录映射到容器内。在运行容器的时候,把业务数据保存在映射目录里,也就是存储到宿主机上面。如果容器出什么问题,可以在创建一个容器,再将目录映射给该容器,则业务数据就导入了
#创建数据卷
docker volume create v1
#查看数据卷,我们也可以去docker安装目录中volumes目录中查看数据卷是否创建成功
docker inspect v1
# 删除volume,不需要删除
docker volume rm v1
#我们需要五个
docker volume create v2
docker volume create v3
docker volume create v4
docker volume create v5
2.4创建PXC容器
#容器的3306,映射到宿主机的3310
docker run -d -p 3310:3306 -v v1:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 --privileged --name=node1 --net=net1 --ip 172.18.0.2 pxc5720:5.7.20
命令详解
命令 | 说明 |
-d | 代表创建的容器在后台运行 |
-p | 端口映射 宿主机端口:容器端口 |
-v | 路径映射 |
-e MYSQL_ROOT_PASSWORD=abc123456 | 指定mysql的root账号密码为abc123456 |
-e CLUSTER_NAME=PXC | 执行名称为PXC |
-e XTRABACKUP_PASSWORD=abc123456 | 指定mysql数据同步时用的密码为abc123456 |
–privileged | 给最高的权限 |
–name=node1 | 节点名称node1 |
–net=net1 | 使用的内部网段 |
–ip 172.18.0.2 | 分发的ip地址 |
percona-xtradb-cluster:5.7.20 | 镜像名称 |
切记因第一个节点初始化比较耗时一定要等第一个容器创建成功可以使用MySQL客户端连接了才能创建第二个,或者会报错创建不了下面的容器!
创建其他节点
以此类推 IP不一样 端口不一样 数据卷不一样 加入的PXC节点前一个就行
docker run -d -p 3311:3306 -v v2:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=node1 --privileged --name=node2 --net=net1 --ip 172.18.0.3 pxc5720:5.7.20
docker run -d -p 3312:3306 -v v3:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=node1 --privileged --name=node3 --net=net1 --ip 172.18.0.4 pxc5720:5.7.20
docker run -d -p 3313:3306 -v v4:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=node1 --privileged --name=node4 --net=net1 --ip 172.18.0.5 pxc5720:5.7.20
docker run -d -p 3314:3306 -v v5:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=node1 --privileged --name=node5 --net=net1 --ip 172.18.0.6 pxc5720:5.7.20
3.haproxy负载均衡
haproxy简介
haproxy提供高可用性、负载均衡以及基于TCP(第四层)和HTTP(第七层)应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。
3.1拉取haproxy镜像
docker pull haproxy:2.2.1
Mysql创建用户 下面运行haproxy要用到
create user 'haproxy'@'%' identified by '';
3.3创建haproxy的配置文件
# 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:123456
#数据库负载均衡
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.4运行haproxy容器
docker run -it -d -p 4001:8888 -p 4002:3306 -v /home/docker/pxc:/usr/local/etc/haproxy --name haprox --net=net1 --ip 172.18.0.10 --privileged haproxy:2.2.1
4001端口是我们可以访问的一个端口
4002是MySQL的端口,我们通过Navicat连接时用的
-v挂载的是配置文件的目录,/home/docker/pxc是我们放haproxy配置的目录
3.5访问haproxy
http://主机IP地址:4001/dbs
注:在我们框架中连接haproxy的运行的MySQL就行了
-----整个流程到这里就结束了,感谢观众老爷们的阅读!!!