PXC

  • 简介
  • 部署PXC
    • 引导第一个节点初始化集群
    • 将其他节点添加到集群
    • 验证复制

简介

PXC (Percona XtraDB Cluster)是一个开源的MySQL高可用解决方案。它将Percona Server和XtraBackup与Galera库集成,以实现同步多主复制。基于Galera的高可用方案主要有MariaDB Galera Cluster和Percona XtraDB Cluster,目前PXC架构在生产线上用的更多而且更成熟一些。PXC相比那些传统的基于主从模式的集群架构MHA和双主,Galera Cluster最突出的特点就是解决了诟病已久的复制延迟问题,基本上可以达到实时同步。而且节点与节点之间,它们互相的关系是对等的。本身Galera Cluster也是一种多主架构。PXC是在存储引擎层实现的同步复制,而非异步复制,所以其数据的一致性是相当高的。


要搭建PXC架构至少需要三个MySQL实例来组成一个集群,三个实例之间不是主从模式,而是各自为主,所以三者是对等关系,不分从属,这也叫multi-master架构。客户端读写时,连接哪个实例都是一样的,读取到的数据是相同的,写入任意一个实例后,集群会将自己新写入的数据同步到其它实例上,这种架构不共享任何数据,是—种高元余的集群架构。

PXC的优缺点
优点:
实现了MySQL集群的高可用性和数据的强一致性。
完成了真正的多节点读写的集群方案。
改善了主从复制延迟问题,基本上达到了实时同步。
新加入的节点可以自动部署,无需提前手动备份,维护方便。
由于是多节点写入,所以DB故障切换很容易。

缺点:
加入新节点时开销大。添加新节点时,必须从现有节点之一复制完整数据集。如果是100GB,则复制
100GB。
任何更新的事务都需要全局验证通过,才会在其它节点上执行,。集群性能受限于性能最差的节点,也就说常说的木桶定律。
因为需要保证数据的一致性,PXC采用的实时基于存储引擎层来实现同步复制,所以在多节点并发写入时,锁冲突问题比较严重。
存在写扩大的问题。所以节点上都会发生写操作,对于写负载过大的场景,不推荐使用PXC。
只支持InnoDB存储引擎

PXC的原理

PXC的操作流程大体是这样的,首先客户端向请求连接的写入节点提交事务之前,由该节点将需要产生的relication writeset广播出去,然后获取全局事务ID,一并传送到其它的节点上去。其它节点通过certification合并数据之后,发现没有冲突数据,便执行apply_cb和commit_cb操作,否则就discard此次事务。而当前节点(客户端请求的写入节点)通过验证之后,执行commit_cb操作,并返回OK给客户端。如果验证没有通过,则rollback_Cb。

在生产线上的PXC集群中,至少要有三台节点。如果其中一个节点没有验证通过,出现了数据冲突,那么此时采取的方式就是将出现数据不一致的节点踢出集群,而且它会自动执行shutdown命令来自动关机。

PXC的重要概念
首先要规范集群中节点的数星,整个集群节点数控制在最少3个、最多8个的范围内。最少3个是为了防止脑裂现象,因为只有在两个节点的情况下才会出现脑裂。脑裂的表现就是输出任何命令,返回结果都是unkown command。
当一个新节点要加入PXC集群的时候,需要从集群中各节点里选举出一个doner节点作为全量数据的贡献者。
PXC有两种节点的数据传输方式,
一种叫SST全量传输,
一种叫ST增量传输。SST传输有XtraBackup.

mysqldump、rsync三种方式,而增量传输只有XtraBackup。一般数据量不大的时候可以使用SST作为全量传输,但也只使用XtraBackup方式。节点在集群中,会因新节点的加入或故障,同步失效等而发生状态的切换,
下面列举出这些状态的含义:
open:节点启动成功,尝试连接到集群
primary:节点已在集群中,在新节点加入集群时,选取donor进行数据同步时会产生式的状态。
joiner:节点处于等待接收同步数据文件的状态。
joined:节点已完成了数据同步,尝试保持和集群中其它节点进度—致。
synced:节点正常提供服务的状态,表示已经同步完成并和集群进度保持一致。
doner:节点处于为新加入节点提供全量数据时的状态。

PXC中的重要配置参数
搭建PXC过程中,需要在my.cnf中设置以下参数:

