MongoDB03MongoDB索引及分片
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MongoDB03MongoDB索引及分片相关的知识,希望对你有一定的参考价值。
一、MongoDB配置
mongodb配置文件/etc/mongodb.conf中的配置项,其实都是mongod启动选项(和memcached一样)
[[email protected] ~]# mongod --help Allowed options: General options: -h [ --help ] show this usage information --version show version information -f [ --config ] arg configuration file specifying additional options -v [ --verbose ] be more verbose (include multiple times for more verbosity e.g. -vvvvv) --quiet quieter output --port arg specify port number - 27017 by default --bind_ip arg comma separated list of ip addresses to listen on - all local ips by default --maxConns arg max number of simultaneous connections - 20000 by default --logpath arg log file to send write to instead of stdout - has to be a file, not directory --logappend append to logpath instead of over-writing --pidfilepath arg full path to pidfile (if not set, no pidfile is created) --keyFile arg private key for cluster authentication --setParameter arg Set a configurable parameter --nounixsocket disable listening on unix sockets --unixSocketPrefix arg alternative directory for UNIX domain sockets (defaults to /tmp) --fork fork server process --syslog log to system‘s syslog facility instead of file or stdout --auth run with security --cpu periodically show cpu and iowait utilization --dbpath arg directory for datafiles - defaults to /data/db/ --diaglog arg 0=off 1=W 2=R 3=both 7=W+some reads --directoryperdb each database will be stored in a separate directory --ipv6 enable IPv6 support (disabled by default) --journal enable journaling --journalCommitInterval arg how often to group/batch commit (ms) --journalOptions arg journal diagnostic options --jsonp allow JSONP access via http (has security implications) --noauth run without security --nohttpinterface disable http interface --nojournal disable journaling (journaling is on by default for 64 bit) --noprealloc disable data file preallocation - will often hurt performance --noscripting disable scripting engine --notablescan do not allow table scans --nssize arg (=16) .ns file size (in MB) for new databases --profile arg 0=off 1=slow, 2=all --quota limits each database to a certain number of files (8 default) --quotaFiles arg number of files allowed per db, requires --quota --repair run repair on all dbs --repairpath arg root directory for repair files - defaults to dbpath --rest turn on simple rest api --shutdown kill a running server (for init scripts) --slowms arg (=100) value of slow for profile and console log --smallfiles use a smaller default file size --syncdelay arg (=60) seconds between disk syncs (0=never, but not recommended) --sysinfo print some diagnostic system information --upgrade upgrade db if needed Replication options: --oplogSize arg size to use (in MB) for replication op log. default is 5% of disk space (i.e. large is good) Master/slave options (old; use replica sets instead): --master master mode --slave slave mode --source arg when slave: specify master as <server:port> --only arg when slave: specify a single database to replicate --slavedelay arg specify delay (in seconds) to be used when applying master ops to slave --autoresync automatically resync if slave data is stale Replica set options: --replSet arg arg is <setname>[/<optionalseedhostlist>] --replIndexPrefetch arg specify index prefetching behavior (if secondary) [none|_id_only|all] Sharding options: --configsvr declare this is a config db of a cluster; default port 27019; default dir /data/configdb --shardsvr declare this is a shard db of a cluster; default port 27018 SSL options: --sslOnNormalPorts use ssl on configured ports --sslPEMKeyFile arg PEM file for ssl --sslPEMKeyPassword arg PEM file password --sslCAFile arg Certificate Authority file for SSL --sslCRLFile arg Certificate Revocation List file for SSL --sslWeakCertificateValidation allow client to connect without presenting a certificate --sslFIPSMode activate FIPS 140-2 mode at startup
常用配置参数:
fork={true|false} mongod是否运行于后台
bind_ip=IP 指定监听地址
port=PORT 指定监听的端口,默认为27017
maxConns=N 指定最大并发连接数
syslog=/PATH/TO/SAME_FILE 指定日志文件
httpinterface=true 是否启动web监控功能,端口为mongod端口 + 1000
journal 是否启动事务日志,默认已启动
slowms arg (=100) 设定慢查询,单位为ms,超过设定的时间就为慢查询,默认100ms
repair 意外关闭时,应该启用这样来修复数据
二、索引
索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录。这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可以要花费几十秒甚至几分钟,这对网站的性能是非常致命的。
索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中,索引是对数据库表中一列或多列的值进行排序的一种结构
1、索引的类型
B+ Tree、hash、空间索引、全文索引
MongoDB支持的索引:
单字索引、组合索引(多字段索引)、
多键索引:索引创建在值为键值对上的索引
空间索引:基于位置查找
文本索引:相当于全文索引
hash索引:精确查找,不适用于范围查找
2、索引的管理
创建:
db.mycoll.ensureIndex(keypattern[,options])
查看帮助信息:
db.mycoll.ensureIndex(keypattern[,options]) - options is an object with these possible fields: name, unique, dropDups
db.COLLECTION_NAME.ensureIndex({KEY:1})
语法中 Key 值为你要创建的索引字段,1为指定按升序创建索引,如果你想按降序来创建索引指定为-1即可。ensureIndex() 方法中你也可以设置使用多个字段创建索引(关系型数据库中称作复合索引)。db.col.ensureIndex({"title":1,"description":-1})
ensureIndex() 接收可选参数,可选参数列表如下:
Parameter | Type | Description |
---|---|---|
background | Boolean | 建索引过程会阻塞其它数据库操作,background可指定以后台方式创建索引,即增加 "background" 可选参数。 "background" 默认值为false。 |
unique | Boolean | 建立的索引是否唯一。指定为true创建唯一索引。默认值为false. |
name | string | 索引的名称。如果未指定,MongoDB的通过连接索引的字段名和排序顺序生成一个索引名称。 |
dropDups | Boolean | 在建立唯一索引时是否删除重复记录,指定 true 创建唯一索引。默认值为false. |
sparse | Boolean | 对文档中不存在的字段数据不启用索引;这个参数需要特别注意,如果设置为true的话,在索引字段中不会查询出不包含对应字段的文档.。默认值为false. |
expireAfterSeconds | integer | 指定一个以秒为单位的数值,完成 TTL设定,设定集合的生存时间。 |
v | index version | 索引的版本号。默认的索引版本取决于mongod创建索引时运行的版本。 |
weights | document | 索引权重值,数值在 1 到 99,999 之间,表示该索引相对于其他索引字段的得分权重。 |
default_language | string | 对于文本索引,该参数决定了停用词及词干和词器的规则的列表。 默认为英语 |
language_override | string | 对于文本索引,该参数指定了包含在文档中的字段名,语言覆盖默认的language,默认值为 language. |
查询:
db.mycoll.getIndex()
删除:
db.mycoll.dropIndexes() 删除当前集合的所有索引
db.mycoll.dropIndexes("index") 删除指定索引
db.mycoll.reIndex() 重新构建索引,
实例:
> db.students.find() > for (i=1;i<=100;i++) db.students.insert({name:"student"+i, age:(i%100)}) # 使用for循环 > db.students.find().count() 100 > db.students.find() { "_id" : ObjectId("58d613021e8383d30814f846"), "name" : "student1", "age" : 1 } { "_id" : ObjectId("58d613021e8383d30814f847"), "name" : "student2", "age" : 2 } { "_id" : ObjectId("58d613021e8383d30814f848"), "name" : "student3", "age" : 3 } { "_id" : ObjectId("58d613021e8383d30814f849"), "name" : "student4", "age" : 4 } { "_id" : ObjectId("58d613021e8383d30814f84a"), "name" : "student5", "age" : 5 } { "_id" : ObjectId("58d613021e8383d30814f84b"), "name" : "student6", "age" : 6 } { "_id" : ObjectId("58d613021e8383d30814f84c"), "name" : "student7", "age" : 7 } { "_id" : ObjectId("58d613021e8383d30814f84d"), "name" : "student8", "age" : 8 } { "_id" : ObjectId("58d613021e8383d30814f84e"), "name" : "student9", "age" : 9 } { "_id" : ObjectId("58d613021e8383d30814f84f"), "name" : "student10", "age" : 10 } { "_id" : ObjectId("58d613021e8383d30814f850"), "name" : "student11", "age" : 11 } { "_id" : ObjectId("58d613021e8383d30814f851"), "name" : "student12", "age" : 12 } { "_id" : ObjectId("58d613021e8383d30814f852"), "name" : "student13", "age" : 13 } { "_id" : ObjectId("58d613021e8383d30814f853"), "name" : "student14", "age" : 14 } { "_id" : ObjectId("58d613021e8383d30814f854"), "name" : "student15", "age" : 15 } { "_id" : ObjectId("58d613021e8383d30814f855"), "name" : "student16", "age" : 16 } { "_id" : ObjectId("58d613021e8383d30814f856"), "name" : "student17", "age" : 17 } { "_id" : ObjectId("58d613021e8383d30814f857"), "name" : "student18", "age" : 18 } { "_id" : ObjectId("58d613021e8383d30814f858"), "name" : "student19", "age" : 19 } { "_id" : ObjectId("58d613021e8383d30814f859"), "name" : "student20", "age" : 20 } Type "it" for more # 只显示前20个,it显示更多 > db.students.ensureIndex({name:1}) # 在name键上构建索引,1表示升序,-1表示降序 > show collections students system.indexes t1 > db.students.getIndexes() [ { # 默认的索引 "v" : 1, "name" : "_id_", "key" : { "_id" : 1 }, "ns" : "students.students" # 数据库.集合 }, { "v" : 1, "name" : "name_1", # 自动生成的索引名 "key" : { "name" : 1 # 在name键上创建的索引 }, "ns" : "students.students" } ] > db.students.dropIndexes("name_1") # 删除指定索引 { "nIndexesWas" : 2, "msg" : "non-_id indexes dropped for collection", "ok" : 1 } > db.students.getIndexes() [ { "v" : 1, "name" : "_id_", "key" : { "_id" : 1 }, "ns" : "students.students" } ] > db.students.dropIndexes() # 默认的索引无法删除, { "nIndexesWas" : 1, "msg" : "non-_id indexes dropped for collection", "ok" : 1 } > db.students.getIndexes() [ { "v" : 1, "name" : "_id_", "key" : { "_id" : 1 }, "ns" : "students.students" } > db.students.find({age:"90"}).explain() # 显示查询过程 { "cursor" : "BtreeCursor t1", "isMultiKey" : false, "n" : 0, "nscannedObjects" : 0, "nscanned" : 0, "nscannedObjectsAllPlans" : 0, "nscannedAllPlans" : 0, "scanAndOrder" : false, "indexOnly" : false, "nYields" : 0, "nChunkSkips" : 0, "millis" : 17, "indexBounds" : { # 使用的索引 "age" : [ [ "90", "90" ] ] }, "server" : "Node7:27017" }
三、MongoDB的分片
1、分片简介
随着业务发展,当数据集越来越大,CPU、Memory、IO出现瓶颈,就需要对mongodb进行扩展。
增加mongodb只能均衡读压力,不能均衡写压力,就需要对数据集分片。
mongodb原生支持分片
mysql:的分片解决方案
Gizzard, HiveDB, MySQL Proxy + HSACLE, Hibernate Shard, Pyshards
2、分片架构中的角色
mongos:Router
相当于代理,将用户请求路由到合适的分片上执行,本身不存储数据也不查询数据,
config server:元数据服务器,也需要多个,但不是副本集,需要借助其它工具实现如zookeeper
存放的是shard服务器上存储的数据集的索引
shard: 数据节点,也称mongod实例
zookeeper:
常用于实现分布式系统中心节点协调,能够提供选举并选举出主节点机制;zookeeper本身也可以自行做分布式。
3、分片的方式
分片是基于collection
为保证每个shard节点上数据集均衡,将每个collectin切割成大小固定的chunk(块),然后逐个分配给shard节点,
基于范围切片
range
基于列表切片
list
基于hash切片
hash
写离散,读集中
db.enableSharding("testdb")
以上是关于MongoDB03MongoDB索引及分片的主要内容,如果未能解决你的问题,请参考以下文章