mysql MGR集羣配置

mysql MGR集羣配置

Mysql Group Replication簡介 (官網翻譯)

Mysql Group Replication(MGR)是一個全新的高可用和高擴張的MySQL集羣服務。

  1. 高一致性,基於原生複製及paxos協議的組複製技術,以插件方式提供一致數據安全保證;

  2. 高容錯性,大多數服務正常就可繼續工作,自動不同節點檢測資源徵用衝突,按順序優先處理,內置自動防腦裂機制;

  3. 高擴展性,自動添加移除節點,並更新組信息;

  4. 高靈活性,單主模式和多主模式。單主模式自動選主,所有更新操作在主進行;多主模式,所有server同時更新。

    Mysql Group replication與傳統複製的區別和大幅改進

    1.傳統複製

    ​ 主-從複製:有一個主和不等數量的從。主節點執行的事務會異步發送給從節點,在從節點重新執行。(異步和半同步)

    (半同步相對異步Master會確認Slave是否接到數據,更加安全)

在這裏插入圖片描述

(原理見主從複製筆記)

  2.並行複製

在這裏插入圖片描述

並行複製:複製->廣播->正式複製
優勢:
彈性複製(高擴展性):server動態添加移除
高可用分片(高擴展性):分片實現寫擴展,每個分片是一個複製組。
替代主從複製(高擴展性):整組寫入,避免單點爭用。
自動化系統:自動化部署Mysql複製到已有複製協議的自動化系統。
故障檢測與容錯:自動檢測,若服務faild,組內成員大多數達成認爲該服務已不正常,則自動隔離。
組內成員會構成一個視圖,組內成員主動加入或離開(主動或被動),都會更新組配置,更新視圖。成員自願離開,先更新組配置,然後採用大多數成員(不包含主動脫離的成員)意見是否確認該成員離開更新視圖。如果是故障要排除,則需大多數服務確認(包括故障成員意見),然後纔會更新組配置和視圖。
最大允許即時故障數:f=(n-1)/2,多數正常則正常

主從複製限制
  1. 存儲引擎必須爲innodb

  2. 每個表必須提供主鍵

  3. 只支持ipv4,網絡需求較高

    1. 一個group最多只能有9臺服務器

    2. 不支持Replication event checksums,

    3. 不支持Savepoints

    4. multi-primary mode部署方式不支持SERIALIZABLE事務隔離級別

    5. multi-primary mode部署方式不能完全支持級聯外鍵約束

    6. multi-primary mode部署方式不支持在不同節點上對同一個數據庫對象併發執行DDL(在不同節點上對同一行併發進行RW事務,後發起的事務會失敗)

單主模式佈置組複製

(組中server可在獨立物理機運行,也可在同一臺機器,同一機器採用多實例,也就是邏輯認爲是獨立機器)

在這裏插入圖片描述

實驗環境
centos 7.6 mysql-5.7.24 (MGR集羣只有在5.7.17版本之後才能配置)
機器 2G 1核
實現前準備
[root@mysql-mgr-master ~]# systemctl stop firewalld && systemctl disable firewalld
[root@mysql-mgr-master ~]# setenforce 0
[root@mysql-mgr-master ~]# sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
[root@mysql-mgr-master ~]# tail -n 3 /etc/hosts
192.168.0.159 mysql-mgr-master
192.168.0.160 mysql-mgr-slave1
192.168.0.161 mysql-mgr-slave2
mysql編譯安裝腳本
#/usr/bin/env bash
#Author:Yingjian
#data 2020.5.12
#version:1.9

#env
src=/usr/local/src
id=`ip a |grep inet |grep brd|awk -F'/' '{print $1}'|awk -F'.' '{print $4}'`

ping -c1 -w1 www.baidu.com &>/dev/null
if [ ! $? -eq 0 ];then
echo "請檢查你的網絡是否有問題!"
exit 1
fi