wsrep_cluster_name:指定集群的逻辑名称,对于集群中的所有节点,集群名称必须相同。
wsrep_cluster_address:指定集群中各节点的地址
wsrep_node_name:指定当前节点在集群中的逻辑名称
wsrep_node_address:指定当前节点的IP地址
wsrep_provider:指定Galera车的路径
wsrep_sst_method;模式情况下,PXC使用XtraBackup进行SST传输。强烈建议该参数指xtrabackup-v2
wsrep_sst_auth:指定认证凭证SST作为<sst_user> <sst_pwd>。必须在引导第一个节点后创建此用户并赋予必要的权限。
pxc_strict_mode:严格模式,官方建议该参数值为ENFORCING。

在PXC中还有一个特别重要的模块就是Gcache。它的核心功能就是每个节点缓存当前最新的写集。如果有新节点加入集群,就可以把新数据等待增量传递给新节点,而不需要再使用SST方式了。这样可以让节点更快地加入集群中。

GCache模块涉及了如下参数:
gcache.size代表用来缓存写集增量信息的大小。它的默认大小是128MB,通过wsrep_provider_options变量参数设置。建议调整为2G-4G范围,足够的空间便于缓存更多的增量信息。
gcache.mem_size代表Gcache中内存缓存的大小,适度调大可以提高整个集群的性能。
gcache.page_size可以理解为如果内存不够用(Gcache不足),就直接将写集写入到磁盘文件中。

PXC集群的状态监控
在集群搭建好之后,可以通过如下状态变量"%wsrep%'来查看集群中各节点的状态,
下面例举出几个重要的参数,便于发现问题。
wsrep_local_state_uid:集群中所有节点的该状态值应该是相同的,如果有不同值的节点,说明其没有加入集群。
wsrep_last_committed:最后提交的事务数目。
wsrep_cluster_size:当前集群中的节点数量。
wsrep_cluster_status:集群组成的状态。如果不是"Primary",说明出现脑裂现象。
wsrep_local_state:当前节点状态,值为4表示正常。该状态有四个值:
joining:表示节点正在加入集群
**doner:**节点处于为新加入节点提供全量数据时的状态。
joined:当前节点已成功加入集群。
synced:当前节点与集群中各节点是同步状态。
wsrep_ready:为ON表示当前节点可以正常提供服务。为OFF,则该节点可能发生脑裂或网络问题导致。

部署PXC

环境规划:
192.168.1.23 node1
192.168.1.24 node2
192.168.1.25 node3

安装PXC
下载依赖

[root@node2 ~]# yum -y install libev lsof perl-Compress-Raw-Bzip2 perl-Compress-Raw-Zlib perl-DBI perl-Digest perl-Digest-MD5 perl-IO-Compress perl-Net-Daemon perl-DBD-MySQL perl-PlRPC qpress socat openssl openssl-devel gcc gcc-c++ rsync

注意:这里有个依赖可能下载不下载,就得自己找了qpress

安装Xtrbackup

[root@node1 ~]# cd /usr/local/src/
[root@node1 src]# ls
percona-xtrabackup-24-2.4.18-1.el7.x86_64.rpm
Percona-XtraDB-Cluster-5.7.28-rel31-31.41.1.Linux.x86_64.ssl101.tar.gz
qpress-11-linux-x64.tar[root@node1 src]# tar xf qpress-11-linux-x64.tar
[root@node1 src]# rpm -ivh percona-xtrabackup-24-2.4.18-1.el7.x86_64.rpm

卸载MariaDB

[root@node1 src]# rpm -e mariadb-libs --nodeps

常见MYSQL的组和用户

[root@node1 src]# groupadd -r mysql
[root@node1 src]# useradd -M -s /bin/false -r -g mysql mysql

解压软件包到/usr/local/mysql,并创建数据目录,赋予权限

[root@node1 src]# tar -zxf Percona-XtraDB-Cluster-5.7.28-rel31-31.41.1.Linux.x86_64.ssl101.tar.gz
[root@node1 src]# mv Percona-XtraDB-Cluster-5.7.28-rel31-31.41.1.Linux.x86_64.ssl101 /usr/local/mysql/
[root@node1 ~]# mkdir /usr/local/mysql/data
[root@node1 ~]# chown -R mysql.mysql /usr/local/mysql/ /usr/local/mysql/data

配置环境变量

[root@node1 ~]# vim /etc/profile
export PATH=/usr/local/mysql/bin:$PATH

准备配置文件,binlog格式必须为row,node2和node3上的配置文件相同,但是注意需要更改server_id、wsrep_node_name、wsrep_node_address

