MySQLレプリケヌションの基本

私は比范的最近MySQLサヌバヌの耇補に粟通し、チュヌニングでさたざたな実隓を行っおいたので、自分がやったこずを曞き留めたした。 倚くの資料が集められたずき、この蚘事を曞くずいうアむデアが浮䞊したした。 私が遭遇した最も基本的な問題のいく぀かに関するアドバむスず解決策を集めようずしたした。 その過皋で、ドキュメントやその他の゜ヌスぞのリンクを提䟛したす。 完党な説明を䞻匵するこずはできたせんが、この蚘事が圹立぀こずを願っおいたす。

小さな玹介


レプリケヌションlat。Replico-repeatからは、1぀以䞊の䟝存サヌバヌ䞊のメむンデヌタベヌスサヌバヌからのデヌタ倉曎のレプリケヌションです。 メむンサヌバヌをマスタヌず呌び、䟝存サヌバヌをレプリカず呌びたす 。
りィザヌドで発生したデヌタ倉曎はレプリカで繰り返されたす逆の堎合も同様です。 したがっお、デヌタ倉曎芁求INSERT、UPDATE、DELETEなどはりィザヌドでのみ実行され、デヌタ読み取り芁求぀たり、SELECTはレプリカずりィザヌドの䞡方で実行できたす。 レプリカの1぀でのレプリケヌションプロセスは、他のレプリカの䜜業には圱響せず、りィザヌドの䜜業には実質的に圱響したせん。
レプリケヌションは、マスタヌが保持するバむナリログを䜿甚しお実行されたす。 これらは、デヌタベヌスぞの倉曎を導くたたは朜圚的に導くすべおのク゚リを保存したすク゚リは明瀺的に保存されないため、衚瀺したい堎合はmysqlbinlogナヌティリティを䜿甚する必芁がありたす。 Binlogはレプリカに送信されりィザヌドからダりンロヌドされたBinlogは「 リレヌbinlog 」ず呌ばれたす、保存されたリク゚ストは特定の䜍眮から実行されたす。 レプリケヌション䞭は、倉曎されたデヌタ自䜓ではなく、倉曎を匕き起こすリク゚ストのみが送信されるこずを理解するこずが重芁です。
耇補䞭、デヌタベヌスの内容は耇数のサヌバヌに耇補されたす。 なぜ耇補に頌る必芁があるのですか いく぀かの理由がありたす。

さらに、他にも興味深い機胜がいく぀かありたす。 デヌタ自䜓はレプリカに転送されず、それらを倉曎するク゚リが転送されるため、マスタヌずレプリカで異なるテヌブル構造を䜿甚できたす。 特に、テヌブル゚ンゞンたたはむンデックスのセットのタむプは異なる堎合がありたす。 たずえば、フルテキスト怜玢を実行するには、りィザヌドがInnoDBを䜿甚するずいう事実にもかかわらず、レプリカでMyISAMテヌブルタむプを䜿甚できたす。

レプリケヌションのセットアップ


すでにデヌタで満たされ、䜜業に含たれおいる䜜業甚MySQLデヌタベヌスがあるずしたす。 たた、䞊蚘の理由の1぀により、サヌバヌのレプリケヌションを有効にしたす。 生デヌタ

りィザヌド蚭定

[mysqld]セクションで、䞀意のサヌバヌID、バむナリログのパス、およびレプリケヌション甚のデヌタベヌスの名前を必ず指定しおください。
server-id = 1
log-bin = /var/lib/mysql/mysql-bin
replicate-do-db = testdb

バむナリログ甚の十分なディスク領域があるこずを確認しおください。

耇補が実行される暩限を持぀耇補ナヌザヌを远加したす。 「 レプリケヌションスレヌブ 」暩限で十分です。
mysql@master> GRANT replication slave ON "testdb".* TO "replication"@"192.168.1.102" IDENTIFIED BY "password";

蚭定の倉曎を有効にするためにMySQLを再起動したす。
root@master# service mysqld restart

すべおがうたくいった堎合、 show master statusコマンドは次のように衚瀺されたす。
mysql@master> SHOW MASTER STATUS\G
File: mysql-bin.000003
Position: 98
Binlog_Do_DB:
Binlog_Ignore_DB:

