MongoDBのをスライス
入門
断片(シャーディング)法がMongoDBの別のサーバー(またはクラスタ)に分割大規模なコレクションのために使用されます。断片化にもかかわらず、それは、リレーショナル・データベース・パーティションで始まったが、MongoDBのフラグメンテーションは全く別の問題です。
そして、MySQLのパーティショニング方式は、最大の違いは、それはほとんどすべてがちょうどそれが自動的に別のサーバー間でバランスのとれたデータを維持することができ、データを割り当てるためにMongoDBを教えて、自動的に行うことができますMongoDBのことです。
オブジェクトのスライス
高いデータボリュームとスタンドアロンデータベースアプリケーションのスループット性能は、クエリ、大量のシステムが最終的にメモリ不足になり、スタンドアロンCPU、スタンドアロンの貯蔵圧力に大量のデータが不足しますが、より大きな圧力が発生します圧力は、ディスクIOに転送されます。
水平拡張と垂直拡張:これらの問題を解決するには、2つの基本的な方法があります。
垂直方向の拡張:容量を拡張するために多くのCPUとメモリリソースを追加します。
水平方向の拡張:データを複数のサーバに分散されます。すなわち、水平方向の延長断片。
スライスデザイン
応答して提供されるデータおよびハイスループット方法を大量にスライスします。使用のスライスは、各タイルのために処理される要求の数を減少させ、したがって、伸長のレベルによって、クラスタは、それらの記憶容量とスループットを向上させることができます。挿入するとき、例えば、データ・ストレージ・アプリケーションは、このデータスライスへのアクセスを必要とします。
それぞれに格納されたデータ部分を使用して断片化を減少させます。
例えば、データベース1TBのデータセット場合、及び4つのスライスが存在し、各スライスは、256ギガバイトにデータを保持することができます。40スライスがある場合は、各セグメント化は、データの唯一の25ギガバイトがあります。
三つの主要な断片化メカニズム
1.抽象クラスタ、クラスタ「見えない」ので、
MongoDBはmongosのルーティングと呼ばれる独自のプロセスが付属しています。mongos応答を受信しながら、クラスターまたはサーバーのグループにクライアントの要求に正確なルーティングに送信されるルータの交差点は、つなぎ合わせた統一していることです戻ってクライアントに送信されます。
2.クラスタは常に読み書きできることを確認します
MongoDBは、さまざまな方法を介してクラスタの可用性と信頼性を確保します。複数のサーバに断片化データを確保しつつ、フラグメンテーションとMongoDBの複製組み合わせは、また、それぞれがこのように他のライブラリーから、サーバを交換する時間があることを確認して、該当サブデータのバックアップを持っていることを確実にします今、私たちは壊れた部品を交換する作業を継続します。
3.拡大するクラスターが簡単
システムは、より多くのスペースとリソースを必要とする場合、MongoDBは需要我々はシステム容量と便利を広げることができるように。
スライスノードクラスタアーキテクチャ
パッケージ | 説明 |
---|---|
構成サーバー | すべてのストレージクラスタノード、データスライスのルーティング情報。デフォルトの設定では、3つの構成サーバー・ノードが必要です。 |
Mongos | 外部アプリケーションへのアクセスの提供は、すべての操作がmongosによって実行されています。多くの場合、複数のノードのmongosがあります。 |
mongod | Storeアプリケーション・データ・レコード。mongodは、一般に、データスライスの目的を達成するために、複数のノードを有します。 |
クラスタアーキテクチャ図
mongos
データルーティング、およびクライアントを扱うモジュール。mongosは、任意のデータを持っていない、彼はコンフィグサーバに移動し、このデータに対処する方法を知りません
コンフィグサーバ
一部の構成情報は、すべてのノード、データアクセスモード、断片化をシャード。メタデータは、実際のデータとして理解することができます。
シャード
単位としてのデータチャンクを格納する実データ格納場所。
何チャンクいますか?
内部断片サーバにおいて、MongoDBの又はデータが、チャンクにシャードサーバの内部部分を表すデータの各チャンクに分割されます。チャンクが生成され、以下の二つの目的があるでしょう。
分割:あまりにも大きな塊を避けるためにオーバーチャンクサイズの設定のチャンクのサイズは、MongoDBのバックグラウンド・プロセスは、より小さなチャンクにカットし、この塊を置きます
バランス:MongoDBの中で、バランサは、バックグラウンドプロセス、移行の責任塊なので、各シャードサーバーの負荷分散、システムであり、1つのチャンク初期のチャンクサイズのデフォルトの64Mは、生産ライブラリーであなたのビジネスに適切なチャンクサイズを選択することが最良です。MongoDBは自動的にチャンクを分割して移行します。
データ配信フラグメンテーションクラスタノード
(1)データのチャンクを格納します
(2)デフォルトではチャンクサイズの64Mを有効なグループに完成した構造、後に、
(3)存储需求超过64M,chunk会进行分裂,如果单位时间存储需求很大,设置更大的chunk
(4)chunk会被自动均衡迁移。
如何选择chunksize?
小的chunksize:数据均衡是迁移速度快,数据分布更均匀。数据分裂频繁,路由节点消耗更多资源。
大的chunksize:数据分裂少。数据块移动集中消耗IO资源。通常100-200M
适合业务的chunksize是最好的;
chunk的分裂和迁移非常消耗IO资源;
chunk分裂的时机:在插入和更新,读数据不会分裂;
chunk分裂及迁移
随着数据的增长,其中的数据大小超过了配置的chunk size,默认是64M,则这个chunk就会分裂成两个。
这时候,各个shard 上的chunk数量就会不平衡。这时候,mongos中的一个组件balancer 就会执行自动平衡。把chunk从chunk数量最多的shard节点挪动到数量最少的节点。
chunkSize对分裂及迁移的影响
- MongoDB 默认的 chunkSize 为64MB,如无特殊需求,建议保持默认值;chunkSize 会直接影响到 chunk 分裂、迁移的行为。
- chunkSize 越小,chunk 分裂及迁移越多,数据分布越均衡;反之,chunkSize 越大,chunk 分裂及迁移会更少,但可能导致数据分布不均。
- chunk 自动分裂只会在数据写入时触发,所以如果将 chunkSize 改小,系统需要一定的时间来将 chunk 分裂到指定的大小。
- chunk 只会分裂,不会合并,所以即使将 chunkSize 改大,现有的 chunk 数量不会减少,但 chunk 大小会随着写入不断增长,直到达到目标大小。
shard key 分片键
MongoDB中数据的分片是、以集合为基本单位的,集合中的数据通过片键(Shard key)被分成多部分。其实片键就是在集合中选一个键,用该键的值作为数据拆分的依据。
所以一个好的片键对分片至关重要。片键必须是一个索引。
对集合进行分片时,你需要选择一个片键,片键是每条记录都必须包含的,且建立了索引的单个字段或复合字段,MongoDB按照片键将数据划分到不同的数据块中,并将数据块均衡地分布到所有分片中。
分片建策略
- 一个自增的片键对写入和数据均匀分布就不是很好,因为自增的片键总会在一个分片上写入,后续达到某个阀值可能会写到别的分片。但是按照片键查询会非常高效。
- 随机片键对数据的均匀分布效果很好。注意尽量避免在多个分片上进行查询。在所有分片上查询,mongos会对结果进行归并排序。
- MongoDB使用基于范围的分片方式 或者 基于哈希的分片方式。
- 注意事项
- 分片键是不可变。
- 分片键必须有索引。
- 分片键大小限制512bytes。
- 分片键用于路由查询。
- 键的文档(不支持空值插入)
基于范围的分片方式
Sharded Cluster支持将单个集合的数据分散存储在多shard上,用户可以指定根据集合内文档的某个字段即shard key来进行范围分片(range sharding)。
对于基于范围的分片,MongoDB按照片键的范围把数据分成不同部分。
假设有一个数字的片键:想象一个从负无穷到正无穷的直线,每一个片键的值都在直线上画了一个点。MongoDB把这条直线划分为更短的不重叠的片段,并称之为数据块,每个数据块包含了片键在一定范围内的数据。在使用片键做范围划分的系统中,拥有“相近”片键的文档很可能存储在同一个数据块中,因此也会存储在同一个分片中。
基于哈希的分片方式
分片过程中利用哈希索引作为分片的单个键,且哈希分片的片键只能使用一个字段,而基于哈希片键最大的好处就是保证数据在各个节点分布基本均匀。
![img](https://images2017.cnblogs.com/blog/1190037/201801/1190037-20180106150727893-1156186779.png)
> 对于基于哈希的分片,MongoDB计算一个字段的哈希值,并用这个哈希值来创建数据块。在使用基于哈希分片的系统中,”相近”片键的文档很可能不会存储在同一个数据块中,因此数据的分离性更好一些。
>
> Hash分片与范围分片互补,能将文档随机的分散到各个chunk,充分的扩展写能力,弥补了范围分片的不足,但不能高效的服务范围查询,所有的范围查询,要分发到后端所有的Shard,才能找出满足条件的文档。
分片集群部署的常见错误
- コピーセットは、スライスコピーノードの集合として構成することができるが、基本的に同一の個体を使用するように構成されています。しかし、起動パラメータは-shardsvrパラメータを指定します。それ以外の場合は、タイムスライスの開始データベース与えられた:{ "コード":193、 "OK":0、 "のErrMsgは、": "未開始できるコマンドと--shardsvr IFシャーディングを受け入れません"}。
- デフォルトで生成された断片は、データベース内のスライス(sh.enableSharding(「DBNAMEを」))を開始し、その後スライスセット(sh.shardCollection(「コレクション」{}キーシート))を設定する必要はありません。
環境情報
操作系统:centos6.8 mongodb版本:mongodb-linux-x86_64-rhel62-4.0.6.tgz 3台虚拟机 192.168.57.201、192.168.57.202、192.168.57.203 集群环境 2个分片复制集 shard1(192.168.57.201:27017、192.168.57.202:27017、192.168.57.203:27017) shard2(192.168.57.201:27018、192.168.57.202:27018、192.168.57.203:27018) 1个config复制集 (192.168.57.201:28018、192.168.57.202:28018、192.168.57.203:28018) 1个mongos节点
レプリケーション設定されたスライス建物のMongoDB
shard1クラスターステップ
#解压缩 tar xzvf mongodb-linux-x86_64-rhel62-4.0.6.tgz
mongo.conf(201/202/203):(yidian_repl)、複製セットの設定ファイルを追加します。
fork=true # 数据路径 dbpath=/opt/mongo/data/db port=27017 bind_ip=0.0.0.0 # 日志路径 logpath=/opt/mongo/logs/mongodb.log logappend=true # 复制集的名字 replSet=yidian_repl smallfiles=true #分片集群必须要有的属性 shardsvr=true
mongo2.conf(201/202/203):(yidian_repl2)、複製セットの設定ファイルを追加します。
fork=true dbpath=/opt/mongo/data/db2 port=27018 bind_ip=0.0.0.0 logpath=/opt/mongo/logs/mongodb2.log logappend=true replSet=yidian_repl2 smallfiles=true shardsvr=true
レプリカセットを開始します
# 根据自己文件的路径去调整 ./mongod -f mongo.conf # 当前视频中的地址,启动(yidian_repl) /opt/yidian/mongodb-linux-x86_64-rhel62-4.0.6/bin/mongod -f /opt/mongo/mongo.conf # 当前视频中的地址,启动(yidian_repl2) /opt/yidian/mongodb-linux-x86_64-rhel62-4.0.6/bin/mongod -f /opt/mongo/mongo2.conf
レプリケーションセットのログを、初期設定を追加
# 进入mongo客户端 # 配置(yidian_repl) /opt/yidian/mongodb-linux-x86_64-rhel62-4.0.6/bin/mongo -port 27017 # 配置(yidian_repl2) /opt/yidian/mongodb-linux-x86_64-rhel62-4.0.6/bin/mongo -port 27018
27017クライアントを入力した後、初期化コマンドを実行します
# 配置复制集 var rsconf = { _id:'yidian_repl', //这里的_id要与配置文件中指定的服务所属的复制集相同 members: //复制集成员 [ { _id:1, //成员的id host:'192.168.57.201:27017' //成员所属节点的ip以及该成员服务启动时所占的端口 }, { _id:2, host:'192.168.57.202:27017' }, { _id:3, host:'192.168.57.203:27017' } ] } #初始化配置(加载rsconf配置文件) rs.initiate(rsconf); #状态查看 rs.status();
27018クライアントを入力した後、初期化コマンドを実行します
# 配置复制集 var rsconf = { _id:'yidian_repl2', //这里的_id要与配置文件中指定的服务所属的复制集相同 members: //复制集成员 [ { _id:1, //成员的id host:'192.168.57.201:27018' //成员所属节点的ip以及该成员服务启动时所占的端口 }, { _id:2, host:'192.168.57.202:27018' }, { _id:3, host:'192.168.57.203:27018' } ] } #初始化配置(加载rsconf配置文件) rs.initiate(rsconf); #状态查看 rs.status();
コンフィグレプリケーションセットのノードを構築
Mongoの-cfg.conf(201/202/203):configノードの設定ファイルを作成します。
systemLog: destination: file # 日志存储位置 path: /opt/mongo/mongo-cfg/logs/mongodb.log logAppend: true storage: journal: enabled: true # 数据存储位置 dbPath: /opt/mongo/mongo-cfg/data # 是否一个库一个文件夹 directoryPerDB: true wiredTiger: engineConfig: # 最大使用cache(根据真实情况自行调节) cacheSizeGB: 1 # 是否将索引也按照数据库名单独存储 directoryForIndexes: true collectionConfig: # 表压缩配置 blockCompressor: zlib indexConfig: prefixCompression: true net: # IP地址 bindIp: 192.168.57.201 # 端口 port: 28018 replication: oplogSizeMB: 2048 # 配置节点的复制集名字 replSetName: configReplSet sharding: clusterRole: configsvr processManagement: fork: true
スタートアップ・コンフィギュレーション・セットをコピーします
# 配置文件地址,自行调整 /opt/yidian/mongodb-linux-x86_64-rhel62-4.0.6/bin/mongod -f /opt/mongo/mongo-cfg.conf
ログイン構成ノード
#登录 指定IP 和 端口 /opt/yidian/mongodb-linux-x86_64-rhel62-4.0.6/bin/mongo -host 192.168.57.201 -port 28018
初期化コマンド
rs.initiate( { _id: "configReplSet", configsvr: true, members: [ { _id : 0, host : "192.168.57.201:28018" }, { _id : 1, host : "192.168.57.202:28018" }, { _id : 2, host : "192.168.57.203:28018" } ] } )
mongosノード(201)
mongosプロフィール
systemLog: destination: file path: /opt/mongo/mongos/log/mongos.log logAppend: true net: bindIp: 192.168.57.201 port: 28017 sharding: configDB: configReplSet/test201:28018,test202:28018,test203:28018 processManagement: fork: true
test201 / test202 / test203ローカルホストを設定します
[root@test201 mongos]# cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.57.201 test201 192.168.57.202 test202 192.168.57.203 test203
スタートmongos
/opt/yidian/mongodb-linux-x86_64-rhel62-4.0.6/bin/mongos -config /opt/mongo/mongos/mongos.conf
ログインmongosノード
/opt/yidian/mongodb-linux-x86_64-rhel62-4.0.6/bin/mongo 192.168.57.201:28017
クラスタノードフラグメントを追加
管理者の切り替え:管理者を使用します
shard1レプリケーションセットを追加
db.runCommand( { addshard : "yidian_repl/192.168.57.201:27017,192.168.57.202:27017,192.168.57.203:27017",name:"shard1"} )
shard2レプリケーションセットを追加
db.runCommand( { addshard : "yidian_repl2/192.168.57.201:27018,192.168.57.202:27018,192.168.57.203:27018",name:"shard2"} )
ビューの断片化
# mongos db.runCommand( { listshards : 1 } )
ビューの断片化状況
# mongos sh.status()
テストクラスタの断片化
オープンスライス構成データベース
db.runCommand( { enablesharding : "testdb" } )
キースライス(ID)を作成します。
db.runCommand( { shardcollection : "testdb.users",key : {id: 1} } )
インデックスを作成します(そうでない場合は空のセットを、最初の操作ではありません)
use testdb db.users.ensureIndex( { id: 1 } )
テストデータを追加
var arr=[]; for(var i=0;i<1500000;i++){ var uid = i; var name = "name"+i; arr.push({"id":uid,"name":name}); } db.users.insertMany(arr);
クラスタコマンドの他のフラグメント
# 添加分片 db.runCommand( { addshard : "yidian_repl2/192.168.57.201:27018,192.168.57.202:27018,192.168.57.203:27018",name:"shard2"} ) # 删除分片 db.runCommand( { removeShard: "shard2" } )
ビデオチュートリアル:www.yidiankt.com
QQのディスカッション・グループ:706 564 342
国民の関心の数 - コア知識[JAVA]に自由にアクセス!!