文章 78
评论 0
浏览 8355
10-MySQL 高可用

10-MySQL 高可用

6.3 MySQL 高可用

6.3.1 MySQL 高可用解决方案

MySQL官方和社区里推出了很多高可用的解决方案,大体如下,仅供参考(数据引用自Percona)

clipboard.png

  • MMM: Multi-Master Replication Manager for MySQL,Mysql主主复制管理器是一套灵活的脚本程序,基于perl实现,用来对mysql replication进行监控和故障迁移,并能管理mysql MasterMaster复制的配置(同一时间只有一个节点是可写的)

  • MHA:Master High Availability,对主节点进行监控,可实现自动故障转移至其它从节点;通过提升某一从节点为新的主节点,基于主从复制实现,还需要客户端配合实现,目前MHA主要支持一主多从的架构,要搭建MHA,要求一个复制集群中必须最少有三台数据库服务器,一主二从,即一台充当master,一台充当备用master,另外一台充当从库,出于机器成本的考虑,淘宝进行了改造,目前淘宝TMHA已经支持一主一从

  • Galera Cluster:wsrep(MySQL extended with the Write Set Replication)通过wsrep协议在全局实现复制;任何一节点都可读写,不需要主从复制,实现多主读写

  • GR(Group Replication):MySQL官方提供的组复制技术(MySQL 5.7.17引入的技术),基于原生复制技术Paxos算法,实现了多主更新,复制组由多个server成员构成,组中的每个server可独立地执行事务,但所有读写事务只在冲突检测成功后才会提交
    clipboard.png

这3个节点互相通信,每当有事件发生,都会向其他节点传播该事件,然后协商,如果大多数节点都同意这次的事件,那么该事件将通过,否则该事件将失败或回滚。这些节点可以是单主模型的(single-primary),也可以是多主模型的(multi-primary)。单主模型只有一个主节点可以接受写操作,主节点故障时可以自动选举主节点。多主模型下,所有节点都可以接受写操作,所以没有master-slave的概念。

6.3.2 MHA Master High Availability

6.3.2.1 MHA 工作原理和架构

MHA集群架构

clipboard.png

MHA工作原理

clipboard.png

  1. MHA利用 SELECT 1 As Value 指令判断master服务器的健康性,一旦master 宕机,MHA 从宕机崩溃的master保存二进制日志事件(binlog events)
  2. 识别含有最新更新的slave
  3. 应用差异的中继日志(relay log)到其他的slave
  4. 应用从master保存的二进制日志事件(binlog events)
  5. 提升一个slave为新的master
  6. 使其他的slave连接新的master进行复制

注意:

为了尽可能的减少主库硬件损坏宕机造成的数据丢失,因此在配置MHA的同时建议配置成MySQL的半同步复制

MHA软件

MHA软件由两部分组成,Manager工具包和Node工具包

Manager工具包主要包括以下几个工具:

masterha_check_ssh       检查MHA的SSH配置状况
masterha_check_repl     检查MySQL复制状况
masterha_manger         启动MHA
masterha_check_status   检测当前MHA运行状态
masterha_master_monitor 检测master是否宕机
masterha_master_switch 故障转移(自动或手动)
masterha_conf_host     添加或删除配置的server信息
masterha_stop  --conf=app1.cnf 停止MHA
masterha_secondary_check 两个或多个网络线路检查MySQL主服务器的可用

Node工具包:这些工具通常由MHA Manager的脚本触发,无需人为操作)主要包括以下几个工具:

save_binary_logs     #保存和复制master的二进制日志
apply_diff_relay_logs   #识别差异的中继日志事件并将其差异的事件应用于其他的slave
filter_mysqlbinlog   #去除不必要的ROLLBACK事件(MHA已不再使用此工具)
purge_relay_logs #清除中继日志(不会阻塞SQL线程)

MHA配置文件:

global配置,为各application提供默认配置,默认文件路径 /etc/masterha_default.cnf
application配置:为每个主从复制集群

6.3.2.2 实现 MHA 实战案例

clipboard.png

环境:四台主机
192.168.10.71 CentOS7 MHA管理端
192.168.10.81 CentOS8 MySQL8.0 Master
192.168.10.82 CentOS8 MySQL8.0 Slave1
192.168.10.83 CentOS8 MySQL8.0 Slave2

在管理节点上安装两个包mha4mysql-manager和mha4mysql-node

说明:

mha4mysql-manager-0.56-0.el6.noarch.rpm 不支持CentOS 8,只支持CentOS7 以下版本
mha4mysql-manager-0.58-0.el7.centos.noarch.rpm 支持MySQL5.7和MySQL8.0 ,但和CentOS8版本上的Mariadb -10.3.17不兼容

安装:服务端先装node在装manager

[14:31:45 root@mha ~]#yum install ./mha4mysql-node-0.58-0.el7.centos.noarch.rpm
[14:31:45 root@mha ~]#yum install ./mha4mysql-manager-0.58-0.el7.centos.noarch.rpm

在所有MySQL服务器上安装mha4mysql-node包

[14:35:08 root@master ~]#yum install ./mha4mysql-node-0.58-0.el7.centos.noarch.rpm -y

