PXC 是一套 MySQL 高可用集群解决方案,与传统的基于主从复制模式的集群架构相比 PXC 最突出特点就是解决了诟病已久的数据复制延迟问题,基本上可以达到实时同步。而且节点与节点之间,他们相互的关系是对等的。PXC 最关注的是数据的一致性,对待事物的行为时,要么在所有节点上执行,要么都不执行,它的实现机制决定了它对待一致性的行为非常严格,这也能非常完美的保证 MySQL 集群的数据一致性;
优点:
缺点:
InnoDB
引擎,其他存储引擎的更改不复制。PXC 集群节点越多,数据同步的速度就越慢。
Replication | PXC |
---|---|
数据同步是单向的,master 负责写,然后异步复制给 slave;如果 slave 写入数据,不会复制给 master | 数据同步时双向的,任何一个 mysql 节点写入数据,都会同步到集群中其它的节点 |
异步复制,从和主无法保证数据的一致性 | 同步复制,事务在所有集群节点要么同时提交,要么同时不提交 |
- SST(State Snapshot Transfer): 全量传输
- **IST(Incremental state Transfer)*增量传输
MariaDB
起初 MySQL 之父 Monty 在 1979 年写下 MySQL 的第一行代码,后来逐渐创建起 MySQL 公司,后将其以 10 亿美金卖给 Sun,结果 Sun 又把 MySQL 转手卖给 Oracle,Monty 愤而出走,以 MySQL5.5 为基础创造了 MariaDB 数据库,这样就诞生出了 MySQL 分支里知名度最高的一个衍生版。
Percona Server
Percona Server 是 MySQL 咨询公司 Percona 发布的性能最接近 MySQL 企业版的 MySQL 产品。Percona 公司在 MySQL 数据库优化方面做了非常多的工作,以至于 Percona Server 数据库是 MySQL 众多分支中,在高负载、高并发情况下表现非常突出,乃至阿里巴巴的 OceanBase 数据库都要借鉴 Percona Server。
XtraDB 引擎是 Percona 公司开发设计的,与 MySQL5.1 内置的 InnoDB 相比,单位时间执行事务数量是后者的 2.7 倍。而且在 Percona Server 上面默认使用的也是 XtraDB 引擎。所以说 MariaDB 和 Percona Server 在正常情况下的性能基本持平。但是在高并发和高负载的条件下,Percona Server 的表现更好一些。所以本文采用 Percona Server 来搭建。
首先打开 https://www.percona.com/downloads/Percona-Server-5.7/
选择对应版本,由于 Percona Server 只支持 Linux 所以我们就选择对应版本即可。
此时我们也需要下载 jemalloc 下载地址:
https://cbs.centos.org/koji/taskinfo?taskID=709
最下方选择 jemalloc-3.6.0-8.el7.centos.x86_64.rpm 。
下载完成后,我们将文件拷贝到 linux 的 home 目录下:
yum localinstall *.rpm
执行完成后我们启动数据库:
systemctl start mysqld
开放 3306 端口:
firewall-cmd --zone=public --add-port=3306/tcp --permanent
firewall-cmd --reload
接下来要修改 MySQL 配置文件:
vim /etc/my.cnf
[mysqld]
character_set_server = utf8
bind-address = 0.0.0.0
#跳过DNS解析
skip-name-resolve
完成之后重启 mysql
systemctl restart mysqld
禁止开机启动 MySQL,防止 pxc 集群假如有一个节点宕机了,重启后会自动与一个 pxc 集群进行数据同步。如果宕机时间过长,同步数据非常多,这个时候会限制其它写入操作。所以正确操作,应该是拷贝数据文件再启动 mysql。
chkconfig mysqld off
查看 MySQL 初始密码
cat /var/log/mysqld.log | grep "A temporary password"
修改 MySQL 密码
mysql_secure_installation
登录 mysql 并赋予远程登录权限
mysql -u root -p
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
FLUSH PRIVILEGES;
Percona XtraDB Cluster (简称 PXC)集群是基于 Galera 2.x library,事务型应用下的通用的多主同步复制插件,主要用于解决强一致性问题,使得各个节点之间的数据保持实时同步以及实现多节点同时读写。提高了数据库的可靠性,也可以实现读写分离,是 MySQL 关系型数据库中大家公认的集群优选方案之一。
yum -y remove mari*
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
vim /etc/selinux/config
把 SELINUX 属性值设置成 disabled,之后保存。
reboot
安装 PXC 里面集成了 Percona Server 数据库,所以不需要安装 Percona Server 数据库。
https://www.percona.com/downloads/Percona-XtraBackup-2.4/LATEST/
https://www.percona.com/downloads/Percona-XtraDB-Cluster-57/LATEST/
下载 qpress-11-1.el7.x86_64.rpm
https://repo.percona.com/yum/release/7/RPMS/x86_64/qpress-11-1.el7.x86_64.rpm
最后上传到 centos 服务器中。
执行下面命令进行安装
yum localinstall *.rpm
之后还是对 Percona Server 数据库的初始化:
修改/etc/my.cnf
我们查看之后可以看到里面内容不是之前 mysql 的配置信息
我们进入 etc/percona-xtradb-cluster.conf.d/文件夹下可以看到有三个文件:
mysql 的常用信息都写在了 mysqld.cnf 文件,wsrep.cnf 文件配置的是 pxc 集群的信息。
我们可以简化一下配置文件,将 mysqld.cnf 文件和 wsrep.cnf 文件的内容复制到/etc/my.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=7
character_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
然后我们启动 mysql
systemctl start mysqld
查看默认密码
cat /var/log/mysqld.log | grep "A temporary password"
修改 MySQL 密码:这里密码就修改为 Abc_123456
mysql_secure_installation
进入 mysql
mysql -u root -p
创建用户修改权限:
CREATE USER 'admin'@'%' IDENTIFIED BY 'Abc_123456';
GRANT all privileges ON *.* TO 'admin'@'%';
FLUSH PRIVILEGES;
之后我们 exit 退出,停止 mysql 服务
systemctl stop mysqld
在/etc/my.cnf 中配置集群信息:
[client]
socket=/var/lib/mysql/mysql.sock
[mysqld]
# PXC集群中MySQL实例的唯一ID,不能重复,必须是数字
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=7
character_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
# PXC集群的名称
wsrep_cluster_name=pxc-cluster
# PXC集群的所有ip
wsrep_cluster_address=gcomm://192.168.3.137,192.168.3.138,192.168.3.139
# 当前节点的名称
wsrep_node_name=pxc1
# 当前节点的IP
wsrep_node_address=192.168.3.137
# 同步方法(mysqldump、rsync、xtrabackup)
wsrep_sst_method=xtrabackup-v2
# 同步使用的帐户
wsrep_sst_auth= admin:Abc_123456
# 同步严厉模式
pxc_strict_mode=ENFORCING
# 基于ROW复制(安全可靠)
binlog_format=ROW
# 默认引擎
default_storage_engine=InnoDB
# 主键自增长不锁表
innodb_autoinc_lock_mode=2
以上步骤在其余两台虚拟机重复此步骤,my.cnf 的文件中 server-id,wsrep_node_name,wsrep_node_address 这三个参数是不能重复的值。
启动命令 主节点的管理命令(第一个启动的 PXC 节点)
systemctl start [email protected]
systemctl stop [email protected]
systemctl restart [email protected]
service mysql start
service mysql stop
service mysql restart
查看 PXC 集群状态信息,在任意一个节点执行以下命令:
show status like 'wsrep_cluster%';
wsrep_cluster_size 参数是说明 pxc 集群是几个数据库节点的集群。说明集群搭建成功。
我们在 137 节点下创建数据库 test 看看其它两个是否同步过去。
可以看到没有问题:
我们再创建张表增加一条数据试试:
可以看到也是没有问题的。另外不仅使用哪个节点操作数据也会被同步到其它集群中。
欢迎关注我的公众号:Java菜鸟程序员
希望可以一起探讨交流,一起学习!