マイクロサービスを使用することで、グローバル ID の問題など、もともと単純だった多くの問題が複雑化しました。 最近、たまたま仕事でこのコンテンツを使用したので、市場で一般的なグローバル ID 生成戦略をいくつか調査し、参考までに簡単に比較してみました。 データベースがさまざまなライブラリとテーブルに分割されると、元の主キーの自動増分方法は使いにくくなり、新しい適切なソリューションを見つける必要があります。宋歌の要求はこのような状況下で提起された。 次は一緒に見ていきましょう。 1. 2つのアプローチ一般的に言えば、この問題には 2 つの異なるアプローチがあります。
これら 2 つのアイデアは異なる解決策に対応します。一つずつ見ていきましょう。 2. データベースは自動的に作成されるデータベースはそれを自動的に処理します。つまり、データを挿入するときに、主キーの問題を考慮せず、データベースの主キーの自動増分機能を引き続き使用したいと考えています。しかし、元のデフォルトの主キーの自動増分機能は今では使用できないことは明らかであり、新しい解決策が必要です。 2.1 データベース構成の変更分割後のデータベースの構造は次のようになります (データベース ミドルウェアとして MyCat が使用されていると仮定)。 このとき、元の db1、db2、db3 の主キーが増加し続けると、MyCat では主キーが自己増加せず、主キーが重複し、ユーザーが MyCat からクエリしたデータの主キーに問題が生じます。 問題の原因を見つければ、残りは簡単に解決できます。 MySQL データベースの主キーの自動増分の開始値とステップ サイズを直接変更できます。 まず、次の SQL を使用して 2 つの関連する変数の値を表示できます。
主キーの自動増分の開始値とステップ サイズはどちらも 1 であることがわかります。 開始値は簡単に変更できます。テーブルを定義するときに設定できます。ステップ サイズは、次の構成を変更することで実現できます。
変更後、対応する変数値を確認し、変更されていることを確認します。 ここで、再度データを挿入すると、主キーは毎回 1 ずつではなく、毎回 9 ずつ増加します。 自動増分開始値に関しては、実は非常に簡単に設定できます。テーブル作成時に設定できます。
MySQL では自動増分の開始値と各増加のステップ サイズを変更できるため、db1、db2、db3 があると仮定すると、これら 3 つのデータベースのテーブルの自動増分の開始値をそれぞれ 1、2、3 に設定し、自動増分のステップ サイズを 3 に設定して、自動増分を実現できます。 しかし、この方法は明らかにエレガントではなく、扱いが面倒で将来の拡張にも不便なので、お勧めできません。 2.2 MySQL+MyCat+ZooKeeperデータベースおよびテーブル シャーディング ツールとして MyCat を使用している場合は、それを Zookeeper と組み合わせることで、主キーのグローバル自動増分も実現できます。 MyCat は分散データベース ミドルウェアとして、データベース クラスターの操作をシールドし、スタンドアロン データベースと同じようにデータベース クラスターを操作できるようにします。主キーの自動増分には独自のソリューションがあります。
ここでは主にソリューション 4 について見ていきます。 設定手順は次のとおりです。
サーバー.xml
スキーマ.xml 主キーを自動インクリメントに設定し、主キーを id に設定します。
myid.properties で Zookeeper 情報を設定します。
シーケンスconf.プロパティ テーブル名は大文字にする必要があることに注意してください。
最後に、MyCat を再起動し、以前に作成したテーブルを削除してから、テスト用に新しいテーブルを作成します。 この方法はより便利で、スケーラビリティも優れています。データベースおよびテーブル シャーディング ツールとして MyCat を選択した場合、これが最適なソリューションです。 上記で紹介した 2 つの方法はどちらも、データベースまたはデータベース ミドルウェア レベルで主キーの自動増分を処理するため、Java コードで追加の作業は必要ありません。 次に、Java コードで処理する必要があるいくつかのソリューションを見てみましょう。 3. Javaコード処理3.1 UUID最も簡単に考えられるのは、UUID (Universally Unique Identifier) です。 UUID の標準形式には、ハイフンで 5 つのセグメントに分割された 32 桁の 16 進数 (8-4-4-4-12、36 文字) が含まれます。これは Java が組み込まれており、使いやすいです。最大の利点は、ローカルで生成され、ネットワークが消費されないことです。しかし、企業内で開発を行うパートナーであれば誰でも、これが企業のプロジェクトではあまり使用されていないことを知っています。理由は次のとおりです。
したがって、UUID は最適なソリューションではありません。 3.2 スノーフレークSnowflake アルゴリズムは、Twitter が公開した分散主キー生成アルゴリズムです。異なるプロセスの主キーの非重複性と、同じプロセスの主キーの秩序性を保証できます。同じ処理では、まず時間ビットによって重複しないことが保証され、さらに時間が同じであればシーケンスビットによって保証されます。 同時に、時間ビットは単調に増加し、サーバーが時間的にほぼ同期されている場合、生成された主キーは分散環境で一般的に順序付けられていると見なすことができ、インデックス フィールドを挿入する効率が保証されます。 たとえば、MySQL の Innodb ストレージ エンジンの主キー。スノーフレーク アルゴリズムによって生成される主キーは、上位から下位の順に、1 ビットの符号ビット、41 ビットのタイムスタンプ ビット、10 ビットの作業プロセス ビット、および 12 ビットのシーケンス番号ビットの 4 つの部分で構成されるバイナリ表現を持ちます。
予約された符号ビットは常にゼロです。
41 ビットのタイムスタンプが保持できるミリ秒数は 2 の 41 乗です。 1 年に使用されるミリ秒数は、365 * 24 * 60 * 60 * 1000 です。計算により、次のことがわかります。Math.pow(2, 41) / (365 * 24 * 60 * 60 * 1000L);結果はおよそ69.73年に相当します。 ShardingSphere のスノーフレーク アルゴリズムの時間エポックは、2016 年 11 月 1 日 0:00 から始まり、2086 年まで使用できます。ほとんどのシステムの要件を満たすことができると考えられています。
このフラグは Java プロセス内で一意です。分散アプリケーションのデプロイメントの場合は、各作業プロセスの ID が異なることを確認します。デフォルト値は 0 で、プロパティを介して設定できます。
このシーケンスは、同じミリ秒内に異なる ID を生成するために使用されます。このミリ秒内に生成された数値が 4096 (2 の 12 乗) を超える場合、ジェネレーターは次のミリ秒まで待機して生成を続行します。 注意: このアルゴリズムにはクロックのダイヤルバック問題があります。サーバー クロックのダイヤルバックにより、シーケンスが重複する可能性があります。したがって、デフォルトの分散プライマリ キー ジェネレーターは、許容可能な最大クロック ダイヤルバック ミリ秒を提供します。クロックが最大許容ミリ秒しきい値を超えて戻された場合、プログラムはエラーを報告します。許容範囲内であれば、デフォルトの分散主キー ジェネレーターは、クロックが最後の主キー生成の時刻に同期されるまで待機してから、作業を続行します。クロック セットバックの最大許容ミリ秒数は、デフォルト値が 0 で、プロパティを介して設定できます。 以下に、Song Ge がスノーフレーク アルゴリズムのツール クラスを示します。参照してください。
使用方法は次のとおりです。
3.3 リーフLeaf は Meituan のオープンソース分散 ID 生成システムです。最も初期の要望は、さまざまな事業ラインの注文 ID を生成する必要性でした。 Meituan の初期には、一部の企業は DB 自動増分を通じて ID を直接生成し、一部の企業は Redis キャッシュを通じて ID を生成し、一部の企業は UUID を使用して ID を直接生成していました。上記の方法にはそれぞれ問題があるため、Meituan はニーズを満たすために分散 ID 生成サービスを実装することにしました。現在、Leaf は Meituan Dianping 内の金融、ケータリング、食品配達、ホテル旅行、Maoyan Movies など、多くの事業ラインをカバーしています。4C8G VM に基づき、同社の RPC 呼び出しを介して、QPS ストレス テストの結果はほぼ 5w/s、TP999 1ms でした (TP = Top Percentile、Top percentage は統計用語で、平均値や中央値と同じです。TP50、TP90、TP99 などの指標は、システム パフォーマンス監視シナリオでよく使用され、50%、90%、99% などのパーセンタイルを超える状況を指します)。 現在、LEAF を使用するには、セグメント モードと SNOWFLAKE モードの 2 つの方法があります。両方のモードを同時に有効にすることも、特定のモードを指定して有効にすることもできます (デフォルトでは両方のモードが無効になっています)。 GitHub から LEAF をクローンすると、その構成ファイルは leaf-server/src/main/resources/leaf.properties にあります。各構成の意味は次のとおりです。 ご覧のとおり、数値セグメント モードを使用する場合は、データベースのサポートが必要です。 SNOWFLAKE モードを使用する場合は、Zookeeper のサポートが必要です。 3.3.1 数字セグメントモード 数値セグメント モードは依然としてデータベースに基づいていますが、次のように考え方が少し変更されています。
数値セグメント モードを使用する場合は、まずデータ テーブルを作成する必要があります。スクリプトは次のとおりです。
この表のフィールドの意味は次のとおりです。
設定が完了したら、プロジェクトを起動し、http://localhost:8080/api/segment/get/leaf-segment-test パス (パスの末尾の leaf-segment-test はビジネス タグ) にアクセスして ID を取得します。 セグメント モードの監視ページには、次のアドレスからアクセスできます: http://localhost:8080/cache。 数値セグメントモードの利点と欠点: アドバンテージ
欠点
3.3.2 スノーフレークモード SNOWFLAKE モードは Zookeeper と併用する必要がありますが、SNOWFLAKE の Zookeeper への依存性は弱いです。 Zookeeper を起動した後、SNOWFLAKE で Zookeeper 情報を次のように設定できます。
その後、プロジェクトを再起動します。起動が成功すると、次のアドレスから ID にアクセスできます。
3.4 Redis 生成これは主に Redis の incrby を使用することで実現されますが、これについては特に説明する必要はないと思います。 3.5 飼育係の処理Zookeeper でもこれを行うことができますが、面倒なためお勧めできません。 4. まとめ要約すると、プロジェクトで MyCat が使用される場合は MyCat+Zookeeper を使用できますが、それ以外の場合は LEAF を使用することをお勧めします。どちらのモードも受け入れられます。 この記事はWeChatの公式アカウント「江南一店語」から転載したものです。下のQRコードからフォローできます。この記事の転載については江南易店宇公式アカウントまでご連絡ください。 |
<<: 雲が増えればパワーも増える?マルチクラウド アーキテクチャに隠された 11 の秘密をご存知ですか?
>>: クラウドネイティブなビジネス変革に向けた9つのステップ
月収10万元の起業の夢を実現するミニプログラム起業支援プラン企業にとって、インターネット マーケティ...
Yunchuang Network は、ロサンゼルス cn2 gia 回線の VPS の最大帯域幅を...
11月1日午後、中国インターネット協会は北京で「インターネット検索エンジンサービス自主規律条約」(以...
今日のマルチクラウド環境は 1、2 年前とは大きく異なり、明日のマルチクラウド環境も同様に大きく異な...
百度統計は新年を迎えて第3版を更新した。 SEO の観点から見ると、第 3 版では第 2 版と比べて...
Kubernetes アドミッション コントローラーは、クラスター管理に不可欠です。これらのコントロ...
[51CTO.com からのオリジナル記事] シスコが 2004 年 6 月に最初のクラスタ ルータ...
私はほぼ半年かけてウェブサイトを構築してきましたが、今日はそれを皆さんと共有したいと思います。もう無...
最近、インターネットで「ウェブサイト運営:ウェブマスターは同じスタイルを変えずにどれくらい生き残れる...
2021年11月3日、「デジタルと現実の融合、新たなチャンスの爆発」をテーマにしたテンセントデジタル...
全文は、こちらの記事をご覧ください:「GOOGLE 検索が 20 周年に発表した 3 つの重要な調整...
多くの初心者は、検索エンジンに含まれない問題に悩まされています。誰もが初心者の頃にこの状況を経験した...
Pacificrack は Double Eleven の特別プロモーションを実施します。すべてのク...
2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っていますこのブログ...
データとアプリケーション デバイスが増加するにつれて、企業はローカル リソースではビジネス開発のニー...