[root@node1 ~]# vim /etc/my.cnf
[client]
port = 3306
socket = /tmp/mysql.sock
[mysql]
prompt="\u@\h \R:\m:\s[\d]> "
no-auto-rehash
[mysqld]
user = mysql
port = 3306
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
socket = /tmp/mysql.sock
pid-file = db.pid
character-set-server = utf8mb4
skip_name_resolve = 1
open_files_limit = 65535
back_log = 1024
max_connections = 512
max_connect_errors = 1000000
table_open_cache = 1024
table_definition_cache = 1024
table_open_cache_instances = 64
thread_stack = 512K
external-locking = FALSE
max_allowed_packet = 32M
sort_buffer_size = 4M
join_buffer_size = 4M
thread_cache_size = 768
#query_cache_size = 0
#query_cache_type = 0
interactive_timeout = 600
wait_timeout = 600
tmp_table_size = 32M
max_heap_table_size = 32M
slow_query_log = 1
slow_query_log_file = /usr/local/mysql/data/slow.log
log-error = /usr/local/mysql/data/error.log
long_query_time = 0.1
server-id = 1813306
log-bin = /usr/local/mysql/data/mysql-bin
sync_binlog = 1
binlog_cache_size = 4M
max_binlog_cache_size = 1G
max_binlog_size = 1G
expire_logs_days = 7
master_info_repository = TABLE
relay_log_info_repository = TABLE
gtid_mode = on
enforce_gtid_consistency = 1
log_slave_updates
binlog_format = row
relay_log_recovery = 1
relay-log-purge = 1
key_buffer_size = 32M
read_buffer_size = 8M
read_rnd_buffer_size = 4M
bulk_insert_buffer_size = 64M
lock_wait_timeout = 3600
explicit_defaults_for_timestamp = 1
innodb_thread_concurrency = 0
innodb_sync_spin_loops = 100
innodb_spin_wait_delay = 30
transaction_isolation = REPEATABLE-READ
innodb_buffer_pool_size = 1024M
innodb_buffer_pool_instances = 8
innodb_buffer_pool_load_at_startup = 1
innodb_buffer_pool_dump_at_shutdown = 1
innodb_data_file_path = ibdata1:1G:autoextend
innodb_flush_log_at_trx_commit = 1
innodb_log_buffer_size = 32M
innodb_log_file_size = 2G
innodb_log_files_in_group = 2
#innodb_max_undo_log_size = 4G
innodb_io_capacity = 2000
innodb_io_capacity_max = 4000
innodb_flush_neighbors = 0
innodb_write_io_threads = 4
innodb_read_io_threads = 4
innodb_purge_threads = 4
innodb_page_cleaners = 4
innodb_open_files = 65535
innodb_max_dirty_pages_pct = 50
innodb_flush_method = O_DIRECT
innodb_lru_scan_depth = 4000
innodb_checksum_algorithm = crc32
#innodb_file_format = Barracuda
#innodb_file_format_max = Barracuda
innodb_lock_wait_timeout = 10
innodb_rollback_on_timeout = 1
innodb_print_all_deadlocks = 1
innodb_file_per_table = 1
innodb_online_alter_log_max_size = 4G
internal_tmp_disk_storage_engine = InnoDB
innodb_stats_on_metadata = 0
# PXC
wsrep_provider=/usr/local/mysql/lib/libgalera_smm.so
wsrep_provider_options="gcache.size=1G"
wsrep_cluster_name=pxc-test
wsrep_cluster_address=gcomm://192.168.1.23,192.168.1.24,192.168.1.25
wsrep_node_name=node1
wsrep_node_address=192.168.1.23
wsrep_sst_method=xtrabackup-v2
wsrep_sst_auth=sst:pwd@123
pxc_strict_mode=ENFORCING
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
[mysqldump]
quick
max_allowed_packet = 32M

软链接

[root@node1 ~]# ln -s /usr/local/mysql/bin/* /usr/local/bin/

个检点完成MYSQL初始化

[root@node1 ~]# mysqld --defaults-file=/etc/my.cnf --user=mysql --basedir=/usr/local/mysql/ --datadir=/usr/local/mysql/data --initialize

引导第一个节点初始化集群

在node1上启动MYSQL

[root@node1 ~]# mysqld --defaults-file=/etc/my.cnf --wsrep_new_cluster &
[1] 8092
[root@node1 ~]# ss -antulp | grep mysql
tcp    LISTEN     0      128       *:4567                  *:*                   users:(("mysqld",pid=8092,fd=11))
tcp    LISTEN     0      128      :::3306                 :::*                   users:(("mysqld",pid=8092,fd=38))
[root@node1 ~]# ps -el | grep mysql
4 S   998   8092   7359 28  80   0 - 922710 poll_s pts/0   00:00:20 mysqld

在错误日志中获取临时密码,登录MYSQL终端,第一次登陆需要修改root密码

[root@node1 ~]# grep 'temporary password' /usr/local/mysql/data/error.log[root@node1 ~]# mysql -uroot -p
Enter password:root@localhost 22:44: [(none)]> alter user root@localhost identified by 'pwd@123';

常见PXC中的SST传输账号

root@localhost 22:45: [(none)]> grant all privileges on *.* to 'sst'@'localhost' identified by 'pwd@123';

将其他节点添加到集群

node2和node3已将node1的数据同步到本地,因此,直接使用在node1上的设置的MYSQL root密码。即能直接登陆到MYSQL终端

[root@node2 ~]# mysqld --defaults-file=/etc/my.cnf &
[1] 20560

此刻node2和node3正在从node1往本地同步数据

[root@node2 ~]# ss -antulp | grep mysql
tcp    LISTEN     0      128       *:4567                  *:*                   users:(("mysqld",pid=20560,fd=11))
[root@node2 ~]# ps aux | grep mysql
mysql     20560  2.0  9.5 1734592 177360 pts/0  Sl   22:47   0:01 mysqld --defaults-file=/etc/my.cnf
mysql     20568  0.4  0.1 113788  2164 pts/0    S    22:47   0:00 /bin/bash -ue /usr/local/mysql/bin/wsrep_sst_xtrabackup-v2 --role joiner --address 192.168.1.24 --datadir /usr/local/mysql/data/ --defaults-file /etc/my.cnf --defaults-group-suffix  --parent 20560 --mysqld-version 5.7.28-31-31.41 --binlog /usr/local/mysql/data/mysql-bin
mysql     21136 14.7  6.5 2152528 121544 pts/0  Rl   22:48   0:02 xtrabackup --use-memory=1024M --prepare --binlog-info=ON --target-dir=/usr/local/mysql/data//.sst
root      21174  0.0  0.0 112812   976 pts/0    R+   22:48   0:00 grep --color=auto mysql

mysqld开始监听3306

[root@node2 ~]# ss -antulp | grep mysql
tcp    LISTEN     0      128       *:4567                  *:*                   users:(("mysqld",pid=20560,fd=11))
tcp    LISTEN     0      128      :::3306                 :::*                   users:(("mysqld",pid=20560,fd=43))[root@node3 ~]# ss -antulp | grep mysql
tcp    LISTEN     0      128       *:4567                  *:*                   users:(("mysqld",pid=20562,fd=11))
tcp    LISTEN     0      128      :::3306                 :::*                   users:(("mysqld",pid=20562,fd=33))

node2和node3已将node1的数据同步到本地,因此,直接使用在node1上设置的MYSQL root密码,即能登陆到MYSQL终端

[root@node2 ~]# mysql -uroot -ppwd@123
[root@node3 ~]# mysql -uroot -ppwd@123

查看集群状态,可以看到,当前集群有三台节点

root@localhost 22:57: [(none)]> show global status like '%wsrep_cluster_s%';
+--------------------------+--------------------------------------+
| Variable_name            | Value                                |
+--------------------------+--------------------------------------+
| wsrep_cluster_size       | 3                                    |
| wsrep_cluster_state_uuid | af100aee-84d2-11eb-ac51-12fc50884a0e |
| wsrep_cluster_status     | Primary                              |
+--------------------------+--------------------------------------+
3 rows in set (0.00 sec)root@localhost 22:59: [(none)]> show global status like '%wsrep_ready%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wsrep_ready   | ON    |
+---------------+-------+
1 row in set (0.00 sec)

验证复制

在任意节点创建仓库,往表中插入一些数据,在另外两个节点上查看数据是否同步。

node1创建
root@localhost 23:01: [(none)]> create database test;
root@localhost 23:01: [(none)]> use test;
root@localhost 23:01: [test]> create table ts(id int primary key auto_increment,name varchar(20));
node2插入
root@localhost 22:59: [(none)]> use test;
Database changed
root@localhost 23:03: [test]> insert into ts(name) values('tangsan'),('daimubai');
node3查看
root@localhost 22:57: [(none)]> use test;
Database changed
root@localhost 23:05: [test]> select * from ts;
+----+----------+
| id | name     |
+----+----------+
|  1 | tangsan  |
|  4 | daimubai |
+----+----------+

