docker mysql MGR 集群

簡介

MySQL Group Replication(簡稱MGR)字面意思是mysql組復(fù)制的意思,但其實他是一個高可用的集群架構(gòu),暫時只支持mysql5.7和mysql8.0版本.

是MySQL官方于2016年12月推出的一個全新的高可用與高擴展的解決方案,提供了高可用训挡、高擴展毯辅、高可靠的MySQL集群服務(wù).

也是mysql官方基于組復(fù)制概念并充分參考MariaDB Galera Cluster和Percona XtraDB Cluster結(jié)合而來的新的高可用集群架構(gòu).

MySQL Group Replication是建立在基于Paxos的XCom之上的,正因為有了XCom基礎(chǔ)設(shè)施暂氯,保證數(shù)據(jù)庫狀態(tài)機在節(jié)點間的事務(wù)一致性罕袋,才能在理論和實踐中保證數(shù)據(jù)庫系統(tǒng)在不同節(jié)點間的事務(wù)一致性改淑。

由一般主從復(fù)制概念擴展,多個節(jié)點共同組成一個數(shù)據(jù)庫集群,事務(wù)的提交必須經(jīng)過半數(shù)以上節(jié)點同意方可提交,在集群中每個節(jié)點上都維護一個數(shù)據(jù)庫狀態(tài)機浴讯,保證節(jié)點間事務(wù)的一致性朵夏。

優(yōu)點:

高一致性,基于原生復(fù)制及paxos協(xié)議的組復(fù)制技術(shù).

高容錯性榆纽,有自動檢測機制仰猖,當(dāng)出現(xiàn)宕機后,會自動剔除問題節(jié)點,其他節(jié)點可以正常使用(類似zk集群),當(dāng)不同節(jié)點產(chǎn)生資源爭用沖突時,會按照先到先得處理,并且內(nèi)置了自動化腦裂防護機制.

高擴展性,可隨時在線新增和移除節(jié)點,會自動同步所有節(jié)點上狀態(tài)奈籽,直到新節(jié)點和其他節(jié)點保持一致饥侵,自動維護新的組信息.

高靈活性,直接插件形式安裝(5.7.17后自帶.so插件),有單主模式和多主模式衣屏,單主模式下躏升,只有主庫可以讀寫,其他從庫會加上super_read_only狀態(tài),只能讀取不可寫入,出現(xiàn)故障會自動選主.

缺點:

還是太新,不太穩(wěn)定,暫時性能還略差于PXC,對網(wǎng)絡(luò)穩(wěn)定性要求很高,至少是同機房做.

  • 多主模式下最好有三臺以上的節(jié)點,單主模式則視實際情況而定,不過同個Group最多節(jié)點數(shù)為9.服務(wù)器配置盡量保持一致,因為和PXC一樣,也會有"木桶短板效應(yīng)".
  • 需要特別注意,mysql數(shù)據(jù)庫的服務(wù)端口號和MGR的服務(wù)端口不是一回事,需要區(qū)分開來.

首先我們來配置 多主集群

我們準(zhǔn)備了三個docker容器,在此之前設(shè)置了一個network狼忱,便于容器間的互聯(lián)(mysql版本皆是8.0.13)
docker network create mysql_group

network:group1,username=root,password=root,port=3306,MGR_port=33066

docker命令:
docker run --name mysql_group1 -v D:\my-project\docker-mysql\group1\datadir:/var/lib/mysql -v D:\my-project\docker-mysql\group1\conf\my.cnf:/etc/mysql/my.cnf -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 --network mysql_group --network-alias group1 -d mysql

network:group2,username=root,password=root,port=3306,MGR_port=33066

docker命令:
docker run --name mysql_group2 -v D:\my-project\docker-mysql\group2\datadir:/var/lib/mysql -v D:\my-project\docker-mysql\group2\conf\my.cnf:/etc/mysql/my.cnf -e MYSQL_ROOT_PASSWORD=root -p 3307:3306 --network mysql_group --network-alias group2 -d mysql

network:group3,username=root,password=root,port=3306,MGR_port=33066

docker命令:
docker run --name mysql_group3 -v D:\my-project\docker-mysql\group3\datadir:/var/lib/mysql -v D:\my-project\docker-mysql\group3\conf\my.cnf:/etc/mysql/my.cnf -e MYSQL_ROOT_PASSWORD=root -p 3308:3306 --network mysql_group --network-alias group3 -d mysql

我在本地掛載了 mysql 的配置文件 以及datadir膨疏,datadir是空的, my.cnf的內(nèi)容如下

