1. 程式人生 > >MySQL Group Replication初測

MySQL Group Replication初測

MySQL Group Replication

對測試版(on labs)的Group Replication的第一印象:這個MySQL外掛讓多主結構的MySQL叢集能夠進行全更新(update everywhere)。
它糅合了分散式系統(比如組通訊)和RDBMS中replication的技術和概念。
通過這個外掛,一組MySQL伺服器組成了一個完美的分散式、強一致性的叢集,叢集內的MySQL伺服器共同合作來保持叢集的一致性.

什麼是Group Replication

基於組的複製(Group-based Replication)是一種被使用在容錯系統中的技術。Replication-group(複製組)是由能夠相互通訊的多個伺服器(節點)組成的。
在通訊層,Group replication實現了一系列的機制:比如原子訊息(atomic message delivery)和全序化訊息(total ordering of messages)。
這些原子化,抽象化的機制,為實現更先進的資料庫複製方案提供了強有力的支援。

MySQL Group Replication正是基於這些技術和概念,實現了一種多主全更新的複製協議。
簡而言之,一個Replication-group就是一組節點,每個節點都可以獨立執行事務,而讀寫事務則會在於group內的其他節點進行協調之後再commit。
因此,當一個事務準備提交時,會自動在group內進行原子性的廣播,告知其他節點變更了什麼內容/執行了什麼事務。
這種原子廣播的方式,使得這個事務在每一個節點上都保持著同樣順序。
這意味著每一個節點都以同樣的順序,接收到了同樣的事務日誌,所以每一個節點以同樣的順序重演了這些事務日誌,最終整個group保持了完全一致的狀態。

然而,不同的節點上執行的事務之間有可能存在資源爭用。這種現象容易出現在兩個不同的併發事務上。
假設在不同的節點上有兩個併發事務,更新了同一行資料,那麼就會發生資源爭用。
面對這種情況,Group Replication判定先提交的事務為有效事務,會在整個group裡面重演,後提交的事務會直接中斷,或者回滾,最後丟棄掉。

因此,這也是一個無共享的複製方案,每一個節點都儲存了完整的資料副本。圖1也描述了具體的工作流程,能夠簡潔的和其他方案進行對比。
這個複製方案,在某種程度上,和資料庫狀態機(DBSM)的Replication方法比較類似。

image

Group Replication簡單構架圖:
image

早期Group Replication資料同步引擎採用的是第三方的corosync,最新的版本中已經需要corosync了,完全整合到mysql中了。

安裝配置Group Replication

節點資訊

servername ip port group port
server01 127.0.0.1 3306 6606
server02 127.0.0.1 3307 6607
server03 127.0.0.1 3308 6608

系統環境:

系統:CentOS release 6.3 (Final)

記憶體:32G

mysql5.7安裝

解壓安裝包

[root@mser02 local]# tar -zxvf mysql-5.7.15-labs-gr090-linux-glibc2.5-x86_64.tar.gz

[root@mser02 local]# mv mysql-5.7.15-labs-gr090-linux-glibc2.5-x86_64 mysql5.7

[root@mser02 local]# cd mysql5.7/

初始化資料

[server01]

./bin/mysqld --no-defaults --user=mysql --initialize --explicit_defaults_for_timestamp --basedir=/usr/local/mysql5.7/ --datadir=/usr/local/mysql5.7/data01

[server02]

./bin/mysqld --no-defaults --user=mysql --initialize --explicit_defaults_for_timestamp --basedir=/usr/local/mysql5.7/ --datadir=/usr/local/mysql5.7/data02

[server03]

./bin/mysqld --no-defaults --user=mysql --initialize --explicit_defaults_for_timestamp --basedir=/usr/local/mysql5.7/ --datadir=/usr/local/mysql5.7/data03

編輯配置檔案

[my1.cnf]

[mysqld]
#base config 基礎配置資訊
server-id = 1
basedir=/usr/local/mysql5.7/
datadir=/usr/local/mysql5.7/data01
user=mysql
explicit_defaults_for_timestamp
socket=mysql1.sock
port = 3306

