Mysql的PXC集群部署(1)

Percona XtraDB Cluster是MySQL高可用性和可扩展性的解决方案.
Percona XtraDB Cluster集群是有节点组成的,推荐配置至少3个节点,但是也可以运行在2个节点上。
Percona XtraDB Cluster提供的特性有:
  1.同步复制,事务要么在所有节点提交或不提交。(正因为同步复制所以保持一致性,而Mysql主从方式使用半同步还是存在不一致性。)
  2.多主复制,可以在任意节点进行写操作

Percona XtraDB Cluster优点

  1.当执行一个查询时,在本地节点上执行。因为所有数据都在本地,无需远程访问。

  2.无需集中管理。可以在任何时间点失去任何节点,但是集群将照常工作。

  3.良好的读负载扩展,任意节点都可以查询


Percona XtraDB Cluster缺点如下:

  1.加入新节点,开销大需要复制完整的数据

  2.不能有效的解决写缩放问题,所有的写操作都将发生在所有节点上。(所有节点都在写,所以也导致有多少节点就有多少数据)

  3.有多少个节点就有多少重复的数据

 

 

准备3台虚拟主机,配置ip地址和主机名。

  node1    192.168.4.51    数据库服务器

  node2    192.168.4.52    数据库服务器

  node3    192.168.4.53    数据库服务器

 

步骤一:环境准备

  • 配置主机名与ip地址绑定

配置服务器(分别配置node1,node2,node3的/etc/hosts与主机名,以node1为例)

1 [root@localhost ~]#  vim /etc/hosts
2 192.168.4.51     node1
3 192.168.4.52     node2
4 192.168.4.53     node3
5 :wq
6 [root@localhost ~]# hostname  node1      //设置主机名

 

在任意一台服务器上ping 对方的主机名,ping通为配置成功。

 1 [root@node1 ~]# ping -c 2  node1  //成功
 2 PING node1 (192.168.4.51) 56(84) bytes of data.
 3 64 bytes from node1 (192.168.4.51): icmp_seq=1 ttl=255 time=0.011 ms
 4 64 bytes from node1 (192.168.4.51): icmp_seq=2 ttl=255 time=0.020 ms
 5 
 6 --- node1 ping statistics ---
 7 2 packets transmitted, 2 received, 0% packet loss, time 999ms
 8 rtt min/avg/max/mdev = 0.011/0.015/0.020/0.006 ms
 9 [root@node1 ~]# 
10 [root@node1 ~]# 
11 [root@node1 ~]# ping -c 2  node2//成功
12 PING node2(192.168.4.52) 56(84) bytes of data.
13 64 bytes from node2(192.168.4.52): icmp_seq=1 ttl=255 time=0.113 ms
14 64 bytes from node2(192.168.4.52): icmp_seq=2 ttl=255 time=0.170 ms
15     
16 --- node2ping statistics ---
17 2 packets transmitted, 2 received, 0% packet loss, time 1000ms
18 rtt min/avg/max/mdev = 0.113/0.141/0.170/0.030 ms
19 [root@node1 ~]# 
20 [root@node1 ~]# 
21 [root@node1 ~]# ping -c 2  node3 //成功
22 PING node3 (192.168.4.53) 56(84) bytes of data.
23 64 bytes from node3 (192.168.4.53): icmp_seq=1 ttl=255 time=0.198 ms
24 64 bytes from node3 (192.168.4.53): icmp_seq=2 ttl=255 time=0.155 ms
25 
26 --- node3 ping statistics ---
27 2 packets transmitted, 2 received, 0% packet loss, time 1000ms
28 rtt min/avg/max/mdev = 0.155/0.176/0.198/0.025 ms
29 [root@node1 ~]#

 

步骤二:安装软件包

在node1,node2,node3 服务器安装软件包(以node安装为例)

软件包之间有依赖注意软件包安装顺序

1 [root@node1 ~]# rpm -ivh libev-4.15-1.el6.rf.x86_64.rpm    //安装依赖
2 [root@node1 ~]#yum  -y  install  percona-xtrabackup-24-2.4.13-1.el7.x86_64.rpm
3     
4 [root@node1 ~]# rpm -ivh qpress-1.1-14.11.x86_64.rpm     //安装依赖
5 [root@node1 ~]# tar -xvf  Percona-XtraDB-Cluster-5.7.25-31.35-r463-el7-x86_64-bundle.tar
6 [root@node1 ~]# yum -y  install  Percona-XtraDB-Cluster-*.rpm

 

步骤三:配置服务

实现此案例需要按照如下步骤进行。

  • 一:修改mysqld.cnf文件(node1,node2,node3都需要修改,server-id不同,你可以scp/rsync同步该配置在修改项)

 1 [root@node1 ~]#  vim /etc/percona-xtradb-cluster.conf.d/mysqld.cnf
 2 [mysqld]
 3 server-id=51                      //server-id 不允许重复【不同服务器该配置项不同】
 4 datadir=/var/lib/mysql                  //数据库目录
 5 socket=/var/lib/mysql/mysql.sock         //socket文件
 6 log-error=/var/log/mysqld.log        //日志文件
 7 pid-file=/var/run/mysqld/mysqld.pid    //pid文件
 8 log-bin                    //启用binlog日志
 9 log_slave_updates            //启用链式复制