[mysqld]
# 開啟GTID,必須開啟
gtid_mode=on
# 強制GTID的一致性
enforce-gtid-consistency=on
# binlog格式,MGR要求必須是ROW,不過就算不是MGR,也最好用row
binlog_format=row
# server-id必須是唯一的
server-id=1
# MGR使用樂觀鎖,所以官網(wǎng)建議隔離級別是RC,減少鎖粒度
transaction_isolation=READ-COMMITTED
# 因為集群會在故障恢復(fù)時互相檢查binlog的數(shù)據(jù),
# 所以需要記錄下集群內(nèi)其他服務(wù)器發(fā)過來已經(jīng)執(zhí)行過的binlog,按GTID來區(qū)分是否執(zhí)行過.
log-slave-updates=1
# binlog校驗規(guī)則,5.6之后的高版本是CRC32,低版本都是NONE,但是MGR要求使用NONE
binlog_checksum=NONE
# 基于安全的考慮,MGR集群要求復(fù)制模式要改成slave記錄記錄到表中,不然就報錯
master_info_repository=TABLE
# 同上配套
relay_log_info_repository=TABLE
# 記錄事務(wù)的算法,官網(wǎng)建議設(shè)置該參數(shù)使用 XXHASH64 算法
transaction_write_set_extraction = XXHASH64
# 相當(dāng)于此GROUP的名字,是UUID值,不能和集群內(nèi)其他GTID值的UUID混用,可用uuidgen來生成一個新的,
# 主要是用來區(qū)分整個內(nèi)網(wǎng)里邊的各個不同的GROUP,而且也是這個group內(nèi)的GTID值的UUID
loose-group_replication_group_name = 'cc5e2627-2285-451f-86e6-0be21581539f'
#是否隨服務(wù)器啟動而自動啟動組復(fù)制,不建議直接啟動,怕故障恢復(fù)時有擾亂數(shù)據(jù)準(zhǔn)確性的特殊情況
loose-group_replication_start_on_boot = OFF
# 本地MGR的IP地址和端口钻弄,host:port,是MGR的端口,不是數(shù)據(jù)庫的端口
loose-group_replication_local_address = 'group1:33066'
# 需要接受本MGR實例控制的服務(wù)器IP地址和端口,是MGR的端口,不是數(shù)據(jù)庫的端口
loose-group_replication_group_seeds = 'group2:33066,group3:33066,group1:33066'
# 開啟引導(dǎo)模式,添加組成員佃却,用于第一次搭建MGR或重建MGR的時候使用,只需要在集群內(nèi)的其中一臺開啟,
loose-group_replication_bootstrap_group = OFF
# 是否啟動單主模式,如果啟動窘俺,則本實例是主庫饲帅,提供讀寫,其他實例僅提供讀,如果為off就是多主模式了
loose-group_replication_single_primary_mode = off
# 多主模式下,強制檢查每一個實例是否允許該操作,如果不是多主,可以關(guān)閉
loose-group_replication_enforce_update_everywhere_checks = on

log-bin=mysql-bin
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
datadir         = /var/lib/mysql
secure-file-priv= NULL
default_authentication_plugin=mysql_native_password
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

# Custom config should go here
!includedir /etc/mysql/conf.d/

注意:

server-id瘤泪,loose-group_replication_local_address 不同數(shù)據(jù)庫是不同的灶泵,其余要保持相同,
host后面跟的端口號是自定義的对途,只要保證和本機的端口不沖突就好


進入group1 來引導(dǎo)啟動我們的集群
  • MGR在mysql5.7.17版本之后就都是自帶插件了,只是沒有安裝上而已,和半同步插件一個套路,所以默認是沒有選項丘逸。
  • 所有集群內(nèi)的服務(wù)器都必須安裝MGR插件才能正常使用該功能。
  • 查找插件位置掀宋,show variables like 'plugin_dir'; 搜索一下我們需要的MGR插件group_replication.so是否存在 ( 本文不討論不存在的情況)
  • 重新進入mysql 開始安裝插件深纲,install PLUGIN group_replication SONAME 'group_replication.so';
  • 檢查是否安裝成功
mysql> show plugins;
+----------------------------+----------+--------------------+----------------------+---------+
| Name                       | Status   | Type               | Library              | License |
+----------------------------+----------+--------------------+----------------------+---------+
    .
    .
    .
| group_replication          | ACTIVE   | GROUP REPLICATION  | group_replication.so | GPL     |
+----------------------------+----------+--------------------+----------------------+---------+
  • 執(zhí)行 show variables like 'group%';會發(fā)現(xiàn)有很多相關(guān)的參數(shù)了
  • 開始執(zhí)行引導(dǎo)
