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一样。
浙公网安备 33010602011771号