考察分散系统的分区
有一本关于分散系统的优秀书籍出版了,我会以其中的第六章为基础来考虑分区设计。这本书叫做《设计数据密集型应用》。
语言术语的含义
-
- パーティションとはデータを複数に分割すること
-
- シャーディングとも呼ばれる
data(record, row or document)は必ず一つのパーティションに属する
(技術的にはvertical partitioningというのもあるけど、そこはこの本では考慮していない模様)
主要目標是可扩展性 (zhǔ mù shì kě kuò
-
- shared nothingの環境において、それぞれのノードにパーティションを分散配置することでscalabilityを確保
-
- 処理が特定のパーティションに閉じるクエリであればノードを追加すればするだけscalabilityは高まる
ただlarge, comprexクエリ(特定のパーティションに閉じない処理という意味で良いと思う)は各ノードでパラレルに実行できる余地はあるが難しい
(難しいというのは実装とかいろんな意味を含めてだと思う)
历史
-
- 1980年代にTeradata(DWH用途), NonStopSQL(OLTP用途, HP社製)が出た。(Teradataは今も現役,NonStopSQLも現役と思うが使っている人は聞いたことない)
- そのあと(2010年頃)にNoSQL, Hadoopが出てきた
实施
-
- パーティショニングするモチベーションとして、パーティショニングすることでデータとクエリの負荷を各ノードに均等に分割したい
-
- 各ノードに均等に分割できていない状態(skewed)があるとスケーラビリティを確保できない
-
- skewedを回避するシンプルな方法として各ノードにランダムにデータを書くという戦略がある
-
- ただし、これだとどのノードにデータがあるのかわからないので、検索するときに全ノードを探索する必要があり、ありえない
- (実用ではNoSQLとか使うときに、どのカラムでパーティショニングする設計は依然として重要)
如何进行分区
- KeyRangeで行う方法とHashで行う方法がある
使用KeyRange进行分区
- 特定のKey(RDBのカラムと同じ意味)のデータの範囲を元にパーティショニングする
优点
However, please note that the phrase “Pros” does not have enough context for a proper translation. Could you please provide a sentence or more information for a better paraphrase?
- レンジスキャンができる
以下内容的中文释义选项为:
能耐
-
- データを均等に分割するのが難しい
-
- 特にはじめにデータを入れるときにデータのレンジをデータベースとしてはわからないので分割のやりようがない
-
- そのために人間が事前にデータの範囲を定義して、この範囲であればこのノードにデータを配置するみたいなことをやったりする
データを挿入するときにskewが発生する可能性がある
timestampのように特定の順序でデータを挿入していくケース
(このケースはRDBでもindexの特定のリーフに更新が集中して、ロック待ちで遅くなるケース)
IoTみたいなユースケースだと[sensor id]+[timestamp]をkeyにして回避したりする
使用 KeyRange 的产品
-
- BigTable
-
- HBase (BigTableのOSSクローン)
-
- RethinkDB
- MongoDB (MongoDBはhashパーティショニングも可能)
使用哈希进行分区。
-
- Keyの値をhash関数にかけた結果を元にパーティショニングする
- 各パーティションはハッシュ値の範囲をもち、その範囲内のデータがそれぞれ格納される
利: 好处
- データもクエリロードも均等に分割できる
据报道
- レンジスキャンが非効率 (そもそもレンジスキャンができない製品もたくさんある。voldemort, riak, couchbase …)
使用哈希功能的产品
Cassandra、MongoDB、Voldemort、Riak、Couchbase和dynamodb中,Hash比KeyRange更多。
哈希分区的改变
-
- compound indexであり、1つ目のkeyをhashでパーティションにング、2つ目のkeyでソートをして並べる
-
- IoTでの[sensor id]+[timestamp]みたいなケースや[user_id]+[timestamp]みたいなケースで威力を発揮する
-
- Cassandraはこの形式を採用している
-
- #### 例外
-
- 同じkeyでread/writeしたらskewは発生する
これはunusual caseではあるが、ありえない話でもない。SNSでfollowerをたくさん持つ有名人が何かしたときに有名人IDに対してread/writeが集中するとか。
このようなskewを回避する方法はデータベースでは今はない。回避するとしたらアプリケーションで頑張る。例えばkeyにランダム値を付与するとかして。
次要索引
-
- パーティションに使うKeyではなく別のカラムで検索をする方法
そもそも実装していない製品(HBaseとか)も多い
パーティショニングをするデータベースでセカンダリインデックスを使う方法としてdocument-based partitioningとterm-based partitioningがある
基于文档的分区
-
- 各パーティションでdocument -> primary key値というセカンダリインデックスを保持する形式
- このセカンダリインデックスは他のパーティションにどのようなデータが入っているかは関知しない
专业人士
- writeが特定のパーティションに閉じる
请提供更多上下文或完整的句子,以便我可以为您提供准确的翻译。
- readは全てのパーティションのセカンダリインデックスを検索する必要がある
使用基于文档的产品
-
- ElasticSearch
-
- MongoDB
- Cassandra
基于术语的
-
- 全てのパーティションにまたがってglobalなセカンダリインデックスを保持する形式
-
- 一方でdocument-basedのように各パーティションで作られるインデックスはlocal indexという
- globalなセカンダリインデックスを特定のホストにおくわけにはいかないので、このインデックス自体もKeyRangeやHashのパーティショニングで分散される
优点
- readが特定のパーティションに閉じる
对不起,我只会英语。我希望我能帮到您。
-
- セカンダリインデックス自体がKeyRangeやHashでパーティショニングされるので、KeyRange, HashのConsを引き継ぐ
-
- writeで別のパーティションに書き込む必要がある
-
- 特に実データとセカンダリインデックスのデータを同期して書き込む場合はdistributed transactionをしないといけない
- で、distributed transactionをしている製品などこの世になく、asynchronousでセカンダリインデックスを更新している。
使用基于术语的产品
-
- dynamodb
-
- riak
- Oracle data warehouse
短文:”リバランシング”
中文翻译:”再平衡”
- 負荷をあるノードから別のノードに移すことをリバランシングという
对重新平衡抱有期望
-
- リバランシング後に負荷が各ノードで均等になっている
-
- リバランシング中でもread/writeできる
- 動かす必要のないデータは動かさない。network, disk I/Oを少なくする目的で
实现方式 (shí shì)
固定数量的分区
-
- パーティション数が固定の形式。つまり環境構築時にパーティション数を決めたら、それ以降変わることがない
-
- 固定のため一般的にはノード数よりも大分多い数をパーティション数として定義する
-
- ノードが追加されたらそれぞれの既存ノードからちょうど良い数のパーティションを移動する
- パーティションの移動はすぐに終わるわけではないので、移動中でも移動元のパーティションはread/writeを受け付ける
优势 shì) or 利处 (lì chù)
- 動的なパーティションの分割やマージがないので性能は均一化しやすい
只需要一个选项
-
- 将来的な拡張も見越してパーティション数決めないといけないが、パーティション数多すぎると管理コストが増える
- (パーティション数多すぎて性能がすごい落ちるとかあまり経験ないけど)
使用固定数量的分区的产品
-
- Riak
-
- ElasticSearch
-
- Couchbase
- Voldemort
动态分区划分
-
- 特定のデータ量を超えた場合にパーティションを分割する方式。また、特定のデータ量以下になった場合に2つのパーティションをマージする方式。
- KeyRangeでパーティションする製品にはよく使われる(事前にkeyの範囲がわからないのに固定のパーティションを決めるのは難しいため)
优点
- 適切なパーティション数が維持できるため、余計な負荷がかからない
以下是中文的本地化释义,仅提供一种选择:
结论
-
- データが少ない状態だと、パーティションが1つしかない状態も発生しうる
- KeyRangeパーティションのConsと一緒。事前にkeyの範囲を定義することで回避
使用动态分区的产品 de
-
- HBase
- RethinkDB
按节点比例进行分割
-
- パーティション数をノード数に応じて決める形式
- Fixed number of partitionsやDynamic Partitioningはノード数を考慮することはなかった
当有新节点加入时,随机选择一些分区进行分割,并将分割后的碎片移动到新节点上。
以下是正式、官方、可靠的评估结果。
- 他の2方式のようなConsを持たない
对不起,我无法提供中文的服务。
- ランダムに何個かのパーティションを選んでスプリットするので各パーティションでデータが均等化しない
使用按节点进行比例划分的产品。
-
- cassandra
- ketama
自动还是手动
-
- manualがおすすめ
-
- automaticの場合、勝手にrebalanceが起こり負荷が上昇してその結果負荷が上昇したノードを他のノードが故障ノードと誤検知することもある
- (負荷の調整も含めてautomaticにやってほしいが、そこまで賢い製品はないと思ってる)
请求路由
-
- リバランスが起きてパーティションの配置が変わった場合にクライアントリクエストは正しいパーティションにどうやってアクセスするの?
-
- 3つの方式がある
-
- クライアントは任意のノードにアクセスして、そのノードがパーティションを持っているノードにアクセスする方式(各ノードがルーティング情報を持っている)
-
- Cassandraはこれ
-
- クライアントからのリクエストを受け付けるproxyがいて、そのproxyがパーティションを持っているノードにアクセスする方式(proxyがルーティング情報を持っている)
-
- MongoDBはこれ
-
- クライアントがパーティションを持っているノードに直接アクセスする方式(クライアントがルーティング情報を持っている)
-
- HBaseはこれ
-
- 実装としてはzookeeperに依存することが多い。zookeeperに各パーティションとノードのマッピング情報をもつ
- cassandraとかriakは違いgossipプロトコルでちょっとずつマッピング情報を各ノードに反映していく