mysql group replication単写モード(single-primary mode)構築

10495 ワード

一、環境構成
ノード情報
servername	ip	port	   group 	port
mgr_one		10.168.1.227	3306	6606
mgr_two		10.168.1.226	3306	6606
mgr_three	10.168.1.228	3306	6606

group同期ユーザーとパスワード
ユーザ:rpl_lvfk
パスワード:rpl_lvfk
システム:Ubuntu 16.04.3 LTS
メモリ:1 G
二、mysql-5.7.20をインストールする
ソースコードmysqlのインストール方法については、「mysql-5.7.20ソースコードインストール」を参照してください.
三、配置ファイル
mgr_one:
#base config
server_id = 1
port = 3306


#binglog config,Group Replication    GTID      ,      GTID
log_bin = /usr/local/mysql/binarylog/mysql_bin.index
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
expire_logs_days = 7


#group replication config
transaction-write-set-extraction = XXHASH64
loose-group_replication_start_on_boot = OFF
loose-group_replication_bootstrap_group = OFF
loose-group_replication_group_name = 5e1f9814-c91d-11e7-8f9b-000c29ec1057
loose-group_replication_local_address = '10.168.1.227:6606'
loose-group_replication_group_seeds = '10.168.1.226:6606,10.168.1.227:6606,10.169.1.228:6606'
loose-group_replication_single_primary_mode=true
loose-group_replication_enforce_update_everywhere_checks=false
mgr_two:
#base config
server_id = 2
port = 3306


#binglog config,Group Replication    GTID      ,      GTID
log_bin = /usr/local/mysql/binarylog/mysql_bin.index
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
expire_logs_days = 7


#group replication config
transaction-write-set-extraction = XXHASH64
loose-group_replication_start_on_boot = OFF
loose-group_replication_bootstrap_group = OFF
loose-group_replication_group_name = 5e1f9814-c91d-11e7-8f9b-000c29ec1057
loose-group_replication_local_address = '10.168.1.226:6606'
loose-group_replication_group_seeds = '10.168.1.226:6606,10.168.1.227:6606,10.169.1.228:6606'
loose-group_replication_single_primary_mode=true
loose-group_replication_enforce_update_everywhere_checks=false
mgr_three:
#base config
server_id = 3
port = 3306


#binglog config,Group Replication    GTID      ,      GTID
log_bin = /usr/local/mysql/binarylog/mysql_bin.index
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
expire_logs_days = 7


#group replication config
transaction-write-set-extraction = XXHASH64
loose-group_replication_start_on_boot = OFF
loose-group_replication_bootstrap_group = OFF
loose-group_replication_group_name = 5e1f9814-c91d-11e7-8f9b-000c29ec1057
loose-group_replication_local_address = '10.168.1.228:6606'
loose-group_replication_group_seeds = '10.168.1.226:6606,10.168.1.227:6606,10.169.1.228:6606'
loose-group_replication_single_primary_mode=true
loose-group_replication_enforce_update_everywhere_checks=false

四、Group Replicationプラグインのインストール
[mgr_two]、[mgr_two]、[mgr_three]でそれぞれ次のコマンドを実行します.
mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';
注:またはプロファイルで直接構成
plugin-load = group_replication.so
五、クラスターを作る
5.1、ブートノードmgr_の構成one
A、[mgr_one]では以下のように配置する
SET SQL_LOG_BIN=0;
CREATE USER rpl_lvfk@'%';
GRANT REPLICATION SLAVE ON *.* TO rpl_lvfk@'%' IDENTIFIED BY 'rpl_lvfk';
FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1;
CHANGE MASTER TO MASTER_USER='rpl_lvfk', MASTER_PASSWORD='rpl_lvfk' FOR CHANNEL 'group_replication_recovery';

注意:SET SQL_の使用LOG_BIN=0;ユーザーの作成操作がbinlogに記録されないことを保証します.これにより、他のサービスがタイムズトランザクションの競合エラーに参加することを回避できます.[ERROR] Plugin group_replication reported: 'The member contains transactions not present in the group. The member will now exit the group.'
B、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 | e13d18c2-bf6e-11e7-9a63-000c2951eef3 | mgr_one     |        3306 | ONLINE       |
+---------------------------+--------------------------------------+-------------+-------------+--------------+

注意:ここのMEMBER_IDがデータベースを初期化するdatadir=/usr/local/mysql/dataである場合、MEMBER_IDは/usr/local/mysql/data/auto.cnf
5.2、mgr_twoとmgr_threeがGroupに加わる
[mgr_two]と[mgr_three]でそれぞれ次のコマンドを実行します.
A、           :
SET SQL_LOG_BIN=0;
CREATE USER rpl_lvfk@'%';
GRANT REPLICATION SLAVE ON *.* TO rpl_lvfk@'%' IDENTIFIED BY 'rpl_lvfk';
FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1;
CHANGE MASTER TO MASTER_USER='rpl_lvfk', MASTER_PASSWORD='rpl_lvfk' FOR CHANNEL 'group_replication_recovery';

