mysql MGR集羣配置
Mysql Group Replication簡介 (官網翻譯)
Mysql Group Replication(MGR)是一個全新的高可用和高擴張的MySQL集羣服務。
-
高一致性,基於原生複製及paxos協議的組複製技術,以插件方式提供一致數據安全保證;
-
高容錯性,大多數服務正常就可繼續工作,自動不同節點檢測資源徵用衝突,按順序優先處理,內置自動防腦裂機制;
-
高擴展性,自動添加移除節點,並更新組信息;
-
高靈活性,單主模式和多主模式。單主模式自動選主,所有更新操作在主進行;多主模式,所有server同時更新。
Mysql Group replication與傳統複製的區別和大幅改進
1.傳統複製
主-從複製:有一個主和不等數量的從。主節點執行的事務會異步發送給從節點,在從節點重新執行。(異步和半同步)
(半同步相對異步Master會確認Slave是否接到數據,更加安全)
(原理見主從複製筆記)
2.並行複製
並行複製:複製->廣播->正式複製
優勢:
彈性複製(高擴展性):server動態添加移除
高可用分片(高擴展性):分片實現寫擴展,每個分片是一個複製組。
替代主從複製(高擴展性):整組寫入,避免單點爭用。
自動化系統:自動化部署Mysql複製到已有複製協議的自動化系統。
故障檢測與容錯:自動檢測,若服務faild,組內成員大多數達成認爲該服務已不正常,則自動隔離。
組內成員會構成一個視圖,組內成員主動加入或離開(主動或被動),都會更新組配置,更新視圖。成員自願離開,先更新組配置,然後採用大多數成員(不包含主動脫離的成員)意見是否確認該成員離開更新視圖。如果是故障要排除,則需大多數服務確認(包括故障成員意見),然後纔會更新組配置和視圖。
最大允許即時故障數:f=(n-1)/2,多數正常則正常
主從複製限制
-
存儲引擎必須爲innodb
-
每個表必須提供主鍵
-
只支持ipv4,網絡需求較高
-
一個group最多只能有9臺服務器
-
不支持Replication event checksums,
-
不支持Savepoints
-
multi-primary mode部署方式不支持SERIALIZABLE事務隔離級別
-
multi-primary mode部署方式不能完全支持級聯外鍵約束
-
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
- 下面爲我做實驗的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
-
下面爲比較詳細的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,再進行壓縮(主要針對大事務傳述優化)