zl程序教程

您现在的位置是:首页 >  IT要闻

当前栏目

MySQL PXC集群的实现

2023-02-18 16:34:37 时间
MHA

MHA:一主多从,主节点挂了就提升一个从节点作为主节点。

缺点:提升从节点为主节点需要时间,且只有一个节点能进行写操作,所以写的性能不高。

双主架构

双主架构:两个主节点,两个节点都能进行读写操作,但是双主架构会出现冲突的问题。

实现流程:客户端发送请求给节点,节点更改玩数据后返回对应信息,然后将更新的数据存入二进制中,通过这个二进制文件更新其他节点的数据。

多主架构

多主架构:多个节点都是主节点,采用全局校验的方法来实现冲突的解决。

多主架构的一种实现方案:Galera Cluster
实现流程:
  1. 节点接收到客户端更新数据的请求后,返回对应信息。

  2. 客户端提交事务以后,节点将更新后的数据发送给同一集群的其他节点,其他节点进行校验。

  3. 校验成功后才会返回更新成功的信息,如果校验失败就回回滚。

全局校验解决了多个主节点之间的冲突问题。

Galera Cluster 包括两个组件:
  • Galera replication library (galera-3)

  • WSREP:MySQL extended with the Write Set Replication

实现Galera Cluster的方案:
  • PXC:Percona XtraDB Cluster,是Percona对Galera的实现
参考仓库:https://mirrors.tuna.tsinghua.edu.cn/percona/release/$releasever/RPMS/$basea
rch
  • MariaDB Galera Cluster:
参考仓库:https://mirrors.tuna.tsinghua.edu.cn/mariadb/mariadb-5.5.X/yum/centos7-
amd64/
特点
  • 两者都需要至少三个节点,不能安装mysql server 或 mariadb-server

  • 两个的底层工作原理都是一样的。都是采用上面的两个组件来实现的。

范例:实现pxc集群 -- Percona XtraDB Cluster(PXC 5.7)

环境配置:

关闭selinux和防火墙
设置时间同步

四台主机:

10.0.0.20
10.0.0.21
10.0.0.22
10.0.0.22

实现流程:

  • 1.配置peconna的yum源

  • 2.安装PXC对应软件

  • 3.更改配置文件

  • 4.启动

1.配置peconna的yum源(所有主机)

因为官方的yum源访问很慢,所以采用清华的源:

[root@CentOS7 ~]# cat /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

#yum中自带的变量
$releasever: 当前OS的主版本号,如:8,7,6
$basearch:系统基础平台;i386, x86_64
安装Percona XtraDB Cluster(PXC 5.7)(所有主机)

OS 版本目前不支持CentOS 8

[root@CentOS7 ~]# yum install Percona-XtraDB-Cluster-57 -y
在各个节点上分别配置mysql及集群配置文件
mysql5.7版本中:

/etc/my.cnf为主配置文件

其余的配置文件都放在/etc/percona-xtradb-cluster.conf.d目录,

/etc/percona-xtradb-cluster.conf.d目录包含mysqld.cnf,mysqld_safe.cnf,wsrep.cnf 三个文件
修改配置文件:

所有节点的配置文件都需要修改。

只需要修改pxc的配置文件:
/etc/percona-xtradb-cluster.conf.d/wsrep.cnf

修改内容:

  • 集群ip的ip地址:wsrep_cluster_address=gcomm://

  • 当前节点的地址:wsrep_node_address=10.0.0.20

  • 集群的名称:wsrep_cluster_name=pxc-cluster

  • 当前节点的名称:wsrep_node_name=pxc-cluster-node-20

  • 验证账号:wsrep_sst_auth="sstuser:s3cretPass"

#多个节点之间复制数据需要借助一个账号,这个就是指定复制用的账号和密码
[root@CentOS7 ~]# grep -Ev "^#|^$" /etc/percona-xtradb-cluster.conf.d/wsrep.cnf
[mysqld]
wsrep_provider=/usr/lib64/galera3/libgalera_smm.so

