Redian新闻
>
Mysql集群之PXC-Docker安装

Mysql集群之PXC-Docker安装

公众号新闻



1.说明

  • PXC的版本是5.7.43

  • 使用三台机器:192.168.50.9 、192.168.50.18 、192.168.50.245

  • 三台机器都已经安装Docker

  • 调整下主机的文件句柄,防止mysql连接数不够 ulimit -HSn 65535

2. 基础准备

2.1 主机名更改

建议每台机器的主机名设置下,设置为不同的名称,方便管理。

# 查看主机名hostname
#设置主机名hostnamectl set-hostname xxx

2.2 镜像导入

因为我这边是离线的部署方式,对应的镜像包已经压缩为tar包了,如果有需要可以联系我。如果自行搭建,机器如果是连接网络的直接可以docker pull下。

cd /home/HA/pxc && docker load -i swarm.tar && docker load -i percona-xtradb-cluster.tar
docker pull percona/percona-xtradb-cluster:5.7.43docker pull swarm
有网络的话,执行如下的命令拉取镜像

2.3 swarm集群创建

50.9机器执行docker swarm init,会得到如下的图:

其他两台机器分别执行join语句即可加入集群。
如遇如下报错:可以先执行docker swarm leave,然后再执行join。
验证节点是否都加入,执行docker node ls

2.4 集群间网络创建

在init机器执行

docker network create -d overlay --attachable mysql_network
3. PXC安装

3.1 配置文件

每台机器执行如下命令,将配置文件拷贝对应目录

mkdir -p /home/mysql/config && cp /home/HA/pxc/my.cnf /home/mysql/config/

其中my.cnf内容如下:

[mysqld]skip_sslfederatedskip-name-resolvedefault-time-zone=+08:00character-set-server = utf8mb4collation-server = utf8mb4_general_ciinit_connect='SET collation_connection = utf8_unicode_ci'init_connect='SET NAMES utf8mb4'lower_case_table_names = 1log_bin_trust_function_creators=1
key_buffer_size=16Mmax_allowed_packet=512Msql_mode=TRADITIONALmax_connections = 20000 max_connect_errors = 1200max_user_connections = 20000group_concat_max_len = 102400
interactive_timeout = 610wait_timeout = 610innodb_thread_concurrency=32
innodb_buffer_pool_size=8589934592innodb_buffer_pool_instances=4server-id=1binlog_format=ROWlog_bin=/var/lib/mysql/binloglog_slave_updates
expire_logs_days = 1wsrep_provider_options='repl.commit_order =3;gcache.size=4096M'wsrep_log_conflicts[mysqldump]quickmax_allowed_packet = 16M
[mysql]default-character-set = utf8mb4

个人踩坑的点:因为项目用到canal,但是PXC集群间binlog不同步,研究后发现添加log_slave_updateswsrep_provider_options='repl.commit_order =3;gcache.size=4096M'wsrep_log_conflicts这几个参数解决了该问题。其他server-id每台机器需要更改为不同的。

3.2 安装

在50.9执行如下命令,进行pxc的主节点初始化。

docker volume create  mysql_data  docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=3er4#ER$  \  -e CLUSTER_NAME=PXC1 -e XTRABACKUP_PASSWORD=3er4#ER$  \  -v mysql_data:/var/lib/mysql -v /etc/localtime:/etc/localtime  \  -v /home/mysql/config:/etc/percona-xtradb-cluster.conf.d  \  --privileged --name=pn1 --net=mysql_network   \  percona/percona-xtradb-cluster:5.7.43

在50.18与50.245分别执行如下命令:

docker volume create  mysql_data  docker run -d -p 3306:3306  -e MYSQL_ROOT_PASSWORD=3er4#ER$ \  -e CLUSTER_NAME=PXC1 -e XTRABACKUP_PASSWORD=3er4#ER$ -e CLUSTER_JOIN=pn1  \  -v mysql_data:/var/lib/mysql  \  -v /home/mysql/config:/etc/percona-xtradb-cluster.conf.d \  --privileged --name=pn2 --net=mysql_network  \  percona/percona-xtradb-cluster:5.7.43
docker volume create mysql_data docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=3er4#ER$ \ -e CLUSTER_NAME=PXC1 -e XTRABACKUP_PASSWORD=3er4#ER$ -e CLUSTER_JOIN=pn1 \ -v mysql_data:/var/lib/mysql \ -v /home/mysql/config:/etc/percona-xtradb-cluster.conf.d \ --privileged --name=pn3 --net=mysql_network \ percona/percona-xtradb-cluster:5.7.43

即加入的节点只需要调整自己的name就可以了。在mysql的客户端连接A机器,ip:3306,账密:root/3er4#ER$,执行如下命令查看连接节点数量:

show status like '%wsrep_incoming_addresses%';
可以看到3个节点连接正常。

