Percona XtraDB Cluster (PXC) 開始測試 5.6 版了...

Percona 的 blog 上看到 Percona XtraDB Cluster 出 5.6 版 (測試版) 了:「Percona XtraDB Cluster 5.6.14-25.1 Beta is now available」。

也就是 Galera ClusterMySQL 5.6 上的版本...

在 5.6 上有的功能都會有,也就是說,InnoDB 的 memcache interface,以及 FULLTEXT 功能都可以用?

另外在 comment 也有討論到要如何從 PXC 5.5 升級到 5.6 (不產生 downtime),看起來也是噓要花時間 PoC 過後才能確認... 就算正式釋出,應該還是會觀望看看。

Percona XtraDB Cluster 5.5.33-23-7.6...

Percona XtraDB Cluster (Galera Cluster) 出新版:「Percona XtraDB Cluster 5.5.33-23.7.6 is now available」。

看到了幾個比較特別的功能:

Desync functionality has now been exposed to the client. This can be done either via /*! WSREP_DESYNC */ comment on the query or by setting the global wsrep_desync variable to 1.

這個功能感覺上是打算為了在 Percona Toolkit 裡面配合 pt-table-sync 而準備的?

另外一個重要的功能是限速,這可以避免在伺服器最忙碌的時候加重負擔造成伺服器撐不住:

Percona XtraDB Cluster has implemented new rate limiting, rlimit, option for XtraBackup SST that can be used to avoid saturating the donor node.

以往我是自己 patch 一個 shell script 出來用,現在則變成是原生支援,那麼本來的 patch 方式就要轉換到原生支援上...

然後文末有建議 Debian 使用者在升級前要先安裝 socat,避免升級發生問題 :o

配合 Percona Xtrabackup 的新功能以及對 Percona XtraDB Cluster 初始化的速度...

在「2 new features added to Percona XtraDB Cluster (PXC) since 5.5.31」看到 Percona Xtrabackup 引入新功能後,在 Percona XtraDB Cluster 就能使用這些新功能加快初始化的速度。

首先是 bootstrap-pxc 這個參數:

# use this...
/etc/init.d/mysql bootstrap-pxc
# or...
service mysql bootstrap-pxc

當第一次啟動時需要對 my.cnf 的 hack (啟動完成後就可以改回來) 現在可以在參數直接處理。

另外是對 xbstream 的支援,這聽一陣子了,這邊就不講怎麼用了,原文講得很清楚。不過目前測出來的效果不怎樣啊:

文章作者是說對於小資料沒差,晚點再來看看有沒有對大資料的 benchmark...

在 Percona XtraDB Cluster 裡使用 async replication 時人工 failover 的方式...

在使用 Galera Cluster 時還是可以架設一般的 slave server (Percona XtraDB Cluster 則是 Percona 對 Galera Cluster 的封裝),像是這樣的架構:

其中 node{1,2} 為 cluster,node3 則是傳統的 async replication,來源的 master 為 node1。

當 node1 掛掉時,我們沒辦法自動將 node3 的 master 從 node1 改指到 node2,因為 binlog 的位置不一定正確。

在「Changing an async slave of a PXC cluster to a new Master」則是提供如何人工用最簡單的方式介入。

主要是靠 Galera Cluster 會在 binlog 內寫入 Xid 這個值,這個值可以在 global status 內的 wsrep_last_committed 看到。因為這個值在全 cluster 都是同步的,就可以拿來人工尋找 binlog 位置後手動下 CHANGE MASTER TO,而不用 pt-table-sync 同步修老半天...

而且邏輯被整理出來以後,就有機會寫成程式自動化... 這算是一個不錯的開頭 :p

Percona 提供的「Galera Cluster 前置作業」文件...

文章的標題「Follow these basics when migrating to Percona XtraDB Cluster for MySQL」寫的是 Percona XtraDB Cluster,不過基本上就是在講 Galera Cluster

除了已知的 MyISAM 問題與 Primary Key 前提外,還有提到在從 MySQL server 轉移到 Galera Cluster 過程要怎麼做。

在這種情況下,會另外準備 server 跑 Galera Cluster (採先建後拆的策略)。新的 cluster 裡其中有一台會以 slave 身份向原來的 MySQL server (master) 取得 binlog 更新。

log_slave_updates 就是用在這裡。設定後才能讓 Galera Cluster 內的 server 收到 binlog 後記錄下來,之後會複製到其他台。

