mysql+mycat、負荷分散、マスタースレーブレプリケーション、読み取り/書き込み分離操作に基づく安定した高可用性クラスタを構築します。

mysql+mycat、負荷分散、マスタースレーブレプリケーション、読み取り/書き込み分離操作に基づく安定した高可用性クラスタを構築します。

データベースのパフォーマンス最適化には、一般的にクラスタリングが採用されています。Oracle クラスタ ソフトウェアとハ​​ードウェアへの投資は高価です。今日は 1 日かけて、MySQL ベースのクラスタ環境を構築しました。

主なアイデア

簡単に言うと、MySQL マスター スレーブ レプリケーションを実装し、mycat を使用して負荷分散を実現します。

一般的に使用されている読み取り/書き込み分離方法を比較した結果、アクティブなコミュニティと安定したパフォーマンスにより、mycat が推奨されます。

テスト環境

MYSQL バージョン: サーバー バージョン: 5.5.53。WINDWOS インストール パッケージは公式 Web サイトからダウンロードできます。

注意: MySQL バージョンが 5.5 以降であることを確認してください。マスター スレーブ同期の構成方法は、以前のバージョンとは異なります。

Linux の実装の考え方も同様で、my.cnf を変更するだけです。

  • マスターmysql。 192.168.110.1:3306、ユーザー root、パスワード root。オペレーティングシステム: win7 x64、メモリ: 4g
  • インストール パス: C:\Program Files\MySQL\MySQL Server 5.5\bin
  • Bはmysqlを準備します。 192.168.110.2:3306、ユーザー root、パスワード root。オペレーティングシステム: win2003 x64、メモリ: 1g
  • インストール パス: C:\Program Files\MySQL\MySQL Server 5.5\bin
  • AとBのMySQLにsync_testデータベースを作成する

MySQL マスタースレーブレプリケーションの実装

主な考え方は、A のメイン MySQL がログ記録を開始し、B のスタンバイ MySQL が操作ログを読み取り、同期的に実行することです。

一般的には、マスター スレーブ同期が使用され、マスター マスター同期は推奨されません。

マスターmysqlを構成する

1) my.ini を変更します。 log-bin="C:/Program Files/MySQL/MySQL Server 5.5/log/mysql-bin.log" の適切な場所にログ ディレクトリと mysql-bin.log ファイルを作成する必要があります。

[mysqld]
server-id=1 #ホスト識別子、整数ポート=3306  
log-bin="C:/Program Files/MySQL/MySQL Server 5.5/log/mysql-bin.log" #このファイルが書き込み可能であることを確認してください read-only=0 #ホスト、読み取りと書き込みの両方が可能です binlog-do-db=sync_test #データベースをバックアップする必要があります。複数行書き込みます binlog-ignore-db=mysql #バックアップする必要のないデータベース、複数行書き込みます

2) MYSQLリモートアクセスを許可する

#mysqlコンソールにログイン
%home%/binに入り、mysql -uroot -prootを実行します。
#承認。ルートユーザーが IP 範囲 192.168.110.* からマスター mysql にリモート アクセスできるようにします。
mysql> 'root'@'192.168.110.*' に GRANT OPTION 付きで 'root' によって識別される *.* のすべての権限を付与します。
# 有効になります。この操作は非常に重要です!
mysql> 権限をフラッシュします。

3) AマスターMySQLデータベースを再起動する

%home%/binに入り、mysql -uroot -prootを実行します。

mysql>net stop mysql;
mysql>net start mysql;

4) メインのMySQLログのステータスを確認する

mysql> マスターステータスを表示します\G;
************************** 1. 行 ****************************
      ファイル:mysql-bin.000003
    ポジション: 107
  Binlog_Do_DB: 同期テスト
Binlog_Ignore_DB: mysql
セット内の 1 行 (0.00 秒)

エラー:
クエリが指定されていません

Bスタンバイmysqlを構成する

