InnoDBクラスター-動作し、約束どおりのようです

私はATCをします。 そして、どういうわけか最初の注文から、彼らは私にフォールトトレランスを求めていました。 現代の電話交換の重要なコンポーネントの1つは(おそらく情報システムと同様に)データベースであり、システムの現在の状態に関するデータと構成パラメーターの両方を格納します。 当然、データベースのクラッシュはシステム全体の故障につながります。 それはすべて、MySQLでのMASTER-MASTERレプリケーションから始まり(切り替え効率のためだけ)、DRBDを介したMySQLでの実験がありました。 これらはすべてペースメーカー/ corosyncインフラストラクチャにありました。 IPアドレス、ゲートウェイ、その他のがらくたがありました。 時間が経つにつれて、多少なりとも安定して動作し始めました。 しかし、ここでDRBDを実行できなかったいくつかのサーバーに出くわしました。MASTER-MASTERで私は長い間失望し(レプリケーションが絶えず壊れていました)、フォールトトレラントデータベースがなければ、ソリューションのポイントはすべて失われました。 InnoDBクラスターという名前が私の目に浮かび、私は「わからない」と決めました。 それの由来-カットの下を見てください。


私はDebian Jessieですべてをします。 他のシステムでは違いがありますが、それほど重要ではありません。


必要なもの:



ダウンロード(これは、Oracle Webサイトに登録することで手動でのみ行うことができます)、リポジトリファイルのインストール、キャッシュの更新、MySQLルーター(興味深い獣、以下を参照)およびMySQLクライアントのインストール:


dpkg -i mysql-apt-config_0.8.6-1_all.deb apt-get update apt-get install mysql-router apt-get install mysql-client 

アーカイブからMySQL Shellを解凍してソートします。 次に、サーバーを設定します。


 apt-get install mysql-server 

ここで、提案されたすべてのコンポーネントをインストールします(リストの3番目のコンポーネントはデフォルトでは選択されていませんが、必要になります)。 そして、熱心なインストーラーによって起動されたサーバーをすぐに停止します。


 systemctl stop mysql 

次に、に行きます
/etc/mysql/mysql.conf.d/mysqld.cnfを作成し、次のように記述します。


 [mysqld] pid-file = /var/run/mysqld/mysqld.pid socket = /var/run/mysqld/mysqld.sock datadir = /var/lib/mysql log-error = /var/log/mysql/error.log bind-address = 0.0.0.0 port = 3300 symbolic-links=0 # Replication part server_id=3 gtid_mode=ON enforce_gtid_consistency=ON master_info_repository=TABLE relay_log_info_repository=TABLE binlog_checksum=NONE log_slave_updates=ON log_bin=binlog binlog_format=ROW # Group replication part transaction_write_set_extraction=XXHASH64 loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa" loose-group_replication_start_on_boot=off loose-group_replication_local_address= "1.1.1.1:33061" loose-group_replication_group_seeds= "1.1.1.1:33061,1.1.1.2:33061,1.1.1.3:33061" loose-group_replication_bootstrap_group= off 

すでにもっと詳しく説明する必要があります。


注目に値する最初のオプションはポートです。値を3306以外に設定することをお勧めします。理由-以下で明らかになります(3306で何か他のものをハングアップします)


次: server_id 。 クラスター内のmysqlサーバーごとに、この値は一意である必要があります。


私の時間の数時間を食べたオプションは無害な(一見) group_replication_local_addressです。 このオプションは、ローカルデータベースからのレプリカの呼び出しをリッスンするアドレス/ポートを指示します。 このフィールドで指定されたIPアドレスがローカルであるかどうかをMySQLが判断するアルゴリズムは、推測できませんでした。 2つのアクティブなインターフェイスとこれらのインターフェイスで中断された3つのIPアドレスを持つマシンでは、MySQLによって1つのアドレスのみがセットアップされました。


最後の1つはgroup_replication_group_seeds-接続時に実際のデータのレプリカを順序付けようとして、アクセスする必要があるソケットを(指定された順序で)リストします。


詳細については、公式のGROUP REPLICATIONドキュメントページを参照してください。


したがって、MySQLをマシンにデプロイし、この方法でセットアップして、先に進みます。 /var/lib/mysqlすべてのコンテンツを削除します。 私たちは一緒になって、行って削除しました。 メモリとしてあなたにとって大切な何かがある場合-最初にバックアップを作成します。 できます。 mysqlを開始します。


 systemctl start mysql 

一般に、すべての準備操作は完了しています。 説明した手順は、クラスターに結合する予定のすべてのサーバーで繰り返す必要があります。


最初のサーバーの機能が追加されました。 まず、ルートを宣言します:


 mysql > create user 'root'@'%' identified by 'ochen-strashniy-parol'; > grant all to 'root'@'%' on *.* with grant option; > flush privileges; > \q 

知っている、知っている、知っている...秘密ではない。 しかし、 ドキュメントで指定されている特権のセットは信頼できず(チェック:動作しません)、ローカルホストからも動作しません。 次回は個々のユーザーを割り当てるより正確なオプションです。これは、「その時間のナトネニア」になるからです。


次に、モジュールXをロードします。正直なところ、彼の名前は次のとおりです。


 mysqlsh --classic --dba enableXProtocol 

