在MySQL Group Replication (MGR)架構中,當主庫有數據需要增加新節點時,我們可以用備份恢復的方式新增節點。
但是 MySQL 8.0.17 之后的版本, 可以使用Clone插件新增節點無疑是 最快 ,最高效的方法。
一、前期準備工作
1. 環境檢查與要求
- 版本一致性:確保所有節點運行MySQL 8.0.17或更高版本,且大版本號完全一致
- 存儲引擎:確認所有表使用InnoDB引擎(Group Replication強制要求)
- 網絡帶寬:建議至少1Gbps網絡連接。
- 磁盤空間:新節點磁盤空間足夠,配置建議和源相同。
2. 權限配置
在主庫上創建克隆專用賬號并授權:
CREATE USER 'clone_user'@'%' IDENTIFIED WITH mysql_native_password BY 'Ihxt6gcgi2wL0Bqi';
GRANT BACKUP_ADMIN, CLONE_ADMIN ON *.* TO 'clone_user'@'%';
二、新節點初始化配置
1. 基礎環境準備
參數文件展開
## my.cnf for 8.0版本
[client]
port = 1622
socket = /mysql/data/mysql.sock
[mysql]
prompt = "\u@mysqldb \R:\m:\s [\d]> "
no_auto_rehash
loose-skip-binary-as-hex
[mysqld]
report_host = 10.10.3.53
skip_name_resolve = ON
user = mysql
port = 1622
#主從復制或MGR集群中,server_id記得要不同
#另外,實例啟動時會生成 auto.cnf,里面的 server_uuid 值也要不同
#server_uuid的值還可以自己手動指定,只要符合uuid的格式標準就可以
server_id = 162253
basedir = /mysql/app/mysql
datadir = /mysql/data/
socket = /mysql/data/mysql.sock
pid_file = mysqldb.pid
character_set_server = UTF8MB4
#若你的MySQL數據庫主要運行在境外,請務必根據實際情況調整本參數
default_time_zone = "+8:00"
#啟用admin_port,連接數爆滿等緊急情況下給管理員留個后門
admin_address = '127.0.0.1'
admin_port = 33062
#performance setttings
default_authentication_plugin=mysql_native_password
lock_wait_timeout = 3600
open_files_limit = 65535
back_log = 1024
max_connections = 512
max_connect_errors = 1000000
table_open_cache = 1024
table_definition_cache = 1024
thread_stack = 512K
sort_buffer_size = 4M
join_buffer_size = 4M
read_buffer_size = 8M
read_rnd_buffer_size = 4M
bulk_insert_buffer_size = 64M
thread_cache_size = 768
interactive_timeout = 600
wait_timeout = 600
tmp_table_size = 32M
max_heap_table_size = 32M
#log settings
log_timestamps = SYSTEM
log_error = /mysql/data//error.log
log_error_verbosity = 3
slow_query_log = 1
log_slow_extra = 1
slow_query_log_file = /mysql/data//slow.log
long_query_time = 0.1
log_queries_not_using_indexes = 1
log_throttle_queries_not_using_indexes = 60
min_examined_row_limit = 100
log_slow_admin_statements = 1
log_slow_slave_statements = 1
log_bin = /mysql/data//mybinlog
binlog_format = ROW
sync_binlog = 1 #MGR環境中由其他節點提供容錯性,可不設置雙1以提高本地節點性能
binlog_cache_size = 4M
max_binlog_cache_size = 2G
max_binlog_size = 1G
binlog_rows_query_log_events = 1
binlog_expire_logs_seconds = 604800
#MySQL 8.0.22前,想啟用MGR的話,需要設置binlog_checksum=NONE才行
binlog_checksum = CRC32
gtid_mode = ON
enforce_gtid_consistency = TRUE
#myisam settings
key_buffer_size = 32M
myisam_sort_buffer_size = 128M
#replication settings
relay_log_recovery = 1
slave_parallel_type = LOGICAL_CLOCK
slave_parallel_workers = 64 #可以設置為邏輯CPU數量的2倍
binlog_transaction_dependency_tracking = WRITESET
slave_preserve_commit_order = 1
slave_checkpoint_period = 2
replication_optimize_for_static_plugin_config = ON
replication_sender_observe_commit_only = ON
#mgr settings
loose-plugin_load_add = 'mysql_clone.so'
loose-plugin_load_add = 'group_replication.so'
loose-group_replication_group_name = "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaa1"
#MGR本地節點IP:PORT,請自行替換
loose-group_replication_local_address = "10.10.3.53:33061"
#MGR集群所有節點IP:PORT,請自行替換
loose-group_replication_group_seeds = "10.10.3.51:33061,10.10.3.52:33061,10.10.3.53:33061"
loose-group_replication_start_on_boot = OFF
loose-group_replication_bootstrap_group = OFF
loose-group_replication_exit_state_action = READ_ONLY
loose-group_replication_flow_control_mode = "DISABLED"
loose-group_replication_single_primary_mode = ON
loose-group_replication_communication_max_message_size = 10M
loose-group_replication_unreachable_majority_timeout = 30
loose-group_replication_member_expel_timeout = 5
loose-group_replication_autorejoin_tries = 288
loose-group_replication_enforce_update_everywhere_checks = OFF
#innodb settings
transaction_isolation = REPEATABLE-READ
innodb_buffer_pool_size = 45056M
innodb_buffer_pool_instances = 4
innodb_data_file_path = ibdata1:12M:autoextend
innodb_flush_log_at_trx_commit = 1 #MGR環境中由其他節點提供容錯性,可不設置雙1以提高本地節點性能
innodb_log_buffer_size = 32M
innodb_log_file_size = 1G #如果線上環境的TPS較高,建議加大至1G以上,如果壓力不大可以調小
innodb_log_files_in_group = 3
loose-innodb_redo_log_capacity = 3G
innodb_max_undo_log_size = 4G
# 根據您的服務器IOPS能力適當調整
# 一般配普通SSD盤的話,可以調整到 10000 - 20000
# 配置高端PCIe SSD卡的話,則可以調整的更高,比如 50000 - 80000
innodb_io_capacity = 4000
innodb_io_capacity_max = 8000
innodb_open_files = 65535
innodb_flush_method = O_DIRECT
innodb_lru_scan_depth = 4000
innodb_lock_wait_timeout = 10
innodb_rollback_on_timeout = 1
innodb_print_all_deadlocks = 1
innodb_online_alter_log_max_size = 4G
innodb_print_ddl_logs = 1
innodb_status_file = 1
#注意: 開啟 innodb_status_output & innodb_status_output_locks 后, 可能會導致log_error文件增長較快
innodb_status_output = 0
innodb_status_output_locks = 1
innodb_sort_buffer_size = 67108864
innodb_adaptive_hash_index = OFF
#提高索引統計信息精確度
innodb_stats_persistent_sample_pages = 500
innodb_adaptive_hash_index = 0
loose-sql_generate_invisible_primary_key = ON
#innodb monitor settings
innodb_monitor_enable = "module_innodb"
innodb_monitor_enable = "module_server"
innodb_monitor_enable = "module_dml"
innodb_monitor_enable = "module_ddl"
innodb_monitor_enable = "module_trx"
innodb_monitor_enable = "module_os"
innodb_monitor_enable = "module_purge"
innodb_monitor_enable = "module_log"
innodb_monitor_enable = "module_lock"
innodb_monitor_enable = "module_buffer"
innodb_monitor_enable = "module_index"
innodb_monitor_enable = "module_ibuf_system"
innodb_monitor_enable = "module_buffer_page"
#innodb_monitor_enable = "module_adaptive_hash"
#pfs settings
performance_schema = 1
#performance_schema_instrument = '%memory%=on'
loose-performance_schema_instrument = '%lock%=on'
[mysqldump]
quick
2. 初始化數據目錄
mysqld --defaults-file=/mysql/conf/my.cnf --initialize --user=mysql --basedir=/mysql/app/mysql --datadir=/mysql/data/
啟動
mysqld_safe --defaults-file=/mysql/conf/my.cnf --user=mysql &
登陸、改密碼
cat /mysql/data/error.log | grep password
cat /mysql/data/error.log | grep 'temporary password is' | grep -o 'root@localhost: .*' | awk '{print $2}'
此處通過sock登陸
mysql -uroot -p -P 1622 -S /mysql/data/mysql.sock
alter user root@'localhost' identified with mysql_native_password by 'GKmVGe1dOZGJ8DYTb5zuFCDmtpAi2eG';
flush privileges;
三、執行克隆操作
1. 在新節點安裝Clone插件
SHOW PLUGINS;
INSTALL PLUGIN clone SONAME 'mysql_clone.so';

2. 設置克隆源
SET GLOBAL clone_valid_donor_list = '10.10.3.51:1622';
3. 啟動克隆過程
CLONE INSTANCE FROM 'clone_user'@'10.10.3.51':1622 IDENTIFIED BY 'Ihxt6gcgi2wL0Bqi';
or
--指定路徑
CLONE INSTANCE FROM 'clone_user'@'10.10.3.51':1622
IDENTIFIED BY 'Ihxt6gcgi2wL0Bqi'
DATA DIRECTORY = '/mysql/data/';

重要說明:
- 克隆過程會自動覆蓋新節點的數據目錄
- 完成后MySQL服務會自動重啟
- 可通過以下命令監控進度:
SELECT STATE, BEGIN_TIME, END_TIME FROM performance_schema.clone_status;

可以看到用戶都復制過來了

四、加入MGR集群
1. 配置白名單
在所有現有節點和新節點上執行:(可選)
SET GLOBAL group_replication_ip_whitelist='10.10.3.51,10.10.3.52,10.10.3.53';
or
SET GLOBAL group_replication_ip_whitelist='10.10.3.0/24'; 或者使用CIDR表示法(如果IP在同一子網):
2、 加入集群
在線修改、每臺機器都修改參數
1) 先全局修改下
SET GLOBAL group_replication_group_seeds='10.10.3.51:33061,10.10.3.52:33061,10.10.3.53:33061';
2) 參數文件修改
loose-group_replication_group_seeds = "10.10.3.51:33061,10.10.3.52:33061,10.10.3.53:33061"
3、開啟新節點復制
– 啟動組復制 --這里注意防火墻策略
start group_replication;
select * from performance_schema.replication_group_members;
select @@read_only,@@super_read_only;