3.3 常见故障处理

  • 非主节点宕机
    非主节点宕机,即join进去的节点挂了后,只需要重启容器即可。

  • 主节点宕机
    主节点宕机的处理比较复杂,得需要先停止另外一个节点,比如18,这样245的机器就是最后一个退出集群的节点了。 docker inspect mysql_data找到pxc的data文件,然后修改grastate.dat,将safe_to_bootstrap改为1,然后通过docker rm -f xx干掉原来的容器,通过上面的安装步骤,将pn1节点初始化再该机器,然后其他两个节点进行加入,即可。

4. 将pxc进行负载均衡

4.1 利用Nginx进行负载均衡(不推荐)

因为这样业务再sql失败如果没有重试机制的话会丢数据的。Nginx配置文件如下:

  stream {    upstream mysql23306 {        hash $remote_addr consistent;   #负载方法        server 192.168.50.18:3306 max_fails=5 fail_timeout=30s;        server 192.168.50.9:3306 max_fails=5 fail_timeout=30s;        server 192.168.50.245:3306 max_fails=5 fail_timeout=30s;    }    server {        listen 23306;   #服务器监听端口        proxy_connect_timeout 60;        proxy_timeout 300s;    #设置客户端和代理服务之间的超时时间,如果5分钟内没操作将自动断开。        proxy_pass mysql23306;   }      }

4.2 Haproxy进行负载均衡

因为有心跳机制,所以有异常后会第一时间剔除。


创建mysql心跳检查用户
#指定数据库use mysql;#创建用户create user 'haproxy'@'%' identified by '';# 刷新权限flush privileges;
修改配置文件haproxy.cfg
global #工作目录 chroot /usr/local/etc/haproxy #日志文件,使用rsyslog服务中local5日志设备(/var/log/local5),等级info log 127.0.0.1 local5 info #守护进程运行 daemon maxconn 10000
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 10.0.1.2:3306 check weight 1 maxconn 2000 server MySQL_2 10.0.1.4:3306 check weight 1 maxconn 2000 server MySQL_3 10.0.1.6:3306 check weight 1 maxconn 2000 #使用keepalive检测死链 option tcpka


其中最后的server部分的ip,得到每个容器节点,去获取其内部容器IP。(这样会带来一个问题,就是PXC故障后,重启会出现IP变化的情况,解决方案(没有验证过):1.可以在创建PXC节点的时候指定好ip 2.可以使用宿主机Ip代替)

  • 启动haproxy

docker run -it -d  -p 18888:8888 -p 13306:3306 -v /home/haproxy:/usr/local/etc/haproxy --name h1 --privileged --net=mysql_network  haproxy:2.8

链接:https://juejin.cn/post/7304263961238994979

(版权归原作者所有,侵删)


微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
“MySQL 之父”的 MariaDB 要完蛋了?叫停两款核心产品并裁员 28%,分析师:该行为无异于自毁长城向你诉说“MySQL 之父”的 MariaDB 要完蛋了?叫停两款核心产品并裁员 28%“公”和“私”是“自”衣裳,不自由 ,毋宁死”的正读,当为“私秘处都护不住,换了这underwear 。要不然呢?”GitHub多项服务故障,与升级MySQL有关?Redis缓存与Mysql如何保证双写一致埃及游记:帝王谷壁画与罗塞塔石碑基于MySQL多通道主主复制的机房容灾方案基于 MySQL 多通道主主复制的机房容灾方案MySQL 8.2 正式可用,支持读写分离【Locker Room】Locker Room运动上新!女篮、飞盘&腰旗橄榄球,你准备好了吗?MYSQL事务的底层原理Docker的使用案例以及未来发展、Docker Hub 服务、环境安全、容器部署安全聊聊即将到来的MySQL5.7停服事件MySQL备份恢复最佳实践:终极指南mysql8.0存储过程Not《幻象》but 《偶像》=Eidolons [華特·惠特曼]为何在中国MySQL远比PostgreSQL流行MySQL主从同步延迟原因与解决方案长篇小说连载《此世,此生》第五十五章二MySQL到TiDB:Hive Metastore横向扩展之路MySQL到底是 join 性能好,还是in一下更快呢?一网打尽总结 Mysql 的所有 BufferMySQL 支持 JavaScript,目前处于预览阶段MySQL binlog 三个典型的业务应用场景如何设计一款基于 MySQL 实现的 Message Queue重磅 |《开源数据库生态发展研究报告》发布 GreatSQL为MySQL5.7最佳替代方案!4 种 MySQL 同步 ES 方案,yyds!MySQL数据导入方案推荐MySQL 分库分表实践阿里终面:10亿数据如何快速插入MySQL?MySQL中update“经典”的坑,这样写语句,直接劝退!DoltgreSQL发布,基于Git的PostgreSQLMySQL如何性能调优?上篇Python如何使用MySQL 8.2读写分离?
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。