適当に・・・

何の目的も無くブログを立ち上げてみました。更新は不定期ですね。

CentOS 6 + MySQL 5.6 + keepalive(2)

2016年06月08日 22時07分01秒 | Linux

CentOS 6 + MySQL 5.6 + keepalive(2)

前回の続きです。

さて今回は前回の設定を準同期の設定に変更してみようと思います。

そんなにやること無いんで気楽に行きます。

rootで作業してます。

mysqldが立ち上がっている場合は
スレーブ、マスターの順に停止します。

マスター側の設定を変更します。
# vi /etc/my.cnf

plugin-load=rpl_semi_sync_master=semisync_master.so
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=3000

を追加し保存します。

続いてスレーブ側の設定を変更します。
# vi /etc/my.cnf

plugin-load=rpl_semi_sync_slave=semisync_slave.so
rpl_semi_sync_slave_enabled=1

を追加し保存します。

マスター、スレーブの順でmysqld を上げます。
# /etc/init.d/mysqld start

でログを見てみるとエラーwww

スレーブ側でスレーブを停止して再度マスターと同期
mysql>stop slave;
mysql> CHANGE MASTER TO
-> MASTER_HOST='192.168.0.51',
-> MASTER_USER='slave',
-> MASTER_PASSWORD='56789',
-> MASTER_LOG_FILE='mysql-bin.000004',
-> MASTER_POS=120;

ERROR 1872 (HY000): Slave failed to initialize relay log info structure from the repository

はて?何故かエラーが。

mysql> show slave status;
を行うとmysql-bin.000004
pos 120で合ってる。

しょうがないから一度スレーブの状態をリセット
mysql> reset slave;

再度同期
mysql> CHANGE MASTER TO
-> MASTER_HOST='192.168.0.51',
-> MASTER_USER='slave',
-> MASTER_PASSWORD='56789',
-> MASTER_LOG_FILE='mysql-bin.000004',
-> MASTER_POS=120;
Query OK, 0 rows affected, 2 warnings (0.02 sec)

mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

これで同期状態なので、マスタ側で
mysql> show status like 'Rpl%';
+--------------------------------------------+-------+
| Variable_name | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients | 1 |
| Rpl_semi_sync_master_net_avg_wait_time | 0 |
| Rpl_semi_sync_master_net_wait_time | 0 |
| Rpl_semi_sync_master_net_waits | 0 |
| Rpl_semi_sync_master_no_times | 0 |
| Rpl_semi_sync_master_no_tx | 0 |
| Rpl_semi_sync_master_status | ON |
| Rpl_semi_sync_master_timefunc_failures | 0 |
| Rpl_semi_sync_master_tx_avg_wait_time | 0 |
| Rpl_semi_sync_master_tx_wait_time | 0 |
| Rpl_semi_sync_master_tx_waits | 0 |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0 |
| Rpl_semi_sync_master_wait_sessions | 0 |
| Rpl_semi_sync_master_yes_tx | 0 |
| Rpl_semi_sync_slave_status | OFF |
+--------------------------------------------+-------+

Rpl_semi_sync_master_clientsが1になっているので準同期です。

設定されているのでテストです。
マスタ側で
use test;
mysql> CREATE TABLE aic1(col INT NOT NULL AUTO_INCREMENT PRIMARY KEY);

※use testでエラーになる場合はテスト用のdbを作成してください。
mysql> create database test;

スレーブ側で
use test;
mysql> select * from aic1;
Empty set (0.00 sec)


マスター側で
mysql> BEGIN;
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO aic1 VALUES (NULL);
Query OK, 1 row affected (0.00 sec)

スレーブ側で
mysql> stop slave;

マスター側で
mysql> commit;
Query OK, 0 rows affected (3.00 sec)
3.00 sec は rpl_semi_sync_master_timeout=3000 と設定した値です。

マスター側で
mysql> select * from aic1;
+-----+
| col |
+-----+
| 1 |
+-----+
1 row in set (0.00 sec)
ちゃんと反映されています。

スレーブ側で
mysql> select * from aic1;
Empty set (0.00 sec)

反映されていませんね。では
mysql> start slave;

mysql> select * from aic1;
+-----+
| col |
+-----+
| 1 |
+-----+
1 row in set (0.00 sec)

復帰しました。これで準同期はOKです。


keepaliveの続きをこの記事に書いてアップデートします。

CentOS 6 + MySQL 5.6 + keepalive(1)

2016年06月08日 19時01分22秒 | Linux