#binlog binlog配置,Group Replication是要根據GTID來進行同步的,所以需要開啟GTID
log-bin=mysql-bin
binlog-format = ROW
gtid-mode = ON
enforce-gtid-consistency = ON
log-slave-updates = ON
master-info-repository = TABLE
relay-log-info-repository = TABLE
binlog-checksum = NONE

#group replication
transaction-write-set-extraction = XXHASH64
group_replication_start_on_boot = OFF
group_replication_bootstrap_group = OFF
group_replication_group_name = 0c6d3e5f-90e2-11e6-802e-842b2b5909d6
group_replication_local_address = '127.0.0.1:6606'
group_replication_group_seeds = '127.0.0.1:6607,127.0.0.1:6608'

引數說明:

group_replication_start_on_boot 是否隨mysql啟動Group Replication
group_replication_bootstrap_group 是否是Group Replication的引導節點,初次搭建叢集的時候需要有一個節點設定為ON來啟動Group Replication
group_replication_group_name的值必須是uuid格式,uuid獲取方法:

mysql> select uuid();
+--------------------------------------+
| uuid()                               |
+--------------------------------------+
| 94318aa8-91c2-11e6-a1cf-842b2b5909d6 |
+--------------------------------------+
1 row in set (0.00 sec)

group_replication_local_address 組中本機連結的資訊格式為ipaddress:port
group_replication_group_seeds 組中其他幾點的資訊格式為ipaddress1:port1,ipaddress2:port2

其他例項配置檔案

[my2.cnf]

[mysqld]
#base config
server-id = 2
basedir=/usr/local/mysql5.7/
datadir=/usr/local/mysql5.7/data02
user=mysql
explicit_defaults_for_timestamp
socket=mysql2.sock
port = 3307

#binlog
log-bin=mysql-bin
binlog-format = ROW
gtid-mode = ON
enforce-gtid-consistency = ON
log-slave-updates = ON
master-info-repository = TABLE
relay-log-info-repository = TABLE
binlog-checksum = NONE

#group replication
transaction-write-set-extraction = XXHASH64
group_replication_start_on_boot = OFF
group_replication_bootstrap_group = OFF
group_replication_group_name = 0c6d3e5f-90e2-11e6-802e-842b2b5909d6
group_replication_local_address = '127.0.0.1:6607'
group_replication_group_seeds = '127.0.0.1:6606,127.0.0.1:6608'

[my3.cnf]

[mysqld]
#base config
server-id = 3
basedir=/usr/local/mysql5.7/
datadir=/usr/local/mysql5.7/data03
user=mysql
explicit_defaults_for_timestamp
socket=mysql3.sock
port = 3308

#binlog
log-bin=mysql-bin
binlog-format = ROW
gtid-mode = ON
enforce-gtid-consistency = ON
log-slave-updates = ON
master-info-repository = TABLE
relay-log-info-repository = TABLE
binlog-checksum = NONE

#group replication
transaction-write-set-extraction = XXHASH64
group_replication_start_on_boot = OFF
group_replication_bootstrap_group = OFF
group_replication_group_name = 0c6d3e5f-90e2-11e6-802e-842b2b5909d6
group_replication_local_address = '127.0.0.1:6608'
group_replication_group_seeds = '127.0.0.1:6606,127.0.0.1:6607'

啟動mysql例項

[server01]

./bin/mysqld --defaults-file=/usr/local/mysql5.7/my1.cnf

[server02]

./bin/mysqld --defaults-file=/usr/local/mysql5.7/my2.cnf

[server03]

./bin/mysqld --defaults-file=/usr/local/mysql5.7/my3.cnf

啟動後注意修改一下初始的root密碼:

./bin/mysql -uroot -p -P3306 -h127.0.0.1 password "new_pwd"

安裝Group Replication外掛

INSTALL PLUGIN group_replication SONAME 'group_replication.so';
mysql> show plugins;
+----------------------------+----------+--------------------+----------------------+---------+
| Name                       | Status   | Type               | Library              | License |
+----------------------------+----------+--------------------+----------------------+---------+
| binlog                     | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |
(…………)
| group_replication          | ACTIVE   | GROUP REPLICATION  | group_replication.so | GPL     |
+----------------------------+----------+--------------------+----------------------+---------+

