MySQL5.7 MGR介紹及安裝

MySQL5.7 MGR介紹及安裝

文章來源: 陶老師運維筆記- 微信公衆號html

官方介紹:node

1. MGR介紹

MySQL Group Replication(簡稱MGR)是MySQL官方於2016年12月,MySQL5.7版本出現的新特性,提供高可用、高擴展、高可靠(強一致性)的MySQL集羣服務。同類型的技術產品有MariaDB Galera Cluster和Percona XtraDB Cluster。 MGR由多個實例節點共同組成一個數據庫集羣系統提交事務必須通過半數以上節點贊成方可提交,在集羣中每一個節點上都維護一個數據庫狀態機,保證節點間事務的一致性.mysql

MySQL組複製分單主模式和多主模式,mysql 的複製技術僅解決了數據同步的問題,若是 master 宕機,意味着數據庫管理員須要介入,應用系統仍可能須要修改數據庫鏈接地址或者重啓才能實現。(這裏也可使用數據庫中間件產品來避免應用系統數據庫鏈接的問題,例如 mycat 和 atlas 等產品)。 組複製在數據庫層面上作到了,只要集羣中大多數主機可用,則服務可用,也就是說3臺服務器的集羣,容許其中1臺宕機。linux

1.1 MGR架構

MGR架構

1.2 組複製的兩種模式

MGR提供了single-primary和multi-primary兩種模式。算法

  • single-primary mode(單寫模式): 組內只有一個節點負責寫入,讀能夠從任意一個節點讀取,組內數據保持最終一致;
  • multi-primary mode(多寫模式): 全部的 server 成員均可以同時接受更新;即寫會下發到組內全部節點,組內全部節點同時可讀,也是可以保證組內數據最終一致性。 注意:一個MGR的全部節點必須配置使用同一種模式,不可混用!

1.3 MRG組複製特色

MGR優勢:sql

  • 高一致性,基於原生複製及paxos協議的組複製技術.
  • 高容錯性,有自動檢測機制,當出現宕機後,會自動剔除問題節點,其餘節點能夠正常使用,當不一樣節點產生資源爭用衝突時,會按照先到先得處理,而且內置了自動化腦裂防禦機制.
  • 高擴展性,可隨時在線新增和移除節點,會自動同步全部節點上狀態,直到新節點和其餘節點保持一致,自動維護新的組信息.
  • 高靈活性,以插件形式安裝,有兩種模式:單主模式和多主模式

限制:數據庫

  • 存儲引擎僅支持InnoDB表,而且每張表必定要有一個主鍵,用於作write set的衝突檢測;
  • 每一個表必須提供主鍵;
  • 只支持ipv4,網絡需求較高;
  • 必須打開GTID特性,二進制日誌格式必須設置爲ROW,用於選主與write set;
  • COMMIT可能會致使失敗,相似於快照事務隔離級別的失敗場景;
  • 目前一個MGR集羣組最多支持9個節點;
  • 不支持外鍵於save point特性,沒法作全局間的約束檢測與部分部分回滾;
  • 二進制日誌binlog不支持Replication event checksums;
  • 多主模式(也就是多寫模式) 不支持SERIALIZABLE事務隔離級別;
  • 多主模式不能徹底支持級聯外鍵約束;
  • 多主模式不支持在不一樣節點上對同一個數據庫對象併發執行DDL(在不一樣節點上對同一行併發進行RW事務,後發起的事務會失敗);

1.4 MRG組複製使用場景

組複製的一些典型應用場景:bootstrap

  • 可伸縮的複製 - 須要很是流暢的複製架構環境,能夠動態的增長、減小服務器節點數量且儘量少地 帶來反作用。例如,數據庫服務部署在雲上。
  • 高可用的分片(sharding) - Sharding是實現寫伸縮(scale-out)很是流行的方法。使用MySQL組複製來 實現高可用的sharding,每個分片對應一個複製組。
  • 可切換的master-slave複製 - 在某些特定環境下,使用單主模型會出現單主瓶頸和單點故障的問題。 而寫入整個組,可能會有能夠有更好的可擴展性。
  • 自動化集羣系統 - 此外,你能夠部署MySQL組複製,只爲使用它的自動切換能力(前文和本章已經描 述過了)。

2. MRG原理及其餘複製對比

來源參考: www.cnblogs.com/luoahong/ar…bash

2.1 MySQL異步複製

master事務的提交不須要通過slave的確認,slave是否接收到master的binlog,master並不care。slave接收到master binlog後先寫relay log,最後異步地去執行relay log中的sql應用到自身。因爲master的提交不須要確保slave relay log是否被正確接受,當slave接受master binlog失敗或者relay log應用失敗,master沒法感知。服務器

異步複製

\color{red}{假設master發生宕機而且binlog還沒來得及被slave接收,而切換程序將slave提高爲新的master,就會出現數據不一致的狀況! } 另外,在高併發的狀況下,傳統的主從複製,從節點可能會與主產生較大的延遲(固然mysql後續版本陸續作了優化,推出了並行複製,以此下降異步複製的延遲)

2.2 MySQL半同步複製

基於傳統異步存在的缺陷,mysql在5.5版本推出半同步複製。能夠說半同步複製是傳統異步複製的改進,在master事務的commit以前,必須確保一個slave收到relay log而且響應給master之後,才能進行事務的commit。 可是slave對於relay log的應用仍然是異步進行的,原理以下圖所示:

MySQL半同步複製

半同步複製,它在異步複製基礎上添加了一個同步操做。master須要等待slave的 ack回覆,而後才能提交事務。

