Home >Database >Mysql Tutorial >Mongo服务器集群配置学习三分片

Mongo服务器集群配置学习三分片

WBOY
WBOYOriginal
2016-06-07 14:58:281229browse

Mongo服务器集群配置学习三分片 MongoDB的分片主要是指将集合拆分成小块并分别存在不同服务器上的过程。MongoDB支持自动分片,可摆脱手动分片管理上的困难。 在以下情况下需要运用分片: 1.服务器的磁盘不够用。 2.单个Mongod不能满足写数据的性能需求。 3.

Mongo服务器集群配置学习三——分片

MongoDB的分片主要是指将集合拆分成小块并分别存在不同服务器上的过程。MongoDB支持自动分片,可摆脱手动分片管理上的困难。
在以下情况下需要运用分片:
1.服务器的磁盘不够用。
2.单个Mongod不能满足写数据的性能需求。
3.需要将大数据放入内存中提高性能。
下图为我们要实现的分片结构:
Mongo服务器集群配置学习三分片
从图中我们看到原本一台Mongod节点被分成了A和B两个分片,由路由D读取配置服务器C的分片策略,然后决定数据存储在哪个分片上,而路由隐藏了决策的细节,用户直接访问路由就可以享受分片带来的优点,而不必关心路由读取分片的细节。
配置步骤:
1.创建配置服务器C
创建配置文件如下,端口为10000,并启动mongod -f config.cnf

dbpath=D:\mongodb\test\sharded\C\Data
bind_ip=127.0.0.1
port=10000

2.创建路由服务器D
路由器的配置文件如下:

bind_ip=127.0.0.1
port=20000
configdb=127.0.0.1:10000

其中configdb=127.0.0.1:10000配置的是路由监听的配置服务器的地址
路由器用mongos启动

mongos -f config.cnf

  注意:配置服务器要先启动,因为路由服务器需要监听配置服务器。
3.新建分片服务器A和B
A的配置,然后启动A

dbpath=D:\mongodb\test\sharded\A\Data
bind_ip=127.0.0.1
port=8001  

B的配置,然后启动B

dbpath=D:\mongodb\test\sharded\B\Data
bind_ip=127.0.0.1
port=8002

4.建立集群中分片服务器与路由器的连接
这个操作需要在路由器中配置,打开路由器的shell,执行数据库命令
db.runCommand({addshard:"127.0.0.1:8001",allowLocal:true})
db.runCommand({addshard:"127.0.0.1:8002",allowLocal:true})
Mongo服务器集群配置学习三分片

 可以看到执行添加分片的操作要在admin库中进行
5.为业务数据库添加分片功能
为person添加分片功能,在路由中执行db.runCommand({"enablesharding":"person"})
6.为集合进行分片
  片键:集合中的一个键作为分拆的依据。
  为person库的集合info进行分片,key字段设置了片键
  执行下列命令db.runCommand({"shardcollection":"person.info","key":{"_id":1}})
7.添加一定的大数据量,测试分片的功能
用脚本插入80万条数据
for(i=1;i   db.info.insert({name:i})
}
在分别在分片服务器A和B上查询数据量,如图:看到这800001条数据已经分别存放在2个分片中了
Mongo服务器集群配置学习三分片

正式环境配置
成功地构建分片需要如下条件:
1.多个配置服务器
2.多个mongos服务器
3.每个片都是副本集
1.多个配置服务器
创建配置服务器如上,现在启动mongos的时候应将其连接到这3个配置服务器。假如3个配置文件的端口号是20001~20003
mongos --configdb localhost:20001,localhost:20002,localhost:20003
配置服务器使用的是两步提交机制,不是普通的MongoDB的异步复制,来维护集群配置的不同副本。这样能保证集群状态的一致性。这意味着某台配置服务器down了后,集群配置信息将是只读的。但是客户端还是能够读写的,只有所有配置服务器备份了以后才能重新均衡数据。
2.多个mongos
Mongos的数量不受限制,建议针对一个应用服务器只运行一个mongos进程。这样每个应用服务器就可以与mongos进行本地会话。
3.每个片都是副本集
生产环境中,每个片都应是副本集。这样单个服务器坏了,就不会导致整个片失效。用addshard命令就可以讲副本集作为片添加,添加时只要指定副本集的名字和种子就好了。
实现即达到数据的分片存储也实现备份和故障自动修复功能,可以副本集和分片混合使用,构建如下图的架构,(为了举例简单仅给shardA做了副本集配置)
Mongo服务器集群配置学习三分片
1.修改A的配置如下:

dbpath=D:\mongodb\test\sharded\A\Data
bind_ip=127.0.0.1
port=8001
replSet=replicademo/127.0.0.1:8003

 新添加A1和A2两台节点与A组成副本集
A1的配置:

dbpath=D:\mongodb\test\sharded\A1\Data
bind_ip=127.0.0.1
port=8004
replSet=replicademo/127.0.0.1:8003

A2的配置:

dbpath=D:\mongodb\test\sharded\A2\Data
bind_ip=127.0.0.1
port=8003
replSet=replicademo/127.0.0.1:8001

在A的shell中执行副本集的舒适化

db.runCommand({"replSetInitiate":
  {
  "_id":'replicademo',
  "members":[
  {
  "_id":1,
  "host":"127.0.0.1:8001"
  },
  {
  "_id":2,
  "host":"127.0.0.1:8003"
  },
  {
  "_id":3,
  "host":"127.0.0.1:8004"
  }
  ]
  }
})

这样A,A1,A2的副本集就建立完成,查询配置看到A为活跃节点,如下图:
Mongo服务器集群配置学习三分片
回到路由器上设置分片配置
mongos> db.runCommand({addshard:"replicademo/127.0.0.1:8001"})
这样mongos会知道它所连接的是replicademo副本集,在活跃节点down掉之后就会去寻找新的活跃结点。
执行db.printShardingStatus(),会看到副本集的节点都已经自动的配置进来了,如下图:
Mongo服务器集群配置学习三分片

管理分片
分片的信息主要存放在config数据库上,这样就能被任何连接到mongos的进程访问到了。
配置集合
下面的代码都假设已经在shell中连接了mongos,并且已经运行了use config。
 1.片
可以在shards集合中查到所有的片 >db.shards.find();
2.数据库
databases集合含有已经在片上的数据库列表和一些相关信息。
>db.databases.find() 键的解释如下
"_id" : 表示数据名
"partitioned" : 是否启用分片功能
"primary" :这个值与"_id"对应,表示这个数据的大本营在哪里。也就是开始创建数据库文件的位置
 3.块
块信息保存在chunks集合中,你可以看到数据到底是怎么切分到集群的。
>db.chunks.find()
 分片命令
1.获得概要
>db.printShardingStatus() 给出前面说的那些集合的概要
2.删除片
用removeshard就能从集群中删除片,removeshard会把给定片上的所有块都挪到其他片上。
>db.runCommand({"removeshard":"localhost:10000"})

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn