OneProxy に基づいて MySQL の読み取り/書き込み分離と負荷分散を実装する

OneProxy に基づいて MySQL の読み取り/書き込み分離と負荷分散を実装する

導入

パート1: 冒頭に書いた

OneProxy は、民間ソフトウェアによって完全に独立して開発された分散データ アクセス レイヤーです。MySQL/PostgreSQL クラスターでのシャーディングをサポートする分散データベース ミドルウェアをユーザーが迅速に構築するのに役立ちます。また、SQL ホワイトリスト (アンチ SQL インジェクション) と IP ホワイトリスト機能を備えた SQL ファイアウォール ソフトウェアでもあります。これは、MySQL Proxy と一致するリバース プロトコル出力モードを使用します。これは非常にシンプルで透過的であり、アプリケーションにとって使いやすく、ユーザーが恐れるデータベース フェイルオーバー、読み取り/書き込み分割、水平パーティショニングなどの複雑なソリューションを非常にシンプルで制御可能なものにします。 Libevent メカニズムに基づき、単一インスタンスで 250,000 の SQL 転送機能を実現できます。1 つの OneProxy ノードで MySQL クラスター全体を駆動し、ビジネス開発に貢献できます。

パート2: 環境の紹介

HE1:192.168.1.248 スレーブ1

HE2:192.168.1.249 スレーブ2

HE3:192.168.1.250 マスター

HE4:192.168.1.251 ワンプロキシ

環境構築

パート1: Oneproxyをインストールする

[root@HE4 ~]# tar xvf oneproxy-rhel5-linux64-v5.8.5-ga.tar.gz
[root@HE4 oneproxy]# ls
bin conf demo.sh log oneproxy.service README testadmin.sql testautocommit.sql testproxy.sql trantest.sql

パート2: マスタースレーブ環境の構築

この記事のアーキテクチャは、マスター 1 つとスレーブ 2 つで構成され、HE3 がマスターで、HE1 と HE2 がスレーブです。マスタースレーブの構築はこの記事の焦点では​​ないので、必要に応じて移動できます。

mysqlreplicate を使って MySQL マスタースレーブを素早く構築する方法

パート3: Oneproxyを構成する

ディレクトリ内のデモは初期起動スクリプト、oneproxy.serviceは起動および停止スクリプト、新しいバージョンのoneproxyではconfフォルダ内のproxy.cnfは設定ファイルです。

[root@HE4 oneproxy]# cat demo.sh 
#/bin/bash
#
ONEPROXY_HOME=/root/oneproxy をエクスポートします。
# valgrind --leak-check=full \
 ${ONEPROXY_HOME}/bin/oneproxy --defaults-file=${ONEPROXY_HOME}/conf/proxy.conf

demo.shのONEPROXY_HOMEをoneproxyが解凍されたディレクトリに変更します。

[root@HE4 oneproxy]# cat oneproxy.service 
#!/bin/bash
# chkconfig: -30 21
# 説明: OneProxy サービス。
# ソース関数ライブラリ
. /etc/init.d/functions
# OneProxy 設定
ONEPROXY_HOME=/root/oneproxy
ONEPROXY_SBIN="${ONEPROXY_HOME}/bin/oneproxy"
ONEPROXY_CONF="${ONEPROXY_HOME}/conf/proxy.conf"
ONEPROXY_PID="${ONEPROXY_HOME}/log/oneproxy.pid"
戻り値=0
prog="OneProxy"
始める() {
 echo -n $"$prog を開始しています..."
 デーモン $ONEPROXY_SBIN --defaults-file=$ONEPROXY_CONF
RETVAL=$?
エコー
}
停止() {
 echo -n $"$prog を停止しています..."
[ -e ${ONEPROXY_PID} ]の場合;
デーモンをkill -INT $(cat ${ONEPROXY_PID})
 RETVAL=$?
フィ
エコー
}
再起動(){
 停止
睡眠1
 始める
}
ケース「$1」
 始める)
 始める
 ;;
 停止)
 停止
 ;;
 再起動)
 再起動
 ;;
 *)
 echo $"使用法: $0 {start|stop|restart}"
 戻り値=1
エサック
$RETVALを終了

同時に、oneproxy.service 内の ONEPROXY_HOME を解凍時のディレクトリに変更します。

oneproxyのbinディレクトリに入り、mysqlpwdを使用してパスワードを暗号化します

[root@HE4 oneproxy]# cd bin/

