分散型発電のIDの概要

まず、起源の需要

ほとんどすべてのビジネスシステム、それは、次のようなニーズを、特定のレコードを生成しました。

メッセージID:(1)メッセージを識別する

(2)注文識別子:注文ID

(3)ポストロゴ:tiezi-ID

データベースレコードの識別が多い一意の主キー、クラスタ化インデックス(クラスタ索引)データベースを作成し、即ち、物理ストレージにこのフィールドに命じました。

 

レコードの識別にこのクエリでは、多くの場合、ページングやソートなどのビジネスニーズ、のしています:

(1)メッセージプル:時間によってselectmessage-ID /順序/リミット100

時間/上限100によってselectorder-ID /順序:(2)の順で最新の章を引きます

時間/上限100によってselecttiezi-ID /順序:(3)は、ポストの最新章をプルします

だから、多くの場合、時間フィールドを持ち、かつ時間の欄に、一般的なインデックス(非クラスタ索引)を確立します。

 

レコード識別子を使用して、ビルド基本的に年代順に、この時間はインデックスフィールドは、クエリを保存することができたときにあれば私たちは、ポインタの一般的なインデックスが実際に記録されたすべてのノウハウは、アクセス効率は、クラスタ化インデックスよりも遅くなります。

メッセージID /(メッセージIDによって順序)を選択/リミット100

ここでも、メッセージIDが基本である生成前提にそうすることができる時間が増加する傾向

 

2つのコア要件の世代識別レコード(上述XXX-ID上記すなわち3つ)に、このリード。

(1)グローバル一意

順番に(2)トレンド

また、これは、この記事で説明したコアの問題である:トレンドグローバルに一意なIDを生成する方法を効率的かつ秩序あります。

 

第二に、一般的な方法、不十分と最適化

【共通1:AUTO_INCREMENTはユニークなIDの増分を使用して、グローバル・データベースを生成します]

利点:

(1)単純な、既存のデータベースの機能的使用

(2)一意性を保証するために

(3)増分を確保します

(4)定着工程

短所:

(1)の可用性を保証することは困難である。一般的なデータベーススキーマは、複数の別個の読み取りおよび書き込み+からマスタで、IDによる書き込み要求から生成され、可能性がないハンドル主リザーバにハングアップ

(2)不良なスケーラビリティ、性能限界は:拡張するIDの性能の上限を決定する一次ライブラリーを生成するために単一の点、データベースの書き込み性能として書き込まれ、困難です

改善:

(1)は、一点の書き込みを避けるために、マスターライブラリーを高めます

データレベルの(2)セグメント化は、すべての主要なライブラリ生成されたIDが繰り返されないことを保証するために


上図、3つの書き込みライブラリへの書き込みライブラリ、各書き込みライブラリAUTO_INCREMENT初期値の異なるセット、および同じ増分ステップは、IDごとに生成されたデータベースが異なることを保証するために(上図0 ...ライブラリは)ライブラリー、ライブラリー生成2,5,8,11 ... 2を生成1,4,7,10、0,3,6,9を生成しました

可用性を確保するための改良されたフレームワークが、欠点はあります。

(1)世代IDの損失「絶対インクリメンタル」:次いで0,3 0を生成した最初の訪問ライブラリ、1,1を生成するために、ライブラリを訪問は、非常に短い時間をもたらすことができる、IDの生成は絶対インクリメンタル(ない問題ではありません私たちの目標は、増分の傾向ではなく、絶対刻み)

データベースを書き込む(2)は、データベースにアクセスするために生成された各IDを持って、依然として大きな圧力であります

上記の二つの問題を解決するため、第2の共通のシナリオにつながります

 

[一般的な方法2:サービス生成バッチIDの単一点】

分散システムが困難な理由は、1つの非常に重要な理由は、「絶対的なタイミング」を確保するためのタイミングを保証する、または唯一のローカルクロックで、サービスの単一ポイントを使用するには、「保証タイミングにないグローバル・クロック、困難」であり、 。データベースの筆圧、あらゆる世代のIDがデータベースへのアクセス権を持っているので、あなたは書き込みデータベースへの圧力を軽減するための方法の大部分を使用することができます。


例えば、0のため、データベースストア、可用性を確保するために、現在のIDの唯一の最大値をダブルマスタデータベースを使用して上記の図。サービスIDは非常にアプリケーションサービスアクセスID生成要求IDは、サービスIDがデータベース毎に生成する必要がないことを、順次配布することができ、電流IDの最大値は5である変更、それぞれ6つのバッチのID、データベースへのサービスアクセスを引っ張ることが想定される生成これら0,1,2,3,4,5 IDは、終了し、その後、最大のIDが11の変更時に割り当てられたIDは、IDは再び、6,7,8,9,10,11配布することができ元の1/6に、データベースのダウンへの圧力はそう。

長所

(1)ID生成絶対増分が命じていることを確認

(2)大きくデータベースへの圧力を減少させる、ID生成は、毎秒数十万に数万を生成するために行うことができます

短所

(1)は、サービスの単一点のまま

サービスがハングアップした後、(2)の場合は、サービスを再起動し、IDが連続ではありません生成され続け、中間空洞が表示されます(0,1,2,3,4,5サービスメモリが保存され、MAX-IDデータベース5、再起動にサービスを割り当てる3)次回は4、6から割り当てされ、5が空になったが、問題は大きくありません

IDの数十万人が、すべての後に、パフォーマンスの限界があるが、水平方向に展開していないが(3)は、数十秒あたり数千のを生成することができます

改善

我々は、上記の欠点(1)を最適化するために、以下の方法を使用できるように共通の可用性の最適化は、また、「シャドウ・サービス」と呼ばれる、「代替サービス」サービスの一点です。


上記のように、外部サービス、スタンバイ状態でサービス影時間、メインサービスが提供するメインサービスときハングトップサービスの影。この切り替え処理は呼び出し元に透明であり、それは特に、ここで展開されていない、keepalivedの一般的な手法のVIP +で、自動化することができます。

 

[一般的な方法3:UUID]

生成されたID方式は、性能の有意な増加が、上述したが、システムが単一の点であるので、全体的なパフォーマンスの限界が依然として存在します。同時に、2つのスキームは、IDを生成するかどうか、サービスデータベース、ビジネス側のアプリケーションの必要性は、リモート呼び出し、時間がかかることにします。高性能、低レイテンシのそれである局所的に生成されたIDのための方法は、ありませんか?

UUIDは、一般的なシナリオである:文字列ID = GenUUID()。

長所

(1)ローカルに生成されたID、リモート呼び出しは、低遅延を必要としません

上限はない基本的に(2)スケーラビリティ、性能

短所

(1)は、トレンドがインクリメントされることを保証することはできません

(2)主キーインデックスは低い効率を確立するクエリとして、多くの場合、文字列で表される、長尺のuuid、共通の最適化は、(バイナリ一意の後に保証することができない)、または「バイナリメモリ」「二UINT64整数ストアに」あります

 

【共通4:ミリ秒単位の現在の数を取ります]