1) my.ini を変更します。 log-bin="C:/Program Files/MySQL/MySQL Server 5.5/log/mysql-bin.log" の適切な場所にログ ディレクトリと mysql-bin.log ファイルを作成する必要があります。

[mysqld]
# 同期テスト用に追加
server-id=2 #スレーブID log-bin="C:/Program Files/MySQL/MySQL Server 5.5/log/mysql-bin.log" #このファイルが書き込み可能であることを確認してください #master-host="192.168.110.1" #ホストIP
#master-user=root #データベースアクセスユーザー名#master-pass=root #データベースアクセスパスワード#master-port=3306 #ホストポート#master-connect-retry=60 #スレーブサーバーがマスターサーバーが切断されていることを検出した場合、再接続するまでの時間差(秒単位)
replicate-do-db=sync_test #特定のデータベースのみを複製する replicate-ignore-db=mysql #特定のデータベースを複製しない

2) BスタンバイMySQLデータベースを再起動する

%home%/binに入り、mysql -uroot -prootを実行します。

mysql>net stop mysql;
mysql>net start mysql;

3) スタンバイ データベース B のデータ ソースを構成し、強調表示された領域の状態が正常かどうかを確認します。

mysql>マスターをmaster_host='192.168.110.1'、master_port='3306'、master_user='root'、master_password='root'に変更します。
mysql>スレーブを起動します。
mysql>スレーブステータスを表示\G;
************************** 1. 行 ****************************
        Slave_IO_State: マスターからのイベント送信を待機中
         マスターホスト: 192.168.110.1
         マスターユーザー: ルート
         マスターポート: 3306
        接続再試行: 60
       マスターログファイル: mysql-bin.000003
     読み取りマスターログ位置: 107
        リレーログファイル: wjt-1c698d8a032-relay-bin.00001
        リレーログ位置: 253
    リレーマスターログファイル: mysql-bin.000003
       スレーブIO実行中: はい
      スレーブSQL実行中: はい
       Replicate_Do_DB:同期テスト
     レプリケート_無視_DB: mysql
      テーブルの複製:
    無視テーブルを複製:
   Replicate_Wild_Do_Table:
 Replicate_Wild_Ignore_Table:
          最終エラー番号: 0
          最終エラー:
         スキップカウンタ: 0
     実行マスターログ位置: 107
       リレーログスペース: 565
       Until_Condition: なし
        ログファイルまで:
        ログ位置まで: 0
      マスターSSL許可: いいえ
      マスターSSLCAファイル:
      マスターSSLCAパス:
       マスターSSL証明書:
      マスターSSL暗号:
        マスターSSLキー:
    マスターより遅れている秒数: 0
Master_SSL_Verify_Server_Cert: いいえ
        最終IOエラー番号: 0
        最後のIOエラー:
        最終SQLエラー番号: 0
        最後のSQLエラー:
 Replicate_Ignore_Server_Ids:
       マスターサーバーID: 1
セット内の 1 行 (0.00 秒)
エラー:
クエリが指定されていません

同期構成の結果を確認する

  • メインのmysql: navicatを使用してsync_testライブラリにsync_tableテーブルを作成し、データを追加します
  • B バックアップmysql: navicatツールを使用してsync_testライブラリをチェックすると、sync_tableテーブルとデータが同期されていることがわかります。

読み取りと書き込みの分離を実現

主なアイデアは、mycat ミドルウェアを使用して SQL コマンドをバックエンドの MySQL ノードに転送することです。 mycat はデータベースの同期については責任を負いません。

mycatをインストールする

mycatとは何ですか?これはデータベース アクセス ミドルウェアと考えることもできますが、アクセス ルーティング、マルチテーブル シャーディング操作などの機能を備えており、f5 や ngnix などの製品に似ています。とにかく非常に強力です。

  • ダウンロード: http://www.mycat.io/、この記事では 1.6-RELEASE を使用しています
  • Mycat-server-1.6-RELEASE-20161012170031-win.tar を D:\dev-bin\mycat ディレクトリに解凍します。
  • Java環境がjdk1.7以上であることを確認してください。そうでない場合、mycatはサポートされません。

