ラベル 06Mysqlのレプリケーション の投稿を表示しています。 すべての投稿を表示
ラベル 06Mysqlのレプリケーション の投稿を表示しています。 すべての投稿を表示

2016年5月2日月曜日

レプリケーションに関わる各種トラブルQ&A

○レプリケーションに関わる各種トラブルQ&A
Q1:Mysqlのレプリケーションを行い、スレーブのPCを設定修正の必要が生じた場合、注意することは?
その都度スレーブ機能を停止する必要があることに、ご注意ください。具体的には、いったん、
stop slave;  とし
drop database skt;  としてから、新たにデータベースを作り直すことになります。

Q2:うまく同期されてないときどうするか?
>show slave status\G
でslave_IO_RunningがNoならば
>stop slave;
>reset slave;
ここで、⑤のCHANGE MASTER TO~を再度実行
>start slave;
を一度試してみてください。

Q3:Q2の方法でも、うまく動作しないときはどうするか?
my.ini(Windows)、my.cnf(Ubuntu)に次の設定をしてみてください。
[mysqld]
slave-skip-errors=1062,1050,1146,1136,1580
の行を追加したあと、Ubuntuならばservice mysql restartで再起動、WindowsならコントロールパネルのサービスからMysqlを再度起動してみます。

Q4:Access denied for user 'root'@'localhost' (using password: NO)というエラーが出る。
以下の方法はhttp://www.goofoo.jp/2011/11/1457を参照させていただきました。
service mysql stop
mysqld_safe --skip-grant-tables &
mysql -u root
でmysqlのコマンドプロンプトに入れます。

mysql> use mysql;
念のためuserテーブルを全件削除してから、設定を実行。
mysql> truncate table user;
mysql> flush privileges;
mysql> grant all privileges on *.* to root@localhost identified by 'password' with grant option;
実行結果を確認します。
mysql> select host, user from user;
+-----------+------+
| host      | user |
+-----------+------+
| localhost | root |
+-----------+------+
1 row in set (0.00 sec)
これでrootユーザへの権限設定ができましたので、MySQLを–skip-grant-tablesオプションなしで再起動(通常起動)します。
mysql> quit;
service mysql restartでPIDを確認後
[root ~]# kill -KILL [mysql のPID]
[root ~]# service mysql start
mysql を起動中:                                           [  OK  ]
最後に、遭遇したエラーが解消されていることを確認します。
[root ~]# mysql -u root -pパスワード
以上の操作でもうまく、mysqlのコマンドプロンプトが使えない場合
GUIで、Ubuntuのアップデートをしてみる。
これでも、だめな場合
mysqld_safe --skip-grant-tables &として
エラーを見ながら不足するパッケージをいてみる
mysql -u root -pで再度ログインしてみる。

Q5:OSのアップデートしたら、同期しなくなった。
まれに、Ubuntuのアップデートで、Mysqlのバージョンが変わったりすると、違うバージョン間のレプリケーションがうまくいかないことがあるようです。(WindowsのMysqlのバージョンが更新されないため、レプリケーションサーバにWindowsがあったりすると起こりえます。)
再度レプリケーションの修復設定をしたい場合以下のように行います。
①コマンドプロンプトを右クリックし管理者権限で開く
②エクスプローラーで、C:\ProgramFiles\mysql????\binのフォルダのパスを探し、コピーし、コマンドプロンプト内でcd C:\ProgramFiles\my….と貼りつける
※masterのPCでmysqlをアップグレードした場合、
 mysql_upgrade -u repl -pエンター  でアップグレードする。
③mysql -u repl -pエンター
④show slave status\Gエンター
⑤Last_errorの欄のエラー番号をひかえる
⑥C:\ProguramdataフォルダのMysqlのフォルダのmy.iniにスキップしたいエラー番号を追加します。
[mysqld]
slave-skip-errors=1062,1050,1146,1136,1580
最後の行の番号がこれまで、エラーが起きて追加してきた番号です。
ただし、必要な処理がスキップされてしまわないように、追加する番号は、状況をよく見て決めます。場合によっては、再度、マスターをロックして、ダンプデータのコピー、MASTER_LOG_FILEデータ、MASTER_LOG_POSデータの取得をやり直す必要も出てくると思います。

レプリケーションの設定の実際

○ 新たにスレーブのPCとして追加したいとき設定変更が必要なところ
・/var/lib/tomcat7/webapps/SGW/WEB-INF/web.xmlの一部を変更する必要があります。
<context-param>
<param-name>master_hostname</param-name>
<param-value>ここにマスターのPCのipアドレスを入力</param-value>
</context-param>
とします。
 マスターのMYSQLのあるホストのIPアドレスを指定することで、書き込みはすべていったんマスターのMyqlに保存されます。読み込みは、通常通りスレーブのPCからするので、変更不要です。
 つまり、スレーブでの書き込みは、スレーブのWebアプリで入力受付→マスターのMysqlに保存→スレーブへレプリケーション(転送)(スレーブのMysqlに保存)という流れになります。

