数据库高可用之PXC

PXC简介

PXC属于一套近乎完美的mysql高可用集群解决方案,相比那些比较传统的基于主从复制模式的集群架构MHA和MM+keepalived,galera cluster最突出特点就是解决了诟病已久的数据复制延迟问题,基本上可以达到实时同步。而且节点与节点之间,他们相互的关系是对等的。本身galera cluster也是一种多主架构。galera cluster最关注的是数据的一致性,对待事物的行为时,要么在所有节点上执行,要么都不执行,它的实现机制决定了它对待一致性的行为非常严格,这也能非常完美的保证MySQL集群的数据一致性;对galera cluster的封装有两个,虽然名称不同,但实质都是一样的,使用的都是galera cluster。一个MySQL的创始人在自己全新的MariaDB上实现的MAriaDB cluster;一个是著名的MySQL服务和工具提供商percona实现的percona xtradb cluster,简称PXC

要搭建PXC架构至少需要3个mysql实例来组成一个集群,三个实例之间不是主从模式,而是各自为主,所以三者是对等关系,不分从属,这就叫multi-master架构。客户端写入和读取数据时,连接哪个实例都是一样的。读取到的数据时相同的,写入任意一个实例之后,集群自己会将新写入的数据同步到其他实例上,这种架构不共享任何数据,是一种高冗余架构。
官方网站

galera cluster的功能

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

PXC最常使用以下4个端口号

  • 3306-数据库对外服务的端口号。
  • 4444-请求SST的端口(SST是指数据库一个备份全量文件的传输。)
  • 4567-组成员之间进行沟通的一个端口号
  • 4568-用于传输IST(相对于SST来说的一个增量)

PXC的操作流程

首先客户端先发起一个事务,该事务先在本地执行,执行完成之后就要发起对事务的提交操作了。在提交之前需要将产生的复制写集广播出去,然后获取到一个全局的事务ID号,一并传送到另一个节点上面。通过合并数据之后,发现没有冲突数据,执行apply_cd和commit_cb动作,否则就需要取消此次事务的操作。而当前server节点通过验证之后,执行提交操作,并返回OK,如果验证没通过,则执行回滚。当然在生产中至少要有3个节点的集群环境,如果其中一个节点没有验证通过,出现了数据冲突,那么此时采取的方式就是讲出现不一致的节点踢出集群环境,而且它自己会执行shutdown命令,自动关机。

PXC的优点

①:实现mysql数据库集群架构的高可用性和数据的 强一致性。
②:完成了真正的多节点读写的集群方案。
③:改善了传统意义上的主从复制延迟问题,基本上达到了实时同步。
④:新加入的节点可以自动部署,无须提供手动备份,维护起来很方便。
⑤:由于是多节点写入,所以数据库故障切换很容易。

PXC的缺点

①:新加入的节点开销大,需要复制完整的数据。采用SST传输开销太大。
②:任何更新事务都需要全局验证通过,才会在每个节点库上执行。集群性能受限于性能最差的节点,也就是经常说的短板效应。
③:因为需要保证数据的一致性,所以在多节点并发写时,锁冲突问题比较严重。
④:存在写扩大问题,所有的节点上都会发生些操作。
⑤:只支持innodb存储引擎的表。
⑥:没有表级别的锁定,执行DDL语句操作会把整个集群锁住,而且也 kill 不了(建议使用Osc操作,即在线DDL)
⑦:所有的表必须含有主键,不然操作数据时会报错。

PXC搭建的注意点

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

–节点状态变化阶段:

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

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

PXC有两种节点的数据传输方式

一种叫SST全量传输,另一种叫IST增量传输。
SST传输有:xtrabackup、mysqldump和rsync三种方法。而增量传输就一种方法就是xtrabackup。但生产环境中一般数据量不大的时候,可以使用SST全量传输,但也只实现xtrabackup方法。
在PXC中还有一个特别重要的模块就是GCache。它的核心功能就是每个节点缓存当前最新的写集。如果有新节点加入进来,就可以把新数据的增量传递给新节点,而不需要再使用SST方式了。这样可以让节点更快地加入集群中。涉及参数如下:

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

部署PXC服务

准备3台虚拟主机,配置ip地址和主机名。具体如图所示:(不需要安装任何MySQL服务软件)
在这里插入图片描述
步骤一:环境准备
配置主机名与ip地址绑定
配置服务器192.168.4.71(72,73也做)

]#  vim /etc/hosts
192.168.4.71     pxcnode71
192.168.4.72     pxcnode72
192.168.4.73     pxcnode73 
]#hostname  pxcnode71

