PolarDB-X 開源 | 基於 Paxos 的 MySQL 三副本

前言

PolarDB-X 作爲PolarDB分佈式版,是阿里巴巴自主設計研發的高性能雲原生分佈式數據庫產品,採用 Shared-nothing 與存儲分離計算架構,支持集中式和分佈式一體化形態,具備金融級數據高可用、分佈式水平擴展、混合負載、低成本存儲和極致彈性等能力,堅定以兼容MySQL開源生態構建分佈式能力,爲用戶提供高吞吐、大存儲、低延時、易擴展和超高可用的雲時代數據庫服務。

PolarDB-X在架構上可以簡單分爲CN節點和DN節點。計算節點CN負責SQL的解析和執行,存儲節點DN負責數據的分佈式事務和高可用存儲。

2023年10月份,PolarDB-X 開源正式發佈V2.3.0版本,重點推出PolarDB-X標準版(集中式形態),將PolarDB-X分佈式中的DN節點提供單獨服務。支持Paxos協議的多副本模式、lizard分佈式事務引擎,採用一主一備一日誌的三節點架構,通過Paxos協議多副本同步複製,確保數據的強一致性(RPO=0),可以100%兼容MySQL。同時在性能場景上,採用生產級部署和參數(開啓雙1 + Paxos多副本強同步),相比於開源MySQL 8.0.34,PolarDB-X在讀寫混合場景上有30~40%的性能提升,可以作爲開源MySQL的最佳替代選擇。

本篇文章的後續部分,主要介紹如何從0到1快速體驗:PolarDB-X的集中式形態(“基於Paxos的MySQL三副本”)。

工作原理

PolarDB-X基於Paxos的MySQL三副本,大致的工作原理:

1、在同一時刻,整個集羣中至多會有一個Leader節點來承擔數據寫入的任務,其餘節點作爲follower參與多數派投票和數據同步
2、Paxos的協議日誌Consensus Log,全面融合了MySQL原有的binlog內容。在Leader主節點上會在binlog協議中新增Consensus相關的binlog event,同時在Follower備節點上替換傳統的Relay Log,備庫會通過SQL Thread進行Replay日誌內容到數據文件,可以簡單理解Paxos Consensus Log ≈ MySQL Binlog
3、基於Paxos多數派自動選主機制,通過heartbeat/election timeout機制會監聽Leader節點的變化,在Leader節點不可用時Follower節點會自動完成切主,新的Leader節點提供服務之前需等待SQL Thread完成存量日誌的Replay,確保新Leader有最新的數據。

PolarDB-X基於Paxos的MySQL三副本,技術特點:

1、高性能,採用單Leader的模式,可以提供類比MySQL semi-sync模式的性能
2、RPO=0,Paxos協議日誌全面融合MySQL原有的binlog內容,基於多數派同步機制確保數據不丟
3、自動HA,基於Paxos的選舉心跳機制,MySQL自動完成節點探活和HA切換,可以替換傳統MySQL的HA機制。

更多技術原理,可以參考:PolarDB-X 存儲引擎核心技術 | Paxos多副本

快速部署

PolarDB-X支持多種形態的快速部署能力,可以結合各自需求盡心選擇

本文采用依賴最少的RPM包部署方式,通過 RPM 部署 PolarDB-X 標準版(集中式形態),需要首先獲取相應的 RPM 包,您可以手動編譯生成該 RPM 包,也可以自行下載(請根據實際情況下載 x86 或 arm 對應的 RPM)。

RPM下載地址:https://github.com/polardb/polardbx-engine/releases/
(國內RPM下載地址:https://openpolardb.com/download

1、選擇源碼編譯RPM包,可以參考文檔:從源碼編譯生成RPM

# 拉取代碼
git clone https://github.com/polardb/polardbx-engine.git --depth 1

# 編譯生成 rpm
cd polardbx-engine/rpm && rpmbuild -bb t-polardbx-engine.spec

最後,基於RPM包快速安裝

yum install -y <您下載或編譯的rpm>

安裝後的二進制文件,會出現在 /opt/polardbx-engine/bin 中。

體驗單機模式

準備一份 my.cnf(參考模板)和數據目錄(如果改了 my.cnf,則下面的目錄也要相應修改),就可以準備啓動了。

# 創建並切換到 polarx 用戶
useradd -ms /bin/bash polarx
echo "polarx:polarx" | chpasswd
echo "polarx    ALL=(ALL)    NOPASSWD: ALL" >> /etc/sudoers
su - polarx

# 創建必要目錄
mkdir polardbx-engine
cd polardbx-engine && mkdir log mysql run data tmp

# 初始化my.cnf文件
vi my.cnf

# 初始化
/opt/polardbx_engine/bin/mysqld --defaults-file=my.cnf --initialize-insecure
# 啓動
/opt/polardbx_engine/bin/mysqld_safe --defaults-file=my.cnf &

登錄數據庫,驗證狀態

# 登錄數據庫,my.cnf指定了端口
mysql -h127.0.0.1 -P4886 -uroot

# 查詢本機的paxos角色
MySQL [(none)]> SELECT * FROM INFORMATION_SCHEMA.ALISQL_CLUSTER_LOCAL \G
*************************** 1. row ***************************
          SERVER_ID: 1
       CURRENT_TERM: 2
     CURRENT_LEADER: 127.0.0.1:14886
       COMMIT_INDEX: 1
      LAST_LOG_TERM: 2
     LAST_LOG_INDEX: 1
               ROLE: Leader
          VOTED_FOR: 1
   LAST_APPLY_INDEX: 0
SERVER_READY_FOR_RW: Yes
      INSTANCE_TYPE: Normal
1 row in set (0.00 sec)

# 查詢集羣所有機器的paxos角色(只有Leader節點會返回數據)
MySQL [(none)]> SELECT * FROM INFORMATION_SCHEMA.ALISQL_CLUSTER_GLOBAL \G
*************************** 1. row ***************************
      SERVER_ID: 1
        IP_PORT: 127.0.0.1:14886
    MATCH_INDEX: 1
     NEXT_INDEX: 0
           ROLE: Leader
      HAS_VOTED: Yes
     FORCE_SYNC: No
ELECTION_WEIGHT: 5
 LEARNER_SOURCE: 0
  APPLIED_INDEX: 0
     PIPELINING: No
   SEND_APPLIED: No
1 row in set (0.00 sec)

因爲默認my.cnf只配置了單機模式啓動,因此只會顯示單副本的Leader狀態

體驗基於Paxos的高可用

我們在 3 臺機器上,部署一個完整的集中式集羣,並驗證高可用切換的能力。 假設我們的 3 臺機器 IP 分別爲:

10.0.3.244
10.0.3.245
10.0.3.246

我們在 3 臺機器上,安裝 RPM 後,準備好 my.cnf 和目錄(如果有任何步驟失敗,請完全清理這些目錄,重新創建)。然後在 3 個機器上,分別按如下方式啓動:

# 10.0.3.244 上執行
/opt/polardbx_engine/bin/mysqld --defaults-file=my.cnf \
--cluster-info='10.0.3.244:14886;10.0.3.245:14886;10.0.3.246:14886@1' \
--initialize-insecure

/opt/polardbx_engine/bin/mysqld_safe --defaults-file=my.cnf \
--cluster-info='10.0.3.244:14886;10.0.3.245:14886;10.0.3.246:14886@1' \
&

# 10.0.3.245 上執行
/opt/polardbx_engine/bin/mysqld --defaults-file=my.cnf \
--cluster-info='10.0.3.244:14886;10.0.3.245:14886;10.0.3.246:14886@2' \
--initialize-insecure

/opt/polardbx_engine/bin/mysqld_safe --defaults-file=my.cnf \
--cluster-info='10.0.3.244:14886;10.0.3.245:14886;10.0.3.246:14886@2' \
&

# 10.0.3.246 上執行
/opt/polardbx_engine/bin/mysqld --defaults-file=my.cnf \
--cluster-info='10.0.3.244:14886;10.0.3.245:14886;10.0.3.246:14886@3' \
--initialize-insecure

/opt/polardbx_engine/bin/mysqld_safe --defaults-file=my.cnf \
--cluster-info='10.0.3.244:14886;10.0.3.245:14886;10.0.3.246:14886@3' \
&

注意:我們在啓動時修改了 cluster-info 的配置項,其中的格式爲 [host1]:[port1];[host2]:[port2];[host3]:[port3]@[idx] ,不同的機器,只有 [idx] 不同,[idx] 也反映了該機器是第幾個 [host][port]。請根據實際機器的 ip 修改該配置項。

另外,PolarDB-X的副本啓動爲Logger模式,需要設置cluster-log-type-node=ON

# 比如我們把第三個主機,配置爲logger模式

/opt/polardbx_engine/bin/mysqld_safe --defaults-file=my.cnf \
cluster-log-type-node=ON \
--cluster-info='10.0.3.244:14886;10.0.3.245:14886;10.0.3.246:14886@3' \
&

體驗一(三副本啓動)

Paxos三副本在逐臺啓動時,剛啓動第一臺時,會因爲不滿足Paxos多數派,無法產生選主結果,此時數據庫無法登錄。

> tail -f /home/polarx/polardbx-engine/log/alert.log
......
[ERROR] Server 1 : Paxos state change from FOLL to CAND !!
[ERROR] Server 1 : Start new requestVote: new term(2)
[ERROR] Server 1 : Paxos state change from CAND to CAND !!
[ERROR] Server 1 : Start new requestVote: new term(3)
[ERROR] Server 1 : Paxos state change from CAND to CAND !!
[ERROR] Server 1 : Start new requestVote: new term(4)
[ERROR] Server 1 : Paxos state change from CAND to CAND !!
[ERROR] Server 1 : Start new requestVote: new term(5)
...... 
# 阻塞直到第二個節點加入,併成功選主
[ERROR] EasyNet::onConnected server 2
[ERROR] Server 1 : Paxos state change from CAND to CAND !!
[ERROR] Server 1 : Start new requestVote: new term(6)
[ERROR] Server 1 : server 2 (term:6) vote me to became leader.
[ERROR] Server 1 : Paxos state change from CAND to LEDR !!
[ERROR] Server 1 : become Leader (currentTerm 6, lli:1, llt:6)!!

數據庫啓動完成後,我們登錄數據庫,驗證一下集羣的狀態

MySQL [(none)]> SELECT * FROM INFORMATION_SCHEMA.ALISQL_CLUSTER_LOCAL \G
*************************** 1. row ***************************
          SERVER_ID: 1
       CURRENT_TERM: 6
     CURRENT_LEADER: 10.0.3.244:14886
       COMMIT_INDEX: 1
      LAST_LOG_TERM: 6
     LAST_LOG_INDEX: 1
               ROLE: Leader
          VOTED_FOR: 1
   LAST_APPLY_INDEX: 0
SERVER_READY_FOR_RW: Yes
      INSTANCE_TYPE: Normal

MySQL [(none)]> `
+-----------+------------------+-------------+------------+----------+-----------+------------+-----------------+----------------+---------------+------------+--------------+
| SERVER_ID | IP_PORT          | MATCH_INDEX | NEXT_INDEX | ROLE     | HAS_VOTED | FORCE_SYNC | ELECTION_WEIGHT | LEARNER_SOURCE | APPLIED_INDEX | PIPELINING | SEND_APPLIED |
+-----------+------------------+-------------+------------+----------+-----------+------------+-----------------+----------------+---------------+------------+--------------+
|         1 | 10.0.3.244:14886 |           1 |          0 | Leader   | Yes       | No         |               5 |              0 |             0 | No         | No           |
|         2 | 10.0.3.245:14886 |           1 |          2 | Follower | Yes       | No         |               5 |              0 |             1 | Yes        | No           |
|         3 | 10.0.3.246:14886 |           1 |          2 | Follower | No        | No         |               5 |              0 |             1 | Yes        | No           |
+-----------+------------------+-------------+------------+----------+-----------+------------+-----------------+----------------+---------------+------------+--------------+
3 rows in set (0.00 sec)

我們可以看到,三臺機器中10.0.3.244爲leader,10.0.3.245、10.0.3.246都爲Follower角色

體驗二(kill -9切換)

基於Paxos的三副本模式,只有 Leader 節點可以寫入數據。我們在 Leader 上建一個庫表,寫入一些簡單的數據:

CREATE DATABASE db1;
USE db1;
CREATE TABLE tb1 (id int);
INSERT INTO tb1 VALUES (0), (1), (2);

然後我們可以在 Leader和Follower 上把數據查出來。 我們也可以在 Leader 上查詢集羣的狀態:

MySQL [db1]> SELECT SERVER_ID,IP_PORT,MATCH_INDEX,ROLE,APPLIED_INDEX FROM INFORMATION_SCHEMA.ALISQL_CLUSTER_GLOBAL ;
+-----------+------------------+-------------+----------+---------------+
| SERVER_ID | IP_PORT          | MATCH_INDEX | ROLE     | APPLIED_INDEX |
+-----------+------------------+-------------+----------+---------------+
|         1 | 10.0.3.244:14886 |           4 | Leader   |             4 |
|         2 | 10.0.3.245:14886 |           4 | Follower |             4 |
|         3 | 10.0.3.246:14886 |           4 | Follower |             4 |
+-----------+------------------+-------------+----------+---------------+
3 rows in set (0.00 sec)

其中 APPLIED_INDEX 都是 4 ,說明數據目前Paxos三節點上的Log Index是完全一致的。 接下來,我們對 Leader 節點(10.0.3.244)進程 kill -9 ,讓集羣選出新 Leader。

kill -9 $(pgrep -x mysqld)

舊 Leader 被 kill 後,mysqld_safe 會立馬重新拉起 mysqld 進程。 隨後,我們看到,Leader 變成了 10.0.3.245 節點了

# 10.0.3.245新Leader上,查詢狀態
MySQL [(none)]> SELECT SERVER_ID,IP_PORT,MATCH_INDEX,ROLE,APPLIED_INDEX FROM INFORMATION_SCHEMA.ALISQL_CLUSTER_GLOBAL ;
+-----------+------------------+-------------+----------+---------------+
| SERVER_ID | IP_PORT          | MATCH_INDEX | ROLE     | APPLIED_INDEX |
+-----------+------------------+-------------+----------+---------------+
|         1 | 10.0.3.244:14886 |           5 | Follower |             5 |
|         2 | 10.0.3.245:14886 |           5 | Leader   |             4 |
|         3 | 10.0.3.246:14886 |           5 | Follower |             5 |
+-----------+------------------+-------------+----------+---------------+
3 rows in set (0.00 sec)

我們在10.0.3.244原leader上,查詢狀態已經變爲follower

MySQL [(none)]> SELECT * FROM INFORMATION_SCHEMA.ALISQL_CLUSTER_LOCAL \G
*************************** 1. row ***************************
          SERVER_ID: 1
       CURRENT_TERM: 7
     CURRENT_LEADER: 10.0.3.245:14886
       COMMIT_INDEX: 5
      LAST_LOG_TERM: 7
     LAST_LOG_INDEX: 5
               ROLE: Follower
          VOTED_FOR: 2
   LAST_APPLY_INDEX: 5
SERVER_READY_FOR_RW: No
      INSTANCE_TYPE: Normal

可以通過不斷kill -9多副本,來驗證Leader在三個節點中不斷遷移和恢復的能力。 通過以上步驟,我們簡單驗證了基於Paxos三副本自動選主和切換的能力。

體驗三(預期切換命令)

PolarDB-X內置提供面向Paxos三副本運維管理的命令 比如當前集羣狀態:

MySQL [(none)]> SELECT SERVER_ID,IP_PORT,MATCH_INDEX,ROLE,APPLIED_INDEX FROM INFORMATION_SCHEMA.ALISQL_CLUSTER_GLOBAL ;
+-----------+------------------+-------------+----------+---------------+
| SERVER_ID | IP_PORT          | MATCH_INDEX | ROLE     | APPLIED_INDEX |
+-----------+------------------+-------------+----------+---------------+
|         1 | 10.0.3.244:14886 |           9 | Leader   |             8 |
|         2 | 10.0.3.245:14886 |           9 | Follower |             9 |
|         3 | 10.0.3.246:14886 |           9 | Follower |             9 |
+-----------+------------------+-------------+----------+---------------+

指令1:指定IP切換Leader

call dbms_consensus.change_leader("10.0.3.245:14886");

指令2:查詢和清理consensus日誌

# 查詢consensus日誌(PolarDB-X基於binlog文件實現paxos consensus日誌)
MySQL [(none)]> show consensus logs;
+---------------------+-----------+-----------------+
| Log_name            | File_size | Start_log_index |
+---------------------+-----------+-----------------+
| mysql-binlog.000001 |      1700 |               1 |
+---------------------+-----------+-----------------+
1 row in set (0.00 sec)

# 清理consensus日誌,指定logIndex(有保護機制,如果有副本還在消費則不會清理成功)
MySQL [(none)]> call dbms_consensus.purge_log(1);
Query OK, 0 rows affected (0.00 sec)

除此以外,額外支持:動態增刪副本、節點角色變更(Learner/Follower)、選舉權重設置

# 加learner
call dbms_consensus.add_learner("127.0.0.1:14886");
# 減learner
call dbms_consensus.drop_learner("127.0.0.1:14886");

# learner轉follower,learner日誌落後太多會返回失敗
call dbms_consensus.upgrade_learner("127.0.0.1:14886");
# follower降級learner
call dbms_consensus.downgrade_follower("127.0.0.1:15700");

#   修改follower節點的選主權重[1-9],默認爲5
call dbms_consensus.configure_follower("127.0.0.1:15700", 9);

體驗四(模擬離線啓動)

PolarDB-X支持多副本的離線啓動,比如因爲斷網或斷電需要,期望數據庫支持整體關機和離線啓動的能力,可以基於本地文件重新離線組建新的三副本。 做一個簡單模擬,我們登錄三臺機器進行整體kil -9

kill -9 $(pgrep -x mysqld)

原位模擬離線啓動,重新組建三副本集羣:

# 10.0.3.244 上執行
/opt/polardbx_engine/bin/mysqld_safe --defaults-file=my.cnf \
--cluster-info='10.0.3.244:14886;10.0.3.245:14886;10.0.3.246:14886@1' \
&

# 10.0.3.245 上執行
/opt/polardbx_engine/bin/mysqld_safe --defaults-file=my.cnf \
--cluster-info='10.0.3.244:14886;10.0.3.245:14886;10.0.3.246:14886@2' \
&

# 10.0.3.246 上執行
/opt/polardbx_engine/bin/mysqld_safe --defaults-file=my.cnf \
--cluster-info='10.0.3.244:14886;10.0.3.245:14886;10.0.3.246:14886@3' \
&

如果真實業務中,涉及了機器遷移,拷貝原有數據文件到新機器後,可以在三副本啓動時設置--cluster-force-change-meta=ON,強制刷新下集羣的元數據。 例子:

# 強制刷新元數據(刷新成功後會退出mysqld和mysqld_safe)
/opt/polardbx_engine/bin/mysqld_safe --defaults-file=my.cnf \
--cluster-force-change-meta=ON \
--cluster-info='192.168.6.183:14886;192.168.6.184:14886;192.168.6.185:14886@1' \
&

# 按照新配置,重新啓動
/opt/polardbx_engine/bin/mysqld_safe --defaults-file=my.cnf \
--cluster-info='192.168.6.183:14886;192.168.6.184:14886;192.168.6.185:14886@1' \
&

體驗基於Paxos的性能壓測

我們通過3臺機器部署Paxos多副本,快速驗證下PolarDb-X的性能 在默認參數基礎上,進行PolarDB-X相關參數調優(可以參考絕大部分的MySQL參數調優方法):

[mysqld]

# 調整最大連接數
max_connections=20000

# 強制刷盤
sync_binlog=1
innodb_flush_log_at_trx_commit=1

# 優化follower的複製效率
slave_parallel_type=LOGICAL_CLOCK
slave_parallel_workers=16

# binlog參數
binlog_order_commits=OFF
binlog_cache_size=1M
binlog_transaction_dependency_tracking=WRITESET

# 調整innodb BP大小
innodb_buffer_pool_size=20G
# innodb參數
innodb_log_buffer_size=200M
innodb_log_file_size=2G
innodb_io_capacity=20000
innodb_io_capacity_max=40000
innodb_max_dirty_pages_pct=75
innodb_lru_scan_depth=8192
innodb_open_files=20000

# consensus
consensus_log_cache_size=512M
consensus_io_thread_cnt=8
consensus_worker_thread_cnt=8
consensus_prefetch_cache_size=256M

# timezone
default_time_zone=+08:00

快速創建一個壓測用戶:

CREATE USER polarx IDENTIFIED BY 'polarx';  
grant all privileges on *.* to 'polarx'@'%' ;
FLUSH PRIVILEGES ;

參考壓測文檔,部署PolarDB-X開源的benchmark-boot壓測工具

# 下載鏡像
docker pull polardbx/benchmark-boot:latest

# 啓動容器
docker run -itd --name 'benchmark-boot' --privileged --net=host \
    -v /etc/localtime:/etc/localtime polardbx/benchmark-boot:latest \
    /usr/sbin/init

# 驗證
curl http://127.0.0.1:4121/

壓測方法可以參考文檔 :Sysbench 測試報告TPC-C 測試報告 壓測過程中,可以通過paxos的系統視圖,關注數據複製狀態

MySQL [(none)]> select * from  INFORMATION_SCHEMA.ALISQL_CLUSTER_health;
+-----------+------------------+----------+-----------+---------------+-----------------+
| SERVER_ID | IP_PORT          | ROLE     | CONNECTED | LOG_DELAY_NUM | APPLY_DELAY_NUM |
+-----------+------------------+----------+-----------+---------------+-----------------+
|         1 | 10.0.3.244:14886 | Follower | YES       |             0 |              22 |
|         2 | 10.0.3.245:14886 | Leader   | YES       |             0 |               0 |
|         3 | 10.0.3.246:14886 | Follower | YES       |             0 |              11 |
+-----------+------------------+----------+-----------+---------------+-----------------+

LOG_DELAY_NUM代表binlog複製到paxos多副本的延遲數量,如果接近0代表基本沒有延遲 APPLY_DELAY_NUM代表在副本中binlog apply應用的延遲數量,如果接近0代表基本沒有延遲
壓測環境採用 3臺ecs.i4.8xlarge(32c256GB + 7TB的磁盤) TPC-C 1000倉,跑200併發的性能24萬 tpmC 資源情況:Leader節點CPU 95%、Follower節點CPU 30%(Logger節點<10%)

02:52:42,321 [main] INFO   jTPCC : Term-00, 
02:52:42,322 [main] INFO   jTPCC : Term-00, +-------------------------------------------------------------+
02:52:42,322 [main] INFO   jTPCC : Term-00,      BenchmarkSQL v5.0
02:52:42,323 [main] INFO   jTPCC : Term-00, +-------------------------------------------------------------+
02:52:42,323 [main] INFO   jTPCC : Term-00,  (c) 2003, Raul Barbosa
02:52:42,323 [main] INFO   jTPCC : Term-00,  (c) 2004-2016, Denis Lussier
02:52:42,324 [main] INFO   jTPCC : Term-00,  (c) 2016, Jan Wieck
02:52:42,324 [main] INFO   jTPCC : Term-00, +-------------------------------------------------------------+
02:52:42,324 [main] INFO   jTPCC : Term-00, 
02:52:42,324 [main] INFO   jTPCC : Term-00, db=mysql
02:52:42,324 [main] INFO   jTPCC : Term-00, driver=com.mysql.jdbc.Driver
02:52:42,324 [main] INFO   jTPCC : Term-00, conn=jdbc:mysql://10.0.3.245:4886/tpcc?readOnlyPropagatesToServer=false&rewriteBatchedStatements=true&failOverReadOnly=false&connectTimeout=3000&socketTimeout=0&allowMultiQueries=true&clobberStreamingResults=true&characterEncoding=utf8&netTimeoutForStreamingResults=0&autoReconnect=true&useSSL=false
02:52:42,324 [main] INFO   jTPCC : Term-00, user=polarx
02:52:42,324 [main] INFO   jTPCC : Term-00, 
02:52:42,324 [main] INFO   jTPCC : Term-00, warehouses=1000
02:52:42,325 [main] INFO   jTPCC : Term-00, terminals=200
02:52:42,326 [main] INFO   jTPCC : Term-00, runMins=5
02:52:42,326 [main] INFO   jTPCC : Term-00, limitTxnsPerMin=0
02:52:42,326 [main] INFO   jTPCC : Term-00, terminalWarehouseFixed=true
02:52:42,326 [main] INFO   jTPCC : Term-00, 
02:52:42,326 [main] INFO   jTPCC : Term-00, newOrderWeight=45
02:52:42,326 [main] INFO   jTPCC : Term-00, paymentWeight=43
02:52:42,326 [main] INFO   jTPCC : Term-00, orderStatusWeight=4
02:52:42,326 [main] INFO   jTPCC : Term-00, deliveryWeight=4
02:52:42,326 [main] INFO   jTPCC : Term-00, stockLevelWeight=4
02:52:42,326 [main] INFO   jTPCC : Term-00, newOrderRemotePercent=10
02:52:42,326 [main] INFO   jTPCC : Term-00, paymentRemotePercent=15
02:52:42,326 [main] INFO   jTPCC : Term-00, useStoredProcedure=false
02:52:42,326 [main] INFO   jTPCC : Term-00, 
02:52:42,327 [main] INFO   jTPCC : Term-00, resultDirectory=null
02:52:42,327 [main] INFO   jTPCC : Term-00, osCollectorScript=null
02:52:42,327 [main] INFO   jTPCC : Term-00, 
02:52:42,516 [main] INFO   jTPCC : Term-00, C value for C_LAST during load: 226
02:52:42,517 [main] INFO   jTPCC : Term-00, C value for C_LAST this run:    107
02:52:42,517 [main] INFO   jTPCC : Term-00, 
.......
02:57:43,133 [Thread-172] INFO   jTPCC : Term-00, 
02:57:43,133 [Thread-172] INFO   jTPCC : Term-00, 
02:57:43,134 [Thread-172] INFO   jTPCC : Term-00, Measured tpmC (NewOrders) = 237040.65
02:57:43,134 [Thread-172] INFO   jTPCC : Term-00, Measured tpmTOTAL = 526706.43
02:57:43,134 [Thread-172] INFO   jTPCC : Term-00, Session Start     = 2023-11-21 02:52:43
02:57:43,134 [Thread-172] INFO   jTPCC : Term-00, Session End       = 2023-11-21 02:57:43
02:57:43,134 [Thread-172] INFO   jTPCC : Term-00, Transaction Count = 2633935

總結

本文通過從源碼編譯、RPM安裝,全流程驗證PolarDB-X的單節點、三副本等啓動方式,以及通過kill -9模擬故障,快速體驗RPO=0的自動切換。 另外,在面向可運維性上,支持多種運維指令、以及離線重搭啓動的方式,很好滿足了MySQL生態的運維習慣。 最後,通過一個性能壓測的實踐,快速復現PolarDB-X性能白皮書的測試結果,後續也會逐步增加關於PolarDB-X Paxos與MySQL MGR的技術原理和性能對比的相關測試,歡迎大家繼續關注。

附錄(my.cnf 簡單模板)

[mysqld]
basedir = /opt/polardbx-engine
log_error_verbosity = 2
default_authentication_plugin = mysql_native_password
gtid_mode = ON
enforce_gtid_consistency = ON
log_bin = mysql-binlog
binlog_format = row
binlog_row_image = FULL
master_info_repository = TABLE
relay_log_info_repository = TABLE

# change me if needed
datadir = /home/polarx/polardbx-engine/data
tmpdir = /home/polarx/polardbx-engine/tmp
socket = /home/polarx/polardbx-engine/tmp.mysql.sock
log_error = /home/polarx/polardbx-engine/log/alert.log
port = 4886
cluster_id = 1234
cluster_info = 127.0.0.1:14886@1

[mysqld_safe]
pid_file = /home/polarx/polardbx-engine/run/mysql.pid

作者:七鋒

原文鏈接

本文爲阿里雲原創內容,未經允許不得轉載。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章