From:https://www.toutiao.com/i6678174710284419588/?group_id=6678174710284419588
ディレクトリ
- 序文
- アイデアプログラム
- デザイン
- コア主な流れ
- どのように展開
- システム設計
序文
記事あなたはどのようにサブライブラリーのサブテーブルそれは知っていますか?どのようにしてデータを移行することはありませんし、熱すぎる避けるために? 私たちは、通常のプログラムのサブライブラリーのサブテーブル、長所と短所それぞれを導入しました:
モジュロハッシュ化方式:なし、ホットスポットが、データの移行が必要です。
プログラムの範囲の範囲:なしデータの移行が、ホットな問題があります。
だから、プログラムはそれの両方の長所を組み合わせて何ができるのでしょうか?
実際には、実際の需要もそれを保存し、適切に調整し、サーバーのパフォーマンスとストレージのレベルに基づいているかどうか、あるのでしょうか?
アイデアプログラム
ハッシュは、均一なデータの問題を解決することができ、範囲のデータ移行の問題は、その後、我々は両方の組み合わせを行うことができない、解決することができますか?どちらもそれの特性を活用しますか?
我々は最初のデータが大きくなり、レンジスキーム内のデータの範囲に落下させていることを確認することを、データの展開は(IDなど)のルーティングキーの値が大きくなる表し、これは一定である考えます。Idは後で再びこの大きな、それは以前のデータが移行される必要はありません。
しかし、また、アカウントの均一なデータを考慮して、それが一定の範囲内で可能な均一なデータではないでしょうか?我々は拡張を設計するたびは確かに良いサイズの範囲の拡大を進めていきますので、限り、私たちは、この範囲内のデータの均一性を確保するようOKではありません。
デザイン
私たちは、まず、図以下、サブライブラリーとサブテーブルの数を含むグループグループグループの概念を定義します。
フィギュアいくつかの重要なポイントがあります。
1)ID = 0〜40億は確かgroup01グループを落ちます
2)group01グループ3 DB、どのルートにもDBのID?
3)ハッシュ法と位置付けDBによると、どのくらいのモジュラスこと?DB、図4の表10の総数のこのグループの弾性率に対するすべてのグループ番号表。なぜ、どこへ行くのテーブルの総数はありますか?むしろDB 3それの総数よりも?
4)ID = 12、IDの%10 = 2として、それが2で、どのDBライブラリはそれを落ちましたか?これは、事前に設定されるように設計されて、どのようにそれを設定するには?
5)DB、あなたはそれでDBテーブルを落ちるかを決定する必要があるデザインの向きたら?
コア主な流れ
按照上面的流程,我们就可以根据此规则,定位一个id,我们看看有没有避免热点问题。
我们看一下,id在【0,1000万】范围内的,根据上面的流程设计,1000万以内的id都均匀的分配到DB_0,DB_1,DB_2三个数据库中的Table_0表中,为什么可以均匀,因为我们用了hash的方案,对10进行取模。
上面老顾也提了疑问,为什么对表的总数10取模,而不是DB的总数3进行取模?我们看一下为什么DB_0是4张表,其他两个DB_1是3张表?
在我们安排服务器时,有些服务器的性能高,存储高,就可以安排多存放些数据,有些性能低的就少放点数据。如果我们取模是按照DB总数3,进行取模,那就代表着【0,4000万】的数据是平均分配到3个DB中的,那就不能够实现按照服务器能力适当分配了。
按照Table总数10就能够达到,看如何达到
上图中我们对10进行取模,如果值为【0,1,2,3】就路由到DB_0,【4,5,6】路由到DB_1,【7,8,9】路由到DB_2。现在小伙伴们有没有理解,这样的设计就可以把多一点的数据放到DB_0中,其他2个DB数据量就可以少一点。DB_0承担了4/10的数据量,DB_1承担了3/10的数据量,DB_2也承担了3/10的数据量。整个Group01承担了【0,4000万】的数据量。
注意:小伙伴千万不要被DB_1或DB_2中table的范围也是0~4000万疑惑了,这个是范围区间,也就是id在哪些范围内,落地到哪个表而已。
上面一大段的介绍,就解决了热点的问题,以及可以按照服务器指标,设计数据量的分配。
如何扩容
其实上面设计思路理解了,扩容就已经出来了;那就是扩容的时候再设计一个group02组,定义好此group的数据范围就ok了。
それは新しいgroup01グループなのであり、つまり、何のデータ移行概念は全く新しいグループのグループではありませんが、このグループは、グループがまだ熱い防ぐので[40百万円、5500万]データが均等に分散されていますtable_0のDBテーブルの3均等にデータテーブルに配布、{55,000,000}〜7000万のtable_1。
システム設計
アイデアデザインは、ちょうど3つのテーブル、比較的簡単である群との間に良好な関係を確立することを決定し、DB、ライン上のテーブル。
上記の表に関連付けられている[OK]を、限りまっすぐ思考の原則として、実際には比較的簡単です。常に3つのテーブルを照会するために関連していないの開発に小さなパートナーはキャッシュ(ローカルJVMキャッシュ)に保存することができ、これはパフォーマンスに影響しません。
容量が必要とされると、ジュニアパートナーはそれを再起動する必要があり、それgroup02協会、アプリケーションサービスを高めるためにされていませんか?
シンプルなポイントは、それは午前中に設定され、ライン上のアプリケーションサービスを再起動します。しかし、それは午前中に注文があるため、許可されていない大企業であれば。どのようにそれを行うには?ローカルJVMのキャッシュがどのようにそれを更新しますか?
実際には、多くのプログラムがあり、古い区は、特定の小さなパートナーは、インターネットを検索することができ、古い区の資料に記載されて後になり、飼育係をお勧めします。
これまでのところ、全体的なシナリオは終わりを説明し、我々は小さなパートナーを助けたいです。ありがとうございます!!!
値が重要であり、それは必要条件、増分を注文する必要があり、これはID次だけプログラムに分配することを含む:ここで重要な点は、(IDなど)キーをルーティングすることを意味します古い区の記事は、分散マスターキーを設計する方法を説明します