MySQL 数据库集群-PXC 方案(二)
集群状态信息
PXC 集群信息可以分为队列信息、复制信息、流控信息、事务信息、状态信息。这些信息可以通过 SQL 查询到。每种信息的详细意义可以在官网查看。
show status like '%wsrep%';
复制信息
举例说明几个重要的信息:
状态 | 描述 |
---|---|
wsrep_replicated | 被其他节点复制的次数 |
wsrep_replicated_bytes | 被其他节点复制的数据次数 |
wsrep_received | 从其他节点处收到的写入请求总数 |
wsrep_received_bytes | 从其他节点处收到的写入数据总数 |
wsrep_last_applied | 同步应用次数 |
wsrep_last_committed | 事务提交次数 |
队列信息
队列是一种很好的缓存机制,如果 PXC 正在满负荷工作,没有线程去执行数据的同步,同步请求会缓存到队列中,然后空闲线程从队列中取出任务,执行同步的请求,有了队列 PXC 就能用少量的线程应对瞬时大量的同步请求。
状态 | 描述 |
---|---|
wsrep_local_send_queue | 发送队列的长度(瞬时同步的请求数量) |
wsrep_local_send_queue_max | 发送队列的最大长度 |
wsrep_local_send_queue_min | 发送队列的最小长度 |
wsrep_local_send_queue_avg | 发送队列的平均长度 |
wsrep_local_recv_queue | 接收队列的长度 |
wsrep_local_recv_queue_max | 接收队列的最大长度 |
wsrep_local_recv_queue_min | 接收队列的最小长度 |
wsrep_local_recv_queue_avg | 接收队列的平均长度 |
当发送队列的平均长度(wsrep_local_send_queue_avg)
值很大,发送队列的长度(wsrep_local_send_queue)
也很大的时候,说明 PXC 集群同步数据的速度已经很慢了,队列里边积压了大量的同步请求,这个时候就要检查一下网速是不是正常,或者同步的线程数量是不是太少。
当接收队列的平均长度(wsrep_local_recv_queue_avg)
值很大,接收队列的长度(wsrep_local_recv_queue)
也很大的时候,这说明本地没有足够的线程去执行持久化的操作,增加线程就可以解决这个问题。
流量控制信息
流量控制就是 PXC 集群在同步速度较慢的情况下,为了避免同步速度跟不上写入速度而推出的一种限速机制,就是限制数据的写入,直到同步队列的长度变小,同步速度变快为止,才会解除流量控制。流量控制的后果很严重,而且一个很小的操作就会引发流量控制。
状态 | 说明 |
---|---|
wsrep_flow_control_paused_ns | 流控暂停状态下花费的总时间(纳秒) |
wsrep_flow_control_paused | 流量控制暂停时间的占比(0~1) |
wsrep_flow_control_sent | 发送的流控暂停事件的数量 |
wsrep_flow_control_recv | 接收的流控暂停事件的数量 |
wsrep_flow_control_interval | 流量控制的下限和上限。上限是队列中允许的最大请求数。如果队列达到上限,则拒绝新的请求。当处理现有请求时,队列会减少,一旦到达下限,将再次允许新的请求 |
wsrep_flow_control_status | 流量控制状态 OFF:关闭 0N: 开启 |
流控的主要原因节点之间同步的速度慢,队列积压了大量的请求,这才是流控的主要原因。
流控解决办法:
- 改善网速,提高带宽,更换交换机,千兆网卡更换成万兆网卡
- 增加线程,线程多了执行的速度也就快了。队列里边就不会积压大量的请求
- 提升硬件性能,比如升级 CPU,内存以及更换光纤硬盘等等都可以提高写入速度
第一项和第三项属于更换硬件的方法,主要说一下第二个方法增加线程数提升同步速度。在 PXC 的配置文件加上wsrep_slave_threads
参数。代表的是本地执行队列的线程数量,一般这个数是 CPU 线程数的 1-1.5 倍。比如服务器 CPU 是 8 核 16 线程的,这里就可以写 16-24 就可以。
wsrep_slave_threads=16
节点与集群的状态信息
状态 | 说明 |
---|---|
wsrep_local_state_comment | 节点状态 |
wsrep_cluster_status | 集群状态(Primary:正常状态、Non-Primary:出现了脑裂请求、Disconnected:不能提供服务,出现宕机) |
wsrep_connected | 节点是否连接到集群 |
wsrep_ready | 集群是否正常工作 |
wsrep_cluster_size | 节点数量 |
wsrep_desync_count | 延时节点数量 |
wsrep_incoming_addresses | 集群节点 IP 地址 |
事务相关信息
状态 | 说明 |
---|---|
wsrep_cert_deps_distance | 事务执行并发数 |
wsrep_apply_oooe | 接收队列中事务的占比 |
wsrep_apply_oool | 接收队列中事务乱序执行的频率 |
wsrep_apply_window | 接收队列中事务的平均数量 |
wsrep_commit_oooe | 发送队列中事务的占比 |
wsrep_commit_oool | 无任何意义,不存在本地的乱序提交 |
wsrep_commit_window | 发送队列中事务的平均数量 |
PXC 节点的安全下线操作
节点用什么命令启动,就用对应的关闭命令去关闭。
- 主节点的管理命令(第一个启动的 PXC 节点)
systemctl start mysql@bootstrap.service
systemctl stop mysql@bootstrap.service
systemctl restart mysql@bootstrap.service
- 非主节点的管理命令(非第一个启动的 PXC 节点)
service mysql start
service mysql stop
service mysql restart
- 如果最后关闭的 PXC 节点是安全退出的,那么下次启动要最先启动这个节点,而且要以主节点启动。
- 如果最后关闭的 PXC 节点不是安全退出的,那么要先修改
/var/lib/mysql/grastate.dat
文件,把其中的safe_to_bootstrap
属性值设置为 1,再按照主节点启动。
意外下线部分节点
安全下线节点不会让剩下的节点宕机,如果节点意外退出,集群的规模不会缩小,意外退出的节点超过半数,比如三个节点意外退出了 2 个节点,那么剩下的节点就不能够读写了。其他节点按照普通节点启动上线即可恢复 pxc 集群。
意外下线全部节点,不同时退出
如果三个节点都意外退出,那么查看/var/lib/mysql/grastate.dat
文件,看看哪个文件的safe_to_bootstarp
的值是 1,那么那个节点是最后意外关闭的,再按照safe_to_bootstarp
的值启动 pxc 集群。
意外下线全部节点,同时退出
如果三个节点同时意外退出,我们需要修改配置文件,挑选一个节点作为主节点,修改safe_to_bootstarp
的值设置为 1,那么这个节点可以以主节点启动。
配置 MyCat 负载均衡
准备工作(一)
我们需要创建两个 PXC 集群,充当两个分片。
上文中已经创建出来了一个分片,参考步骤然后创建出来第二个分片。
最后会有 6 个 centos 虚拟机。
我的第一个如下:
- 主:192.168.3.137
- 从:192.168.3.138
- 从:192.168.3.139
我的第二个如下:
- 主:192.168.3.141
- 从:192.168.3.143
- 从:192.168.3.144
MyCat : 192.168.3.146
准备工作(二)
在 192.168.3.146 Centos 服务器上进行如下操作:
由于 MyCat 是依赖 jdk 的所以我们先安装 jdk 环境。
yum install -y java-1.8.0-openjdk-devel.x86_64
配置 JAVA_HOME 环境变量
ls -lrt /etc/alternatives/java
vim /etc/profile
source /etc/profile
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.272.b10-1.el7_9.x86_64/
输入 java -version 如下图就完成配置。
准备工作(三)
下载 mycat
http://dl.mycat.org.cn/1.6.5/
上传 MyCat 压缩包到虚拟机,并解压。
开放防火墙 8066 和 9066 端口:
firewall-cmd --zone=public --add-port=8066/tcp --permanent
firewall-cmd --zone=public --add-port=9066/tcp --permanent
firewall-cmd --reload
关闭 SELINUX
vim /etc/selinux/config
把 SELINUX 属性值设置成 disabled,之后保存。重启。
reboot
修改 MyCat 的 bin 目录中所有.sh 文件的权限:
chmod -R 777 ./*.sh
MyCat 启动与关闭
启动MyCat:
./mycat start
查看启动状态:
./mycat status
停止:
./mycat stop
重启:
./mycat restart
准备工作(四)
修改配置文件:
修改 server.xml 文件,设置 MyCat 帐户和虚拟逻辑库
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
<system>
<property name="nonePasswordLogin">0</property>
<property name="useHandshakeV10">1</property>
<property name="useSqlStat">0</property>
<property name="useGlobleTableCheck">0</property>
<property name="sequnceHandlerType">2</property>
<property name="subqueryRelationshipCheck">false</property>
<property name="processorBufferPoolType">0</property>
<property name="handleDistributedTransactions">0</property>