10 expire_logs_days=7            //日志文件保留天数
11 :wq

 

  • 二:修改mysqld_safe.cnf文件(node1,node2,node3都需要修改,以node1为例)

分别修改3台服务器的mysqld_safe.cnf (使用默认配置即可)

1 [root@node1 ~]# vim /etc/percona-xtradb-cluster.conf.d/mysqld_safe.cnf
2 [mysqld_safe]
3 pid-file = /var/run/mysqld/mysqld.pid
4 socket   = /var/lib/mysql/mysql.sock
5 nice     = 0
6 :wq

 

  • 三:修改wsrep.cnf文件(node1,node2,node3都需要修改,以node1为例)

分别修改3台服务器的wsrep.cnf

1 [root@node1 ~]# vim /etc/percona-xtradb-cluster.conf.d/mysqld_safe.cnf
2 wsrep_cluster_address=gcomm://192.168.4.51,192.168.4.52,192.168.4.53    //成员列表
3 wsrep_node_address=192.168.4.51       //本机ip【不同服务器不同
4 wsrep_cluster_name=pxc-cluster   //集群名
5 wsrep_node_name=node1     //本机主机名【不同服务器不同
6 wsrep_sst_auth="sstuser:123qqq...A" //SST数据同步授权用户及密码
7 :wq

 

步骤四:启动服务

1)启动集群服务

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

1 [root@node1 ~]# systemctl  start mysql@bootstrap.service    //启动集群服务
2 [root@node1 ~]# grep pass /var/log/mysqld.log     //查看数据库管理员初始登录密码
3 2019-06-20T12:29:42.489377Z 1 [Note] A temporary password is generated for root@localhost: W.HiOb8(ok)_
4     
5 [root@node1 ~]#mysql –uroot –p’ W.HiOb8(ok)_’ //使用初始密码登录
6 Mysql> alter user  root@”localhost” identified by “123456”;//修改登录密码
7 MySQL> exit;
8 [root@node1 ~]#mysql –uroot –p123456 //使用修改后的密码登录
9 Mysql> garnt reload, lock tables,replication client,process on *.*  to  sstuser@"localhost” identified by  “123qqq…A”; //添加授权用户

 

2)启动数据库服务

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

1 [root@node2 ~]# systemctl  start mysql  //启动数据库服务
2 [root@node2 ~]#
3 [root@node2 ~]# netstat -utnlp  | grep :3306
4 tcp6       0      0 :::3306                 :::*                    LISTEN      12794/mysqld        
5 [root@node2 ~]# netstat -utnlp  | grep :4567
6 tcp        0      0 0.0.0.0:4567            0.0.0.0:*               LISTEN      12794/mysqld        
7 [root@node2 ~]# mysql -uroot -p'123456'
8 Mysql> show grants;
9 Mysql> show grants for sstuser@"localhost”;

 

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

1 [root@node3 ~]# systemctl  start mysql  //启动数据库服务
2 [root@node3 ~]#
3 [root@node3 ~]# netstat -utnlp  | grep :3306
4 tcp6       0      0 :::3306                 :::*                    LISTEN      12794/mysqld        
5 [root@node3 ~]# netstat -utnlp  | grep :4567
6 tcp        0      0 0.0.0.0:4567            0.0.0.0:*               LISTEN      12794/mysqld        
7 [root@node3 ~]# mysql -uroot -p'123456'
8 Mysql> show grants;
9 Mysql> show grants for sstuser@"localhost”;

 

注意:启动过程中查看日志,如果发现日志OpenSSL版本过低时请根据系统版本升级OpenSSL,以下有2种方案:

  # cat  /var/log/mysql.log  //查看日志,如果有问题可查日志,然后再找解决方法。

  方案1:yum已配置外部源,且可连接。    

#yum -y install openssl        //安装OpenSSL
#yum -y update openssl        //更新OpenSSL(升级OpenSSL版本)

  方案2:通过下载rpm包升级(centos7中openssl-1.0.2k-19.el7.x86_64.rpm ,openssl-libs-1.0.2k-19.el7.x86_64.rpm ,openssl-devel-1.0.2k-19.el7.x86_64.rpm)  

下载相关OpenSSL的rpm包(通过阿里),本例把相关rpm打包成包
# mkdir  openssl
# tar -xf openssl-1.0.2k-el7.tar.gz -C openssl/
#  rpm -Uvh openssl-*.rpm        //通过rpm命令升级
或
# yum update openssl-*.rpm         //通过yum命令升级

 

 

 

步骤五:测试配置

 

 