步骤二:安装软件包
在192.168.4.71 服务器安装软件包(72,73也做)
软件包之间有依赖注意软件包安装顺序

]# rpm -ivh libev-4.15-1.el6.rf.x86_64.rpm    //安装依赖
]# yum  -y  install  percona-xtrabackup-24-2.4.13-1.el7.x86_64.rpm
]# rpm -ivh qpress-1.1-14.11.x86_64.rpm     //安装依赖
]# tar -xvf  Percona-XtraDB-Cluster-5.7.25-31.35-r463-el7-x86_64-bundle.tar
]# yum -y  install  Percona-XtraDB-Cluster-*.rpm
]# ls
libev-4.15-1.el6.rf.x86_64.rpm
percona-release-0.1-4.noarch.rpm
percona-xtrabackup-24-2.4.13-1.el7.x86_64.rpm
Percona-XtraDB-Cluster-5.7.25-31.35-r463-el7-x86_64-bundle.tar
qpress-1.1-14.11.x86_64.rpm

步骤三:修改192.168.4.71 的mysqld.cnf文件(72,73也做)

[root@pxcnode71 ~]# vim /etc/percona-xtradb-cluster.conf.d/mysqld.cnf
[mysqld]
server-id=71                      //server-id 不允许重复
datadir=/var/lib/mysql                  //数据库目录
socket=/var/lib/mysql/mysql.sock         //socket文件
log-error=/var/log/mysqld.log        //日志文件
pid-file=/var/run/mysqld/mysqld.pid    //pid文件
log-bin                    //启用binlog日志
log_slave_updates            //启用链式复制
expire_logs_days=7            //日志文件保留天数

步骤四:修改mysqld_safe.cnf文件
修改192.168.4.71服务器的mysqld_safe.cnf (使用默认配置即可.72,73也做)

[root@pxcnode71 ~]# vim /etc/percona-xtradb-cluster.conf.d/mysqld_safe.cnf
[mysqld_safe]
pid-file = /var/run/mysqld/mysqld.pid
socket   = /var/lib/mysql/mysql.sock
nice     = 0

步骤五:修改wsrep.cnf文件
修改192.168.4.71服务器的wsrep.cnf(72,73也做)

[root@pxcnode71 ~]# vim /etc/percona-xtradb-cluster.conf.d/mysqld_safe.cnf
wsrep_cluster_address=gcomm://192.168.4.71,192.168.4.72,192.168.4.73//成员列表
wsrep_node_address=192.168.4.71 //本机ip
wsrep_cluster_name=pxc-cluster //集群名
wsrep_node_name=pxcnode71 //本机主机名
wsrep_sst_auth="sstuser:123qqq...A" //SST数据同步授权用户及密码

步骤六:启动服务

1)启动集群服务
注意:在1台服务器上执行即可(192.168.4.71),首次启动服务时间比较长

[root@pxcnode71 ~]# ]# systemctl  start mysql@bootstrap.service  //启动集群服务
[root@pxcnode71 ~]# grep pass /var/log/mysqld.log     //查看数据库管理员初始登录密码
[root@pxcnode71 ~]#mysql –uroot –p’ W.HiOb8(ok)_’ //使用初始密码登录
Mysql> alter user  root@”localhost” identified by “123456”;//修改登录密码
MySQL> exit;
[root@pxcnode71 ~]#mysql –uroot –p123456 //使用修改后的密码登录
Mysql> garnt reload, lock tables,replication client,process on *.*  to
sstuser@"localhost” identified by  “123qqq…A”; //添加授权用户

2)启动数据库服务
启动主机pxcnode72的数据库服务,会自动同步pxcnode71主机的root初始密码和授权用户sstuser

[root@pxcnode72 ~]# systemctl  start mysql  //启动数据库服务
[root@pxcnode72 ~]#
[root@pxcnode72 ~]# netstat -utnlp  | grep :3306
tcp6       0      0 :::3306                 :::*                    LISTEN      12794/mysqld        
[root@pxcnode72 ~]# netstat -utnlp  | grep :4567
tcp        0      0 0.0.0.0:4567            0.0.0.0:*               LISTEN      12794/mysqld        
[root@host72 ~]#
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值