[root@HE4 bin]# ls

mysqlpwd ワンプロキシ

[root@HE4 bin]# ./mysqlpwd マネージャー

1C6D087BA5D2607A27DECB2F2AFE247E911E877A

proxy.cnfの内容を編集する

[root@HE4 conf]# cat proxy.conf 
[ワンプロキシ]
キープアライブ = 1
イベントスレッド = 4
プロキシグループポリシー.2 = テスト:読み取りスレーブ
ログファイル = log/oneproxy.log
pid ファイル = log/oneproxy.pid
lck ファイル = log/oneproxy.lck
プロキシ自動読み取り専用 = 1
プロキシ転送クライアントIP = 1
プロキシトランスデバッグ = 1
プロキシアドレス = :3307
mysql バージョン = 5.7.16
プロキシマスターアドレス.1 = 192.168.1.250:3306@test
プロキシスレーブアドレス.2 = 192.168.1.248:3306@test
プロキシスレーブアドレス.3 = 192.168.1.249:3306@test
プロキシユーザーリスト = sys_admin/1C6D087BA5D2607A27DECB2F2AFE247E911E877A@test
プロキシユーザーグループ = test:sys_admin/1C6D087BA5D2607A27DECB2F2AFE247E911E877A@test
プロキシ部分テンプレート = conf/template.txt
プロキシパートテーブル.1 = conf/part.txt
プロキシパートテーブル.2 = conf/part2.txt
プロキシパーツテーブル.3 = conf/cust1.txt
プロキシ文字セット = utf8_bin
プロキシセキュアクライアント = 127.0.0.1
# プロキシライセンス = 32C54560E06EFF3E
プロキシhttpサーバー = :8080
proxy-httptitle = OneProxy モニター

パート4: Oneproxyを起動する

[root@HE4 oneproxy]# ./demo.sh

[root@HE4 oneproxy]# ./oneproxy.service を再起動します

OneProxy を停止しています...[OK]

OneProxy を起動しています... [ OK ]

テスト

パート 1: Oneproxy ステータスの検証

ブラウザを開いてポート192.168.1.251:8080を開き、oneproxy管理ページを表示します。

ここでは、マスターとスレーブのさまざまなステータス情報を確認できます。

パート2: 負荷分散と読み取り/書き込み分離の検証

[root@HE1 ~]# mysql -usys_admin -pMANAGER -h192.168.1.251 -P3307 -e"@@hostnameを選択します;"
mysql: [警告] コマンドライン インターフェイスでパスワードを使用すると安全でない可能性があります。
+------------+
| @@ホスト名 |
+------------+
| HE1 |
+------------+
[root@HE1 ~]# mysql -usys_admin -pMANAGER -h192.168.1.251 -P3307 -e"@@hostnameを選択します;"
mysql: [警告] コマンドライン インターフェイスでパスワードを使用すると安全でない可能性があります。
+------------+
| @@ホスト名 |
+------------+
| HE2 |
+------------+
[root@HE1 ~]# mysql -usys_admin -pMANAGER -h192.168.1.251 -P3307 -e"@@hostnameを選択します;"
mysql: [警告] コマンドライン インターフェイスでパスワードを使用すると安全でない可能性があります。
+------------+
| @@ホスト名 |
+------------+
| HE1 |
+------------+
[root@HE1 ~]# mysql -usys_admin -pMANAGER -h192.168.1.251 -P3307 -e"@@hostnameを選択します;"
mysql: [警告] コマンドライン インターフェイスでパスワードを使用すると安全でない可能性があります。
+------------+
| @@ホスト名 |
+------------+
| HE2 |
+------------+
[root@HE1 ~]# mysql -usys_admin -pMANAGER -h192.168.1.251 -P3307 -e"@@hostnameを選択します;"
mysql: [警告] コマンドライン インターフェイスでパスワードを使用すると安全でない可能性があります。
+------------+
| @@ホスト名 |
+------------+
| HE1 |
+------------+
[root@HE1 ~]# mysql -usys_admin -pMANAGER -h192.168.1.251 -P3307 -e"begin;select @@hostname;commit;"
mysql: [警告] コマンドライン インターフェイスでパスワードを使用すると安全でない可能性があります。
+------------+
| @@ホスト名 |
+------------+
| HE3 |
+------------+
[root@HE1 ~]# mysql -usys_admin -pMANAGER -h192.168.1.251 -P3307 -e"begin;select @@hostname;commit;"
mysql: [警告] コマンドライン インターフェイスでパスワードを使用すると安全でない可能性があります。
+------------+
| @@ホスト名 |
+------------+
| HE3 |
+------------+

