mongo高可用分片(转载自:http://blog.csdn.net/zlp1992/article/details/77053462)

Windows搭建MongoDB分片以及复制集

 

本文主要介绍如何在windows部署MongoDB的复制集以及分片,在搭建过程中主要参考了http://blog.csdn.net/sxb0841901116/article/category/2549001对MongoDB分片和复制集的介绍与搭建,但自己在搭建过程中又碰到了一些问题,因此记录一下。

自己是在一台window机器部署整套,包含了一个分片Shard,分片包含了三个复制集(1个primary,2个secondary),一个路由server,两个配置server,最终架构图如下: 
这里写图片描述

从图中可以看到,集群包括几个部分: 
分片服务器:存储数据的地方,可以有多个分片,每个分片又可以有多个复制集 
配置服务器:保存分片数据与服务器映射等数据,可以配置成复制集,避免单点故障 
路由服务器:与client打交道,先查询配置服务器,找到数据所属的分片再获取数据返回给client 
client:客户端应用程序,不关心mongo是否使用了分片与复制集,只需与路由服务器交互

首先安装好MongoDB,我的安装目录为:D:\software\MongoDB\Server\3.4\bin 
安装之前,先创建好所需的目录,由于我只部署了一个分片(rs-a),分片包含三个复制集,2个配置服务器复制集、一个路由服务器,因此对应的数据目录如下: 
这里写图片描述 
同时创建log日志目录:

D:\software\MongoDB\data\log
  • 1

下面开始部署 
1. 配置分片复制集

- 创建实例 
命令行窗口进入bin目录下,使用如下命令(三个命令行窗口)

mongod --port 3000 --shardsvr --replSet rs-a --dbpath "D:\software\MongoDB\data\data\rs-a-0" --logpath "D:\software\MongoDB\data\log\rs-a-0.log"
mongod --port 3001 --shardsvr --replSet rs-a --dbpath "D:\software\MongoDB\data\data\rs-a-1" --logpath "D:\software\MongoDB\data\log\rs-a-1.log"
mongod --port 3002 --shardsvr --replSet rs-a --dbpath "D:\software\MongoDB\data\data\rs-a-2" --logpath "D:\software\MongoDB\data\log\rs-a-2.log"
  • 1
  • 2
  • 3

这里 --shardsvr要求使用分片,--replSet要是使用复制集,复制集名称为 rs-a,这是我们便创建了包含三个复制集的一个分片,注意复制集名字要一致,同时 --logpath的参数要求是一个文件而不是目录 
上面只是创建了三个可以分片和使用复制集的服务器,我们需要对其初始化设置复制集中的primary和secondary

- 初始化,配置Primary和Secondary复制集 
接着再开一个窗口,连接其中的一个服务器,使用命令:mongo --port 3000,连接后使用命令 rs.initiate() 初始化,过一会儿,此实例便成为了Primary,可以使用 rs.isMaster()rs.status()查看对应情况,如下: 
这里写图片描述 
查看对应情况 
这里写图片描述 
此时,我们还需要把另外两个加入进来,成为Secondary,使用命令rs.add("host:port"),我的电脑名为 “HIH-D-11698”

这里写图片描述 
此时,带有分片的复制集便建立完成,同样可以使用rs.status()查看信息 
注意,MongDB默认Secondary是不支持读写操作的,要使Secondary能支持读,需要连接到Secondary的mongod,使用db.getMongo().setSlaveOk() 将其设为从服务器,但此时他还是不支持写操作

2. 配置Config Server 复制集 
这里需要将Config Server配置为复制集,即使复制集只包含一个mongo实例,如果你采用mongod --configsvr --port 27010 命令将配置服务器作为standalone mongod process,当你配置路由服务器Mongos的时候mongos --configdb localhost:27010 --port 27011就会报错

BadValue: configdb supports only replica set connection string  
  • 1

这是因为Mongo3.4及以上要求Config Server为复制集,具体问题可见https://stackoverflow.com/questions/42392923/unable-to-launch-mongos 
因此我这里将Config Server配置为包含2个实例的复制集,开两个窗口,运行如下命令:

mongod --port 27019 --configsvr --replSet rs-conf --dbpath "D:\software\MongoDB\data\data\config0" --logpath "D:\software\MongoDB\data\log\config0.log"
mongod --port 27020 --configsvr --replSet rs-conf --dbpath "D:\software\MongoDB\data\data\config1" --logpath "D:\software\MongoDB\data\log\config1.log"
  • 1
  • 2

这里,复制集名称为rs-conf,同样我们需要按照前述配置分片复制集那样使用 rs.initiate()等命令进行配置,这里就省略了

3. 配置路由服务器 router server 
一开始当我使用 mongos --configdb HIH-D-11698:27019,HIH-D-11698:27020 --port 27018,报错,--configdb后面表示的是配置服务器地址,--port表示mongos的端口,但是这样报错

FailedToParse: invalid url [HIH-D-11698:27019,HIH-D-11698:27020]
  • 1

原来,mongos 要求config server是复制集并且在前面加上复制集的名称,参见https://stackoverflow.com/questions/38467269/mongodb-query-router-setup-issue-with-config-file 
因此按如下方式启动mongos 
这里写图片描述 
我之前配置的config server的复制集名称为 rs-conf

4. 添加创建的分片 
将我们前面创建的分片添加进去,使用命令 mongo --port 27018登录mongos,使用sh.addShard添加分片 
这里写图片描述 
使用sh.status()查看分片信息

6. 开启数据库的分片 
为了在数据库中使用分片,我们要使用sh.enableSharding()开启数据库的分片 
这里写图片描述 
可以看到数据库test开启了分片

 

 这里要注意的是,在addshard中,我们也可以添加副本集,这样能达到更高的稳定性。

  <2>片已经集群了,但是mongos不知道该如何切分数据,也就是我们先前所说的片键,在mongodb中设置片键要做两步

  ①:开启数据库分片功能,命令很简单 enablesharding(),这里我就开启test数据库。

  ②:指定集合中分片的片键,这里我就指定为person.name字段。

 

7: 查看效果

  好了,至此我们的分片操作全部结束,接下来我们通过mongos向mongodb插入10w记录,然后通过printShardingStatus命令查看mongodb的数据分片情况。

   这里主要看三点信息:

    ① shards:我们清楚的看到已经别分为两个片了,shard0000和shard0001。

    ② databases:这里有个partitioned字段表示是否分区,这里清楚的看到test已经分区。

    ③ chunks:这个很有意思,我们发现集合被砍成四段:无穷小 —— jack0,jack0 ——jack234813,jack234813——jack9999,jack9999——无穷大。分区情况为:3:1,从后面的 on shardXXXX也能看得出。

1
0

 

sharding整理:

   环境准备:

            

    配置Sharding
        登录路由控制器上添加Shard节点,进行配置Sharding
                /app/mongo/mongodb/bin/mongo admin --port 40000           连接路由
                >db.runCommand({addshard:"localhost:20000"})               添加本地端口20000的Shard Server实例
                >db.runCommand({addshard:"localhost:20001"})
                >db.runCommand({enablesharding:"test"})                    设置在test数据库上执行分片
                >db.runCommand({shardcollection:"test.users",key:{_id:1}}) 设置在test数据库的users表上分片,同时指明id为shard key
        验证Sharding
                >use test
                >for(var i=1;i<500000;i++){db.users.insert({age:i,name:"liangzhangping",addr:"beijing",country:"china"})}
                >db.users.stats()
                    

   
        维护Sharding信息
                1、列出所有的Shard Server
                        >db.runCommand({listshards:1})
                2、查看Sharding信息
                        >printShardingStatus()
                3、判断是否是Sharding
                        >db.runCommand({isdbgrid:1})
                4、对现有的表执行Sharding
                        >db.runCommand({shardcollection:"test.users",key:{_id:1}})
       
        新增Shard Server
                1、创建新增Shard Server数据目录
                        mkdir -p /app/mongo/mongodb/data/shard/s2
                2、启动Shard Server
                        /app/mongo/mongodb/bin/mongod --shardsvr --port 20002 --dbpath=/app/mongo/mongodb/data/shard/s2 --fork --logpath=/app/mongo/mongodb/data/shard/log/s2.log  --directoryperdb
                3、添加Shard Server到Sharding环
                        >db.runCommand({addshard:"localhost:20002"})

        移除Shard Server
                >use admin
                >db.runCommand({"removeshard":"localhost:20002"})

 
 
转载 自 http://www.cnblogs.com/huangxincheng/
 

posted on 2017-11-17 16:16  工业物联网  阅读(199)  评论(0)    收藏  举报

导航