インストール完了

mycat を設定する

1) server.xml。アクセスユーザーと権限を構成します。強調表示された情報を変更します。ここで、admin と user は mycat にアクセスするユーザーであり、TESTDB は上位レベルのアプリケーションがアクセスするための mycat の仮想データベースです。

<ユーザー名="admin">
    <property name="password">管理者</property>
    <property name="schemas">TESTDB</property>
    <!-- テーブルレベルの DML 権限設定 -->
    <!--     
    <権限チェック="false">
      <スキーマ名="TESTDB" dml="0110" >
        <テーブル名="tb01" dml="0000"></テーブル>
        <テーブル名="tb02" dml="1111"></テーブル>
      </スキーマ>
    </権限>    
     -->
  </ユーザー>
  <ユーザー名="ユーザー">
    <property name="password">ユーザー</property>
    <property name="schemas">TESTDB</property>
    <プロパティ名="readOnly">true</プロパティ>
  </ユーザー>

2) schema.xml。この部分は理解しにくいので、簡略化して、スキーマ、データノード、データホストの 3 つの主要な構成に分割しました。

<scheme> ノードは、mycat の仮想データベースを TESTDB、balance="1" として定義します。書き込み操作はマシン A にルーティングされ、読み取り操作はマシン B にルーティングされます。

<?xml バージョン="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:スキーマ xmlns:mycat="http://io.mycat/">
  <スキーマ名="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
    <!-- ここでは構成がありません。つまり、すべてのテーブルが dn1 ノードに分割されます -->
  </スキーマ>
  <dataNode 名="dn1" データホスト="localhost1" データベース="sync_test" />
  <dataHost name="localhost1" maxCon="1000" minCon="10" バランス="1"
       writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
    <heartbeat>ユーザーを選択()</heartbeat>
    <!-- 複数の書き込みホストを持つことができます -->
    <writeHost ホスト="hostM1" url="192.168.110.1:3306" ユーザー="root" パスワード="root">
      <!-- 複数の読み取りホストを持つことができます -->
      <readHost ホスト="hostS2" url="192.168.110.2:3306" ユーザー="root" パスワード="root" />
    </writeHost>
  </データホスト>
</mycat:スキーマ>

mycatを起動する

1) mycatを起動する

D:\dev-bin\mycat\bin>startup_nowrap.bat

背景情報は次のとおりです。

D:\dev-bin\mycat\bin>startup_nowrap.bat
D:\dev-bin\mycat\bin>REM JAVA_HOMEとjavaをチェック
D:\dev-bin\mycat\bin>「JAVA_CMD=C:\Program Files (x86)\Java\jdk1.7.0_13/bin/java」を設定します
D:\dev-bin\mycat\bin>if "C:\Program Files (x86)\Java\jdk1.7.0_13" == "" noJavaHome に移動します
D:\dev-bin\mycat\bin>「C:\Program Files (x86)\Java\jdk1.7.0_13\bin\java.exe」が存在する場合は、mainEntry に移動します。
D:\dev-bin\mycat\bin>REM HOME_DIR を設定
D:\dev-bin\mycat\bin>「CURR_DIR=D:\dev-bin\mycat\bin」を設定します
D:\dev-bin\mycat\bin>cd ..
D:\dev-bin\mycat>「MYCAT_HOME=D:\dev-bin\mycat」を設定します
D:\dev-bin\mycat>cd D:\dev-bin\mycat\bin
#起動に失敗した場合は、D:\dev-bin\mycat\bin\startup_nowrap.bat ファイルで次のパラメータを変更してください。デフォルトのメモリ使用量は2Gです
D:\dev-bin\mycat\bin>"C:\Program Files (x86)\Java\jdk1.7.0_13/bin/java" -server -Xms512m -Xmx512m -XX:MaxPermSize=64M -XX:+AggressiveOpts -XX:MaxDirectMemorySize=768m -DMYCAT_HOME=D:\
p "..\conf;..\lib\*" io.mycat.MycatStartup

