MySQL組複製技術實現與資料庫效能測試工具
測試環境
本文件是在 99Cloud Lab OpenStack 平臺虛機上面測試,僅供參考。
系統: CentOS 7.3
虛機: 2 核 4G
版本: MySQL 5.7
技術架構
MySQL Group Replication(簡稱 MGR)是官方推出的高可用解決方案,原生複製技術,基於外掛的方式工作。其中 single primary mode 單主模式只有一個讀寫,其餘都是隻讀。
multi primary mode多主模式全部可讀寫
不管組複製單主還是多主的故障切換都無法讓應用無感知,需要自主實現,包含以下特性:
- 複製管理操作更為自動化。
- 通過 Paxos 協議提供資料庫叢集節點資料強一致性保證。
- 多主模式所有節點都可讀寫操作。
- 解決網路分割槽導致的腦裂問題,提升複製資料的可靠性。
一些不足
01、官方引言
Quite obviously, regardless the mode Group Replication is deployed, it does not handle client-side fail-over. That must be handled by the application itself, connector or a middleware framework such as a proxy or router. |
意思就是 MGR 內部沒有提供一種機制來實現主節點故障切換對應用的無感知。應用的這種故障無感知需要藉助外力實現。
02、組複製的侷限
所有涉及的資料都必須發生在 InnoDB 儲存引擎的表內。
- 所有的表必須有明確的主鍵定義。
- 網路地址只支援 IPv4。
- 需要低延遲,高頻寬的網路。
- 目前叢集限制最多允許 9 個節點。
- 必須啟用 binlog。
- binlog 格式必須是 row 格式。
- 必須開啟 gtid 模式。
- 複製相關資訊必須使用表儲存。
- 事務寫集合(Transaction write set extraction)必須開啟。
- log slave updates 必須開啟。
- binlog 的 checksum 目前不支援。
- 由於事務寫集合的干擾,無法使用 savepoint。
- serializable 隔離級別目前不支援。
- 對同一個物件,在叢集中不同的例項上,並行地執行 DDL(哪怕是相互衝突的DDL)是可行的,但會導致資料一致性等方面的錯誤,目前階段不支援在多節點同時執行同一物件的 DDL。
- 外來鍵的級聯約束操作目前的實現並不完全支援,不推薦使用。
實驗搭建
01、實驗環境
主機名 |
主機地址 |
組複製埠 |
mysql01 |
172.16.200.4 |
33061 |
mysql02 |
172.16.200.6 |
33062 |
mysql03 |
172.16.200.9 |
33063 |
02、安裝軟體
資料庫主配檔案定義
- datadir=/var/lib/mysql
- socket=/var/lib/mysql/mysql.sock
- report_host = 172.16.200.4
- max_connections = 4096
- # Disabling symbolic-links is recommended to prevent assorted security risks
- symbolic-links=0
- log-error=/var/log/mysqld.log
- pid-file=/var/run/mysqld/mysqld.pid
- server_id=1
- gtid_mode=ON
- enforce_gtid_consistency=ON
- master_info_repository=TABLE
- relay_log_info_repository=TABLE
- binlog_checksum=NONE
- log_slave_updates=ON
- log_bin=binlog
- binlog_format=ROW
- # Group Replication configuration
- transaction_write_set_extraction=XXHASH64
- loose-group_replication_group_name="09f09aca-2ee4-44f7-b4bb-7d5fe32b52a4"
- loose-group_replication_start_on_boot=off
- loose-group_replication_local_address= "172.16.200.4:33061"
- loose-group_replication_group_seeds= "172.16.200.9:33063,172.16.200.4:33061,172.16.200.6:33062"
- loose-group_replication_bootstrap_group= off
- #loose-group_replication_single_primary_mode=FALSE
- #loose-group_replication_enforce_update_everywhere_checks= TRUE
03、複製授權
進入資料庫
- mysql> SET SQL_LOG_BIN=0;
- mysql> CREATE USER [email protected]'%' IDENTIFIED BY 'rpl_pass';
- mysql> GRANT REPLICATION SLAVE ON *.* TO [email protected]'%';
- mysql> FLUSH PRIVILEGES;
- mysql> SET SQL_LOG_BIN=1;
- mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='rpl_pass' FOR CHANNEL 'group_replication_recovery';
04、啟動組複製
安裝外掛
- INSTALL PLUGIN group_replication SONAME 'group_replication.so';
啟動複製通道
- SET GLOBAL group_replication_bootstrap_group=ON;
- START GROUP_REPLICATION;
- SET GLOBAL group_replication_bootstrap_group=OFF;
檢視叢集成員
- mysql> SELECT * FROM performance_schema.replication_group_members;
建立測試同步資料
- mysql> CREATE DATABASE test;
- mysql> USE test;
- mysql> CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 TEXT NOT NULL);
- mysql> INSERT INTO t1 VALUES (1, 'Luis');
檢查同步資料和 Binlog
05、加入叢集
其餘節點加入叢集
1)先定義主配檔案與主機 hosts
2)建立通道授權
- SET SQL_LOG_BIN=0;
- CREATE USER [email protected]'%' IDENTIFIED BY 'rpl_pass' ;
- GRANT REPLICATION SLAVE ON *.* TO [email protected]'%' IDENTIFIED BY 'rpl_pass';
- SET SQL_LOG_BIN=1;
- CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='rpl_pass'
- FOR CHANNEL 'group_replication_recovery';
3)新增外掛
- mysql>INSTALLPLUGINgroup_replicationSONAME'group_replication.so';
4)啟動複製通道
- mysql>STARTGROUP_REPLICATION;
5)檢視叢集成員
- mysql>SELECT*FROMperformance_schema.replication_group_members;
06、叢集驗證
在各個節點都能看到同步的資料,說明叢集搭建成功。
檢視叢集中的主節點
- mysql> SELECT VARIABLE_VALUE FROM performance_schema.global_status
- WHERE VARIABLE_NAME= 'group_replication_primary_member';
效能測試
01、工具選型
對於 MySQL 壓力測試,大多用 sysbench/tpcc-mysql 工具,主要針對資料庫 OLTP(線上事務處理)指標。
在編輯 tpcc-mysql 環境時依賴 mysql_config,MySQL 5.7 版本以後 mysql_config 更換為了 pkg--config,明顯 tpcc-mysql 跟不上節奏。
本文件效能測試工具選用sysbench 1.0.6
02、工具用法
準備測試資料
sysbencholtp_read_write.lua --mysql-host=172.16.200.4 --mysql-port=3306 --mysql-db=test --mysql-user=root --mysql-password=MyNewPass4! --table_size=5000 --tables=10 --threads=300 --time=60 --report-interval=10 prepare |
開始壓測
sysbencholtp_read_write.lua --mysql-host=172.16.200.4 --mysql-port=3306 --mysql-db=test --mysql-user=root --mysql-password=MyNewPass4! --table_size=5000 --tables=10 --threads=300 --time=60 --report-interval=10 run |
清除測試資料
sysbencholtp_read_write.lua --mysql-host=172.16.200.4 --mysql-port=3306 --mysql-db=test --mysql-user=root --mysql-password=MyNewPass4! --table_size=5000 --tables=10 --threads=300 --time=60 --report-interval=10 cleanup |
03、壓測 screen view
準備測試資料
叢集測試
單機測試
04、測試結果
|
tps |
qps |
備註 |
單機 |
576.86 |
11617.78 |
|
叢集(3節點single mode) |
263.48 |
7507.35 |
單個IP讀寫 |
叢集(3節點multi mode) |
307.19 |
8343.02 |
單個IP讀寫 |
調研結果
組複製模式配置比非同步複製,半同步複製簡單便捷,資料同步效率也較高,組複製以外掛形式工作。不管組複製單主還是多主的故障切換都無法讓應用無感知,需要自主實現。