傳統(tǒng)的MySQL復制提供了一個簡單的主從復制方法。一個主節(jié)點,一個或多個從節(jié)點。主節(jié)點執(zhí)行事務、提交事務,然后異步將所作的操作發(fā)送給從節(jié)點,從節(jié)點重放這些操作。所有的節(jié)點默認都具有一個數(shù)據(jù)的完整拷貝。
傳統(tǒng)的 MySQL 主從復制架構(gòu)是 MySQL 保持數(shù)據(jù)一致性的最基本架構(gòu),如下圖所示,從庫給主庫發(fā)起讀數(shù)據(jù)請求后,主庫會通過 dump線程把 binlog 日志文件推送給從庫,從庫的 I/O 線程把接收到數(shù)據(jù)更新到 relay log,之后從庫的 SQL 線程把 relay log 應用為 binlog 日志,直到主庫與從庫的 binlog 日志文件完全數(shù)據(jù)一致,達到主從同步。
該架構(gòu)模式下:應用發(fā)來的事務請求,經(jīng)過執(zhí)行之后寫入 binlog,主庫把 binlog日志推送給從庫,主庫不需要等到從庫是否成功更新數(shù)據(jù)到 relay log,主庫直接提交事務即可。
這種模式犧牲了數(shù)據(jù)一致性,不能很好保證主從數(shù)據(jù)一致性。
除了異步復制,還有半同步復制,它在異步復制基礎上添加了一個同步操作。主節(jié)點需要等待從節(jié)點的ack回復,然后才能提交事務。
一主兩從半同步架構(gòu),應用發(fā)來的事務請求,在主庫執(zhí)行后寫入binlog,主庫把binlog日志推送給兩個從庫,半同步主庫需要等待其中任意一個從庫更新數(shù)據(jù)到relay log成功并且告知主庫,主庫才提交事務,這樣保證至少有一個從庫同步上數(shù)據(jù)了,也縮短了延遲時間,保證了數(shù)據(jù)安全。
該模也存在兩個問題:
MySQL無法自動切換,需要借助外力切庫,運維復雜。
為了解決以上問題,組復制應運而,MGR(MySQL Group Replication)是是MySQL官方推出的一款高可用與高擴展的解決方案,是多個 MySQL Server 節(jié)點共同組成的分布式集群,每個 Server 都有完整的數(shù)據(jù)副本;它是基于 ROW格式的二進制日志文件和 GTID 特性;
MGR提供了高可用、高擴展、高可靠的MySQL集群服務,具有以下特點:
強一致性:基于原生復制和paxos協(xié)議,保證數(shù)據(jù)傳輸?shù)囊恢滦院驮有裕?/span>
高容錯性:只要大多數(shù)節(jié)點沒有出現(xiàn)故障,集群就可對外提供服務;
高擴展性:節(jié)點的加入和移除都是自動的,不需要人為過多干預;
高靈活性:具有單主模式和多主模式,單主模式在主宕機后自動選主,多主模式多節(jié)點寫入。
僅支持InnoDB表,并且每張表一定要有一個主鍵,用于做write set的沖突檢測;
必須打開GTID特性,二進制日志格式必須設置為ROW,用于選主與write set;
COMMIT可能會導致失敗,類似于快照事務隔離級別的失敗場景;
目前一個MGR集群最多支持9個節(jié)點;
不支持外鍵于save point特性,無法做全局間的約束檢測與部分部分回滾;
以下為MGR配置過程實踐,配置安裝MySQL過程此處不再贅述.當前環(huán)境如下:
主機名 | IP | 版本 |
MGR01 | 192.168.79.13 | 8.0.29 |
MGR02 | 192.168.79.14 | 8.0.30 |
MGR03 | 192.168.79.15 | 8.0.31 |
三節(jié)點設置如下參數(shù):
####: for binlog
binlog_format =row
log_bin =/data/mysql-8.0/binary/mysql-bin
binlog_checksum =none
####: for gtid
gtid_mode =on
enforce_gtid_consistency =on
####: for replication
master_info_repository =table
relay_log_info_repository =table
slave_parallel_type =logical_clock
slave_parallel_workers =4
#MGR
plugin_load_add=group_replication.so
transaction_write_set_extraction =XXHASH64
group_replication_group_name ="3db33b36-0e51-409f-a61d-c99756e90155"
group_replication_start_on_boot =off
group_replication_local_address = "192.168.79.159:33061"
group_replication_group_seeds = "192.168.79.157:33061,192.168.79.158:33061,192.168.79.159:33061"
group_replication_bootstrap_group = off
# mgr for multi master
group_replication_single_primary_mode =off
group_replication_enforce_update_everywhere_checks =on
# mgr more set
binlog_transaction_dependency_tracking = WRITESET
配置MGR必須開啟gtid和binlog;
group_replication_group_name 集群名字,各個節(jié)點必須一致可以使用uuidgen生成;
group_replication_local_address 本機ip和端口;
group_replication_group_seeds 組的成員和端口;
group_replication_consistency = BEFORE_ON_PRIMARY_FAILOVER # 當Primary掛了的時候,備選Primary只有把事務全部執(zhí)行完畢,才提供客戶端讀寫操作;
group_replication_flow_control_mode = DISABLED # 關(guān)閉流控,避免業(yè)務高峰觸發(fā)限流。
各個節(jié)點安裝mgr插件及創(chuàng)建用戶:
set sql_log_bin=0;
set global super_read_only=0;
set global read_only=0;
create user rplmgr@192.168.79.1_ identified WITH mysql_native_password by Rep&%set123;
grant replication slave on *.* to rplmgr@%;
FLUSH PRIVILEGES;
install plugin group_replication soname group_replication.so;
show plugins;
change master to master_user=rplmgr, master_password=Rep&%set123 for channel group_replication_recovery;
SET GLOBAL group_replication_bootstrap_group=ON;
start group_replication;
SET persist group_replication_bootstrap_group=off;
SELECT * FROM performance_schema.replication_group_members;
select @@read_only,@@super_read_only;
change master to master_user=rplmgr, master_password=Rep&%set123 for channel group_replication_recovery;
start group_replication;
SET persist group_replication_bootstrap_group=off;
SELECT * FROM performance_schema.replication_group_members;
select @@read_only,@@super_read_only;
第二節(jié)點加入:
第三節(jié)點加入:
MGR當前運行在單主模式下,簡單測試數(shù)據(jù)同步:
在主節(jié)點創(chuàng)建測試數(shù)據(jù):
create database test;
use test;
create table t1(id int not null, name varchar(32), primary key(id));
insert into t1(id, name) values(,張三);
在其余節(jié)點驗證數(shù)據(jù):
手工將主節(jié)點切換到mgr03節(jié)點:
也可以指定主節(jié)點:
如果是已有的系統(tǒng)改造為MGR架構(gòu),需要檢查是否滿足相關(guān)條件。
SELECT table_name
,table_schema
,engine
FROM information_schema.tables
WHERE engine != innodb
AND table_schema NOT IN (mysql, information_schema, performance_schema);
如存在,許改造為innodb引擎表。
SELECT concat(T1.TABLE_SCHEMA,".",T1.TABLE_NAME)
FROM INFORMATION_SCHEMA.COLUMNS T1
JOIN INFORMATION_SCHEMA.TABLES T2 ON T1.TABLE_SCHEMA=T2.TABLE_SCHEMA
AND T1.TABLE_NAME=T2.TABLE_NAME
WHERE T1.TABLE_SCHEMA NOT IN (SYS,
MYSQL,
INFORMATION_SCHEMA,
PERFORMANCE_SCHEMA)
AND T2.TABLE_TYPE=BASE TABLE
GROUP BY T1.TABLE_SCHEMA,
T1.TABLE_NAME HAVING group_concat(COLUMN_KEY) NOT REGEXP PRI|UNI;
如存在需要改造:添加主鍵或唯一約束。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/129349.html
MySQL集群MGR升級實施測試方案 img{ display:block; margin:0 auto !important; width:100%; } body{ width:75%; ...
摘要:屬性是在數(shù)據(jù)庫,表中,點進去,可以看到默認屬性是解決這個問題,就需要修改這個字段的屬性。方法二修改配置的文件在安裝這個版本的的時候,我沒有發(fā)現(xiàn)的配置文件。 showImg(https://segmentfault.com/img/bVXPg9?w=980&h=1246); 數(shù)據(jù)庫版本是5.7.19,在寫語句的時候,只要涉及ORDER BY,就會報錯, ERROR 1055 (42000...
閱讀 1358·2023-01-11 13:20
閱讀 1707·2023-01-11 13:20
閱讀 1215·2023-01-11 13:20
閱讀 1907·2023-01-11 13:20
閱讀 4165·2023-01-11 13:20
閱讀 2759·2023-01-11 13:20
閱讀 1402·2023-01-11 13:20
閱讀 3673·2023-01-11 13:20