PXC为MySQL提供了开源的高可用解决方案。
它集成了percona Server、Percona XtraBackup、和Galera Library。
其中核心部分为Galera Library,它保证了多主的同步复制。
Galera简介
Galera也使用GTID技术,但是和MySQL的GTID有所不同。
Galera使用group communication channel来确保所有nodes上以相同的顺序读取消息(事务)。
优缺点
优点
- 当执行查询时,直接在本地node执行,无需从远程获取。(这是对比oracle RAC ?)
- 非中心化。任何时间都可以允许丢失任何node,整个集群不会丢失数据,也不会有停机时间
- 可以作为读操作的负载均衡方案。
缺点
- 新增node时工作量较大。需要完全复制现有的数据集。数据冗余度高,有几个node就有多少份冗余。
- 对于写操作,没有很好的负载均衡的效果。
- 处理高并行、小请求的场景并不是很好 (https://www.slideshare.net/marcotusa/galera-explained-3)
- 对外键支持不佳
- 不能用于数据分片
使用限制
- 复制只支持InnoDB引擎。
包括mysql.*在内的其他存储引擎的表不会被复制。 但是DDL语句是语句级别复制的,所以mysql.*的某些表会通过这种方式进行复制。
可以配置wsrep_replicate_myisam来支持实验性的MyISAM复制。 - 不支持的语句
多主情况下,LOCK TABLES和UNLOCK tables不被支持。
需要加锁的函数不被支持,如get_lock()、release_lock()等。 - 查询日志不能指定到表,必须指定到文件。 log_output = FILE。 配合使用general_log和general_log_file进行配置。
- 最大允许的事务量由wsrep_max_ws_rows、wsrep_max_ws_size参数指定。
LOAD DATA INFILE每10000行进行提交,所以LOAD DATA会切分成一系列小事务。 - 由于集群级别的乐观并发控制,执行了commit的事务有可能被中断。
发生集群级别的终端时,有提示如下:(Error: 1213 SQLSTATE: 40001 (ER_LOCK_DEADLOCK)). - 不支持XA事务
- 整个集群写操作的负载由最弱的node限定。
- 最小建议节点数为3
- 不支持InnoDB的 fake changes feature(虚假变更功能?)
- enforce_storage_engine = InnoDB与wsrep_replicate_myisam = OFF不兼容
- 不要使用alter table ... import/export,可能会导致节点不一致
- 所有的表必须由主键