2.3 MRG組複製

基於傳統異步複製和半同步複製的缺陷——數據的一致性問題沒法保證,MySQL官方在5.7.17版本正式推出組複製(MySQL Group Replication,簡稱MGR)。 由若干個節點共同組成一個複製組,一個事務的提交,必須通過組內大多數節點(N / 2 + 1)決議並經過,才能得以提交。 引入組複製,主要是爲了解決傳統異步複製和半同步複製可能產生數據不一致的問題。組複製依靠分佈式一致性協議(Paxos協議的變體),實現了分佈式下數據的最終一致性,提供了真正的數據高可用方案。

MGR

image.png

基於組的複製(Group-basedReplication)是一種被使用在容錯系統中的技術。Replication-group(複製組)是由可以相互通訊的多個服務器(數據庫實例)組成的。在通訊層,Groupreplication實現了一系列的機制:好比原子消息(atomicmessage delivery)和全序化消息(totalorderingof messages)。 簡而言之,一個Replication-group就是一組節點,每一個節點均可以獨立執行事務,而讀寫事務則會在於group內的其餘節點進行協調以後再commit。所以,當一個事務準備提交時,會自動在group內進行原子性的廣播,告知其餘節點變動了什麼內容/執行了什麼事務。

說明

  • MySQL組複製是一種 share-nothing 複製方案,其中每一個 server 成員都有本身的完整數據副本。
  • 任何 RW 事務,提交操做並非由始發 server 單向決定的,而是由組來決定是否提交。

3. 環境準備

規劃以下:

角色 IP port server-id
DB-1 192.110.103.41 3106 103413106
DB-2 192.110.103.42 3106 103423106
DB-3 192.110.103.43 3106 103423106

說明:機器上port 3306已在使用被佔了,只好改用3106。

4.安裝MySQL軟件

4.1 安裝軟件 能夠yum安裝或二進制安裝。本文用二進制版本安裝。 1)yum安裝

yum localinstall https://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm
yum install -y mysql-community-server
#啓動MySQL服務器和MySQL的自動啓動
systemctl start mysqld.service
systemctl enable mysqld.service
複製代碼

2)二進制安裝 下載軟件: dev.mysql.com/downloads/m…

#下載2進製版MySQL5.7
$wget xxx/mysql-5.7.23-linux-glibc2.12-x86_64.tar.gz . 
tar -xvzf mysql-5.7.23-linux-glibc2.12-x86_64.tar.gz
mv mysql-5.7.23-linux-glibc2.12-x86_64 /usr/local/mysql-5.7.23
ln -s /usr/local/mysql-5.7.23 /usr/local/mysql
複製代碼

4.2 初始化

DB_BASE_DIR='/data1/mysql_3106'

mkdir -p ${DB_BASE_DIR}/{data,etc,logs,tmp}
$tree mysql_3106/
mysql_3106/
├── data
├── etc
├── logs
└── tmp

useradd mysql
chown -R mysql.mysql ${DB_BASE_DIR}
#初始化init
cd  /usr/local/mysql-5.7.23/
 /usr/local/mysql-5.7.23/bin/mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql-5.7.23 --datadir=${DB_BASE_DIR}/data

複製代碼

5. MGR安裝與配置

5.1 my.cnf配置

在三臺機器上設置環境變量,記得CURRENT_IP要相應的調整。

#在三臺機器上環境變量.
PROG_BASE_DIR='/usr/local/mysql-5.7.23'
DB_BASE_DIR='/data1/mysql_3106'

CURRENT_IP='192.110.103.41'  #要逐臺變化
NODE1_IP='192.110.103.41'
NODE2_IP='192.110.103.42'
NODE3_IP='192.110.103.43'
PORT='3106'
SERVICE_ID=`echo ${CURRENT_IP} | awk -F"." '{printf "%s%s", $3,$4 }'`
CLUSTER_NAME='mysqlmgr-test'
複製代碼

生成配置文件

#mkdir -p ${DB_BASE_DIR}/{data,etc,logs,tmp}
#生成配置文件
cat > ${DB_BASE_DIR}/etc/my.cnf << EOF
[client]
port = ${PORT}
socket = ${DB_BASE_DIR}/tmp/mysql.sock
default-character-set=utf8
 
[mysql]
no_auto_rehash
max_allowed_packet = 16M
prompt = '\u@\h [\d]> ' # 'user@host [schema]> '
default_character_set = utf8
 
[mysqldump]
max_allowed_packet = 16M
 
[mysqld_safe]
open_files_limit = 8192
user = mysql
pid_file = ${DB_BASE_DIR}/tmp/mysql.pid
 
[mysqld]
# Base
port = ${PORT}
socket = ${DB_BASE_DIR}/tmp/mysql.sock
server-id=$SERVICE_ID
user = mysql
basedir = ${PROG_BASE_DIR}
plugin-dir=${PROG_BASE_DIR}/lib/plugin
datadir = ${DB_BASE_DIR}/data
tmpdir = ${DB_BASE_DIR}/tmp
max_allowed_packet = 64M
character_set_server = utf8
collation_server = utf8_general_ci
max_connections=5000
max_user_connections=1000
thread_cache_size = 128
 
# Query Cache
#query_cache_type = 0 # <= MySQL 8.0.3
 
# Session variables
sort_buffer_size = 2M
tmp_table_size = 32M
read_buffer_size = 128k
read_rnd_buffer_size = 256k
join_buffer_size = 128k
 
