本文主要是介绍mysql-PXC实现高可用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
mysql8.0使用PXC实现高可用
1.什么是 PXC
PXC 是一套 MySQL 高可用集群解决方案,与传统的基于主从复制模式的集群架构相比 PXC 最突出特点就是解决了诟病已久的数据复制延迟问题,基本上可以达到实时同步。而且节点与节点之间,他们相互的关系是对等的。PXC 最关注的是数据的一致性,对待事物的行为时,要么在所有节点上执行,要么都不执行,它的实现机制决定了它对待一致性的行为非常严格,这也能非常完美的保证 MySQL 集群的数据一致性;
2.PXC 的特点
- 完全兼容 MySQL。
- 同步复制,事务要么在所有节点提交或不提交。
- 多主复制,可以在任意节点进行写操作。
- 在从服务器上并行应用事件,真正意义上的并行复制。
- 节点自动配置,数据一致性,不再是异步复制。
- 故障切换:因为支持多点写入,所以在出现数据库故障时可以很容易的进行故障切换。
- 自动节点克隆:在新增节点或停机维护时,增量数据或基础数据不需要人工手动备份提供,galera cluster 会自动拉取在线节点数据,集群最终会变为一致。
3.PXC 的优缺点
优点:
- 服务高可用。
- 数据同步复制(并发复制),几乎无延迟。
- 多个可同时读写节点,可实现写扩展,不过最好事先进行分库分表,让各个节点分别写不同的表或者库,避免让 galera 解决数据冲突。
- 新节点可以自动部署,部署操作简单。
- 数据严格一致性,尤其适合电商类应用。
- 完全兼容 MySQL。
缺点:
- 复制只支持InnoDB 引擎,其他存储引擎的更改不复制。
- 写入效率取决于节点中最弱的一台,因为 PXC 集群采用的是强一致性原则,一个更改操作在所有节点都成功才算执行成功。
- 所有表都要有主键。
- 不支持 LOCK TABLE 等显式锁操作
- 锁冲突、死锁问题相对更多。
PXC 集群节点越多,数据同步的速度就越慢。
4.PXC 与 Replication 的区别
Replication | PXC |
---|---|
数据同步是单向的,master 负责写,然后异步复制给 slave;如果 slave 写入数据,不会复制给 master | 数据同步时双向的,任何一个 mysql 节点写入数据,都会同步到集群中其它的节点 |
异步复制,从和主无法保证数据的一致性 | 同步复制,事务在所有集群节点要么同时提交,要么同时不提交 |
5.PXC 常用端口
- 3306:数据库对外服务的端口号。
- 4444:请求 SST 的端口。
- 4567:组成员之间进行沟通的一个端口号。
- 4568:用于传输 IST。
- SST(State Snapshot Transfer): 全量传输
- **IST(Incremental state Transfer)??*增量传输
6.搭建 PXC 集群
Percona XtraDB Cluster (简称 PXC)集群是基于 Galera 2.x library,事务型应用下的通用的多主同步复制插件,主要用于解决强一致性问题,使得各个节点之间的数据保持实时同步以及实现多节点同时读写。提高了数据库的可靠性,也可以实现读写分离,是 MySQL 关系型数据库中大家公认的集群优选方案之一。
准备好下面三台服务器,本文搭建PXC集群基于CentOS7.x:
IP | 端口 | 角色 |
---|---|---|
192.168.150.11 | 3306 | pxc |
192.168.150.12 | 3306 | pxc2 |
192.168.150.13 | 3306 | pxc3 |
配置hosts解析
# cat >> /etc/hosts << EOF
192.168.150.11 pxc1
192.168.150.12 pxc2
192.168.150.13 pxc3
EOF
- 删除 MariaDB 程序包
# yum -y remove mari*
- 下载 PXC 安装包
安装 PXC 里面集成了 Percona Server 数据库,所以不需要安装 Percona Server 数据库。
Software Downloads - Percona
下载 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 服务器中。
[root@pxc1 ~]# ll *.rpm
-rw-rw-r-- 1 root root 28360 Oct 19 20:21 percona-xtradb-cluster-8.0.34-26.1.el7.x86_64.rpm
-rw-rw-r-- 1 root root 15169548 Oct 19 20:21 percona-xtradb-cluster-client-8.0.34-26.1.el7.x86_64.rpm
-rw-rw-r-- 1 root root 509619476 Oct 19 20:21 percona-xtradb-cluster-debuginfo-8.0.34-26.1.el7.x86_64.rpm
-rw-rw-r-- 1 root root 1912512 Oct 19 20:21 percona-xtradb-cluster-devel-8.0.34-26.1.el7.x86_64.rpm
-rw-rw-r-- 1 root root 27840 Oct 19 20:21 percona-xtradb-cluster-full-8.0.34-26.1.el7.x86_64.rpm
-rw-rw-r-- 1 root root 754084 Oct 19 20:21 percona-xtradb-cluster-garbd-8.0.34-26.1.el7.x86_64.rpm
-rw-rw-r-- 1 root root 2292512 Oct 19 20:21 percona-xtradb-cluster-icu-data-files-8.0.34-26.1.el7.x86_64.rpm
-rw-rw-r-- 1 root root 5243092 Oct 19 20:21 percona-xtradb-cluster-mysql-router-8.0.34-26.1.el7.x86_64.rpm
-rw-rw-r-- 1 root root 151051960 Oct 19 20:21 percona-xtradb-cluster-server-8.0.34-26.1.el7.x86_64.rpm
-rw-rw-r-- 1 root root 1535736 Oct 19 20:21 percona-xtradb-cluster-shared-8.0.34-26.1.el7.x86_64.rpm
-rw-rw-r-- 1 root root 1179040 Oct 19 20:21 percona-xtradb-cluster-shared-compat-8.0.34-26.1.el7.x86_64.rpm
-rw-rw-r-- 1 root root 399166472 Oct 19 20:21 percona-xtradb-cluster-test-8.0.34-26.1.el7.x86_64.rpm
-rw-r--r-- 1 root root 32624 Dec 6 14:50 qpress-11-1.el7.x86_64.rpm
执行下面命令进行安装
# yum localinstall *.rpm -y
之后还是对 Percona Server 数据库的初始化:
- 初始化数据库
应为使用的是8.0版本,部分配置需要在初始化数据库前进行配置,如忽略表名大小写等
[root@pxc1 ~]# vim /etc/my.cnf
...
[mysqld]
server-id=11 #每台mysql的id不能相同
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
# Binary log expiration period is 604800 seconds, which equals 7 days
binlog_expire_logs_seconds=604800 #二进制日志过期时间为604800秒,等于7天注意:pxc2和pxc3只需要server-id设置为12和13即可。
然后我们启动 mysql,修改密码。
# systemctl start mysqld
# tmp_pass=$(awk '/temporary password/ {print $NF}' /var/log/mysqld.log)
# mysql -uroot -p${tmp_pass}
mysql> alter user root@localhost identified by '123456';
Query OK, 0 rows affected (0.01 sec)# 授权用户
# mysql -uroot -p123456
mysql> CREATE USER 'admin'@'%' IDENTIFIED WITH mysql_native_password BY 'Abc_123456';
Query OK, 0 rows affected (0.00 sec)mysql> GRANT all privileges ON *.* TO 'admin'@'%';
Query OK, 0 rows affected (0.00 sec)
- 创建集群
# 停止所有节点的mysqld服务
# systemctl stop mysqld[root@pxc1 ~]# vim /etc/my.cnf
...
######## wsrep ###############
# Path to Galera library
wsrep_provider=/usr/lib64/galera4/libgalera_smm.so# Cluster connection URL contains IPs of nodes
#If no IP is found, this implies that a new cluster needs to be created,
#in order to do that you need to bootstrap this node
wsrep_cluster_address=gcomm://192.168.150.11,192.168.150.12,192.168.150.13 # PXC集群的所有ip# In order for Galera to work correctly binlog format should be ROW
binlog_format=ROW# Slave thread to use
wsrep_slave_threads=8wsrep_log_conflicts# This changes how InnoDB autoincrement locks are managed and is a requirement for Galera
innodb_autoinc_lock_mode=2 # 主键自增长不锁表# Node IP address
wsrep_node_address=192.168.150.11 # 当前节点的IP
# Cluster name
wsrep_cluster_name=pxc-cluster # PXC集群的名称#If wsrep_node_name is not specified, then system hostname will be used
wsrep_node_name=pxc1 # 当前节点的名称#pxc_strict_mode allowed values: DISABLED,PERMISSIVE,ENFORCING,MASTER
pxc_strict_mode=ENFORCING# SST method
wsrep_sst_method=xtrabackup-v2 # 同步方法注意:pxc2和pxc3参照,修改集群节点ip和名称 wsrep_node_name,wsrep_node_address
将引导服务mysql目录下的*.pem拷贝给其他服务器
[root@pxc1 ~]# scp /var/lib/mysql/*.pem pxc2:/var/lib/mysql/
[root@pxc1 ~]# scp /var/lib/mysql/*.pem pxc3:/var/lib/mysql/
第一个节点需要以引导模式启动:
[root@pxc1 ~]# systemctl start mysql@bootstrap.service
接着在第二和第三个节点上正常启动数据库服务,命令如下:
[root@pxc2 ~]# chown -R mysql.mysql /var/lib/mysql/
[root@pxc2 ~]# systemctl start mysqld
[root@pxc3 ~]# chown -R mysql.mysql /var/lib/mysql/
[root@pxc3 ~]# systemctl start mysqld
查询集群信息
mysql> show status like 'wsrep%';
+----------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------+
| Variable_name | Value |
+----------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------+
| wsrep_local_state_uuid | 47f68dce-940c-11ee-85d5-c29e7cbcc6e4 |
| wsrep_protocol_version | 10 |
| wsrep_last_applied | 5 |
| wsrep_last_committed | 5 |
| wsrep_monitor_status (L/A/C) | [ (5, 5), (5, 5), (5, 5) ] |
| wsrep_replicated | 0 |
| wsrep_replicated_bytes | 0 |
| wsrep_repl_keys | 0 |
| wsrep_repl_keys_bytes | 0 |
| wsrep_repl_data_bytes | 0 |
| wsrep_repl_other_bytes | 0 |
| wsrep_received | 4 |
| wsrep_received_bytes | 504 |
| wsrep_local_commits | 0 |
| wsrep_local_cert_failures | 0 |
| wsrep_local_replays | 0 |
| wsrep_local_send_queue | 0 |
| wsrep_local_send_queue_max | 1 |
| wsrep_local_send_queue_min | 0 |
| wsrep_local_send_queue_avg | 0 |
| wsrep_local_recv_queue | 0 |
| wsrep_local_recv_queue_max | 1 |
| wsrep_local_recv_queue_min | 0 |
| wsrep_local_recv_queue_avg | 0 |
| wsrep_local_cached_downto | 4 |
| wsrep_flow_control_paused_ns | 0 |
| wsrep_flow_control_paused | 0 |
| wsrep_flow_control_sent | 0 |
| wsrep_flow_control_recv | 0 |
| wsrep_flow_control_active | false |
| wsrep_flow_control_requested | false |
| wsrep_flow_control_interval | [ 173, 173 ] |
| wsrep_flow_control_interval_low | 173 |
| wsrep_flow_control_interval_high | 173 |
| wsrep_flow_control_status | OFF |
| wsrep_cert_deps_distance | 0 |
| wsrep_apply_oooe | 0 |
| wsrep_apply_oool | 0 |
| wsrep_apply_window | 0 |
| wsrep_apply_waits | 0 |
| wsrep_commit_oooe | 0 |
| wsrep_commit_oool | 0 |
| wsrep_commit_window | 0 |
| wsrep_local_state | 4 |
| wsrep_local_state_comment | Synced |
| wsrep_cert_index_size | 0 |
| wsrep_cert_bucket_count | 1 |
| wsrep_gcache_pool_size | 3448 |
| wsrep_causal_reads | 0 |
| wsrep_cert_interval | 0 |
| wsrep_open_transactions | 0 |
| wsrep_open_connections | 0 |
| wsrep_ist_receive_status | |
| wsrep_ist_receive_seqno_start | 0 |
| wsrep_ist_receive_seqno_current | 0 |
| wsrep_ist_receive_seqno_end | 0 |
| wsrep_incoming_addresses | 192.168.150.13:3306,192.168.150.11:3306,192.168.150.12:3306 |
| wsrep_cluster_weight | 3 |
| wsrep_desync_count | 0 |
| wsrep_evs_delayed | |
| wsrep_evs_evict_list | |
| wsrep_evs_repl_latency | 0/0/0/0/0 |
| wsrep_evs_state | OPERATIONAL |
| wsrep_gcomm_uuid | df5aed67-940d-11ee-bc8f-8e8bab9eea9d |
| wsrep_gmcast_segment | 0 |
| wsrep_cluster_capabilities | |
| wsrep_cluster_conf_id | 3 |
| wsrep_cluster_size | 3 |
| wsrep_cluster_state_uuid | 47f68dce-940c-11ee-85d5-c29e7cbcc6e4 |
| wsrep_cluster_status | Primary |
| wsrep_connected | ON |
| wsrep_local_bf_aborts | 0 |
| wsrep_local_index | 2 |
| wsrep_provider_capabilities | :MULTI_MASTER:CERTIFICATION:PARALLEL_APPLYING:TRX_REPLAY:ISOLATION:PAUSE:CAUSAL_READS:INCREMENTAL_WRITESET:UNORDERED:PREORDERED:STREAMING:NBO: |
| wsrep_provider_name | Galera |
| wsrep_provider_vendor | Codership Oy <info@codership.com> (modified by Percona <https://percona.com/>) |
| wsrep_provider_version | 4.16(841837f) |
| wsrep_ready | ON |
| wsrep_thread_count | 9 |
+----------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------+
79 rows in set (0.00 sec)
查看 PXC 集群状态信息,在任意一个节点执行以下命令:
[root@pxc1 ~]# mysql -uroot -p123456 -e "show status like 'wsrep_cluster%';"
mysql: [Warning] Using a password on the command line interface can be insecure.
+----------------------------+--------------------------------------+
| Variable_name | Value |
+----------------------------+--------------------------------------+
| wsrep_cluster_weight | 3 |
| wsrep_cluster_capabilities | |
| wsrep_cluster_conf_id | 3 |
| wsrep_cluster_size | 3 |
| wsrep_cluster_state_uuid | 47f68dce-940c-11ee-85d5-c29e7cbcc6e4 |
| wsrep_cluster_status | Primary |
+----------------------------+--------------------------------------+
- 节点下线
PXC 集群允许动态下线节点,但需要注意的是节点的启动命令和关闭命令必须一致,如以引导模式启动的第一个节点必须
以引导模式来进行关闭:
# systemctl stop mysql@bootstrap.service
其他节点则可以按照正常方式关闭:
# systemctl stop mysqld
这篇关于mysql-PXC实现高可用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!