そしてその瞬間、ファッションズボンは回って...回って...エレガントなショートパンツに変わります。 つまり、MySQLはもはや完全なSQLではなく、 ドキュメントストアですらあります


しかし、これは私たちを混乱させないので、次に進みます:


 mysqlsh 

JavaScriptでMySQLと通信できるようになりました。 まず、サーバーに接続します。


 \c root@1.1.1.1:3300 

パスワードを入力し、サーバーにすべての構成が正しいかどうか、その構成がクラスタリングに適しているかどうかを確認します。


 dba.checkInstanceConfiguration('root@1.1.1.1:3300') 

すべてが指示に従って完了したら、質問はありません。 質問がある場合は、 ドックを修正してお手伝いします。 原則として、設定を自分で生成する機会さえあります。


 dba.configureLocalInstance('localhost:3300', {password:'somePwd', mycnfPath:'some path'}) 

ただし、このオプションはすぐには機能しませんでした。メモの冒頭で指定した状態にファイルを構成する必要がありました。 当然、設定をコピーするたびに、サーバーを再起動する必要があります。 たとえば、 systemctl restart mysqを使用します。 まあ、またはあなたがもっと好きなように...
クラスターを作成します(まだmysqlshにいて、セッションが終了していないと仮定します):


 var cl = dba.createCluster('moyCluster') 

さて、それに設定したサーバーを追加してください:


 cl.addInstance('root@1.1.1.1:3300') 

これからは、別のコンソールに保管することをお勧めします


 tail -f /var/log/mysql/error.log 

エラーが表示されたら、そこを見てください。 mysqlshからの出力はあまり有益ではありませんが、ログには必要なものがすべて含まれています。 ドックは、デバッグ出力レベルを上げることができると言っていますが、私は試していません。


これまでにエラーが観察されなかった場合、1台のマシンのクラスターがあります。
このサーバーでの最後の操作:


 mysqldump --all-databases --triggers --routines --events > dump.sql 

それでは、残りを処理しましょう。 これを行うには、すべてのマシンで、記事の最初から説明されている操作を繰り返します。


 systemctl start mysql 

server_idおよびgroup_replication_local_address値を修正することを忘れないでください。 その後:


 mysql > reset master; mysql < dump.sql 

はい、はい、クラスターで動作しているサーバーからマシンにダンプを入力します。 ここで、ローカルマシン (mysql-serverインスタンスが実行されているクラスターからクラスターに接続します)から、次の操作を行います。


 mysql > set GLOBAL group_replication_allow_local_disjoint_gtids_join=ON; mysqlsh > dba.checkInstanceConfiguration('root@1.1.1.2:3300') > \c root@1.1.1.1:3300 > var cl = getCluster('moyCluster') > cl.addInstance('root@1.1.1.2:3300',{ipWhitelist: '1.1.1.0/24, 127.0.0.1/8'}) 

何も混同しなかった場合、その時点でクラスター内にすでに2台のマシンがあります。 同様に3番目を追加します。


現時点では、自分自身の世話をし、マスターを選択し、スレーブに複製するクラスターがあります。 各サーバーにはポート3300でアクセスでき、ウィザードにアクセスすると読み取りと書き込みが可能になり、スレーブにアクセスすると読み取りのみが可能になります。 マスターがサーバーであるかスレーブであるかを調べるには、cluster.status()の出力を使用します。 しかし、まだあまり便利ではありません。 私は常に同じ場所に行き、同じIP /ポートに行きたいと思っています。クラスタの内部状態に依存しません。 これを行うには、 MySQLルーターを使用しますドックには、初期設定の例があり、必要なほぼすべてを実行します。 少し変更します。


 mysqlrouter --bootstrap 1.1.1.1:3300 --user mysqlrouter 

ここで/etc/mysqlrouter/mysqlrouter.confに移動し、そこにあるポートを次のように修正します。


 [routing:moyCluster_default_rw] ... bind_port=3306 ... [routing:moyCluster_default_ro] ... bind_port=3307 ... 

その後、あなたはできる


 systemctl start mysqlrouter 

そして今、3306ポートで、通常のmysqlは、どのクラスターマシンがマスターになり、どのクラスターマシンがスレーブになるかに関係なく、読み取り/書き込みサポートで応答します。 3307-常に読み取り専用。 mysqlrouterインスタンスの数はまったく制限されていません。各クライアントマシンでインスタンスを実行し、内部インターフェイス127.0.0.1 {306。 mysqlrouter自体は、クラスター内の変更(ノードの追加と欠落の両方)を監視し、ルーティングを更新します。 これは5分ごとに発生します(ログによる)。 この間隔で処理できないアピールが発生した場合(ノードがドロップアウトしたか、クラスターから意図的に撤回された場合)、ルーターはトランザクションの実行を拒否し、異常な順序でクラスターステータスを再読み取りします。


ちなみに、何らかの理由でノードがクラスターから落ちた場合は、コマンドでファミリーに戻すことができます


 mysqlsh > \c root@<ip:port-_> > var cl = dba.getCluster('moyCluster') > cl.rejoinInstance('root@ip:port-_') 

読んでくれてありがとう。 これが役に立てば幸いです。 テキストの不正確さに気付いた場合-コメントを書いて、私はそれをホットに書いたが、記憶から、それを間違えるかもしれない。



Source: https://habr.com/ru/post/J332518/


All Articles