MyCAT サーバーの起動に成功しました。logs/mycat.log のログを参照してください。# 起動に成功すると、次の情報が表示されます。

注意: ログに「192.168.110.2 が接続されていません」などの情報が含まれている場合は、MySQL サーバー B へのリモート アクセスを許可してください。

#mysqlコンソールにログイン
%home%/binに入り、mysql -uroot -prootを実行します。
#承認。ルートユーザーが IP 範囲 192.168.110.* から Bmysql にリモートアクセスできるようにします。
mysql> 'root'@'192.168.110.*' に GRANT OPTION 付きで 'root' によって識別される *.* のすべての権限を付与します。
# 有効にしてください。この操作は非常に重要です。
mysql> 権限をフラッシュします。

読み取りと書き込みの分離をテストする

同期を確認する

  • navicatを使用してmycatに接続します。操作方法は物理的なmysqlデータベースに接続する場合と同じです。ユーザーadmin、パスワードadmin、ポート8066
  • TESTDB仮想ライブラリで、新しいテーブルtest2を作成し、データを追加します。
  • ノードAとノードBのデータが同期されていることを確認する

BスタンバイMySQLの同期を終了し、読み取り/書き込み分離を確認します。

mysql> スレーブを停止します。
クエリは正常、影響を受けた行は 0 行 (0.00 秒)
mysql> スレーブステータスを表示します\G;
************************** 1. 行 ****************************
        スレーブ_IO_状態:
         マスターホスト: 192.168.110.1
         マスターユーザー: ルート
         マスターポート: 3306
        接続再試行: 60
       マスターログファイル: mysql-bin.000003
     読み取りマスターログ位置: 478
        リレーログファイル: wjt-1c698d8a032-relay-bin.00001
        リレーログ位置: 624
    リレーマスターログファイル: mysql-bin.000003
       スレーブIO実行中: いいえ
      スレーブSQL実行中: いいえ
       Replicate_Do_DB:同期テスト
     レプリケート_無視_DB: mysql
      テーブルの複製:
    無視テーブルを複製:
   Replicate_Wild_Do_Table:
 Replicate_Wild_Ignore_Table:
          最終エラー番号: 0
          最終エラー:
         スキップカウンタ: 0
     実行マスターログポジション: 478
       リレーログスペース: 936
       Until_Condition: なし
        ログファイルまで:
        ログ位置まで: 0
      マスターSSL許可: いいえ
      マスターSSLCAファイル:
      マスターSSLCAパス:
       マスターSSL証明書:
      マスターSSL暗号:
        マスターSSLキー:
    マスターより遅れている秒数: NULL
Master_SSL_Verify_Server_Cert: いいえ
        最終IOエラー番号: 0
        最後のIOエラー:
        最終SQLエラー番号: 0
        最後のSQLエラー:
 Replicate_Ignore_Server_Ids:
       マスターサーバーID: 1
セット内の 1 行 (0.00 秒)
エラー:
クエリが指定されていません

3) navicatを使用してmycatに接続します。操作方法は、物理的なmysqlデータベースに接続する場合と同じです。ユーザーadmin、パスワードadmin、ポート8066

  • 接続が成功すると、TESTDBデータベースとテストデータテーブルが表示されます。
  • テスト テーブルにデータを追加して保存します。
  • select * from test を実行してテスト操作を表示すると、データが更新されていないことがわかります。

原因: mycat はクエリ sq を B にルーティングするため、読み取り結果セットに矛盾が生じます。

最後に、mycat の使用については、公式 Web サイトの信頼できるガイドを参照してください。デュアルアクティブ デュアルスタンバイ アーキテクチャは後で更新されます。

