在Percona XtraDB Cluster集群架构中,为了避免多主节点导致的数据异常,或者说一些不被支持的特性引发的数据不一致的情形,PXC集群可以通过配置pxc_strict_mode这个变量来实现。该变量的设置影响还是蛮大的。下文针对这个参数的不同设置进行描述,以及列出相关的具体影响。
一、PXC严格模式描述
PXC严格模式旨在避免在Percona XtraDB群集中使用实验性和不受支持的功能。它在启动时和运行时执行一些验证。
根据您选择的实际模式,在遇到验证失败时,服务器将引发错误(停止启动或拒绝操作),或者记录警告并继续正常运行。以下模式可用:
DISABLED:不要执行严格的模式验证并正常运行。
PERMISSIVE:如果vaidation失败,请记录警告并继续正常运行。
ENFORCING:如果在启动期间验证失败,请停止服务器并发出错误。如果运行时验证失败,将拒绝操作并抛出错误。
MASTER:等同于ENFORCING,除了不执行显式表锁定的验证外 。此模式可以用于将写入操作隔离到单个节点的群集。
默认情况下,PXC严格模式设置为ENFORCING,除非节点充当独立服务器或节点为自举,则PXC严格模式默认为DISABLED。
建议将PXC严格模式设置为ENFORCING,因为在这种情况下,每当Percona XtraDB集群遇到实验性功能或不受支持的操作时,服务器都会拒绝。这将迫使您重新评估您的Percona XtraDB集群配置,而不会在数据一致性问题上冒险。
如果您打算将PXC严格模式设置为其他任何模式ENFORCING,则应该了解这可能会对数据完整性造成的限制和影响。有关更多信息,请参阅验证。
要设置模式,请使用pxc_strict_mode配置文件中的变量或启动mysqld时使用–pxc-strict-mode
注意
用必要的模式启动服务器会更好(默认ENFORCING是强烈推荐的)。但是,您可以在运行时动态更改它。例如,要将PXC严格模式设置为PERMISSIVE,请运行以下命令:
mysql > SET pxc_strict_mode = PERMISSIVE ;
注意
为了进一步确保数据的一致性,使群集中的所有节点都以相同的配置(包括pxc_strict_mode变量的值)运行非常重要。
二、验证
PXC严格模式验证旨在确保不需要实验功能的常见群集设置的最佳操作,并且不依赖Percona XtraDB群集不支持的操作。
警告
如果将某个节点pxc_strict_mode设置为DISABLED或PERMISSIVE,并且在该节点上执行不受支持的操作,则即使目标节点将pxc_strict_mode设置为ENFORCING,也不会在将其复制到的节点上进行验证。
以下介绍每次验证的目的和结果。
存储引擎 Storage engine
MyISAM复制 MyISAM replication
二进制日志格式 Binary log format
没有主键的表 Tables without primary keys
日志输出 Log output
显式表锁定 Explicit table locking
自动增量锁定模式 Auto-increment lock mode
将模式和数据更改组合在一个语句中 Combining schema and data changes in a single statement
放弃和导入表空间 Discarding and Importing Tablespaces
1、存储引擎
Percona XtraDB集群当前仅支持对使用事务性存储引擎(XtraDB或InnoDB)的表进行复制。为确保数据一致性,对于使用非事务性存储引擎(MyISAM,MEMORY,CSV等)的表,不应允许使用以下语句:
?? 写入到表数据操作语句(例如,INSERT,UPDATE,DELETE,等等)
?? 相关管理语句: CHECK,OPTIMIZE,REPAIR,和ANALYZE
?? TRUNCATE TABLE 和 ALTER TABLE
根据所选模式,会发生以下情况:
DISABLED
?? 在启动时,不执行验证。
?? 在运行时,所有操作都是允许的。
PERMISSIVE
?? 在启动时,不会进行验证。
?? 在运行时,所有操作都是允许的,但是当在不支持的表上执行不需要的操作时,将会记录一条警告。
ENFORCING 或者 MASTER
?? 在启动时,不执行验证。
?? 在运行时,不受支持的表上执行的任何不受欢迎的操作都将被拒绝并记录一个错误。
注意
不支持的表可以转换为使用受支持的存储引擎。
2、MyISAM复制
Percona XtraDB集群为复制使用MyISAM存储引擎的表提供实验支持。由于MyISAM的非事务性质,Percona XtraDB集群不可能完全支持它。
MyISAM复制是使用默认wsrep_replicate_myisam设置的变量来控制,缺省设置为OFF。由于其不可靠性,如果要确保数据一致性,则不应启用MyISAM复制。
根据所选模式,会发生以下情况:
DISABLED
?? 在启动时,不执行验证。
?? 在运行时,您可以设置wsrep_replicate_myisam任何值。
PERMISSIVE
?? 在启动时,如果wsrep_replicate_myisam设置为ON,则会记录警告并继续启动。
?? 在运行时,允许更改wsrep_replicate_myisam 为任何值,但是如果将其设置为ON,则会记录警告。
ENFORCING 要么 MASTER
?? 在启动时,如果wsrep_replicate_myisam设置为ON,则会记录一个错误并启动中止。
?? 在运行时,任何尝试更改wsrep_replicate_myisam 为ON失败并记录错误。
注意
该wsrep_replicate_myisam变量控制 MyISAM表的复制,而这个验证只检查它是否被允许。使用存储引擎验证来限制MyISAM表的不需要的操作。
3、二进制日志格式
Percona XtraDB集群仅支持默认的基于行的二进制日志记录格式。将binlog_format变量设置为除ROW之外启动时都是不允许的,因为这会改变全局范围,必须将其设置为ROW。验证只在运行时和会话范围内执行。
根据所选模式,会发生以下情况:
DISABLED
?? 在运行时,您可以设置binlog_format任何值。
PERMISSIVE
?? 在运行时,允许更改binlog_format 为任何值,但是如果将其设置为其他值,ROW则会记录警告。
ENFORCING 或 MASTER
?? 在运行时,任何尝试更改binlog_format 为ROW失败以外的任何错误都会被记录下来。
4、没有主键的表
Percona XtraDB群集无法正确地将某些写入操作传播给没有定义主键的表。不需要的操作包括执行写入表(尤其是DELETE)的数据操作语句。
根据所选模式,会发生以下情况:
DISABLED
??在启动时,不执行验证。
??在运行时,所有操作都是允许的。
PERMISSIVE
??在启动时,不会进行验证。
??在运行时,所有操作都是允许的,但是如果在没有定义显式主键的情况下在表上执行不希望的操作,则会记录警告。
ENFORCING 或 MASTER
??在启动时,不执行验证。
??在运行时,任何在没有显式主键的表上执行的不受欢迎的操作都将被拒绝,并且会记录一个错误。
5、日志输出
Percona XtraDB集群不支持将MySQL数据库中的表作为日志输出的目的地。默认情况下,日志条目被写入文件。该验证检查log_output变量的值。
根据所选模式,会发生以下情况:
DISABLED
??在启动时,不执行验证。
??在运行时,您可以设置log_output任何值。
PERMISSIVE
??启动时,如果log_output仅设置为TABLE,则会记录警告并继续启动。
??在运行时,可以将其更改log_output 为任何值,但如果仅将其设置为TABLE,则会记录警告。
ENFORCING 或 MASTER
??在启动时,如果log_output仅设置为TABLE,则会记录一个错误并启动中止。
??在运行时,任何尝试log_output只更改TABLE失败并记录错误。
6、显式表锁定
Percona XtraDB集群只有对显式表锁定操作的实验性支持。以下不需要的操作会导致显式表锁定,并由此验证涵盖:
LOCK TABLES
GET_LOCK() 和 RELEASE_LOCK()
FLUSH TABLES WITH READ LOCK
设置SERIALIZABLE事务级别
根据所选模式,会发生以下情况:
DISABLED 或 MASTER
??在启动时,不执行验证。
??在运行时,所有操作都是允许的。
PERMISSIVE
??在启动时,不执行验证。
??在运行时,所有的操作都是允许的,但是当执行一个不希望的操作时会记录一个警告。
ENFORCING
??在启动时,不执行验证。
??在运行时,任何不受欢迎的操作都将被拒绝并记录一个错误。
7、自动增量锁定模式
用于生成自动递增值的锁定模式必须交错, 以确保每个节点生成唯一的(但是不连续的)标识符。
该验证检查innodb_autoinc_lock_mode变量的值。默认情况下,变量设置为1(连续锁定模式),但应该设置为2(交错锁定模式)。
根据所选的严格模式,会发生以下情况:
DISABLED
??在启动时,不执行验证。
PERMISSIVE
??在启动时,如果innodb_autoinc_lock_mode未设置2,则会记录警告并继续启动。
ENFORCING 或 MASTER
??在启动时,如果innodb_autoinc_lock_mode没有设置2,则会记录一个错误并启动中止。
注意
此验证不会在运行时执行,因为该innodb_autoinc_lock_mode变量不能动态设置。
8、将模式和数据更改组合在一个语句中
Percona XtraDB集群不支持(CTAS CREATE TABLE … AS SELECT)语句,因为它们结合了模式和数据更改。
根据所选的严格模式,会发生以下情况:
DISABLED
??在启动时,不执行验证。
??在运行时,所有操作都是允许的。
PERMISSIVE
??在启动时,不会进行验证。
??在运行时,所有操作都是允许的,但在执行CTAS操作时会记录警告。
ENFORCING
??在启动时,不执行验证。
??在运行时,任何CTAS操作都会被拒绝并记录一个错误。
注意
临时表的CTAS操作即使在严格模式下也是允许的。
9、放弃和导入表空间
DISCARD TABLESPACE并 使用TOI不被复制。如果只在一个节点上执行,可能会导致数据不一致。IMPORT TABLESPACE
根据所选的严格模式,会发生以下情况:
DISABLED
??在启动时,不执行验证。
??在运行时,所有操作都是允许的。
PERMISSIVE
??在启动时,不会进行验证。
??在运行时,所有操作都是允许的,但是当放弃或导入表空间时会记录一条警告。
ENFORCING
??在启动时,不执行验证。
??在运行时,丢弃或导入表空间会被拒绝并记录错误。
三、参考链接
https://www.percona.com/doc/percona-xtradb-cluster/LATEST/features/pxc-strict-mode.html