设为首页 收藏本站
查看: 1300|回复: 0

[经验分享] MongoDB 分布式分片集群 [四]

[复制链接]

尚未签到

发表于 2018-10-27 07:24:29 | 显示全部楼层 |阅读模式
  MongoDB的分布式分片集群(sharding cluster)配置
  Sharding cluster介绍
  这是一种可以水平扩展的模式,在数据量很大时特给力,实际大规模应用一般会采用这种架构去构建monodb系统。
  要构建一个 MongoDB Sharding Cluster,需要三种角色:
  Shard Server: mongod 实例,用于存储实际的数据块,实际生产环境中一个shard server角色可由几台机器组个一个relica set承担,防止主机单点故障.
  Config Server: mongod 实例,存储了整个 Cluster Metadata,其中包括 chunk 信息。
  Route Server: mongos 实例,前端路由,客户端由此接入,且让整个集群看上去像单一数据库,前端应用可以透明使用。
  实验环境:
  192.168.3.206                       #IP地址
  mongod shard11:27017   #27017端口为分片服务器11
  mongod shard21:27018  #27018端口为分片服务器21
  mongod config01:20000    #20000端口为配置服务器01
  mongos01:30000      #30000端口为路由服务器01
  192.168.3.210                       #IP地址
  mongod shard12:27017   #27017端口为分片服务器12
  mongod shard22:27018  #27018端口为分片服务器22
  mongod config02:20000    #20000端口为配置服务器02
  mongos02:30000      #30000端口为路由服务器02
  192.168.3.201                       #IP地址
  mongod shard13:27017   #27017端口为分片服务器13
  mongod shard23:27018  #27018端口为分片服务器23
  mongod config03:20000    #20000端口为配置服务器03
  mongos03:30000      #30000端口为路由服务器03
  备注:
  分别在3台机器运行一个mongod实例(称为mongod shard11,mongod shard12,mongod shard13)组织replica 1905_01,作为cluster的shard_1905_01
  分别在3台机器运行一个mongod实例(称为mongod shard21,mongod shard22,mongod shard23)组织replica 1905_02,作为cluster的shard_1905_02
  每台机器运行一个mongod实例,作为3个config server
  每台机器运行一个mongs进程,用于客户端连接
  1.安装方法
  参照http://blog.csdn.net/liu331095659/article/details/37870323来安装。安装成功后,不要用博客上面的启动命令。
  2.创建数据目录
  192.168.3.206服务器上面操作如下:
  mkdir -p /data/mongodb/shard11
  mkdir -p /data/mongodb/shard21
  mkdir -p /data/mongodb/config
  192.168.3.210服务器上面操作如下:
  mkdir -p /data/mongodb/shard12
  mkdir -p /data/mongodb/shard22
  mkdir -p /data/mongodb/config
  192.168.3.201服务器上面操作如下:
  mkdir -p /data/mongodb/shard13
  mkdir -p /data/mongodb/shard23
  mkdir -p /data/mongodb/config
  3.配置replice sets(副本集):
  3.1配置shard_1905_01所用到的replica sets:
  192.168.3.206服务器上面操作如下:
  /usr/local/mongodb/bin/mongod  --dbpath=/data/mongodb/shard11 --logpath /data/logs/mongodb/shard11.log --logappend --port=27017 -replSet shard_1905_01 -maxConns=2000 -oplogSize 100 -fork
  192.168.3.210服务器上面操作如下:
  /usr/local/mongodb/bin/mongod  --dbpath=/data/mongodb/shard12 --logpath /data/logs/mongodb/shard12.log --logappend --port=27017 -replSet shard_1905_01 -maxConns=2000 -oplogSize 100 -fork
  192.168.3.201服务器上面操作如下:
  /usr/local/mongodb/bin/mongod  --dbpath=/data/mongodb/shard13 --logpath /data/logs/mongodb/shard13.log --logappend --port=27017 -replSet shard_1905_01 -maxConns=2000 -oplogSize 100 -fork
  3.2初始化replica set
  用mongo连接其中一个mongod,执行:
  /usr/local/mongodb/bin/mongo localhost:27017
  config = {_id:"shard_1905_01",members:[{_id:0,host:'192.168.3.206:27017'},{_id:1,host:'192.168.3.210:27017'},{_id:2,host:'192.168.3.201:27017'}]}
  rs.initiate(config);
  3.3配置shard_1905_02所用到的replica sets:
  192.168.3.206服务器上面操作如下:
  /usr/local/mongodb/bin/mongod  --dbpath=/data/mongodb/shard21 --logpath /data/logs/mongodb/shard21.log --logappend --port=27018 -replSet shard_1905_02 -maxConns=2000 -oplogSize 100 -fork
  192.168.3.210服务器上面操作如下:
  /usr/local/mongodb/bin/mongod  --dbpath=/data/mongodb/shard22 --logpath /data/logs/mongodb/shard22.log --logappend --port=27018 -replSet shard_1905_02 -maxConns=2000 -oplogSize 100 -fork
  192.168.3.201服务器上面操作如下:
  /usr/local/mongodb/bin/mongod  --dbpath=/data/mongodb/shard23 --logpath /data/logs/mongodb/shard23.log --logappend --port=27018 -replSet shard_1905_02 -maxConns=2000 -oplogSize 100 -fork
  3.4初始化replica set
  用mongo连接其中一个mongod,执行:
  /usr/local/mongodb/bin/mongo localhost:27018
  config = {_id:"shard_1905_02",members:[{_id:0,host:'192.168.3.206:27018'},{_id:1,host:'192.168.3.210:27018'},{_id:2,host:'192.168.3.201:27018'}]}
  rs.initiate(config);
  #到此就配置好了二个replica sets,也就是准备好了二个shards
  4.配置三台config server
  192.168.3.206服务器上面操作如下:
  /usr/local/mongodb/bin/mongod --configsvr --dbpath=/data/mongodb/config/ --port=20000 --logpath=/data/logs/mongodb/config.log --logappend -fork
  192.168.3.210服务器上面操作如下:
  /usr/local/mongodb/bin/mongod --configsvr --dbpath=/data/mongodb/config/ --port=20000 --logpath=/data/logs/mongodb/config.log --logappend -fork
  192.168.3.201服务器上面操作如下:
  /usr/local/mongodb/bin/mongod --configsvr --dbpath=/data/mongodb/config/ --port=20000 --logpath=/data/logs/mongodb/config.log --logappend -fork
  5.配置mongs
  192.168.3.206服务器上面操作如下:
  /usr/local/mongodb/bin/mongos --configdb 192.168.3.206:20000,192.168.3.210:20000,192.168.3.201:20000 --port=30000 --chunkSize 5 --logpath=/data/logs/mongodb/mongos.log --logappend -fork
  192.168.3.210服务器上面操作如下:
  /usr/local/mongodb/bin/mongos --configdb 192.168.3.206:20000,192.168.3.210:20000,192.168.3.201:20000 --port=30000 --chunkSize 5 --logpath=/data/logs/mongodb/mongos.log --logappend -fork
  192.168.3.201服务器上面操作如下:
  /usr/local/mongodb/bin/mongos --configdb 192.168.3.206:20000,192.168.3.210:20000,192.168.3.201:20000 --port=30000 --chunkSize 5 --logpath=/data/logs/mongodb/mongos.log --logappend -fork
  6.连接到其中一个mongos进程,并切换到admin数据库做以下配置
  6.1连接到mongs,并切换到admin
  /usr/local/mongodb/bin/mongo 192.168.3.206:30000/admin
  mongos> db  #mongodb命令
  6.2. 加入shards
  #如里shard是单台服务器,用>db.runCommand( { addshard : “[:]” } )这样的命令加入,
  #如果shard是replica sets,用replicaSetName/[:port][,serverhostname2[:port],…]这样的格式表示,例如本例执行:
  mongos>db.runCommand( { addshard : "shard_1905_01/192.168.3.206:27017,192.168.3.210:27017,192.168.3.201:27017",name:"s1",maxsize:20480} );
  mongos>db.runCommand( { addshard : "shard_1905_02/192.168.3.206:27018,192.168.3.210:27018,192.168.3.201:27018",name:"s2",maxsize:20480} );
  注意:在添加第二个shard时,出现error:test database 已经存在的错误,这里用mongo命令连接到第二个replica set,用db.dropDatabase()命令把test数据库给删除然后就可加入
  name:用于指定每个shard的名字,不指定的话系统将自动分配
  maxsize:指定各个shard可使用的最大磁盘空间,单位megabytes
  6.3Listing shards
  mongos> db.runCommand( { listshards : 1 } )  #mongodb命令
  {
  "shards" : [
  {
  "_id" : "s1",
  "host" : "shard_1905_01/192.168.3.201:27017,192.168.3.206:27017,192.168.3.210:27017"
  },
  {
  "_id" : "s2",
  "host" : "shard_1905_02/192.168.3.201:27018,192.168.3.206:27018,192.168.3.210:27018"
  }
  ],
  "ok" : 1
  }
  #如果列出了以上二个你加的shards,表示shards已经配置成功
  6.4 激活数据库分片
  mongos>db.runCommand({enablesharding:””})
  #通过执行以上命令,可以让数据库跨shard,如果不执行这步,数据库只会存放在一个shard,一旦激活数据库分片,数据库中不同的 collection将被存放在不同的shard上,
  #但一个collection仍旧存放在同一个shard上,要使单个collection也分片,还 需单独对collection作些操作。
  如:
  mongos> db.runCommand({enablesharding:"test"})   #mongodb命令
  { "ok" : 1 }                         #返回结果
  查看数否生效:
  mongos> db.printShardingStatus()    #mongodb命令
  --- Sharding Status ---
  sharding version: {
  "_id" : 1,
  "version" : 4,
  "minCompatibleVersion" : 4,
  "currentVersion" : 5,
  "clusterId" : ObjectId("53c76f7a9adee90a8b860eea")
  }
  shards:
  {  "_id" : "s1",  "host" : "shard_1905_01/192.168.3.201:27017,192.168.3.206:27017,192.168.3.210:27017" }
  {  "_id" : "s2",  "host" : "shard_1905_02/192.168.3.201:27018,192.168.3.206:27018,192.168.3.210:27018" }
  databases:
  {  "_id" : "admin",  "partitioned" : false,  "primary" : "config" }
  {  "_id" : "test",  "partitioned" : true,  "primary" : "s2" }
  注释:
  一旦enable了个数据库,mongos将会把数据库里的不同数据集放在不同的分片上。除非数据集被分片(下面会设置),否则一个数据集的所有数据将放在一个分片上。
  6.5collecton分片:
  注释:
  #要使单个collection也分片存储,需要给collections指定一个分片key,如下:
  #> db.runCommand( {shardcollection : “”,key :  })
  #a. 分片的collection系统会自动创建一个索引(也可用户提前创建好)
  #b. 分片的collection只能有一个在分片key上的唯一索引,其它唯一索引不被允许
  分片collection例子:
  mongos>  db.runCommand({shardcollection:"test.liu_user",key:{id:1}}) #mongodb命令
  { "collectionsharded" : "test.liu_user", "ok" : 1 }                                       #返回结果
  mongos>  use test          #mongodb命令
  #模拟向liu_user集合插入测试数据200003条:
  mongos> for(var i =0; i db.liu_user.find().count() #mongodb命令
  225366
  mongos> db.liu_user.stats() #mongodb命令
  {
  "sharded" : true,
  "systemFlags" : 1,
  "userFlags" : 1,
  "ns" : "test.liu_user",
  "count" : 225366,
  "numExtents" : 14,
  "size" : 25240992,
  "storageSize" : 48979968,
  "totalIndexSize" : 13662096,
  "indexSizes" : {
  "_id_" : 7342048,
  "id_1" : 6320048
  },
  "avgObjSize" : 112,
  "nindexes" : 2,
  "nchunks" : 6,
  "shards" : {
  "s1" : {
  "ns" : "test.liu_user",
  "count" : 25363,
  "size" : 2840656,
  "avgObjSize" : 112,
  "storageSize" : 11182080,
  "numExtents" : 6,
  "nindexes" : 2,
  "lastExtentSize" : 8388608,
  "paddingFactor" : 1,
  "systemFlags" : 1,
  "userFlags" : 1,
  "totalIndexSize" : 1553440,
  "indexSizes" : {
  "_id_" : 833952,
  "id_1" : 719488
  },
  "ok" : 1
  },
  "s2" : {
  "ns" : "test.liu_user",
  "count" : 200003,
  "size" : 22400336,
  "avgObjSize" : 112,
  "storageSize" : 37797888,
  "numExtents" : 8,
  "nindexes" : 2,
  "lastExtentSize" : 15290368,
  "paddingFactor" : 1,
  "systemFlags" : 1,
  "userFlags" : 1,
  "totalIndexSize" : 12108656,
  "indexSizes" : {
  "_id_" : 6508096,
  "id_1" : 5600560
  },
  "ok" : 1
  }
  },
  "ok" : 1
  }
  #看到上面内容一样说明分片成功。我感觉神奇的是为什么我插入的是200003记录,怎么变成225366这么多了。还得继续研究...


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-626916-1-1.html 上篇帖子: MongoDB 主从配置 [二] 下篇帖子: mongodb集合的简单操作
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表