wsrep_cluster_address=gcomm://10.0.0.20,10.0.0.21,10.0.0.22 #逗号隔开,指定Galera集群中各节点地址

binlog_format=ROW    #二进制日志的格式。Galera只支持row格式的二进制日志

default_storage_engine=InnoDB    #指定默认存储引擎。Galera的复制功能只支持InnoDB

wsrep_slave_threads= 8

wsrep_log_conflicts

innodb_autoinc_lock_mode=2    #只能设置为2,设置为0或1时会无法正确处理死锁问题

wsrep_node_address=10.0.0.20     #本节点在Galera集群中的通信地址

wsrep_cluster_name=pxc-cluster    #集群名称

wsrep_node_name=pxc-cluster-node-20   #本节点在Galera集群中的名称

pxc_strict_mode=ENFORCING   #是否限制PXC启用正在试用阶段的功能,ENFORCING是默认值,表示不启用

wsrep_sst_method=xtrabackup-v2

wsrep_sst_auth="sstuser:s3cretPass"  #在SST传输时需要用到的认证凭据,格式为:"用户:密码"
节点启动:
  • 先启动第一个节点,第一个节点可以是这三个几点中的任意一个

  • 再启动其他节点

启动第一个节点:
[root@CentOS7 ~]# systemctl start mysql@bootstrap.service

因为使用的是mysql5.7,默认安装好以后会有一个随机的临时密码放在日志里面的,所以要先从日志里面找到临时密码登录进mysql(此时只有登录权限),使用alter更改密码后才能进行相关操作。

[root@CentOS7 ~]# grep "temporary password" /var/log/mysqld.log

[root@CentOS7 ~]# mysql -uroot -p'=tWFP0oRJl8t'

mysql< alter user 'root'@'localhost' identified by 'redhat'; ##修改root密码

创建复制账号并授权:配置文件里面的最后一个用户名和密码
授权:reload lock tables等权限---因为在复制过程中会使用到这些权限

mysql< CREATE USER 'sstuser'@'localhost' IDENTIFIED BY 's3cretPass';
mysql< GRANT RELOAD, LOCK TABLES, PROCESS, REPLICATION CLIENT ON *.* TO 'sstuser'@'localhost';

查看集群状态的变量:
show status like 'wsrep%';

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,且已经完全连接并准备好
启动PXC集群中其它所有节点
[root@CentOS7 ~]# systemctl start mysql
查看集群状态,验证集群是否成功(在任意节点,查看集群状态)
mysql> SHOW VARIABLES LIKE 'wsrep_node_name';
+-----------------+---------------------+
| Variable_name   | Value               |
+-----------------+---------------------+
| wsrep_node_name | pxc-cluster-node-20 |
+-----------------+---------------------+
1 row in set (0.41 sec)

#本机节点地址
mysql> SHOW VARIABLES LIKE 'wsrep_node_address';
+--------------------+-----------+
| Variable_name      | Value     |
+--------------------+-----------+
| wsrep_node_address | 10.0.0.20 |
+--------------------+-----------+
1 row in set (0.00 sec)

mysql>  SHOW VARIABLES LIKE 'wsrep_on';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wsrep_on      | ON    |
+---------------+-------+
1 row in set (0.00 sec)


#集群节点数量
mysql> SHOW STATUS LIKE 'wsrep_cluster_size';
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| wsrep_cluster_size | 3     |
+--------------------+-------+
1 row in set (0.18 sec)

在PXC集群中加入节点
  • 配置yum源

  • 安装软件

  • 更改配置文件(修改方式同上)

  • 再旧节点的配置文件中添加旧节点信息

wsrep_cluster_address=gcomm://10.0.0.20,10.0.0.21,10.0.0.22,10.0.0.23
在pxc集群中删除一个节点:

只需要停止服务就自动少了一个节点。