2017年10月29日日曜日

MySQLインスタンス+ Group Replicationについて





















■MySQLインスタンス+ Group Replicationについて


使用目的:合計4台のMySQLの内、それぞれ2台毎に
グループレプリケーションを組んだ場合、片系が落ちた時に、
スプリットブレインが発生してデータベース書き込みが出来なくなる恐れがあるので
インスタンスの導入を考えた。

インスタンスグループを導入することにより
以下の構成になるので、スプリットブレインからは避けられそうだ

db1/db2/db3(インスタンス1/group replicaitonの組み合わせ)
db2/db3/db4(インスタンス2/group replicaitonの組み合わせ)

上記によって、グループレプリケーションが3台構成の2グループにすることが出来た。


[インスタンスの設定方法]

ポイント:
systemctl stop firewalld
selinux off
インスタンスグループ毎にポート番号(13306,13307)を分けているので、間違いないこと。
/etc/hostsの追記も忘れずに!


1)以下のディレクトリの作成を行う
# mkdir /var/lib/mysqld
# mkdir /var/lib/mysqld/mysql_{13306,13307}; chown mysql: /var/lib/mysqld/mysql_{13306,13307}

2)/etc/my.cnfに編集を行う。
①以下コメントアウトにする
#[mysqld]
#datadir=/var/lib/mysql
#socket=/var/lib/mysql/mysql.sock


②以下、DB1my.cnfを追加を行う

ポイント:
server_idは重複させないこと!

---------------------------/etc/my.cnf(db1)------------------------------------------------------------
[mysqld@mysql_13306]
port=13306
datadir=/var/lib/mysqld/mysql_13306
socket=/var/lib/mysqld/mysql_13306/mysql.sock
log-error=/var/log/mysqld_13306.log
server_id=1

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=binlog
binlog_format=ROW


#グループレプリケーションセッティング
transaction_write_set_extraction=XXHASH64

任意のUUID番号を入力
loose-group_replication_group_name="87e5ed8c-cd83-11e6-bc3c-fa163e83e8e7"
loose-group_replication_start_on_boot=off

#自分のアドレス
loose-group_replication_local_address= "db1:33061"

#グループレプリケーションに所属させるDBを記載
loose-group_replication_group_seeds= "db1:33061,db2:33061,db3:33061"

loose-group_replication_bootstrap_group= off
loose-group_replication_single_primary_mode= FALSE

#グループレプリケーション内のネットワークアドレスを記載
loose-group_replication_ip_whitelist = 192.168.1.0/24
---------------------------------------------------------------------------------------------------------------


②以下、DB2my.cnfを追加を行う

ポイント:
server_idは重複させないこと!
インスタンスグループが2つ作成するのでポート番号を区別させること
------------------------etc/my.cnf(db2)------------------------------------------------------------------
[mysqld@mysql_13306]
port=13306
datadir=/var/lib/mysqld/mysql_13306
socket=/var/lib/mysqld/mysql_13306/mysql.sock
log-error=/var/log/mysqld_13306.log
server_id=2

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=binlog
binlog_format=ROW


#グループレプリケーションセッティング
transaction_write_set_extraction=XXHASH64

#任意のUUID番号を入力
loose-group_replication_group_name="87e5ed8c-cd83-11e6-bc3c-fa163e83e8e7"
loose-group_replication_start_on_boot=off

#自分のアドレス
loose-group_replication_local_address= "db2:33061"

#グループレプリケーションに所属させるDBを記載
loose-group_replication_group_seeds= "db1:33061,db2:33061,db3:33061"

loose-group_replication_bootstrap_group= off
loose-group_replication_single_primary_mode= FALSE

#グループレプリケーション内のネットワークアドレスを記載
loose-group_replication_ip_whitelist = 192.168.1.0/24



[mysqld@mysql_13307]
port=13307
datadir=/var/lib/mysqld/mysql_13307
socket=/var/lib/mysqld/mysql_13307/mysql.sock
log-error=/var/log/mysqld_13307.log
server_id=3

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=binlog
binlog_format=ROW


#グループレプリケーションセッティング
transaction_write_set_extraction=XXHASH64

#任意のUUID番号を入力
loose-group_replication_group_name="87e5ed8c-cd83-11e6-bc3c-fa163e83e8e7"
loose-group_replication_start_on_boot=off

#自分のアドレス
loose-group_replication_local_address= "db2:33062"

#グループレプリケーションに所属させるDBを記載
loose-group_replication_group_seeds= "db2:33062,db3:33062,db4:33062"

loose-group_replication_bootstrap_group= off
loose-group_replication_single_primary_mode= FALSE

#グループレプリケーション内のネットワークアドレスを記載
loose-group_replication_ip_whitelist = 192.168.1.0/24

-------------------------------------------------------------------------------------------------------------------


②以下、DB3my.cnfを追加を行う

ポイント:
server_idは重複させないこと!
インスタンスグループが2つ作成するのでポート番号を区別させること
-------------------------------/etc/my.cnf(db3)---------------------------------------------------------------
[mysqld@mysql_13306]
port=13306
datadir=/var/lib/mysqld/mysql_13306
socket=/var/lib/mysqld/mysql_13306/mysql.sock
log-error=/var/log/mysqld_13306.log
server_id=4

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=binlog
binlog_format=ROW


#グループレプリケーションセッティング
transaction_write_set_extraction=XXHASH64

#任意のUUID番号を入力
loose-group_replication_group_name="87e5ed8c-cd83-11e6-bc3c-fa163e83e8e7"
loose-group_replication_start_on_boot=off