在所有节点实现相互之间ssh key验证

[14:37:38 root@mha ~]#ssh-keygen
[14:37:38 root@mha ~]#ssh-copy-id 192.168.10.71
[14:37:38 root@mha ~]#scp -r .ssh 192.168.10.81:/root/
[14:37:38 root@mha ~]#scp -r .ssh 192.168.10.82:/root/
[14:37:38 root@mha ~]#scp -r .ssh 192.168.10.83:/root/

在管理节点建立配置文件

注意: 此文件的行尾不要加空格等符号

[server default]
user=mhauser      #用于远程连接MySQL所有节点的用户,需要有管理员的权限
password=123456
manager_workdir=/data/mastermha/app1/        #目录会自动生成,无需手动创建
manager_log=/data/mastermha/app1/manager.log
remote_workdir=/data/mastermha/app1/
ssh_user=root     #用于实现远程ssh基于KEY的连接,访问二进制日志
repl_user=slave    #主从复制的用户信息
repl_password=123456
ping_interval=1    #健康性检查的时间间隔
master_ip_failover_script=/usr/local/bin/master_ip_failover   #切换VIP的perl脚本
report_script=/usr/local/bin/sendmail.sh                #当执行报警脚本
check_repl_delay=0 #默认如果slave中从库落后主库relaylog超过100M,主库不会选择这个从库
为新的master,因为这个从库进行恢复需要很长的时间.通过这个参数,mha触发主从切换的时候会忽略复制
的延时,通过check_repl_delay=0这个参数,mha触发主从切换时会忽略复制的延时,对于设置
candidate_master=1的从库非常有用,这样确保这个从库一定能成为最新的master
master_binlog_dir=/var/lib/mysql/   #指定二进制日志存放的目录,mha4mysql-manager-0.58必须指定,之前版本不需要指定
[server1]
hostname=192.168.10.81
candidate_master=1
[server2]
hostname=192.168.10.82
candidate_master=1
[server3]
hostname=192.168.10.83

说明: 主库宕机谁来接管新的master

1. 所有从节点日志都是一致的,默认会以配置文件的顺序去选择一个新主
2. 从节点日志不一致,自动选择最接近于主库的从库充当新主
3. 如果对于某节点设定了权重(candidate_master=1),权重节点会优先选择。但是此节点日志量落后主库超过100M日志的话,也不会被选择。可以配合check_repl_delay=0,关闭日志量的检查,强制选择候选节点

相关脚本

[14:57:06 root@mha ~]#vim /usr/local/bin/sendmail.sh
echo "MYSQL is down" | mail -s "MHA Warning" 1191400158@qq.com
[15:00:14 root@mha ~]#chmod +x /usr/local/bin/sendmail.sh

masteripfailover.zip

[15:01:44 root@mha ~]#cp master_ip_failover /usr/local/bin/
[15:02:06 root@mha ~]#chmod +x /usr/local/bin/master_ip_failover

实现主从架构,这里不在记录,只记录mha所需配置

mysql> create user mhauser@'192.168.10.%' identified by '123456';
Query OK, 0 rows affected (0.02 sec)

mysql> grant all on *.* to mhauser@'192.168.10.%';
Query OK, 0 rows affected (0.01 sec)
#配置VIP
[15:12:13 root@master ~]#ifconfig eth0:1 192.168.10.100/24

检查Mha的环境

#检查环境,最后一句是下面这样的才表示通过
[15:03:24 root@mha ~]#masterha_check_ssh --conf=/etc/mastermha/app1.cnf
Sun Mar  7 15:05:50 2021 - [info] All SSH connection tests passed successfully.
[root@mha-manager ~]#masterha_check_repl --conf=/etc/mastermha/app1.cnf
MySQL Replication Health is OK.

#查看状态
[root@mha-manager ~]#masterha_check_status --conf=/etc/mastermha/app1.cnf

启动MHA

#开启MHA,默认是前台运行
[15:23:40 root@mha ~]#nohup masterha_manager --conf=/etc/mastermha/app1.cnf
nohup: ignoring input and appending output to ‘nohup.out’
#查看状态
[15:25:45 root@mha ~]#masterha_check_status --conf=/etc/mastermha/app1.cnf
app1 (pid:28968) is running(0:PING_OK), master:192.168.10.81

排错日志

[15:28:51 root@mha ~]#tail /data/mastermha/app1/manager.log

IN SCRIPT TEST====/sbin/ifconfig eth0:1 down==/sbin/ifconfig eth0:1 192.168.10.100;/sbin/arping -I eth0 -c 3 -s 192.168.10.100 192.168.10.2 >/dev/null 2>&1===

Checking the Status of the script.. OK
Sun Mar  7 15:24:59 2021 - [info]  OK.
Sun Mar  7 15:24:59 2021 - [warning] shutdown_script is not defined.
Sun Mar  7 15:24:59 2021 - [info] Set master ping interval 1 seconds.
Sun Mar  7 15:24:59 2021 - [warning] secondary_check_script is not defined. It is highly recommended setting it to check master reachability from two or more routes.
Sun Mar  7 15:24:59 2021 - [info] Starting ping health check on 192.168.10.81(192.168.10.81:3306)..
Sun Mar  7 15:24:59 2021 - [info] Ping(SELECT) succeeded, waiting until MySQL doesn't respond..

