mysql集群搭建 (PXC)

摘要:
可以在任何节点上执行写操作,并且可以在从属服务器上并行应用事件。其他存储引擎的更改不会复制。写入效率取决于节点中最慢的一个,这不能有效解决写入缩放问题。所有写入操作都将在所有节点上发生。每次添加新节点时,都需要将完整的数据库复制并备份到新节点。重复数据的数量与节点的数量一样多。不支持表级锁。querylog日志不能存储在表中。

一、PXC介绍


1.1 关于PXC

PXC(Percona XtraDB Cluster)是MySQL数据库的一种高可用集群策略,与传统的基于主从复制模式的集群架构相比 PXC 最突出特点就是解决了诟病已久的数据复制延迟问题,基本上可以达到实时同步。而且节点与节点之间,他们相互的关系是对等的。PXC 最关注的是数据的一致性,对待事物的行为时,要么在所有节点上执行,要么都不执行,它的实现机制决定了它对待一致性的行为非常严格,这也能非常完美的保证 MySQL 集群的数据一致性。

1.2 PXC的特性和优点

  • 完全兼容MySQL
  • 同步复制,事务要么在所有节点提交或者不提交
  • 多主复制,可以在任意节点进行写操作
  • 在从服务器上并行应用事件,真正意义上的并行复制
  • 节点自动配置,数据一致性,不再是异步复制
  • 故障切换:因为支持多点写入,所以在出现数据库故障时可以很容易的进行故障切换
  • 自动节点克隆:在新增节点或者停机维护时,增量数据或基础数据不需要人工手动备份提供,galera cluster会自动拉去在线节点数据,集群最终会变为一致

1.3 PXC的局限和劣势

  • 复制只支持InnoDB引擎,其他存储引擎的更改不复制
  • 写入效率取决于节点中最慢的一台
  • 不能有效解决写缩放问题,所有的写操作都将发生在所有节点上
  • 每次新增节点都需要复制完整的数据库备份到新节点
  • 有多少个节点就有多少重复的数据
  • 不支持表级锁
  • query log日志不能存在表里面,必须存放在文件
  • 不支持在没有主键的表上DELETE操作,在没有主键的表上select limit也会在不同节点上返回不同的值
  • 由于集群是基于乐观的并发控制(optimistic concurrency control),事务冲突的情况可能会在commit阶段发生,当多个节点修改同时同一行数据,只有其中一个节点能够成功,失败的节点将终止,并且返回死锁
  • 不支持XA事务,因为XA事务有可能在commit的时候出现异常发生rollback
  • 如果DDL语句有问题,很可能会破坏整个集群,需要非常特殊的对待DDL语句

二、PXC5.7安装


官方文档

[Note] 确认服务器的以下端口开放,并且未被其他进程占用,PXC需要使用这些端口来进行节点间沟通。

 - 3306
 - 4444
 - 4567
 - 4568
Ubuntu或基于Debian
如果已经安装了MySQL,apparmor配置文件可能会阻碍PXC节点间沟通
sudo apt-get remove apparmor

添加源
sudo apt-get update
sudo apt-get install -y wget gnupg2 lsb-release curl
wget https://repo.percona.com/apt/percona-release_latest.generic_all.deb
sudo dpkg -i percona-release_latest.generic_all.deb
sudo apt-get update

从apt安装
sudo apt-get install percona-xtradb-cluster-57
CentOS或Red Hat

SELinux安全模块可以约束对PXC集群的数据访问。最好的解决方案是通过运行以下命令将模式从强制改为允许 setenforce 0

  • 从yum安装
    sudo yum install Percona-XtraDB-Cluster-57

三、配置PXC


停止MySQL服务
sudo systemctl stop mysql

  