MYSQL高可用之PXC相关推荐

  1. MySQL——MySQL高可用之PXC

    PXC简介 参考 Percona 官方 https://www.percona.com/ PXC(Percona XtraDB Cluster)是一个开源的MySQL高可用解决方案.它将Percona ...

  2. 带你玩转Mysql高可用方案--PXC

    目录 理论篇 基于Galere协议的高可用方案:pxc PXC介绍 PXC特性 PXC优缺点 PXC原理描述 PXC的架构示意图 数据读写示意图 下面看传统复制流程 异步复制 半同步 超过10秒的阀值 ...

  3. MySQL高可用之PXC搭建及使用

    文章目录 一.安装Percona数据库 1. 离线安装Percona 2. 在线安装Percona 3. 开放防火墙端口 4. 修改MySQL配置文件 5. 禁止开机启动MySQL 6. 初始化MyS ...

  4. MySQL高可用方案之PXC架构

    如何搭建并使用数据强一致性的MySQL集群? MySQL数据库集群之PXC方案-PXC简介 通常大家熟知的mysql集群采用的是Replication方案,Replication采用的是节点之间异步传 ...

  5. MySQL高可用方案-PXC(Percona XtraDB Cluster)环境部署详解

    MySQL高可用方案-PXC(Percona XtraDB Cluster)环境部署详解 Percona XtraDB Cluster简称PXC.Percona Xtradb Cluster的实现是在 ...

  6. mysql bootstrap pxc_Mysql高可用之PXC

    一.PXC简介 Percona XtraDB Cluster简称PXC.是一套开源mysql高可用解决方案(XtraDb是mysql被oracle收购之前 开源一个分支 其他分支还有mariadb), ...

  7. mysql集群 clu_MySQL高可用之PXC简介

    PXC简介: galera产品是以galera cluster方式为MySQL提高高可用集群解决方案的.galera cluster就是集成了galera插件的mysql集群.galera repli ...

  8. MySQL高可用方案-PXC环境部署记录

    之前梳理了Mysql+Keepalived双主热备高可用操作记录,对于mysql高可用方案,经常用到的的主要有下面三种: 一.基于主从复制的高可用方案:双节点主从 + keepalived 一般来说, ...

  9. mysql高可用集群MHA,PXC

    MHA+MYSQL主从同步结构 MHA由日本dena公司youshimaton开发 是一套优秀的实现mysql高可用的解决方案 数据库的自动故障切换操作能做到在0-30秒内完成 MHA能确保在故障切换 ...

最新文章

  1. SharePoint 2010自定义母版页小技巧——JavaScript和CSS引用
  2. Http 面试知识点
  3. 用memcached实现session共享
  4. 数据库编程——JDBC 配置
  5. ofstream的使用方法--超级精细。C++文件写入、读出函数(转)
  6. 过去一年,被我们“高估”的技术清单
  7. 201521145048 《Java程序设计》第3周学习总结
  8. c语言野王验证,王者荣耀:“野王是如何炼成的?”,方法很简单,6个字而已...
  9. python自定义函数的参数调用_python | 自定义函数
  10. QCC3020开发问题汇总(更新中。。。)
  11. 《嵌入式 - 语音识别TWen-ASR-ONE开发笔记》第4章 TWen-ASR-ONE PWM调光
  12. no interpreter
  13. Rails项目中jRuby与Scala的交互
  14. 【Flocking算法】海王的鱼塘是怎样炼成的
  15. 将vue-admin-template组件默认英文语言改成中文
  16. java8新特性(拉姆达表达式lambda)
  17. 基于Linux系统搭建智能DNS
  18. correl函数相关系数大小意义_用Correl函数返回相关系数,以确定属性关系 Excel用Correl函数返回相关系数以确...
  19. C语言基础之输出m到n之间的素数
  20. PySide2 使用

热门文章

  1. EMQ-保留消息 概述和案例
  2. 路由器装linux系统,linux路由器Quagga的配置(一):安装
  3. 自动驾驶感知——环境感知的基本概念
  4. HTML+CSS大作业: 抗击疫情网页制作作业_疫情防控网页设计模板HTML_ 简单学生网页设_静态HTML+CSS网站制作成品...
  5. java循环练习题及答案_循环练习题及答案
  6. 常见网络安全设备弱口令(默认口令)
  7. 【立体匹配之一】StereoBM
  8. mac连接手机 vm_苹果 Mac 上的虚拟机怎么联接 iPhone
  9. 厦门理工学院OJ题解(1139:秦心的面具)
  10. Testlink解决大用例导入问题