目录
一、概述
二、PXC环境准备
三、PXC文件配置与启动
四、测试
1.PXC(Percona Xtradb Cluster)
galera产品是以galera cluster方式为mysql提供高可用集群解决方案的。galera cluster就是集成了galera插件的mysql集群。galera replication是codership提供的mysql数据同步方案,具有高可用性,方便扩展,并且可以实现多个mysql节点间的数据同步复制与读写,可保障数据库的服务高可用及数据强一致性。
PXC属于一套近乎完美的mysql高可用集群解决方案,相比那些比较传统的基于主从复制模式的集群架构MHA+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架构。客户端写入和读取数据时,连接哪个实例都是一样的。读取到的数据时相同的,写入任意一个实例之后,集群自己会将新写入的数据同步到其他实例上,这种架构不共享任何数据,是一种高冗余架构。
2.PXC特点
- 数据强一致性、无同步延迟
- 没有主从切换操作,无需使用虚拟IP
- 支持InnoDB存储引擎
- 多线程复制
- 支持节点自动加入,无需手动拷贝数据
3.PXC使用到的端口
端口 | 说明 |
3306 | 数据库服务端口 |
4444 | SST端口 |
4567 | 集群通信端口 |
4568 | IST端口 |
SST | State Snapshot Transfer 全量同步 |
IST | Incremental State Transfer 增量同步 |
4.软件支持
软件 | 作用 |
percona-xtrabackup | 在线热备程序 |
qpress | 递归压缩程序 |
Percona-XtraDB-Cluster-server | 集群服务程序 |
1.ip规划
2.配置域名与主机对应
每台主机上都需要配置
- hostname pxcnode71]# vim /etc/hosts
- 192.168.4.71 pxcnode71
- 192.168.4.72 pxcnode72
- 192.168.4.73 pxcnode73
- hostname pxcnode72]# vim /etc/hosts
- 192.168.4.71 pxcnode71
- 192.168.4.72 pxcnode72
- 192.168.4.73 pxcnode73
- hostname pxcnode73]# vim /etc/hosts
- 192.168.4.71 pxcnode71
- 192.168.4.72 pxcnode72
- 192.168.4.73 pxcnode73
3.安装软件支持
[软件下载]https://github.com/ck784101777/PXC
在三台主机上都需要装软件支持
- ]# 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
1.PXC配置文件作用一览
- 配置文件存放目录:/etc/percona-xtradb-cluster.conf.d
配置文件说明
- 数据库服务器运行参数配置文件: mysqld.cnf
- Percona Server 配置文件: mysqld_safe.cnf
- PXC配置文件:wsrep.cnf
2.修改mysqld.cnf配置文件
这个文件相当于my.cnf(mysql的主配置文件),这个文件决定了软件执行过程中各类文件存储地址,以及是否开启binlog日志等信息.
三台主机都需要修改,除server-id不同外其他配置一致
- [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 //日志文件保留天数
- :wq
2.修改mysqld_safe.cnf
三台主机都需要修改,配置信息相同
- [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
- :wq
3.修改wsrep.cnf文件
这个文件定义了集群地址,本机节点地址,集群名与授权认证等信息
三台主机都需要修改,wsrep_node_address,wsrep_node_name=pxcnode71这两处需要根据本机ip和主机名相同,这里我们 提前定义了用户密码,在下面实验中将创建这个用户
- [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数据同步授权用户及密码
- :wq
4. 启动PXC集群服务
我们配置了三台数据库服务器,我们只需要在一台主机上启动集群服务即可,启动方式比较奇葩,启动mysql数据库服务,做一个授权用户(第一次使用需要修改一下初始密码)
- [root@pxcnode71 ~]# ]# systemctl start [email protected] //启动集群服务
- [root@pxcnode71 ~]# grep pass /var/log/mysqld.log //查看数据库管理员初始登录密码
- 2019-06-20T12:29:42.489377Z 1 [Note] A temporary password is generated for root@localhost: W.HiOb8(ok)_
- [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”; //添加授权用户
5.启动数据库服务
在每台主机上启动数据库服务 ,3306是mysql端口,4567是集群通信端口,保证这两个端口打开
- [root@pxcnode72 ~]# systemctl start mysql //启动数据库服务
- [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 ~]#
测试目标:
1.测试数据库集群状态
2.测试数据存储是否同步
3.测试一台服务器宕机不影响整个集群
1.查看集群信息
在任意一台数据查看都可以。查看服务器连接状态显示NO,并且服务器台数为3即可
- [root@pxcnode71 ~]# mysql -uroot -p123456
- mysql-> show status like "%wsrep%";
- wsrep_incoming_addresses 192.168.4.71:3306,192.168.4.72:3306,192.168.4.73:3306 //集群成员列表
- wsrep_cluster_size 3 //集群服务器台数
- wsrep_cluster_status Primary //集群状态
- wsrep_connected ON //连接状态
- wsrep_ready ON //服务状态
2.数据同步
1)创建授权用户
添加访问数据的连接用户 (在任意一台服务器上添加都可以,另外的2台服务器会自动同步授权用户)
在72主机上创建用户,在71和73上查看是否同步该用户
- [root@pxcnode72 ~]# mysql -uroot -p123456
- mysql> grant all on gamedb.* to yaya@"%" identified by "123456"; //添加授权用户
- Query OK, 0 rows affected, 1 warning (0.18 sec)
- [root@pxcnode71 ~]# mysql -uroot -p123456 -e 'show grants for yaya@"%" ' //查看71
- +--------------------------------------------------+
- | Grants for yaya@% |
- +--------------------------------------------------+
- | GRANT USAGE ON *.* TO 'yaya'@'%' |
- | GRANT ALL PRIVILEGES ON `gamedb`.* TO 'yaya'@'%' |
- +--------------------------------------------------+
- [root@pxcnode73 ~]# mysql -uroot -p123456 -e 'show grants for yaya@"%" ' //查看72
- +--------------------------------------------------+
- | Grants for yaya@% |
- +--------------------------------------------------+
- | GRANT USAGE ON *.* TO 'yaya'@'%' |
- | GRANT ALL PRIVILEGES ON `gamedb`.* TO 'yaya'@'%' |
- +--------------------------------------------------+
2)客户端连接集群存取数据 (连接任意一台数据库服务器的ip地址都可以)
连接数据服务器主机73,建立库表并插入数据
- client50 ~]# mysql -h192.168.4.73 -uyaya -p123456 //连接服务器73
- mysql>
- mysql> create database gamedb; //建库
- Query OK, 1 row affected (0.19 sec)
- mysql> create table gamedb.a(id int primary key auto_increment,name char(10));//建表
- Query OK, 0 rows affected (1.02 sec)
- mysql> insert into gamedb.a(name)values("bob"),("tom"); //插入记录
- Query OK, 2 rows affected (0.20 sec)
- Records: 2 Duplicates: 0 Warnings: 0
在另外2台数据库服务器查看数据,客户端连接数据库服务器71主机查看数据。
- client50 ~]# mysql -h192.168.4.71 -uyaya -p123456 //连接服务器71
- mysql> select * from gamedb.a; //查看记录
- +----+-------+
- | id | name |
- +----+-------+
- | 2 | bob |
- | 5 | tom |
- client50 ~]# mysql -h192.168.4.73 -uyaya -p123456 //连接服务器73
- mysql> select * from gamedb.a; //查看记录
- +----+-------+
- | id | name |
- +----+-------+
- | 2 | bob |
- | 5 | tom |
3.测试集群的高可用与故障后的数据恢复
1)停止数据库服务
停止3台服务器的任意一台主机的数据库服务都不会影响数据的存取。停止71号服务器的数据库服务,然后在72服务器上插入两条数据.在73好服务器上查看表记录,如果有记录证明一台服务器宕机后不影响集群中的其他主机.再启动71服务器的数据库服务,查看是否有这两条记录,如果有记录证明PXC自带的数据恢复
- [root@pxcnode71 ~]# systemctl stop mysql //停止71主机的数据库服务
- Client50 ~]# client50 ~]# mysql -h192.168.4.72 -uyaya -p123456 //连接服务器72
- mysql> insert into gamedb.a(name)values("bob2"),("tom2");
- mysql> insert into gamedb.a(name)values("jerry"),("jack");
- Query OK, 2 rows affected (0.20 sec)
- Records: 2 Duplicates: 0 Warnings: 0
2)客户端50,连接数据库主机73,查看数据
- client50 ~]# mysql -h192.168.4.73 -uyaya -p123456 //连接服务器73
- mysql> select * from gamedb.a;
- +----+-------+
- | id | name |
- +----+-------+
- | 2 | bob |
- | 5 | tom |
- | 7 | bob2 |
- | 9 | tom2 |
- | 11 | jerry |
- | 13 | jack |
- +----+-------+
- 6 rows in set (0.00 sec)
3)启动71主机的数据库服务
数据库服务运行后,会自动同步宕机期间的数据。
- client50 ~]# mysql -h192.168.4.71 -uyaya -p123456 //连接服务器71
- mysql> select * from gamedb.a;
- +----+-------+
- | id | name |
- +----+-------+
- | 2 | bob |
- | 5 | tom |
- | 7 | bob2 |
- | 9 | tom2 |
- | 11 | jerry |
- | 13 | jack |
- +----+-------+
- rows in set (0.00 sec)