當初轉移的時候也有用到,後來因為都是新建就淡忘了,看到 Percona 寫的文件才突然想起來有這回事 XD

判斷資料庫是否可以轉移到 Galera Cluster 上的方式...

Open Query 的人給了一個很簡單的方式,只要下一個 SQL query 去查就可以知道有哪些 table 不符合 Galera Cluster 的條件:「Galera pre-deployment check」。

就目前看到的說明以及 SQL query 算是 pre-check:回報 okay 不代表上了就沒問題,但如果有回報有問題,表示上了 Galera Cluster 後會遇到問題。

這個檢查適用於 MySQL 以及目前常見的 MySQL fork (像是 MariaDBPercona Server)。

Percona 的 MySQL 5.6...

剛剛看到 Percona 放出第三個基於 MySQL 5.6 的版本了,仍然是 alpha 等級 (還在測試階段):「Announcing Percona Server for MySQL 5.6.10-60.2」。

這也是 MySQL 5.6 進入 GA 後 Percona 推出的第一個版本,而且剛剛看 Percona 的文件網站也發現建出來了:「Percona Server 5.6 - Documentation」。

Percona XtraDB Cluster 目前還是基於 5.5 的版本,不知道 Codership (Galera Cluster 的開發公司) 有沒有打算換新...

把 MySQL MyISAM 換到 Galera Cluster 的 InnoDB 上...

在「Switching from MySQL/MyISAM to Galera Cluster」這邊看到一個 script 可以檢查 MySQL MyISAM 換到 InnoDB,而且預定要換成 Galera Cluster 時的問題。

常見的問題都有檢查到,還蠻有用的:

  • 針對沒有 Primary Key 的表格提出警告,讓管理者規劃補上 Primary Key。
  • 針對 MyISAM 換成 InnoDB 後造成 Primary Key 太長的表格提出警告,讓管理者想辦法修改。

Galera Cluster 無法處理沒有 Primary Key 表格的刪除動作:(可以參考「MariaDB Galera Cluster - Known Limitations」這邊的說明)

DELETE operation is unsupported on tables without primary key. Also rows in tables without primary key may appear in different order on different nodes. Don't use tables without primary key.

不過每個表格都要有 Primary Key 並不難,因為如果有正規化時通常都會達到目標。就算不去用他也還是可以設計一個 INT UNSIGNED PRIMARY KEY AUTO_INCREMENT 放著。(過大的時候再換成 BIGINT UNSIGNED)

Galera Cluster + Heartbeat

我一向不太喜歡 Galera Cluster + HAProxy 的設計。有四個理由:

  • MySQL server 看不到 client 的 IP。
  • HAProxy 本身就是 SPoF。
  • HAProxy 會增加 latency,並且限制 bandwidth。
  • 通常需要額外的機器跑 HAProxy。

我把跑了超過半年的 Galera Cluster + Heartbeat 的經驗貼到 Codership 的 Group 上,裡面包括了設定與 script,希望能有些迴響:「HA solution - Galera Cluster with Heartbeat」。

MySQL 5.6 的 GTID...

看到 Percona 的人在討論 MySQL 5.6 的 GTID (Global Transaction ID) 功能,剛剛就實際到 AWS 上開了兩台 m1.large 測試:「How to create/restore a slave using GTID replication in MySQL 5.6」。

要測試 GTID,因為剛出來沒多久,沒有多少文件可以看。MySQL 官方的「Replication with Global Transaction Identifiers」是必讀的文件。查 MySQL 官方文件時可以發現 5.6.9 (RC) 到 5.6.10 (GA) 其實還是改了不少變數名稱,如果在網路上找舊文章照抄是不會動的...

先提結論,Galera Cluster 畢竟出來很久了,成熟度比 GTID 高,建議現在先觀望一陣子,至少等 best practice 出來後再進場測試...

之前的 MySQL replication 有很多方法可以在不停機,或是停的時間很短的情況下把第一份 slave 資料與 replication 資訊生出來,舉例來說:

  • 系統如果用 InnoDB,可以用 Percona Xtrabackup 拉出。
  • 系統如果用 XFS + LVM,可以用 FLUSH TABLES WITH READ LOCK + XFS freeze + snapshot 功能拉出。
  • 甚至直接用空的 slave 跑 pt-table-sync...

但目前 MySQL 官方對 GTID 給的方式是 read only + mysqldump,這就算用 xtrabackup 也應該快不到哪吧... 這幾個月應該會一直有文章出現,裡面應該會有偷吃步的方法,看到再來測試看看 :o