Linux - MyCat を使用して MySQL マスター スレーブの読み取り書き込み分離を実装する1. MySQLの読み書き分離1. MySQLの読み書き分離の概要世界で最も広く利用されている無料データベースとして、システムの運用・保守に携わるエンジニアであれば誰もが一度は触れたことがあるのではないでしょうか。しかし、実際の運用環境では、独立したデータベースとしての単一の MySQL サーバーは、セキュリティ、高可用性、高同時実行性などの点で、実際のニーズをまったく満たすことができません。 そのため、一般的には、 2. 読み書き分離の動作原理基本的な原則は、マスター データベースでトランザクションの追加、変更、削除操作 (INSERT、UPDATE、DELETE) を処理し、スレーブ データベースで SELECT クエリ操作を処理することです。データベース レプリケーションは、トランザクション操作によって発生した変更をクラスター内のスレーブ データベースに同期するために使用されます。 内部データ交換プロセスを説明する画像をここに挿入します。 3. 読むことと書くことを分ける必要があるのはなぜですか?
3. 読み書き分離を実現する方法これを実現するには 2 つの方法があります。 (1)アプリケーション層の実装:ウェブサイトのプログラム実装。アプリケーション層の実装とは、アプリケーション内およびコネクタ内での読み取りと書き込みの分離の実装を指します。 利点:アプリケーション内で読み取りと書き込みの分離が実現され、インストール後に使用可能になり、展開の難易度がある程度軽減され、アクセス圧力が一定レベル以下になり、パフォーマンスが非常に良好になります。 (2)ミドルウェア層の実装:ミドルウェア層の実装とは、外部ミドルウェアプログラムにおける読み書き分離の実装を指します。 4. 共通ミドルウェアプログラム (1)Cobar: Alibaba B2Bが開発したリレーショナル分散システムで、約3,000個のMySQLインスタンスを管理しています。 Alibaba でのテストには耐えましたが、その後、作者が退職したため、cobar を保守する人がいなくなり、Alibaba も cobar の代わりに tddl を開発しました。 2. MyCATの概要1. MyCATとはエンタープライズ アプリケーション開発用の完全にオープン ソースの大規模データベース クラスター。トランザクションと ACID をサポートし、MySQL を置き換えることができる拡張データベース。高価な Oracle クラスターを置き換える MySQL クラスターと見なすことができるエンタープライズ レベルのデータベース。メモリ キャッシュ テクノロジ、NoSQL テクノロジ、および HDFS ビッグ データを統合した新しい SQL Server。従来のデータベースと新しい分散データ ウェアハウスを組み合わせた新世代のエンタープライズ レベルのデータベース製品。斬新なデータベース ミドルウェア製品。 2. MyCatサービスのインストールと設定MyCat は、Windows、Linux、Mac、Solaris などのシステムへのインストールと実行をサポートするコンパイル済みインストール パッケージを提供します。公式ダウンロードホームページ http://www.mycat.org.cn/ 建築: 192.168.1.63 マイキャット 192.168.1.64 マスター 192.168.1.65 スレーブ Mycat には JDK 1.7 以上が必要です。 ステップ1: jdk-8u191-linux-x64.tar.gzファイルをダウンロードする [root@xuegod63 ローカル]# wget http://download.oracle.com/otn-pub/java/jdk/8u191- b12/2787e4a523244c269598db4e85c51e0c/jdk-8u191-linux-x64.tar.gz #Linux でダウンロードしたパッケージに問題がある場合は、リンクを Windows にコピーしてダウンロードし、Linux にアップロードする必要があります。 ステップ2:新しい/usr/javaフォルダを作成し、jdk-8u191-linux-x64.tar.gzをそのディレクトリに解凍します。 [root@xuegod63 ローカル]# mkdir /usr/java [root@xuegod63 ローカル]# tar xf jdk-8u191-linux-x64.tar.gz -C /usr/java/ ステップ 3:環境変数を構成する /etc/profile の下部に次の内容を追加します。 [root@xuegod63 local]# vim /etc/profile.d/java.sh #/etc/profile.d/ディレクトリにjava.shファイルを作成し、次の内容を設定します。JAVA_HOME=/usr/java/jdk1.8.0_191 PATH=$JAVA_HOME/bin:$PATH クラスパス=$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar PATH JAVA_HOME CLASSPATH をエクスポートする [root@xuegod63 local]# source /etc/profile.d/java.sh #環境変数を有効にする [root@xuegod63 local]# java -version #javaのバージョンを表示 java version "1.8.0_191" Java(TM) SE ランタイム環境 (ビルド 1.8.0_191-b12) Java HotSpot(TM) 64 ビット サーバー VM (ビルド 25.191-b12、混合モード) mycat をインストールします。 Linux では、Mycat-server-xxxxx.linux.tar.gz をダウンロードし、ディレクトリに解凍できます。ディレクトリ内にスペースがあってはならないことに注意してください。 Linux (Unix) では、次のように usr/local/Mycat ディレクトリに配置することをお勧めします。 [root@xuegod63 ~]# tar -xf Mycat-server-1.5-RELEASE-0301083012-linux.tar.gz -C /usr/local/ [root@xuegod63 ローカル]# ls /usr/local/mycat/
[root@xuegod63 ~]# ユーザー追加 mycat [root@xuegod63 ~]# passwd mycat #変更を成功させるにはパスワードを2回入力してください [root@xuegod63 ~]# chown -R mycat.mycat /usr/local/mycat #権限の変更 ディレクトリの説明は次のとおりです。 bin プログラム ディレクトリには、Windows バージョンと Linux バージョンが格納されます。サービスとしてパッケージ化されたバージョンを提供するだけでなく、選択と変更を簡単に行える nowrap シェル スクリプト コマンドも提供します。bin ディレクトリに入ります。 注: mycat は次のコマンドをサポートしています: { console | start | stop | restart | status | dump } 設定ファイルは ログは 3. MyCatサービスの起動と起動設定MyCAT を Linux にデプロイして起動する場合、まず Linux システムの環境変数で MYCAT_HOME を設定する必要があります。操作は次のとおりです。 [root@xuegod63 local]# vim /etc/profile.d/mycat.sh #/etc/profile.d ディレクトリに mycat.sh ファイルを作成し、次のように記述します。 MYCAT_HOME=/usr/local/mycat PATH=$MYCAT_HOME/bin:$PATH [root@xuegod63 local]# source /etc/profile.d/mycat.sh #環境変数を有効にする MyCAT クラスターが複数の Linux システム上に構築されている場合は、MyCAT サーバーが配置されているサーバー上の他の IP アドレスとホスト名のマッピングを構成する必要があります。構成は次のとおりです。 vi /etc/hosts たとえば、次の構成のマシンが 3 台あります: IP ホスト名: 192.168.1.63 suegod63.cn より 192.168.1.64 suegod64.cn より 192.168.1.65 suegod65.cn より 編集後、ファイルを保存します。 mycatのユーザーアカウントと認証情報はconf/server.xmlファイルで設定されます。 [root@xuegod63 ローカル]# vim /usr/local/mycat/conf/server.xml <?xml バージョン="1.0" エンコーディング="UTF-8"?> <!DOCTYPE mycat:server SYSTEM "server.dtd"> <mycat:server xmlns:mycat="http://org.opencloudb/"> <システム> <property name="defaultSqlParser">ドルイドパーサー</property> </システム> <!--次の設定は、アプリケーション アクセス アカウントの権限に関するものです--> 行 34 <user name="root"> #管理者ユーザー、つまりMycatに接続するためのユーザー名を定義します <property name="password">123456</property> #パスワード <property name="schemas">ha</property> #スキーマ構成ファイルに対応する論理ライブラリを定義します </user> <!--次の設定は読み取り専用アカウント権限に適用されます--> <ユーザー名="ユーザー"> <property name="password">ユーザー</property> <property name="schemas">は</property> <プロパティ名="readOnly">true</プロパティ> </ユーザー> </mycat:サーバー> MyCAT 構成ファイル schema.xml を編集します。dataHost に関する構成情報は次のとおりです。 [root@xuegod63 ローカル]# mv /usr/local/mycat/conf/schema.xml /usr/local/mycat/conf/schema.xml.bak #元のファイルをバックアップします。 [root@xuegod63 local]# vim /usr/local/mycat/conf/schema.xml <?xml version="1.0"?> を作成します。 <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> < mycat:スキーマxmlns:mycat="http://org.opencloudb/"> <スキーマ名="ha" checkSQLschema="false" sqlMaxLimit="100" データノード='dn1'> </スキーマ> <データノード名="dn1" データホスト="dthost" データベース="ha"/> <データホスト名="dthost" 最大コン="500" 最小コン="10" 残高="1" writeType="0" dbType="mysql" dbDriver="native" switchType="-1" スレーブしきい値="100"> <ハートビート> ユーザーを選択()</ハートビート> < writeHostホスト="xuegod64.cn" url="192.168.1.64:3306" ユーザー="mycat" パスワード="123456"> </writeHost> < writeHostホスト="xuegod65.cn" url="192.168.1.65:3306" ユーザー="mycat" パスワード="123456"> </writeHost> </データホスト> </ mycat:スキーマ> 緑は物理的に存在するデータベースの名前です。注:スキーマタグは、MyCat インスタンス内の論理ライブラリを定義するために使用されます。Name: の後には論理ライブラリ名が続きます。MyCat には複数の論理ライブラリが存在する可能性があり、各論理ライブラリには独自の関連構成があります。スキーマ タグを使用して、これらの異なる論理ライブラリを分割できます。 checkSQLschema 属性はデフォルトでは false です。公式ドキュメントでは、テーブルの前のデータベース名を削除するかどうか、「select * from db1.testtable」を意味します。true に設定すると、db1 が削除されます。ただし、db1 の名前がスキーマの名前でない場合は削除されないため、この構文を使用しないことが公式に推奨されています。デフォルトでは false に設定されています。 sqlMaxLimit 値が特定の数値に設定されている場合。実行される各 SQL ステートメントに対して、制限ステートメントがない場合、MyCat は対応する値を自動的に追加します。たとえば、値を 100 に設定して「select * from test_table」を実行すると、結果は「select * from test_table limit 100」になります。 dataNode タグは、MyCat 内のデータ ノード (通常はデータ シャードと呼ばれる) を定義します。データノードラベルは独立したデータシャードである 。 writeHost タグと readHost タグはどちらもバックエンド データベースの構成を指定し、バックエンド接続プールをインスタンス化するために使用されます。唯一の違いは、writeHost が書き込みインスタンスを指定し、readHost が読み取りインスタンスを指定することです。 1 つの dataHost に複数の writeHost と readHost を定義できます。ただし、writeHost で指定されたバックエンド データベースがダウンした場合、この writeHost にバインドされているすべての readHost は使用できなくなります。一方、この writeHost はダウンしているため、システムはそれを自動的に検出し、バックアップ writeHost に切り替えます。これら2つのタグの属性は同じです 注意すべきパラメーターは、balance と switchType の 2 つです。このうち、 balance は負荷分散タイプを指し、現在は 4 つの値があります。 (2)balance="0"の場合、読み取り書き込み分離メカニズムは有効にならず、すべての読み取り操作は現在利用可能なwriteHostに送信されます。 switchType はスイッチング モードを指し、現在可能な値は 4 つあります。 (1)switchType='-1'は自動切り替えがないことを意味する。 上記の 2 つの手順が完了したら、/usr/local/mycat/bin ディレクトリに移動し、./mycat start を実行して mycat サービスを開始できます。 [root@xuegod63 local]# /usr/local/mycat/bin/mycat 開始 [root@xuegod63 ~]# cat /usr/local/mycat/logs/wrapper.log #ログを表示して正常に起動します 4. MySQLマスタースレーブを設定するmysqlをインストールし、mysql-5.7.tar.gzをxuegod64にアップロードします。 [root@xuegod64 ~]# systemctl でmysqldを起動します [root@xuegod64 ~]# echo "validate-password=OFF">> /etc/my.cnf [root@xuegod64 ~]# systemctl mysqldを再起動します パスワード強度監査プラグインを無効にする [root@xuegod64 ~]# systemctl でmysqldを起動します [root@xuegod64 ~]# echo "validate-password=OFF">> /etc/my.cnf [root@xuegod64 ~]# systemctl mysqldを再起動します ルートユーザーのパスワードを変更する [root@xuegod64 ~]# grep "パスワード" /var/log/mysqld.log [root@xuegod64 ~]# mysql -uroot -p'-NEjo1gbPllh' mysql> root@localhost のパスワードを設定します = password('123456'); mysql>終了 別のマシン [root@xuegod65 ~]# tar xf mysql-5.7.tar.gz [root@xuegod65 ~]# yum install -y ./mysql*.rpm パスワード強度監査プラグインを無効にする [root@xuegod65 ~]# systemctl でmysqldを起動します [root@xuegod65 ~]# echo "validate-password=OFF">> /etc/my.cnf [root@xuegod65 ~]# systemctl mysqldを再起動します ルートユーザーのパスワードを変更する [root@xuegod65~]# grep "パスワード" /var/log/mysqld.log [root@xuegod65 ~]# mysql -uroot -p'%OrrfGwyM6tS' mysql> root@localhost のパスワードを設定します = password('123456'); mysql>終了 データベースとテストデータを作成する [root@xuegod64 ~]# mysql -uroot -p123456 mysql> データベース ha を作成します。 mysql> ha を使用します。 mysql> テーブル test(id int,name varchar(20)) を作成します。 mysql> テスト値に挿入(1,'man'); [root@xuegod64 ~]# mysqldump -uroot -p123456 -B ha >HA.sql #データベースをエクスポートできます エクスポートしたデータベースをスレーブサーバーに転送する [root@xuegod64 ~]# scp HA.sql [email protected]:/root/ xuegod65 はサービスから操作します: 読み取り操作のためにデータベースとテーブルをインポートします: [root@xuegod65 ~]# mysql -uroot -p123456<HA.sql [root@xuegod64 ~]# vim /etc/my.cnf log-bin=mysql-bin-master #バイナリログを有効にする server-id=1 #ローカルデータベースIDマーク binlog-do-db=ha #サーバーからコピーできるリポジトリ、同期する必要があるバイナリデータベース名 binlog-ignore-db=mysql #サーバーからコピーできないリポジトリ [root@xuegod64 ~]# systemctl restart mysqld [root@xuegod64 ~]# mysql -uroot -p'123456' mycatがデータベースアカウントとマスタースレーブレプリケーションアカウントにログインすることを許可する mysql> 'mycat'@"%" IDENTIFIED BY "123456" に *.* のすべての権限を付与します。 mysql> *.* 上のレプリケーションスレーブを、"123456" で識別される slave@"192.168.1.%" に付与します。 mysql>終了 [root@xuegod65 ~]# vim /etc/my.cnf log-bin=mysql-bin-slave #バイナリログを有効にする server-id=2 #ローカルデータベースIDマーク binlog-do-db=ha #サーバーからコピーできるリポジトリ、同期する必要があるバイナリデータベース名 binlog-ignore-db=mysql #サーバーからコピーできないリポジトリ [root@xuegod65 ~]# systemctl restart mysqld [root@xuegod65 ~]# mysql -uroot -p'123456' mycatがデータベースアカウントとマスタースレーブレプリケーションアカウントにログインすることを許可する mysql> 'mycat'@"%" IDENTIFIED BY "123456" に *.* のすべての権限を付与します。 mysql> *.* 上のレプリケーションスレーブを、"123456" で識別される slave@"192.168.1.%" に付与します。 mysql>マスターを次のように変更します マスターホスト='192.168.1.64'、マスターユーザー='スレーブ'、マスターパスワード='123456'; mysql> start slave; #スレーブを起動 mysql> show slave status\G #ステータスを確認します。2 つの yes があります。マスターとスレーブの同期が成功しました。 mysql>終了 スレーブ障害をシミュレート: スレーブサーバーがダウンしています [root@xuegod65 ~]# systemctl を停止 mysqld クライアント上での読み取りと書き込みのテスト [root@xuegod63 ~]# mysql -uroot -p123456 -h 192.168.1.63 -P8066 mysql> ha を使用します。 mysql> テストから * を選択します。 これは、読み取り操作ルートがマスターに切り替えられ、外部への影響がないことを意味します。 [root@xuegod65 ~]# systemctl でmysqldを起動します マスター障害をシミュレートする: マスターサーバーがダウンしている [root@xuegod64 ~]# systemctl を停止 mysqld クライアント上での読み取りと書き込みをテストする [root@xuegod63 ~]# mysql -uroot -p123456 -h 192.168.1.63 -P8066 mysql> ha を使用します。 mysql> テーブル test1(id int) を作成します。 エラー 1184 (HY000): 接続が拒否されました #マスター データベースがダウンしているため、書き込み操作はできませんが、読み取りには影響はありません。 mysql> テストから * を選択します。 [root@xuegod64 ~]# systemctl でmysqldを起動します 読み取り専用ユーザーログインテスト mysql -u ユーザー -puser -h 192.168.1.201 -P8066 mysql> テスト値に挿入(5,'feng'); エラー 1495 (HY000): ユーザーは読み取り専用です mysql> ha.test から * を選択します。 +------+--------+ | ID | 名前 | +------+--------+ | 1 | CD | 5. 実際のノードがクラッシュしたら、スレーブノードに自動的に切り替えるMMモードのマスタースレーブレプリケーション環境を構成して、65を64のマスターとして有効にします。 [root@xuegod64 ~]# mysql -uroot -p'123456' mysql>マスターを次のように変更します マスターホスト='192.168.1.65'、マスターユーザー='スレーブ'、マスターパスワード='123456'; mysql> start slave; #スレーブを起動 mysql> show slave status\G #ステータスを確認します。2 つの yes があります。マスターとスレーブの同期が成功しました。 mysql>終了 1. mycat設定ファイルを最適化して調整する[root@xuegod63 ~]# vim /usr/local/mycat/conf/schema.xml <?xml バージョン="1.0"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:スキーマ xmlns:mycat="http://org.opencloudb/"> <スキーマ名="ha" checkSQLschema="false" sqlMaxLimit="100" データノード='dn1'> </スキーマ> <dataNode 名="dn1" データホスト="dthost" データベース="ha"/> <dataHost name="dthost" maxCon="500" minCon="10" バランス="1" writeType="0" dbType="mysql" dbDriver="ネイティブ" switchType="1" スレーブしきい値="100"> <heartbeat>ユーザーを選択()</heartbeat> <writeHost ホスト="xuegod64.cn" url="192.168.1.64:3306" ユーザー="mycat" パスワード="123456"> </writeHost> <writeHost ホスト="xuegod65.cn" url="192.168.1.65:3306" ユーザー="mycat" パスワード="123456"> </writeHost> </データホスト> </mycat:スキーマ> 以前は、自動切り替えをオフにするために switchType="-1" を設定していましたが、マスタースレーブ環境ではスレーブノードにデータを書き込まないようにする必要があります。そうしないと、マスターデータベースとスレーブデータベースの間に不整合が発生します。 MM モードを使用すると、障害発生後にマスターノードは自動的にバックアップノードに切り替わり、データの書き込みには影響しません。 [root@xuegod63 ~]# /usr/local/mycat/bin/mycat を再起動します [root@xuegod64 ~]# systemctl を停止 mysqld [root@xuegod63 ~]# mysql -uroot -p123456 -h 192.168.1.63 -P8066 MySQL [(なし)]> ha.test に値を挿入します(666,'mk'); MySQL [(なし)]> ha.testから*を選択します。 +------+---------+ | ID | 名前 | +------+---------+ | 1 | 男性 | | 666 | ミリ | 2. マスターノードを停止します。[root@xuegod64 ~]# systemctl を停止 mysqld Mycat は挿入を続行します。mysql> insert into test values(5,'feng'); 3. マスターノードを復元します。[root@xuegod64 ~]# systemctl でmysqldを起動します mysql -uroot -p123456 ha.test から * を選択します。 使用方法の提案については、一部の CMS (コンテンツ管理システム) システムでは、基礎となるデータベース コードがカプセル化されています。カプセル化された SQL ステートメントは mycat と互換性がないため、現時点では mycat を使用することはお勧めできません。プログラムを開発する際には、MySQL への接続方法が mycat と互換性があるかどうかを検討することをお勧めします。または、mysql-proxy などの他のミドルウェアを選択します。 上記は、Linux が MyCat を使用して MySQL マスター/スレーブの読み取り/書き込み分離を実現する方法の詳細です。Linux MySQL の詳細については、123WORDPRESS.COM の他の関連記事に注目してください。 以下もご興味があるかもしれません:
|
<<: element-plus でオンデマンドインポートとグローバルインポートを実装する方法
>>: 両端揃えレイアウトを実現する CSS 列のサンプルコード
1. Reactでクラス宣言する際のヒント 上記のように、Child クラスは class キーワー...
私たち、特に Linux エンジニアは毎日 Linux サーバーを扱っています。サーバーのセキュリテ...
序文開発プロセスでは、10 進データ型がよく使用されます。 MySQL では、小数点は正確なデータ型...
MySQL を自分でインストールするのに 3 時間かかりました。チュートリアルはたくさんあるにもかか...
Nginx におけるいわゆる接続制限は、実際には TCP 接続、つまり 3 ウェイ ハンドシェイク後...
事前に言っておくDocker を使用すると非常にシンプルなデプロイメント環境を実現できることは誰もが...
コードを画像に変換するにはhtml2canvas は、ブラウザから Web ページのスクリーンショッ...
この記事では、Web ページのリンクを美しくするためによく使用される書き換えルールをいくつか紹介しま...
1. mysqldump バックアップ方法では論理バックアップが使用されます。最大の欠点は、バック...
具体的な方法:まずコマンドプロンプトを開きます。次に、[ mysql -u root -p ] コマ...
コンテキストの定義と目的コンテキストは、コンポーネント ツリーにプロパティを明示的に渡すことなく、コ...
1. 自動フロー属性、要素コンテンツの長さと幅が要素自体の長さと幅を超える場合、スクロールバーが表示...
ビジネスシナリオ: 訪問者の訪問状況を記録する必要があるが、繰り返し記録することはできない挿入する前...
この記事では、ネイティブ JS によって実装された動的読み込みプログレス バーの特殊効果を紹介します...
Msyqlデータベースのインストール、参考までに具体的な内容は次のとおりです。 ①ブラウザでhttp...