MySQLデータベース2台のホストが実戦を同期(linux)

8051 ワード

サーバからプライマリ・サーバに接続すると、プライマリ・サーバにログから最後に正常に更新された場所を通知します.その時から発生した更新をサーバから受信し、プライマリ・サーバが次の更新を通知するのをブラックアウトして待機します.
実际のプロジェクトでは、2台の离れたホストにMySQLデータベースがインストールされています.2台のサーバーは互いに准备されています.お客様は1台の机械が故障した时、もう1台はサーバー上のアプリケーションを引き継ぐことができます.これは2台のデータベースのデータがリアルタイムで一致する必要があります.ここでMySQLの同期机能を使って2机の同期コピーを実现します.
次の操作例を示します.
1、データベース同期設定
ホストオペレーティングシステム:RedHat Enterprise Linux 5
データベースバージョン:MySQL Ver 14.12 Distrib 5.0.22
前提:MySQLデータベースが正常に起動
2台のホストアドレスが次のようになるとします.
ServA:10.240.136.9
ServB:10.240.136.149
1.1同期アカウントの構成
サービスAに登録できるサービスBのアカウントを追加します.
MySQL>GRANT all privileges ON *.* TO tongbu@'10.240.136.149' IDENTIFIED BY '123456';

サービスBにサービスAがログインできるアカウントを追加します.
MySQL>GRANT all privileges ON *.* TO tongbu@'10.240.136.9' IDENTIFIED BY '123456';

1.2データベース・パラメータの構成
1、rootユーザーでサーヴァントにログインし、サーヴァントのmyを修正する.cnfファイル
vi /etc/my.cnf

[MySQLd]のコンフィギュレーション・アイテムに、次のコンフィギュレーションを追加します.
1 default-character-set=utf8
2
3 log-bin=MySQL-bin
4
5 relay-log=relay-bin
6
7 relay-log-index=relay-bin-index
8
9 server-id=1
10
11 master-host=10.240.136.149
12
13 master-user=tongbu
14
15 master-password=123456
16
17 master-port=3306
18
19 master-connect-retry=30
20
21 binlog-do-db=umsdb
22
23 replicate-do-db=umsdb
24
25 replicate-ignore-table=umsdb.boco_tb_menu
26
27 replicate-ignore-table=umsdb.boco_tb_connect_log
28
29 replicate-ignore-table=umsdb.boco_tb_data_stat
30
31 replicate-ignore-table=umsdb.boco_tb_log_record
32
33 replicate-ignore-table=umsdb.boco_tb_workorder_record

2、rootユーザーでサービスBにログインし、サービスBのmyを修正する.cnfファイル
vi /etc/my.cnf

[MySQLd]のコンフィギュレーション・アイテムに、次のコンフィギュレーションを追加します.
1 default-character-set=utf8
2
3 log-bin=MySQL-bin
4
5 relay-log=relay-bin
6
7 relay-log-index=relay-bin-index
8
9 server-id=2
10
11 master-host=10.240.136.9
12
13 master-user=tongbu
14
15 master-password=123456
16
17 master-port=3306
18
19 master-connect-retry=30
20
21 binlog-do-db=umsdb
22
23 replicate-do-db=umsdb
24
25 replicate-ignore-table=umsdb.boco_tb_menu
26
27 replicate-ignore-table=umsdb.boco_tb_connect_log
28
29 replicate-ignore-table=umsdb.boco_tb_data_stat
30
31 replicate-ignore-table=umsdb.boco_tb_log_record
32
33 replicate-ignore-table=umsdb.boco_tb_workorder_record

1.3手動でデータベース同期を実行する
ServAをメインサーバとし、ServBでMySQLを再起動するとします.
service MySQLd restart

サービスBでrootユーザーでMySQLにログインし、次のことを実行します.
MySQL> stop slave;

MySQL> load data from master;

MySQL> start slave;


サービスAでMySQLを再起動するには:
service MySQLd restart

1.4データベースの同期状態の表示
MySQLコマンドプロンプトで次の操作を行います.
MySQL> show slave status\G

同期プロセスのステータスが表示されます.以下に示すように、2行の青いフォントはslaveプロセスのステータスで、yesが正常である場合は正常です.赤いフォントは同期エラーを示し、問題がある場合はエラーメッセージが表示されます.
1 *************************** 1. row ***************************
2
3 Slave_IO_State: Waiting for master to send event
4
5 Master_Host: 10.21.2.90
6
7 Master_User: tongbu
8
9 Master_Port: 3306
10
11 Connect_Retry: 30
12
13 Master_Log_File: localhost-bin.000005
14
15 Read_Master_Log_Pos: 39753882
16
17 Relay_Log_File: localhost-relay-bin.000062
18
19 Relay_Log_Pos: 9826663
20
21 Relay_Master_Log_File: localhost-bin.000005
22
23 Slave_IO_Running: Yes
24
25 Slave_SQL_Running: Yes
26
27 Replicate_Do_DB: bak,umsdb
28
29 Replicate_Ignore_DB:
30
31 Replicate_Do_Table:
32
33 Replicate_Ignore_Table: umsdb.boco_tb_connect_log,umsdb.boco_tb_menu,umsdb.boco_tb_workorder_record,