模拟故障

#当 master down机后,mha管理程序自动退出
[15:26:02 root@master ~]#systemctl stop mysqld.service

[15:32:32 root@mha ~]#tail /data/mastermha/app1/manager.log
The latest slave 192.168.10.82(192.168.10.82:3306) has all relay logs for recovery.
Selected 192.168.10.82(192.168.10.82:3306) as a new master.
192.168.10.82(192.168.10.82:3306): OK: Applying all logs succeeded.
192.168.10.82(192.168.10.82:3306): OK: Activated master IP address.
192.168.10.83(192.168.10.83:3306): This host has the latest relay log events.
Generating relay diff files from the latest slave succeeded.
192.168.10.83(192.168.10.83:3306): OK: Applying all logs succeeded. Slave started, replicating from 192.168.10.82(192.168.10.82:3306)
192.168.10.82(192.168.10.82:3306): Resetting slave info succeeded.
Master failover to 192.168.10.82(192.168.10.82:3306) completed successfully.
Sun Mar  7 15:30:28 2021 - [info] Sending mail..

[15:30:28 root@mha ~]#masterha_check_status --conf=/etc/mastermha/app1.cnf
app1 is stopped(2:NOT_RUNNING).

#验证VIP漂移至新的Master上
[15:33:11 root@slave1 ~]#ifconfig eth0:1
eth0:1: flags=4163  mtu 1500
inet 192.168.10.100  netmask 255.255.255.0  broadcast 192.168.10.255
ether 00:0c:29:1a:4b:7f  txqueuelen 1000  (Ethernet)

收到报警邮件

clipboard.png

如果再次运行MHA,需要先删除下面文件

[15:36:39 root@mha ~]#ls /data/mastermha/app1/app1.failover.complete -l
-rw-r--r-- 1 root root 0 Mar  7 15:30 /data/mastermha/app1/app1.failover.complete
[15:36:49 root@mha ~]#rm -f /data/mastermha/app1/app1.failover.complete

6.3.3 Galera Cluster

6.3.3.1 Galera Cluster 介绍

Galera Cluster:集成了Galera插件的MySQL集群,是一种新型的,数据不共享的,高度冗余的高可用方案,目前Galera Cluster有两个版本,分别是Percona Xtradb Cluster及MariaDB Cluster,Galera本身是具有多主特性的,即采用multi-master的集群架构,是一个既稳健,又在数据一致性、完整性及高性能方面有出色表现的高可用解决方案

Galera Cluster特点

  • 多主架构:真正的多点读写的集群,在任何时候读写数据,都是最新的
  • 同步复制:集群不同节点之间数据同步,没有延迟,在数据库挂掉之后,数据不会丢失
  • 并发复制:从节点APPLY数据时,支持并行执行,更好的性能
  • 故障切换:在出现数据库故障时,因支持多点写入,切换容易
  • 热插拔:在服务期间,如果数据库挂了,只要监控程序发现的够快,不可服务时间就会非常少。在节点故障期间,节点本身对集群的影响非常小
  • 自动节点克隆:在新增节点,或者停机维护时,增量数据或者基础数据不需要人工手动备份提供,Galera Cluster会自动拉取在线节点数据,最终集群会变为一致
  • 对应用透明:集群的维护,对应用程序是透明的

Galera Cluster 缺点

  • 由于DDL 需全局验证通过,则集群性能由集群中最差性能节点决定(一般集群节点配置都是一样
  • 的)
  • 新节点加入或延后较大的节点重新加入需全量拷贝数据(SST,State Snapshot Transfer),作为donor( 贡献者,如: 同步数据时的提供者)的节点在同步过程中无法提供读写
  • 只支持innodb存储引擎的表

Galera Cluster工作过程

clipboard.png

Galera Cluster官方文档:

Galera Cluster 包括两个组件

  • Galera replication library (galera-3)
  • WSREP:MySQL extended with the Write Set Replication

WSREP复制实现:

注意:两者都需要至少三个节点,不能安装mysql server 或 mariadb-server

6.3.3.2 PXC 原理

clipboard.png
clipboard.png

PXC最常使用如下4个端口号:

  • 3306:数据库对外服务的端口号
  • 4444:请求SST的端口号
  • 4567:组成员之间进行沟通的端口号
  • 4568:用于传输IST的端口号

PXC中涉及到的重要概念和核心参数:

(1)集群中节点的数量:整个集群中节点数量应该控制在最少3个、最多8个的范围内。最少3个节点是为了防止出现脑裂现象,因为只有在2个节点下才会出现此现象。脑裂现象的标志就是输入任何命令,返回的结果都是unknown command。节点在集群中,会因新节点的加入或故障、同步失效等原因发生状态的切换。

(2)节点状态的变化阶段:
clipboard.png

  • open:节点启动成功,尝试连接到集群时的状态
  • primary:节点已处于集群中,在新节点加入并选取donor进行数据同步时的状态
  • joiner:节点处于等待接收同步文件时的状态
  • joined:节点完成数据同步工作,尝试保持和集群进度一致时的状态
  • synced:节点正常提供服务时的状态,表示已经同步完成并和集群进度保持一致
  • donor:节点处于为新加入的节点提供全量数据时的状态

备注:donor节点就是数据的贡献者,如果一个新节点加入集群,此时又需要大量数据的SST数据传输,就有可能因此而拖垮整个集群的性能,所以在生产环境中,如果数据量较小,还可以使用SST全量数据传输,但如果数据量很大就不建议使用这种方式,可以考虑先建立主从关系,然后再加入集群。

(3)节点的数据传输方式:

  • SST:State Snapshot Transfer,全量数据传输
  • IST:Incremental State Transfer,增量数据传输

SST数据传输有xtrabackup、mysqldump和rsync三种方式,而增量数据传输就只有一种方式xtrabackup,但生产环境中一般数据量较小时,可以使用SST全量数据传输,但也只使用xtrabackup方法。

(4)GCache模块:在PXC中一个特别重要的模块,它的核心功能就是为每个节点缓存当前最新的写集。如果有新节点加入进来,就可以把新数据的增量传递给新节点,而不需要再使用SST传输方式,这样可以让节点更快地加入集群中,涉及如下参数:

  • gcache.size:缓存写集增量信息的大小,它的默认大小是128MB,通过wsrep_provider_options参数设置,建议调整为2GB~4GB范围,足够的空间便于缓存更多的增量信息。
  • gcache.mem_size:GCache中内存缓存的大小,适度调大可以提高整个集群的性能
  • gcache.page_size:如果内存不够用(GCache不足),就直接将写集写入磁盘文件中

6.3.3.3 实战案例:Percona XtraDB Cluster(PXC 5.7)

1 环境准备

四台主机:

pxc1:192.168.10.71
pxc2:192.168.10.72
pxc3:192.168.10.73
pxc4:192.168.10.74

OS 版本目前不支持CentOS 8

[root@pxc1 ~]#cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)

关闭防火墙和SELinux,保证时间同步

注意:如果已经安装MySQL,必须卸载

2 安装 Percona XtraDB Cluster 5.7

#此处使用清华大学yum源,官方源太慢了
[16:24:22 root@pxc1 ~]#vim /etc/yum.repos.d/pxc.repo
[percona]
name=percona_repo
baseurl=https://mirrors.tuna.tsinghua.edu.cn/percona/release/$releasever/RPMS/$basearch/
enabled=1
gpgcheck=0
[16:24:52 root@pxc1 ~]#scp /etc/yum.repos.d/pxc.repo 192.168.10.72:/etc/yum.repos.d/
[16:24:52 root@pxc1 ~]#scp /etc/yum.repos.d/pxc.repo 192.168.10.73:/etc/yum.repos.d/
#在三个节点都安装好PXC 5.7
[16:29:06 root@pxc1 ~]#yum install Percona-XtraDB-Cluster-57 -y
[16:29:06 root@pxc2 ~]#yum install Percona-XtraDB-Cluster-57 -y
[16:29:06 root@pxc3 ~]#yum install Percona-XtraDB-Cluster-57 -y

[16:30:03 root@pxc1 ~]#rpm -ql Percona-XtraDB-Cluster-server-57

3 在各个节点上分别配置mysql及集群配置文件

/etc/my.cnf为主配置文件,当前版本中,其余的配置文件都放在/etc/percona-xtradb-cluster.conf.d目录里,包括mysqld.cnf,mysqld_safe.cnf,wsrep.cnf 三个文件

#主配置文件不需要修改
[16:30:45 root@pxc1 ~]#cat /etc/my.cnf
[16:30:53 root@pxc1 ~]#ls /etc/my.cnf.d/
[16:31:16 root@pxc1 ~]#ls /etc/percona-xtradb-cluster.conf.d/
mysqld.cnf  mysqld_safe.cnf  wsrep.cnf

#下面配置文件不需要修改
[16:29:07 root@pxc2 ~]#vim /etc/percona-xtradb-cluster.conf.d/mysqld.cnf
[client]
socket=/var/lib/mysql/mysql.sock

[mysqld]
server-id=71   #建议各个节点不同
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
log-bin    #建议启用,非必须项
log_slave_updates
expire_logs_days=7

symbolic-links=0
#下面配置文件不需要修改
[16:32:37 root@pxc1 ~]#cat /etc/percona-xtradb-cluster.conf.d/mysqld_safe.cnf

#PXC的配置文件必须修改
[16:37:21 root@pxc1 ~]#grep -Ev '^#|^$' /etc/percona-xtradb-cluster.conf.d/wsrep.cnf[mysqld]
wsrep_provider=/usr/lib64/galera3/libgalera_smm.so
wsrep_cluster_address=gcomm://192.168.10.71,192.168.10.72,192.168.10.73    #三个节点的IP
binlog_format=ROW
default_storage_engine=InnoDB
wsrep_slave_threads= 8
wsrep_log_conflicts
innodb_autoinc_lock_mode=2
wsrep_node_address=192.168.10.71     #各个节点,指定自已的IP
wsrep_cluster_name=pxc-cluster
wsrep_node_name=pxc-cluster-node-1   #各个节点,指定自已节点名称
pxc_strict_mode=ENFORCING
wsrep_sst_method=xtrabackup-v2
wsrep_sst_auth="sstuser:s3cretPass"   #取消本行注释,同一集群内多个节点的验证用户和密码信息必须一致

[16:39:38 root@pxc2 ~]#grep -Ev '^#|^$' /etc/percona-xtradb-cluster.conf.d/wsrep.cnf[mysqld]
wsrep_provider=/usr/lib64/galera3/libgalera_smm.so
wsrep_cluster_address=gcomm://192.168.10.71,192.168.10.72,192.168.10.73
binlog_format=ROW
default_storage_engine=InnoDB
wsrep_slave_threads= 8
wsrep_log_conflicts
innodb_autoinc_lock_mode=2
wsrep_node_address=192.168.10.72
wsrep_cluster_name=pxc-cluster
wsrep_node_name=pxc-cluster-node-2
pxc_strict_mode=ENFORCING
wsrep_sst_method=xtrabackup-v2
wsrep_sst_auth="sstuser:s3cretPass"

[16:40:30 root@pxc3 ~]#grep -Ev '^#|^$' /etc/percona-xtradb-cluster.conf.d/wsrep.cnf[mysqld]
wsrep_provider=/usr/lib64/galera3/libgalera_smm.so
wsrep_cluster_address=gcomm://192.168.10.71,192.168.10.72,192.168.10.73
binlog_format=ROW
default_storage_engine=InnoDB
wsrep_slave_threads= 8
wsrep_log_conflicts
innodb_autoinc_lock_mode=2
wsrep_node_address=192.168.10.73
wsrep_cluster_name=pxc-cluster
wsrep_node_name=pxc-cluster-node-3
pxc_strict_mode=ENFORCING
wsrep_sst_method=xtrabackup-v2
wsrep_sst_auth="sstuser:s3cretPass"

注意:尽管Galera Cluster不再需要通过binlog的形式进行同步,但还是建议在配置文件中开启二进制日志功能,原因是后期如果有新节点需要加入,老节点通过SST全量传输的方式向新节点传输数据,很可能会拖垮集群性能,所以让新节点先通过binlog方式完成同步后再加入集群会是一种更好的选择

配置文件各项配置意义

clipboard.png

4 启动PXC集群中第一个节点

[16:40:09 root@pxc1 ~]#ss -ntul
Netid  State      Recv-Q Send-Q Local Address:Port               Peer Address:Port
udp    UNCONN     0      0           *:111                     *:*
udp    UNCONN     0      0      127.0.0.1:323                     *:*
udp    UNCONN     0      0           *:835                     *:*
udp    UNCONN     0      0        [::]:111                  [::]:*
udp    UNCONN     0      0       [::1]:323                  [::]:*
udp    UNCONN     0      0        [::]:835                  [::]:*
tcp    LISTEN     0      128         *:111                     *:*
tcp    LISTEN     0      128         *:22                      *:*
tcp    LISTEN     0      100    127.0.0.1:25                      *:*
tcp    LISTEN     0      128      [::]:111                  [::]:*
tcp    LISTEN     0      128      [::]:22                   [::]:*
tcp    LISTEN     0      100     [::1]:25                   [::]:*

