Mongo服务器集群配置学习三——分片
MongoDB的分片主要是指将集合拆分成小块并分别存在不同服务器上的过程。MongoDB支持自动分片,可摆脱手动分片管理上的困难。
在以下情况下需要运用分片:
1.服务器的磁盘不够用。
2.单个Mongod不能满足写数据的性能需求。
3.需要将大数据放入内存中提高性能。
下图为我们要实现的分片结构:
从图中我们看到原本一台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})
可以看到执行添加分片的操作要在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<=800001;i++){
db.info.insert({name:i})
}
在分别在分片服务器A和B上查询数据量,如图:看到这800001条数据已经分别存放在2个分片中了
正式环境配置
成功地构建分片需要如下条件:
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做了副本集配置)
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为活跃节点,如下图:
回到路由器上设置分片配置
mongos> db.runCommand({addshard:"replicademo/127.0.0.1:8001"})
这样mongos会知道它所连接的是replicademo副本集,在活跃节点down掉之后就会去寻找新的活跃结点。
执行db.printShardingStatus(),会看到副本集的节点都已经自动的配置进来了,如下图:
管理分片
分片的信息主要存放在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"})