示例节点
NodeHostIP
Node 1pxc1192.168.227.148
Node 2pxc2192.168.227.149
Node 3pxc3192.168.227.150
配置第一个节点
  • Ubuntu或Debian添加到 /etc/mysql/percona-xtradb-cluster.conf.d/wsrep.cnf

    [mysqld]
    wsrep_provider=/usr/lib/libgalera_smm.so
    wsrep_cluster_name=pxc-cluster # 所有节点保持一致
    
    wsrep_cluster_address=gcomm://192.168.227.148,192.168.227.149,192.168.227.150 # 所有节点IP,所有节点保持一致
    
    wsrep_node_name=pxc1 # 节点名称,唯一 
    wsrep_node_address=192.168.227.148 # 当前节点IP
    
    wsrep_sst_method=xtrabackup-v2  # PXC同步方式
    wsrep_sst_auth=sstuser:iiecas # PXC同步账号
    pxc_strict_mode=ENFORCING
    binlog_format=ROW 
    
    default_storage_engine=InnoDB 
    innodb_autoinc_lock_mode=2
  • CentOS或Red Hat添加到 /etc/percona-xtradb-cluster.conf.d/wsrep.cnf

    [mysqld]
    wsrep_provider=/usr/lib64/galera3/libgalera_smm.so 
    wsrep_cluster_name=pxc-cluster # 所有节点保持一致
    
    wsrep_cluster_address=gcomm://192.168.227.148,192.168.227.149,192.168.227.150 # 所有节点IP,所有节点保持一致
    
    wsrep_node_name=pxc1 # 节点名称,唯一 
    wsrep_node_address=192.168.227.148 # 当前节点IP
    
    wsrep_sst_method=xtrabackup-v2  # PXC同步方式
    wsrep_sst_auth=sstuser:iiecas # PXC同步账号
    pxc_strict_mode=ENFORCING
    binlog_format=ROW 
    
    default_storage_engine=InnoDB 
    innodb_autoinc_lock_mode=2
    

      

配置剩余节点

剩余节点修改以下两项

 wsrep_node_name=pxc2 # 节点名称,唯一
 wsrep_node_address=192.168.227.149 # 当前节点IP
启动第一个节点
Ubuntu或Debian
/etc/init.d/mysql bootstrap-pxc
CentOS或Red Hat systemctl start mysql@bootstrap


创建PXC同步账户 CREATE USER 'sstuser'@'localhost' IDENTIFIED BY 'iiecas'; GRANT RELOAD, LOCK TABLES, PROCESS, REPLICATION CLIENT ON *.* TO 'sstuser'@'localhost'; FLUSH PRIVILEGES;

其他节点

正常启动mysql

service mysql start
查看PXC状态

可在mysql中通过执行以下命令查看PXC状态

mysql>show status like 'wsrep%';
+----------------------------------+--------------------------------------+
| Variable_name                    | Value                                |
+----------------------------------+--------------------------------------+
| wsrep_local_state_uuid           | 75f17970-465a-11eb-bd1e-83dedd47aa3a |
| wsrep_protocol_version           | 9                                    |
| wsrep_last_applied               | 0                                    |
| wsrep_last_committed             | 0                                    |
| 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                   | 2                                    |
| wsrep_received_bytes             | 144                                  |
| 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.000000                             |
| wsrep_local_recv_queue           | 0                                    |
| wsrep_local_recv_queue_max       | 2                                    |
| wsrep_local_recv_queue_min       | 0                                    |
| wsrep_local_recv_queue_avg       | 0.500000                             |
| wsrep_local_cached_downto        | 0                                    |
| wsrep_flow_control_paused_ns     | 0                                    |
| wsrep_flow_control_paused        | 0.000000                             |
| wsrep_flow_control_sent          | 0                                    |
| wsrep_flow_control_recv          | 0                                    |
| wsrep_flow_control_interval      | [ 100, 100 ]                         |
| wsrep_flow_control_interval_low  | 100                                  |
| wsrep_flow_control_interval_high | 100                                  |
| wsrep_flow_control_status        | OFF                                  |
| wsrep_cert_deps_distance         | 0.000000                             |
| wsrep_apply_oooe                 | 0.000000                             |
| wsrep_apply_oool                 | 0.000000                             |
| wsrep_apply_window               | 0.000000                             |
| wsrep_commit_oooe                | 0.000000                             |
| wsrep_commit_oool                | 0.000000                             |
| wsrep_commit_window              | 0.000000                             |
| wsrep_local_state                | 4                                    |
| wsrep_local_state_comment        | Synced                               |
| wsrep_cert_index_size            | 0                                    |
| wsrep_cert_bucket_count          | 22                                   |
| wsrep_gcache_pool_size           | 1320                                 |
| wsrep_causal_reads               | 0                                    |
| wsrep_cert_interval              | 0.000000                             |
| 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.227.148:3306                 |
| wsrep_cluster_weight             | 1                                    |
| 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                 | dc0142e3-465d-11eb-a10b-8a33e043e7a3 |
| wsrep_cluster_conf_id            | 1                                    |
| wsrep_cluster_size               | 1                                    |
| wsrep_cluster_state_uuid         | 75f17970-465a-11eb-bd1e-83dedd47aa3a |
| wsrep_cluster_status             | Primary                              |
| wsrep_connected                  | ON                                   |
| wsrep_local_bf_aborts            | 0                                    |
| wsrep_local_index                | 0                                    |
| wsrep_provider_name              | Galera                               |
| wsrep_provider_vendor            | Codership Oy <info@codership.com>    |
| wsrep_provider_version           | 3.45(ra60e019)                       |
| wsrep_ready                      | ON                                   |
+----------------------------------+--------------------------------------+

  