#啟動引導(dǎo),注意,只有這套開啟引導(dǎo),其他兩臺都請忽略這一步
mysql> set global group_replication_bootstrap_group=ON;
#創(chuàng)建一個用戶來做同步的用戶,并授權(quán),所有集群內(nèi)的服務(wù)器都需要做
mysql> create user 'group'@'%' identified by 'group';
mysql> grant REPLICATION SLAVE on *.* to 'group'@'%' with grant option;
#清空所有舊的GTID信息,避免沖突
mysql> reset master;
#創(chuàng)建同步規(guī)則認證信息,就是剛才授權(quán)的那個用戶,和一般的主從規(guī)則寫法不太一樣
mysql> CHANGE MASTER TO MASTER_USER='group', MASTER_PASSWORD='group' FOR CHANNEL 'group_replication_recovery';
#啟動MGR
mysql> start group_replication;
#查看是否啟動成功,看到online就是成功了
mysql> select* from performance_schema.replication_group_members;
#這個時候,就可以先關(guān)閉引導(dǎo)了
mysql> set global group_replication_bootstrap_group=OFF;
  • 另外兩臺服務(wù)器也是照葫蘆畫瓢 只不過少了引導(dǎo)這一步仲锄,直接創(chuàng)建用戶,創(chuàng)建規(guī)則湃鹊,start group_replication就可以了
  • 至此
mysql> select * from performance_schema.replication_group_members;
+---------------------------+--------------------------------------+--------------+-------------+--------------+-------------+----------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST  | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION |
+---------------------------+--------------------------------------+--------------+-------------+--------------+-------------+----------------+
| group_replication_applier | 4d62b085-e255-11e8-b647-0242ac140002 | b8856ec7be3d |        3306 | ONLINE       | PRIMARY     | 8.0.13         |
| group_replication_applier | 6314d357-e255-11e8-8be1-0242ac140003 | d5e19f805db4 |        3306 | ONLINE       | PRIMARY     | 8.0.13         |
| group_replication_applier | 731bb817-e255-11e8-9cdc-0242ac140004 | 8720afb1301e |        3306 | ONLINE       | PRIMARY     | 8.0.13         |
+---------------------------+--------------------------------------+--------------+-------------+--------------+-------------+----------------+
3 rows in set (0.01 sec)

注意:

  • 如果其中一臺出現(xiàn)了故障集群則是會直接提出集群儒喊,并不會表現(xiàn)在這張表上
  • 故障數(shù)據(jù)庫重啟后,需要登錄重新執(zhí)行start group_replication;此條命令加入集群

明天搭建 1主多從集群

參考
http://blog.51cto.com/arthur376/2114026

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末币呵,一起剝皮案震驚了整個濱河市怀愧,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌余赢,老刑警劉巖芯义,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異妻柒,居然都是意外死亡扛拨,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進店門举塔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來绑警,“玉大人,你說我怎么就攤上這事央渣〖坪校” “怎么了?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵芽丹,是天一觀的道長北启。 經(jīng)常有香客問我,道長拔第,這世上最難降的妖魔是什么咕村? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮楼肪,結(jié)果婚禮上培廓,老公的妹妹穿的比我還像新娘惹悄。我一直安慰自己春叫,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布泣港。 她就那樣靜靜地躺著暂殖,像睡著了一般。 火紅的嫁衣襯著肌膚如雪当纱。 梳的紋絲不亂的頭發(fā)上呛每,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天,我揣著相機與錄音坡氯,去河邊找鬼晨横。 笑死洋腮,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的手形。 我是一名探鬼主播啥供,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼库糠!你這毒婦竟也來了伙狐?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤瞬欧,失蹤者是張志新(化名)和其女友劉穎贷屎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體艘虎,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡唉侄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了顷帖。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片美旧。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖贬墩,靈堂內(nèi)的尸體忽然破棺而出榴嗅,到底是詐尸還是另有隱情,我是刑警寧澤陶舞,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布嗽测,位于F島的核電站,受9級特大地震影響肿孵,放射性物質(zhì)發(fā)生泄漏唠粥。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一停做、第九天 我趴在偏房一處隱蔽的房頂上張望晤愧。 院中可真熱鬧,春花似錦蛉腌、人聲如沸官份。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽舅巷。三九已至,卻和暖如春河咽,著一層夾襖步出監(jiān)牢的瞬間钠右,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工忘蟹, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留飒房,地道東北人搁凸。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像狠毯,于是被迫代替她去往敵國和親坪仇。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內(nèi)容