# Other buffers and caches
table_definition_cache = 1400
table_open_cache = 2000
table_open_cache_instances = 16
 
# MySQL error log
log-error = ${DB_BASE_DIR}/logs/mysqld.err
innodb_print_all_deadlocks = 1
 
# Slow Query Log
slow_query_log = 1
slow_query_log_file = ${DB_BASE_DIR}/logs/mysql_slow.log
log_queries_not_using_indexes = 0
long_query_time = 1
min_examined_row_limit = 0
 
# General Query Log
general_log = 0
general_log_file = ${DB_BASE_DIR}/logs/mysql_general.log
 
# Performance Schema
# performance_schema = OFF
 
# Binary logging and Replication
log_bin = mysql-bin
binlog_format = ROW
binlog_checksum = NONE # or CRC32
master_verify_checksum = OFF # ON if binlog_checksum = CRC32
slave_sql_verify_checksum = OFF # ON if binlog_checksum = CRC32
binlog_cache_size = 1M
binlog_stmt_cache_size = 3M
max_binlog_size = 512M
sync_binlog = 1
expire_logs_days = 7
log_slave_updates = 1
relay_log = mysql-relay-bin
relay_log_purge = 1
 
# MyISAM variables
key_buffer_size = 8M
myisam_recover_options = 'BACKUP,FORCE'
 
# MEMORY variables
max_heap_table_size = 64M # Should be greater or equal to tmp_table_size
 
# InnoDB variables
default_storage_engine = InnoDB
innodb_file_per_table = 1
innodb_data_home_dir=${DB_BASE_DIR}/data
innodb_data_file_path=ibdata1:10M:autoextend
innodb_log_group_home_dir=${DB_BASE_DIR}/data
innodb_buffer_pool_size = 4G
innodb_buffer_pool_instances = 8
innodb_stats_on_metadata=0
innodb_lock_wait_timeout=30
innodb_flush_log_at_trx_commit = 2
innodb_log_buffer_size = 8M
innodb_log_file_size = 1024M
# innodb_write_io_threads = 8 # If you have a strong I/O system or SSD
# innodb_read_io_threads = 8 # If you have a strong I/O system or SSD
# innodb_io_capacity = 1000 # If you have a strong I/O system or SSD
 
# Group Replication parameter
gtid_mode = ON
enforce_gtid_consistency = ON
master_info_repository = TABLE
relay_log_info_repository = TABLE
 
slave_parallel_workers = 10
slave_preserve_commit_order = ON
slave_parallel_type = LOGICAL_CLOCK
 
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 = "${CURRENT_IP}:${PORT}1"
loose-group_replication_group_seeds = "${NODE1_IP}:${PORT}1,${NODE2_IP}:${PORT}1,${NODE3_IP}:${PORT}1"
loose-group_replication_bootstrap_group = OFF
loose-group_replication_single_primary_mode = FALSE # = multi-primary
loose-group_replication_enforce_update_everywhere_checks=ON # = multi-primary
report_host=${CURRENT_IP}
report_port=${PORT}
EOF

#useradd mysql
chown -R mysql.mysql ${DB_BASE_DIR}
複製代碼

結果以下:

cat /data1/mysql_3106/etc/my.cnf
[client]
port = 3106
socket = /data1/mysql_3106/tmp/mysql.sock
default-character-set=utf8
 
[mysql]
no_auto_rehash
max_allowed_packet = 16M
prompt = '\u@\h [\d]> ' # 'user@host [schema]> '
default_character_set = utf8
 
[mysqldump]
max_allowed_packet = 16M
 
[mysqld_safe]
open_files_limit = 8192
user = mysql
pid_file = /data1/mysql_3106/tmp/mysql.pid
 
[mysqld]
# Base
port = 3106
socket = /data1/mysql_3106/tmp/mysql.sock
server-id=10341
user = mysql
basedir = /usr/local/mysql-5.7.23
plugin-dir=/usr/local/mysql-5.7.23/lib/plugin
datadir = /data1/mysql_3106/data
tmpdir = /data1/mysql_3106/tmp
max_allowed_packet = 64M
character_set_server = utf8
collation_server = utf8_general_ci
max_connections=5000
max_user_connections=1000
thread_cache_size = 128
 
# Query Cache
#query_cache_type = 0 # <= MySQL 8.0.3
 
# Session variables
sort_buffer_size = 2M
tmp_table_size = 32M
read_buffer_size = 128k
read_rnd_buffer_size = 256k
join_buffer_size = 128k
 
# Other buffers and caches
table_definition_cache = 1400
table_open_cache = 2000
table_open_cache_instances = 16
 
# MySQL error log
log-error = /data1/mysql_3106/logs/mysqld.err
innodb_print_all_deadlocks = 1
 
# Slow Query Log
slow_query_log = 1
slow_query_log_file = /data1/mysql_3106/logs/mysql_slow.log
log_queries_not_using_indexes = 0
long_query_time = 1
min_examined_row_limit = 0
 
# General Query Log
general_log = 0
general_log_file = /data1/mysql_3106/logs/mysql_general.log
 
# Performance Schema
# performance_schema = OFF
 
# Binary logging and Replication
log_bin = mysql-bin
binlog_format = ROW
binlog_checksum = NONE # or CRC32
master_verify_checksum = OFF # ON if binlog_checksum = CRC32
slave_sql_verify_checksum = OFF # ON if binlog_checksum = CRC32
binlog_cache_size = 1M
binlog_stmt_cache_size = 3M
max_binlog_size = 512M
sync_binlog = 1
expire_logs_days = 7
log_slave_updates = 1
relay_log = mysql-relay-bin
relay_log_purge = 1
 
