Percona-xtraDB-cluster的安装、配置和使用

操作说明

关于PXC实验 有一点我忘给你们总结了,少了这一点,基本上不会成功: 理一下顺序和思路:第一台先启动mysql@bootstrap.service 直接启动就行 不用打别的命令 之后第一台进入数据库 改数据库密码、授权 之后再去直接启动后两台的mysql—>systemctl start mysql 然后验证 这样就OK了 把顺序理一下 你们做的时候应该就更顺了

零、 说在前面

Percona XtraDB Cluster(简称PXC)是很多企业基于MySQL实现集群方案的不二选择。PXC它支持服务高可用,数据同步复制(并发复制),几乎无延迟;多个可同时读写节点,可实现写扩展等等。

xtradb框架

在这里插入图片描述
Percona XtraDB Cluster is based on Percona Server running with the XtraDB storage engine. It uses the Galera library, which is an implementation of the write set replication (wsrep) API developed by Codership Oy. The default and recommended data transfer method is via Percona XtraBackup.

这里涉及一个概念叫做wsrep 也就是 write set replication 写集合复制 或者叫平行复制

节点之间数据传输通过xtrabackup

percona xtradb cluster的优劣

优点
  • 当执行读操作时,默认在本地节点执行,所有的数据本地节点都有,不需要远程查询
  • 去中心化管理,即使在任一的一个时间点宕掉一个节点,其他节点仍可以继续工作,且没有数据损失
  • 对数据库读负载均衡支持较好,可以在任一节点执行读操作
缺点
  • 配置新节点的开销大,当添加一个新的节点的时候,所有数据会从一台现有的数据库复制到新节点,如果数据是100G则复制100G
  • 有多份数据副本,如果有三个节点,则数据有三个副本
  • 对写的负载均衡支持不够好,写入数据时,在所有节点都写

节点宕机与恢复时的数据同步

  • 如果数据刚好在节点宕机的时候数据发生改变,当宕机节点再次加入集群的时候有两种处理方法。第一种方式是State Snapshot Transfer (SST) ,第二种方法是Incremental State Transfer (IST)。

  • SST的方式是指把节点所有数据复制到另一个节点,这种操作有三种方法:mysqldump/rsync/xtrabackup,mysqldump和rsync的缺点是当数据复制的时候,数据是只读状态(读锁),SST用xtrabackup,在整个数据同步的过程中,都不存在读锁的情况

  • IST的方式是指只是将改变的数据从一个节点复制到另一个节点,在数据同步过程中也没有读锁。SST可能会影响你对服务的正常操作,而IST则不会。如果一个节点宕机一小会儿,IST方式可以找出宕机时间里数据发生的变化。IST的方式,节点有缓存机制。每个节点都在ring-buffer(无锁环形缓冲)中记录之前的N步修改,并且节点可以将数据缓存转为对数据的修改操作

  • 综上, 当数据的改变量小于N的时候才可以用IST,大于N的时候只能用SST方式

多主节点数据复制

  • 多主节点数据复制意味着,在任何数据节点上写入数据,集群中所有节点的数据都会一致,这和常规的mysql数据复制有很大的不同,常规的mysql数据复制,你需要同步主库的写入操作来保证数据是同步的。因为是多主节点数据复制,所以,所有的写入操作,要么在所有的节点上执行,要么一个都不执行。

在这里插入图片描述

  • 所有的查询操作都是在本地进行的,但是提交操作有点特殊。提交动作通过所有节点的核验才能执行,如果没有通过核验,本次提交你会收到一个error,在这之后,此提交动作仅适用于本机节点。

  • 提交动作的响应时间包括:请求在节点之间传输的时间、核验的时间、在本地应用提交的时间,但是提交操作在远程主机生效并不影响提交动作的响应时间,因为是发生在核验完成之后的。

这种框架设计,有两个重要的影响

1)可以实现真正的并行复制。从机可以使用wsrep_slave_threads变量配置多个并行线程

2)由于master写入数据比从库快,这个微小的时间差可能会导致从从库读取数据的时候,
   数据还没有进行更新


然而,通过设置变量`wsrep_causal_reads=ON`可以解决这个问题,设置之后,从从库
读取数据的操作会等到从库同步完数据之后再进行。由于主库和从库之间的时间差,
这种同步操作被称为虚拟的同步复制,而非完全同步复制。


上述提交动作还有其他重要含义,如果对两个不同的节点进行写操作,集群将会使用
乐观锁。这意味着在单个查询操作的时间里,事物不会检查可能发生的锁冲突,因此
可能在事物提交阶段报错。

关于mysql的几种锁