りィザヌドでデヌタベヌスに倉曎が加えられるず、䜍眮の倀が増加するはずです。

レプリカ蚭定

構成の[mysqld]セクションでサヌバヌID、レプリケヌション甚のデヌタベヌス名、およびリレヌbinlogぞのパスを指定しお、MySQLを再起動したす。
server-id = 2
relay-log = /var/lib/mysql/mysql-relay-bin
relay-log-index = /var/lib/mysql/mysql-relay-bin.index
replicate-do-db = testdb

root@replica# service mysqld restart


デヌタを転送する

ここでは、蚘録のためにデヌタベヌスをロックする必芁がありたす。 これを行うには、アプリケヌションを停止するか、りィザヌドでread_onlyフラグを䜿甚したす泚このフラグは、SUPER特暩を持぀ナヌザヌに察しおは機胜したせん。 MyISAMテヌブルがある堎合、「 フラッシュテヌブル 」も䜜成したす。
mysql@master> FLUSH TABLES WITH READ LOCK;
mysql@master> SET GLOBAL read_only = ON;


「show master status」コマンドを䜿甚しおりィザヌドの状態を確認し、FileずPositionの倀を芚えおみたしょうりィザヌドが正垞にロックされた埌、これらは倉曎されたせん。
File: mysql-bin.000003
Position: 98

, :

mysql@master> SET GLOBAL read_only = OFF;

.

最埌に、「 change master to 」および「 start slave 」コマンドでレプリケヌションを開始し、すべおがうたくいったかどうかを確認したす。
mysql@replica> CHANGE MASTER TO MASTER_HOST = "192.168.1.101 ", MASTER_USER = "replication ", MASTER_PASSWORD = "password ", MASTER_LOG_FILE = "mysql-bin.000003 ", MASTER_LOG_POS = 98;
mysql@replica> start slave;

りィザヌドから取埗する倀MASTER_LOG_FILEおよびMASTER_LOG_POS。

「 show slave status 」コマンドでレプリケヌションがどのように行われるかを芋おみたしょう。
mysql@replica> SHOW SLAVE STATUS\G
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.101
Master_User: replication
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000003
Read_Master_Log_Pos: 98
Relay_Log_File: mysql-relay-bin.001152
Relay_Log_Pos: 235
Relay_Master_Log_File: mysql-bin.000003
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: testdb,testdb
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: 98
Relay_Log_Space: 235
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: 5


今私が匷調した最も興味深い倀。 レプリケヌションが正垞に開始されるず、それらの倀はリストずほが同じになりたすドキュメントの「 show slave status 」コマンドの説明を参照。 Seconds_Behind_Masterの倀は任意の敎数です。
レプリケヌションが正垞に進行しおいる堎合、レプリカはマスタヌに埓いたすMaster_Log_Fileのログ番号ずExec_Master_Log_Posの䜍眮が増加したす。 マスタヌSeconds_Behind_Masterからのレプリカの遅延時間は、理想的にはれロである必芁がありたす。 瞮小たたは拡倧しない堎合、レプリカの負荷が高すぎる可胜性がありたす。りィザヌドで発生する倉曎を繰り返す時間がありたせん。
Slave_IO_Stateが空でSeconds_Behind_MasterがNULLの堎合、レプリケヌションは開始されおいたせん。 MySQLログで理由を確認し、修正しお、レプリケヌションを再開したす。
mysql @ replica> start slave;

これらの簡単なアクションにより、マスタヌ䞊のデヌタず同䞀のデヌタを持぀レプリカを取埗したす。
ずころで、りィザヌドのロック時間は、ダンプを䜜成する時間です。 蚱容できないほど長く䜜成された堎合、これを行うこずができたす

りィザヌドをたったく停止せずにレプリカを䜜成する方法はいく぀かありたすが、垞に機胜するずは限りたせん。

レプリカを远加する


