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 パスワードに特殊文字が含まれている場合とコマンドラインからログインする場合

サーバーでは、データベースにすばやくログインするために、通常は mysql -hhost -uuse...

localStorageの有効期限を設定するいくつかの方法

目次問題の説明1. 基本的な解決策2. 中間的な解決策3. 高度なソリューション4. ハードコアソリ...

Centos 6.9 に MySQL をインストールするための詳細なチュートリアル

1. MySQLがインストールされているかどうかを確認します。次のコードで確認できます。 [root...

HTML 特殊文字エンコーディング CSS3 コンテンツに関する簡単な説明:「私は特別なシンボルです」

プロジェクトで使用されている特殊文字とアイコンHTMLコードXML/HTML コードコンテンツをクリ...

WeChat公式アカウントでReactプロジェクトを実行する方法

目次1. a タグを使用して PDF をプレビューまたはダウンロードします。書き方は、携帯電話でクリ...

Win7x64でのMySQL 5.7.18解凍版のインストール方法

関連記事: Win7 x64 に解凍版の mysql 5.7.18 winx64 をインストールする...

ReactとReduxの配列処理の説明

この記事では、reduce()、filter()、map()、every()、some()、spre...

Webフロントエンド開発におけるエラーを見つけるための基本的な考え方

WEB開発は主に2つのインタラクション(B/Sデータ)から構成されますブラウザ: 1html、css...

ミニプログラムカスタムコンポーネントの非効率的なグローバルスタイルの解決策

目次長すぎて読めないコンポーネントスタイルの分離デモテスト優先度ページの分離構成参考文献ネイティブ ...

Mac 環境での Nginx 構成とローカル静的リソースへのアクセスの実装

ローカル開発では、直接アクセスできない静的ファイル リソースのデバッグが必要になる場合があります。こ...

Ubuntu 16.04 で FTP サーバーを構築するチュートリアル

Ubuntu 16.04 FTP サーバーをビルドするftpをインストールするftp をインストール...

MySQLがトランザクション分離を実装する方法の簡単な分析

目次1. はじめに2. RC および RR 分離レベル2.1. RRトランザクション分離レベルでのク...

MySql5.x を MySql8.x にアップグレードする方法と手順

MySQL 5.x と MySQL 8.0.X のいくつかの違いapplication.proper...

Linux および CentOS (サーバー) に zip および unzip コマンド機能をインストールする

Linux に zip 解凍機能をインストールする通常、 zip コマンドは Linux サーバーに...

開発環境にUbuntu 16をインストール後の初期設定

オフィスでは、Linux 開発環境として Ubuntu システムが必要です。現在、Ubuntu 16...