#启动第一个节点
[16:42:12 root@pxc1 ~]#systemctl start mysql@bootstrap.service
[16:44:02 root@pxc1 ~]#ss -ntul
Netid  State      Recv-Q Send-Q Local Address:Port               Peer Address:Port
udp    UNCONN     0      0           *:111                     *:*
udp    UNCONN     0      0      127.0.0.1:323                     *:*
udp    UNCONN     0      0           *:835                     *:*
udp    UNCONN     0      0        [::]:111                  [::]:*
udp    UNCONN     0      0       [::1]:323                  [::]:*
udp    UNCONN     0      0        [::]:835                  [::]:*
tcp    LISTEN     0      128         *:111                     *:*
tcp    LISTEN     0      128         *:22                      *:*
tcp    LISTEN     0      128         *:4567                    *:*
tcp    LISTEN     0      100    127.0.0.1:25                      *:*
tcp    LISTEN     0      128      [::]:111                  [::]:*
tcp    LISTEN     0      128      [::]:22                   [::]:*
tcp    LISTEN     0      100     [::1]:25                   [::]:*
tcp    LISTEN     0      80       [::]:3306                 [::]:*
#查看root密码
[16:43:50 root@pxc1 ~]#grep "temporary password" /var/log/mysqld.log
2021-03-07T08:43:32.682088Z 1 [Note] A temporary password is generated for root@localhost: d15<(jfwu%hW
[16:44:59 root@pxc1 ~]#mysql -uroot -p'd15<(jfwu%hW'
#修改root密码俩种方法
mysql> set password for root@'localhost'='123456';
Query OK, 0 rows affected (0.01 sec)
mysql> alter user 'root'@'localhost' identified by '123456';
Query OK, 0 rows affected (0.01 sec)
#创建相关用户并授权
mysql> create user 'sstuser'@'localhost' identified by 's3cretPass';
mysql> grant reload,lock tables,process,replication client on *.* to 'sstuser'@'localhost';
#查看相关变量
mysql> show variables like 'wsrep%'\G
#查看相关状态变量
mysql> show status like 'wsrep%'\G
#重点关注下面内容
mysql> show status like 'wsrep%';
+----------------------------+--------------------------------------+
| Variable_name             | Value                               |
+----------------------------+--------------------------------------+
| wsrep_local_state_uuid     | aad2c02e-131c-11ea-9294-b2e80a6c08c4 |
| ...                       | ...                                 |
| wsrep_local_state         | 4                                   |
| wsrep_local_state_comment | Synced                               |
| ...                       | ...                                 |
| wsrep_cluster_size         | 1                                   |
| wsrep_cluster_status       | Primary                             |
| wsrep_connected           | ON                                   |
| ...                       | ...                                 |
| wsrep_ready               | ON                                   |
+----------------------------+--------------------------------------+

说明:

  • wsrep_cluster_size表示,该Galera集群中只有一个节点
  • wsrep_local_state_comment 状态为Synced(4),表示数据已同步完成(因为是第一个引导节点,无数据需要同步)。 如果状态是Joiner, 意味着 SST 没有完成. 只有所有节点状态是Synced,才可以加新点
  • wsrep_cluster_status为Primary,且已经完全连接并准备好

5 启动PXC集群中其它所有节点

[16:40:16 root@pxc2 ~]#systemctl start mysql
[16:53:26 root@pxc2 ~]#ss -ntul
Netid  State      Recv-Q Send-Q Local Address:Port               Peer Address:Port
udp    UNCONN     0      0           *:111                     *:*
udp    UNCONN     0      0      127.0.0.1:323                     *:*
udp    UNCONN     0      0           *:841                     *:*
udp    UNCONN     0      0        [::]:111                  [::]:*
udp    UNCONN     0      0       [::1]:323                  [::]:*
udp    UNCONN     0      0        [::]:841                  [::]:*
tcp    LISTEN     0      100    127.0.0.1:25                      *:*
tcp    LISTEN     0      128         *:111                     *:*
tcp    LISTEN     0      128         *:22                      *:*
tcp    LISTEN     0      128         *:4567                    *:*
tcp    LISTEN     0      100     [::1]:25                   [::]:*
tcp    LISTEN     0      80       [::]:3306                 [::]:*
tcp    LISTEN     0      128      [::]:111                  [::]:*
tcp    LISTEN     0      128      [::]:22                   [::]:*

6 查看集群状态,验证集群是否成功

#在任意节点,查看集群状态
[16:54:33 root@pxc1 ~]#mysql -uroot -p'123456'
mysql> show variables like 'wsrep_node_name';
+-----------------+--------------------+
| Variable_name   | Value              |
+-----------------+--------------------+
| wsrep_node_name | pxc-cluster-node-1 |
+-----------------+--------------------+

mysql> show variables like 'wsrep_node_address';
+--------------------+---------------+
| Variable_name      | Value         |
+--------------------+---------------+
| wsrep_node_address | 192.168.10.71 |
+--------------------+---------------+

mysql> show variables like 'wsrep_on';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wsrep_on      | ON    |
+---------------+-------+
#在任意节点查看数据库
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
#在任意节点创建数据库
mysql> create database testdb1;
Query OK, 1 row affected (0.01 sec)
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| testdb1            |
+--------------------+
#在任意其它节点验证数据是否同步
[16:58:23 root@pxc2 ~]#mysql -uroot -p123456
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| testdb1            |
+--------------------+
#利用Xshell软件,同时在三个节点数据库,在其中一个节点成功
mysql> create database testdb2;
Query OK, 1 row affected (0.10 sec)
#在其它节点都提示失败
mysql> create database testdb2;
ERROR 1007 (HY000): Can't create database 'testdb2'; database exists

7 在PXC集群中加入节点

一个节点加入到Galera集群有两种情况:新节点加入集群、暂时离组的成员再次加入集群

  1. 新节点加入Galera集群

新节点加入集群时,需要从当前集群中选择一个Donor节点来同步数据,也就是所谓的state_snapshot_tranfer(SST)过程。SST同步数据的方式由选项wsrep_sst_method决定,一般选择的是xtrabackup。

必须注意,新节点加入Galera时,会删除新节点上所有已有数据,再通过xtrabackup(假设使用的是该方式)从Donor处完整备份所有数据进行恢复。所以,如果数据量很大,新节点加入过程会很慢。而且,在一个新节点成为Synced状态之前,不要同时加入其它新节点,否则很容易将集群压垮。如果是这种情况,可以考虑使用wsrep_sst_method=rsync来做增量同步,既然是增量同步,最好保证新节点上已经有一部分数据基础,否则和全量同步没什么区别,且这样会对Donor节点加上全局readonly锁。

  1. 旧节点加入Galera集群

如果旧节点加入Galera集群,说明这个节点在之前已经在Galera集群中呆过,有一部分数据基础,缺少的只是它离开集群时的数据。这时加入集群时,会采用IST(incremental snapshot transfer)传输机制,即使用增量传输。

但注意,这部分增量传输的数据源是Donor上缓存在GCache文件中的,这个文件有大小限制,如果缺失的数据范围超过已缓存的内容,则自动转为SST传输。如果旧节点上的数据和Donor上的数据不匹配(例如这个节点离组后人为修改了一点数据),则自动转为SST传输。

#在PXC集群中再加一台新的主机PXC4:192.168.10.74
[17:03:09 root@pxc4 ~]#yum install -y Percona-XtraDB-Cluster-57
[17:05:01 root@pxc4 ~]#vim /etc/percona-xtradb-cluster.conf.d/mysqld.cnf
server-id=74
[17:06:50 root@pxc4 ~]#grep -Ev '^#|^$' /etc/percona-xtradb-cluster.conf.d/wsrep.cnf[mysqld]
wsrep_provider=/usr/lib64/galera3/libgalera_smm.so
wsrep_cluster_address=gcomm://192.168.10.71,192.168.10.72,192.168.10.73,192.168.10.74
binlog_format=ROW
default_storage_engine=InnoDB
wsrep_slave_threads= 8
wsrep_log_conflicts
innodb_autoinc_lock_mode=2
wsrep_node_address=192.168.10.74
wsrep_cluster_name=pxc-cluster
wsrep_node_name=pxc-cluster-node-4
pxc_strict_mode=ENFORCING
wsrep_sst_method=xtrabackup-v2
wsrep_sst_auth="sstuser:s3cretPass"
[17:07:08 root@pxc4 ~]#systemctl start mysql

[17:08:00 root@pxc4 ~]#mysql -uroot -p123456
mysql> show status like 'wsrep_cluster_size';
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| wsrep_cluster_size | 4     |
+--------------------+-------+
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| testdb1            |
| testdb2            |
+--------------------+
#将其它节点的配置文件加以修改
[17:09:34 root@pxc1 ~]#vim /etc/percona-xtradb-cluster.conf.d/wsrep.cnf
wsrep_cluster_address=gcomm://192.168.10.71,192.168.10.72,192.168.10.73,192.168.10.74

8 在PXC集群中修复故障节点

#在除第一个启动节点外的任意节点停止服务
[17:09:19 root@pxc4 ~]#systemctl stop mysql

#在其它任意节点查看wsrep_cluster_size变量少了一个节点
[17:10:20 root@pxc1 ~]#mysql -uroot -p123456
mysql> show status like 'wsrep_cluster_size';
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| wsrep_cluster_size | 3     |
+--------------------+-------+
mysql> create database testdb4;
#在其它任意节点可看到数据已同步
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| testdb1            |
| testdb2            |
| testdb4            |
+--------------------+
#恢复服务,数据同步
[17:14:17 root@pxc4 ~]#systemctl start mysql
[17:15:46 root@pxc4 ~]#mysql -uroot -p123456
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| testdb1            |
| testdb2            |
| testdb4            |
+--------------------+
mysql> show status like 'wsrep_cluster_size';
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| wsrep_cluster_size | 4     |
+--------------------+-------+

6.3.3.4 实战案例:MariaDB Galera Cluster

范例:在centos8 实现MariaDB Galera Cluster

#在三个节点上都实现
[17:27:55 root@centos8 ~]#yum install mariadb-server-galera.x86_64 -y
[17:32:39 root@centos8 ~]#vim /etc/my.cnf.d/galera.cnf
#wsrep_cluster_address="dummy://"   #在此行下面加一行
wsrep_cluster_address="gcomm://192.168.10.81,192.168.10.82,192.168.10.83"
#启动第一节点
[17:32:53 root@centos8 ~]#galera_new_cluster
[17:33:42 root@centos8 ~]#systemctl enable mariadb
#再启动其它节点
[17:32:53 root@centos8 ~]#systemctl enable --now mariadb
[17:34:31 root@centos8 ~]#ss -ntul
Netid   State    Recv-Q   Send-Q       Local Address:Port       Peer Address:Port
udp     UNCONN   0        0                127.0.0.1:323             0.0.0.0:*
udp     UNCONN   0        0                  0.0.0.0:111             0.0.0.0:*
udp     UNCONN   0        0                    [::1]:323                [::]:*
udp     UNCONN   0        0                     [::]:111                [::]:*
tcp     LISTEN   0        80                 0.0.0.0:3306            0.0.0.0:*
tcp     LISTEN   0        128                0.0.0.0:111             0.0.0.0:*
tcp     LISTEN   0        128                0.0.0.0:22              0.0.0.0:*
tcp     LISTEN   0        128                0.0.0.0:4567            0.0.0.0:*
tcp     LISTEN   0        128                   [::]:111                [::]:*
tcp     LISTEN   0        128                   [::]:22                 [::]:*
[17:34:36 root@centos8 ~]#mysql
MariaDB [(none)]> show status like 'wsrep_ready';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wsrep_ready   | ON    |
+---------------+-------+
1 row in set (0.001 sec)

MariaDB [(none)]> show status like 'wsrep_cluster_size';
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| wsrep_cluster_size | 3     |
+--------------------+-------+
1 row in set (0.001 sec)

范例:CentOS 7 实现 MariaDB Galera Cluster 5.5

#参考仓库:https://mirrors.tuna.tsinghua.edu.cn/mariadb/mariadb-5.5.X/yum/centos7-
amd64/
yum install MariaDB-Galera-server
vim /etc/my.cnf.d/server.cnf
[galera]
wsrep_provider = /usr/lib64/galera/libgalera_smm.so
wsrep_cluster_address="gcomm://10.0.0.7,10.0.0.17,10.0.0.27"
binlog_format=row
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0
#下面配置可选项
wsrep_cluster_name = 'mycluster' 默认my_wsrep_cluster
wsrep_node_name = 'node1'
wsrep_node_address = '10.0.0.7'
#首次启动时,需要初始化集群,在其中一个节点上执行命令
/etc/init.d/mysql start --wsrep-new-cluster
#而后正常启动其它节点
service mysql start
#查看集群中相关系统变量和状态变量
SHOW VARIABLES LIKE 'wsrep_%';
SHOW STATUS LIKE 'wsrep_%';
SHOW STATUS LIKE 'wsrep_cluster_size';

6.3.4 TiDB 概述

TiDB 是 PingCAP 公司受 Google Spanner / F1 论文启发而设计的开源分布式 HTAP (HybridTransactional and Analytical Processing) 数据库,结合了传统的 RDBMS 和NoSQL 的最佳特性。TiDB 兼容 MySQL,支持无限的水平扩展,具备强一致性和高可用性。TiDB和mysql几乎完全兼容

TiDB 是一个分布式 NewSQL 数据库。它支持水平弹性扩展、ACID 事务、标准 SQL、MySQL 语法和MySQL 协议,具有数据强一致的高可用特性,是一个不仅适合 OLTP 场景还适合 OLAP 场景的混合数据库。TiDB年可用性达到99.95%

TiDB 的目标是为 OLTP(Online Transactional Processing) 和 OLAP (Online Analytical Processing) 场景提供一站式的解决方案。

6.3.4.1 TiDB 核心特点

  1. 高度兼容 MySQL 大多数情况下,无需修改代码即可从 MySQL 轻松迁移至 TiDB,分库分表后的MySQL 集群亦可通过 TiDB 工具进行实时迁移
  2. 水平弹性扩展 通过简单地增加新节点即可实现 TiDB 的水平扩展,按需扩展吞吐或存储,轻松应对高并发、海量数据场景
  3. 分布式事务 TiDB 100% 支持标准的 ACID 事务
  4. 真正金融级高可用 相比于传统主从 (M-S) 复制方案,基于 Raft 的多数派选举协议可以提供金融级的 100% 数据强一致性保证,且在不丢失大多数副本的前提下,可实现故障的自动恢复 (autofailover),无需人工介入
  5. 一站式 HTAP 解决方案 TiDB 作为典型的 OLTP 行存数据库,同时兼具强大的 OLAP 性能,配合TiSpark,可提供一站式 HTAP解决方案,一份存储同时处理OLTP & OLAP(OLAP、OLTP的介绍和比较 )无需传统繁琐的 ETL 过程
  6. 云原生 SQL 数据库 TiDB 是为云而设计的数据库,同 Kubernetes 深度耦合,支持公有云、私有云和混合云,使部署、配置和维护变得十分简单。TiDB 的设计目标是 100% 的 OLTP 场景和 80%的 OLAP 场景,更复杂的 OLAP 分析可以通过 TiSpark 项目来完成。 TiDB 对业务没有任何侵入性,能优雅的替换传统的数据库中间件、数据库分库分表等 Sharding 方案。同时它也让开发运维人员不用关注数据库 Scale 的细节问题,专注于业务开发,极大的提升研发的生产力

6.3.4.2 TiDB整体架构

clipboard.png

TiDB Server

TiDB Server 负责接收SQL请求,处理SQL相关的逻辑,并通过PD找到存储计算所需数据的TiKV地址,与TiKV交互获取数据,最终返回结果。TiDB Server 是无状态的,其本身并不存储数据,只负责计算,可以无限水平扩展,可以通过负载均衡组件(LVS、HAProxy或F5)对外提供统一的接入地址。

PD Server

Placement Driver(简称PD)是整个集群的管理模块,其主要工作有三个:一是存储集群的元信息(某个Key存储在那个TiKV节点);二是对TiKV集群进行调度和负载均衡(如数据的迁移、Raft groupleader的迁移等);三是分配全局唯一且递增的事务ID

PD 是一个集群,需要部署奇数个节点,一般线上推荐至少部署3个节点。PD在选举的过程中无法对外提供服务,这个时间大约是3秒

TiKV Server

TiKV Server 负责存储数据,从外部看TiKV是一个分布式的提供事务的Key-Value存储引擎。存储数据的基本单位是Region,每个Region负责存储一个Key Range(从StartKey到EndKey的左闭右开区间)的数据,每个TiKV节点会负责多个Region。TiKV使用Raft协议做复制,保持数据的一致性和容灾。副本以Region为单位进行管理,不同节点上的多个Region构成一个Raft Group,互为副本。数据在多个TiKV之间的负载均衡由PD调度,这里也就是以Region为单位进行调度


标题:10-MySQL 高可用
作者:Carey
地址:HTTPS://zhangzhuo.ltd/articles/2021/03/07/1615118014622.html

生而为人

取消