UUIDは、高いパフォーマンスを生成するために地元のアルゴリズムであるが、その傾向の増加を保証することはできませんし、文字列ID検索効率が低いとして、地元のアルゴリズムは、それを増やすことを保証するものではあり?

現在のテイク数ミリ秒が一般的スキームである:UINT64 ID = GenTimeMS()。

長所

(1)ローカルに生成されたID、リモート呼び出しは、低遅延を必要としません

(2)生成されたID傾向をインクリメント

(3)生成されたIDは、インデックス高いクエリ効率、整数です。

短所

1000年よりも並行処理の量は、重複したIDを生成する場合は(1)

私は人生に、この欠点を行って、IDの一意性を保証することはできません。もちろん、マイクロ秒の使用は、競合の可能性を減らすことができますが、2番目の100万のIDまでを生成することができ、言葉のない量は確かに競合できなくなりますので、マイクロ秒の使用は根本的に問題を解決していません。

 

【共通5:クラススノーフレークアルゴリズム]

スノーフレークは、オープンさえずり分散生成アルゴリズムID、あるコアアイデアがあれば、タイプID、機体番号を10ビットとして配列番号41bitミリ秒ミリ秒として使用、12ビット:です。このアルゴリズムは、スタンドアローン理論的にIDの400Wである第二*(2 ^ 12)、1000まで生成できる範囲内で、業務のニーズを満たすことができます。

ビジネスロジックを組み合わせた、雪の結晶のアイデアを学び、並行処理企業は、分散ID生成アルゴリズムを実現することができます。

たとえば、次のように企業IDジェネレータサービスの要件であることを前提としています。

(1)1W未満の単一ピーク同時実行は、今後5年間は、ある少ない10Wよりもピーク時の同時単一量に期待されています

(2)2つの部屋、今後5年間、4つ以上の機械室の数があります。

(3)各機械室の数が100未満

(4)要求ID、10未満の予想される将来のビジネスラインの数を生成された5本の動作線が存在します

(5)...

次のように分析プロセスは次のとおりです。

(この時間の後にライン上のシステムIDビルダーサービスを想定)ミリ秒数を2016年1月1日から取られた(1)高い、システムは、少なくとも10年を実行している、と* 365日* 24時間、少なくとも10年ということであることを想定しています* 3600秒= 320ミリ秒*ミリ秒39bitの予約数と同様1000年* 10 ^ 9、

毎秒(2)同時単一ピークが少ない10W未満である、即ち毎に単一のピーク同時MSは、ほぼミリ秒毎に7ビット予約シーケンス番号に、100未満であります

数(3)が、エンジンルーム4 5年未満であり、部屋は、識別のために予約2ビット

100未満(4)各機械室、各サーバルームに7ビットの予約ID

(5)4ビットを予約識別子サービスラインにビジネス未満の10行、


このような64ビットのロゴデザイン、保証することができます:

(1)各サービスライン、各部屋、各機械生成IDが異なっています

(2)同じマシン、各ミリ秒生成されたIDが異なっています

(3)同じマシン、同じ1ミリ秒、生成された領域IDが異なっていることを確認シーケンス番号を区別します

(4)ミリ秒単位で最上位ビット、生成されたIDをインクリメントしトレンドを確実にするために

短所

(1)、IDが絶対に増加しているが、グローバルな視点から、生成されたIDだけ(いくらかの時間後サーバ、いくつかの時間以前のサーバー)傾向が増加している割り当てられた各サーバ「は、グローバルクロックがない」ため

最後の質問は無視するのは簡単です

サブライブラリーデータのための、多くの場合、基礎IDモジュロサブライブラリサブテーブル、サブテーブルとして使用されるデータの量は、多くの場合、サブライブラリーサブテーブルを必要とするID生成、例えば、メッセージID /注文ID / tiezi-ID、均一私たちは通常、IDの最後のビット内の第2のシーケンス番号を置くので、需要はしばしば、「剰余ランダム」IDを生成し、IDをランダム生成することが保証されています。

我々は、MSを横切るとき、シーケンス番号は、常にシーケンス番号が生成されたIDモジュロムラが生じる、0比較的大きなIDであろうように、0にリセットされ、場合。解決策は、常にシーケンス番号0のプロパティではありませんが、0-9の乱数、この場所が所有しています。

公開された136元の記事 ウォンの賞賛6 ビュー1515

おすすめ

転載: blog.csdn.net/weixin_42073629/article/details/104603429