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

[经验分享] MongoDB高可用复制集分片集群搭建

[复制链接]

尚未签到

发表于 2017-12-16 07:15:55 | 显示全部楼层 |阅读模式
1     逻辑架构
  1.1     逻辑架构图
DSC0000.jpg

1.2     组件说明
  一、mongos(query routers):查询路由,负责client的连接,并把任务分给shards,然后收集结果。一个集群可以有多个query routers(replica sets),以分担客户端请求(负载均衡)。
  二、config server:配置服务器。保存了集群的元数据(比如数据放在哪个shards上),query router通过config server中的配置信息决定把任务分配到哪个shards上。从版本3.2开始,config servers可以做成replica sets。
  三、shards:分片,即数据结点,存储数据和执行计算。为了保证高可用和数据一致性,生产环境中shards 应该做成replicasets(防止丢失数据)。
2     服务器规划
  2.1     IP及端口规划
DSC0001.jpg

  2.2     linux目录规划
DSC0002.jpg

3     集群搭建
3.1     准备工作
  1、  根据服务器系统版本,来下载最新版MongoDB(3.2.x),下载地址:https://www.mongodb.com/download-center?jmp=nav#community
  2、  根据2.2节的目录规划,在6台机器中的任意一台上建好相应目录,并将下载好的MongoDB解压到/data01/项目名/mongodb/下;
  3、  执行以下指令创建keyfile:
  a)        openssl rand -base64 741 > /data01/项目名/mongodb/keyfile/keyfile
  b)       chmod 300 /data01/项目名/mongodb/keyfile/keyfile
  4、  根据2.1节的端口规划,在6台机器上依次执行如下指令,以开放相应端口:
  vi /etc/sysconfig/iptables
  -A INPUT -m state --state NEW -m tcp -p tcp --dport 17017 -j ACCEPT
  -A INPUT -m state --state NEW -m tcp -p tcp --dport 27017 -j ACCEPT
  -A INPUT -m state --state NEW -m tcp -p tcp --dport 37017 -j ACCEPT
  -A INPUT -m state --state NEW -m tcp -p tcp --dport 47017 -j ACCEPT
  -A INPUT -m state --state NEW -m tcp -p tcp --dport 57017 -j ACCEPT
3.2     参数配置
3.2.1       configServer配置
  新建2.2节中的configsvr.conf文件,文件内容如下:
  dbpath =/data01/项目名/mongodb/data/configsvr
  configsvr = true
  port = 27017
  logpath =/data01/项目名/mongodb/logs/configsvr.log
  logappend = true
  fork = true
  replSet=configRS
  keyFile =/data01/项目名/mongodb/keyfile/keyfile
3.2.2       routeServer配置
  新建2.2节中的mongos.conf文件,文件内容如下:
  configdb =C1:27017,C2:27017,C3:27017
  port = 17017
  chunkSize = 5
  logpath =/data01/项目名/mongodb/logs/mongos.log
  logappend = true
  fork = true
  keyFile =/data01/项目名/mongodb/keyfile/keyfile
3.2.3       Shard配置
  新建2.2节中的shard1.conf、shard2.conf、shard3.conf文件,文件内容如下:
  shard1.conf
  dbpath = /data01/项目名/mongodb/data/shard1
  shardsvr = true
  replSet = shard1
  port = 37017
  oplogSize = 100
  logpath = /data01/项目名/mongodb/logs/shard1.log
  logappend = true
  fork = true
  keyFile =/data01/项目名/mongodb/keyfile/keyfile
  shard2.conf
  dbpath = /data01/项目名/mongodb/data/shard2
  shardsvr = true
  replSet = shard2
  port = 47017
  oplogSize = 100
  logpath = /data01/项目名/mongodb/logs/shard2.log
  logappend = true
  fork = true
  keyFile =/data01/项目名/mongodb/keyfile/keyfile
  shard3.conf
  dbpath = /data01/项目名/mongodb/data/shard3
  shardsvr = true
  replSet = shard3
  port = 57017
  oplogSize = 100
  logpath = /data01/项目名/mongodb/logs/shard3.log
  logappend = true
  fork = true
  keyFile =/data01/项目名/mongodb/keyfile/keyfile
  到此,所有配置文件都已经建好,通过scp指令将整个/data01/项目名/mongodb目录拷贝到其余5台机器。
3.2.4        创建用户
  分别在C1、C2、C3上运行以下命令:
  /data01/项目名/mongodb/bin/mongod -f /data01/项目名/mongodb/config/configsvr.conf
  再在C1上运行:/data01/项目名/mongodb/bin/mongo --port 27017
  配置config server为replica sets
  >use admin
  >rs.initiate( {_id: "configRS",configsvr: true,members: [{ _id: 0, host: "C1:27017" },{ _id: 1, host: "C2:27017" },{ _id: 2, host: "C3:27017" }]})
  >rs.status()
  创建用户

  • 启动routeServer。分别在C1、C2、C3上运行以下命令:
  /data01/项目名/mongodb/bin/mongos -f /data01/项目名/mongodb/config/mongos.conf

  • 在C1上执行:
  /data01/项目名/mongodb/bin/mongo --port 17017
  mongos> use admin
  mongos>db.createUser( {user: "xxx", pwd:  "xxx",  roles:  [ { role: "root",  db: "admin" } ] })
  mongos>db.auth(“xxx”,”xxx”)
  mongos>exit
