在搭建MySQL複製的時候,你是否還在執行備份恢復,從庫進行change master to的操做?若是是,那你可就真的落後了。node
MySQL官方推薦的一款高可用集羣方案MySQL Group Replication,簡稱:MGR(組複製)。它是官方推出的一種基於Paxos協議的狀態機複製,完全解決了基於傳統的異步複製和半同步複製中數據一致性問題沒法保證的狀況,也讓MySQL數據庫涉及的領域更廣,打開互聯網金融行業的大門。mysql
2016年12月 MySQL Group Replication推出了第一個GA版本發佈在MySQL5.7.17中。現在,MySQL8.0版本即將與咱們見面,再加上官方逐漸成熟的高可用集羣 Group Replication方案,到時候誰仍是咱們MySQL的對手?全都不在了!MySQL數據庫就是做者的信仰,愛你無怨無悔。sql
1、MGR組複製原理數據庫
首先咱們來談談什麼叫作組複製。bootstrap
組複製是一種可用於實現容錯系統的技術。複製組是一個經過消息傳遞相互交互的Server集羣。複製組由多個Server成員組成,以下圖的Master一、Master二、Master3,全部成員獨立完成各自的事務。併發
當客戶端發起一個更新事務時,該事務先在本地執行,執行完成以後就要發起對事務的提交操做。在尚未真正提交以前,須要將產生的複製寫集廣播出去,複製到其它成員。若是衝突檢測成功,組內決定該事務能夠提交,其它成員能夠應用,不然就回滾。異步
最終,全部組內成員以相同的順序接收同一組事務。所以組內成員以相同的順序應用相同的修改,保證組內數據強一致性。socket
2、MGR組複製模式ui
組複製能夠在兩種模式下運行:spa
-
單主模式下,組複製具備自動選主功能,每次只有一個 Server成員接受更新,其它成員只提供讀服務。
-
多主模式下,全部的Server 成員均可以同時接受更新,沒有主從之分,成員角色是徹底對等的。
組複製默認狀況下是單主模式,咱們能夠經過設置參數,讓其變成多主模式。
group_replication_single_primary_mode=off
3、MGR特性介紹
MGR的特性在於:
-
完成了真正的多節點讀寫的集羣方案;
-
基於原生複製及Paxos協議的組複製技術,並以插件的方式提供,實現了數據的強一致性;
-
因爲是多節點讀寫,Failover切換變得更加簡單;
-
增長刪除節點,自動完成同步數據和更新組內信息的操做,擴展性加強。
雖然在MGR的多主模式下有不能支持串行隔離級別和不支持外鍵級聯操做的限制條件,且目前MySQL版本中存在因爲對DDL語句操做沒法實現回滾,致使MGR沒法對DDL語句作數據衝突檢驗,以至DDL語句在MGR中併發執行存在隱患的狀況。但這些都不能阻擋MGR的發佈所帶來的開創新時代的意義。
4、MGR搭建實戰演練
環境介紹:
這裏咱們準備三個節點,數據庫版本使用MySQL5.7.17。
實戰第1步:
在三個節點上執行安裝MySQL5.7操做。(安裝過程省略)
實戰第2步:
在三個節點上分別設置hostname和IP地址的映射關係。
實戰第3步:
在三個節點上分別建立複製帳號,命令以下:
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.1.%' IDENTIFIED BY '!QAZ2wsx#EDC';
實戰第4步:
安裝GR插件以前須要配置my.cnf,而後重啓MySQL,以下:
[mysqld] #skip-grant-tables # # Remove leading # and set to the amount of RAM for the most important data # cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%. # innodb_buffer_pool_size = 128M # # Remove leading # to turn on a very important data integrity option: logging # changes to the binary log between backups. # log_bin # # Remove leading # to set options mainly useful for reporting servers. # The server defaults are faster for transactions and fast SELECTs. # Adjust sizes as needed, experiment to find the optimal values. # join_buffer_size = 128M # sort_buffer_size = 2M # read_rnd_buffer_size = 2M datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock # Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0 log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid #Group Replication server_id = 1773306 #MGR必定要開啓GTID功能gtid_mode = ON,enforce_gtid_consistency = ON gtid_mode = ON enforce_gtid_consistency = ON #MGR須要多源複製功能,因此須要將主從庫之間的信息記錄到表中。設置master_info_repository = TABLE和relay_log_info_repository = TABLE master_info_repository = TABLE relay_log_info_repository = TABLE #MGR在當前MySQL版本中,必需要設置binlog_checksum=none,而且binlog_format=row binlog_checksum = NONE log_slave_updates = ON log_bin = binlog binlog_format= ROW #MGR中開啓主鍵信息採集功能:transaction_write_set_extraction= XXHASH64 transaction_write_set_extraction = XXHASH64 #MGR中須要設置組的名字,該group_replication_group_name是經過select uuid()或者$uuidgen來生成的。 loose-group_replication_group_name = '00393352-0f4e-4dc5-938d-148829aeaf24' loose-group_replication_start_on_boot = off #MGR中本地成員的地址由該參數group_replication_local_address決定,本例中當前節點是proxysql。 #後面的端口是每一個節點都須要一個獨立的TCP端口號,節點之間經過這個端口號進行通訊。 loose-group_replication_local_address = 'proxysql:33061' #MGR中其餘成員的地址由這個參數group_replication_group_seeds決定 loose-group_replication_group_seeds ='proxysql:33061,node2:33062,node3:33063' loose-group_replication_bootstrap_group = off #MGR採起多主模式時,須要關閉該參數:group_replication_single_primary_mode=off(默認是單主模式)。 loose-group_replication_single_primary_mode=off #於此同時,還須要將該參數:group_replication_enforce_update_everywhere_checks=true,目的則是爲了作多主模式限制檢測。 loose-group_replication_enforce_update_everywhere_checks=true #注:加載到參數文件裏面,須要在每一個參數的前面加loose。 #這裏再強調一個參數:group_replication_auto_increment_increment #該參數表明自增屬性,默認值爲7。咱們要保證每一個成員的該值相同,而且建議該參數的設置儘可能比組內成員的個數大一些,方便後期集羣的擴展。
在三個節點上分別安裝GR插件,命令以下:
mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';
組件安裝完成以後,展現結果:
mysql> show plugins; +----------------------------+----------+--------------------+----------------------+---------+ | Name | Status | Type | Library | License | +----------------------------+----------+--------------------+----------------------+---------+ | binlog | ACTIVE | STORAGE ENGINE | NULL | GPL | | mysql_native_password | ACTIVE | AUTHENTICATION | NULL | GPL | | sha256_password | ACTIVE | AUTHENTICATION | NULL | GPL | | CSV | ACTIVE | STORAGE ENGINE | NULL | GPL | | MEMORY | ACTIVE | STORAGE ENGINE | NULL | GPL | | InnoDB | ACTIVE | STORAGE ENGINE | NULL | GPL | | INNODB_TRX | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_LOCKS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_LOCK_WAITS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_CMP | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_CMP_RESET | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_CMPMEM | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_CMPMEM_RESET | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_CMP_PER_INDEX | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_CMP_PER_INDEX_RESET | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_BUFFER_PAGE | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_BUFFER_PAGE_LRU | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_BUFFER_POOL_STATS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_TEMP_TABLE_INFO | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_METRICS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_FT_DEFAULT_STOPWORD | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_FT_DELETED | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_FT_BEING_DELETED | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_FT_CONFIG | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_FT_INDEX_CACHE | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_FT_INDEX_TABLE | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_TABLES | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_TABLESTATS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_INDEXES | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_COLUMNS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_FIELDS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_FOREIGN | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_FOREIGN_COLS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_TABLESPACES | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_DATAFILES | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_VIRTUAL | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | MyISAM | ACTIVE | STORAGE ENGINE | NULL | GPL | | MRG_MYISAM | ACTIVE | STORAGE ENGINE | NULL | GPL | | PERFORMANCE_SCHEMA | ACTIVE | STORAGE ENGINE | NULL | GPL | | ARCHIVE | ACTIVE | STORAGE ENGINE | NULL | GPL | | BLACKHOLE | ACTIVE | STORAGE ENGINE | NULL | GPL | | FEDERATED | DISABLED | STORAGE ENGINE | NULL | GPL | | partition | ACTIVE | STORAGE ENGINE | NULL | GPL | | ngram | ACTIVE | FTPARSER | NULL | GPL | | validate_password | ACTIVE | VALIDATE PASSWORD | validate_password.so | GPL | | group_replication | ACTIVE | GROUP REPLICATION | group_replication.so | GPL | +----------------------------+----------+--------------------+----------------------+---------+ 46 rows in set (0.00 sec)
實戰第5步:
在192.168.1.177上啓動首個節點的MGR集羣服務。命令以下:
CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='!QAZ2wsx#EDC' FOR CHANNEL 'group_replication_recovery';
注:MGR須要該異步複製通道,實現新節點加入集羣自動從其餘節點複製數據的目的,不須要手工指定從哪一個節點複製,master_host和master_port信息都是自動完成。
注:執行初始化操做,只有首個節點須要這一步操做。(↓)
SET GLOBAL group_replication_bootstrap_group = ON;
START GROUP_REPLICATION;
啓動成功以後,查看節點狀態信息。命令以下:
SELECT * FROM performance_schema.replication_group_members;
關閉初始化操做命令以下:
SET GLOBAL group_replication_bootstrap_group = off;
注:replication_group_members表中MEMBER_STATE字段狀態爲ONLINE,再執行關閉初始化命令。
實戰第6步:
在192.168.1.178上面啓動第二個節點的MGR集羣服務。命令以下:
CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='!QAZ2wsx#EDC' FOR CHANNEL 'group_replication_recovery'; START GROUP_REPLICATION;
啓動成功以後,查看節點狀態信息。命令以下:
SELECT * FROM performance_schema.replication_group_members;
實戰第7步:
在192.168.1.179上面啓動第三個節點的MGR集羣服務。命令以下:
CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='!QAZ2wsx#EDC' FOR CHANNEL 'group_replication_recovery'; START GROUP_REPLICATION;
啓動成功以後,查看節點狀態信息。命令以下:
SELECT * FROM performance_schema.replication_group_members;
可見啓動成功以後,三個成員的狀態都是online,證實已經開始正常工做了。如此,就真正實現了多節點的讀寫操做。