docker下用keepalived+Haproxy+mysql实现高可用负载均衡集群(单机伪集群体验)

注意事项:

1.切记percona/percona-xtradb-cluster 的版本要统一,否则可能出现各种各样的问题
2.宿主机要关闭SELINUX。修改文件vi /etc/selinux/config,设置SELINUX为disabled,然后reboot机子

创建自定义网络

docker network create --subnet=172.18.0.0/16 mynetwork

启动创建pxc服务

  • 创建my.cnf配置文件(配置文件在/home/workspace/pxc/config/node*文件夹下,具体根据docker的映射目录进行创建,此步骤也可以省略)
[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

  • 子节点1
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可以连接上数据库。等数据库完全创建好,再创建下面的子节点,否则会出现一些问题。

  • 子节点2
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端口测试,发现都能连上数据库

创建haproxy+keepalived

  • 创建配置文件haproxy.cfg(在宿主主机/home/workspace/haproxy/config目录下创建)
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

宿主主机上安装一个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)

测试发现成功了

你可能感兴趣的:(mysql,docker,docker,mysql,负载均衡)