从读取数据时是否锁定读取行的数据来划分,mysql的锁分为乐观锁和悲观锁:

  • 悲观锁:在读取数据时锁住那几行,其他对这几行的更新需要等到悲观锁结束时才能继续
  • 乐观锁:读取数据时不锁,更新时检查是否数据已经被更新过,如果是则取消当前更新

一般在悲观锁的等待时间过长而不能接受时我们才会选择乐观锁

其他锁的概念:

  • 读锁(共享锁)是读取操作创建的锁。其他用户可以并发读取数据,但任何事务都不能对数据进行修改(获取数据上的排他锁),直到已释放所有共享锁。

  • 写缩(排他锁)当用户写入数据时加上排他锁

  • 死锁:是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。

锁的颗粒度取决于存储引擎 innodb引擎实现了行级锁、页级锁、表级锁

一、当前OS

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

二、设置运行环境

  1. 修改hosts文件
[root@localhost ~]# vim /etc/hosts
192.168.1.145 node1
192.168.1.143 node2
192.168.1.167 node3
  1. 修改selinux状态
[root@localhost ~]# vim /etc/selinux/config 
SELINUX=disabled
  1. 传输配置文件到其他节点
[root@localhost ~]# scp /etc/hosts node2:/etc/hosts
[root@localhost ~]# scp /etc/hosts node3:/etc/hosts
  1. 配置percona xtradb 的通讯端口(三个节点操作相同)
[root@localhost ~]# systemctl start firewalld
[root@localhost ~]# firewall-cmd --add-port=3306/tcp --permanent
[root@localhost ~]# firewall-cmd --add-port=4567/tcp --permanent
[root@localhost ~]# firewall-cmd --add-port=4568/tcp --permanent
[root@localhost ~]# firewall-cmd --add-port=4444/tcp --permanent
[root@localhost ~]# firewall-cmd --reload
  1. 配置ntp服务,确保时间同步
[root@localhost ~]# ntpdate ntp3.aliyun.com
[root@localhost ~]# crontab -e
*/10 * * * * ntpdate ntp3.aliyun.com
  1. 重启主机(三个主机操作相同)
[root@localhost ~]# reboot

三、3个节点分别安装xtradb cluster

yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
yum -y install Percona-XtraDB-Cluster-57

[root@node1 ~]# yum -y install epel-release 
[root@node1 ~]# yum -y install libev
[root@node1 ~]# wget https://www.percona.com/downloads/Percona-XtraDB-Cluster-LATEST/Percona-XtraDB-Cluster-5.7.24-31.33/binary/redhat/7/x86_64/Percona-XtraDB-Cluster-5.7.24-31.33-r443-el7-x86_64-bundle.tar
[root@node1 ~]# mkdir percona
[root@node1 ~]# tar -xf Percona-XtraDB-Cluster-5.7.24-31.33-r443-el7-x86_64-bundle.tar -C percona/
[root@node1 ~]# cd percona/
[root@node1 percona]# yum -y install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
# 这是个yum源,用于下边安装percona本地包的时候提供依赖关系的解决
[root@node1 percona]# yum -y localinstall Percona-XtraDB-Cluster-*.rpm

四、 配置mysql及集群文件(3个节点操作类似)

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

  1. 节点1修改配置文件
[root@node1 percona]# vim /etc/percona-xtradb-cluster.conf.d/mysqld.cnf 
server-id=1
character_set_server = utf8

[root@node1 percona]# vim /etc/percona-xtradb-cluster.conf.d/wsrep.cnf 
wsrep_cluster_address=gcomm://192.168.1.145,192.168.1.143,192.168.1.167 #补全即可
wsrep_node_address=192.168.1.145 #取消注释并修改
wsrep_node_name=node1 
wsrep_sst_auth="sstuser:sstuser" #取消注释并修改  数据同步时使用的账号和密码

  1. 节点2修改配置文件
[root@node2 percona]# vim /etc/percona-xtradb-cluster.conf.d/mysqld.cnf 
server-id=2
character_set_server = utf8

[root@node2 percona]# vim /etc/percona-xtradb-cluster.conf.d/wsrep.cnf 
wsrep_cluster_address=gcomm://192.168.1.145,192.168.1.143,192.168.1.167
wsrep_node_address=192.168.1.143
wsrep_node_name=node2
wsrep_sst_auth="sstuser:sstuser"
  1. 节点3修改配置文件
[root@node3 percona]# vim /etc/percona-xtradb-cluster.conf.d/mysqld.cnf 
server-id=3
character_set_server = utf8

[root@node3 percona]# vim /etc/percona-xtradb-cluster.conf.d/wsrep.cnf 
wsrep_cluster_address=gcomm://192.168.1.145,192.168.1.143,192.168.1.167
wsrep_node_address=192.168.1.167
wsrep_node_name=node3
wsrep_sst_auth="sstuser:sstuser" #数据同步使用的账户和密码

