Etcdは何ですか?

  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つだけのサービスプリントを見つけるでしょう。そして、サービスを手動で停止してから、すぐにサービスから印刷します。これはサービスから閉じでは、印刷サービスから他が続きます。グッドシミュレーション効果スタンバイフェイルオーバー

おすすめ

転載: www.cnblogs.com/qwangxiao/p/11234276.html