MySQLクラスタ構築(1)-プライマリ・プロビジョニング構築
データベースは、どのビジネスにおいても最も重要な一環であり、データベース・アーキテクチャに対する高い要求です.単一のデータベースは常に本番環境に存在するべきではありません.単一のデータベース、バックアップの欠落による損失が多すぎることを目撃しています.そのため、高可用性MySQLクラスタを構築する必要があります.
クラスタの構築には、次のメリットがあります.高可用性、マスター・セクションの失効時に自動的に切り替え、技術者緊急処理 を必要としない高スループットは、複数のノードが同時にデータの読み取りサービスを提供し、メインノードの負荷を低減し、高スループット を実現することができる.拡張性が高く、オンライン拡張をサポート バックアップに影響なし、バックアップノードでのバックアップ操作はビジネスに影響しない 欠点といえば、以下の点があります.アーキテクチャが複雑で、配置、管理の面で技術者に要求がある スタンバイノードがプライマリノードログをプルすると、プライマリノードサーバのパフォーマンスに一定の影響があります 半同期レプリケーションが構成されている場合、トランザクションのコミットに少し影響します 総じて言えば、クラスタは必ず構築されなければならないので、誰が自分のデータをいつでもリスクのあるデータベースに走ることができますか.次に、単純なプライマリ・プロビジョニング・モードから高可用性アーキテクチャへのアプローチについていくつかの記事で説明します.このセクションでは、MySQLのマスターを構築する方法について説明します.操作を重視し、理論的な説明はあまりありません.
1環境準備
1.1データベースの起動
2台のマシンでそれぞれMySQLインスタンスを起動し、MySQL構築方式はMySQLインストール(バイナリ版)を参考にすることができる.
IP
システム
ポート
MySQLバージョン
ノード
192.168.41.83
Centos6.8
3306
5.7.20
Master
192.168.41.72
Centos6.8
3306
5.7.20
Salve
重要な構成:
Master:
Salve
構成の解析 を開くことをお勧めします. をオンにしてみてください. 1.2データの挿入
Masterが使用中のデータベースであると仮定し、オンラインでバックアップを構築し、テストデータをMasterノードに挿入します.
2オンライン構築主従
現在、私たちの環境は以下の通りです.192.168.41.83:3306 Masterノード、使用中 192.168.41.72:3306新しくデータベースを建てて、上で192.168.41.83の備庫 をします
2.1同期ユーザの作成
同期用の権限を付与する
2.2データのバックアップ
よく使うバックアップデータの方式は
パラメータ解析: に直接データをエクスポートします. である. をロックおよびロック解除する を追加する必要があります. データのバックアップが完了したら、Slaveマシンに直接データファイルを転送します.
2.3データ復旧
Slaveマシン上で直接sqlファイルインポートデータを実行する
インポートが完了すると、データとMasterのバックアップデータが一致していることがわかります.
2.4同期のオン
バックアップ・ファイルに戻り、Masterバックアップ・ポイントのバイナリ・ログの場所をヘッダーから見つけます.
実際の実行結果は以下の通りです.
同期ステータスの表示 出力結果から同期が正常であることがわかりますので、テストしてみましょう.
2.5同期テスト
Masterノードに新しいデータを挿入
スタンバイノードデータ同期状態の確認
データがスタンバイノードに同期されていることがわかり、今回のプライマリ・スタンバイが完了しました.
クラスタの構築には、次のメリットがあります.
1環境準備
1.1データベースの起動
2台のマシンでそれぞれMySQLインスタンスを起動し、MySQL構築方式はMySQLインストール(バイナリ版)を参考にすることができる.
IP
システム
ポート
MySQLバージョン
ノード
192.168.41.83
Centos6.8
3306
5.7.20
Master
192.168.41.72
Centos6.8
3306
5.7.20
Salve
重要な構成:
Master:
[client]
port = 3306
default-character-set=utf8mb4
socket = /data/mysql_db/mysql_seg_3306/mysql.sock
[mysqld]
datadir = /data/mysql_db/mysql_seg_3306
basedir = /usr/local/mysql57
tmpdir = /tmp
socket = /data/mysql_db/mysql_seg_3306/mysql.sock
pid-file = /data/mysql_db/mysql_seg_3306/mysql.pid
skip-external-locking = 1
skip-name-resolve = 1
port = 3306
server_id = 833306
default-storage-engine = InnoDB
character-set-server = utf8mb4
default_password_lifetime=0
#### log ####
log_timestamps=system
log_bin = /data/mysql_log/mysql_seg_3306/mysql-bin
log_bin_index = /data/mysql_log/mysql_seg_3306/mysql-bin.index
binlog_format = row
relay_log_recovery=ON
relay_log=/data/mysql_log/mysql_seg_3306/mysql-relay-bin
relay_log_index=/data/mysql_log/mysql_seg_3306/mysql-relay-bin.index
log_error = /data/mysql_log/mysql_seg_3306/mysql-error.log
#### replication ####
replicate_wild_ignore_table = information_schema.%,performance_schema.%,sys.%
#### semi sync replication settings #####
plugin_dir=/usr/local/mysql57/lib/plugin
plugin_load = "rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"
loose_rpl_semi_sync_master_enabled = 1
loose_rpl_semi_sync_slave_enabled = 1
loose_rpl_semi_sync_master_timeout = 5000
Salve
[client]
port = 3306
default-character-set=utf8mb4
socket = /data/mysql_db/mysql_seg_3306/mysql.sock
[mysqld]
datadir = /data/mysql_db/mysql_seg_3306
basedir = /usr/local/mysql57
tmpdir = /tmp
socket = /data/mysql_db/mysql_seg_3306/mysql.sock
pid-file = /data/mysql_db/mysql_seg_3306/mysql.pid
skip-external-locking = 1
skip-name-resolve = 1
port = 3306
server_id = 723306
read_only=1
default-storage-engine = InnoDB
character-set-server = utf8mb4
default_password_lifetime=0
#### log ####
log_timestamps=system
log_bin = /data/mysql_log/mysql_seg_3306/mysql-bin
log_bin_index = /data/mysql_log/mysql_seg_3306/mysql-bin.index
binlog_format = row
relay_log_recovery=ON
relay_log=/data/mysql_log/mysql_seg_3306/mysql-relay-bin
relay_log_index=/data/mysql_log/mysql_seg_3306/mysql-relay-bin.index
log_error = /data/mysql_log/mysql_seg_3306/mysql-error.log
#### replication ####
replicate_wild_ignore_table = information_schema.%,performance_schema.%,sys.%
#### semi sync replication settings #####
plugin_dir=/usr/local/mysql57/lib/plugin
plugin_load = "rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"
loose_rpl_semi_sync_master_enabled = 1
loose_rpl_semi_sync_slave_enabled = 1
loose_rpl_semi_sync_master_timeout = 5000
構成の解析
datadir
,basedir
,tmpdir
はそれぞれデータファイル位置、データベースプログラムインストール位置、一時ファイル位置server_id
インスタンスid,注意,同一クラスタマシンのserver_idは同じではありませんread_only
読み取り専用かどうかは、一般的に備庫設定log_bin
,log_bin_index
バイナリ・ログ・ロケーション、バイナリ・ログ・インデックス・ファイル・ロケーションbinlog_format
バイナリログフォーマット、row
は各データの変化状況を記録することを表し、statement
は関連sql文を記録することを表し、mixed
は2種類の混用を表し、クラスタを構築する際にrow
フォーマットを使用することを提案し、sql文でデータを同期するとデータの不一致が発生しやすい場合relay_log_recovery
slaveダウンタイム後、中継ログが破損した場合は、ログを再プルします.中継ログの完全性を保証するために、relay_log
,relay_log_index
中継ログおよび中継ログインデックスファイル位置log_error
エラーログ位置replicate_wild_ignore_table
同期時に無視する必要があるテーブルです.ここではシステム統計テーブルを無視します.奇妙な同期失敗が発生した場合は、plugin_dir
カード位置plugin_load
起動時にロードするプラグインloose_rpl_semi_sync_master_enabled
無損半同期レプリケーション-プライマリ・ライブラリを開くかどうか(プライマリ・スタンバイがすべて開くことを推奨し、プライマリ・スタンバイの切り替えを容易にする)loose_rpl_semi_sync_slave_enabled
無損半同期レプリケーション-スタンバイをオープンするかどうか(プライマリ・スタンバイがすべてオープンすることを推奨し、プライマリ・スタンバイの切り替えを容易にする)Masterが使用中のデータベースであると仮定し、オンラインでバックアップを構築し、テストデータをMasterノードに挿入します.
[mysql@mysql-test-83 ~]$ mydb-test_seg
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 29
Server version: 5.7.21-log MySQL Community Server (GPL)
Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
db83-3306>>show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
db83-3306>>create database mytest;
Query OK, 1 row affected (0.00 sec)
db83-3306>>use mytest;
Database changed
db83-3306>>create table test1(
-> id int not null primary key auto_increment,
-> name varchar(16) not null default '',
-> age int not null default 0
-> ) engine = InnoDb charset = utf8;
Query OK, 0 rows affected (0.01 sec)
db83-3306>>insert into test1 values (0, 'a', 16), (0, 'b', 17), (0, 'c', 18), (0, 'd', 19);
Query OK, 4 rows affected (0.00 sec)
Records: 4 Duplicates: 0 Warnings: 0
db83-3306>>select * from test1;
+----+------+-----+
| id | name | age |
+----+------+-----+
| 1 | a | 16 |
| 2 | b | 17 |
| 3 | c | 18 |
| 4 | d | 19 |
+----+------+-----+
4 rows in set (0.00 sec)
2オンライン構築主従
現在、私たちの環境は以下の通りです.
2.1同期ユーザの作成
同期用の権限を付与する
repl
のユーザー名を作成しました.db83-3306>>CREATE USER 'repl'@'%' IDENTIFIED BY 'repl';
Query OK, 0 rows affected (5.01 sec)
db83-3306>>GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
Query OK, 0 rows affected (0.00 sec)
db83-3306>>flush privileges;
Query OK, 0 rows affected (0.00 sec)
2.2データのバックアップ
よく使うバックアップデータの方式は
REPLICATION SLAVE
とinnobackupex
で、ここでデータ量は少なくて、私達はmysqldump
で全備を行います[mysql@mysql-test-83 ~]$ /usr/local/mysql57/bin/mysqldump -S /data/mysql_db/mysql_seg_3306/mysql.sock -F --opt -R --single-transaction --master-data=2 --default-character-set=utf8 -A > mysql_backup_full.sql
パラメータ解析:
mysqldump
socketファイルを選択し、ネイティブ接続データベースはこの方法でもip、ポートを指定して接続する-S
エクスポート開始前にログをリフレッシュ-F
このパラメータがmysqldumpコマンドを同時にアクティブにしたquick,add-drop-table,add-locks,extended-insert,lock-tablesパラメータを表す場合--opt
はバッファ出力を無視することを意味し、mysqldumpコマンドは指定したSQLファイル--quick
は、各--add-drop-table
コマンドの前にCREATE TABEL
文を追加し、データテーブルの重複を防止するDROP-TABLE IF EXISTS
INSERTデータの前後で対応するデータテーブル--add-locks
複数行挿入可能--extended-insert
ストアド・プロシージャおよびカスタム関数をエクスポートし、ストアド・プロシージャに役立つ場合は、このパラメータ-R
(innodb)トランザクションの独立性レベルを繰り返し可能、すなわち--single-transaction
に設定します.これにより、1つのトランザクションで同じクエリーが同じデータをすべて読み込むことが保証され、すべてのテーブルがInnoDBであればこのパラメータが付き、データの一貫性が保証され、バックアップ時にテーブルがロックされません.MyISAMのテーブルがある場合は、データの整合性を保証するためにテーブルバックアップをロックする必要がありますREPEATABLE READ
バックアップ・プロシージャの読み込みロック、--lock-all-tables
オプションおよびsingle-transaction
オプションは、2つ選択されていますlock-all-tables
現在のバイナリ・ログの位置を記録し、--master-data=2
1と2の違いを取るが、後者はmaster_data
コマンドを注釈したchange master ...
符号化を選択することは非常に重要であり、符号化の選択が間違っているか、設定されていないと文字化しやすい--default-character-set
すべてのライブラリをバックアップ[mysql@mysql-test-83 ~]$ ll
total 772
-rw-rw-r-- 1 mysql mysql 786921 Nov 17 10:38 mysql_backup_full.sql
[mysql@mysql-test-83 ~]$ rsync -avzP mysql_backup_full.sql 192.168.41.72:/home/mysql/
2.3データ復旧
Slaveマシン上で直接sqlファイルインポートデータを実行する
[mysql@mysql-test-72 ~]$ ll mysql_backup_full.sql
-rw-rw-r-- 1 mysql mysql 786921 Nov 17 10:38 mysql_backup_full.sql
[mysql@mysql-test-72 ~]$ /usr/local/mysql57/bin/mysql -S /data/mysql_db/mysql_seg_3306/mysql.sock < mysql_backup_full.sql
インポートが完了すると、データとMasterのバックアップデータが一致していることがわかります.
db72-3306>>show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| mytest |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
db72-3306>>use mytest;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
db72-3306>>show tables;
+------------------+
| Tables_in_mytest |
+------------------+
| test1 |
+------------------+
1 row in set (0.00 sec)
db72-3306>>select * from test1;
+----+------+-----+
| id | name | age |
+----+------+-----+
| 1 | a | 16 |
| 2 | b | 17 |
| 3 | c | 18 |
| 4 | d | 19 |
+----+------+-----+
4 rows in set (0.00 sec)
2.4同期のオン
バックアップ・ファイルに戻り、Masterバックアップ・ポイントのバイナリ・ログの場所をヘッダーから見つけます.
[mysql@mysql-test-72 ~]$ head -30 mysql_backup_full.sql | grep 'CHANGE MASTER TO MASTER_LOG_FILE'
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000004', MASTER_LOG_POS=154;
-A
およびMASTER_LOG_FILE
は、MasterがMASTER_LOG_POS
を実行して得られるバイナリ位置情報である.同期コマンドを実行します--
-- reset slave;
--
CHANGE MASTER TO
MASTER_HOST='192.168.41.83',
MASTER_PORT=3306,
MASTER_USER='repl',
MASTER_PASSWORD='repl',
MASTER_LOG_FILE='mysql-bin.000004',
MASTER_LOG_POS=154;
--
start slave
実際の実行結果は以下の通りです.
db72-3306>>CHANGE MASTER TO
-> MASTER_HOST='192.168.41.83',
-> MASTER_PORT=3306,
-> MASTER_USER='repl',
-> MASTER_PASSWORD='repl',
-> MASTER_LOG_FILE='mysql-bin.000004',
-> MASTER_LOG_POS=154;
Query OK, 0 rows affected, 2 warnings (0.20 sec)
db72-3306>>start slave;
Query OK, 0 rows affected (0.01 sec)
同期ステータスの表示
db72-3306>>show slave status \G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.41.83
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000004
Read_Master_Log_Pos: 154
Relay_Log_File: mysql-relay-bin.000002
Relay_Log_Pos: 320
Relay_Master_Log_File: mysql-bin.000004
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 154
Relay_Log_Space: 527
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 833306
Master_UUID: 15958368-e9a0-11e8-a98c-ecb1d77febe4
Master_Info_File: /data/mysql_db/mysql_seg_3306/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
1 row in set (0.00 sec)
ERROR:
No query specified
show master status
,Slave_IO_Running
,Slave_SQL_Running
,Seconds_Behind_Master
の3つのパラメータから同期状態が正常かどうかを判断することができる.Slave_IO_Running
Masterログのスレッドを取り、Yes
は実行中Slave_SQL_Running
ログからデータをリカバリするスレッド、Yes
は実行中Seconds_Behind_Master
現在のデータベースは、プライマリ・ライブラリのデータに対して遅延しており、この値は、バイナリ・ログのタイムスタンプに基づいて計算される(秒)2.5同期テスト
Masterノードに新しいデータを挿入
db83-3306>>insert into test1 values(0, 'chengqm', 24);
Query OK, 1 row affected (0.00 sec)
db83-3306>>select * from test1;
+----+---------+-----+
| id | name | age |
+----+---------+-----+
| 1 | a | 16 |
| 2 | b | 17 |
| 3 | c | 18 |
| 4 | d | 19 |
| 5 | chengqm | 24 |
+----+---------+-----+
5 rows in set (0.00 sec)
スタンバイノードデータ同期状態の確認
db72-3306>>select * from test1;
+----+---------+-----+
| id | name | age |
+----+---------+-----+
| 1 | a | 16 |
| 2 | b | 17 |
| 3 | c | 18 |
| 4 | d | 19 |
| 5 | chengqm | 24 |
+----+---------+-----+
5 rows in set (0.00 sec)
データがスタンバイノードに同期されていることがわかり、今回のプライマリ・スタンバイが完了しました.