yum1=`yum repolist |grep repolist |awk '{print $2}'|sed 's/,//'`
if [ $yum1 -lt 20000 ];then
rm -rf /etc/yum.repos.d/* && curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo &>/dev/null
yum clean all && yum makecache &>/dev/null
yum -y install epel-release &>/dev/null
fi
#
yum -y groupinstall "Development Tools" >/dev/null 2>&1
yum -y install make cmake gcc gcc-g++ ncurses ncurses-devel bison bison-devel libgcrypt perl &>/dev/null

#wget -P $src https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-boost-5.7.24.tar.gz
#獲取該文件所在的目錄
echo "如果執行過長 請手動修改此腳本 IN line 28"

abc=`find / -iname 'mysql-boost-5.7.24.tar.gz' |awk -F'mysql' '{print $1}'`

cd $abc

if [ ! -f $abc\mysql-boost-5.7.24.tar.gz ];then
echo "你還未下載mysql-boost-5.7.24"
echo "下載後在執行該腳本"
exit 1
fi

groupadd mysql
useradd -M -g mysql -s /sbin/nologin mysql

mkdir -p /usr/local/mysqld/{data,mysql,log,tmp}
chown -R mysql:mysql /usr/local/mysqld/*

tar xzvf $abc\mysql-boost-5.7.24.tar.gz -C $src
#tar xf $abc\mysql-boost-5.7.24.tar.gz -C $src

cd $src/mysql-5.7.24
cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysqld/mysql \
-DMYSQL_DATADIR=/usr/local/mysqld/data \
-DWITH_BOOST=$src/mysql-5.7.24/boost \
-DDEFAULT_CHARSET=utf8

if [ ! $? -eq 0 ];then
echo "make 失敗 請檢查路徑和依賴包有無下載"
echo "請執行此命令 再次執行該腳本"
echo "rm -rf $src/CMakeCache.txt"
exit 2
fi

make -j `lscpu |awk 'NR==4{print $2}'`

if [ ! $? -eq 0 ];then
echo "make 失敗 請檢查環境是否健康"
exit 3
fi

make install

if [ $? -eq 0 ];then
echo "`date +%Y%m%d-%H:%M:%S` Congratulations Complete"
else
echo "編譯失敗 請檢測腳本或聯繫該作者"
exit 4
fi

#提升MySQL命令爲系統級別命令
echo "export PATH=$PATH:/usr/local/mysqld/mysql/bin" >/etc/profile.d/mysql.sh
#加載環境變量
source /etc/profile.d/mysql.sh
if [ ! $? -eq 0];then
echo "請手動source /etc/profile.d/mysql.sh 手動執行下面命令\n刪除生成的文件重新\tsource $0啓動該腳本即可 "
fi
#修改新生成文件的屬主組
chown -R mysql.mysql /usr/local/mysqld/*

cd $src/../mysqld/mysql/mysql-test/include
#備份/etc/my.cnf
mv /etc/my.cnf /etc/my.cnf.bak
#拷貝生成的配置到my.cnf
cp default_mysqld.cnf /etc/my.cnf

cat >> /etc/my.cnf <<-EOF
basedir = /usr/local/mysqld/mysql
datadir = /usr/local/mysqld/data
tmpdir = /usr/local/mysqld/tmp
socket = /usr/local/mysqld/tmp/mysql.sock
pid_file = /usr/local/mysqld/tmp/mysqld.pid
log_error = /usr/local/mysqld/log/mysql_error.log
slow_query_log_file = /usr/local/mysqld/log/slow_warn.log

server_id = $id
user = mysql
port = 3306
bind-address = 0.0.0.0
character-set-server = utf8
default_storage_engine = InnoDB
EOF

#初始化數據庫
/usr/local/mysqld/mysql/bin/mysqld --defaults-file=/etc/my.cnf --initialize --user='mysql'
#啓動mysqld服務
nohup /usr/local/mysqld/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf &

#設置mysql.socket軟鏈接到mysql命令指定目錄中
ln -s $src/../mysqld/tmp/mysql.sock /tmp/mysql.sock
#配置mysql服務的管理工具
cd $src/../mysqld/mysql/support-files
cp mysql.server /etc/init.d/mysqld
chkconfig --add mysqld
#systemctl enable mysqld 無法設置開機自啓,只能用下列命令
chkconfig mysqld on

#統一修改密碼
passwd=`grep "password" /usr/local/mysqld/log/mysql_error.log |awk -F'@' '{print $2}'|awk '{print $2}'`
if [ -n "$passwd" ];then
echo "mysql初始密碼爲$passwd"
else
echo "獲取密碼失敗,請檢測腳本"
exit 8
fi
#echo 'grep "password" /usr/local/mysqld/log/mysql_error.log |awk -F'@' '{print $2}'|awk '{print $2}'` 獲取mysql初始密碼'
#
#2020-05-11T05:53:09.526931Z 1 [Note] A temporary password is generated for root@localhost: WF&hYq5suyes
mysql -u'root' -p"$passwd" --connect-expired-password -e"alter user 'root'@'localhost' identified by 'Lige@2020'"
#以systemctl啓動服務
ps -ef |grep mysqld |grep -v "grep"|awk '{print $2}' >$src/kill.txt

for i in `cat $src/kill.txt`
do
kill -9 $i
sleep 2
done

echo -e "請手動執行systemctl restart mysqld\t啓動mysql服務\n如果啓動失敗 請查看mysql是否已啓動"
echo "systemctl 命令管理mysql服務"
echo "`date +%Y%m%d-%H:%M:%S` 腳本執行成功"
echo -e "mysql密碼修改爲Lige@2020\nmysql -uroot -pLige@2020嘗試登錄\n如果使用該密碼無法登錄 可以嘗試使用"$passwd"初始密碼登錄"
echo -e "爲了您的使用安全,請記得修改密碼\n格式如下\t alter user 'root'@'localhost' identified by 'Lige@2020'"
安裝路徑/usr/local/mysqld
數據目錄/usr/local/mysqld/data
日誌目錄/usr/local/mysqld/log
  1. 下面爲我做實驗的mysql配置文件
basedir = /usr/local/mysqld/mysql
datadir = /usr/local/mysqld/data
tmpdir = /usr/local/mysqld/tmp
socket = /usr/local/mysqld/tmp/mysql.sock
pid_file = /usr/local/mysqld/tmp/mysqld.pid
log_error = /usr/local/mysqld/log/mysql_error.log
slow_query_log_file = /usr/local/mysqld/log/slow_warn.log

server_id = 159   #每個mysql服務的標識必須爲不同
user = mysql
port = 3306
bind-address = 0.0.0.0
character-set-server = utf8
default_storage_engine = InnoDB

master_info_repository = TABLE
relay_log_info_repository = TABLE
relay_log_recovery=1
gtid_mode = on
enforce_gtid_consistency = 1
log_slave_updates = ON
binlog_checksum=NONE
slave_preserve_commit_order = ON #開啓並行複製相關
slave_parallel_type=LOGICAL_CLOCK
slave_parallel_workers=1 #根據CPU的
log-bin=/usr/local/mysqld/log/mysql-bin

transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
loose-group_replication_start_on_boot=off  #mysql配置插件相關的參數 只能在插件加載之後設置,如果想啓動時設置這些參數並且啓動後加載插件到配置文件中,可以在參數前加上“loose-”前綴。
loose-group_replication_local_address="192.168.0.159:33306"  #需要修改
loose-group_replication_group_seeds="192.168.0.159:33306,192.168.0.160:33306,192.168.0.161:33306" #修改
loose-grup_replication_bootstrap_group=off
loose-group_replication_single_primary_mode = on #默認不填寫到my.cnf是ON即單主模式 OFF爲多主模式
loose-group_replication_enforce_update_everywhere_checks = off #配置多主模式的時候需要調整爲ON

report_host='mysql-mgr-master'
report_port=3306
  1. 下面爲比較詳細的mysql配置文件

    [client]
    port = 3306
    socket = /usr/local/mysql/tmp/mysql.sock
     
    [mysqld]
    port = 3306
    socket = /usr/local/mysql/tmp/mysql.sock
    back_log = 80
    basedir = /usr/local/mysql
    tmpdir = /tmp
    datadir = /usr/local/mysql/data
     
    #-------------------gobal variables------------#
    gtid_mode = ON
    enforce_gtid_consistency = ON
    master_info_repository = TABLE
    relay_log_info_repository = TABLE
    binlog_checksum = NONE
    log_slave_updates = ON
    log-bin = /usr/local/mysql/log/mysql-bin
    transaction_write_set_extraction = XXHASH64
    loose-group_replication_group_name = 'ce9be252-2b71-11e6-b8f4-00212844f856'
    loose-group_replication_start_on_boot = off
    loose-group_replication_local_address = '192.168.1.20:33061'
    loose-group_replication_group_seeds ='192.168.1.20:33061,192.168.1.21:33061,192.168.1.22:33061'
    loose-group_replication_bootstrap_group = off
    max_connect_errors = 20000
    max_connections = 2000
    wait_timeout = 3600
    interactive_timeout = 3600
    net_read_timeout = 3600
    net_write_timeout = 3600
    table_open_cache = 1024
    table_definition_cache = 1024
    thread_cache_size = 512
    open_files_limit = 10000
    character-set-server = utf8
    collation-server = utf8_bin
    skip_external_locking
    performance_schema = 1
    user = mysql
    myisam_recover_options = DEFAULT
    skip-name-resolve
    local_infile = 0
    lower_case_table_names = 0
     
    #--------------------innoDB------------#
    innodb_buffer_pool_size = 2000M
    innodb_data_file_path = ibdata1:200M:autoextend
    innodb_flush_log_at_trx_commit = 1
    innodb_io_capacity = 600
    innodb_lock_wait_timeout = 120
    innodb_log_buffer_size = 8M
    innodb_log_file_size = 200M
    innodb_log_files_in_group = 3
    innodb_max_dirty_pages_pct = 85
    innodb_read_io_threads = 8
    innodb_write_io_threads = 8
    innodb_support_xa = 1
    innodb_thread_concurrency = 32
    innodb_file_per_table
    innodb_rollback_on_timeout
     
    #------------session variables-------#
    join_buffer_size = 8M
    key_buffer_size = 256M
    bulk_insert_buffer_size = 8M
    max_heap_table_size = 96M
    tmp_table_size = 96M
    read_buffer_size = 8M
    sort_buffer_size = 2M
    max_allowed_packet = 64M
    read_rnd_buffer_size = 32M
     
    #------------MySQL Log----------------#
    log-bin = my3306-bin
    binlog_format = row
    sync_binlog = 1
    expire_logs_days = 15
    max_binlog_cache_size = 128M
    max_binlog_size = 500M
    binlog_cache_size = 64k
    slow_query_log
    log-slow-admin-statements
    log_warnings = 1
    long_query_time = 0.25
     
    #---------------replicate--------------#
    relay-log-index = relay3306.index
    relay-log = relay3306
    server-id = 20
    init_slave = 'set sql_mode=STRICT_ALL_TABLES'
    log-slave-updates
    [myisamchk]
    key_buffer = 512M
    sort_buffer_size = 512M
    read_buffer = 8M
    write_buffer = 8M
    [mysqlhotcopy]
    interactive-timeout
    [mysqld_safe]
    open-files-limit = 8192
    log-error = /usr/local/mysql/log/mysqld_error.log
    
    my.cnf 此文件中的參數配置需對應不同服務器配置不同的參數,從而達到與應用結合後的最佳狀態
    
    服務器啓動
     mysqld --defaults-file=/etc/my.cnf --initialize --user='mysql' #數據庫服務初始化
     nohup mysqld_safe --defaults-file=/etc/my.cnf & #加載相對應的配置文件並啓動
    
    MGR配置單主模式
    在主192.168.0.19上
    [root@mysql-mgr-master mysqld]# tailf nohup.out 
    2020-05-21T02:39:03.082561Z mysqld_safe Logging to '/usr/local/mysqld/log/mysql_error.log'.
    2020-05-21T02:39:03.112817Z mysqld_safe Starting mysqld daemon with databases from /usr/local/mysqld/data
    過濾初始化生成的密碼
    grep "password" /usr/local/mysqld/log/mysql_error.log
    2020-05-21T02:37:38.228592Z 1 [Note] A temporary password is generated for root@localhost: tl-Z>kesL80d
    [root@mysql-mgr-master ~]# mysql -uroot -p"tl-Z>kesL80d"
    修改密碼
    mysql> alter user "root"@"localhost" identified by "Lige@2020";
    mysql> flush privileges;
    

    創建複製賬號、不記錄到bin_log日誌

    mysql> set sql_log_bin=0;
    mysql> create user 'repl'@'192.168.0.%';
    mysql> grant replication slave on *.* to "repl"@"192.168.0.%" identified by "Lige@Lige";
    mysql> flush privileges;
    mysql> set sql_log_bin=1;
    mysql> change master to master_user='repl', master_password='Lige@Lige' for CHANNEL 'group_replication_recovery'; #授權 使用group_replication_recovery複製通道的給定憑證。
    

    安裝插件

    mysql> install plugin group_replication soname 'group_replication.so';
    mysql> show plugins;
    | group_replication          | ACTIVE   | GROUP REPLICATION  | group_replication.so | GPL    #看最後
    

    查看group相關的參數

    mysql> show global variables like "%group%";
    

    啓動組複製

    mysql> set global group_replication_bootstrap_group=ON;
    mysql> start group_replication;
    mysql> set global group_replication_bootstrap_group=OFF;
    mysql> select * from performance_schema.replication_group_members;
    +---------------------------+--------------------------------------+------------------+-------------+--------------+
    | CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST      | MEMBER_PORT | MEMBER_STATE |
    +---------------------------+--------------------------------------+------------------+-------------+--------------+
    | group_replication_applier | 9c078212-9b0f-11ea-807b-000c29a77e1c | mysql-mgr-master |        3306 | ONLINE       |
    +---------------------------+--------------------------------------+------------------+-------------+--------------+
    

    測試

    mysql> create database yingjian;
    mysql> create table test(id int,name varchar(50));
    ysql> insert into test values (1 , 'ying');
    ERROR 3098 (HY000): The table does not comply with the requirements by an external plugin.(group_replication表結構必須要有主鍵)
    mysql> drop table test;
    mysql> create table test(id int primary key,name varchar(50));
    mysql> insert into test values (1 , 'ying');
    Query OK, 1 row affected (0.02 sec)
    mysql> select * from test;
    +----+------+
    | id | name |
    +----+------+
    |  1 | ying |
    +----+------+
    
    

    配置MGR-slave

    my.cnf

    server_id = 159
    user = mysql
    port = 3306
    bind-address = 0.0.0.0
    character-set-server = utf8
    default_storage_engine = InnoDB
    
    master_info_repository = TABLE
    relay_log_info_repository = TABLE
    relay_log_recovery=1
    gtid_mode = on
    enforce_gtid_consistency = 1
    log_slave_updates = ON
    binlog_checksum=NONE
    slave_preserve_commit_order = ON
    slave_parallel_type=LOGICAL_CLOCK
    slave_parallel_workers=1
    log-bin=/usr/local/mysqld/log/mysql-bin
    
    transaction_write_set_extraction=XXHASH64
    loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
    loose-group_replication_start_on_boot=off
    loose-group_replication_local_address="192.168.0.159:33306"
    loose-group_replication_group_seeds="192.168.0.159:33306,192.168.0.160:33306,192.168.0.161:33306"
    loose-grup_replication_bootstrap_group=off
    
    report_host='mysql-mgr-master'
    report_port=3306
    

    創建複製賬號、不記錄到bin_log日誌

    mysql> set sql_log_bin=0;
    mysql> create user 'repl'@'192.168.0.%';
    mysql> grant replication slave on *.* to "repl"@"192.168.0.%" identified by "Lige@Lige";
    mysql> flush privileges;
    mysql> set sql_log_bin=1;
    mysql> change master to master_user='repl', master_password='Lige@Lige' for CHANNEL 'group_replication_recovery';
    
    mysql> install plugin group_replication soname 'group_replication.so';
    
    mysql> set global group_replication_allow_local_disjoint_gtids_join=ON; #添加到複製組
    mysql> start group_replication;
    mysql> select * from performance_schema.replication_group_members;
    +---------------------------+--------------------------------------+------------------+-------------+--------------+
    | CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST      | MEMBER_PORT | MEMBER_STATE |
    +---------------------------+--------------------------------------+------------------+-------------+--------------+
    | group_replication_applier | 2d3c0be2-9b15-11ea-b934-000c29a77e1c | mysql-mgr-master |        3306 | ONLINE       |
    | group_replication_applier | 373f4bb5-9b16-11ea-84bd-000c291b4ad0 | mysql-mgr-slave1 |        3306 | ONLINE       |
    +---------------------------+--------------------------------------+------------------+-------------+--------------+
    mysql> select * from test;
    +----+------+
    | id | name |
    +----+------+
    |  1 | ying |
    +----+------+
    mysql> insert into test values(2,'jian');
    ERROR 1290 (HY000): The MySQL server is running with the --super-read-only option so it cannot execute this statement #插入數據失敗 只讀模式
    mysql> show global 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   |
    +-----------------------+-------+ #從服務器只讀是開啓的 所以無法插入數據
    
    mysql> show global variables like "%read_only%";
    +-----------------------+-------+
    | Variable_name         | Value |
    +-----------------------+-------+
    | innodb_read_only      | OFF   |
    | read_only             | OFF   |
    | super_read_only       | OFF   |
    | transaction_read_only | OFF   |
    | tx_read_only          | OFF   |
    +-----------------------+-------+ #主服務器是關閉的
    

    查看該服務器是不是主服務器

    mysql> select variable_value from information_schema.global_status where variable_name='group_replication_primary_memmber';
    +--------------------------------------+
    | variable_value                       |
    +--------------------------------------+
    | 2d3c0be2-9b15-11ea-b934-000c29a77e1c |
    +--------------------------------------+
    mysql> select * from replication_group_members;
    +---------------------------+--------------------------------------+------------------+-------------+--------------+
    | CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST      | MEMBER_PORT | MEMBER_STATE |
    +---------------------------+--------------------------------------+------------------+-------------+--------------+
    | group_replication_applier | 2d3c0be2-9b15-11ea-b934-000c29a77e1c | mysql-mgr-master |        3306 | ONLINE       |
    | group_replication_applier | 373f4bb5-9b16-11ea-84bd-000c291b4ad0 | mysql-mgr-slave1 |        3306 | ONLINE       |
    +---------------------------+--------------------------------------+------------------+-------------+--------------+
    #很明顯 mysql-mgr-master 爲主
    mysql> select @@server_uuid; #查看該節點上的UUID
    +--------------------------------------+
    | @@server_uuid                        |
    +--------------------------------------+
    | 373f4bb5-9b16-11ea-84bd-000c291b4ad0 |
    +--------------------------------------+
    

    測試MGR單主模式下的是否支持高可用

    192.168.0.159
    mysql> stop group_replication;
    mysql> select * from performance_schema.replication_group_members;
    +---------------------------+--------------------------------------+------------------+-------------+--------------+
    | CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST      | MEMBER_PORT | MEMBER_STATE |
    +---------------------------+--------------------------------------+------------------+-------------+--------------+
    | group_replication_applier | 2d3c0be2-9b15-11ea-b934-000c29a77e1c | mysql-mgr-master |        3306 | OFFLINE      |
    +---------------------------+--------------------------------------+------------------+-------------+--------------+
    
    mysql> show global variables like "%read_only%";
    +-----------------------+-------+
    | Variable_name         | Value |
    +-----------------------+-------+
    | innodb_read_only      | OFF   |
    | read_only             | OFF   |
    | super_read_only       | OFF   |
    | transaction_read_only | OFF   |
    | tx_read_only          | OFF   |
    +-----------------------+-------+
    # 此時mysql-mgr-slave1成爲master
    現在並添加數據
    mysql> insert into test values(2,'jian');
    mysql> SELECT * FROM test;
    +----+------+
    | id | name |
    +----+------+
    |  1 | ying |
    |  2 | jian |
    +----+------+
    mysql> start group_replication; #重啓mgr-master
    mysql> select * from performance_schema.replication_group_members;
    +---------------------------+--------------------------------------+------------------+-------------+--------------+
    | CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST      | MEMBER_PORT | MEMBER_STATE |
    +---------------------------+--------------------------------------+------------------+-------------+--------------+
    | group_replication_applier | 2d3c0be2-9b15-11ea-b934-000c29a77e1c | mysql-mgr-master |        3306 | ONLINE       |
    | group_replication_applier | 373f4bb5-9b16-11ea-84bd-000c291b4ad0 | mysql-mgr-slave1 |        3306 | ONLINE       |
    | group_replication_applier | cd90ec9f-9b1c-11ea-89cb-000c29036b74 | mysql-mgr-slave2 |        3306 | ONLINE       |
    +---------------------------+--------------------------------------+------------------+-------------+--------------+
    mysql> select * from test;
    +----+------+
    | id | name |
    +----+------+
    |  1 | ying |
    |  2 | jian |
    +----+------+
    這個時候主並不會返回到master上 而是還在slave1上
    set global group_replication_member_weight=80; (最高即可) 可設置權重使主宕機後跳到指定的slave爲master   如果權重一樣 即都是默認 則比較uuid的大小
    
    切換到多主模式
    MGR切換模式需要重新啓動組複製,因些需要在所有節點上先關閉組複製,設置 
    group_replication_single_primary_mode=OFF 等參數,再啓動組複製。
    #停止組複製(所有節點執行)
    mysql> stop group_replication;
    mysql> set global group_replication_single_primary_mode=OFF;
    mysql> set global group_replication_enforce_update_everywhere_checks=ON;
    # 隨便選擇在某個節點執行
    mysql> SET GLOBAL group_replication_bootstrap_group=ON; 
    mysql> START GROUP_REPLICATION; 
    mysql> SET GLOBAL group_replication_bootstrap_group=OFF;
    其他節點執行
    mysql> START GROUP_REPLICATION;
    查看組信息
    mysql> SELECT * FROM performance_schema.replication_group_members;
    +---------------------------+--------------------------------------+------------------+-------------+--------------+
    | CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST      | MEMBER_PORT | MEMBER_STATE |
    +---------------------------+--------------------------------------+------------------+-------------+--------------+
    | group_replication_applier | 2d3c0be2-9b15-11ea-b934-000c29a77e1c | mysql-mgr-master |        3306 | ONLINE       |
    | group_replication_applier | 373f4bb5-9b16-11ea-84bd-000c291b4ad0 | mysql-mgr-slave1 |        3306 | ONLINE       |
    | group_replication_applier | cd90ec9f-9b1c-11ea-89cb-000c29036b74 | mysql-mgr-slave2 |        3306 | ONLINE       |
    +---------------------------+--------------------------------------+------------------+-------------+--------------+
    mysql> show global variables like "%read_only%";
    都是OFF 即都爲主
    
切回單主模式
#所有節點執行
mysql> stop group_replication;
mysql> set global group_replication_enforce_update_everywhere_checks=OFF;
mysql> set global group_replication_single_primary_mode=ON;
# 主節點(192.168.0.159)執行
SET GLOBAL group_replication_bootstrap_group=ON; 
START GROUP_REPLICATION; 
SET GLOBAL group_replication_bootstrap_group=OFF;
# 從節點(192.168.0.160、192.168.0.161)執行
START GROUP_REPLICATION;
# 查看MGR組信息
mysql> SELECT * FROM performance_schema.replication_group_members;

一些補充
站在巨人肩膀上的總結

1)在各個正常成員上查看各自的組內通信地址:
SELECT @@group_replication_local_address;
如果服務器正常使用過程中需要添加機器 
即可在set global group_replication_group_seeds=所有節點的ip+端口
如果在配置過程中有報錯 請查看錯誤日誌

multi-master 模式 (多主,性能有15%的損失)
如果要開啓multi-master 模式,需要在配置文件/etc/my.cnf 中指定
loose-group_replication_single_primary_mode=OFF; 
loose-group_replication_enforce_update_everywhere_checks=ON;
#查看該服務器是否宕機  可用於監控
select member_id,member_host,member_state from performance_schema.replication_group_members where member_id=@@server_uuid;
#查看當前是不是可讀
mysql> select * from performance_schema.global_variables where variable_name in ('read_only', 'super_read_only');
本節點執行隊列是不是有堆積(大於0表示有延遲):
mysql> select count_transactions_in_queue from performance_schema.replication_group_member_stats where member_id=@@seerver_uuid;

流控(flow control)
當啓用: 
group_replication_flow_control_mode=QUOTA 是表示啓用流控。 流控默認通過兩個參數控制:
group_replication_flow_control_applier_threshold (默認: 25000)
group_replication_flow_control_certifier_threshold (默認: 25000)

也就說默認延遲在25000個GTID時,會對整個集羣Block住寫操作。
當然,也可以允許,節點延遲,就如同我們主從結構,從節點延遲,不往上面發請求就可以。

關閉流控:
set global group_replication_flow_control_mode='DISABLED';
提示: 關閉流控制,注意查看是不是存在延遲,如果延遲,自已控制閥值不向上面發請求即可。 多IDC結構的MGR,建議關閉流控。

MGR調優參數
因爲基本複製結構,所有的數據複製,還是邏輯的重放,所以優化也是複製優化點。
slave_parallel_type -> LOGICAL_CLOCK   #增強sql_thread個數:
slave_parallel_workers -> 2-8          #如果CPU瓶頸,網絡沒問題,減少CPU壓縮:
group_replication_compression_threshold = 1000000 -> 2000000
由原來的1M變成2M,再進行壓縮(主要針對大事務傳述優化)

流控(flow control)
當啓用:
group_replication_flow_control_mode=QUOTA 是表示啓用流控。 流控默認通過兩個參數控制:
group_replication_flow_control_applier_threshold (默認: 25000)
group_replication_flow_control_certifier_threshold (默認: 25000)

也就說默認延遲在25000個GTID時,會對整個集羣Block住寫操作。
當然,也可以允許,節點延遲,就如同我們主從結構,從節點延遲,不往上面發請求就可以。

關閉流控:
set global group_replication_flow_control_mode=‘DISABLED’;
提示: 關閉流控制,注意查看是不是存在延遲,如果延遲,自已控制閥值不向上面發請求即可。 多IDC結構的MGR,建議關閉流控。

MGR調優參數
因爲基本複製結構,所有的數據複製,還是邏輯的重放,所以優化也是複製優化點。
slave_parallel_type -> LOGICAL_CLOCK #增強sql_thread個數:
slave_parallel_workers -> 2-8 #如果CPU瓶頸,網絡沒問題,減少CPU壓縮:
group_replication_compression_threshold = 1000000 -> 2000000
由原來的1M變成2M,再進行壓縮(主要針對大事務傳述優化)






























發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章