1. 准备工作
1.1 准备虚拟机
因为我们要实现的是三台mysql节点集群,所以准备3台虚拟机
192.168.1.173
192.168.1.174
192.168.1.166
1.2 下载pxc资源包
在本文中讲的安装方式是本地安装,所以提前下载好资源包,下载pxc程序资源包。下载之后解压压缩包。pxc捆绑了percona数据库,所以无需单独下载percona安装包
1.3 qpress-11-1.el7.x86_64
下载qpress-11-1.el7.x86_64.prm ,可以去百度或者谷歌下载。
下载完1.2和1.3的资源如下图,由于pxc官网是国外网站,在此添加某国内云链接
2. PXC简介
PXC全称是Percona XtraDB Cluster, 是著名的mysql公司Percona出品的免费的数据库集群产品。
PXC对数据库集群是基于Galera的面向OLTP的多主同步复制插件。
长期以来mysql都缺少官方原生的集群方案,这也给很多第三方公司提供了机会,所以Galera技术就是众多mysql集群技术中较为著名的一种,mysql自带的主从复制模式天生就不能保证数据同步的完整一致,所以很多大公司花了很多人力和物力去解决这个问题,但是收效甚微,幸运的是Galera带来了多主架构,同步复制,并发复制,故障切换等一系列的功能。这才是真正意义上保证了数据的一致性,正确性和完整性。
PXC主要用于解决MySQL集群中数据同步强一致性的问题。
PXC是MySQL集群方案中公认的优先方案之一
2.1 PXC的特点
同步复制,事务在所有集群节点提交成功,要么不成功。
多主复制,可以在任意一个节点写入
数据同步的强一致性,所有节点数据保持一致
2.2 尽可能的控制PXC集群的规模
2.3 所有PXC节点的硬件配置要相同
PXC集群数据同步的速度取决于配置最低的节点。因为PXC是同步复制,一个节点写入的数据的速度慢,会拖慢整个集群的写入速度
2.4 PXC集群只支持InnoDB引擎
只有InnoDB的数据才会被同步
3. 安装PXC
3.1 删除MariaDB程序包
yum -y remove mari*
3.2 开放防火墙端口
firewall-cmd --zone=public --add-port=3306/tcp --permanent
firewall-cmd --zone=public --add-port=4444/tcp --permanent
firewall-cmd --zone=public --add-port=4567/tcp --permanent
firewall-cmd --zone=public --add-port=4568/tcp --permanent
firewall-cmd --reload
3.3 关闭SELINUX
把配置文件中的SELINUX的值改为disabled
vi /etc/selinux/config
修改之后执行reboot,重启linux系统
reboot
3.4 将pxc资源包上传到服务器并安装
在/usr/local目录下创建percona文件夹,将资源包上传到percona目录中
cd /usr/local
mkdir percona
cd percona
安装PXC
yum localinstall *.rpm
3.5 修改数据库配置文件
Percona数据库配置文件和mysql的配置文件不一样。
用下边命令查看Percona数据库配置文件的位置
cat /etc/my.cnf
进入Percona数据库配置文件的目录
mysql的常用信息都写在了mysqld.cnf文件,wsrep.cnf文件配置的是pxc集群的信息
我们可以简化一下配置文件,将mysqld.cnf文件和wsrep.cnf文件的内容复制到/etc/my.cnf文件中,把所有配置信息写到一个文件中,并添加字符集等配置细腻
[client]
socket=/var/lib/mysql/mysql.sock[mysqld]
server-id=1
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
log-bin
log_slave_updates
expire_logs_days=7character_set_server = utf8
bind-address = 0.0.0.0
#跳过DNS解析
skip-name-resolve# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
初始化root账户密码
启动mysql
systemctl start mysqld
查看默认密码
cat /var/log/mysqld.log | grep "A temporary password"
修改MySQL密码
mysql_secure_installation
输入新密码,新密码需要有大小写字母加数组,我们这里设置Abc_123456
后边有一些初始化的操作,所有都输入y
创建远程管理员账户
root账户默认不允许远程连接,所以我们创建一个可以远程连接的账户
进入mysql
mysql -u root -p
CREATE USER 'admin'@'%' IDENTIFIED BY 'Abc_123456';GRANT all privileges ON *.* TO 'admin'@'%';FLUSH PRIVILEGES;exit
关闭服务
systemctl stop mysqld
在my.cnf文件中添加pxc集群配置信息
server-id=1 #PXC集群中MySQL实例的唯一ID,不能重复,必须是数字
wsrep_provider=/usr/lib64/galera3/libgalera_smm.so
wsrep_cluster_name=pxc-cluster #PXC集群的名称
wsrep_cluster_address=gcomm://192.168.1.173,192.168.1.174,192.168.1.166
wsrep_node_name=pxc1 #当前节点的名称
wsrep_node_address=192.168.1.173 #当前节点的IP
wsrep_sst_method=xtrabackup-v2 #同步方法(mysqldump、rsync、xtrabackup)
wsrep_sst_auth= admin:Abc_123456 #同步使用的帐户
pxc_strict_mode=ENFORCING #同步严厉模式
binlog_format=ROW #基于ROW复制(安全可靠)
default_storage_engine=InnoDB #默认引擎
innodb_autoinc_lock_mode=2 #主键自增长不锁表
最终的配置文件my.cnf是这样的
[client]
socket=/var/lib/mysql/mysql.sock[mysqld]
server-id=1
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
log-bin
log_slave_updates
expire_logs_days=7character_set_server = utf8
bind-address = 0.0.0.0
#跳过DNS解析
skip-name-resolve# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
wsrep_provider=/usr/lib64/galera3/libgalera_smm.so
wsrep_cluster_name=pxc-cluster
wsrep_cluster_address=gcomm://192.168.1.173,192.168.1.174,192.168.1.166
wsrep_node_name=pxc1
wsrep_node_address=192.168.1.173
wsrep_sst_method=xtrabackup-v2
wsrep_sst_auth= admin:Abc_123456
pxc_strict_mode=ENFORCING
binlog_format=ROW
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
以上步骤在其余两台虚拟机重复此步骤,my.cnf的文件中server-id,wsrep_node_name,wsrep_node_address这三个参数是不能重复的值
3.6 启动命令
3.6.1 主节点的管理命令(第一个启动的PXC节点)
systemctl start mysql@bootstrap.servicesystemctl stop mysql@bootstrap.servicesystemctl restart mysql@bootstrap.service
3.6.2 非主节点的管理命令(非第一个启动的PXC节点)
service mysql start
service mysql stop
service mysql restart
3.7 连接测试
3.8 查看PXC集群状态信息
在任意一个节点执行以下命令
show status like 'wsrep_cluster%';
wsrep_cluster_size参数是说明pxc集群是几个数据库节点的集群。说明集群搭建成功。
4. 测试
我们在192.168.1.166的数据库中创建一个逻辑库testdb
刷新192.168.1.173和192.168.1.174的节点的数据库,发现也同步了testdb数据库
接着在192.168.1.173的testdb的数据库上创建一张student表
刷新其余两个节点的数据库,发现也同步表成功
我们在192.168.1.174节点上新建几条学生数据
刷新其余两个节点,发现数据也同步成功
5. PXC节点启动与关闭
- 如果最后关闭的PXC节点是安全退出的,那么下次启动要最先启动这个节点,而且要以主节点启动
- 如果最后关闭的PXC节点不是安全退出的,那么要先修改
/var/lib/mysql/grastate.dat
文件,把其中的safe_to_bootstrap
属性值设置为1,再安照主节点启动
5.1 PXC节点的安全关闭操作
节点怎么启动的,就使用对应的命令去关闭。如果用错了关闭命令,是不能关闭节点的数据服务的
systemctl stop mysql@bootstrap.service
service mysql stop
使用命令关闭主节点
关闭掉主节点之后查看/var/lib/mysql/grastate.dat文件
我们在关闭其他子节点,我们先关闭192.168.1.166节点,再关闭192.168.1.174节点
下一次pxc集群启动的主节点是192.168.1.174服务器,192.168.1.173和192.168.1.166以子节点启动
5.2 PXC节点的不安全或意外关闭操作
宕机,挂起,关机,重启,断电,断网都会让节点意外下线。
意外下线部分节点
安全下线节点不会让剩下的节点宕机,如果节点意外退出,集群的规模不会缩小,意外退出的节点超过半数,比如三个节点意外退出了2个节点,那么剩下的节点就不能够读写了。其他节点按照普通节点启动上线即可恢复pxc集群
service mysql start
意外下线全部节点,不同时退出
如果三个节点都意外退出,那么查看/var/lib/mysql/grastate.dat文件,看看哪个文件的safe_to_bootstarp的值是1,那么那个节点是最后意外关闭的,再按照safe_to_bootstarp的值启动pxc集群
意外下线全部节点,同时退出
如果三个节点同时意外退出,我们需要修改配置文件,挑选一个节点作为主节点,修改safe_to_bootstarp的值设置为1,那么这个节点可以以主节点启动