要約する

以上が、mysql+mycat をベースにした、安定した高可用性のクラスター負荷分散、プライマリとセカンダリのレプリケーション、読み取り/書き込み分離操作の構築についてご紹介したものです。お役に立てれば幸いです。ご質問がございましたら、メッセージを残していただければ、すぐに返信いたします。また、123WORDPRESS.COM ウェブサイトをサポートしてくださっている皆様にも感謝申し上げます。

以下もご興味があるかもしれません:
  • MySQL 高可用性クラスタの展開とフェイルオーバーの実装
  • MySQL MHA の高可用性構成とフェイルオーバーの詳細な導入手順
  • MySQLデータベースはMMM高可用性クラスタアーキテクチャを実装します
  • Oracle と MySQL の高可用性ソリューションの比較分析
  • MySQL 高可用性ソリューション MMM (MySQL マルチマスター レプリケーション マネージャー)
  • MySQL シリーズ 14 MySQL 高可用性実装

<<:  nginx でディレクトリ ホワイトリストと IP ホワイトリストを設定する方法

>>:  JS でシンプルな画像カルーセル効果を実現

推薦する

Amoeba を使用して MySQL データベースの読み取り/書き込み分離を実装する方法の詳細な説明

MySQL には読み取りと書き込みを分離するアーキテクチャが多数あります。Baidu のそれらのほと...

Docker プライベート サーバー イメージを定期的にクリーンアップする方法

CI を利用してリリース用の Docker イメージをビルドすることで、全員のバージョンリリース効率...

VueコンポーネントライブラリElementUIはテーブルリストのページング効果を実現します

ElementUIはテーブルリストのページング効果のチュートリアルを実装しています。参考までに。具体...

Windows 64 ビット版 MySQL 5.7 以降の解凍パッケージにデータディレクトリと my-default.ini がなく、サービスが起動できない問題の簡単な解決方法 (問題概要)

私は SQL の初心者で、オープンソースのインストールは非常に簡単だと思っていましたが、その過程でい...

Docker+K8S+GitLab/SVN+Jenkins+Harbor をベースにした継続的インテグレーション配信環境の構築に関する詳細なチュートリアル

目次環境設定の概要1.K8Sとは何ですか? 2. K8S を使用する理由3. K8S を使用する利点...

Vue3 コンポジション API でロジックの再利用を実装する方法

Composition API はロジック再利用手順を実装します。ロジックコードを関数に抽出します。...

理論: 2年間のユーザーエクスペリエンス

<br />国内のウェブサイトが本格的に普及し、ユーザーエクスペリエンスに重点が置かれる...

MySQL の最適化: 高品質の SQL 文を書く方法

序文インターネット上にはデータベースの最適化に関する情報や方法が数多くありますが、その多くは品質にば...

ウェブデザインの発展と西洋建築の類似点は何でしょうか?

歴史は常に驚くほどうまく繰り返される。西洋建築とウェブデザインは、どちらも工学と芸術の組み合わせです...

Vue プロジェクトで垂直テーブルを 2 つの方法で実装するアイデアの分析

問題の説明私たちのプロジェクトでは、水平方向のテーブルが一般的ですが、必要に応じて垂直方向のテーブル...

proxy_pass を設定した後に Nginx が 404 を返す問題を解決する

目次1. proxy_pass を設定した後に Nginx が 404 を返す問題のトラブルシューテ...

中国語フォントの英語名まとめ

CSS の font-family プロパティを使用して中国語フォントを参照する場合、フォントを定義...

JavaScript で Priority Queue を実装する

目次1. 優先キューの紹介2. 優先キューのカプセル化1. 優先キューの紹介通常のキューに要素が挿入...

フロートをクリアするための CSS メソッドの概要

フロートはWebページのレイアウトでよく使用されますが、フローティングブロックレベル要素は標準のドキ...