# MyISAM variables
key_buffer_size = 8M
myisam_recover_options = 'BACKUP,FORCE'
 
# MEMORY variables
max_heap_table_size = 64M # Should be greater or equal to tmp_table_size
 
# InnoDB variables
default_storage_engine = InnoDB
innodb_file_per_table = 1
innodb_data_home_dir=/data1/mysql_3106/data
innodb_data_file_path=ibdata1:10M:autoextend
innodb_log_group_home_dir=/data1/mysql_3106/data
innodb_buffer_pool_size = 4G
innodb_buffer_pool_instances = 8
innodb_stats_on_metadata=0
innodb_lock_wait_timeout=30
innodb_flush_log_at_trx_commit = 2
innodb_log_buffer_size = 8M
innodb_log_file_size = 1024M
# innodb_write_io_threads = 8 # If you have a strong I/O system or SSD
# innodb_read_io_threads = 8 # If you have a strong I/O system or SSD
# innodb_io_capacity = 1000 # If you have a strong I/O system or SSD
 
# Group Replication parameter
gtid_mode = ON
enforce_gtid_consistency = ON
master_info_repository = TABLE
relay_log_info_repository = TABLE
 
slave_parallel_workers = 10
slave_preserve_commit_order = ON
slave_parallel_type = LOGICAL_CLOCK
 
#以便在server收集寫集合的同時將其記錄到二進制日誌。寫集合基於每行的主鍵,而且是行更改後的惟一標識此標識將用於檢測衝突。
transaction_write_set_extraction = XXHASH64
#組的名字能夠隨便起,但不能用主機的GTID! 全部節點的這個組名必須保持一致!
loose-group_replication_group_name = "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa" 
##爲了不每次啓動自動引導具備相同名稱的第二個組,因此設置爲OFF。
loose-group_replication_start_on_boot = OFF
loose-group_replication_local_address = "192.110.103.41:31061"
loose-group_replication_group_seeds = "192.110.103.41:31061,192.110.103.42:31061,192.110.103.43:31061"
#爲了不每次啓動自動引導具備相同名稱的第二個組,因此設置爲OFF。 
loose-group_replication_bootstrap_group = OFF
##關閉單主模式的參數(本例測試時多主模式,因此關閉該項,開啓多主模式的參數
loose-group_replication_single_primary_mode = FALSE # = multi-primary
loose-group_replication_enforce_update_everywhere_checks=ON # = multi-primary
report_host=192.110.103.41
report_port=3106
 # 容許加入組複製的客戶機來源的ip白名單
#loose-group_replication_ip_whitelist="192.110.0.0/16,127.0.0.1/8"

複製代碼

主要MGR配置說明:

cat my.cnf |grep group_replication -i
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.110.103.43:31061"
loose-group_replication_group_seeds = "192.110.103.41:31061,192.110.103.42:31061,192.110.103.43:31061"
loose-group_replication_bootstrap_group = OFF
loose-group_replication_single_primary_mode = FALSE # = multi-primary
loose-group_replication_enforce_update_everywhere_checks=ON # = multi-primary
複製代碼
  • 第 1 行表示節點必須收集每一個事務的寫集(write set),並使用 XXHASH64 哈希算法將其編碼爲hash 值。
  • 第 2 行用來告訴插件,有一個名爲"aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"的組須要加入,或者 須要建立。
  • 第 3 行告訴插件,在啓動MySQL實例時不要自動啓動組複製功能。
  • 第 4 行告訴插件,該實例使用 192.110.103.43:31061端口做爲組中成員之間的通訊地址。 選項 group_replication_local_address 配置的本地地址必須能和組中其餘全部成員通訊。
  • 第 5 行 告訴插件,若是節點要加入該組,須要聯繫這些主機。這些是種子成員(seed members),當 節點要鏈接該組時須要使用這些成員。在某節點要加入組時,須要聯繫其中的一個(種子),而後請求 組從新配置成員列表,以容許在組中接受該節點。注意,不須要在該選項中列出組中的全部成員,只 須要列出節點但願加入組時應該聯繫的服務器列表。
  • 第6,7行 : 和單主/多主模式有關。配置設置爲多主模式。

單主模式配置: loose-group_replication_single_primary_mode=true loose-group_replication_enforce_update_everywhere_checks=false

5.2 設置複製帳號 (全部節點執行)

啓動/登陸MySQL

# 啓動數據庫
$su - mysql -c "/usr/local/mysql-5.7.23/bin/mysqld_safe --defaults-file=/data1/mysql_3106/etc/my.cnf &"

$tail -f /data1/mysql_3106/logs/mysqld.err
 
# 登陸數據庫
/usr/local/mysql-5.7.23/bin/mysql -S ${DB_BASE_DIR}/tmp/mysql.sock

複製代碼

設置帳號

# 修改root密碼以及建立必要用戶
ALTER USER 'root'@'localhost' IDENTIFIED BY 'root' PASSWORD EXPIRE NEVER;
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root';
create user root@'127.0.0.1' identified WITH mysql_native_password BY 'root';
grant all privileges on *.* to root@'127.0.0.1' with grant option;
flush privileges;
#注:mysql_native_password爲兼容老版本模式,不然老版本mysql客戶端登陸不了

#reset master; 
root@localhost : (none) > show master logs;
root@localhost : (none) > reset master;
Query OK, 0 rows affected (0.02 sec)

root@localhost : (none) > show master logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |       150 |
+------------------+-----------+
1 row in set (0.00 sec)