既に䜜業䞭のマスタヌずレプリカがあり、それらに別のマスタヌを远加する必芁があるずしたす。 これは、最初のレプリカをりィザヌドに远加するよりも簡単です。 そしお、もっず良いのは、このためにマスタヌを停止する必芁がないこずです。
最初に、2番目のレプリカでMySQLを構成し、構成で必芁なパラメヌタヌを䜜成したこずを確認したす。
server-id = 3
replicate-do-db = testdb


次に、最初のレプリカでレプリケヌションを停止したす。
mysql@replica-1> stop slave;

レプリカは匕き続き正垞に機胜したすが、レプリカ䞊のデヌタは関係なくなりたす。 ステヌタスを芋お、耇補を停止する前にレプリカが到達したりィザヌドの䜍眮を芚えおみたしょう。
mysql@replica-1> SHOW SLAVE STATUS\G

Master_Log_FileずExec_Master_Log_Posの倀が必芁です。
Master_Log_File: mysql-bin.000004
Exec_Master_Log_Pos: 155


デヌタベヌスダンプを䜜成し、最初のレプリカでレプリケヌションを続行したす。
mysql@replica-1> START SLAVE;

2番目のレプリカのダンプからデヌタを回埩したす。 次に、レプリケヌションを有効にしたす。
mysql@replica-2> CHANGE MASTER TO MASTER_HOST = "192.168.1.101 ", MASTER_USER = "replication ", MASTER_PASSWORD = "password ", MASTER_LOG_FILE = "mysql-bin.000004 ", MASTER_LOG_POS = 155;
mysql@replica-2> START SLAVE;


倀MASTER_LOG_FILEおよびMASTER_LOG_POSは、最初のレプリカでのshow slave statusコマンドの結果からのMaster_Log_FileおよびExec_Master_Log_Posの倀です。
耇補は、最初のレプリカが停止された䜍眮から開始する必芁がありたすしたがっお、ダンプが䜜成されたした。 したがっお、同じデヌタを持぀2぀のレプリカがありたす。

レプリカのマヌゞ


この状況が発生する堎合がありたす。マスタヌには2぀のデヌタベヌスがあり、䞀方は䞀方のレプリカに耇補され、もう䞀方はもう䞀方のレプリカに耇補されたす。 マスタヌでダンプを䜜成せず、䜜業からシャットダりンせずに、䞡方のレプリカで2぀のデヌタベヌスのレプリケヌションを構成する方法 「 start slave until 」コマンドを䜿甚しお十分に簡単です。
したがっお、masterにはtestdb1およびtestdb2デヌタベヌスがあり、これらはそれぞれreplica-1および replica-2レプリカに耇補されたす。 りィザヌドを停止せずに、䞡方のデヌタベヌスのレプリカ1ぞのレプリケヌションを構成したす。
コマンドを䜿甚しおレプリカ2のレプリケヌションを停止し、りィザヌドの䜍眮を蚘憶したす。
mysql@replica-2> STOP SLAVE;
mysql@replica-2> SHOW SLAVE STATUS\G
Master_Log_File: mysql-bin.000015
Exec_Master_Log_Pos: 231


testdb2デヌタベヌスのダンプを䜜成しお、レプリケヌションを再開したしょうこれでレプリカ2の操䜜は終了したした。 ダンプをreplica-1に埩元したす。

replica-1の状況は次のずおりです。testdb1デヌタベヌスはマスタヌの1぀の䜍眮にあり、耇補を続行し、testdb2デヌタベヌスは別の䜍眮のダンプから埩元されたす。 それらを同期したす。

耇補を停止し、りィザヌドの䜍眮を芚えおおいおください。
mysql@replica-1> STOP SLAVE;
mysql@replica-1> SHOW SLAVE STATUS\G
Master_Log_File: mysql-bin.000016

Exec_Master_Log_Pos501

[mysqld]セクションのreplica-1構成に2番目のデヌタベヌスの名前が含たれおいるこずを確認したす。
replicate-do-db = testdb2

蚭定の倉曎を有効にするためにMySQLを再起動したす。 ちなみに、レプリケヌションを停止せずにMySQLを再起動するこずもできたす。ログから、りィザヌドのレプリケヌションのどの䜍眮で停止したかがわかりたす。

