PerconaXtraDBClusterStrictMode(PXC5.7)

leshami發表於2018-04-09

在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