#設置複製帳號
SET SQL_LOG_BIN=0;
CREATE USER repl@'10.%.%.%' IDENTIFIED WITH 'mysql_native_password' BY 'repl';
GRANT SUPER,REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO repl@'192.%.%.%';
GRANT SUPER,REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO repl@'10.%.%.%';
FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1;
CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='repl' FOR CHANNEL 'group_replication_recovery';
複製代碼

5.3 安裝MGR插件 (全部節點執行)

安裝MGR插件

# 安裝MGR插件
root@localhost : (none) > INSTALL PLUGIN group_replication SONAME 'group_replication.so';
Query OK, 0 rows affected (0.00 sec)

root@localhost : (none) >  SHOW PLUGINS;
+----------------------------+----------+--------------------+----------------------+---------+
| Name                       | Status   | Type               | Library              | License |
+----------------------------+----------+--------------------+----------------------+---------+
| binlog                     | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |
| mysql_native_password      | ACTIVE   | AUTHENTICATION     | NULL                 | GPL     |
| BLACKHOLE                  | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |
...
| group_replication          | ACTIVE   | GROUP REPLICATION  | group_replication.so | GPL     |
+----------------------------+----------+--------------------+----------------------+---------+
複製代碼

5.4. 啓動MGR多主模式

啓動MGR,在第一節點(41)上執行。

#只在第一個節點執行這個步驟
mysql> SET GLOBAL group_replication_bootstrap_group=ON;
mysql> START GROUP_REPLICATION;
mysql> SET GLOBAL group_replication_bootstrap_group=OFF;

# 查看MGR組信息
mysql> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+---------------+-------------+--------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST   | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+---------------+-------------+--------------+
| group_replication_applier | 509810ee-f3d7-11e9-a7d5-a0369fac2de4 | 192.110.103.41 |        3106 | ONLINE       |
+---------------------------+--------------------------------------+---------------+-------------+--------------+
1 row in set (0.00 sec)
複製代碼

其它節點加入MGR: 在另兩臺機器上執行以下命令。

# 其餘節點加入MGR,在其它節點上執行
root@localhost : (none) > SELECT * FROM performance_schema.replication_group_members;
+---------------------------+-----------+-------------+-------------+--------------+
| CHANNEL_NAME              | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+-----------+-------------+-------------+--------------+
| group_replication_applier |           |             |        NULL | OFFLINE      |
+---------------------------+-----------+-------------+-------------+--------------+
1 row in set (0.00 sec)

root@localhost : (none) >show global variables like '%seed%';
+-------------------------------+-------------------------------------------------------------+
| Variable_name                 | Value                                                       |
+-------------------------------+-------------------------------------------------------------+
| group_replication_group_seeds | 192.110.103.41:31061,192.110.103.42:31061,192.110.103.43:31061 |
+-------------------------------+-------------------------------------------------------------+
1 row in set (0.00 sec)
root@localhost : (none) > START GROUP_REPLICATION;
Query OK, 0 rows affected (3.23 sec)

root@localhost : (none) > SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+---------------+-------------+--------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST   | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+---------------+-------------+--------------+
| group_replication_applier | 509810ee-f3d7-11e9-a7d5-a0369fac2de4 | 192.110.103.41 |        3106 | ONLINE       |
| group_replication_applier | 53e462be-f3d7-11e9-9125-a0369fa6cce4 | 192.110.103.42 |        3106 | ONLINE       |
| group_replication_applier | ee4a9cec-f3d5-11e9-9ded-a0369fa6cd30 | 192.110.103.43 |        3106 | ONLINE       |
+---------------------------+--------------------------------------+---------------+-------------+--------------+
3 rows in set (0.00 sec)
>SHOW STATUS LIKE 'group_replication_primary_member';
+----------------------------------+-------+
| Variable_name                    | Value |
+----------------------------------+-------+
| group_replication_primary_member |       |
+----------------------------------+-------+
root@localhost : test > show global variables like 'group_replication_single%';
+---------------------------------------+-------+
| Variable_name                         | Value |
+---------------------------------------+-------+
| group_replication_single_primary_mode | OFF   |
+---------------------------------------+-------+
複製代碼

能夠看到,3個節點狀態爲online。而且當前爲多主模式,各節點均可以寫入。

插入測試數據 在任一DB節點上插入測試數據,如節點1執行。

root@localhost : (none) > CREATE DATABASE test ;
root@localhost : (none) > use test;
Database changed
root@localhost : test > create table if not exists t1 (id int(10) PRIMARY KEY AUTO_INCREMENT,name varchar(50) NOT NULL);      
insert into t1 values(1,'zhang3');
複製代碼

其它節點查看 在其它節點上能夠看到數據。

root@localhost : (none) > select * from test.t1;
+----+--------+
| id | name   |
+----+--------+
|  1 | zhang3 |
+----+--------+
1 row in set (0.00 sec)
root@localhost : (none) > insert into test.t1 values(2,'li4');
Query OK, 1 row affected (0.01 sec)
root@localhost : (none) > select * from performance_schema.replication_connection_status \G ;
*************************** 1. row ***************************
             CHANNEL_NAME: group_replication_recovery
               GROUP_NAME: 
              SOURCE_UUID: 
                THREAD_ID: NULL
            SERVICE_STATE: OFF
