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ブリッジメソッドの手順

推薦する

ブラウザは関連するHTTPヘッダーをキャッシュし、HTTPリクエストの数を最小限に抑えます。

最近、Yahoo の 34 の黄金律を読み、ウェブサイトのパフォーマンスを最適化する方法を学びました...

Idea の起動速度を改善し、Tomcat ログの文字化けを解決する方法

目次序文アイデアの起動速度Tomcat ログが文字化けしている序文Idea を再インストールしたので...

LINUX でプロセスを表示する 4 つの方法 (要約)

プロセスは CPU とメモリ内で実行されるプログラム コードであり、各プロセスは 1 つ以上のプロセ...

MySQLとPythonの相互作用の例

目次1. データを準備するデータテーブルを作成するデータの挿入2. SQLドリル1. SQL文の強化...

CentOS 8 Zabbix 4.4 インストール ガイド

Zabbix サーバー環境プラットフォームZABBIX バージョン 4.4セントOS8 MySQL ...

nginx + php の「入力ファイルが指定されていません」の解決策

本日、ローカル開発環境で突然「入力ファイルが指定されていません」というエラーが発生してしまいました。...

8 JSのreduce使用例とreduce操作方法

reduceメソッドは配列の反復メソッドです。 mapやfilterとは異なり、 reduceメソッ...

Vue/React シングルページ アプリケーションをリフレッシュなしで復元するソリューション

目次導入なぜわざわざ?落とし穴のあるコミュニティソリューション(Vue を例に挙げる)現時点では良い...

select @@session.tx_read_only が DB に大量に出現するのはなぜですか?

問題を見つける上位の SQL ステートメントを取得すると、DB が大量のselect @@sessi...

MySQLデータベースのタイムアウト設定を構成する方法の例

目次序文1. JDBCタイムアウト設定2. 接続プールのタイムアウト設定3. MyBatisクエリの...

MySQL の FIND_IN_SET() と IN の違いを簡単に分析します

以前、あるプロジェクトでMysql FIND_IN_SET関数を使用したことがありますが、非常に便利...

Vue ページをリフレッシュするために provide と injection を適用する

目次方法1: 関数を直接呼び出す方法2: provide / inject (静的更新) を使用する...

ウェブページエクスペリエンス: 計画と設計

1. デザインの方向性を明確にする<br />まず、どのユーザーを対象にデザインするのか...

JSネイティブ2列シャトル選択ボックスの実装例

目次いつ使うか構造的ブランチコードいつ使うか選択動作を完了するには、2 つの列間で要素を直感的に移動...

Vue3でアイコンを使用する2つの例

目次1. SVGを使用する2. fontAwesomeを使用する3 ソース4 結論テクノロジースタッ...