搭建5个MySQL节点
- 拉取镜像到本地
docker pull percona/percona‐xtradb‐cluster
- 镜像名称太长不方便使用,进行一下改名,改名后删除原来的镜像
docker tag percona/percona‐xtradb‐cluster pxc
docker rmi percona/percona‐xtradb‐cluster
- 创建内网网段net1
创建网段:docker network create --subnet=172.18.0.0/24 net1
查询网段信息: docker inspect net1
删除网段:docker network rm net1
- 创建docker数据卷
创建:docker volume create --name v1
查看数据卷信息:docker inspect v1
删除:docker volume rm v1
重复操作创建v1-v5共5个数据卷
创建备份数据卷:docker volume create --name backup
- 创建容器
- node1启动后一段时间再启动其他节点没如果node1没初始化完成就启动其他节点就会报错
- node如果启动几秒就挂掉了,删除对应的数据卷之后再重新创建数据卷再启动
- 参数说明:
- -d 后台运行
- -p 3307:3306 将容器内的3306端口映射到宿主机3307端口
- -e 初始化MySQL的基本参数
- -v 映射宿主机数据卷和容器目录
- –name 指定容器名
- –net 指定容器的网关
- –ip 指定容器的IP,如果不指定会自动生成
#创建第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
#创建第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
#创建第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
#创建第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
#创建第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
- 外部尝试连接5个MySQL节点,通过navicat进行连接
- ip为宿主机公网IP
- 端口为只设置到暴露到公网的端口
- 用户名root
- 密码abc123456
使用Haproxy实现负载均衡
MySQL各个节点之间通过TCP/IP协议进行交互,而使用较为广泛的负载均衡中间件nginx(适用于HTTP)就不太适合了,适用于TCP/IP协议的负载均衡中间件有Haproxy和LVS。这里采用Haproxy来实现负载均衡
- 安装Haproxy
拉取镜像到本地
docker pull haproxy
在宿主机创建haproxy.cfg的配置文件,放置在自定义目录,如/root/docker/haproxy/
下
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
- 启动第一个Haproxy容器
docker run -it -d -p 4001:8888 -p 4002:3306 -v /root/docker/haproxy:/usr/local/etc/haproxy --name h1 --privileged --net=net1 --ip 172.18.0.7 haproxy
参数说明
- 4001:8888 :将haproxy暴露在8888的监控端口映射到宿主机
- 4002:3306:将haproxy的3306端口映射到宿主机4002端口
- 将haproxy的/usr/local/etc/haproxy目录映射到宿主机的/root/docker/haproxy目录,用于设置配置文件
- haproxy取名为h1
- 使用网段net1
- 手动设置一个ip为172.18.0.7
- 启动第一个Haproxy
以界面交互方式进入容器:
docker exec -it h1 bash
加上配置文件启动
haproxy -f /usr/local/etc/haproxy/haproxy.cfg
- 启动第二个Haproxy容器
docker run -it -d -p 4003:8888 -p 4004:3306 -v /root/docker/haproxy:/usr/local/etc/haproxy --name h2 --privileged --net=net1 --ip 172.18.0.8 haproxy
- 启动第一个Haproxy
以界面交互方式进入容器:
docker exec -it h2 bash
加上配置文件启动
haproxy -f /usr/local/etc/haproxy/haproxy.cfg
- 配置连接账号
先任意登录一个MySQL节点
在MySQL中创建一个没有权限的haproxy用户,密码为空。
Haproxy使用这个账户对MySQL数据库心跳检测
CREATE USER 'haproxy' @'%' IDENTIFIED BY '';
- 访问Haproxy监控
url可以是任意一个节点的监控端口
公网ip:4001/dbs
公网ip:4003/dbs
访问界面如图所示
使用的时候就可以直接向haproxy节点发起请求,haproxy只是对请求进行转发,并不会进行存储
用navicat连接一个节点方便使用
Keepalived实现高可用方案
PXC集群的目的是保证单节点MySQL故障时的高可用
引入Haproxy做负载均衡后,所有的请求都需要Haproxy进行转发
如果Haproxy宕机了,同样不能做到集群高可用
所以需要对Haproxy也进行高可用配置
方案如下
现在已经配置好了数据库集群和两个节点的Haproxy
还需要在两个Haproxy上各配置一个Keepalived
然后在宿主机上配置一个Keepalived用于为外提供服务
- 在haproxy上安装keepalived(haproxy镜像使用的是unbuntu,所以以下操作使用apt-get)
进入haproxy
docker exec -it h1 bash
更新apt-get
apt-get update
下载keepalived
apt-get install keepalived
修改keepalived配置文件
因为keepalived镜像装载ubuntu上,如果直接修改还需要装vim等工具,所以可以在宿主机写好了复制进来或者设置目录映射
编写keepalived.conf文件
vrrp_instance VI_1 {
state MASTER #keepalived的身份:MASTER主服务,会抢占虚拟ip;BACKUP备用服务
interface eth0 #网卡配置较:etho是docker虚拟机的网卡,宿主机能访问但是局域网不能访问,宿主机的keepalived上将网卡映射到局域网
virtual_router_id 51 #id:0-255间随便取
priority 100 #权重,根据硬件配置调整数字
advert_int 1 # 心跳检测的时间间隔 1s
authentication { #心跳检测需要开放的密码
auth_type PASS
auth_pass 123456
}
virtual_ipaddress { #eth0开放的虚拟ip
172.18.0.201
}
}
采用宿主机写好再复制的操作:
docker cp 宿主机文件路径 镜像名称:镜像中文件存放路径
docker cp /root/keepalived.conf h1:/etc/keepalived/
启动keepalived
service keepalived start
返回宿主机测试是否启动成功
ping 172.18.0.201
同理修改h2中的配置,其中所有的配置包括ip设置都一模一样
- 宿主机安装keepalived
yum ‐y install keepalived
修改配置文件
vi /etc/keepalived/keepalived.conf
配置文件如下
其中:
- 172.26.0.288表示本地网关下的任意一个IP
- 查看本地网关可以通过:
ip addr
/ifconfig
/ip a
查看 - 172.18.0.201表示Haproxy的IP
- 8888是Haproxy监控的端口
- 3306是MySQL的端口
virtual_server 172.26.0.228 8888 {
delay_loop 3
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
real_server 172.18.0.201 8888 {
weight 1
}
}
virtual_server 172.26.0.228 3306 {
delay_loop 3
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
real_server 172.18.0.201 3306 {
weight 1
}
}
启动keepalived
service keepalived start
启动完成之后可以通过ping自定义的IP来查看是否连接成功
ping 172.26.0.228
- 数据热备份
进入node1
docker exec ‐it node1 bash
更新apt-get
apt‐get update
安装热备份工具
apt‐get install percona‐xtrabackup‐24
进行全量热备份
innobackupex ‐‐user=root ‐‐password=abc123456 /data/backup/full