umsdb.boco_tb_data_stat,umsdb.boco_tb_log_record
34
35 Replicate_Wild_Do_Table:
36
37 Replicate_Wild_Ignore_Table:
38
39 Last_Errno: 0
40
41 Last_Error:
42
43 Skip_Counter: 0
44
45 Exec_Master_Log_Pos: 39753882
46
47 Relay_Log_Space: 9826663
48
49 Until_Condition: None
50
51 Until_Log_File:
52
53 Until_Log_Pos: 0
54
55 Master_SSL_Allowed: No
56
57 Master_SSL_CA_File:
58
59 Master_SSL_CA_Path:
60
61 Master_SSL_Cert:
62
63 Master_SSL_Cipher:
64
65 Master_SSL_Key:
66
67 Seconds_Behind_Master:


3、データベース同期テスト
データベースの構成が完了してからテストを行います.まず、ネットワークの正常な状況でテストし、サービングAでデータベース操作を行い、サービングBでデータベース操作を行い、データを同期させることができます.
サービスBホスト上のネットワークケーブルを抜いて、サービスAでデータベース操作をしてから、サービスBのネットワーク環境を復元しますが、サービスBでは同期データが見えません.コマンドshow slave statusGで表示するとSlave_IO_Runningの状態はNoであり、この状態が長く続くと、データがサーボBに同期することができます.これは何の問題ですか.同期遅延はそんなに大きくないでしょう.その後、ネット上で関連資料を探して、同期遅延関連のパラメータを見つけました.
--slave-net-timeout=seconds

パラメータの意味:slaveがプライマリ・データベースからlogデータを読み込むのに失敗した後、接続を再確立してデータを取得するまでどのくらい待機しますか.
プロファイルにパラメータを追加し、60秒に設定します.
slave-net-timeout=60

MySQLデータベースを再起動してテストを行い、この問題を解決します.
4、データベースの同期失効の解決
データ同期プロセスが無効になった場合、slaveホストが現在バックアップしているデータベース・ログ・ファイルがmasterホスト上に存在するかどうかを手動で確認し、slaveホスト上で実行します.
MySQL> show slave status\G

一般的には、次の情報が得られます.
1 *************************** 1. row ***************************
2
3 Slave_IO_State: Waiting for master to send event
4
5 Master_Host: 10.21.3.240
6
7 Master_User: tongbu
8
9 Master_Port: 3306
10
11 Connect_Retry: 30
12
13 Master_Log_File: MySQL-bin.000001
14
15 Read_Master_Log_Pos: 360
16
17 Relay_Log_File: localhost-relay-bin.000003
18
19 Relay_Log_Pos: 497
20
21 Relay_Master_Log_File: MySQL-bin.000001
22
23 Slave_IO_Running: Yes
24
25 Slave_SQL_Running: Yes
26
27 Replicate_Do_DB: bak
28
29 Replicate_Ignore_DB:
30
31 Replicate_Do_Table:
32
33 Replicate_Ignore_Table:
34
35 Replicate_Wild_Do_Table:
36
37 Replicate_Wild_Ignore_Table:
38
39 Last_Errno: 0
40
41 Last_Error:
42
43 Skip_Counter: 0
44
45 Exec_Master_Log_Pos: 360
46
47 Relay_Log_Space: 497
48
49 Until_Condition: None
50
51 Until_Log_File:
52
53 Until_Log_Pos: 0
54
55 Master_SSL_Allowed: No
56
57 Master_SSL_CA_File:
58
59 Master_SSL_CA_Path:
60
61 Master_SSL_Cert:
62
63 Master_SSL_Cipher:
64
65 Master_SSL_Key:
66
67 Seconds_Behind_Master: 0
Master_Log_File master 。

現在のデータベースのリストをmasterで確認します.
MySQL> show master logs;

得られたログのリストは次のとおりです.
+----------------------+-----------+
| Log_name | File_size |
+----------------------+-----------+
| localhost-bin.000001 | 495 |
| localhost-bin.000002 | 3394 |
+----------------------+-----------+
slaveホストで使用されているMaster_の場合Log_File対応ファイルはmasterのログリストに存在し、slaveホスト上でセカンダリサーバスレッドをオンにすると自動的に同期できます.
MySQL> start slave;

マスターホスト上のログファイルが存在しない場合は、まずマスターホストからすべてのデータを復元し、同期メカニズムを開く必要があります.
slaveホストで実行:
MySQL> stop slave;

マスターホストで実行するには、次の手順に従います.
MySQL> stop slave;

slaveホストで実行:
MySQL> load data from master;

MySQL> reset master;

MySQL> start slave;


マスターホストで実行するには、次の手順に従います.
MySQL> reset slave;

MySQL>start slave;


注意:LOAD DATA FROM MASTERは現在、すべてのテーブルでMyISAMストレージエンジンを使用しているデータベースでのみ有効です.