您的位置:首页 > 数据库 > Mongodb

MongoDB 副本集,偶数节点问,分片,地理空间查询

2017-09-01 14:56 471 查看

副本集

Windows创建副本集步骤:

(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})
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mongodb windows