2015年10月15日 星期四

Install and configure MySQL Group Replication

MySQL Group Replication是MySQL家族中最新的成員,它的功能是使不同MySQL伺服器之間能做到不損失資料的主主複製,同時支援寫的高可用。雖然MySQL Group Replication目前還沒有正式發行,在labs.mysql.com己經可以下載和試用。MySQL Group Replication 的架構如下圖所示,架在TCP和Corosync之上,所以要安裝它必須先有Corosync在伺服器之上,MySQL之上再跑複製。
這裡先為各位說明Corosync的安裝,再

  1. 安裝 corosync (以Ubuntu為例)的步驟:
  • 安裝Corosync
$ sudo apt-get install corosync corosync-dev
  •  設定Corosync
$ sudo mv /etc/corosync/corosync.conf.example /etc/corosync/corosync.conf
$ sudo vi /etc/corosync/corosync.conf
  •  Corosync的設定檔的內容如下:
crypto_cipher: aes128
crypto_hash: sha256
...
interface {

ringnumber: 0

bindnetaddr: 127.0.0.1

mcastaddr: 226.94.1.1 # 此二配置的實際值要問您的網路管理員
mcastport: 5405

  • 編UIDGID檔指定用那個帳戶執行Corosync,且放到/etc/corosync/uidgid.d,
$ vi uidgid
內容如下:

uidgid  {
  uid:
  gid:
}
  • 將UIDGID檔抄到/etc/corosync之下
$ sudo  mv udigid /etc/corosync/uidgid.d
  • 指定在開機時將Corosync啟動
$ sudo vi /etc/default/corosync

START=yes

  • 開啟Corosync
$ sudo service corosync start
$ sudo service corosync status
$ corosync-cfgtool -s # 檢查corosync的狀況

  2. 安裝和設定MySQL databases以及group replication

  • 安裝database(加入group replication 的MySQL instance都要做),必須使用5.7.8版以後的MySQL,同時將自labs.mysql.com所下載的group_replication.so放到lib/plugin之下
  • 5.7以後的MySQL不用mysql_install_db,必須用mysqld來初始化datadir, 且設定SSL的認證檔。初始化mysqld會在畫面上顯示一個隨機産的的密碼,一定要記下來,它是您第一次登入MySQL時所用的密碼
$ ./bin/mysqld --no-defaults --user=$USER --initialize --explicit_defaults_for_timestamp --basedir=. --datadir=./data
$ ./bin/mysql_ssl_rsa_setup –basedir=. --datadir=./data

  • 編輯my.cnf,重點是binlog-format必須設為row,且GTID要開啟,另外要指定group_replication plugin的程式庫和設定transaction-write-set-extraction=MURMUR32。my.cnf的配置如下:
[mysqld]
log-bin
binlog-format=row # binlog format need to be set to row
basedir=.
datadir=./data
gtid-mode=on # need to turn on gtid
enforce-gtid-consistency
log-slave-updates
master-info-repository=TABLE # need setting master and relay log status repository to TABLE
relay-log-info-repository=TABLE
transaction-write-set-extraction=MURMUR32 # need to set to MURMUR32
binlog-checksum=NON # no binlog checksum
socket=/mysql.sock
server-id=1
plugin-load=group_replication.so # assign plugin library

  • 開mysqld和更改在初始化所産生的密碼(必須更改,因為初始化密碼只能用一次就過期了)
$ ./bin/mysqld –defaults-file=./my.cnf &
$ ./bin/mysqladmin -u root -h 127.0.0.1 -P 13001 -p password ""
在此回應以mysqld初始化時所産生的密碼

  • 建複製所用的帳戶:
server1> CREATE USER 'rpl_user'@'%' IDENTIFIED BY 'rpl_pass';
server1> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
  • 設定複製,指定任一個UUID給group_replication_name
server1> SET GLOBAL group_replication_group_name= "8a94f357-aab4-11df-86ab-c80aa9429562";
server1> SET GLOBAL group_replication_recovery_user='rpl_user';
server1> SET GLOBAL group_replication_recovery_password='';
server1> SET GLOBAL group_replication_recovery_retry_count= 2;

  • 開啟oup replication
server1> start group_replication;
  • 以上步驟只要在第一個MySQL instance做一次即可,其他的MySQL instance不需做
  • 檢group replication 的狀況:
server1> SELECT * FROM performance_schema.replication_connection_status\G

  • 檢查group member:
server1> SELECT * FROM performance_schema.replication_group_members\G
  • 每個group replication members都要做:
server1> SET GLOBAL group_replication_group_name= "8a94f357-aab4-11df-86ab-c80aa9429562";
server1> SET GLOBAL group_replication_recovery_user='rpl_user';
server1> SET GLOBAL group_replication_recovery_password='';
server1> START GROUP_REPLICATION;

  • 測試group replication:
server1> CREATE DATABASE test;
server1> CREATE TABLE test.t1 (c1 INT NOT NULL PRIMARY KEY, name varchar(30));
server1> INSERT INTO test.t1 VALUES (1, 'aaaa');

server2> select * from test.t1;
server2> INSERT INTO test.t1 VALUES (2, 'bbb');

server1> select *  from test.t1;
  • 此時查performance_schema.replication_group_members和performance_schema.replication_connection_status可以看到兩台個MySQL instance之間會相互複製的狀況
server1> SELECT * FROM performance_schema.replication_group_members\G
server1> SELECT * FROM performance_schema.replication_connection_status\G

server2> SELECT * FROM performance_schema.replication_group_members\G
server2> SELECT * FROM performance_schema.replication_connection_status\G

  • 當有新的成員加入group replicaiton時做以下動作
server3> SET GLOBAL group_replication_group_name= "8a94f357-aab4-11df-86ab-c80aa9429562";
server3> SET GLOBAL group_replication_recovery_user='rpl_user';
server3> SET GLOBAL group_replication_recovery_password='';

  • 當新的MySQL instance加入group replication時,它會自動和其他的成員同步,此時該MySQL instance在查group replication status時會顯其狀況為‘RECOVERING’,此時該instance不可以做任何操作。