グループベースのレプリケーションは、フォールト トレラント システムで使用されるテクノロジです。レプリケーション グループは、相互に通信できる複数のサーバー (ノード) で構成されます。
通信層では、グループレプリケーションは、アトミックなメッセージ配信やメッセージの全体的な順序付けなど、一連のメカニズムを実装します。
これらのアトミックかつ抽象的なメカニズムは、より高度なデータベース レプリケーション ソリューションの実装を強力にサポートします。
MySQL グループ レプリケーションは、これらのテクノロジーと概念に基づいて、完全に更新されたマルチマスター レプリケーション プロトコルを実装します。
つまり、レプリケーション グループはノードのグループであり、各ノードはトランザクションを独立して実行でき、読み取りおよび書き込みトランザクションはコミットする前にグループ内の他のノードと調整されます。
したがって、トランザクションを送信する準備ができると、そのトランザクションはグループ内で自動的にアトミックにブロードキャストされ、どのコンテンツが変更されたか、どのトランザクションが実行されたかを他のノードに通知します。
このアトミック ブロードキャスト メソッドは、このトランザクションをすべてのノードで同じ順序に保ちます。
これは、各ノードが同じトランザクション ログを同じ順序で受信したため、各ノードがこれらのトランザクション ログを同じ順序で再生し、最終的にグループ全体が完全に一貫した状態を維持したことを意味します。
ただし、異なるノードで実行されるトランザクション間でリソースの競合が発生する可能性があります。この現象は、2 つの異なるトランザクションを同時に実行する場合に発生しやすくなります。
同じデータ行を更新する 2 つの同時トランザクションが異なるノード上にあると仮定すると、リソースの競合が発生します。
この状況に直面すると、GroupReplication は最初に送信されたトランザクションが有効なトランザクションであると判断し、後で送信されたトランザクションは直接中断またはロールバックされ、最終的に破棄されます。
したがって、これはシェアードナッシングレプリケーションソリューションでもあり、各ノードはデータの完全なコピーを保存します。次の図 01.png を参照してください。この図では、特定のワークフローが説明されており、他のソリューションと簡潔に比較できます。このレプリケーション スキームは、データベース ステート マシン (DBSM) のレプリケーション方法にある程度似ています。
公式ダウンロードですが、公式は最新バージョンのみを保持しており、URLアドレス5.7.17は長期間有効ではない可能性があるため、必要なものではないかもしれません。Baidu Cloud Disk に保存しました。バージョンは 5.7.17 です。いつでもダウンロードして使用できます。
3 つの DB サーバーに /etc/hosts マッピングを設定します。 、次のように:
192.168 .121.71 db1 db2 db3 db3 Installed Database Server:database Serverアドレス3317
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.%' IDENTIFIED BY 'rlpbright_1927@ys'; ログイン後にコピー 設定ファイルmy.cnf内で直接実行します: グループレプリケーションコンポーネントを表示しますmysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so'; Query OK, 0 rows affected (0.01 sec) mysql> ログイン後にコピー 5 、 グループレプリケーション は5.1オンラインで追加mysql> show plugins; +----------------------------+----------+--------------------+----------------------+---------+ | Name | Status | Type | Library | License | +----------------------------+----------+--------------------+----------------------+---------+ | binlog | ACTIVE | STORAGE ENGINE | NULL | GPL | | mysql_native_password | ACTIVE | AUTHENTICATION | NULL | GPL | | sha256_password | ACTIVE | AUTHENTICATION | NULL | GPL | | MyISAM | ACTIVE | STORAGE ENGINE | NULL | GPL | | PERFORMANCE_SCHEMA | ACTIVE | STORAGE ENGINE | NULL | GPL | | InnoDB | ACTIVE | STORAGE ENGINE | NULL | GPL | | INNODB_TRX | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_LOCKS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_LOCK_WAITS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_CMP | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_CMP_RESET | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_CMPMEM | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_CMPMEM_RESET | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_CMP_PER_INDEX | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_CMP_PER_INDEX_RESET | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_BUFFER_PAGE | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_BUFFER_PAGE_LRU | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_BUFFER_POOL_STATS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_TEMP_TABLE_INFO | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_METRICS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_FT_DEFAULT_STOPWORD | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_FT_DELETED | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_FT_BEING_DELETED | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_FT_CONFIG | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_FT_INDEX_CACHE | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_FT_INDEX_TABLE | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_TABLES | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_TABLESTATS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_INDEXES | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_COLUMNS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_FIELDS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_FOREIGN | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_FOREIGN_COLS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_TABLESPACES | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_DATAFILES | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_VIRTUAL | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | MRG_MYISAM | ACTIVE | STORAGE ENGINE | NULL | GPL | | MEMORY | ACTIVE | STORAGE ENGINE | NULL | GPL | | CSV | ACTIVE | STORAGE ENGINE | NULL | GPL | | BLACKHOLE | ACTIVE | STORAGE ENGINE | NULL | GPL | | partition | ACTIVE | STORAGE ENGINE | NULL | GPL | | FEDERATED | DISABLED | STORAGE ENGINE | NULL | GPL | | ARCHIVE | ACTIVE | STORAGE ENGINE | NULL | GPL | | ngram | ACTIVE | FTPARSER | NULL | GPL | | group_replication | ACTIVE | GROUP REPLICATION | group_replication.so | GPL | +----------------------------+----------+--------------------+----------------------+---------+ 45 rows in set (0.00 sec) mysql> ログイン後にコピー |
での実行プロセスは次のとおりです:
5.2配置文件配置
配置完后,重启3个db上的mysql服务,本次案例,我们选择5.2 配置文件配置方式实现。 6,启动mgr集群开始构建group replication集群,通常操作命令 mysql> CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='rlpbright_1927@ys' FOR CHANNEL 'group_replication_recovery'; Query OK, 0 rows affected, 2 warnings (0.02 sec) mysql> ログイン後にコピー Db1上建立基本主库master库: # 设置group_replication_bootstrap_group为ON是为了标示以后加入集群的服务器以这台服务器为基准,以后加入的就不需要设置。 mysql> SET GLOBAL group_replication_bootstrap_group = ON; Query OK, 0 rows affected (0.00 sec) mysql> START GROUP_REPLICATION; Query OK, 0 rows affected (1.03 sec) mysql> SELECT * FROM performance_schema.replication_group_members; +---------------------------+--------------------------------------+----------------------+-------------+--------------+ | CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | +---------------------------+--------------------------------------+----------------------+-------------+--------------+ | group_replication_applier | 3d872c2e-d670-11e6-ac1f-b8ca3af6e36c | hch_test_dbm2_121_71 | 3317 | ONLINE | +---------------------------+--------------------------------------+----------------------+-------------+--------------+ 1 row in set (0.00 sec) mysql> ログイン後にコピー Db2上启动group_replication: Db2上mysql命令行上执行启动: mysql> START GROUP_REPLICATION; Query OK, 0 rows affected (1.02 sec) mysql> db1上后台error log显示: 2017-01-10T07:37:39.946919Z 0 [Note] Plugin group_replication reported: 'getstart group_id 41e28b21' 2017-01-10T07:58:47.624090Z 0 [Note] Plugin group_replication reported: 'getstart group_id 41e28b21' 2017-01-10T07:58:53.116957Z 0 [Note] Plugin group_replication reported: 'Marking group replication view change with view_id 14840330835325176:6' 再去master库db1上,查看group_replication成员,会有db2的显示 mysql> SELECT * FROM performance_schema.replication_group_members; +---------------------------+--------------------------------------+----------------------+-------------+--------------+ | CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | +---------------------------+--------------------------------------+----------------------+-------------+--------------+ | group_replication_applier | 3d872c2e-d670-11e6-ac1f-b8ca3af6e36c | hch_test_dbm2_121_71 | 3317 | ONLINE | | group_replication_applier | fdf2b02e-d66f-11e6-98a8-18a99b76310d | bpe_service | 3317 | ONLINE | +---------------------------+--------------------------------------+----------------------+-------------+--------------+ 2 rows in set (0.00 sec) mysql> ログイン後にコピー Db3上启动group_replication: -- Db3命令行上执行: mysql> set global group_replication_allow_local_disjoint_gtids_join=ON; Query OK, 0 rows affected (0.00 sec) mysql> start group_replication; Query OK, 0 rows affected (1.99 sec) mysql> -- 再去master库db1上,查看group_replication成员,会有db3的显示,而且已经是ONLINE了 mysql> SELECT * FROM performance_schema.replication_group_members; +---------------------------+--------------------------------------+----------------------+-------------+--------------+ | CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | +---------------------------+--------------------------------------+----------------------+-------------+--------------+ | group_replication_applier | 3d872c2e-d670-11e6-ac1f-b8ca3af6e36c | hch_test_dbm2_121_71 | 3317 | ONLINE | | group_replication_applier | ef8ac2de-d671-11e6-9ba4-18a99b763071 | hch_test_web_1_24 | 3317 | ONLINE | | group_replication_applier | fdf2b02e-d66f-11e6-98a8-18a99b76310d | bpe_service | 3317 | ONLINE | +---------------------------+--------------------------------------+----------------------+-------------+--------------+ 3 rows in set (0.01 sec) mysql> -- db1上后台error log显示: 2017-01-10T08:00:28.866356Z 0 [Note] Plugin group_replication reported: 'getstart group_id 41e28b21' 2017-01-10T08:00:54.699130Z 0 [Note] Plugin group_replication reported: 'getstart group_id 41e28b21' 2017-01-10T08:00:56.567427Z 0 [Note] Plugin group_replication reported: 'Marking group replication view change with view_id 14840330835325176:9' ログイン後にコピー 最后查看集群状态,都为ONLINE就表示OK: mysql> SELECT * FROM performance_schema.replication_group_members; +---------------------------+--------------------------------------+----------------------+-------------+--------------+ | CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | +---------------------------+--------------------------------------+----------------------+-------------+--------------+ | group_replication_applier | 3d872c2e-d670-11e6-ac1f-b8ca3af6e36c | hch_test_dbm2_121_71 | 3317 | ONLINE | | group_replication_applier | ef8ac2de-d671-11e6-9ba4-18a99b763071 | hch_test_web_1_24 | 3317 | ONLINE | | group_replication_applier | fdf2b02e-d66f-11e6-98a8-18a99b76310d | bpe_service | 3317 | ONLINE | +---------------------------+--------------------------------------+----------------------+-------------+--------------+ 3 rows in set (0.00 sec) mysql> ログイン後にコピー 7,验证集群复制功能测试,在master库db1上建立测试库db1,测试表t1,录入一条数据 mysql> create database db1; Query OK, 1 row affected (0.00 sec) mysql> create table db1.t1(id int,cnvarchar(32)); Query OK, 0 rows affected (0.02 sec) mysql> mysql> insert into t1 select 1,'a'; ERROR 3098 (HY000): The table does notcomply with the requirements by an external plugin. mysql> mysql> insert into t1(id,cn)values(1,'a'); ERROR 3098 (HY000): The table does notcomply with the requirements by an external plugin. mysql> mysql> -- # 这里原因是group_replaction环境下面,表必须有主键不然不允许往里insert值。所以修改表t1,将id字段设置程主键即可。 mysql> alter table t1 modify id intprimary key; Query OK, 0 rows affected (0.02 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> insert into t1 select 1,'a'; Query OK, 1 row affected (0.01 sec) Records: 1 Duplicates: 0 Warnings: 0 mysql> ログイン後にコピー 去db2/db3上可以看到数据已经同步过去 mysql> select * from db1.t1; +----+------+ | id | cn | +----+------+ | 1| a | +----+------+ 1 row in set (0.00 sec) mysql> ログイン後にコピー 然后在db2/db3上执行inert操作,则拒绝,因为db2、db3为readonly mysql> insert into t1 select 2,'b'; ERROR 1290 (HY000): The MySQL server isrunning with the --super-read-only option so it cannot execute this statement mysql> ログイン後にコピー 8,问题记录8.1问题记录一MySQL窗口报错: ERROR 3092 (HY000): The server is notconfigured properly to be an active member of the group. Please see moredetails on error log. 后台ERROR LOG报错: [ERROR] Plugin group_replication reported:'This member has more executed transactions than those present in the group. Local transactions: f16f7f74-c283-11e6-ae37-fa163ee40410:1 > Grouptransactions: 3c992270-c282-11e6-93bf-fa163ee40410:1, aaaaaa:1-5' [ERROR]Plugin group_replication reported: 'The member contains transactions notpresent in the group. The member will now exit the group.' [Note] Plugin group_replication reported: 'Toforce this member into the group you can use the group_replication_allow_local_disjoint_gtids_joinoption' ログイン後にコピー
【解决办法】: 根据提示打开group_replication_allow_local_disjoint_gtids_join选项,mysql命令行执行: mysql> set globalgroup_replication_allow_local_disjoint_gtids_join=ON; ログイン後にコピー 再执行开启组复制: mysql> start group_replication; Query OK, 0 rows affected (7.89 sec) mysql> ログイン後にコピー 8.2 问题记录二RECOVERING在db1上查询集群组成员 mysql> SELECT * FROM performance_schema.replication_group_members; +---------------------------+--------------------------------------+----------------------+-------------+--------------+ | CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | +---------------------------+--------------------------------------+----------------------+-------------+--------------+ | group_replication_applier | 3d872c2e-d670-11e6-ac1f-b8ca3af6e36c | hch_test_dbm2_121_71 | 3317 | ONLINE | | group_replication_applier | ef8ac2de-d671-11e6-9ba4-18a99b763071 | hch_test_web_1_24 | 3317 | RECOVERING | | group_replication_applier | fdf2b02e-d66f-11e6-98a8-18a99b76310d | bpe_service | 3317 | RECOVERING | +---------------------------+--------------------------------------+----------------------+-------------+--------------+ 3 rows in set (0.00 sec) mysql> ログイン後にコピー 再查看后台error日志, 2017-01-10T09:17:39.449488Z 146 [ERROR] Slave I/O for channel 'group_replication_recovery': error connecting to master 'repl@hch_test_dbm2_121_71:3317' - retry-time: 60 retries: 1, Error_code: 2003 2017-01-10T09:17:39.450289Z 146 [Note] Slave I/O thread for channel 'group_replication_recovery' killed while connecting to master 2017-01-10T09:17:39.450449Z 146 [Note] Slave I/O thread exiting for channel 'group_replication_recovery', read up to log 'FIRST', position 4 2017-01-10T09:17:39.451579Z 144 [ERROR] Plugin group_replication reported: 'There was an error when connecting to the donor server. Check group replication recovery's connection credentials.' 2017-01-10T09:17:39.452341Z 144 [Note] Plugin group_replication reported: 'Retrying group recovery connection with another donor. Attempt 2/10' 2017-01-10T09:17:39.457834Z 0 [Note] Plugin group_replication reported: 'Marking group replication view change with view_id 14840330835325176:25' 2017-01-10T09:18:39.456629Z 144 [Note] 'CHANGE MASTER TO FOR CHANNEL 'group_replication_recovery' executed'. Previous state master_host='hch_test_dbm2_121_71', master_port= 3317, master_log_file='', master_log_pos= 4, master_bind=''. New state master_host='hch_test_dbm2_121_71', master_port= 3317, master_log_file='', master_log_pos= 4, master_bind=''. 2017-01-10T09:18:39.485250Z 144 [Note] Plugin group_replication reported: 'Establishing connection to a group replication recovery donor 3d872c2e-d670-11e6-ac1f-b8ca3af6e36c at hch_test_dbm2_121_71 port: 3317.' 2017-01-10T09:18:39.489356Z 150 [Warning] Storing MySQL user name or password information in the master info repository is not secure and is therefore not recommended. Please consider using the USER and PASSWORD connection options for START SLAVE; see the 'START SLAVE Syntax' in the MySQL Manual for more information. 2017-01-10T09:18:39.493511Z 150 [ERROR] Slave I/O for channel 'group_replication_recovery': error connecting to master 'repl@hch_test_dbm2_121_71:3317' - retry-time: 60 retries: 1, Error_code: 2005 2017-01-10T09:18:39.493912Z 150 [Note] Slave I/O thread for channel 'group_replication_recovery' killed while connecting to master 2017-01-10T09:18:39.494069Z 150 [Note] Slave I/O thread exiting for channel 'group_replication_recovery', read up to log 'FIRST', position 4 2017-01-10T09:18:39.495155Z 144 [ERROR] Plugin group_replication reported: 'There was an error when connecting to the donor server. Check group replication recovery's connection credentials.' 2017-01-10T09:18:39.496838Z 144 [Note] Plugin group_replication reported: 'Retrying group recovery connection with another donor. Attempt 3/10' ログイン後にコピー 【解决办法】: 看报错[ERROR] Slave I/O for channel'group_replication_recovery': error connecting to master 'repl@hch_test_dbm2_121_71:3317'- retry-time: 60 retries: 1, Error_code:2005,连接master库不上,所以问题在这里,我们赋予的复制账号是ip的repl@'192.168.%',所以还需要做一个hostname(hch_test_dbm2_121_71)和db1的ip地址192.168.121.71的映射关系。
建立hostname和ip映射 vim /etc/hosts 192.168.121.71 db1 hch_test_dbm2_121_71 192.168.121.111 db2 bpe_service 192.168.121.24 db3 hch_test_web_1_24 ログイン後にコピー 然后在db2上执行如下命令后重新开启group_replication即可。 mysql> stop group_replication; Query OK, 0 rows affected (0.02 sec) mysql> start group_replication; Query OK, 0 rows affected (5.68 sec) mysql> ログイン後にコピー 再去master库db1上,查看group_replication成员,会有db2的显示 mysql> SELECT * FROM performance_schema.replication_group_members; +---------------------------+--------------------------------------+----------------------+-------------+--------------+ | CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | +---------------------------+--------------------------------------+----------------------+-------------+--------------+ | group_replication_applier | 3d872c2e-d670-11e6-ac1f-b8ca3af6e36c | hch_test_dbm2_121_71 | 3317 | ONLINE | | group_replication_applier | fdf2b02e-d66f-11e6-98a8-18a99b76310d | bpe_service | 3317 | ONLINE | +---------------------------+--------------------------------------+----------------------+-------------+--------------+ 2 rows in set (0.00 sec) mysql> ログイン後にコピー 8.3问题记录三操作问题 mysql> mysql> START GROUP_REPLICATION; ERROR 3092 (HY000): The server is notconfigured properly to be an active member of the group. Please see moredetails on error log. ログイン後にコピー
【解决办法】: mysql> SET GLOBALgroup_replication_bootstrap_group = ON; Query OK, 0 rows affected (0.00 sec) mysql> START GROUP_REPLICATION; Query OK, 0 rows affected (1.03 sec) mysql> ログイン後にコピー |
以上がMySQL グループ レプリケーションの構築とデプロイメント プロセスの詳細な紹介 [シングルプライマリ モード]の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。