CentOS 6.x + MySQL 5.6 + keepalive(1)

CentOS 6.x に MySQL 5.6を入れて準同期レプリケーションを行いつつ
KeepAliveでHAを・・・。

最近めっきりインフラの設定とかやってなかったんで久しぶりです。
間違えとか突っ込みどころは、気にせずに読んでる方が作業するときに気をつけて頂きたいです。

作業ユーザーはrootを想定していますのでそれ以外のユーザーは
suとかsudoとかお好きな方を。ちなみにsu派です。


新規にインストールしたCentOS6.x 2台にmysqlを入れます。
(CentOS7はMariaDBですもんね。後でやります。)

# rpm -qa | grep mysql
ずらずら何かインストールされているものが出る。

# rpm -y remove mysql*
mysql関連をごっそり消しまする。

# yum install http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm

# yum install mysql mysql-devel mysql-server mysql-utilities
必要な物を入れる。

#mysqld --version
mysqld Ver 5.6.31 for Linux on x86_64 (MySQL Community Server (GPL))

終わりました早いです。

# /etc/init.d/mysqld start

# mysqladmin -u root password '12345'
※テスト用に12345とかにしていますが、本番に脆弱なパスワードはやめてくださいw

マスターmysqlのレプリケーション設定を行う

/etc/my.cnfに次を書き込みます。

server-id=1001
log-bin=mysql-bin

保存後 mysqlをリスタートします。
# /etc/init.d/mysqld restart

mysqlにログインしバックアップを取得します。

# mysql -u root -p12345

mysql> FLUSH TABLES WITH READ LOCK;
Query OK, 0 rows affected (0.00 sec)

違うターミナルを立ち上げてログインし
# cd /var/lib/
# tar /tmp/mysql.tar.gz mysql

mysqlにログインしているシェルで
mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 | 120 | | | |
+------------------+----------+--------------+------------------+-------------------+
とすると今の状態が参照できます。後で使うのでメモをとっておくと便利です。

バックアップをとったのでロックを解除します。
mysql> UNLOCK TABLES;
Query OK, 0 rows affected (0.00 sec)

レプリケーション用のユーザを作成します。
mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' IDENTIFIED BY '56789';
Query OK, 0 rows affected (10.00 sec)
※脆弱なパスワードはやめましょう。

ここでiptable(ファイアーウォール)を設定してる場合(ほとんどだとは思いますが・・)
iptables -A INPUT -s xx.xx.xx.xx -p tcp --dport 3306 -j ACCEPT とします。
(/etc/sysconfig/iptablesに書き込んでiptableをリスタートでも構いません。 as you like)
(外部通信用と内部通信用のnicは別が好ましいと思います。)

ちなみに今回はDB1に 192.168.0.51 を DB2に192.168.0.52を割り当てました。
(VPSの都合です。)

マスター側は設定が終わったのでmysqlをリスタート
#/etc/init.d/mysqld restart

次はスレーブ側を設定します。
# vi /etc/my.cnf

server-id=1002

を追加して保存します。この時この番号はマスター側と重複しないように気をつけます。

mysqlを停止します。
# /etc/init.d/mysqld stop

マスター側で作った mysql.tar.gzを転送し/var/libに移動
# cd /var/lib
# tar xvzf mysql.tar.gz

mysqlを起動
# /etc/init.d/mysqld start

mysqlのスレーブ設定。
# mysql -u root -p12345

mysql> CHANGE MASTER TO
-> MASTER_HOST='192.168.0.51',
-> MASTER_USER='slave',
-> MASTER_PASSWORD='56789',
-> MASTER_LOG_FILE='mysql-bin.000003',
-> MASTER_LOG_POS=120;

Query OK, 0 rows affected, 2 warnings (0.01 sec)

※ワーニング出てる
ユーザー、及びパスワードが脆弱だと言われてるのと
先の tar 解凍するときに /var/lib/mysql/auto.confもコピーしてきたのでこれが同じで怒られてる
/var/lib/mysql/auto.confを削除してmysqlを再起動

これで同期レプリケーションの設定はOK

マスター側で
# mysql -u root -p12345
mysql> create database test;
Query OK, 1 row affected (10.00 sec)

としtestデータベースを作りスレーブ側で
# mysql -u root -p12345
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
+--------------------+
4 rows in set (0.00 sec)

としてtestデータベースが存在することを確認。
後は色々とマスター側でmysqlのコマンドを発行しスレーブ側に反映されるか確認する。