MySQL 数据库集群 -PXC 计划(一)
什么是 PXC
PXC 是一套 MySQL 高可用集群解决方案,与传统的基于主从复制模式的集群架构相比 PXC 最突出特点就是解决了诟病已久的数据复制提早问题,基本上能够达到实时同步。而且节点与节点之间,他们互相的关系是对等的。PXC 最关注的是数据的一致性,看待事物的行为时,要么在所有节点上执行,要么都不执行,它的实现机制决定了它看待一致性的行为十分严格,这也能十分完满的保障 MySQL 集群的数据一致性;
PXC 的特点
- 齐全兼容 MySQL。
- 同步复制,事务要么在所有节点提交或不提交。
- 多主复制,能够在任意节点进行写操作。
- 在从服务器上并行利用事件,真正意义上的并行复制。
- 节点主动配置,数据一致性,不再是异步复制。
- 故障切换:因为反对多点写入,所以在呈现数据库故障时能够很容易的进行故障切换。
- 主动节点克隆:在新增节点或停机保护时,增量数据或根底数据不须要人工手动备份提供,galera cluster 会主动拉取在线节点数据,集群最终会变为统一。
PXC 的优缺点
长处 :
- 服务高可用。
- 数据同步复制 (并发复制),简直无提早。
- 多个可同时读写节点,可实现写扩大,不过最好当时进行分库分表,让各个节点别离写不同的表或者库,防止让 galera 解决数据抵触。
- 新节点能够主动部署,部署操作简略。
- 数据严格一致性,尤其适宜电商类利用。
- 齐全兼容 MySQL。
毛病 :
- 复制只反对
InnoDB
引擎,其余存储引擎的更改不复制。 - 写入效率取决于节点中最弱的一台,因为 PXC 集群采纳的是强一致性准则,一个更改操作在所有节点都胜利才算执行胜利。
- 所有表都要有主键。
- 不反对 LOCK TABLE 等显式锁操作。
- 锁抵触、死锁问题绝对更多。
PXC 集群节点越多,数据同步的速度就越慢。
PXC 与 Replication 的区别
Replication | PXC |
---|---|
数据同步是单向的,master 负责写,而后异步复制给 slave;如果 slave 写入数据,不会复制给 master | 数据同步时双向的,任何一个 mysql 节点写入数据,都会同步到集群中其它的节点 |
异步复制,从和主无奈保证数据的一致性 | 同步复制,事务在所有集群节点要么同时提交,要么同时不提交 |
PXC 罕用端口
- 3306:数据库对外服务的端口号。
- 4444:申请 SST 的端口。
- 4567:组成员之间进行沟通的一个端口号。
- 4568:用于传输 IST。
- SST(State Snapshot Transfer): 全量传输
- IST(Incremental state Transfer): 增量传输
MySQL 衍生版抉择
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 来搭建。
装置 Percona Server
首先关上 https://www.percona.com/downl…
抉择对应版本,因为 Percona Server 只反对 Linux 所以咱们就抉择对应版本即可。
此时咱们也须要下载 jemalloc 下载地址:
https://cbs.centos.org/koji/t…
最下方抉择 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;
搭建 PXC 集群
Percona XtraDB Cluster (简称 PXC) 集群是基于 Galera 2.x library,事务型利用下的通用的多主同步复制插件,次要用于解决强一致性问题,使得各个节点之间的数据放弃实时同步以及实现多节点同时读写。进步了数据库的可靠性,也能够实现读写拆散,是 MySQL 关系型数据库中大家公认的集群优选计划之一。
- 删除 MariaDB 程序包
yum -y remove mari*
- 凋谢防火墙端口,PXC 集群应用的四个端口
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
- 敞开 SELINUX
vim /etc/selinux/config
把 SELINUX 属性值设置成 disabled,之后保留。
- 重启
reboot
- 下载 PXC 安装包
装置 PXC 外面集成了 Percona Server 数据库,所以不须要装置 Percona Server 数据库。
https://www.percona.com/downl…
https://www.percona.com/downl…
下载 qpress-11-1.el7.x86_64.rpm
https://repo.percona.com/yum/…
最初上传到 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 mysql@bootstrap.service
systemctl stop mysql@bootstrap.service
systemctl restart mysql@bootstrap.service
- 非主节点的治理命令(非第一个启动的 PXC 节点)
service mysql start
service mysql stop
service mysql restart
连贯测试
查看 PXC 集群状态信息,在任意一个节点执行以下命令:
show status like 'wsrep_cluster%';
wsrep_cluster_size 参数是阐明 pxc 集群是几个数据库节点的集群。阐明集群搭建胜利。
测试数据
咱们在 137 节点下创立数据库 test 看看其它两个是否同步过来。
能够看到没有问题:
咱们再创立张表减少一条数据试试:
能够看到也是没有问题的。另外不仅应用哪个节点操作数据也会被同步到其它集群中。