mysqlslap -h192.168.1.16 -uroot -p123456 -P3306 --concurrency=5000 --iterations=1 --auto-generate-sql --auto-generate-sql-load-type=mixed --auto-generate-sql-add-autoincrement --engine=innodb --number-of-queries=5000 --debug-info
关于这个测试命令呢,我简单讲一下几个关键参数
--concurrency=5000 表示启动5000个线程连接数据库
--iterations=1 测试执行次数
--number-of-queries=5000 总的执行次数
这个mysqlslap是mysql自带的测试工具,大家可以试一下。
我分别在物理机和虚拟机上做了两次测试,物理机在10000的测试下出现了大量的失败信息,虚拟机5000的测试就导致mysql服务挂掉了,已经无法自动回复!大家可以自行测试,说道这里,大家肯定不会忘记大学校园网选课或者查成绩的时候,基本上都是登录不上去,实际上也验证了这个问题。
关于docker的介绍,我这里不做重点,大家自行查阅相关资料。
docker 安装也有很多种方式,包括docker镜像加速器,我推荐使用阿里云相关产品,不要问我为什么,因为我用的很爽!
先更新软件包
yum -y update
-y update
安装Docker虚拟机
yum install -y docker
-y docker
运行、重启、关闭Docker虚拟机
service docker start
docker start
service docker start
docker start
service docker stop
docker stop
搜索镜像
docker search 镜像名称
下载镜像
docker pull 镜像名称
查看镜像
docker images
删除镜像
docker rmi 镜像名称
运行容器
docker run 启动参数 镜像名称
查看容器列表
docker ps -a
ps -a
停止、挂起、恢复容器
docker stop 容器ID
stop 容器ID
docker pause 容器ID
docker unpase 容器ID
查看容器信息
docker inspect 容器ID
删除容器
docker rm 容器ID
rm 容器ID
数据卷管理
docker volume create 数据卷名称 #创建数据卷
#创建数据卷
docker volume rm 数据卷名称 #删除数据卷
rm 数据卷名称 #删除数据卷
docker volume inspect 数据卷名称 #查看数据卷
#查看数据卷
网络管理
docker network ls 查看网络信息
ls 查看网络信息
docker network create --subnet=网段 网络名称
--subnet=网段 网络名称
docker network rm 网络名称
rm 网络名称
看过上面这些docker 命令,接下来我们就正式开始吧,对了你还需要一台linux服务器,这里我使用的vmware虚拟机
使用的centos 7.4的镜像系统。
在虚拟机中安装好docker,练习过上述命名后,我们开始进入下面主要部分。
安装PXC镜像
docker pull percona/percona-xtradb-cluster
为PXC镜像改名
docker tag percona/percona-xtradb-cluster pxc
创建net1网段
docker network create --subnet=172.18.0.0/16 net1
--subnet=172.18.0.0/16 net1
创建5个数据卷
docker volume create --name v1
--name v1
docker volume create --name v2
--name v2
docker volume create --name v3
--name v3
docker volume create --name v4
--name v4
docker volume create --name v5
--name v5
创建备份数据卷(用于热备份数据)
docker volume create --name backup
--name backup
创建5节点的PXC集群
注意,每个MySQL容器创建之后,因为要执行PXC的初始化和加入集群等工作,耐心等待1分钟左右再用客户端连接MySQL。另外,必须第1个MySQL节点启动成功,用MySQL客户端能连接上之后,再去创建其他MySQL节点。
#创建第1个MySQL节点
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -v v1:/var/lib/mysql -v backup:/data --privileged --name=node1 --net=net1 --ip 172.18.0.2 pxc
-d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -v v1:/var/lib/mysql -v backup:/data --privileged --name=node1 --net=net1 --ip 172.18.0.2 pxc
#创建第2个MySQL节点
docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -e CLUSTER_JOIN=node1 -v v2:/var/lib/mysql -v backup:/data --privileged --name=node2 --net=net1 --ip 172.18.0.3 pxc
-d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -e CLUSTER_JOIN=node1 -v v2:/var/lib/mysql -v backup:/data --privileged --name=node2 --net=net1 --ip 172.18.0.3 pxc
#创建第3个MySQL节点
docker run -d -p 3308:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -e CLUSTER_JOIN=node1 -v v3:/var/lib/mysql --privileged --name=node3 --net=net1 --ip 172.18.0.4 pxc
-d -p 3308:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -e CLUSTER_JOIN=node1 -v v3:/var/lib/mysql --privileged --name=node3 --net=net1 --ip 172.18.0.4 pxc
#创建第4个MySQL节点
docker run -d -p 3309:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -e CLUSTER_JOIN=node1 -v v4:/var/lib/mysql --privileged --name=node4 --net=net1 --ip 172.18.0.5 pxc
-d -p 3309:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -e CLUSTER_JOIN=node1 -v v4:/var/lib/mysql --privileged --name=node4 --net=net1 --ip 172.18.0.5 pxc
#创建第5个MySQL节点
docker run -d -p 3310:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -e CLUSTER_JOIN=node1 -v v5:/var/lib/mysql -v backup:/data --privileged --name=node5 --net=net1 --ip 172.18.0.6 pxc
-d -p 3310:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -e CLUSTER_JOIN=node1 -v v5:/var/lib/mysql -v backup:/data --privileged --name=node5 --net=net1 --ip 172.18.0.6 pxc
至此我们的5节点pxc集群已经搭建完成,大家可以通过navicat等mysql客户端工具连接。测试在任何一个数据库节点创建或修改数据,其它节点均会自动同步数据。
5节点pxc集群已经搭建完毕,实际上我们可以连接任何一个节点操作数据库,其它节点均会同步该节点数据。
但上述集群仍然存在问题,假如我们连接的那个节点挂掉了,那么集群就不可以用了,因此
仅仅完成以上集群还是远远不够的,实际后台应用仍然无法达到高性能高可用的目的。
关于负载均衡,相信大家都不陌生,例如web应用使用的nginx,这里我选择的是老牌的haproxy,至于原因,请大家自行查阅资料。
安装Haproxy镜像
docker pull haproxy
宿主机上编写Haproxy配置文件
vi /home/soft/haproxy.cfg
/home/soft/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
:8888
#访问协议
mode http
#URI相对地址
stats uri /dbs
#统计报告格式
stats realm Global\ statistics
#登陆帐户信息
stats auth admin:abc123456
:abc123456
#数据库负载均衡
listen proxy-mysql
#访问的IP和端口
bind 0.0.0.0:3306
: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
:3306 check weight 1 maxconn 2000
server MySQL_2 172.18.0.3:3306 check weight 1 maxconn 2000
:3306 check weight 1 maxconn 2000
server MySQL_3 172.18.0.4:3306 check weight 1 maxconn 2000
:3306 check weight 1 maxconn 2000
server MySQL_4 172.18.0.5:3306 check weight 1 maxconn 2000
:3306 check weight 1 maxconn 2000
server MySQL_5 172.18.0.6:3306 check weight 1 maxconn 2000
:3306 check weight 1 maxconn 2000
#使用keepalive检测死链
option tcpka
创建两个Haproxy容器
#创建第1个Haproxy负载均衡服务器
docker run -it -d -p 4001:8888 -p 4002:3306 -v /home/soft/haproxy:/usr/local/etc/haproxy --name h1 --privileged --net=net1 --ip 172.18.0.7 haproxy
-it -d -p 4001:8888 -p 4002:3306 -v /home/soft/haproxy:/usr/local/etc/haproxy --name h1 --privileged --net=net1 --ip 172.18.0.7 haproxy
#进入h1容器,启动Haproxy
docker exec -it h1 bash
-it h1 bash
haproxy -f /usr/local/etc/haproxy/haproxy.cfg
-f /usr/local/etc/haproxy/haproxy.cfg
#创建第2个Haproxy负载均衡服务器
docker run -it -d -p 4003:8888 -p 4004:3306 -v /home/soft/haproxy:/usr/local/etc/haproxy --name h2 --privileged --net=net1 --ip 172.18.0.8 haproxy
-it -d -p 4003:8888 -p 4004:3306 -v /home/soft/haproxy:/usr/local/etc/haproxy --name h2 --privileged --net=net1 --ip 172.18.0.8 haproxy
#进入h2容器,启动Haproxy
docker exec -it h2 bash
-it h2 bash
haproxy -f /usr/local/etc/haproxy/haproxy.cfg
-f /usr/local/etc/haproxy/haproxy.cfg
到这里,大家肯定会问,为什么创建两个haproxy呀,怎么用的啊,别急,让我慢慢讲。请看下面!
Haproxy容器内安装Keepalived,设置虚拟IP
#进入h1容器
docker exec -it h1 bash
-it h1 bash
#更新软件包
apt-get update
#安装VIM
apt-get install vim
vim
#安装Keepalived
apt-get install keepalived
#编辑Keepalived配置文件(参考下方配置文件)
vim /etc/keepalived/keepalived.conf
/etc/keepalived/keepalived.conf
#启动Keepalived
service keepalived start
keepalived start
#宿主机执行ping命令
ping 172.18.0.201
172.18.0.201
配置文件内容如下:
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
172.18.0.201
}
}
#进入h2容器
docker exec -it h2 bash
-it h2 bash
#更新软件包
apt-get update
#安装VIM
apt-get install vim
vim
#安装Keepalived
apt-get install keepalived
#编辑Keepalived配置文件
vim /etc/keepalived/keepalived.conf
/etc/keepalived/keepalived.conf
#启动Keepalived
service keepalived start
keepalived start
#宿主机执行ping命令
ping 172.18.0.201
172.18.0.201
配置文件内容如下:
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
51
priority 100
100
advert_int 1
1
authentication {
auth_type PASS
auth_pass 123456
123456
}
virtual_ipaddress {
172.18.0.201
172.18.0.201
}
}
宿主机安装Keepalived,实现双击热备
#宿主机执行安装Keepalived
yum -y install keepalived
-y install keepalived
#修改Keepalived配置文件
vi /etc/keepalived/keepalived.conf
/etc/keepalived/keepalived.conf
#启动Keepalived
service keepalived start
keepalived start
Keepalived配置文件如下:
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
51
priority 100
100
advert_int 1
1
authentication {
auth_type PASS
auth_pass 1111
1111
}
virtual_ipaddress {
192.168.99.150
192.168.99.150
}
}
virtual_server 192.168.99.150 8888 {
192.168.99.150 8888 {
delay_loop 3
3
lb_algo rr
lb_kind NAT
persistence_timeout 50
50
protocol TCP
real_server 172.18.0.201 8888 {
172.18.0.201 8888 {
weight 1
1
}
}
virtual_server 192.168.99.150 3306 {
192.168.99.150 3306 {
delay_loop 3
3
lb_algo rr
lb_kind NAT
persistence_timeout 50
50
protocol TCP
real_server 172.18.0.201 3306 {
172.18.0.201 3306 {
weight 1
1
}
}
终于搞定了!到这里,一个5节点的pxc集群已经实现了真正意义上的高可用。任何一个数据库节点挂掉,没有问题,业务任然可以访问其他数据库,一个haproxy挂掉,也没问题,还有另一个提供负载均衡。
结束!
等等,说好的高性能,高可用呢,高性能去哪里了?补充说明,pxc集群只能保证节点之间数据同步,而且保证数据一致性,也就是说node1节点中有2000万条数据,其它节点同样有这么多数据,说以高性能无法保证,pxc集群的性能取决于集群中性能最差的节点,而不是最好的节点。有没有既有高性能,又有高可用的解决方案呢?我说有!在哪里?。。。。
好困啊,凌晨1点了,睡觉吧,后续我会介绍如何结合mycat达到高性能的目的,以及后端、前端项目的高可用方案。
晚安!
这里有个很重要的事情忘记讲了,pxc集群停掉之后,直接通过docker start node1 或者任何一个节点是启动不了的,原因是集群之前的同步机制造成的,启动任何一个节点,该节点都会去其它节点同步数据,其它节点仍处于宕机状态,所以该节点启动失败,这也是pxc集群的强一致性的表现,解决方式是,删除所有节点docker rm node1 node2 node3 node4 node 5
和数据卷中的grastate.dat文件
rm -rf /var/lib/docker/volumes/v1/_data/grastate.dat
rm -rf /var/lib/docker/volumes/v2/_data/grastate.dat
rm -rf /var/lib/docker/volumes/v3/_data/grastate.dat
rm -rf /var/lib/docker/volumes/v4/_data/grastate.dat
rm -rf /var/lib/docker/volumes/v5/_data/grastate.dat
重新执行集群创建的命令即可,因为数据都在数据卷中,所有放心,集群重新启动都数据仍然都在.。
对于初学者操作可能不熟练,容易出错,因此我把docker下载安装(用的阿里云的docker-ce),镜像加速(阿里云的 镜像加速),网络配置,镜像下载,创建数据卷,创建pxc5个节点的命令整理好了脚本,初学者只需要在centos虚拟机内执行./deploy-pxc-create.sh脚本即可等待整个docker环境和后续集群搭建完毕,直接用mysql客户端连接使用,测试,十分方便。首次将脚本文件放到虚拟机内,先授权 chmod 777 deploy-pxc-create.sh 之后执行脚本即可。无需自己安装docker环境。
一键搭建docker环境下的pxc集群