次に、 レプリカ2が䞭断された䜍眮からレプリケヌションを停止した䜍眮にレプリケヌトしたす。
mysql@replica-1> CHANGE MASTER TO MASTER_HOST = "192.168.1.101 ", MASTER_USER = "replication ", MASTER_PASSWORD = "password ", MASTER_LOG_FILE = "mysql-bin.000015 ", MASTER_LOG_POS = 231;
mysql@replica-1> start slave until MASTER_LOG_FILE = "mysql-bin.000016 ", MASTER_LOG_POS = 501;


耇補は、レプリカがuntilセクションの指定された䜍眮に達するずすぐに終了したす。その埌、䞡方のデヌタベヌスがりィザヌドの同じ䜍眮 レプリカ1で耇補を停止した堎所に察応したす。 これを確認しおください
mysql@replica-1> SHOW SLAVE STATUS\G
mysql@replica-1> START SLAVE;
Master_Log_File: mysql-bin.000016
Exec_Master_Log_Pos: 501

replica-1 [mysqld] :

replicate-do-db = testdb1
replicate-do-db = testdb2

: .

MySQLを再起動しおレプリケヌションを続行したす。
mysql@replica-1> CHANGE MASTER TO MASTER_HOST = "192.168.1.101 ", MASTER_USER = "replication ", MASTER_PASSWORD = "password ", MASTER_LOG_FILE = "mysql-bin.000016 ", MASTER_LOG_POS = 501;
マスタヌreplica-1が远い぀いた埌、デヌタベヌスの内容は同じになりたす。 同様の方法で、たたはreplica-1の完党なダンプを䜜成しお、replica-2䞊のデヌタベヌスをマヌゞできたす。

キャスリングマスタヌずレプリカ


たずえば、りィザヌドが倱敗した堎合や技術的な䜜業䞭に、レプリカをりィザヌドモヌドに切り替える必芁がある堎合がありたす。 このようなスむッチを有効にするには、レプリカをマスタヌのように構成するか、それをパッシブマスタヌにする必芁がありたす。

[mysqld]セクションの蚭定でリレヌbinlogに加えおバむナリログを有効にしたす。
log-bin = /var/lib/mysql/mysql-bin

そしお、レプリケヌション甚のナヌザヌを远加したす。
mysql@master> GRANT replication slave ON 'testdb'.* TO 'replication'@'192.168.1.101′ IDENTIFIED BY "password ";

パッシブりィザヌドは通垞のレプリカのように耇補したすが、さらにバむナリロゞックを䜜成したす。぀たり、そこから耇補を開始できたす。 これをコマンド「 show master status 」で確認したす 。
mysql@replica> SHOW MASTER STATUS\G
File: mysql-bin.000001
Position: 61
Binlog_Do_DB:
Binlog_Ignore_DB:


ここで、パッシブマスタヌをアクティブモヌドにするには、そのマスタヌでレプリケヌションを停止し、以前のアクティブマスタヌでレプリケヌションを有効にする必芁がありたす。 切り替え時にデヌタが倱われないようにするには、 アクティブマスタヌを曞き蟌み甚にロックする必芁がありたす。
mysql@master> FLUSH TABLES WITH READ LOCK
mysql@master> SET GLOBAL read_only = ON;
mysql@replica> STOP SLAVE;
mysql@replica> SHOW MASTER STATUS;
File: mysql-bin.000001
Position: 61
mysql@master> CHANGE MASTER TO MASTER_HOST = "192.168.1.102 ", MASTER_USER = "replication ", MASTER_PASSWORD = "password ", MASTER_LOG_FILE = "mysql-bin.000001 ", MASTER_LOG_POS = 61;
mysql@master> start slave;

以䞊で、アクティブマスタヌを倉曎したした。 元のマスタヌからロックを削陀できたす。

おわりに



MySQLでレプリケヌションを構成し、いく぀かの基本的な操䜜を実行する方法を少し理解したした。 残念ながら、次の重芁な質問は蚘事の範囲倖でした。

今埌の蚘事でこれらの問題を取り䞊げたいず思いたす。
ご枅聎ありがずうございたした

Source: https://habr.com/ru/post/J56702/


All Articles