4. 驗證節點狀態
SELECT
MEMBER_HOST,
MEMBER_PORT,
MEMBER_STATE,
MEMBER_ROLE
FROM performance_schema.replication_group_members;
正常狀態下應顯示新節點為ONLINE狀態。

5、監控轉態
SELECT MEMBER_ID AS id, COUNT_TRANSACTIONS_IN_QUEUE AS trx_tobe_certified,
COUNT_TRANSACTIONS_REMOTE_IN_APPLIER_QUEUE AS relaylog_tobe_applied,
COUNT_TRANSACTIONS_CHECKED AS trx_chkd, COUNT_TRANSACTIONS_REMOTE_APPLIED AS trx_done,
COUNT_TRANSACTIONS_LOCAL_PROPOSED AS proposed
FROM performance_schema.replication_group_member_stats;

relaylog_tobe_applied 的值表示遠程事務寫到relay log后,等待回放的事務隊列,trx_tobe_certified 表示等待被認證的事務隊列大小,這二者任何一個值大于0,都表示當前有一定程度的延遲。
「喜歡這篇文章,您的關注和贊賞是給作者最好的鼓勵」
關注作者
【版權聲明】本文為墨天輪用戶原創內容,轉載時必須標注文章的來源(墨天輪),文章鏈接,文章作者等基本信息,否則作者和墨天輪有權追究責任。如果您發現墨天輪中有涉嫌抄襲或者侵權的內容,歡迎發送郵件至:contact@modb.pro進行舉報,并提供相關證據,一經查實,墨天輪將立刻刪除相關內容。