注:或者在配置檔案中直接配置

plugin-load = group_replication.so

組建叢集

配置引導節點

首先在[server01]中進行如下配置:

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

注:使用SET SQL_LOG_BIN=0;來保證建立使用者的操作不記錄到binlog中,這麼做可以避免其他服務加入時報事務衝突錯誤。

2016-10-13T07:59:37.025099Z 0 [ERROR] Plugin group_replication reported: 'The member contains transactions not present in the group. The member will now exit the group.'

啟動Group Replication:

SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;

注:group_replication_bootstrap_group引數設定為ON,是為了標示以後加入叢集的伺服器都已這臺伺服器為基準。以後加入的就不需要進行設定。

Group Replication啟動成功後,可以通過如下方式檢視到節點資訊了。

mysql> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| group_replication_applier | a876d35e-9110-11e6-a365-842b2b5909d6 | mser01      |        3306 | ONLINE       |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
1 rows in set (0.00 sec)

其他節點加入Group

在[server02]、[server03]上執行如下操作:

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

啟動Group Rplication

START GROUP_REPLICATION;

啟動完成之後在看Group資訊:

mysql> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| group_replication_applier | 0aab37dc-911c-11e6-ab03-842b2b5909d6 | mser01      |        3308 | ONLINE       |
| group_replication_applier | a876d35e-9110-11e6-a365-842b2b5909d6 | mser01      |        3306 | ONLINE       |
| group_replication_applier | b34df071-911a-11e6-9796-842b2b5909d6 | mser01      |        3307 | ONLINE       |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
3 rows in set (0.00 sec)

可以查詢replication協議的其他資料。比如佇列中有多少個事務,以及檢測到的資源爭用:

mysql> select * from performance_schema.replication_group_member_stats\G
*************************** 1. row ***************************
                      CHANNEL_NAME: group_replication_applier
                           VIEW_ID: 14763420898745772:29
                         MEMBER_ID: a876d35e-9110-11e6-a365-842b2b5909d6
       COUNT_TRANSACTIONS_IN_QUEUE: 0
        COUNT_TRANSACTIONS_CHECKED: 0
          COUNT_CONFLICTS_DETECTED: 0
COUNT_TRANSACTIONS_ROWS_VALIDATING: 0
TRANSACTIONS_COMMITTED_ALL_MEMBERS: 0aab37dc-911c-11e6-ab03-842b2b5909d6:1,
0c6d3e5f-90e2-11e6-802e-842b2b5909d6:1-27,
a876d35e-9110-11e6-a365-842b2b5909d6:1-3,
b34df071-911a-11e6-9796-842b2b5909d6:1
    LAST_CONFLICT_FREE_TRANSACTION: 
1 row in set (0.00 sec)

寫入測試

這樣一個初步的叢集就搭建完成了,可以進行基本操作測試了:

在[server01]上執行如下語句:

mysql> create database bobo;
Query OK, 1 row affected (0.00 sec)

mysql> use bobo;
Database changed
mysql> create table test (id int primary key,name varchar(20));
Query OK, 0 rows affected (0.23 sec)

mysql> insert into test (id,name) values (1,'aaaa');
Query OK, 1 row affected (0.06 sec)

mysql> insert into test (id,name) values (2,'bbbb');
Query OK, 1 row affected (0.05 sec)

mysql> insert into test (id,name) values (3,'cccc');
Query OK, 1 row affected (0.03 sec)

mysql> select * from test;
+----+------+
| id | name |
+----+------+
|  1 | aaaa |
|  2 | bbbb |
|  3 | cccc |
+----+------+
3 rows in set (0.00 sec)

在[server02][server03]上查詢:
[server02]

mysql> use bobo;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> select * from test;
+----+------+
| id | name |
+----+------+
|  1 | aaaa |
|  2 | bbbb |
|  3 | cccc |
+----+------+
3 rows in set (0.00 sec)

[server03]

mysql> use bobo;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> select * from test;
+----+------+
| id | name |
+----+------+
|  1 | aaaa |
|  2 | bbbb |
|  3 | cccc |
+----+------+
3 rows in set (0.00 sec)

再在[server02]上執行如下語句:

mysql> insert into test (id,name) values (4,'dddd');
ERROR 1290 (HY000): The MySQL server is running with the --super-read-only option so it cannot execute this statement
mysql> show variables like '%read_only%';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| innodb_read_only | OFF   |
| read_only        | ON    |
| super_read_only  | ON    |
| tx_read_only     | OFF   |
+------------------+-------+
4 rows in set (0.00 sec)

mysql> set global read_only=OFF;
Query OK, 0 rows affected (0.00 sec)

mysql> set global super_read_only=OFF;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into test (id,name) values (4,'dddd');
Query OK, 1 row affected (0.04 sec)

注:在新加入Group的節點中,預設會開啟read_only和super_read_only,要最這個節點進行修改前,要關閉這兩個選項。

在[server01]、[server03]上查詢結果:

mysql> select * from test;
+----+------+
| id | name |
+----+------+
|  1 | aaaa |
|  2 | bbbb |
|  3 | cccc |
|  4 | dddd |
+----+------+
4 rows in set (0.00 sec)

再在[server03]上執行如下語句:

mysql> update test set name='ddaa' where id=4;
Query OK, 1 row affected (0.06 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from test;
+----+------+
| id | name |
+----+------+
|  1 | aaaa |
|  2 | bbbb |
|  3 | cccc |
|  4 | ddaa |
+----+------+
4 rows in set (0.00 sec)

在[server01]、[server02]上查詢結果:

mysql> select * from test;
+----+------+
| id | name |
+----+------+
|  1 | aaaa |
|  2 | bbbb |
|  3 | cccc |
|  4 | ddaa |
+----+------+
4 rows in set (0.00 sec)

從以上測試可以看出,叢集中沒有節點中都可以進行寫入,並且可以同步至叢集中的其他節點。這也說明Group Replication可以拓展寫操作。

補充:

MySQL Group Replicaiton預設也不是允許所有節點寫入的,初始時叢集中只保留一個可寫節點(master),其餘節點的read_only/super_read_only引數都設定為ON。當master因故障down掉之後,組中的仲裁元件會選取一個節點將read_only/super_read_only設定成OFF,讓這個節點充當master節點。
正好OneProxy中可以根據後端節點“read_only”的值來區分master和slave(http://www.onexsoft.com/zh/oneproxy-auto-readonly.html),那麼Group Replication可以和OneProxy結合來實現更靈活的讀寫分離負載。

相關推薦

MySQL Group Replication

MySQL Group Replication 對測試版(on labs)的Group Replication的第一印象:這個MySQL外掛讓多主結構的MySQL叢集能夠進行全更新(update everywhere)。 它糅合了分散式系統(比如組通訊)

MySQL group replication介紹

group replication“MySQL group replication”group replication是MySQL官方開發的一個開源插件,是實現MySQL高可用集群的一個工具。第一個GA版本正式發布於MySQL5.7.17中;想要使用group replication只需要從官網上下載MySQ

MySQL group replication

出現 上下 art 處理 自動創建 mit 排序 主從 同時 本篇文章主要講解MySQL group replication介紹,文中有關MySQL,group的內容,希望對大家有所幫助。 “MySQL group replication” group replicatio

Mysql Group Replication 簡介及單主模式組復制配置【轉】

ror ipv4 mysql命令 value tail force action dmi where 一 Mysql Group Replication簡介 Mysql Group Replication(MGR)是一個全新的高可用和高擴張的MySQL集群服務。

Mysql Group Replication 簡析

group http 9.png tex 圖片 關於 clas png src 前段時間做了組內分享,寫的關於mysql Group Replication 文章             3, 高擴展     

MySQL Group Replication(多主同步復制MGR)

update mod src xtra sla class replicat local trac 開啟replication配置: server-id=1 #標識服務器唯一 log-bin=mys

MySQL Group Replication (MGR) 安裝

exit ever 信息采集 false 操作記錄 create .so lob 一個 MySQL Group Replication 安裝 192.168.10.65192.168.10.66192.168.10.67 OS : CentOS 7.4mysql soft

MySQL Group Replication(組複製MGR)

MGR基本要求: 1、InnoDB儲存引擎 2、主鍵,每個表必須具有已定義的主鍵或等效的主鍵,其中等效項是非null唯一鍵 3、IPv4網路 4、網路效能 5、開啟二進位制日誌並開啟GTID模式 6、mysql版本在5.7.17以上 MGR限制: 1、組複製不支援mysiam引擎 2、不支援

Mysql group replication

(每臺)安裝元件: 注意:在單個主機上執行的多例項。需要在my.cnf中增加此選項 放在每個選項[mysqld3306]的下面 :report_host=127.0.0.1 並且:skip-name-resolve mysql > INSTALL PLUG

Mysql group replication(MGR)實現高可用切換應用無感知方案的思考

一開始考慮使用ProxySQL+MGR來實現資料庫切換應用無感知方向,考慮了可能的兩種部署模型的優缺點:ProxySQL部署的兩種模型:1、靠近應用端方式:在應用伺服器上直接部署優點:  A、每個應用伺服器有自己的配置 ,配置內容簡單,不容易相互影響故障,變更故障風險最小 

MySQL Group Replication 介紹

2016-12-12,一個重要的日子,mysql5.7.17 GA版釋出,正式推出Group Replication(組複製) 外掛,通過這個外掛增強了mysql原有的高可用方案(原有的Replication方案),提供了重要的特性——多寫,保證組內高可用,確保

Mysql Group Replication關閉和啟動所有的組成員的注意點

由於的我mgr建立在虛擬機器上面(即使是正式環境,如果計劃內的停機或者斷電都需要關閉所有的節點),如何關閉所有的組成員,關閉的順序還是比較重要的。我的環境是一個primary,多個slave的架構,qht131為parmary,其它qht132,qht133,qht134為s

Centos6.8 下 部署Mysql組複製(MySQL Group Replication)之多主模式(5.7新特性)

MySQL Group Replication(簡稱MGR)是MySQL官方於2016年12月推出的一個全新的高可用與高擴充套件的解決方案。MySQL組複製提供了高可用、高擴充套件、高可靠的MySQL叢集服務。 1.關於MGR介紹 1.1提供的特性:

MySQL Group Replication 技術點

mysql group replication,組複製,提供了多寫(multi-master update)的特性,增強了原有的mysql的高可用架構。mysql group replication基於mysql外掛架構實現,本身就是一個mysql外掛。 提供

配置Mysql Group Replication遇到的問題筆記

一 在配置第一臺伺服器 START GROUP_REPLICATION; 後出現以下問題: ERROR 3092 (HY000): The server is not configured properly to be an active mem

Mysql Group Replication 簡介及單主模式組複製配置

mysql> create database test;2017-03-31T23:23:45.535115Z8[Note]Plugin group_replication reported:'Primary had applied all relay logs, disabled conflict d

MySQL Group Replication增加節點

在上一篇文章中,我們大概介紹了Mysql Group Replication的構架及叢集搭建步驟。那麼我們知道,一組優秀的叢集環境有一個很必要的特性,那就是可拓展性。Group Replication的拓展性怎麼樣呢?我們設定如下幾個場景,來看看Group Re

MySQL Group Replication 動態新增成員節點

1. 背景 前面文章已經介紹如何部署MySQL GR 的兩種模式: 在前面的部署裡面,因為是預先知道需要部署的組節點規模,所以我們能夠在my.cnf裡面體現出組成員資訊。但是,前面的部署並沒有體現出動態新增組節點。 這篇文章介紹如何動態地往一個組裡面新

mysql group replication(MGR)群組複製相關資料

配置的叢集成員,通訊時會把主機名與ip地址進行對應,最好是在/etc/hosts中設定好,如果沒有設定,則會碰到如下錯誤:2018-05-02T13:04:32.437256Z 10 [Note] 'CHANGE MASTER TO FOR CHANNEL 'group_re

MySQL Group Replication [Multi-Primary Mode] 詳細搭建部署過程

1,關於MySQL Group Replication基於組的複製(Group-basedReplication)是一種被使用在容錯系統中的技術。Replication-group(複製組)是由能夠相互通訊的多個伺服器(節點)組成的。在通訊層,Groupreplication