WL#8793: Group Replication: Integration with libmysql-gcs and XCom
Affects: Server-5.7
—
Status: Complete
MySQL Group Replication provides multi-master update everywhere replication to MySQL. Until now the group communication toolkit used was Corosync, with which Group Replication interacts through a API binding implemented inside Group Replication. That API binding did evolve to a independent component, that interacts with Corosync and XCom. This worklog will implement the needed changes on Group Replication plugin to use the new API binding and also support XCom.
FR1: Group Replication must preserve the user interface for the build procedure. FR2: Group Replication must not have known regressions. FR3. Group Replication must build on all platforms that MySQL GCS builds. FR4. When setting GCS kernel to be Corosync and Corosync binding is not available then START GROUP_REPLICATION shall fail gracefully. NFR1. Performance with MySQL GCS will be comparable to GCS with Corosync.
OVERVIEW
========
MySQL Group Replication (GR) provides multi-master update everywhere
replication to MySQL.
Until now the group communication toolkit used was Corosync, with
which Group Replication interacts through a API binding implemented
inside Group Replication. That API binding did evolve to a
independent component, that interacts with Corosync and XCom.
This worklog will implement the needed changes on Group Replication
plugin to use the new API binding and also support XCom.
PLUGIN OPTIONS
==============
To support XCom communication toolkit, new options were introduced
in order to provide its configuration. Those options are:
group_replication_local_address
-------------------------------
TYPE: string
DYNAMIC: yes (only read when GR starts)
CONTEXT: global and/or configuration file
DESCRIPTION: The member local address, i.e., host:port that is
passed to MySQL GCS.
DEFAULT: empty string
EXAMPLE:
group_replication_peer_addresses
--------------------------------
TYPE: string
DYNAMIC: yes (only read when GR starts)
CONTEXT: global and/or configuration file
DESCRIPTION: The list of peers, comma separated. E.g.,
host1:port1,host2:port2, that also belong to the group.
The server will contact one of the peers in the group to
add it if this is not the server that will bootstrap the
group.
This list may contain the member local address, it will be
ignored.
DEFAULT: empty string
group_replication_bootstrap_group
---------------------------------
TYPE: boolean
DYNAMIC: yes (only read when GR starts)
CONTEXT: global and/or configuration file
DESCRIPTION: If set to true, the server will bootstrap the group.
group_replication_peer_addresses has no effect if this
option is set to true.
DEFAULT: False
group_replication_gcs_engine
----------------------------
TYPE: string
DYNAMIC: yes (only read when GR starts and stops)
CONTEXT: global and/or configuration file
DESCRIPTION: Specifies the communication toolkit to be used.
Currently must be one of: XCom, Corosync.
DEFAULT: XCom
Note: this is not a new variable but a rename from
group_replication_gcs_protocol to group_replication_gcs_engine.
Two servers configuration example
.................................
server 1:
> SET GLOBAL group_replication_group_name= "UUID";
> SET GLOBAL group_replication_local_address="192.168.0.1:10001";
> SET GLOBAL group_replication_peer_addresses="192.168.0.1:10001,192.168.0.2:10002";
> SET GLOBAL group_replication_bootstrap_group= 1;
server 2:
> SET GLOBAL group_replication_group_name= "UUID";
> SET GLOBAL group_replication_local_address="192.168.0.2:10002";
> SET GLOBAL group_replication_peer_addresses="192.168.0.1:10001,192.168.0.2:10002";
The group member join order must be:
1) server 1
2) server 2
After server 1 bootstraps the group, its
group_replication_bootstrap_group must be set to 0, in order
to it be able to leave and rejoin the *same* group instead of
starting a new one.
MySQL GCS source
================
MySQL GCS source will be available at
internal/remotes/mysql-gcs folder, and a snapshot of it containing
only the interface and C++ bindings will be copied to
src/plugin/group_replication/gcs/ folder.
This will replace the currently used MySQL GCS source that
previoulsy was an internal implementation.
MySQL GCS source will be build embedded with the plugin without any
user interface change.
By default, Corosync binding is not built. User can force Corosync
binding build by specifying WITH_COROSYNC option on cmake. Example:
$ mkdir BIN
$ cd BIN
$ cmake .. -DWITH_MYSQL_SERVER_SOURCE_DIR="SERVER_SOURCE_PATH" \
-DWITH_MYSQL_SERVER_CMAKE_ARGS="-DWITH_COROSYNC=ON"
$ make
SUMMARY OF CHANGES
==================
Plugin code
-----------
1. Add the new options to plugin.cc:
group_replication_local_address
group_replication_peer_addresses
group_replication_bootstrap_group
2. Renamed options:
group_replication_gcs_protocol to group_replication_gcs_engine
3. Adjust gcs_event_handlers.cc to the new MySQL GCS interface.
MySQL GCS code
--------------
The full MySQL GCS source will be available at
internal/remotes/mysql-gcs folder, and a snapshot of it containing
only the interface and C++ bindings will be copied to
src/plugin/group_replication/gcs/ folder.
MySQL GCS source will be build embedded with the plugin without any
build procedure change.
By default, Corosync binding is not build. User can force Corosync
binding build by specifying WITH_COROSYNC option on cmake. Example:
MTR infrastructure
------------------
To support the XCom configuration new MTR include files will be
added:
group_replication.inc
.....................
Setup group replication on the current test.
group_replication_end.inc
.........................
Shutdown/clean group replication on the current test.
start_and_bootstrap_group_replication.inc
.........................................
Does the 3 steps:
1) Set group_replication_bootstrap_group option to True;
2) Start Group Replication;
3) Reset group_replication_bootstrap_group option on all
servers.
group_replication_reset_bootstrap_group.inc
...........................................
Reset group_replication_bootstrap_group option on all
servers.
group_replication_reset_configuration.inc
.........................................
Reset all XCom configuration on all servers.
group_replication_set_bootstrap_group.inc
.........................................
Set group_replication_bootstrap_group option on current
server.
group_replication_configuration.inc
.........................................
Configures XCom on all members.
As bootstrap server it will choose the server with greater
server_id. Servers will join to group from the server with
greater server_id to the on with server_id 1.
XCom local port is assigned according to the rule:
port= (MySQL_server_port - 3000)
So a two member group will have the following XCom configuration
(when MySQL server port is 13000):
server1: 127.0.0.1:10000
server2: 127.0.0.1:10001
group_replication_peer_addresses:
127.0.0.1:10001,127.0.0.1:10000
have_corosync.inc
.................
Include that only allows to run if Corosync it is the loaded
communication toolkit.
have_group_replication_plugin.inc
.................................
Checks that GR plugin is loaded and setups XCom by executing
group_replication_configuration.inc
kill_and_restart_mysqld.inc
...........................
Kill and restart mysqld without echoing the server parameters.
Important changes to developers
-------------------------------
Regular scenario
................
When servers are setup with group_replication.inc, everything is
done automatically, that is, a group with the specified number of
servers (2 by default) is started and the server with greatest
server_id is the one that bootstraped the group.
Example:
--source ../inc/have_group_replication_plugin.inc
--source ../inc/group_replication.inc
DO SOMETHING
--source ../inc/group_replication_end.inc
To specify the number of servers on the group, please use the option
$rpl_server_count, and create a .cnf file with the number of
required servers. Example:
--source ../inc/have_group_replication_plugin.inc
--let $rpl_server_count= 4
--source ../inc/group_replication.inc
Custom server join order
........................
If developers want to specify the group join order, then must do the
following:
--source ../inc/have_group_replication_plugin.inc
--let $rpl_skip_group_replication_start= 1
--source ../inc/group_replication.inc
--connection server1
--source ../inc/start_and_bootstrap_group_replication.inc
--connection server2
--source include/start_group_replication.inc
DO SOMETHING
--source ../inc/group_replication_end.inc
Custom group name
.................
If developers want to specify the group name, it must be done before
including have_group_replication_plugin.inc, since the group name is
required for the XCom configuration.
--let $group_replication_group_name= UUID
--source ../inc/have_group_replication_plugin.inc
--source ../inc/group_replication.inc
DO SOMETHING
--source ../inc/group_replication_end.inc
Start GR on server start
........................
If developers want to use GR group_replication_start_on_boot option,
a server restart must be done.
We cannot use group_replication_start_on_boot directly on opt file
since at that point we don't have yet XCom configuration. XCom
configuration does depend on server port value which is only
available, in a scriptable way, after server start.
So to use the group_replication_start_on_boot option the following
steps must be done:
--source include/force_restart.inc
--let $rpl_skip_group_replication_start= 1
--source ../inc/group_replication.inc
--connection server1
--let $_group_replication_local_address= `SELECT
@@GLOBAL.group_replication_local_address`
--let $_group_replication_peer_addresses= `SELECT
@@GLOBAL.group_replication_peer_addresses`
--let
$restart_parameters=restart:--group_replication_local_address=$_group_replication_local_address
--group_replication_peer_addresses=$_group_replication_peer_addresses
--group_replication_start_on_boot=1
--replace_result $_group_replication_local_address
GROUP_REPLICATION_LOCAL_ADDRESS $_group_replication_peer_addresses
GROUP_REPLICATION_PEER_ADDRESSES
--source include/restart_mysqld.inc
DO SOMETHING
--source ../inc/group_replication_end.inc
If the group is being bootstrapped, option
--group_replication_bootstrap_group=1 must be included on
$restart_parameters.
Uninstall/install plugin
........................
XCom configuration is set using SET GLOBAL commands, which values
are not persisted, so when we uninstall and install plugin all
plugin variables set by SET GLOBAL commands are reset to their
default value.
To overcome this on MTR we need to do following steps:
SET @_group_replication_local_address= @@GLOBAL.group_replication_local_address`
SET @_group_replication_peer_addresses= @@GLOBAL.group_replication_peer_addresses`
UNINSTALL PLUGIN group_replication;
--eval INSTALL PLUGIN group_replication SONAME '$GROUP_REPLICATION'
SET @@GLOBAL.group_replication_local_address= @_group_replication_local_address;
SET @@GLOBAL.group_replication_peer_addresses= @_group_replication_peer_addresses;
--eval SET GLOBAL group_replication_group_name= '$group_replication_group_name'
Copyright (c) 2000, 2025, Oracle Corporation and/or its affiliates. All rights reserved.