・drop database skt;としてから、新たにsktのデータベースを作成し直します。
方法は以下の通りです。

 マスターのMySQL サーバーを「A」と呼ぶことにします。新たに追加する MySQL サーバーを「B」を Slave サーバーだとします。
※のついたところは、すでに、マスターの設定ができていれば不要です。

①Bサーバの構築
mysql > create database skt character set utf8;

※②Aサーバにレプリケーション用ユーザ作成とmy.cnfの設定
mysql > GRANT REPLICATION SLAVE ON *.* TO 'repl'@'172.16.1.0/255.255.255.0' IDENTIFIED BY 'password';
/etc/mysql/my.cnf 内に追加設定します# vi /etc/my.cnf
[mysqld]
log-bin=mysql-bin
server-id=1001
ここまで設定したら
>service mysql restartで
Aサーバを再起動します。

③Bサーバにレプリケーション用サーバ作成とmy.cnfの設定
mysql > GRANT ALL PRIVILEGES ON *.* TO 'repl'@localhost IDENTIFIED BY 'password';
# pico /etc/mysql/my.cnf
※ただし、Windowsの場合はmy.iniというファイルに設定する。
[mysqld]
log-bin=mysql-bin
server-id=1002
1002という番号は、複数のスレーブがある場合それらと重複しないようにします。

Bサーバーを再起動します。

※④Aサーバのログ位置の確認とデータベースのデータ取り出し
ここで、AサーバのMysqlにロックがかかります。
mysql > FLUSH TABLES WITH READ LOCK;
mysql > SHOW MASTER STATUS;
+----------------------+-----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+----------------------+-----------+--------------+------------------+
| mysql-bin.000031 | 285 | | |
+----------------------+-----------+--------------+------------------+
という表示の mysql-bin.000031 と 285 の2つの値をメモしておきます。
# mysqldump -u root -p skt --lock-all-tables > skt.sql
これで指定した skt データベースのダンプを skt.sql というファイルに取得することができます。
取得後は再度もう一つのターミナルに戻って以下のコマンドを実行し、ロックを解除します
mysql > UNLOCK TABLES;

⑤Bサーバへのskt.sqlデータのコピー と データのBサーバへの展開、2つの値の設定
④で取得したスナップショットファイル(skt.sql)を、B サーバに転送します。
# mysql -u repl -p skt < skt.sql
として、Bサーバにデータを展開します。
mysql > CHANGE MASTER TO
MASTER_HOST='マスターのipアドレス',
MASTER_USER='repl',
MASTER_PASSWORD='password',
MASTER_LOG_FILE='mysql-bin.000031',
MASTER_LOG_POS=285;
として、先ほどの2つの値等を設定します。

mysql > START SLAVE;
これで、レプリケーションがスタートします。

レプリケーションの下準備

○ 添付ファイルの扱いについて ~レプリケーションの設定の前に必要なこと~
グループウエアのメッセージや各種データは、Mysqlのデータベースで同期をとりますが、添付ファイルは、各サーバに置かず、マスターサーバへのリンクで対応させています。まず、その方法について説明します。
・スレーブがwindowsの場合
 c:\tenpuを\\マスターサーバのipアドレス\tenpuへのシンボリックリンクとして作成する。
(あらかじめ、マスターサーバのtenpuフォルダの共有設定をしておく必要がある)
管理者権限でコマンドプロンプトで
mklink /d c:\tenpu \\マスターサーバのipアドレス\tenpuとすればよい。
※また、画像挿入の機能を追加してからは、ユーザーから見えるパスを../tenpu/ではなく
http://マスターサーバのipアドレス:8080/tenpu/に変更する必要があります。(サーバがLinuxだけであれば、変更不要です。Windowsが1台でも含まれていたら、すべてのサーバの設定をこのように変更する必要があります。)
・スレーブがUbuntuの場合
/etc/init.d/winmountというスクリプトを置いて、起動時実行するようにする。
ファイルの中身
(sleep 30というコマンドについて:起動時30秒ぐらいしてからマウントしないと うまくマウントできないようです。)
#!/bin/sh
sleep 30
sudo mount -t cifs -o username="user",password="" //マスターサーバのipアドレス/tenpu /mnt/windows
この/etc/init.d/winmountを/etc/rc.localに記述しておくとよい
chmod +x /etc/init.d/winmountとしておく。
/mnt/windowsに/tenpuのシンボリックリンクをはる

2016年5月1日日曜日

Mysqlのレプリケーションについて

 学校では、CPU、メモリ等が十分なサーバを用意できずスペックの古いPCをサーバとして利用しなければならないこともあると思います。また、朝の限られた時間にアクセスが集中するということもあります。
 Mysqlのレプリケーションが必要になることは、それほどないとは思いますが、PCの速度、利用者人数など勘案して冗長性を持たせたいこともあるかと思います。グループウエアSGWを複数のサーバで同期をとりながら、利用することで、アクセス集中を緩和できます。