corosyncでのタイムアウト設定オプション
corosyncでは、heartbeatとは異なるプロトコルで各ノードと通信を行っていますので、当然ながら各オプションについても全く異なっております。今回は、タイムアウトを規程するオプションが何かについて書きたいと思います。
タイムアウトを決めているオプションは?
結論を最初に書いてしまいますと、主にtokenとconsensusが効いてます。
tokenこのタイムアウト値は直接、また実際のトークンのタイムアウト計算で使用されますトークンを受信できない場合に、それを宣言するまでの時間をミリ秒で指定します。consensus新しいメンバーシップ構成のラウンドを開始する前に、コンセンサス(合意)を得るために待つ時間をミリ秒単位で指定します。コンセンサスの最小値は1.2*トークンでなければなりません。
本当に?
manページを見るとたくさんオプションがあり、token_retransmits_before_loss_constとかmergeとかもタイムアウトに関係していそうに見えますが、どうなのでしょうか。
token_retransmits_before_loss_const新しい構成を形成するまでに、何回トークンの再送を試みるか指定します。この値をセットすると、retransmitとholdが、retransmits_before_lossとtokenから自動的に算出されます。mergeマルチキャストの通信が行われていない時に、パーティションのチェックを行うまでに待つ時間をミリ秒単位で指定します。マルチキャスト通信が送信されれば、プロトコルの機能としてマージ検知が発生します。
測ってみました
環境はCentOS 7.1、corosync2.3.4で、VirtualBox内のユニキャスト通信の2ノードクラスタです。一方のノードの通信用ネットワークを切断してから、他方のノードが切断されたノードをオフラインだと宣言するまでを、ログの出力から調べます。
まず、tokenのみを1000,4000,10000と増やしていく場合を、token_retransmits_before_loss_constが2の場合と6の場合について調べました。
token | 1000 | 4000 | 10000 | 1000 | 4000 | 10000 |
token_retransmits_before_loss_const | 2 | 2 | 2 | 6 | 6 | 6 |
consensus | 2400 | 2400 | 2400 | 2400 | 2400 | 2400 |
merge | 200 | 200 | 200 | 200 | 200 | 200 |
切断からオフライン宣言までの時間 | 1秒 | 4秒 | 9秒 | 2秒 | 4秒 | 10秒 |
tokenを増やせばタイムアウト時間が増える事が分かります。一方でtoken_retransmits_before_loss_constが2の場合と6の場合では、ほぼ同じに見えます。(ログからは1秒未満の時間は分かりません)
よく分かりませんので、token_retransmits_before_loss_constを変化させて調べてみました。
token | 6000 | 6000 | 6000 | 6000 | 6000 | 6000 | 6000 | 6000 |
token_retransmits_before_loss_const | 1 | 2 | 3 | 4 | 5 | 6 | 20 | 100 |
consensus | 7200 | 7200 | 7200 | 7200 | 7200 | 7200 | 7200 | 7200 |
merge | 200 | 200 | 200 | 200 | 200 | 200 | 200 | 200 |
切断からオフライン宣言までの時間 | 11秒 | 11秒 | 11秒 | 10秒 | 11秒 | 12秒 | 12秒 | 12秒 |
最後は思いきって増やしてしまいましたが、ほとんど変わっていません。token_retransmits_before_loss_constを変えてもタイムアウトにはあまり影響しないといってよいかと思います。
では、次にconsensusを調べてみます。
token | 1000 | 1000 | 1000 | 1000 | 1000 |
token_retransmits_before_loss_const | 4 | 4 | 4 | 4 | 4 |
consensus | 600 | 1200 | 2400 | 4800 | 9600 |
merge | 200 | 200 | 200 | 200 | 200 |
切断からオフライン宣言までの時間 | 1秒 | 2秒 | 3秒 | 5秒 | 10秒 |
consensusを増やすと、それに応じてタイムアウト時間も増えていきました。
最後にmergeです。
token | 1000 | 1000 | 1000 | 1000 | 1000 |
token_retransmits_before_loss_const | 4 | 4 | 4 | 4 | 4 |
consensus | 2400 | 2400 | 2400 | 2400 | 2400 |
merge | 200 | 600 | 1000 | 2000 | 10000 |
切断からオフライン宣言までの時間 | 3秒 | 3秒 | 2秒 | 3秒 | 3秒 |
mergeを増やしていってもタイムアウト時間は変わらないようです。
という事で、タイムアウト時間についてはtoken_retransmits_before_loss_constやmergeによって左右されず、tokenとconsensusを調節すれば変化するという事が分かります。