MySQL Group Replication 實作


Posted by kscheng on 2021-04-06

Node 1 Node 2 Node 3
10.250.241.1 10.250.241.2 10.250.241.3

Node 1

#!/bin/bash
###########################################################
# Program: MySQL Group Replication via Ubuntu 20.04
# DBAdmin: K.C. Cheng
# Created: March 31st, 2021
# Source : Configure MySQL Group Replication on Ubuntu 20.04
###########################################################

echo ''
echo '[generate the group replication name & save it]'
sudo mysql -e 'select uuid();' > uuid.txt
tail -1 uuid.txt
        # uuid()
        # 4cb0b57b-92c0-11eb-a784-42010afaf101

echo ''
echo '[configure sevrer 1]'
uuid=$(tail -1 uuid.txt)
hostname=$(hostname -I)
port=33061

echo ''
echo '[edit ~/my.cnf]'
sudo bash -c "cat << EOF > /etc/mysql/my.cnf

[mysqld]

server_id=${hostname##*.}
bind-address=0.0.0.0
gtid_mode=ON
enforce_gtid_consistency=ON
binlog_checksum=NONE
innodb_flush_log_at_trx_commit=1

plugin_load_add='group_replication.so'
group_replication_single_primary_mode=OFF
loose-group_replication_group_name='$uuid'
loose-group_replication_start_on_boot=OFF
loose-group_replication_local_address='${hostname%.*}.1:$port'
loose-group_replication_group_seeds='10.250.241.1:33061, 10.250.241.2:33061, 10.250.241.3:33061'
loose-group_replication_bootstrap_group=OFF
report_host=$hostname

loose-group_replication_single_primary_mode = OFF
loose-group_replication_enforce_update_everywhere_checks = ON

EOF"


echo ''
echo '[restart mysql]'
sudo systemctl restart mysql

echo ''
echo '[create a replication user]'
sudo mysql -e "
    SET SQL_LOG_BIN=0;
    CREATE USER IF NOT EXISTS 'replication_user'@'%'
        IDENTIFIED WITH mysql_native_password
        BY '!QAZ2wsx';
    GRANT REPLICATION SLAVE
        ON *.* TO 'replication_user'@'%';
    FLUSH PRIVILEGES;
    SET SQL_LOG_BIN=1;
    CHANGE MASTER TO
        MASTER_USER='replication_user',
        MASTER_PASSWORD='!QAZ2wsx'
        FOR CHANNEL 'group_replication_recovery';
    "

echo ''
echo '[bootstrap the group replication plugin on server 1]'
sudo mysql -e "
    SET GLOBAL group_replication_bootstrap_group=ON;
    START GROUP_REPLICATION;

# Turn group_replication_bootstrap_group off
# to avoid creating multiple groups when restart the MySQL
    SET GLOBAL group_replication_bootstrap_group=OFF;

# Verify the status of the group
# by querying the replication_group_members
    SELECT MEMBER_ID, MEMBER_HOST, MEMBER_STATE
    FROM performance_schema.replication_group_members;
    "

Node 2

#!/bin/bash
###########################################################
# Program: MySQL Group Replication via Ubuntu 20.04
# DBAdmin: K.C. Cheng
# Created: March 31st, 2021
# Source : Configure MySQL Group Replication on Ubuntu 20.04
###########################################################

uuid='e1be3c65-92c0-11eb-a784-42010afaf101'
hostname=$(hostname -I)
port=33061

echo ''
echo '[edit ~/my.cnf]'
sudo bash -c "cat << EOF > /etc/mysql/my.cnf

[mysqld]

server_id=${hostname##*.}
bind-address=0.0.0.0
gtid_mode=ON
enforce_gtid_consistency=ON
binlog_checksum=NONE
# log_bin            = /var/log/mysql/mysql-bin.log
# log-slave-updates  = 0
# expire_logs_days   = 10
# max_binlog_size    = 100M
# innodb_flush_log_at_trx_commit = 1
# sync_binlog        = 0
# read_only          = 1

plugin_load_add='group_replication.so'
group_replication_single_primary_mode=OFF
loose-group_replication_group_name='$uuid'
loose-group_replication_start_on_boot=OFF
loose-group_replication_local_address='${hostname%.*}.2:$port'
loose-group_replication_group_seeds='10.250.241.1:33061, 10.250.241.2:33061, 10.250.241.3:33061'

loose-group_replication_bootstrap_group=OFF
report_host=$hostname

EOF"


echo ''
echo '[restart mysql]'
sudo systemctl restart mysql

echo ''
echo '[set the info of replication user]'
sudo mysql -e "
    STOP slave; 
    CHANGE master to master_host = '10.250.241.1';
    CHANGE master to master_user = 'replication_user';
    CHANGE master to master_password = '!QAZ2wsx';
    "

# these two info is based on Server 1 by the command:
# > show master status/G
# see the File and Position
sudo mysql -e "
    CHANGE master to master_log_file = '';
    CHANGE master to master_log_pos = ;
    "

echo ''
echo '[start group_replication]'
#    START GROUP_REPLICATION;
sudo mysql -e "
    START SLAVE;
    SHOW slave status\G
    "

# Verify the status of the group
# by querying the replication_group_members
sudo mysql -e "
    SELECT MEMBER_ID, MEMBER_HOST, MEMBER_STATE
    FROM performance_schema.replication_group_members;
    "

Node 3

#!/bin/bash

###########################################################
# Program: MySQL Group Replication via Ubuntu 20.04
# DBAdmin: K.C. Cheng
# Created: March 31st, 2021
# Source : Configure MySQL Group Replication on Ubuntu 20.04
###########################################################


uuid='e1be3c65-92c0-11eb-a784-42010afaf101'
hostname=$(hostname -I)
port=33061


echo ''
echo '[edit ~/my.cnf]'
sudo bash -c "cat << EOF > /etc/mysql/my.cnf

[mysqld]

server_id=${hostname##*.}
bind-address=0.0.0.0
gtid_mode=ON
enforce_gtid_consistency=ON
binlog_checksum=NONE

# log_bin            = /var/log/mysql/mysql-bin.log
# log-slave-updates  = 0
# expire_logs_days   = 10
# max_binlog_size    = 100M
# innodb_flush_log_at_trx_commit = 1
# sync_binlog        = 0
# read_only          = 1

plugin_load_add='group_replication.so'
group_replication_single_primary_mode=OFF
loose-group_replication_group_name='$uuid'
loose-group_replication_start_on_boot=OFF
loose-group_replication_local_address='${hostname%.*}.3:$port'
loose-group_replication_group_seeds='10.250.241.1:33061, 10.250.241.2:33061, 10.250.241.3:33061'
loose-group_replication_bootstrap_group=OFF
report_host=$hostname

loose-group_replication_bootstrap_group=OFF
report_host=$hostname

EOF"




echo ''
echo '[restart mysql]'
sudo systemctl restart mysql

echo ''
echo '[create a replication user]'
sudo mysql -e "
    SET SQL_LOG_BIN=0;
    CREATE USER IF NOT EXISTS 'replication_user'@'%'
        IDENTIFIED WITH mysql_native_password
        BY '!QAZ2wsx';
    GRANT REPLICATION SLAVE
        ON *.* TO 'replication_user'@'%';
    FLUSH PRIVILEGES;
    SET SQL_LOG_BIN=1;
    CHANGE MASTER TO
        MASTER_USER='replication_user',
        MASTER_PASSWORD='!QAZ2wsx'
        FOR CHANNEL 'group_replication_recovery';
    "


echo ''
echo '[set the info of replication user]'
sudo mysql -e "
    STOP slave;
    CHANGE master to master_host = '10.250.241.1';
    CHANGE master to master_user = 'replication_user';
    CHANGE master to master_password = '!QAZ2wsx';
    "

echo ''
echo '[set the File and Position of Master]'
# these two info is based on Server 1 by the command:
# > show master status\G
# see the File and Position
sudo mysql -e "
    CHANGE master to master_log_file = 'binlog.000018';
    CHANGE master to master_log_pos = 863;
    "


echo ''
echo '[start group_replication]'
#    START GROUP_REPLICATION;
sudo mysql -e "
    START SLAVE;
    SHOW slave status\G
    "
# Verify the status of the group
# by querying the replication_group_members
sudo mysql -e "
    SELECT MEMBER_ID, MEMBER_HOST, MEMBER_STATE
    FROM performance_schema.replication_group_members;
    "

Back to Node 1

echo ''
echo '[test database and tables]'
sudo mysql -e "
        drop database if exists sample;
        create database sample; 
        use sample;
        create table customers
                (id int primary key, name varchar(32))
                Engine = InnoDB;
        insert into customers (id, name)
                values (100, 'John James'),
                        (200, 'Baby Doe'),
                        (300, 'Jane Smith');
        select * from customers;
        "

Check the sync on Node 2 & Node 3

echo ''
echo '[check test database and tables]'
sudo mysql -e "select * from customers;"

Reference:

Configure MySQL Group Replication on Ubuntu 20.04
MySQL Replication 主從式架構設定教學
MySQL Group Replication — Multi-Primary設定


#MySQL #Group Replication







Related Posts

React hook form(2) - useForm & 它的回傳值(2)

React hook form(2) - useForm & 它的回傳值(2)

Day06: GraphQL - Enumeration and list types wiht node.js

Day06: GraphQL - Enumeration and list types wiht node.js

[Day 06]: Docker Network-2

[Day 06]: Docker Network-2


Comments