#自分のアドレス
loose-group_replication_local_address= "db3:33061"

#グループレプリケーションに所属させるDBを記載
loose-group_replication_group_seeds= "db1:33061,db2:33061,db3:33061"

loose-group_replication_bootstrap_group= off
loose-group_replication_single_primary_mode= FALSE

#グループレプリケーション内のネットワークアドレスを記載
loose-group_replication_ip_whitelist = 192.168.1.0/24



[mysqld@mysql_13307]
port=13307
datadir=/var/lib/mysqld/mysql_13307
socket=/var/lib/mysqld/mysql_13307/mysql.sock
log-error=/var/log/mysqld_13307.log
server_id=5

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=binlog
binlog_format=ROW


#グループレプリケーションセッティング
transaction_write_set_extraction=XXHASH64

#任意のUUID番号を入力
loose-group_replication_group_name="87e5ed8c-cd83-11e6-bc3c-fa163e83e8e7"
loose-group_replication_start_on_boot=off

#自分のアドレス
loose-group_replication_local_address= "db3:33062"

#4グループレプリケーションに所属させるDBを記載
loose-group_replication_group_seeds= "db2:33062,db3:33062,db4:33062"

loose-group_replication_bootstrap_group= off
loose-group_replication_single_primary_mode= FALSE

#グループレプリケーション内のネットワークアドレスを記載
loose-group_replication_ip_whitelist = 192.168.1.0/24

---------------------------------------------------------------------------------------------------------------


②以下、DB4my.cnfを追加を行う

--------------------my.cnf(db4)------------------------------------------------------------------------------
[mysqld@mysql_13307]
port=13307
datadir=/var/lib/mysqld/mysql_13307
socket=/var/lib/mysqld/mysql_13307/mysql.sock
log-error=/var/log/mysqld_13307.log
server_id=6

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=binlog
binlog_format=ROW


#グループレプリケーションセッティング
transaction_write_set_extraction=XXHASH64

#任意のUUID番号を入力
loose-group_replication_group_name="87e5ed8c-cd83-11e6-bc3c-fa163e83e8e7"
loose-group_replication_start_on_boot=off

#自分のアドレス
loose-group_replication_local_address= "db4:33062"

#グループレプリケーションに所属させるDBを記載
loose-group_replication_group_seeds= "db2:33062,db3:33062,db4:33062"

loose-group_replication_bootstrap_group= off
loose-group_replication_single_primary_mode= FALSE

#グループレプリケーション内のネットワークアドレスを記載
loose-group_replication_ip_whitelist = 192.168.1.0/24

-----------------------------------------------------------------------------------------------------------------


3)プロセスを起動する
DB1/DB2/DB3
[root@localhost ~]# systemctl start mysqld@mysql_13306
[root@localhost ~]# systemctl enable mysqld@mysql_13306

DB2/DB3/DB4
[root@localhost ~]# systemctl start mysqld@mysql_13307
[root@localhost ~]# systemctl enable mysqld@mysql_13307


4)以下のログからパスワードを検索する。
DB1/DB2/DB3
/var/log/mysqld_13306.log

DB2/DB3/DB4
/var/log/mysqld_13307.log


5)ログインを行う
 ->(4)で得られたパスワードを入力する。
DB1/DB2/DB3
mysql -u root -p -P 13306 --protocol=TCP

DB2/DB3/DB4
mysql -u root -p -P 13307 --protocol=TCP


6)レプリケーションユーザの作成を行う(DB1DB4)
mysql> ALTER USER root@'localhost' identified by 'Pass_1234';
mysql> CREATE USER rpl_user IDENTIFIED BY 'Pass_1234';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'rpl_user'@'%';

rpl_user     :グループレプリケーション用のID名
Pass_1234:任意で決めたパスワード


7)mysqld@mysql_13306のセッティング
db1で以下を実施
mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='Pass_1234' FOR CHANNEL 'group_replication_recovery';
mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';
mysql> UNINSTALL PLUGIN validate_password;
mysql> SET GLOBAL group_replication_bootstrap_group=ON;
mysql> START GROUP_REPLICATION;
mysql> SET GLOBAL group_replication_bootstrap_group=OFF;


db2/db3で以下を実施
mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='Pass_1234' FOR CHANNEL 'group_replication_recovery';
mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';
mysql> UNINSTALL PLUGIN validate_password;
mysql> START GROUP_REPLICATION;


8)mysqld@mysql_13307のセッティング
db3で以下を実施
mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='Pass_1234' FOR CHANNEL 'group_replication_recovery';
mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';
mysql> UNINSTALL PLUGIN validate_password;
mysql> SET GLOBAL group_replication_bootstrap_group=ON;
mysql> START GROUP_REPLICATION;
mysql> SET GLOBAL group_replication_bootstrap_group=OFF;

db2/db4で以下を実施
mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='Pass_1234' FOR CHANNEL 'group_replication_recovery';
mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';
mysql> UNINSTALL PLUGIN validate_password;
mysql> START GROUP_REPLICATION;



その他ポイント:
"START GROUP_REPLICATION;"失敗するので、以下を実行
mysql>reset master;

②グループレプリケーションの状態を確認して全系MEMBER_STATEONLINEか確認

mysql> SELECT * FROM performance_schema.replication_group_members;

0 件のコメント:

コメントを投稿

php log(ECS ログ出力)

# PHPエラーログの設定 ENV PHP_INI_DIR /usr/local/etc/php RUN { \ echo 'log_errors = On' ; \ echo 'error_log = /proc/self/...