この記事では、MySQL の読み取りと書き込みの分離に関する関連知識を紹介します。お役に立てば幸いです。
MySQL の読み取りと書き込みの分離の概要
MySQL は現在、世界で最も広く使用されている無料のデータベースです。システム運用に携わるすべての人 Weiwei のすべてのエンジニアがシステムに触れているはずです。
実際の運用環境では、独立したデータベースとしての単一の MySQL は、セキュリティ、高可用性、高同時実行性などの観点から見て、実際のニーズをまったく満たすことができません。
したがって、一般的に言えば、データは マスター/スレーブ レプリケーション を通じて同期され、その後 読み取りの分離を通じて同期されます。データベースの同時負荷容量を向上させるための書き込み (MySQL-Proxy/Amoeba) #デプロイと実装。
#読み取りと書き込みの分離の動作原理
##読み取りと書き込みを分離する理由
アクセス圧力の増大に直面して、単一サーバーのパフォーマンスがボトルネックになり、負荷を分散する必要がある
-
マスターとスレーブは、自身の書き込みとスレーブに対してのみ責任を負います。 X (書き込み) ロックと S (読み取り) ロックの競合を大幅に軽減します
- ##myisam エンジンをライブラリから設定して、クエリのパフォーマンスを向上させ、システム オーバーヘッドを節約できます
- 冗長性を高め、可用性を向上させる
-
読み取りと書き込みの分離を実現する方法
一般に、これを実現するには 2 つの方法があります#アプリケーション層の実装、Web サイト プログラムの実装
アプリケーション層の実装とは、アプリケーション内およびコネクタ内での読み取りと書き込みの分離を指します
利点:
- アプリケーションは内部で読み取りと書き込みの分離を実装しており、インストール中に使用できます
導入の特定の困難を軽減します
アクセスプレッシャーは以下になります一定のレベルに到達すると、パフォーマンスは非常に優れています。
欠点:
- アーキテクチャを調整したら、コードを次のように調整する必要があります。
#自動データベース シャーディングやテーブル シャーディングなどの高度なアプリケーションを実装するのは困難です
大規模なアプリケーション シナリオには適用できません
ミドルウェア層の実装:
##ミドルウェア層の実装とは、外部ミドルウェア プログラムでの読み取りと書き込みの分離を指します一般的なミドルウェア プログラム
Alibaba B2B によって開発されたリレーショナル分散システムで、3,000 近くの MySQL インスタンスを管理します。アリババでのテストに耐えましたが、その後、著者の退職により cobar は保守されなくなりましたが、アリババは cobar に代わる tddl も開発しました。
- MyCAT:
- コミュニティの愛好家が Ali cobar をベースに二次開発を行い、当時 cobar が抱えていたいくつかの問題を解決し、参加しました。多くの新機能が含まれています。現在、MyCAT コミュニティは非常に活発で、すでに MyCAT を使用している企業もあります。一般的に、サポートは
- よりも高く、引き続き維持されます。
- OneProxy:
- データベース業界の偉人、元 Alipay データベース チーム リーダーが、mysql 公式プロキシのアイデアに基づいて開発を構築しています。 c 開発用 はい、OneProxy は商用で有料のミドルウェアですが、Lou はいくつかの機能点を省略し、パフォーマンスと安定性に焦点を当てました。誰かが
- # をテストして、高い同時実行下でも非常に安定していると言いました。
- Vitess:
- このミドルウェアは Youtube 制作で使用されていますが、アーキテクチャは非常に複雑です。これまでのミドルウェアと異なり、Vitess を使用したアプリケーションの変更は比較的大きく、彼が提供する言語の API インターフェイスを使用するには、彼の設計上のアイデアのいくつかを学ぶことができます。
- キングシャード:
Kingshard は、360Atlas ミドルウェア開発チームの元メンバーである Chen Fei によって、暇なときに go 言語を使用して開発されました。現在、開発には約 3 人が携わっています。使用できるほど成熟した製品ではないため、継続的に改善する必要があります。
Atlas:
360 チームは、mysql プロキシに基づいて lua を C で書き直しました。オリジナルのバージョンはテーブルのシャーディングをサポートしており、シャードされたデータベースとテーブルのバージョンがリリースされました。インターネット上の友人が「同時実行性が高いと頻繁にハングする。使用したい場合は事前にテストする必要がある」と言っているのを見かけました。
MaxScale と MySQL ルート:
これら 2 つのミドルウェアは公式とみなされ、MaxScale は mariadb (MySQL のオリジナルの作成者) によって管理されているバージョンです。 、現在のバージョンはサブデータベースとテーブルをサポートしていません。 MySQL Route は、MySQL 公認の Oracle 社が現在リリースしているミドルウェアです。
利点:
アーキテクチャ設計はより柔軟です
いくつかの高度な制御を実現できます。透過的な水平分割、フェイルオーバー、監視などのプログラムは、mysql のパフォーマンスを向上させるための技術的手段に依存できます。ビジネス コードへの影響はほとんどなく、安全でもあります。
欠点:
特定の開発および運用チームのサポートが必要です。
#MyCAT とは
- 完全にオープンソースのエンタープライズ向けアプリケーション 開発された大規模データベース クラスター
- は、トランザクション、ACID、および MySQL を置き換えることができるデータベースの拡張バージョンをサポートします
- エンタープライズ レベルMySQL クラスターとみなせるデータベース 高価な Oracle クラスターの置き換えに使用されるデータベース
#メモリ キャッシュ テクノロジ、NoSQL テクノロジ、および HDFS ビッグ データを統合する新しい SQL Server 従来のデータベースと新しい分散データ ウェアハウス向けの新世代のエンタープライズ レベルのデータベース製品の組み合わせ-
##斬新なデータベース ミドルウェア製品
-
##MyCat サービスのインストールと構成
MyCat は、Windows、Linux をサポートするコンパイル済みインストール パッケージを提供します、Mac、Solaris、その他のシステム
実験アーキテクチャ:
192.168.2.2 Mycat CentOS 8.3.2011
- 192.168.2.3 メイン サーバー CentOS 7.6
- 192.168.2.5 スレーブ サーバー CentOS 7.6
-
- Mycat の実行には JDK 1.7 以降が必要です
-
-
#Mycat をダウンロード
wget http://dl.mycat.org.cn/1.6.7.6/20210303094759/Mycat-server-1.6.7.6-release-20210303094759-linux.tar.gz
- tar xf Mycat-server-1.6.7.6-release-20210303094759-linux.tar.gz -C /usr/local/
- sudo useradd -M -N -s /sbin/nologin mycat && echo "123456" | sudo passwd --stdin mycat
- sudo chown -R mycat./usr/local/mycat/
-
-
##
- bin プログラム ディレクトリ、Linux で実行: ./mycat console、最初の chmod x *
注: Mycat はコマンドをサポートしています { console | start | stop | restart | status | dump }
conf 設定ファイルこれらはディレクトリに保存されます。server.xml は Mycat サーバーのパラメータ調整とユーザー認証の設定ファイル、schema.xml は論理ライブラリ定義、テーブル、およびシャーディング定義の設定ファイル、rule.xml はシャーディング ルールの設定ファイルです。 schema.xml はシャーディング ルールの構成ファイルです。スライス ルールの一部の特定のパラメータ情報はファイルとして個別に保存され、このディレクトリにもあります。構成ファイルを変更した場合、有効にするために Mycat を再起動する必要があります。
lib ディレクトリには主に、mycat が依存するいくつかの jar ファイルが保存されます。
ログは、logs/mycat.log に 1 日あたり 1 ファイル保存されます。ログ構成は conf/log4j.xml にあります。必要に応じて、デバッグの出力レベルを調整できます。デバッグ レベルでは、トラブルシューティングを容易にするための情報がさらに出力されます。
MyCat サービスの起動と起動設定
MyCAT を Linux に展開して起動する場合、最初に必要なものがあります。 Linux システムの環境変数に MYCAT_HOME を設定する 操作方法は次のとおりです:
sudo vim /etc/profile.d/mycat.sh
MYCAT_HOME=/usr /local/mycat PATH= $MYCAT_HOME/bin:$PATH
環境変数を有効にする
. /etc/profile.d /mycat.sh
- サービスを開始します
- /usr/local/mycat/bin/mycat start
- cat /usr/local /mycat/logs/wrapper.log
mycat のユーザー アカウントと認証情報は、conf/server.xml ファイルの設定にあります。
#dataHost の構成情報について、MyCAT 構成ファイル schema.xml を編集します。次のように:
元の構成ファイルをバックアップします- \cp /usr/local/mycat/conf/schema.xml{,.bak}
- 編集設定ファイル
-
- vim /usr/local/mycat/conf/schema.xml
"> 注意してくださいこちらのURLへ、書き間違えると起動不能になります! < "dn1" dataHost="dthost" database="mydata"/>
バランス= "1"
writeType = "0" dbtype = "mysql" dbdriver = "ネイティブ" switchtype = "-1"
slavethreshold = "100"&gt; /heartbeat&gt; #ホスト> ;
#すべての読み取り操作を強制的に読み取りサーバー上で実行し、データの書き込み時にのみ書き込みサーバーに切り替える
- ここでの mycat ユーザーは、マスター/スレーブ データベースの 192.168.2.3 および 2.5 で承認されている必要があることに注意してください。
- GRANT ALL PRIVILEGES ON *.* TO 'mycat'@' %' IDENTIFIED BY '123456';
- またはネットワーク セグメントを指定します
##*.* のすべての権限を 'mycat'@'192.168 に付与します.2. %' IDENTIFIED BY '123456'; フラッシュ権限;
#このエラーが報告された場合、サーバーは正常に実行されています。最初に承認があるかどうかを確認してください。
エラー 1184 (HY000): 無効なデータソース:0
##スキーマ:
論理ライブラリ、 MySQL Databaseと同様、論理ライブラリに含まれるTableに相当します。
table: テーブル、つまり、物理データベースに格納されているテーブルです。従来のデータベースとは異なり、ここでのテーブルは、格納する論理データ ノード DataNode を宣言する必要があります。これは、テーブル。ルール定義を通じてこれを実現するために、テーブルはそれが属する「childTable」を定義できます。子テーブルのシャーディングは、「親テーブル」の特定のシャーディング アドレスに依存します。簡単に言うと、テーブルは特定のレコードに属します。 A のサブテーブルのすべてのレコードは、A と同じシャードに保存されます。
シャーディング ルール: フィールドと関数のバンドル定義です。このフィールドの値に基づいて、格納されているシャード (DataNode) のシーケンス番号が返されます。各テーブルにはシャーディング ルールを定義でき、シャーディングデフォルトで数値ベースのシャーディング ルール、文字列シャーディング ルールなどを提供する拡張機能。 dataNode:
MyCAT の論理データ ノードは、テーブルが保存される特定の物理ノードです。シャード ノードとも呼ばれます。DataSource を通じて特定のバックエンド データベースに関連付けられます。一般に、つまり、高可用性を実現するために、各データノードにはマスターとスレーブの 2 つのデータソースが装備されており、マスター ノードがダウンすると、システムは自動的にスレーブ ノードに切り替わります。
dataHost: dataNodeにバインドする物理ライブラリのアクセスアドレスを定義します。
MyCAT は現在、構成ファイルを通じて論理ライブラリと関連構成を定義します: MYCAT_HOME/conf/schema.xml は論理ライブラリ、テーブル、シャード ノードなどを定義します;
MYCAT_HOME/conf で断片化ルールを定義します/rule.xml;
MYCAT_HOME/conf/server.xml で、ポートなどのユーザーおよびシステム関連の変数を定義します。
注:
スキーマ タグは、MyCat インスタンスの論理ライブラリを定義するために使用されます。name: の後に論理ライブラリ名が続きます。MyCat は複数の論理ライブラリを持つことができ、各論理ライブラリには独自の論理ライブラリがあります関連する設定。スキーマ タグを使用して、これらの異なる論理ライブラリを分割できます。
checkSQLschema この属性のデフォルトは false です。公式ドキュメントでは、テーブル「select * from db1.testtable」の前にあるデータベースの名前を削除するかどうかを意味しています。true に設定すると、db1 が削除されます。ただし、db1 の名前が
スキーマの名前ではない場合は削除されないため、この構文を使用しないことが公式に推奨されています。また、デフォルトでは false に設定されます。
sqlMaxLimit 値が特定の数値に設定されている場合。実行される SQL ステートメントごとに、limit ステートメントが追加されていない場合、MyCat は対応する値を自動的に追加します。たとえば、値を 100 に設定して「select * from test_table」を実行すると、結果は
「select * from test_table limit 100」になります。
dataNode ラベルは、MyCat のデータ ノードを定義します。私たちが通常データと呼ぶもの。
##
- サービスを再起動します
- /usr/local/mycat/bin/mycat restart
Mycat サーバーを停止しています...
Mycat を停止しました-server.
Mycat サーバーの開始...
tail /usr/local/mycat/logs/wrapper.log
#MySQL マスター/スレーブの構成
2 つのサーバーにそれぞれ mariadb をインストールして構成します。具体的な手順については、https://blog.csdn.net/ を参照してください。 gaofei0428/article/details/103829676?spm=1001.2014.3001.5501-
最初にメインデータベース側 192.168.2.3 Edit /etc/my.cnf
/etc/my.cnf- [mysqld]
datadir=/var/lib/mysql
ソケット=/var/lib/mysql/mysql.sock
シンボリックリンク=0
log-bin=/data/mysql/mysql-bin
server-id=1 binlog-ignore-db=mysql
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
binlog-ignore-db=test
innodb_flush_log_at_trx_commit=1
binlog-do-db=
mydatareplicate-do-db=
mydata
lower_case_table_names=1 大文字と小文字の一致をオンにする-
- 同期するデータベースは次の場所に存在する必要があることに注意してください。前進
-
#エラーなく起動したら、スレーブサーバー 192.168.2.5 /etc/my.cnf
vim /etc/my.cnf 1 [mysqld]- datadir=/var/lib /mysql
ソケット=/var/lib/mysql/mysql.sock
シンボリックリンク=0
log-bin=/data/mysql/mysql-bin
サーバー-id=2
リレーログインデックス=/data/mysql/slave-relay-bin.index
リレーログ=/データ/mysql/slave-relay-bin
lower_case_table_names=1
read_only =1 読み取り専用モードをオンにしてデータのライトバックを防ぎ、スレーブ同期レプリケーションには影響しません
- lower_case_table_names=1 大文字と小文字の一致をオンにします
-
- スレーブデータベースサービスの再起動後、以下の操作を実施しますスレーブサーバーのスレーブを停止し、スレーブデータベースユーザーを作成します
- mysql -uroot -p123456 - e "スレーブを停止します"
mysql -uroot -p123456 -e "*.* のレプリケーション スレーブを '123456' で識別される 'スレーブ'@'%' に許可します"- mysql -uroot -p123456 -e "mysql.user からユーザー、パスワードを選択"
mysql -uroot -p123456 -e "マスター変更master_host='192.168.2.3',master_user='スレーブ',master_password='123456',master_log_file='mysql-bin.000002',master_log_pos=245;"
mysql -uroot -p123456 -e "スレーブを開始" - mysql -uroot -p123456 -e "スレーブのステータスを表示"
#テスト
まず、メイン サーバー 192.168.2.3## のすべてのライブラリのバックアップをエクスポートします。
- ##mysqldump -uroot -p --all-databases > /tmp/all_dbs.sql
##次にサーバー 192.168.2.5 からインポートします-
##mysql -uroot -p < ; /tmp/all_dbs.sql
メイン データベース側 192.168.2.3 にデータを追加し、セカンダリ データベースが同期されているかどうかを確認します
-
スレーブサーバーを確認してください
同期エラーが発生した場合は、スレーブ側でスレーブを停止する必要がありますサーバーを変更してからマスターを再度変更します
##スレーブ ユーザー ログイン テストを使用します
## mycat サーバー 192.168.2.2 に戻ります
-
mysql -uroot -p123456 -h192.168.2 にログインしてみます。 2 -P8066
- 8066 は、mycat 実行時のポート番号
- ##読み取り/書き込み分離のテストmysql -uroot -p123456 -h192.168.2.2 -P9066 -e "show @@datasource"
9066 は mycat 管理ポートです
#select * from mydata.mylist;
-
-
##データの書き込みまたはデータの変更insert into mydata.mylistvalues(10,'test ');
##障害をシミュレートし、最初にスレーブ サーバー 192.168.2.5
を停止します。
systemctl stop mariadb.service
-
192.168.2.2
insert にデータを書き込んでみるinto mydata.mylistvalues( 7,'gf');-
メインサーバー 192.168.2.3
- で表示
スレーブ サーバー 192.168.2.5 を開きます
##マスター サーバー 192.168.2.3 をシミュレートします。
###################################
#クエリは正常です。データを書き込んでみてください。-
クエリは正常ですが、データを書き込んでください。書き込めません-
複数のライブラリを追加- vim cat /usr/ local/mycat /conf/server.xml
-
- mydata,wordpress property>
##vim /usr/local/mycat/conf/schema.xml
- <スキーマ名="wordpress" checkSQLschema = "false" sqlMaxLimit="100" dataNode='dn2'>
-
-
- /usr/local/mycat/bin/mycat restart
- を追加した後、サービスを再起動します。 tail / usr/local/mycat/logs/wrpper.log
-
##エラー処理
- 起動に失敗しました: JVM からの信号を待機中にタイムアウトしました。
JVM は要求に応じて終了せず、終了しました
解決策 # をwrapper.confに追加します
##wrapper.startup.timeout=300
//タイムアウト 300 秒wrapper.ping.timeout=120
##推奨される学習: mysql ビデオ チュートリアル-
以上がMycat の MySQL クラスターの読み取りと書き込みの分離の実装について話しましょうの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。