Ubuntu 16.04 で MySQL マスター スレーブ同期を設定する方法

Ubuntu 16.04 で MySQL マスター スレーブ同期を設定する方法

準備

1. マスターとスレーブのデータベースのバージョンは一致している必要があります

2. マスターデータベースとスレーブデータベースのデータは一貫性が保たれます

プライマリ データベース: 121.199.27.227 /ubuntu 16.04 MySQL 5.7.21 (Alibaba Cloud)

データベースから: 182.254.149.39 /ubuntu 16.04 MySQL 5.7.21 (Tencent Cloud)

ファイアウォールの設定

不要な攻撃を回避するために、特定の IP アドレスのみがデータベース ポートにアクセスできるようにマスター サーバーを構成します。

メインデータベースファイアウォール構成

# iptables -A 入力 -p tcp -s スレーブIP --dport 3306 -j 受け入れる
#重複レコードを回避するために既存の設定を削除します $ sudo iptables -D INPUT -p tcp -s 182.254.149.39 --dport 3306 -j ACCEPT 
$ sudo iptables -D 入力 -p tcp -s 127.0.0.1 --dport 3306 -j 受け入れる 
$ sudo iptables -D 入力 -p tcp --dport 3306 -j ドロップ 
$ sudo iptables -D 入力 -p udp --dport 3306 -j ドロップ 
$ sudo iptables -D 入力 -p sctp --dport 3306 -j ドロップ
#特定のアドレスのみがデータベースポートにアクセスできるように設定を追加します $ sudo iptables -A INPUT -p tcp -s 182.254.149.39 --dport 3306 -j ACCEPT
$ sudo iptables -A 入力 -p tcp -s 127.0.0.1 --dport 3306 -j 受け入れる
$ sudo iptables -A 入力 -p tcp --dport 3306 -j ドロップ
$ sudo iptables -A 入力 -p udp --dport 3306 -j ドロップ
$ sudo iptables -A 入力 -p sctp --dport 3306 -j ドロップ
$ sudo iptables -L -n
#設定を保存する $ sudo apt-get install iptables-persistent
$ sudo netfilter-persistent 保存
#設定は次の 2 つのファイルに保存されます: /etc/iptables/rules.v4 /etc/iptables/rules.v6。
#特に、denyhosts などの他のセキュリティ ソフトウェアがインストールされている場合は、実際に保存された内容を確認することをお勧めします。
#冗長なルールが記録される可能性があり、ライブラリのファイアウォール構成から手動で削除する必要があります# iptables -A OUTPUT -p tcp -d master_ip --dport 3306 -j ACCEPT
#重複レコードを避けるために既存の設定を削除します$ sudo iptables -D OUTPUT -p tcp -d 121.199.27.227 --dport 3306 -j ACCEPT
#設定を追加$ sudo iptables -A OUTPUT -p tcp -d 121.199.27.227 --dport 3306 -j ACCEPT
$ sudo iptables -L -n
#設定を保存 $ sudo apt-get install iptables-persistent
$ sudo netfilter-persistent 保存
#設定は次の 2 つのファイルに保存されます: /etc/iptables/rules.v4 /etc/iptables/rules.v6。
#特に、denyhosts などの他のセキュリティ ソフトウェアがインストールされている場合は、実際に保存された内容を確認することをお勧めします。
#冗長なルールが記録される可能性があり、手動で削除する必要があります

マスターデータベースマスター構成

1. MySQLの設定を変更する

$ sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf

[mysqld] セクションを次のように変更します。

[mysqld]
log-bin = /var/log/mysql/mysql-bin.log #バイナリログを開きます。デフォルトではコメントアウトされています。コメントを削除します。server-id = 1 #サーバーIDを設定します
bind-address = 0.0.0.0 #デフォルトは 127.0.0.1 です。ここでは、リモート アクセスを許可するために任意のアドレスに設定します。これを行う前に、ファイアウォールが正しく設定されていることを確認してください。正しく設定されていない場合、セキュリティ上のリスクが生じます。

2. MySQLを再起動し、同期用のユーザーアカウントを作成します。

ユーザーを作成して認証します: ユーザー: repl パスワード: slavepass

$ sudo サービス mysql を再起動します
$ mysql -u root -p -e "CREATE USER 'repl'@'182.254.149.39' IDENTIFIED BY 'slavepass';" #ユーザーの作成$ mysql -u root -p -e "GRANT REPLICATION SLAVE ON *.* TO 'repl'@'182.254.149.39';" #権限の割り当て$ mysql -u root -p -e "flush privileges;" #権限の更新

3. マスターのステータスを確認し、バイナリ ファイル名 (mysql-bin.000001) と場所 (333802) を記録します。

