1. 程式人生 > >MySQL組複製技術實現與資料庫效能測試工具

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、安裝軟體

資料庫主配檔案定義

  1. datadir=/var/lib/mysql  
  2. socket=/var/lib/mysql/mysql.sock 
  3. report_host = 172.16.200.4 
  4. max_connections = 4096 
  5. # Disabling symbolic-links is recommended to prevent assorted security risks 
  6. symbolic-links=0 
  7. log-error=/var/log/mysqld.log 
  8. pid-file=/var/run/mysqld/mysqld.pid 
  9. server_id=1 
  10. gtid_mode=ON 
  11. enforce_gtid_consistency=ON 
  12. master_info_repository=TABLE 
  13. relay_log_info_repository=TABLE 
  14. binlog_checksum=NONE 
  15. log_slave_updates=ON 
  16. log_bin=binlog 
  17. binlog_format=ROW 
  18. # Group Replication configuration 
  19. transaction_write_set_extraction=XXHASH64 
  20. loose-group_replication_group_name="09f09aca-2ee4-44f7-b4bb-7d5fe32b52a4"  
  21. loose-group_replication_start_on_boot=off 
  22. loose-group_replication_local_address= "172.16.200.4:33061" 
  23. loose-group_replication_group_seeds= "172.16.200.9:33063,172.16.200.4:33061,172.16.200.6:33062" 
  24. loose-group_replication_bootstrap_group= off 
  25. #loose-group_replication_single_primary_mode=FALSE 
  26. #loose-group_replication_enforce_update_everywhere_checks= TRUE 

03、複製授權

進入資料庫

  1. mysql> SET SQL_LOG_BIN=0; 
  2. mysql> CREATE USER [email protected]'%' IDENTIFIED BY 'rpl_pass'; 
  3. mysql> GRANT REPLICATION SLAVE ON *.* TO [email protected]'%'; 
  4. mysql> FLUSH PRIVILEGES; 
  5. mysql> SET SQL_LOG_BIN=1; 
  6. mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='rpl_pass'      FOR CHANNEL 'group_replication_recovery'; 

04、啟動組複製

安裝外掛

  1. INSTALL PLUGIN group_replication SONAME 'group_replication.so';  

 

啟動複製通道

  1. SET GLOBAL group_replication_bootstrap_group=ON; 
  2. START GROUP_REPLICATION; 
  3. SET GLOBAL group_replication_bootstrap_group=OFF; 

檢視叢集成員

  1. mysql> SELECT * FROM performance_schema.replication_group_members; 

建立測試同步資料

  1. mysql> CREATE DATABASE test; 
  2. mysql> USE test; 
  3. mysql> CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 TEXT NOT NULL); 
  4. mysql> INSERT INTO t1 VALUES (1, 'Luis'); 

檢查同步資料和 Binlog

 

05、加入叢集

其餘節點加入叢集

1)先定義主配檔案與主機 hosts

2)建立通道授權

  1. SET SQL_LOG_BIN=0; 
  2. CREATE USER [email protected]'%' IDENTIFIED BY 'rpl_pass' ; 
  3. GRANT REPLICATION SLAVE ON *.* TO [email protected]'%' IDENTIFIED BY 'rpl_pass'; 
  4. SET SQL_LOG_BIN=1; 
  5. CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='rpl_pass'  
  6.     FOR CHANNEL 'group_replication_recovery'; 

3)新增外掛

  1. mysql>INSTALLPLUGINgroup_replicationSONAME'group_replication.so'; 

4)啟動複製通道

  1. mysql>STARTGROUP_REPLICATION; 

5)檢視叢集成員

  1. mysql>SELECT*FROMperformance_schema.replication_group_members; 

06、叢集驗證

在各個節點都能看到同步的資料,說明叢集搭建成功。

 

檢視叢集中的主節點

  1. mysql> SELECT VARIABLE_VALUE FROM performance_schema.global_status
  2. 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讀寫

調研結果

組複製模式配置比非同步複製,半同步複製簡單便捷,資料同步效率也較高,組複製以外掛形式工作。不管組複製單主還是多主的故障切換都無法讓應用無感知,需要自主實現。