過去 2 年間の技術面接では、分散トランザクション、分散ロック、分散スケジューリング、分散ストレージ、分散 ID など、分散シリーズは面接官がよく尋ねる頻繁なトピックです。 今日は比較的シンプルな分散 ID についてお話します。まず、分散 ID はなぜ必要なのでしょうか? システムデータの量が多すぎてデータベースとテーブルに分割されている場合、各データベーステーブルに散在するデータレコードを一意に識別する必要があり、この問題を解決するために分散 ID が使用されます。 次に、8 つの分散 ID 生成方式と、それぞれの長所と短所を見てみましょう。 写真 1. UUIDUUID は Universally Unique Identifier の略称で、中国語では「Universally Unique Identifier」と翻訳されます。 32 桁の 16 進数 + 4 つの「-」で構成され、合計の長さは 36 です。一意性を保証でき、衝突の可能性は極めて低くなります。 現在、UUID には 5 つのバージョンがあり、それぞれ生成方法が異なります。最も一般的に使用されるバージョンは、乱数によって生成されるバージョン 4 です。 UUID の生成と実装は非常に簡単で、java.util パッケージを通じて 1 行のコードだけで実現できます。 アドバンテージ: (1)この技術は実装が簡単で、必要なコードは1行だけです。 (2)低いエラー率でローカルに生成できる。 (3)高いID生成性能 欠点: (1)障害はデータベースのデータ書き込みパフォーマンスに影響を及ぼします。 (2)保管コストが高い。 4つの「-」を削除しても長さは32のままです。(3)読みにくい。 2. データベースの自動増分IDデータベースを中央データベースとして選択し、データベース内のテーブルの自動増分主キー メカニズムを使用して分散 ID を生成します。 写真 対応する SQL ステートメントは次のとおりです。 この SQL ステートメントを使用すると、id_table テーブル内の 1 つのデータ レコードを維持しながら、主キー ID を増やし続けることができます。 アドバンテージ: (1)単調増加なので、データベースのデータ書き込みパフォーマンスに影響を与えません。 (2)可読性が高い。 欠点: (1)ID生成にはデータベース操作が伴い、パフォーマンスが低い。 (2)追加の中央データベースを導入する必要があり、リンクが長くなり、エラーの可能性が高まります。 (3)開発コストが比較的高い。 (4)データベースは大きな負荷を受けています。 3. Redisの自動インクリメントコマンドRedis の INCR 自己増分コマンドを使用して分散 ID を生成します。 写真 以下のように表示されます。 アドバンテージ: (1)単調増加なので、データベースのデータ書き込みパフォーマンスに影響を与えません。 (2)高いID生成性能(3)読みやすさが高い。 欠点: (1)Redisを追加で導入する必要があり、リンクが長くなり、エラーが発生する可能性が高くなります。 (2)Redisがクラッシュした後、RDB + AOFデータのリカバリは遅く、リカバリ速度を上げるにはプランBが必要になります。 (3)開発コストが比較的高い。 4. スノーフレークアルゴリズムSnowFlake は、Twitter が開発したオープンソースの分散 ID 生成アルゴリズムです。 hutool jar パッケージをローカルに導入することで実装できます。 スノーフレーク アルゴリズムによって生成される分散 ID は合計 64 ビットで、4 つの部分で構成されます。 写真
アドバンテージ: (1)技術の実装が簡単で開発コストが低い。 (2)この傾向は増加傾向にあり、データベースのデータ書き込みパフォーマンスには影響しません。 (3)低いエラー率でローカルに生成できる。 (4)高いID生成性能 欠点: (1)マシンクロックへの強い依存。マシンの時計を戻すと、ID の重複が発生します。 (2)読みにくさ 5. データベースセグメントデータベース セグメントは、「データベース自動増分 ID」ソリューションに基づく最適化です。実装は次のとおりです。 (1)中央データベースから分散IDのバッチを取得し、分散IDサービスにローカルにキャッシュする。ビジネス システムは、分散 ID を取得すると、このバッチ内で値を直接増分できます。 (2)分散IDのバッチの番号セグメントが使い果たされた場合、データベースの初期値を更新し、新しいバッチの分散IDを再度取得し、分散IDサービスにローカルに再キャッシュして使用する必要がある。 写真
アドバンテージ: (1)増加傾向にあり、データベースのデータ書き込みパフォーマンスには影響しません。 (2)高いID生成性能(3)データベースの負荷が低い。 (4)読みやすさが高い。 欠点: (1)開発コストが非常に高い。 (2)追加の分散IDサービスと中央データベースを導入する必要があり、リンクが長くなるにつれてエラーの確率が高くなります。 6. 美団葉Leaf は、Meituan の技術チームによって実装された分散 ID 生成ソリューションです。データベース セグメント モード (Leaf-segment) とスノーフレーク アルゴリズム モード (Leaf-snowflake) を実装します。ここでは、Leaf-snowflake に焦点を当てます。 リーフスノーフレークソリューションは、スノーフレークアルゴリズムソリューションのビット設計に完全に従います。つまり、ID番号は「1+41+10+12」の形式で組み立てられます。変更点は次のとおりです: SnowFlake はローカル jar パッケージから独立したサービスに変更され、クロック ダイヤルバック問題を解決するために Zookeeper が導入されました。 写真 アドバンテージ: (1)増加傾向にあり、データベースのデータ書き込みパフォーマンスには影響しません。 (2)元のマシンの時計を戻したときに発生するID重複の問題が解決されます。 (3)高いID生成性能 欠点: (1)サードパーティのオープンソースソフトウェアには、一定の慣れと試行錯誤のコストがかかります。 (2)追加の分散IDサービスやZookeeperを導入する必要があり、リンクが長くなるにつれてエラー確率が増加する。 (3)読みにくさ 7. ディディ・ティニッドTinyid は、Didi 技術チームによって実装された分散 ID 生成アルゴリズムです。これは、上で紹介した数値セグメント モードに基づいています。これに基づいて、データベースのマルチマスター ノード モードをサポートし、tinyid-client クライアント アクセス メソッドも提供します。 さらに、Tinyid によるもう 1 つの最適化ポイントは、数値セグメントのプリロードです。 たとえば、現在使用可能な数値セグメント (1 ~ 1000) がメモリにロードされ、ID は 1 から増分的に取得されます。20% (デフォルト) が使用されている場合、次の使用可能な数値セグメント (4001 ~ 5000) が非同期的にメモリにロードされます。この時点で、メモリ内で使用可能な数値セグメントは (201-1000) と (4001-5000) です。 ID が 1000 に増加すると、現在の数値セグメントが使用され、次の数値セグメントが現在の数値セグメントに置き換えられます。 写真 アドバンテージ: (1)増加傾向にあり、データベースのデータ書き込みパフォーマンスには影響しません。 (2)高いID生成性能(3)データベースの負荷が低い。 (4)読みやすさが高い。 欠点: (1)サードパーティのオープンソースソフトウェアには、一定の慣れと試行錯誤のコストがかかります。 (2)追加の分散IDサービスと中央データベースを導入する必要があり、リンクが長くなるにつれてエラーの確率が高くなります。 8. Baidu の Uid ジェネレーターUidGenerator は、Java で実装され、Snowflake アルゴリズムに基づいた一意の ID ジェネレーターです。 UidGenerator はアプリケーション プロジェクト内でコンポーネントとして動作し、カスタムの workerId 数字と初期化戦略をサポートします。 実装の面では、UidGenerator は将来の時間を借りることでシーケンスの自然な並行性の制限を解決し、生成された UID をキャッシュするために RingBuffer を採用し、UID の生成と消費を並列化し、同時に CacheLine を埋めることで、RingBuffer によって引き起こされるハードウェア レベルの「偽の共有」問題を回避します。最終的には、単一マシンの QPS は 600 万に達します。 写真
ここで、SnowFlake と比較すると、UidGenerator には時間ビットが少なく、マシン ID ビットが多いことがわかります。 アドバンテージ: (1)増加傾向にあり、データベースのデータ書き込みパフォーマンスには影響しません。 (2)低いエラー率でローカルに生成できる。 (3)極めて高いID生成性能 欠点: (1)サードパーティのオープンソースソフトウェアには、一定の慣れと試行錯誤のコストがかかります。 (2)マシンクロックに大きく依存する。マシンの時計を戻すと、ID が重複する原因になります。 (3)読みにくさ 結論これら 8 つの分散 ID 生成方式の中で最も一般的に使用されているのは、スノーフレーク アルゴリズムとデータベース セグメント方式です。 もちろん、最も一般的に使用されているものが、担当するシステムに最も適しているとは限りません。やはり自分の特性に基づいて選択する必要があります。 |
<<: Kubernetes データ ストレージ: 理論から実践までの包括的なガイド
>>: CRUD プログラマーしか知らない友人の皆さん、クラウド コンピューティング テクノロジーを採用し始めましたか?
WeChat O2O収益化の段階的なルートが明らかに:Tenpayとの完全な統合【捜狐ITニュース】...
クラウド MSP のトレンドが台頭する中、エンタープライズ市場の大手メーカーである Lenovo も...
オンラインでの収入に自信を失ったウェブマスターへの手紙これは、オンラインでお金を稼ぎ始めたばかりの初...
一般的なオンラインチャネルは何ですか?オンライン チャネルにはさまざまな種類があり、詳しく言うと数十...
外部リンクは王様であり、これは SEO 業界のほぼすべてのウェブマスターが認める真実です。外部リンク...
他の人のブラックフライデーやサイバーマンデーは終わっていますが、パシフィックラックのプロモーションは...
最近、グループ内の友人とチャットしていたのですが、勉強したり授業に参加したりする人はほとんどいないこ...
コンピューティング戦略は数十年にわたって大きく変化しました。ますます多くの企業が AI と機械学習機...
ご存知のとおり、キーワードランキングの中核となる要素は、コンテンツ、内部リンク、外部リンクです。これ...
私は2009年に百度の入札に接して以来、ずっと百度の入札を観察してきました。詳細に研究したとは言えま...
現在、ほぼすべてのインターネット サイトがユーザー登録とログイン機能を提供しており、これによってすべ...
SEO に携わる友人は、このタイトルの質問について考えたことがありますか? 実際、これはすべての S...
海外では、インターネットと教育の衝突により巨大な金鉱が誕生しました。投資家は変化を求める声を聞き、野...
ショートビデオ、セルフメディア、インフルエンサーのためのワンストップサービス1. まず、Weiboや...
オンプレミス インフラストラクチャがパブリック クラウドに取って代わられて消滅するという報告は、大き...