Skip to content

Instantly share code, notes, and snippets.

@hironomiu
Last active December 31, 2015 17:19
Show Gist options
  • Save hironomiu/8019721 to your computer and use it in GitHub Desktop.
Save hironomiu/8019721 to your computer and use it in GitHub Desktop.
レプリケーション

レプリケーション

事前準備 PORTの解放確認

3306が解放されていない場合以下を実施

# vi /etc/sysconfig/iptables
+ -A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT
# service iptables restart

my.cnfの設定

  • [mysqld]以下に記述する事

master

# vi /etc/my.cnf  

+ server_id = 1  

# service mysql restart 
  • log_bin = /var/lib/mysql/mysql-binは予め設定済み(未設定の場合は設定)
  • binlog_format = mixedは予め設定済み(未設定の場合は設定)

slave

  • read_onlyで設定
# vi /etc/my.cnf  

+ server_id = 2  
+ relay_log= mysql-relay-bin   
+ log-slave-updates
+ read_only

# service mysql restart  

レプリケーションユーザの作成

  • XXX.XXX.XXX.XXXのIPは各slaveのIPを設定すること

master

# mysql   
mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'replicator'@'XXX.XXX.XXX.XXX' IDENTIFIED BY 'replicator';  

ポジションの確認

master

# mysql  
mysql> show master status;  

レプリケーションの設定

  • XXX.XXX.XXX.XXXのIPは各masterのIPを設定すること
  • mysql-bin.XXXXXXは「show master status」で取得したFileを設定すること
  • YYYは「show master status」で取得したPositionを設定すること

slave

# mysql  
mysql> change master to  
  master_host = 'XXX.XXX.XXX.XXX',  
  master_user='replicator',  
  master_password='replicator',  
  master_port =3306,  
  master_log_file='mysql-bin.XXXXXX',  
  master_log_pos=YYY;  

レプリケーション開始

slave

mysql> show processlist;
mysql> start slave;
mysql> show processlist;
  • エラーとならないこと
  • 2個のsystemuserが存在すること

master

mysql> show processlist;  
  • 1個のreplicatorが存在すること

レプリケーションのステータス確認

slave

mysql> show slave status\G 
  • Slave_IO_RunningがYesとなっていること
  • Slave_SQL_RunningがYesとなっていること

動作確認

テーブルの確認

master

# mysql  
mysql> use test  
mysql> show tables
  • テーブルが存在しないこと

slave

# mysql  
mysql> use test  
mysql> show tables;  
  • テーブルが存在しないこと

テーブルの作成

master

mysql> create table test(id int);  
mysql> show tables;
mysql> select * from test;  
  • テーブルが作成出来、show tablesで表示されること

slave

mysql> show tables; 
mysql> select * from test;  
  • show tablesで表示されること

データの挿入

master

mysql> insert into test values(10); 
mysql> select * from test;
  • 10が出力されること

slave

mysql> select * from test;
  • 10が出力されること

binlog,relaylogの確認

master

  • mysql-bin.XXXXXXは最新のファイルを指定する
# cd /var/lib/mysql 
# cp mysql-bin.XXXXXX /tmp 
# cd /tmp 
# mysqlbinlog mysql-bin.XXXXXX > log.txt 
# vi log.txt 
  • testテーブルの操作(create,insert)を確認

slave

  • mysql-relay.XXXXXXは最新のファイルを指定する
# cd /var/lib/mysql 
# cp mysql-relay.XXXXXX /tmp 
# cd /tmp 
# mysqlbinlog mysql-relay.XXXXXX > log.txt 
# vi log.txt   
  • testテーブルの操作(create,insert)を確認

レプリケーション遅延

データ準備

master アプリデプロイ

$ git clone https://github.com/hironomiu/web-performance-tuning.git
$ cd web-performance-tuning/
$ vi Makefile
- DB_SCHEMA?=groupwork
+ DB_SCHEMA?=techtrain

Connection failed: SQLSTATE[HY000] [1045] Access denied for user 'demouser'@'localhost' (using password: YES) が出てOK

$ make install

httpdの設定

$ su -

# vi /etc/httpd/conf/httpd.conf
- DocumentRoot "/var/www/html"
+ DocumentRoot “/home/techtrain/web-performance-tuning/public_html"

- <Directory "/var/www/html">
+ <Directory "/home/techtrain/web-performance-tuning/public_html">

# service httpd restart
# exit

DB接続修正

$ vi ~/web-performance-tuning/app/config.php
- $mysqldConfig['database'] = 'groupwork';
- $mysqldConfig['user'] = 'demouser';
- $mysqldConfig['password'] = 'demopass';

+ $mysqldConfig['database'] = 'techtrain';
+ $mysqldConfig['user'] = 'techtrain';
+ $mysqldConfig['password'] = 'techtrain';

動作確認をブラウザですること(以下例)

http://133.242.227.244/chapter1/read

重要ログ削除

mysql> PURGE MASTER LOGS TO 'mysql-bin.000007';

確認 マスタースレーブともにtechtrainにuser、messageが存在すること

遅延再現

手際良く作業しないと確認出来ないので注意

master ターミナル1

mysql> update message set updated_at = now();  

master ターミナル2

  • master ターミナル1のSQLが完了したら実行する
# mysql  

mysql> use test;  
mysql> insert into test values(200);  

slave

  • master ターミナル2のSQLが完了したら実行する
# mysql

mysql> use test;  
mysql> select * from test; 
  • 200が出力されないこと
mysql> show slave status\G
  • Seconds_Behind_Masterの数値がカウントアップされること

ファイルの確認

master ターミナル1

# ll /var/lib/mysql
  • mysql-bin.XXXXXXのサイズを確認

slave ターミナル1

# ll /var/lib/mysql
  • mysql-bin.XXXXXXのサイズを確認

レプリケーション遅延(rowベースでの検証)

前で試験した内容をbinlog_formatをmixedからrowに変更して検証

my.cnfの変更

master

# vi /etc/my.cnf

binlog_format = row

# service mysql restart

# mysql

mysql> show global variables like 'binlog_format%';
  • rowが返ること

slave

# vi /etc/my.cnf

binlog_format = row

# service mysql restart

# mysql

mysql> show global variables like 'binlog_format%';
  • rowが返ること

遅延再現

master ターミナル1

# mysql

mysql> use groupwork;
mysql> update message set updated_at = now();

master ターミナル2

  • master ターミナル1のSQLが完了したら実行する
# mysql  

mysql> use test;  
mysql> insert into test values(500);  

slave

  • master ターミナル2のSQLが完了したら実行する
# mysql 

mysql> use test; 
mysql> select * from test; 
  • 500が出力されないこと
mysql> show slave status\G
  • Seconds_Behind_Masterの数値がカウントアップされること

ファイルの確認

master ターミナル1

# ll /var/lib/mysql
  • mysql-bin.XXXXXXのサイズを確認

slave ターミナル1

# ll /var/lib/mysql
  • mysql-bin.XXXXXXのサイズを確認

mixedのときのファイルサイズと比較すること

siegeを用いた検証

master ターミナル1

# su - demouser
$ cd sunrise
$ siege -c 10 http://localhost/mysql_insert_data

master ターミナル2

# mysql

mysql> use groupwork;
mysql> select count(*) from user;

slave

# mysql

mysql> use groupwork;
mysql> select count(*) from user;
mysql> show slave status¥G

課題

mysql_insert_dataを変更してmasterにinsert,slaveでinsertしたデータのselectを書いてみましょう 書いた後にsiegeでランニングさせつつ、実際にurlを叩いて挙動を確認しましょう。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment