Etcdは何ですか?
etcdは、分散システムまたはマシングループへのアクセスが必要とするデータを格納するための信頼できる方法を提供する分散キー値ストアの強い一貫性です。それは優雅に選挙時にネットワークパーティションのリーダーを処理し、機械の故障であってもリーダーノードで、許容することができます。Kubernetesに簡単なWebアプリケーションから、任意の複雑なアプリケーションでは、データetcdを読み書きすることができます。これは、これらの特性に基づいてEtcdの公式の説明で、Etcdは、一般的に、分散構成で使用される分散ロック、分散サービスコーディネーターと分散登録。機能的には、と飼育係はクラスのプロジェクトですが、etcdの面で、より現代的に比較し、etcd使用言語の開発を行って、コンパイル済みの実行可能なバイナリシステムは維持するために、クロスプラットフォームより良いと簡単に、エピジェネティックな製品となりました。etcd直接、独自の言語の主要なクライアントSDKをパッケージ化するのは非常に簡単、使いやすさも少し良くインタフェースであるHTTP。以下は、主にコーディネーション問題スタンバイサービスを解決するために、Javaクライアントjetcdを使用しています。
スタンバイサービスシナリオを説明した
主なサービスに障害が発生している間、バックアップサービスが上にすぐにできるように、サービスの可用性のために多くの時間を、メインサービス外の仕事に加えて、また、いくつかの代替サービスを有効にする必要があります。このシーンは、唯一のマスター・サービスがあることができ、同時に、非常に明白な特徴を持っています。などのMySQLマスタースレーブの切り替えなど、一般的な、データを書き込むための責任同時に一つだけmsyql。ここに私たちのシナリオではbinlogの解決サービス、リアルタイム分析のbinlogのmysqlの、解像度を消費するFLINKジョブデータがあるカフカ消費者側にカフカに解析されたデータを渡すがあることです。これらのデータは、最終的には業務データの基盤を提供するために、システムに台中、台湾のデータを下げます。多くのオンラインデータサービスのクエリは、上のデータソースのbinlog解析され、そのサービスは、アーキテクチャの単一障害点BINLOG解決できないだけで、マルチマスタモードにより調製することができる、主要なサービスが失敗し、リアルタイムでのスタンバイサービス。一方binlogのサービスがより同時に解決することはできません。したがって、このシナリオが良くなることができませんでしたショットのアーキテクチャを呼び出すことがetcd準備使用しています。
jetcd実現
まず導入jetcd依存
<依存>
<groupIdを> io.etcd </ groupIdを>
<たartifactId> jetcdコア</たartifactId>
<バージョン> 0.3.0 </バージョン>
</依存関係>
初期化クライアント
クライアントクライアント= Client.builder ().endpoints(
"http://127.0.0.1:2379"、
"http://127.0.0.1:3379"、
"http://127.0.0.1:4379"
).build();
キーAPI導入
ロック= client.getLockClientロック();
リースリースclient.getLeaseClient =();
リースグラントを提供し、2つの主要な方法グラント(長いTTL)、キープアライブは(存在する、請求リース保持方法を、取り消します)。あなたはリースの値を持つキーを作成した場合、つまり、リース、時間のパラメータのリースを付与するための付与、TTLの秒後にIDをリースに戻り、自動的に削除します。リースが期限切れになる場合には、有効なリースを維持するためのキープアライブ()メソッドは、すなわち、キープアライブは、自動的にTTL時間を更新します。
ロックは二つの方法、ロック(ByteSequence名、長いleaseIdあり ) とアンロック(ByteSequence lockKeyを)。ロックされたときにロック機能が達成される分散、前記更新する基準オブジェクトID leaseidに、すなわち、ロックの保持時間は定義され
、このリースによって、およびロック機能は、アクティブおよびスタンバイサービスを切り替えることが容易です。次のようにキーコードがある:
ByteSequence lockKey = ByteSequence.from( "/ルート/ロック"、StandardCharsets.UTF_8);
ロックロックclient.getLockClient =();
リースリースclient.getLeaseClient =();
ロングleaseId = lease.grant(lockTTl) 。に.get()のgetId();
lease.keepAlive(leaseId、新しい新しいStreamObserver <LeaseKeepAliveResponse>(){
@Override
公共ボイドOnNext(LeaseKeepAliveResponse値){
System.err.println(www.yisheng3yuL.com "LeaseKeepAliveResponse値:" + value.getTTL());
}
@Override
公共ボイドのonError(Throwableをwww.leyouzaixan.cn){t.printStackTrace()。
@Override
公共ボイドOnCompleted(){}
});
Lock.lock(lockKey、leaseId)に.get(www.zbzxyL12.com).getKey();
秒leaseId取得された第1のグラント契約、請求lockttl 1を適用します、etcdリースは、第二級です。ここではTTL設定を使用すると、サービスと上から認識を作りたいどのくらいの速メインサービス障害、時間に応じて、豪華です。もちろん、リース自体etcd秒の限界、最速のわずか1秒に従います。
次に、アプリケーションが自動的にまだ生きて更新されます限り、生き続けるleaseidする助成金を作るためにキープアライブ方法を呼び出し
、その後leaseidを渡し、ロックメソッドを呼び出します。唯一のサービスの最初のスタートは、ロックになりますが、また、運転中に、契約していきます。サービスはここから実行すると、ライブブロックすることができた場合。これは、複数のサービスを同時に実行していることを保証するであろう、サービス作業の唯一の真の目的があります。主なサービスのロックへのアクセスの問題が表示されたら、元の契約は1秒以内にのみロックを期限切れになり、それはすぐにするコードの実装をロックサービスから取得する
テスト完了
/ **
* @author:KLを@ kailing.pub
* @date:2019年7月22日
* /
publicクラスJEtcdTest {
プライベート・クライアントクライアント、
プライベートロックロック、
プライベートリースリース;
//単位:秒
プライベート長いlockTTl = www.chaoyuepint.com 1。
プライベートByteSequence lockKey = ByteSequence.from( "/ルート/ロック"、StandardCharsets.UTF_8)。
プライベートScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(2)。
@Before
公共ボイドのsetUp(){
クライアント= Client.builder()。エンドポイント(
"http://127.0.0.1:2379"、
"http://127.0.0.1:3379"、
「http://127.0.0.1 :4379"
).build();
ロック= client.getLockClient()。
リース= client.getLeaseClient()。
}
@Test
公共ボイドlockTest1toMaster()InterruptedExceptionある、ExecutionException {スロー
長いleaseId = lease.grant(lockTTl)に.get()のgetIdを()。
lease.keepAlive(leaseId、新しいStreamObserver <LeaseKeepAliveResponse>(){
@Override
公共ボイドonNext(LeaseKeepAliveResponse値){
System.err.println( "LeaseKeepAliveResponse値:" + value.getTTL());
}
@Override
公共ボイドのonError(スロー可能なT){
t.printStackTrace();
}
@Override
onCompleted公共ボイド(){
}
})。
lock.lock(lockKey、leaseId)に.get()のgetKey()。
scheduledThreadPool.submit(() - > {
一方(TRUE){
System.err.println( "我是主服务开始工作了");
TimeUnit.SECONDS.sleep(1);
}
})。
TimeUnit.DAYS.sleep(1)。
}
@Test
公共ボイドlockTest2toStandby()InterruptedExceptionある、ExecutionException {スロー
長いleaseId = lease.grant(lockTTl)に.get()のgetIdを()。
lease.keepAlive(leaseId、新しいStreamObserver <LeaseKeepAliveResponse>(){
@Override
公共ボイドonNext(LeaseKeepAliveResponse値){
System.err.println( "LeaseKeepAliveResponse値:" + value.getTTL());
}
@Override
公共ボイドのonError(スロー可能なT){
t.printStackTrace();
}
@Override
onCompleted公共ボイド(){
}
})。
lock.lock(lockKey、leaseId)に.get()のgetKey()。
scheduledThreadPool.submit(() - > {
一方(TRUE){
System.err.println( "我是备用服务、我开始工作了、估计主服务已经挂了")。
TimeUnit.SECONDS.sleep(1)。
}
})。
TimeUnit.DAYS.sleep(1)。
}
@Test
公共ボイドlockTest3toStandby()InterruptedExceptionある、ExecutionExceptionをスロー{
長いleaseId = lease.grant(lockTTl)に.get()のgetId()。
lease.keepAlive(leaseId、新しいStreamObserver <LeaseKeepAliveResponse>(){
@Override
公共ボイドonNext(LeaseKeepAliveResponse値){
System.err.println( "LeaseKeepAliveResponse値:" + value.getTTL());
}
@Override
公共ボイドのonError(スロー可能なT){
t.printStackTrace();
}
@Override
onCompleted公共ボイド(){
}
})。
。Lock.lock(lockKey、leaseId)に.get()のgetKey();
scheduledThreadPool.submit(() - > {
ながら、(真の){
System.err.printlnは、(「私はバックアップサービスです、私は推定マスターして、作業を開始しサービス)」にリンクされている;
TimeUnit.SECONDS.sleep(1);
}
});
TimeUnit.DAYS.sleep(1);
}
}
高可用性フレームワークの主な2調製をシミュレートし、上記試験。lockTest1toMaster()、lockTest2toStandby()、実行 lockTest3toStandby() サービスを、1つだけのサービスプリントを見つけるでしょう。そして、サービスを手動で停止してから、すぐにサービスから印刷します。これはサービスから閉じでは、印刷サービスから他が続きます。グッドシミュレーション効果スタンバイフェイルオーバー
Etcdは何ですか?
おすすめ
転載: www.cnblogs.com/qwangxiao/p/11234276.html
おすすめ
ランキング