B、Group Replicationの起動
mysql> START GROUP_REPLICATION;
Query OK, 0 rows affected (7.40 sec)

C、起動完了後のGroup情報の表示
mysql> select * from performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| group_replication_applier | 005e5b4e-c535-11e7-adae-000c2951eef3 | mgr_two     |        3306 | ONLINE       |
| group_replication_applier | 2a7b77a2-c535-11e7-adae-000c2951eef3 | mgr_three   |        3306 | ONLINE       |
| group_replication_applier | e13d18c2-bf6e-11e7-9a63-000c2951eef3 | mgr_one     |        3306 | ONLINE       |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
3 rows in set (0.00 sec)

注意:
質問1:グループへの参加例は常にRECOVERING状態
分析:
エラーログを解析すると、構成されたMEMBER_であることがわかります.HOSTはドメイン名形式ですが、hostsにDNS解析が追加されていないため、グループに追加された他のサーバにアクセスできません.
解決方法:
/etc/hostsファイルを変更し、3つの[mgr_one]、[mgr_two]、[mgr_three]に対してDNS解析を追加
10.168.1.226    mgr_two
10.168.1.227    mgr_one
10.168.1.228    mgr_three

その後、グループサービスを停止した後、再度グループサービスを開始する
mysql> STOP GROUP_REPLICATION;
Query OK, 0 rows affected (1.00 sec)

mysql> START GROUP_REPLICATION;
Query OK, 0 rows affected (3.10 sec)

六、判定グループコピー中のメインノード
mysql> SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME = 'group_replication_primary_member';
+--------------------------------------+
| VARIABLE_VALUE                       |
+--------------------------------------+
| e13d18c2-bf6e-11e7-9a63-000c2951eef3 |
+--------------------------------------+
1 row in set (0.02 sec)

七、テスト
7.1、シングルマスターモードで、メイン以外のサーバーにデータを追加して直接エラーを報告する
mysql> insert into user values(null, 'yy', 28);
ERROR 1290 (HY000): The MySQL server is running with the --super-read-only option so it cannot execute this statement

7.2、第六点からメインノードがどのサーバーであるかを導き出すことができ、私たちはメインノードで同じ文を実行する.ここで私たちのメインノードは[mgr_one]である.
mysql> insert into user values(null, 'yy', 28);
Query OK, 1 row affected (0.01 sec)


mysql> select * from user;
+----+------+-----+
| id | name | age |
+----+------+-----+
|  8 | yy   |  28 |
+----+------+-----+
1 row in set (0.00 sec)

7.3、[mgr_two]、[mgr_three]でそれぞれ表示文を実行する
[mgr_two]
mysql> select * from user;
+----+------+-----+
| id | name | age |
+----+------+-----+
|  8 | yy   |  28 |
+----+------+-----+
1 row in set (0.00 sec)


[mgr_three]
mysql> select * from user;
+----+------+-----+
| id | name | age |
+----+------+-----+
|  8 | yy   |  28 |
+----+------+-----+
1 row in set (0.00 sec)

以上より,単一プライマリモードのグループレプリケーションが成功し,プライマリノードでデータを操作し,他のノードで新しいデータに同期し,プライマリノードでのみ書き込み操作を実行できることが分かった.
これでmysql group replication単写モード(single-primary mode)の構築とテストが完了しました
7.1の補足1:
MySQL Group Replicationのデフォルトでは、すべてのノードの書き込みが許可されていません.初期のクラスタには書き込み可能なノードが1つしか残っておらず、残りのノードのread_only/super_read_onlyパラメータはすべてONに設定します.masterが障害でダウンした後、グループの仲裁コンポーネントはノードを選択してread_only/super_read_onlyはOFFに設定し、このノードをマスターノードとして機能させます.
もちろん、コマンド設定によって複数のノードの書き込みに変更したり、直接マルチマスターモードに設定したりすることも可能である
[mgr_two]で実行
mysql> show variables like '%read_only%';
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| innodb_read_only      | OFF   |
| read_only             | ON    |
| super_read_only       | ON    |
| transaction_read_only | OFF   |
| tx_read_only          | OFF   |
+-----------------------+-------+
5 rows in set (0.01 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 user values(null, 'xx', 27);
Query OK, 1 row affected (0.02 sec)

mysql> select * from user;
+----+------+-----+
| id | name | age |
+----+------+-----+
|  8 | yy   |  28 |
|  9 | xx   |  27 |
+----+------+-----+
2 rows in set (0.00 sec)

[mgr_one]、[mgr_three]クエリー
mysql> select * from user;
+----+------+-----+
| id | name | age |
+----+------+-----+
|  8 | yy   |  28 |
|  9 | xx   |  27 |
+----+------+-----+
2 rows in set (0.00 sec)

補足2、マルチプライマリモードに構成する方法は、3台のサーバ上のmyだけです.cnfでは以下の構成
loose-group_replication_single_primary_mode=true
loose-group_replication_enforce_update_everywhere_checks=false

次のように変更
loose-group_replication_single_primary_mode=false
loose-group_replication_enforce_update_everywhere_checks=true