注意事项:
1.切记percona/percona-xtradb-cluster 的版本要统一,否则可能出现各种各样的问题
2.宿主机要关闭SELINUX。修改文件vi /etc/selinux/config
,设置SELINUX为disabled,然后reboot机子
docker network create --subnet=172.18.0.0/16 mynetwork
[mysqld]
lower_case_table_names=1
sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'
docker run -d -p 3301:3306 -v /home/workspace/pxc/data/node1:/var/lib/mysql \
-v /home/workspace/pxc/config/node1:/etc/percona-xtradb-cluster.conf.d \
-e MYSQL_ROOT_PASSWORD=root \
-e CLUSTER_NAME=PXC \
-e XTRABACKUP_PASSWORD=root --privileged -e TZ="Asia/Shanghai" \
--name=node1 --net=mynetwork --ip 172.18.0.2 \
--restart=always percona/percona-xtradb-cluster:8.0.30-22.1 \
--lower_case_table_names=1 --wsrep_node_address=172.18.0.2
chmod -R 774 /home/workspace/pxc/
docker restart node1
docker run -d -p 3302:3306 -v /home/workspace/pxc/data/node2:/var/lib/mysql \
-v /home/workspace/pxc/config/node2:/etc/percona-xtradb-cluster.conf.d \
-e MYSQL_ROOT_PASSWORD=root \
-e CLUSTER_NAME=PXC \
-e XTRABACKUP_PASSWORD=root \
-e CLUSTER_JOIN=node1 --privileged -e TZ="Asia/Shanghai" \
--name=node2 --net=mynetwork --ip 172.18.0.3 \
--restart=always percona/percona-xtradb-cluster:8.0.30-22.1 \
--lower_case_table_names=1 --wsrep_node_address=172.18.0.3
chmod -R 774 /home/workspace/pxc/
cp -rf /home/workspace/pxc/node1/*.pem /home/workspace/pxc/node2/
docker restart node2
最好等一分钟且用Navicat可以连接上数据库。等数据库完全创建好,再创建下面的子节点,否则会出现一些问题。
docker run -d -p 3303:3306 -v /home/workspace/pxc/node3:/var/lib/mysql \
-v /home/workspace/pxc/config/node3:/etc/percona-xtradb-cluster.conf.d \
-e MYSQL_ROOT_PASSWORD=root \
-e CLUSTER_NAME=PXC \
-e XTRABACKUP_PASSWORD=root \
-e CLUSTER_JOIN=node1 --privileged -e TZ="Asia/Shanghai" \
--name=node3 --net=mynetwork --ip 172.18.0.4 \
--restart=always percona/percona-xtradb-cluster:8.0.30-22.1 \
--lower_case_table_names=1 --wsrep_node_address=172.18.0.4
chmod -R 774 /home/workspace/pxc/
cp -rf /home/workspace/pxc/node1/*.pem /home/workspace/pxc/node3/
docker restart node3
创建一个没有任何权限的mysql用户haproxy (
CREATE USER `haproxy`@``;
)
用Navicat连接3301、3302、3303端口测试,发现都能连上数据库
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_monitor
#统计报告格式
stats realm Global\ statistics
#登陆帐户信息
stats auth admin:admin
#数据库负载均衡
listen proxy-mysql
#访问的IP和端口(前面ip=0代表任何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
#使用keepalive检测死链
option tcpka
注意:配置文件最后要有一个空行,否则会提示配置文件错误。
创建配置文件keepalived.conf(在宿主主机/home/workspace/haproxy/keepalived目录下创建)
vrrp_instance VI_1 {
#定义节点属性
state MASTER
#定义虚拟网卡
interface eth0
#定义组vriid
virtual_router_id 100
#定义权重
priority 100
#定义心跳检测时间1秒
advert_int 1
#定义组用户密码
authentication {
auth_type PASS
auth_pass 123456
}
#定义docker内ip地址,必须要在和haproxy同一个网段
virtual_ipaddress {
172.18.0.100
}
}
运行镜像,创建两个haproxy+keepalived
docker run -d -p 8887:8888 -p 3305:3306 --name haproxy01
-v /home/workspace/haproxy/config:/usr/local/etc/haproxy:ro
-v /home/workspace/haproxy/keepalived:/etc/keepalived
--privileged --net=mynetwork --restart=always --ip 172.18.0.21
instantlinux/haproxy-keepalived
docker run -d -p 8886:8888 -p 3304:3306 --name haproxy02
-v /home/workspace/haproxy/config:/usr/local/etc/haproxy:ro
-v /home/workspace/haproxy/keepalived:/etc/keepalived
--privileged --net=mynetwork --restart=always --ip 172.18.0.22
instantlinux/haproxy-keepalived
yum install -y keepalived
# 修改配置文件
vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
state MASTER
#这里是宿主机的网卡,可以通过ip a查看当前自己电脑上用的网卡名是哪个
interface eth0
virtual_router_id 100
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
#这里是指定的一个宿主机上的虚拟ip,一定要和宿主机网卡在同一个网段,我的宿主机网卡ip是10.10.10.3,所以指定虚拟ip是给的100
10.10.10.100
}
}
#接受监听数据来源的端口,网页入口使用
virtual_server 10.10.10.100 8888 {
delay_loop 3
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
#把接受到的数据转发给docker服务的网段及端口,由于是发给docker服务,所以和docker服务数据要一致
real_server 172.18.0.100 8888 {
weight 1
}
}
#接受数据库数据端口,宿主机数据库端口是3306,所以这里也要和宿主机数据接受端口一致
virtual_server 10.10.10.100 3306 {
delay_loop 3
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
#同理转发数据库给服务的端口和ip要求和docker服务中的数据一致
real_server 172.18.0.100 3306 {
weight 1
}
}
该配置文件注意要修改为自己的配置。
http://10.10.10.100:8888/dbs_monitor
连接数据库( ip:10.10.10.100 端口:3306)
测试发现成功了