COUNT_RECEIVED_HEARTBEATS: 0
 LAST_HEARTBEAT_TIMESTAMP: 0000-00-00 00:00:00
 RECEIVED_TRANSACTION_SET: 
        LAST_ERROR_NUMBER: 0
       LAST_ERROR_MESSAGE: 
     LAST_ERROR_TIMESTAMP: 0000-00-00 00:00:00
*************************** 2. row ***************************
             CHANNEL_NAME: group_replication_applier
               GROUP_NAME: aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa
              SOURCE_UUID: aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa
                THREAD_ID: NULL
            SERVICE_STATE: ON
COUNT_RECEIVED_HEARTBEATS: 0
 LAST_HEARTBEAT_TIMESTAMP: 0000-00-00 00:00:00
 RECEIVED_TRANSACTION_SET: aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:1-6:1000003
        LAST_ERROR_NUMBER: 0
       LAST_ERROR_MESSAGE: 
     LAST_ERROR_TIMESTAMP: 0000-00-00 00:00:00
2 rows in set (0.00 sec)

複製代碼

6. 單主-多主模式切換

6.1 切到單主模式

1)切換前是多主模式:

root@localhost : performance_schema > show global variables like 'group_replication_single%';
+---------------------------------------+-------+
| Variable_name                         | Value |
+---------------------------------------+-------+
| group_replication_single_primary_mode | OFF   |
+---------------------------------------+-------+
1 row in set (0.00 sec)

root@localhost : performance_schema > show global variables like 'group_replication%';
+----------------------------------------------------+-------------------------------------------------------------+
| Variable_name                                      | Value                                                       |
+----------------------------------------------------+-------------------------------------------------------------+
| group_replication_allow_local_disjoint_gtids_join  | OFF                                                         |
| group_replication_allow_local_lower_version_join   | OFF                                                         |
| group_replication_auto_increment_increment         | 7                                                           |
| group_replication_bootstrap_group                  | OFF                                                         |
| group_replication_components_stop_timeout          | 31536000                                                    |
| group_replication_compression_threshold            | 1000000                                                     |
| group_replication_enforce_update_everywhere_checks | ON                                                          |
| group_replication_flow_control_applier_threshold   | 25000                                                       |
| group_replication_flow_control_certifier_threshold | 25000                                                       |
| group_replication_flow_control_mode                | QUOTA                                                       |
| group_replication_force_members                    |                                                             |
| group_replication_group_name                       | aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa                        |
| group_replication_group_seeds                      | 192.110.103.41:31061,192.110.103.42:31061,192.110.103.43:31061 |
| group_replication_gtid_assignment_block_size       | 1000000                                                     |
| group_replication_ip_whitelist                     | AUTOMATIC                                                   |
| group_replication_local_address                    | 192.110.103.41:31061                                         |
| group_replication_member_weight                    | 50                                                          |
| group_replication_poll_spin_loops                  | 0                                                           |
| group_replication_recovery_complete_at             | TRANSACTIONS_APPLIED                                        |
| group_replication_recovery_reconnect_interval      | 60                                                          |
| group_replication_recovery_retry_count             | 10                                                          |
| group_replication_recovery_ssl_ca                  |                                                             |
| group_replication_recovery_ssl_capath              |                                                             |
| group_replication_recovery_ssl_cert                |                                                             |
| group_replication_recovery_ssl_cipher              |                                                             |
| group_replication_recovery_ssl_crl                 |                                                             |
| group_replication_recovery_ssl_crlpath             |                                                             |
| group_replication_recovery_ssl_key                 |                                                             |
| group_replication_recovery_ssl_verify_server_cert  | OFF                                                         |
| group_replication_recovery_use_ssl                 | OFF                                                         |
| group_replication_single_primary_mode              | OFF                                                         |
| group_replication_ssl_mode                         | DISABLED                                                    |
| group_replication_start_on_boot                    | OFF                                                         |
| group_replication_transaction_size_limit           | 0                                                           |
| group_replication_unreachable_majority_timeout     | 0                                                           |
+----------------------------------------------------+-------------------------------------------------------------+
35 rows in set (0.00 sec)
複製代碼

2)全部節點執行 把各節點group_replication_single_primary_mode改成on;

# 全部節點執行

root@localhost : none> stop group_replication;
Query OK, 0 rows affected (9.02 sec)

root@localhost : none>  SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+---------------+-------------+--------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST   | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+---------------+-------------+--------------+
| group_replication_applier | 509810ee-f3d7-11e9-a7d5-a0369fac2de4 | 192.110.103.41 |        3106 | OFFLINE      |
+---------------------------+--------------------------------------+---------------+-------------+--------------+
1 row in set (0.00 sec)

root@localhost : none> set global group_replication_enforce_update_everywhere_checks=OFF;
Query OK, 0 rows affected (0.00 sec)

root@localhost : none> set global group_replication_single_primary_mode=ON;
Query OK, 0 rows affected (0.00 sec)

root@localhost : none> show global variables like 'group_replication_single%';
+---------------------------------------+-------+
| Variable_name                         | Value |
+---------------------------------------+-------+
| group_replication_single_primary_mode | ON    |
+---------------------------------------+-------+
1 row in set (0.00 sec)
複製代碼

3)在第一節點執行

SET GLOBAL group_replication_bootstrap_group=ON; 
START GROUP_REPLICATION; 
SET GLOBAL group_replication_bootstrap_group=OFF;
root@localhost : performance_schema > SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+---------------+-------------+--------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST   | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+---------------+-------------+--------------+
| group_replication_applier | 509810ee-f3d7-11e9-a7d5-a0369fac2de4 | 192.110.103.41 |        3106 | ONLINE       |
+---------------------------+--------------------------------------+---------------+-------------+--------------+
1 row in set (0.00 sec)