步骤一:查看集群信息
1)启动数据库服务
在任意一台数据查看都可以。
1. [root@pxcnode71 ~]# mysql -uroot -p123456
2. wsrep_incoming_addresses 192.168.4.71:3306,192.168.4.72:3306,192.168.4.73:3306 //集群成员列表
3. wsrep_cluster_size 3 //集群服务器台数
4. wsrep_cluster_status Primary //集群状态
5. wsrep_connected ON //连接状态
6. wsrep_ready ON //服务状态
步骤二:访问集群,存取数据
1)添加访问数据的连接用户 (在任意一台服务器上添加都可以,另外的2台服务器会自动同步授权用户)
1. [root@pxcnode72 ~]# mysql -uroot -p123456
2. mysql> grant all on gamedb.* to yaya@"%" identified by "123456"; //添加授权用户
3. Query OK, 0 rows affected, 1 warning (0.18 sec)
4.
5. [root@pxcnode71 ~]# mysql -uroot -p123456 -e 'show grants for yaya@"%" ' //查看
6. mysql: [Warning] Using a password on the command line interface can be insecure.
7. +--------------------------------------------------+
8. | Grants for yaya@% |
9. +--------------------------------------------------+
10. | GRANT USAGE ON *.* TO 'yaya'@'%' |
11. | GRANT ALL PRIVILEGES ON `gamedb`.* TO 'yaya'@'%' |
12. +--------------------------------------------------+
13. [root@pxcnode71 ~]#
14.
15. [root@pxcnode73 ~]# mysql -uroot -p123456 -e 'show grants for yaya@"%" ' //查看
16. mysql: [Warning] Using a password on the command line interface can be insecure.
17. +--------------------------------------------------+
18. | Grants for yaya@% |
19. +--------------------------------------------------+
20. | GRANT USAGE ON *.* TO 'yaya'@'%' |
21. | GRANT ALL PRIVILEGES ON `gamedb`.* TO 'yaya'@'%' |
22. +--------------------------------------------------+
23. [root@pxcnode73 ~]#
2)客户端连接集群存取数据 (连接任意一台数据库服务器的ip地址都可以)
连接数据服务器主机73
1. client50 ~]# mysql -h192.168.4.73 -uyaya -p123456 //连接服务器73
2. mysql>
3. mysql> create database gamedb; //建库
4. Query OK, 1 row affected (0.19 sec)
5.
6. mysql> create table gamedb.a(id int primary key auto_increment,name char(10));//建表
7. Query OK, 0 rows affected (1.02 sec)
8.
9. mysql> insert into gamedb.a(name)values("bob"),("tom"); //插入记录
10. Query OK, 2 rows affected (0.20 sec)
11. Records: 2 Duplicates: 0 Warnings: 0
3)在另外2台数据库服务器查看数据,客户端连接数据库服务器71主机查看数据。
1. client50 ~]# mysql -h192.168.4.71 -uyaya -p123456 //连接服务器71
2. mysql> select * from gamedb.a; //查看记录
3. +----+-------+
4. | id | name |
5. +----+-------+
6. | 2 | bob |
7. | 5 | tom |
4)客户端连接数据库服务器73主机查看数据
1. client50 ~]# mysql -h192.168.4.73 -uyaya -p123456 //连接服务器73
2. mysql> select * from gamedb.a; //查看记录
3. +----+-------+
4. | id | name |
5. +----+-------+
6. | 2 | bob |
7. | 5 | tom |
步骤三:测试故障自动恢复
1)停止数据库服务
停止3台服务器的任意一台主机的数据库服务都不会影响数据的存取。
1. [root@pxcnode71 ~]# systemctl stop mysql //停止71主机的数据库服务
2.
3.
4. Client50 ~]# client50 ~]# mysql -h192.168.4.72 -uyaya -p123456 //连接服务器72
5. mysql> insert into gamedb.a(name)values("bob2"),("tom2");
6. mysql> insert into gamedb.a(name)values("jerry"),("jack");
7. Query OK, 2 rows affected (0.20 sec)
8. Records: 2 Duplicates: 0 Warnings: 0
客户端50,连接数据库主机73,查看数据
1. client50 ~]# mysql -h192.168.4.73 -uyaya -p123456 //连接服务器73
2. mysql> select * from gamedb.a;
3. +----+-------+
4. | id | name |
5. +----+-------+
6. | 2 | bob |
7. | 5 | tom |
8. | 7 | bob2 |
9. | 9 | tom2 |
10. | 11 | jerry |
11. | 13 | jack |
12. +----+-------+
13. 6 rows in set (0.00 sec)
3)启动71主机的数据库服务
数据库服务运行后,会自动同步宕机期间的数据。
1. client50 ~]# mysql -h192.168.4.71 -uyaya -p123456 //连接服务器71
2. mysql> select * from gamedb.a;
3. +----+-------+
4. | id | name |
5. +----+-------+
6. | 2 | bob |
7. | 5 | tom |
8. | 7 | bob2 |
9. | 9 | tom2 |
10. | 11 | jerry |
11. | 13 | jack |
12. +----+-------+
13. rows in set (0.00 sec)

 

 

备注:PXC中在任何一个节点写入,数据同步到其他节点。始终保持各节点的数据一致性,就像对节点做了clone一样。

 

 

 

 

 

posted @ 2019-10-30 23:34  gageshen  阅读(58)  评论(0)    收藏  举报