(1)创建3个数据目录和3个日志文件:
cd C:\mongodb\data
md mongo1
md mongo2
md mongo3
md logs/mongo1.log
md logs/mongo2.log
md logs/mongo3.log
(2)接下来启动Mongo服务器。加上replSet标记,取名为book,并指定端口。打开rest标记,这样就能用web接口。设置bind_ip,允许远程访问。指定日志文件。
mongod --replSet book --dbpath mongo1 --port 27011 --rest --bind_ip localIP --logpath logs\mongo1.log --smallfiles --oplogSize 128
mongod --replSet book --dbpath mongo2 --port 27012 --rest --bind_ip localIP --logpath logs\mongo2.log --smallfiles --oplogSize 128
mongod --replSet book --dbpath mongo3 --port 27013 --rest --bind_ip localIP --logpath logs\mongo3.log --smallfiles --oplogSize 128
(3)初始化副本集,启动一个mongo shell,连接一个服务器,执行rs.initiate()函数
mongo IP:27011
>cfg = {
'_id':'book',
'members':[
{'_id':0, 'host': 'localIP:27011'},
{'_id':1, 'host': 'localIP:27012'},
{'_id':2, 'host': 'localIP:27013'}
]
}
>rs.initiate(cfg)
(4)此时服务器执行rs.status()查看主从服务器的信息
插入一条数据
>db.echo.insert({say:"hello"})
(5)默认只有主节点有读写权限,从节点没有读写权限,可以用一下命名来设置从节点的读权限
mongo IP:27012
>db.echo.find({})
>db.getMongo().setSlaveOk()
>db.echo.find({})
复制的概念很容易接受,写入一个MongoDB服务器,把数据复制到改副本集的其他服务器上。如果一个服务器不可用,其他服务器中的一个服务器会提升为主节点,并响应请求。但除了服务器崩溃之外,还有其他方式导致服务器不可用。有时候,节点之间的网络连接断了。在这种情况下,Mongo规定,如果大部分网络还能通讯,就认为网络还有效。
MongoDB希望副本集中总节点数为奇数。例如,考虑5个节点的网络。如果两连接问题导致它分裂成2节点和3节点的片段,较大的片段明显占了多数,可以选出一个主节点,继续响应请求。如果没有明显的多数,就无法选出。
有时候你可能不希望用奇数台服务器来复制数据。此时,要么可以启动一个仲裁者(一般推荐),要么增加服务器的投票权重(一般不推荐)。在Mongo中,仲裁者(arbiter)是副本集中参与投票,但不复制数据的服务器。像启动其他服务器一样启动它,但在配置中设一个标识,像这样
{_id:3,host:'localIP:27013',arbiterOnly:true}
Mongo存在的一个核心理由,就是安全而快速的处理非常大的数据集。实现这个目标最清楚的方法,就是按照值的范围进行横向分片,简称分片(sharding)。不同于一个服务器存放一个集合的所有值,把有些范围的值切分到其他服务器上。例如,在电话号码的集合中,可以将所有<1-500-000-0000的电话号码放到Mongo服务器A上,将>=1-500-000-0000的放到服务器B上。Mongo通过自动分片、自动管理这种划分,从而使这样做变得更容易。
(1)启动非复制的Mongo服务器
cd C:\mongodb\data
md mongo4
md mongo5
mongod --shardsvr --dbpath mongo4 --port 27014
mongod --shardsvr --dbpath mongo5 --port 27015
(2)现在需要一个服务器,实际追踪键。假定创建了一个表,按字母顺序保存城市的名称。需要某种方式知道(举个例子)以A~N开头的城市放在服务器4上,以O~Z开头的城市放在服务器5上面。在Mongo中,创建一个config服务器(它也是一个常规的mongod),追踪哪个服务器(mongo4或mongo5)拥有哪些值。
md mongoconfig
mongod --configsvr --dbpath mongoconfig --port 27016
(3)最后,需要运行第4个服务器,名为mongos,它是对客户的一个单点入口。monogs服务器将连接到mongoconfig服务器,追踪放在上面的分片信息。设置端口为27020,chunkSize 是1。(chunkSize是1MB,是允许的最小值,或为更大的数字)通过–confiddb标识,让mongos指向配置服务器和端口。
mongos --configdb localIP:27016 --chunkSize 1 --port 27020
(4)mongos漂亮的地方在于,它是一个全功能mongod服务器的轻量级副本。对mongod发出的几乎所有命令,都可以对mongos发出,这使它成为了客户端与多个分片服务器之间的完美中介。下面是服务器的设置图:
(5)现在打开mongos服务器的控制台,进入admin数据库。要配置一些分片。
mongo localIP:27020/admin
>db.runCommand({addshard:"localIP:27014"})
>db.runCommand({addshard:"localIP:27015"})
(6)这样设置之后,就要给出需要分片的数据库和集合,以及分片所依据的字段(在例子中,是城市的名称)
>db.runCommand({enablesharding:"test"})
>db.runCommand({shardcollection:"test.cities",key:{name:1}})
(7)完成设置之后,加载一些数据(mongo_cities1000.json)
mongoimport -h localIP:27020 -db test --collection cities \
--type json mongo_cities1000.json
通过mongo控制台,输入use test,从admin环境回到test环境
Mongo地理空间查询的秘诀在于索引。这是一种特殊形式的索引地理数据,名为geohash,不仅能在任意的查询中快速找到具体的值或范围,而且能快速找到附近的值。
1.登陆mongos
>mongo localIP:27020
2.建立索引
>db.cities.ensureIndex({location:"2d"})
3.寻找附近的值(对于分片和不分片的集合结果都是一样的)
>db.cities.find({location:{$near:[45.52,-122.67]}}).limit(5)
>db.runCommand({geoNear:'cities',near:[45.52,-122.67],num:5,maxDistance:1})