$ mysql -u root -p -e "マスターステータスを表示;"
パスワードを入力してください: 
+------------------+----------+--------------+------------------+------------------+
| ファイル | 位置 | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+------------------+
| mysql-bin.000001 | 333802 | | | |
+------------------+----------+--------------+------------------+------------------+

4. スレーブデータベースの最初のデータ同期のためにマスターデータベースをバックアップしてデータを準備します。

次のスクリプトを使用してデータベースのバックアップファイルを生成します

#ここではWordPressデータベースのバックアップを例に挙げます。datadump=`which mysqldump`
mysqluser="root"
userpass="パスワード" 
wordpressdb="wordpress"
バックアップwordpress_sql=$wordpressdb.`date +%Y%m%d`.sql
$datadump -u $mysqluser --password=$userpass -h localhost --opt $wordpressdb > $backupwordpress_sql 2>&1 の場合
それから
  echo " $wordpressdb のバックアップが成功しました"
それ以外
  echo " $wordpressdb のバックアップ エラー"
  出口1
フィ
#ファイルの末尾に「-- Dump complete on」があるかどうかを確認します。存在しない場合は、バックアップが失敗したことを意味します。
if [ 0 -eq "$(sed '/^$/!h;$!d;g' $backupwordpress_sql | grep -c "ダンプが完了しました")" ]; 
それから
 echo " $wordpressdb のバックアップ エラー"
 出口1 
それ以外
 echo " $wordpressdb のバックアップが成功しました"
フィ

スクリプトを実行して、最終出力バックアップが成功したことを確認します。

$ cd ~
$ sudo bash バックアップ_wordpress.sh

スレーブサーバーの構成

1. MySQLの設定を変更する

$ sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf

サーバー ID を変更します。各データベースのサーバー ID は一意である必要があり、互いに競合してはなりません。

[mysqld]
server-id = 2 #server-idを設定します。一意である必要があります。log_bin = /var/log/mysql/mysql-bin.log #ログを開くのも最適です。

2. データベースを初めて復元します。

$ sudo サービス mysql を再起動します
$ scp -P 22 -r [email protected]:~/wordpress.*.sql ./
#データの回復を妨げる可能性のある警告行を削除します。$ sed -i "/^mysqldump: \[警告\] コマンドライン インターフェイスでパスワードを使用すると安全でない可能性があります\./d" wordpress.*.sql
$ mysql -u root -p -e "データベース wordpress を削除します。"
$ mysql -u root -p -e "データベース wordpress を作成します。"
$ mysql -u root -p wordpress < wordpress.*.sql

3. MySQL を再起動し、MySQL セッションを開いて、同期 SQL ステートメントを実行します (プライマリ サーバーのホスト名、ログイン資格情報、バイナリ ファイルの名前と場所が必要です)。

$ mysql -u root -p -e "MASTER を MASTER_HOST='121.199.27.227'、MASTER_USER='repl'、MASTER_PASSWORD='slavepass'、MASTER_LOG_FILE='mysql-bin.000001'、MASTER_LOG_POS=333802 に変更します。"

4. スレーブ同期プロセスを開始します。

$ mysql -u root -p -e "スレーブを起動します。"

5. スレーブのステータスを確認します。

$ mysql -u root -p -e "スレーブステータスを表示\G;"
パスワードを入力してください:
************************** 1. 行 ****************************
        Slave_IO_State: マスターがイベントを送信するのを待機中
         マスターホスト: 121.199.27.227
         マスターユーザー: repl
         マスターポート: 3306
        接続再試行: 60
       マスターログファイル:mysql-bin.000001
     読み取りマスターログ位置: 9448236
        リレー ログ ファイル: VM-114-251-ubuntu-relay-bin.000002
        リレーログ位置: 17780
    リレーマスターログファイル: mysql-bin.000001
       スレーブIO実行中: はい
      スレーブSQL実行中: いいえ
       レプリケート_Do_DB:
     レプリケート_無視_DB:
      テーブルの複製:
    無視テーブルを複製:
   Replicate_Wild_Do_Table:
 Replicate_Wild_Ignore_Table:
    ...

Slave_IO_Running と Slave_SQL_Running の両方が YES の場合、マスターとスレーブの同期設定が成功したことを意味します。次に、いくつかの検証を行うことができます。たとえば、マスター データベースのテスト データベースのテーブルにデータを挿入し、スレーブのテスト データベースの同じデータ テーブルに新しいデータがあるかどうかを確認して、マスター スレーブ レプリケーション機能が有効かどうかを検証します。また、スレーブをシャットダウン (mysql>stop slave;) してから、マスターを変更して、スレーブもそれに応じて変更されるかどうかを確認することもできます (スレーブを停止すると、マスターの変更はスレーブに同期されません)。これにより、マスター スレーブ レプリケーション機能が検証されます。

使用できるその他の関連パラメータ:

マスターがバイナリ ログを開くと、すべてのライブラリのすべてのテーブルに対する操作がデフォルトで記録されます。指定したデータベースまたは指定したテーブルに対する操作のみを記録するように設定できます。具体的には、MySQL 構成ファイルの [mysqld] セクションで次のオプションを追加および変更できます。

# どのデータベースが同期されていないか? binlog-ignore-db = mysql 
binlog-ignore-db = テスト 
binlog-ignore-db = 情報スキーマ 
# 特定のデータベースのみを同期し、それ以外のデータベースは同期しません。binlog-do-db = game

たとえば、以前にマスターステータスを確認すると、manual ライブラリと mysql ライブラリは無視され、test ライブラリのみが記録されていることがわかります。

要約する

上記は、編集者が紹介したUbuntu 16.04でのMySQLマスタースレーブ同期の設定方法です。皆様のお役に立てれば幸いです。ご質問がございましたら、メッセージを残してください。編集者がすぐに返信いたします。また、123WORDPRESS.COM ウェブサイトをサポートしてくださっている皆様にも感謝申し上げます。

以下もご興味があるかもしれません:
  • Ubuntu システムにおける Mysql ERROR 1045 (28000): ユーザー root@localhost へのアクセスが拒否される問題の解決方法
  • UbuntuでMySQLのルートパスワードを忘れた場合の解決策
  • Ubuntu での MySQL および MySQL Workbench のインストール チュートリアル
  • Ubuntu 16.04 に MySQL 5.7.17 をインストールした後、ログイン時に発生するエラー 1045 (28000): ユーザー ''root''@''localhost'' へのアクセスが拒否される問題を解決します。
  • Ubuntuにmysql5.7.10を手動でインストールする
  • Linux (Ubuntu) での MySQL 5.7.17 のインストールと設定のチュートリアル
  • Ubuntu 16.04 サーバーで MySQL を設定し、リモート接続を有効にする方法
  • Ubuntu Server で MySQL データベースを起動/停止/再起動する 3 つの方法の詳細な説明

<<:  jQueryのanimateアニメーションメソッドとアニメーションキューイング問題の解決方法の詳しい説明

>>:  Linux での Docker と portainer の設定方法

推薦する

jQueryはフォーム検証を実装する

jQueryを使用してフォーム検証を実装します。参考までに、具体的な内容は次のとおりです。登録.ht...

CSS で平均レイアウトを実現するためにネガティブ マージン テクノロジーを使用する方法

通常、IE ブラウザでの CSS の互換性の問題を解決するために、フロート レイアウトが使用されます...

SEATAトランザクションサービスDockerのデプロイ手順の詳細説明

1. データベース認証ステートメントを作成する > データベース seata を作成します。 ...

MySQLデータベースは何をするのか

MySQL は、スウェーデンの会社 MySQL AB によって開発されたリレーショナル データベース...

MySQL データ挿入最適化メソッドconcurrent_insert

スレッドがテーブルに対して DELAYED ステートメントを実行するときに、そのようなハンドラーが存...

HTML で選択ドロップダウン ボックスのコンテンツが不完全に表示され、部分的にカバーされる問題の解決策

今日、問題が発生しました。クエリ バーのドロップダウン ボックスの内容が長すぎて、一部が隠れてしまっ...

JavaScript フレームワーク デザイン パターンの詳細な説明

目次動画最優秀選手ムヴヴムVueのソーススパ mpa要素を作成するクラス要約する動画 Model(模...

MySQL のグループ分けの例

mysql のような php switch case ステートメント。 xxフィールドを選択、ケース...

訪問者を惹きつけるウェブサイトコンテンツを作成する14の方法

ネットサーフィンをしていると、私の注意を引こうとする美しいグラフィックでいっぱいの Web サイトを...

LinuxはNetworkManagerを使用してMACアドレスをランダムに生成します

今では、自宅のソファーに座っていても、外の喫茶店にいても、ノートパソコンの電源を入れてWi-Fiに接...

MySQLのスローログの開き方と保存形式の詳細な分析

開発プロジェクトでは、MySQL のスロークエリログを通じて効率の問題のある SQL を監視できます...

シンプルなウェブ計算機を実装するJavaScript

背景私は新しいプロジェクト チームに配属されたので、プロジェクトでは js を使用する必要があります...

CSSを使用してファイルアップロードパターンを描画する

以下に示すように、あなたならどのようにそれを達成しますか: 通常、フォントアイコンを使用して中央にプ...

Vue で Excel インポート機能を実装する詳細な手順

1. フロントエンド主導の実装手順最初のステップは、ページのインポートボタンをクリックしてExcel...

nginx を使用してカナリアリリースをシミュレートする方法

この記事では、ブルーグリーン デプロイメントと、nginx を使用してカナリア リリースを最も簡単な...