MySQL 全同步複製

實驗環境:沒有主從之分,全都是組成員mysql

CentOS7操做系統;算法

主機:server1-----------192.168.200.112sql

           server2-----------192.168.200.113數據庫

           server3-----------192.168.200.114bootstrap

軟件:mysqlvim

三臺機器數據保存一致性app

    

在server1上:

修改mysql的配置文件異步

root@server1 ~]# vim /etc/my.cnfsocket

[mysqld]分佈式

datadir=/usr/local/mysql/data

socket=/tmp/mysql.sock

server-id=1    #將server設置爲使用惟一標識號,以啓動全局事物標識符號

gtid_mode=ON    #打開 gtid 保證半同步

enforce_gtid_consistency=ON    #強制持續打開

master_info_repository=TABLE    #master 的信息存放在系統表中,而不是文件中

relay_log_info_repository=TABLE    #IO從主獲取的信息

binlog_checksum=NONE    #設置 server 打開二進制日誌記錄,使用基於行的格式並禁用二進制日誌事件校驗和

log_slave_updates=ON

log_bin=binlog

binlog_format=ROW    #二進制文件格式

#組複製設置

#loose-若是在 server 啓動時還沒有加載組複製插件,group_replication 變量使用的 loose- 前綴將指示 server 繼續啓動

transaction_write_set_extraction=XXHASH64    #server 必須爲每一個事務收集寫集合,並使用 XXHASH64 哈希算法將其編碼爲散列

loose-group_replication_group_name="b9e8cc0f-9c7a-11e8-ac38-52540025fd63"   #告知插件,正在加入或建立的組命名,uuidgen 獲取查看

loose-group_replication_start_on_boot=off    #server 啓動時不自動啓動組複製

loose-group_replication_local_address="192.168.200.112:24901"    #插件使用的ip地址,端口用於接受來自組中其餘成員的傳入鏈接

loose-group_replication_group_seeds="192.168.200.112:24901,192.168.200.113:24901,192.168.200.114:24901"    #組成員

loose-group_replication_bootstrap_group=off    #插件是否自動引導,注意此選項在任什麼時候候只能在一個 server 實例上使用,一般是首次引導組時

(或在整個組被崩潰而後恢復的狀況下)。 若是您屢次引導組,例如,當多個 server 實例設置了此選項,則它們可能會人爲地形成腦裂的狀況,其中存在

兩個具備相同名稱的不一樣組。 在第一個server 實例加入組後禁用此選項。組中的全部 server 成員的配置都很是類似

loose-group_replication_single_primary_mode=off

loose-group_replication_enforce_update_everywhere_checks=on

loose-group_replication_ip_whitelist="192.168.200.0/24"    #組的白名單用戶,若是不設置則不能加入組

    組複製使用異步複製協議來實現分佈式恢復

注意:修改完配置文件後,應重啓服務。

登陸數據庫

[root@localhost ~]# mysql
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 3
Server version: 5.5.64-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>

對數據庫進行具體配置

mysql> set sql_log_bin=0;    #關閉防止以後傳到其餘 server 上
Query OK, 0 rows affected (0.00 sec)

mysql> grant replication slave on *.* to myslave@'%' identified by '123456';    #建立用戶受權
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> flush privileges;    #刷新表
Query OK, 0 rows affected (0.01 sec)

mysql> reset master;    #清空重置二進制日誌,
Query OK, 0 rows affected (0.45 sec)

mysql> set sql_log_bin=1;
Query OK, 0 rows affected (0.00 sec)

mysql> change master to master_user='myslave', master_password='123456' for channel 'group_replication_recovery';
Query OK, 0 rows affected, 2 warnings (0.61 sec)

mysql> install plugin group_replication soname 'group_replication.so';
Query OK, 0 rows affected (0.51 sec)

mysql> show plugins;
| ARCHIVE | ACTIVE | STORAGE ENGINE | NULL | GPL |
| BLACKHOLE | ACTIVE | 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 |
+----------------------------+----------+--------------------+---------------------

mysql> set global group_replication_bootstrap_group=on;
Query OK, 0 rows affected (0.00 sec)

mysql> start group_replication;
Query OK, 0 rows affected (1.67 sec)

mysql> set global group_replication_bootstrap_group=off;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| group_replication_applier | 9c37fc1c-9cad-11e8-be36-5254006a3b48 | server1 | 3306 | ONLINE |
+---------------------------+--------------------------------------+-------------+-

 

在server2,3上重複相似操做

修改mysql的配置文件

不一樣之處

server-id=2        #id對應的是組中編號
loose-group_replication_local_address="192.168.200.113:24901"     #address對應的是主機iP
..............
............

server-id=3         #id對應的是組中編號
loose-group_replication_local_address="192.168.200.114:24901"     #address對應的是主機iP

 

 

mysql> set global group_replication_bootstrap_group=on; ##添加一個組,ON表示開啓。此步只需在第一個組員建立便可,後續的組員不用建立。這樣才能確保在同一組中。
Query OK, 0 rows affected (0.00 sec)

mysql> start group_replication;
Query OK, 0 rows affected (1.67 sec)
注意:設置組時只需在第一個組員中建立便可,後續的組員不用建立。這樣才能確保在同一組中。否則在同組中沒法實現全同步。

本身每臺主機都建立了組,每臺主機都有屬於本身獨立的組。這樣雖然每臺主機狀態配置良好(都處於online)。但並不互通。

以上就是server2,server3(其它組員)和server1(第一個組員)配置的不一樣之處了。

 

 

online與recovering 兩種狀態辨析。

mysql> select * from performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| group_replication_applier | 57b54493-81cf-11e8-8a9a-52540013d792 | server1 | 3306 | ONLINE |
| group_replication_applier | c33132d0-81d1-11e8-9ff1-525400677cc8 | server2 | 3306 | RECOVERING |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
2 rows in set (0.00 sec)
###首次查看狀態RECOVERING,有多是在同步數據,能夠等會再查看,
mysql> select * from performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| group_replication_applier | 57b54493-81cf-11e8-8a9a-52540013d792 | server1 | 3306 | ONLINE |
| group_replication_applier | c33132d0-81d1-11e8-9ff1-525400677cc8 | server2 | 3306 | ONLINE |
+---------------------------+----

測試:

在server1中建立新的數據庫並寫入數據,看server2和server3是否都同步有相同的數據。

mysql> create database test;
Query OK, 1 row affected (0.26 sec)


mysql> use test;
Database changed


mysql> create table t1 (c1 int primary key,c2 text not null); ##插入表時須要設置主鍵
Query OK, 0 rows affected (1.11 sec)


mysql> insert into t1 values(1,'chaokaidi');
Query OK, 1 row affected (0.24 sec
server2和server3上查看(二者都同步有server1的數據):

mysql> show databases;


mysql> use test;


mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| t1 |
+----------------+
1 row in set (0.00 sec)

mysql> select * from t1;
+----+---------+
| c1 | c2 |
+----+---------+
| 1 | chaokaidi |
+----+---------+

 


實現全複製的另外一種方法是修改數據庫腳本文件(/etc/init.d/mysqld)以實現全同步。

mysql腳本文件修改,註釋掉密碼插件。

111 ret=$?112 #[ $ret -ne 0 ] && return $ret113 #initfile="$(install_validate_password_sql_file)"114 #action $"Installing validate password plugin: " /usr/sbin/mysqld --datadir= "$datadir" --user=mysql --init-file="$initfile"115 #ret=$?116 #rm -f "$initfile"117 chown -R mysql:mysql "$datadir"

相關文章
相關標籤/搜索