五、启动PXC集群

  1. 启动节点一(一定要先操作完第一台再去操作后边的)
[root@node1 ~]# systemctl start mysql@bootstrap.service
[root@node1 ~]# grep "temporary password" /var/log/mysqld.log 
2019-02-28T08:14:14.938652Z 1 [Note] A temporary password is generated for root@localhost: <1nC2g#:In#3
[root@node1 ~]# mysql -uroot -p'<1nC2g#:In#3'

mysql> alter user 'root'@'localhost' identified by '123456';
Query OK, 0 rows affected (0.03 sec)

mysql> create user 'sstuser'@'localhost' identified by 'sstuser';
#由于pxc的特点,在一个上创建,三台都有
Query OK, 0 rows affected (0.01 sec)

mysql> grant reload, lock tables, replication client, process on *.* to 'sstuser'@'localhost';
Query OK, 0 rows affected (0.04 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)

  1. 启动剩余节点
[root@node2 percona]# systemctl start mysql
[root@node3 percona]# systemctl start mysql

如果你使用的是CentOS7.2.1511,会发现mysql可以正常启动,但是未加入集群的情况
需要升级openssl,建议全部升级后再启动集群,这问题在CentOS 7.4.1708不存在即openssl版本较新

集群验证

  1. 在节点2上完成如下操作
[root@node2 percona]# mysql -uroot -p123456

mysql> show variables like 'version';
+---------------+------------------+
| Variable_name | Value            |
+---------------+------------------+
| version       | 5.7.24-26-57-log |
+---------------+------------------+
1 row in set (0.01 sec)

mysql> create database pxcdb;
Query OK, 1 row affected (0.06 sec)

mysql> use pxcdb
Database changed
mysql> create table t1(
    -> id int not null,
    -> name varchar(20)
    -> );
Query OK, 0 rows affected (0.06 sec)

mysql> insert into t1 values(1,'tiechui');
ERROR 1105 (HY000): Percona-XtraDB-Cluster prohibits use of DML command on a table (pxcdb.t1) without an explicit primary key with pxc_strict_mode = ENFORCING or MASTER
#这里验证了pxc的特性,每个表都要有主键

mysql> alter table t1 add primary key (id);
Query OK, 0 rows affected (0.20 sec)
Records: 0  Duplicates: 0  Warnings: 0
 
mysql> insert into t1 values(1,'tiechui');
Query OK, 1 row affected (0.01 sec)

  1. 在节点3上验证
[root@node3 percona]# mysql -uroot -p123456

mysql> show variables like 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 167   |
+---------------+-------+
1 row in set (0.02 sec)


mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| pxcdb              |
| sys                |
+--------------------+
5 rows in set (0.13 sec)

mysql> use pxcdb
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> use pxcdb -A
Database changed

mysql> select * from t1;
+----+---------+
| id | name    |
+----+---------+
|  1 | tiechui |
+----+---------+
1 row in set (0.00 sec)

  1. 查看集群状态 节点3上操作
mysql> show status like '%wsrep_clust%';
+--------------------------+--------------------------------------+
| Variable_name            | Value                                |
+--------------------------+--------------------------------------+
| wsrep_cluster_weight     | 3                                    |
| wsrep_cluster_conf_id    | 4                                    |
| wsrep_cluster_size       | 3                                    |
| wsrep_cluster_state_uuid | 1c209041-3c04-11e9-ac7b-b70d041a0189 |
| wsrep_cluster_status     | Primary                              |
+--------------------------+--------------------------------------+
5 rows in set (0.07 sec)

mysql> show status like 'wsrep_connected';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| wsrep_connected | ON    |
+-----------------+-------+
1 row in set (0.00 sec)

  1. 节点1再次验证是否同步
mysql> select * from pxcdb.t1;
+----+---------+
| id | name    |
+----+---------+
|  1 | tiechui |
+----+---------+
1 row in set (0.01 sec)
  1. 三个节点都验证监控命令
mysql> SHOW STATUS LIKE 'wsrep_local_state_comment';
+---------------------------+--------+
| Variable_name             | Value  |
+---------------------------+--------+
| wsrep_local_state_comment | Synced |
+---------------------------+--------+
1 row in set (0.01 sec)

You can monitor the current state of a node using the following command:
SHOW STATUS LIKE ‘wsrep_local_state_comment’;
When a node is in Synced (6) state, it is part of the cluster and ready to handle traffic.

官方文档是这样说的:如果这一项是synced,则表明此节点是集群的一部分,并且已经准备好处理流量
如果三塔都是synced,恭喜,xtradb cluster搭建完成

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值