HE1とHE2をロードバランサーとして使用しても問題はなく、HE3を書き込みサーバーとして使用しても問題はないことがわかります。

--要約--

OneProxy は MySQL と連携して、読み取りと書き込みの分離と負荷分散の実験を実現し、成功裏に構築されました。Oneproxy にはデータベースとテーブルのシャーディング機能もあり、今後さらに研究される予定です。著者の能力の限界と記事執筆の急ぎにより、記事には必然的に誤りや不正確な点があります。不適切な点がありましたら、読者の皆様のご批判と訂正を心からお願い申し上げます。

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • MySQLデュアルマシンホットスタンバイと負荷分散の実装手順の詳細説明
  • パフォーマンス負荷診断にMySQLシステムデータベースを使用する方法
  • MySQLで負荷分散を実装する方法
  • MySQL のロードバランサーとして nginx を使用する方法
  • mysql+mycat、負荷分散、マスタースレーブレプリケーション、読み取り/書き込み分離操作に基づく安定した高可用性クラスタを構築します。
  • PythonはMySQLの読み書き分離と負荷分散を実装します
  • MySQLの高可用性負荷分散構成を実装するためのKeepalived+HAProxy
  • MySQLのインデックスによって引き起こされるCPU負荷の急増を分析する
  • MYSQLデータベース接続の負荷容量を迅速に増やす方法
  • 負荷分散機能を備えたMySQLサーバクラスタの導入と実装
  • MySQL の CPU 負荷が高い問題のトラブルシューティング

<<:  Vue のすべてのカプセル化方法の簡単な概要

>>:  2つのVirtualBox仮想ネットワークをブリッジするLinuxブリッジメソッドの手順

推薦する

MySQL 5.7.24 のインストールと設定方法のグラフィックチュートリアル

MySQL は最も人気のあるリレーショナル データベース管理システムです。WEB アプリケーションに...

Tomcat を IDEA にダウンロード、インストール、デプロイするチュートリアル (IDEA の 2 つのホット デプロイ設定方法付き)

目次Tomcat ダウンロードチュートリアルTomcat インストールチュートリアルTomcat の...

Vuex はシンプルなショッピングカート機能を実装します

この記事の例では、ショッピングカート機能を実装するためのvuexの具体的なコードを参考までに共有して...

12個のJavascriptテーブルコントロール(DataGrid)が整理されています

DataGrid コントロールの DataSource プロパティがデザイン時に設定されている場合、...

MySQLの複合インデックス方式の詳細な説明

どの DBMS でも、インデックスは最適化にとって最も重要な要素です。データ量が少ない場合、適切なイ...

display または visibility を通じて HTML 要素を表示または非表示にする

場合によっては、特定の条件に基づいて Web ページ内の HTML 要素を表示するか非表示にするかを...

webpack-dev-server のコア概念とケースの詳細な説明

webpack-dev-server コアコンセプトWebpack の ContentBase と ...

Vueは小さなメモ帳機能を実装しました

この記事の例では、メモ帳の小さな機能を実現するためのvueの具体的なコードを参考までに共有しています...

Vue3.0 エラーの解決策: モジュール 'worker_threads' が見つかりません

vue3.0 への最初の試みを記録します。プロジェクトを開始したときに、「モジュール 'wo...

Mac 向け MySQL 5.7.17 のインストールと設定のチュートリアル

1. MySQLをダウンロードする公式サイトのダウンロードページをクリックすると次のページに入ります...

JS配列インデックス検出におけるデータ型の問題の詳細な説明

WeChat アプレット プロジェクトを書いていたとき、その中に「都市選択」機能がありました。作者は...

HTML テーブルタグチュートリアル (17): テーブルタイトルの垂直配置属性 VALIGN

表のキャプションは表の上または下に配置でき、プロパティで調整できます。デフォルトのテーブル タイトル...

Windows で Nginx を使用して https サーバーとリバース プロキシを構成する際の問題

リクエストロジックフロントエンド --> https経由でnginxをリクエストnginx -...

Vueで配列の変更を監視する方法

目次序文ソースコード学習の第一歩はどこから始めればよいでしょうか?写真から始めましょうソースコードを...