3.2.5  配置Shard
  采用以下命令启动S1、S2和S3上的shard1、shard2、shard3:
  备注:先依次启动S1的shard1、S2的shard2、S3的shard3,再启动其余的。
  /data01/项目名/mongodb/bin/mongod -f /data01/项目名/mongodb/config/shard1.conf
  /data01/项目名/mongodb/bin/mongod -f /data01/项目名/mongodb/config/shard2.conf
  /data01/项目名/mongodb/bin/mongod -f /data01/项目名/mongodb/config/shard3.conf
  查看是否正常启动:netstat -lnpt
  启动后连接到shard1、shard2、shard3的任意一台机器,来配置每个shard为replica sets,以下是具体配置过程:
  Shard1
  /data01/项目名/mongodb/bin/mongo --port 37017
  >use admin
  >config = {“_id”:"shard1", members: [                            {“_id”: 0,”host”:"S1:37017"},                           {“_id”: 1, “host”:"S2:37017"},                           {“_id”: 2, “host”:"S3:37017"}]            }
  >rs.initiate(config)
  >exit
  Shard2
  /data01/项目名/mongodb/bin/mongo --port 47017
  >use admin
  >config = {“_id”:"shard2", members: [                            {“_id”: 0,”host”:"S1:47017"},                           {“_id”: 1, “host”:"S2:47017"},                           {“_id”: 2, “host”:"S3:47017"}]            }
  >rs.initiate(config)
  >exit
  Shard3
  /data01/项目名/mongodb/bin/mongo --port 57017
  >use admin
  >config = {“_id”:"shard3", members: [                            {“_id”: 0,”host”:"S1:57017"},                           {“_id”: 1, “host”:"S2:57017"},                           {“_id”: 2, “host”:"S3:57017"}]            }
  >rs.initiate(config)
  >exit
3.2.6       配置分片
  配置分片只需在一台机器上操作即可,这里选择在C1上执行:
  /data01/项目名/mongodb/bin/mongo --port 17017
  mongos> use admin
  mongos>db.auth("xxx","xxx")(3.2.4中创建的用户)
  mongos>db.runCommand({addshard:"shard1/S1:37017,S2:37017,S3:37017",name:"shard1", maxsize:20480} )
  mongos>db.runCommand({addshard:"shard2/S1:47017,S2:47017,S3:47017",name:"shard2", maxsize:20480} )
  mongos>db.runCommand({addshard:"shard3/S1:57017,S2:57017,S3:57017",name:"shard3", maxsize:20480} )
  验证分片。继续在C1执行:
  db.runCommand({listShards:1})
  激活分片配置。使用
  sh.enableSharding("库名");
  新增库并进行分片。
  使用
  sh.shardCollection("库名.集合名",{"_id":"hashed"});
  创建对应的表(collection)并进行hash分片。
  使用
  sh.shardCollection("库名.集合名",{"_id":1});
  创建对应的表(collection)并进行并按_id区间分片。
  例子:
sh.shardCollection("records.people", { "zipcode": 1, "name": 1 } ) sh.shardCollection("people.addresses", { "state": 1, "_id": 1 } ) sh.shardCollection("assets.chairs", { "type": 1, "_id": 1 } ) db.alerts.ensureIndex( { _id : "hashed" } ) sh.shardCollection("events.alerts", { "_id": "hashed" } )这些分片操作按顺序依次表示为:数据库records 中的People集合使用了片键{ “zipcode” : 1, “name” : 1 }这个片键通过字段zipcode的值进行数据分配。如果这个有大量相同的值,则会根据name字段的值对块进行分裂。数据库people的addresses集合使用了片键{ “state” : 1, “_id” : 1 }这个片键通过字段state的值进行数据分配。如果这个有大量相同的值,则会根据_id字段的值对块进行分裂。数据库assets的chairs集合使用了片键{ “type” : 1, “_id” : 1 }这个片键通过字段type的值进行数据分配。如果这个有大量相同的值,则会根据_id字段的值对块进行分裂。数据库events的alerts集合使用了片键{ “_id” : “hashed” }在版本2.4中最新出现的。这个片键通过字段_id的散列值进行数据分配。MongoDB计算_id字段的散列值作为散列索引,它将提供集群中文档的均匀分布。  使用 use 库名 切换到新建的库
  使用
  db.createUser({user:"xxx",pwd:"xxx",roles:[{role:"dbOwner", db:"库名"}]});
  创建对应用户。
  验证路由
  1、  use 库名(上面新建的库);
  2、  插入一批测试数据:for(var i=0;i<10;i++){db.集合名.insert({name:"jeff"+i});}
  3、  验证:db.集合名.stats()

运维网声明 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-424582-1-1.html 上篇帖子: python连接数据库(2) 下篇帖子: linux (centos)下安装 mongodb v3.2 笔记
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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