複製代碼

4)在其它節點執行

root@localhost : test > SELECT * FROM performance_schema.replication_group_members;
root@localhost : test > START GROUP_REPLICATION; 
root@localhost : test > SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+---------------+-------------+--------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST   | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+---------------+-------------+--------------+
| group_replication_applier | 509810ee-f3d7-11e9-a7d5-a0369fac2de4 | 192.110.103.41 |        3106 | ONLINE       |
| group_replication_applier | 53e462be-f3d7-11e9-9125-a0369fa6cce4 | 192.110.103.42 |        3106 | ONLINE       |
| group_replication_applier | ee4a9cec-f3d5-11e9-9ded-a0369fa6cd30 | 192.110.103.43 |        3106 | ONLINE       |
+---------------------------+--------------------------------------+---------------+-------------+--------------+
3 rows in set (0.00 sec)
複製代碼

5)查看單主master MySQL5.7 MRG不象MySQL8,不能夠用replication_group_members直接顯示master。 要用SHOW STATUS LIKE 'group_replication_primary_member'以下:

#
SELECT ta.* ,tb.MEMBER_HOST,tb.MEMBER_PORT,tb.MEMBER_STATE FROM performance_schema.global_status ta,performance_schema.replication_group_members tb  WHERE ta.VARIABLE_NAME='group_replication_primary_member' and ta.VARIABLE_VALUE=tb.MEMBER_ID;
+----------------------------------+--------------------------------------+---------------+-------------+--------------+
| VARIABLE_NAME                    | VARIABLE_VALUE                       | MEMBER_HOST   | MEMBER_PORT | MEMBER_STATE |
+----------------------------------+--------------------------------------+---------------+-------------+--------------+
| group_replication_primary_member | 509810ee-f3d7-11e9-a7d5-a0369fac2de4 | 192.110.103.41 |        3106 | ONLINE       |
+----------------------------------+--------------------------------------+---------------+-------------+--------------+   

root@192.110.103.41 : (none) > show variables like 'group_replication_group_seeds';
+-------------------------------+-------------------------------------------------------------+
| Variable_name                 | Value                                                       |
+-------------------------------+-------------------------------------------------------------+
| group_replication_group_seeds | 192.110.103.41:31061,192.110.103.42:31061,192.110.103.43:31061 |
+-------------------------------+-------------------------------------------------------------+
1 row in set (0.00 sec)

root@192.110.103.41 : (none) > SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+---------------+-------------+--------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST   | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+---------------+-------------+--------------+
| group_replication_applier | 509810ee-f3d7-11e9-a7d5-a0369fac2de4 | 192.110.103.41 |        3106 | ONLINE       |
| group_replication_applier | 53e462be-f3d7-11e9-9125-a0369fa6cce4 | 192.110.103.42 |        3106 | ONLINE       |
| group_replication_applier | ee4a9cec-f3d5-11e9-9ded-a0369fa6cd30 | 192.110.103.43 |        3106 | ONLINE       |
+---------------------------+--------------------------------------+---------------+-------------+--------------+
3 rows in set (0.00 sec)

root@192.110.103.41 : (none) > SHOW STATUS LIKE 'group_replication_primary_member';
+----------------------------------+--------------------------------------+
| Variable_name                    | Value                                |
+----------------------------------+--------------------------------------+
| group_replication_primary_member | 509810ee-f3d7-11e9-a7d5-a0369fac2de4 |
+----------------------------------+--------------------------------------+
1 row in set (0.01 sec)
> select @@server_id;
> select @@server_uuid;
+--------------------------------------+
| @@server_uuid                        |
+--------------------------------------+
| 509810ee-f3d7-11e9-a7d5-a0369fac2de4 |
+--------------------------------------+
1 row in set (0.00 sec)
複製代碼

6)測試寫入

root@192.110.103.42 : (none) > select * from test.t1;
+----+--------+
| id | name   |
+----+--------+
|  1 | zhang3 |
|  2 | li4    |
+----+--------+
2 rows in set (0.00 sec)
root@192.110.103.42 : (none) > insert into test.t1 values(3,'wang5');
ERROR 1290 (HY000): The MySQL server is running with the --super-read-only option so it cannot execute this statement

#使用主能夠insert 
mysql -h 192.110.103.41 -P 3106 -uroot -proot  
root@192.110.103.41 : (none) > select * from test.t1;                
+----+--------+
| id | name   |
+----+--------+
|  1 | zhang3 |
|  2 | li4    |
+----+--------+
2 rows in set (0.00 sec)

root@192.110.103.41 : (none) > insert into test.t1 values(3,'wang5');
Query OK, 1 row affected (0.00 sec)

root@192.110.103.41 : (none) > select * from test.t1;                
+----+--------+
| id | name   |
+----+--------+
|  1 | zhang3 |
|  2 | li4    |
|  3 | wang5  |
+----+--------+

複製代碼

如上實驗說明:\color{red}{ 單主模式,只有主能夠寫入,在從節點寫入數據時會出錯 --super-read-only. }

6.2 切回多主模式

MGR切換模式須要從新啓動組複製,因些須要在全部節點上先關閉組複製,設置 group_replication_single_primary_mode=OFF 等參數,再啓動組複製。

# 中止組複製(全部節點執行):
stop group_replication;
set global group_replication_single_primary_mode=OFF;
set global group_replication_enforce_update_everywhere_checks=ON;
show global variables like 'group_replication_single%';
+---------------------------------------+-------+
| Variable_name                         | Value |
+---------------------------------------+-------+
| group_replication_single_primary_mode | OFF   |
+---------------------------------------+-------+
1 row in set (0.00 sec)
show global variables like 'group_replication_enforce_%';
+----------------------------------------------------+-------+
| Variable_name                                      | Value |
+----------------------------------------------------+-------+
| group_replication_enforce_update_everywhere_checks | ON    |
+----------------------------------------------------+-------+
1 row in set (0.00 sec)

# 隨便選擇某個節點執行
SET GLOBAL group_replication_bootstrap_group=ON; 
START GROUP_REPLICATION; 
SET GLOBAL group_replication_bootstrap_group=OFF;
SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+---------------+-------------+--------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST   | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+---------------+-------------+--------------+
| group_replication_applier | 509810ee-f3d7-11e9-a7d5-a0369fac2de4 | 192.110.103.41 |        3106 | ONLINE       |
+---------------------------+--------------------------------------+---------------+-------------+--------------+

# 其餘節點執行
START GROUP_REPLICATION; 

# 查看組信息,全部節點的 MEMBER_ROLE 都爲 PRIMARY
 SELECT * FROM performance_schema.replication_group_members;
root@localhost : (none) >  SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+---------------+-------------+--------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST   | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+---------------+-------------+--------------+
| group_replication_applier | 509810ee-f3d7-11e9-a7d5-a0369fac2de4 | 192.110.103.41 |        3106 | ONLINE       |
| group_replication_applier | 53e462be-f3d7-11e9-9125-a0369fa6cce4 | 192.110.103.42 |        3106 | ONLINE       |
| group_replication_applier | ee4a9cec-f3d5-11e9-9ded-a0369fa6cd30 | 192.110.103.43 |        3106 | ONLINE       |
+---------------------------+--------------------------------------+---------------+-------------+--------------+
複製代碼

測試寫入 分別在node2,node3測試寫數據是否能夠成功。

#在node2測試寫
root@192.110.103.42 : test > select * from test.t1;
+----+--------+
| id | name   |
+----+--------+
|  1 | zhang3 |
|  2 | li4    |
|  3 | wang5  |
+----+--------+
3 rows in set (0.00 sec)
root@192.110.103.42 : test > insert into test.t1 values(4,'ma6');  
Query OK, 1 row affected (0.01 sec)

#在node3測試寫入
root@192.110.103.43 : test > select * from test.t1;              
+----+--------+
| id | name   |
+----+--------+
|  1 | zhang3 |
|  2 | li4    |
|  3 | wang5  |
|  4 | ma6    |
+----+--------+
4 rows in set (0.00 sec)

root@192.110.103.43 : test > insert into test.t1 values(5,'qian7');
Query OK, 1 row affected (0.01 sec)
複製代碼

7. 故障切換

7.1 單主模式下故障切換

單主模式下故障切換

主節點故障後,主節點自動選 舉機制將會自動選出另外一個主節點。在選舉主節點時,將查找新的成員視圖,並根據group_replication_member_weigth 的值排列出潛在的主節點,若是全部成員的MySQL版本都相同, 則權重最高的節點被選舉爲下一個主節點,若是權重值相同,則根據字典順序對它們的server_uuid進 行排序,而後選出列表中的第一個節點做爲下一個主節點。當選舉出新的主節點後,該主節點將自動設 置爲 read-write,其餘節點繼續做爲slave,且保留設置爲read-only。

若是MySQL版本不支持group_replication_member_weigth,那麼將根據 server_uuid的字典順序來 選舉新節點。 在將客戶端應用程序從新路由到新節點以前,等待新節點應用完 relay-log是 一個好習慣。

7.2 多主模式下故障切換

在多主模型下,沒有單主的概念,沒有必須進行選舉的過程,由於多主模型下沒有節點扮演特殊的角色。

多主模式下故障切換
當節點加入組時,全部節點都會設置爲 read-write。

7.3 查找主節點

以下演示如何查詢單主模型下當前的主節點。 MySQL5.7 MRG不象MySQL8,不能夠用replication_group_members直接顯示master。 要用SHOW STATUS LIKE 'group_replication_primary_member'以下:

SELECT ta.* ,tb.MEMBER_HOST,tb.MEMBER_PORT,tb.MEMBER_STATE FROM performance_schema.global_status ta,performance_schema.replication_group_members tb  WHERE ta.VARIABLE_NAME='group_replication_primary_member' and ta.VARIABLE_VALUE=tb.MEMBER_ID;
+----------------------------------+--------------------------------------+---------------+-------------+--------------+
| VARIABLE_NAME                    | VARIABLE_VALUE                       | MEMBER_HOST   | MEMBER_PORT | MEMBER_STATE |
+----------------------------------+--------------------------------------+---------------+-------------+--------------+
| group_replication_primary_member | 509810ee-f3d7-11e9-a7d5-a0369fac2de4 | 192.110.103.41 |        3106 | ONLINE       |
+----------------------------------+--------------------------------------+---------------+-------------+--------------+

#SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME='group_replication_primary_member';
或
>SHOW STATUS LIKE 'group_replication_primary_member';
+----------------------------------+--------------------------------------+
| Variable_name                    | Value                                |
+----------------------------------+--------------------------------------+
| group_replication_primary_member | 509810ee-f3d7-11e9-a7d5-a0369fac2de4 |
+----------------------------------+--------------------------------------+
1 row in set (0.01 sec)
複製代碼

參考

相關文章
相關標籤/搜索