Note

实际使用中可搭配高可用代理服务和keepalived,若节点间网络连接不稳定可能出现脑裂情况。

免责声明:文章转载自《mysql集群搭建 (PXC)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇【Linux网络基础】 DNS:介绍、作用、解析原理Ubuntu 字体安装下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

原生java api操作ES数据库

原生java api操作ES数据库 该部分也只写了一点点,后面有更简单的做法,就没写完 有需要再继续写吧...........参考一下就好了 @SpringBootTest class JavaEsApplicationTests { @Autowired private RestHighLevelClient restHighLevel...

js数组删除(splice和delete)

最近一直在写js的数组,然后就发现了很奇怪的问题,后来才发现了规律。 删除数据的一行,一般有两种方法,一个是splice,一个是delete; splice:删除了数组后,数组的长度会自动变化。用法:arr.splice(2,1)——2是数组的下标值,1 代表输出一行数据。 delete: 删除了数组后,数组的长度不会变化。 用法:delete arr[2...

Apache Solr 全版本任意读取文件漏洞

一、漏洞背景 Apache Solr 全版本存在任意文件读取漏洞,攻击者可以在未授权的情况下获取目标系统的敏感文件,为什么说是全版本呢因为由于目前官方不予修复该漏洞,所以无安全版本。 二、网络空间搜索: fofa语法如下 app="Apache-Solr" app="Solr" app="Solr" || app="Apache-Solr" 三、漏洞验证...

python--集合-set

1 1 # 集合-set 2 2 # 集合是高中的要给概念 3 3 # 一堆确定的无序的唯一的数据, 集合中的每一个数据成为一个元素 4 4 5 5 # 集合的定义 6 6 s = set() 7 7 print(type(s)) 8 8 print(s) 9 9 10 10 # 此时大括号中一定要有...

python之全局变量的测试

来源:http://andylin02.iteye.com/blog/841604 结论:python的全局变量:int string, list, dic(map) 如果存在global就能够修改它的值。而不管这个global是否是存在于if中,也不管这个if是否能够执行到。   但是,如果没有 Python代码   if bGlobal:     ...

几款主流 NoSql 数据库的对比

最近小组准备启动一个 node 开源项目,从前端亲和力、大数据下的IO性能、可扩展性几点入手挑选了 NoSql 数据库,但具体使用哪一款产品还需要做一次选型。 我们最终把选项范围缩窄在 HBase、Redis、MongoDB、Couchbase、LevelDB 五款较主流的数据库产品中,本文将主要对它们进行分析对比。 鉴于缺乏项目中的实战经验沉淀,本文内容...