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

[经验分享] mongodb-分片

[复制链接]

尚未签到

发表于 2017-12-15 06:38:04 | 显示全部楼层 |阅读模式
  mongodb的副本集和分片集群有什么区别
  副本集(Replica Set)是指同一份数据被保存到N个机器上,每个机器上都是想同的数据。
  分片(shard)是指一份数据被分离开保存到N个机器上,N个机器上的数据组合起来是一份数据。
  一、分片
  mongodb分片(shard)有四个组件:mongos、config server、shard、replica set。
  mongos,数据库集群请求的入口,所有的请求都通过mongos进行协调,不需要在应用程序添加一个路由选择器,mongos自己就是一个请求分发中心,它负责把对应的数据请求请求转发到对应的shard服务器上。在生产环境通常有多mongos作为请求的入口,防止其中一个挂掉所有的mongodb请求都没有办法操作。
  config server,顾名思义为配置服务器,存储所有数据库元信息(路由、分片)的配置。mongos本身没有物理存储分片服务器和数据路由信息,只是缓存在内存里,配置服务器则实际存储这些数据。mongos第一次启动或者关掉重启就会从 config server 加载配置信息,以后如果配置服务器信息变化会通知到所有的 mongos 更新自己的状态,这样 mongos 就能继续准确路由。在生产环境通常有多个 config server 配置服务器,因为它存储了分片路由的元数据,这个可不能丢失!就算挂掉其中一台,只要还有存货, mongodb集群就不会挂掉。
  shard,这就是传说中的分片了。一台机器的一个数据表 Collection1 存储了 1T 数据,压力太大了!在分给4个机器后,每个机器都是256G,则分摊了集中在一台机器的压力。也许有人问一台机器硬盘加大一点不就可以了,为什么要分给四台机器呢?不要光想到存储空间,实际运行的数据库还有硬盘的读写、网络的IO、CPU和内存的瓶颈。在mongodb集群只要设置好了分片规则,通过mongos操作数据库就能自动把对应的数据操作请求转发到对应的分片机器上。在生产环境中分片的片键可要好好设置,这个影响到了怎么把数据均匀分到多个分片机器上,不要出现其中一台机器分了1T,其他机器没有分到的情况,这样还不如不分片!
  replica set,其实4个分片如果没有 replica set 是个不完整架构,假设其中的一个分片挂掉那四分之一的数据就丢失了,所以在高可用性的分片架构还需要对于每一个分片构建 replica set 副本集保证分片的可靠性。生产环境通常是 2个副本 + 1个仲裁。
  二、搭建高可用的mongodb集群
  首先确定各个组件的数量,mongos 3个, config server 3个,数据分3片 shard server 3个,每个shard 有一个副本一个仲裁也就是 3 * 2 = 6 个,总共需要部署15个实例。这些实例可以部署在独立机器也可以部署在一台机器,我们这里测试资源有限,只准备了 3台机器,在同一台机器只要端口不同就可以,看一下物理部署图:
DSC0000.png

  1、准备机器,IP分别设置为: 192.168.1.106(机器1)、192.168.1.107(机器2)、192.168.1.108(机器3)。
  2、分别在每台机器上建立mongodb分片对应测试文件夹。
  #存放mongodb数据文件
[iyunv@localhost ~]mkdir -p /data/mongodbtest

  3、下载安装mongodb的安装程序包
[iyunv@localhost ~]yum install mongodb  mongodb-server

  4、分别在每台机器建立mongos 、config 、 shard1 、shard2、shard3 五个目录。
  因为mongos不存储数据,只需要建立日志文件目录即可。
[iyunv@localhost ~]mkdir -p /data/mongodbtest   //建立mongos目录

[iyunv@localhost ~]mkdir -p /data/mongodbtest/mongos/log    //建立mongos日志文件存放目录

[iyunv@localhost ~]mkdir -p /data/mongodbtest/config/data     //建立config server 数据文件存放目录

[iyunv@localhost ~]mkdir -p /data/mongodbtest/config/log       //建立config server 日志文件存放目录

[iyunv@localhost ~]mkdir -p /data/mongodbtest/shard1/data    //建立shard1 数据文件存放目录

[iyunv@localhost ~]mkdir -p /data/mongodbtest/shard1/log       //建立shard1 日志文件存放目录

[iyunv@localhost ~]mkdir -p /data/mongodbtest/shard2/data     //建立shard2 数据文件存放目录

[iyunv@localhost ~]mkdir -p /data/mongodbtest/shard2/log       //建立shard2 日志文件存放目录

[iyunv@localhost ~]mkdir -p /data/mongodbtest/shard3/data     //建立shard3 数据文件存放目录

[iyunv@localhost ~]mkdir -p /data/mongodbtest/shard3/log       //建立shard3 日志文件存放目录

  5、规划5个组件对应的端口号,由于一个机器需要同时部署 mongos、config server 、shard1、shard2、shard3,所以需要用端口进行区分。
  这个端口可以自由定义,在本文 mongos为 20000, config server 为 21000, shard1为 22001 , shard2为22002, shard3为22003.
  6、在每一台服务器分别启动mongos服务器。   
[iyunv@localhost ~]/usr/bin/mongos  --configdb 192.168.1.106:21000,192.168.1.107:21000,192.168.1.108:21000  --port 20000   --logpath  /data/mongodbtest/mongos/log/mongos.log --fork

  7、在每一台服务器分别启动config server配置服务器。
[iyunv@localhost ~]/usr/bin/mongod --configsvr --dbpath /data/mongodbtest/config/data --port 21000 --logpath /data/mongodbtest/config/log/config.log --fork

  8、配置各个分片的副本集。   
  #在每个机器里分别设置分片1服务器及副本集shard1
[iyunv@localhost ~]/usr/bin/mongod --shardsvr --replSet shard1 --port 22001 --dbpath /data/mongodbtest/shard1/data  --logpath /data/mongodbtest/shard1/log/shard1.log --fork --nojournal  --oplogSize 10

  为了快速启动并节约测试环境存储空间,这里加上 nojournal 是为了关闭日志信息,在我们的测试环境不需要初始化这么大的redo日志。同样设置 oplogsize是为了降低 local 文件的大小,oplog是一个固定长度的 capped collection,它存在于”local”数据库中,用于记录Replica Sets操作日志。注意,这里的设置是为了测试!
  #在每个机器里分别设置分片2服务器及副本集shard2
[iyunv@localhost ~]/usr/bin/mongod --shardsvr --replSet shard2 --port 22002 --dbpath /data/mongodbtest/shard2/data  --logpath /data/mongodbtest/shard2/log/shard2.log --fork --nojournal  --oplogSize 10

  #在每个机器里分别设置分片3服务器及副本集shard3
[iyunv@localhost ~]/usr/bin/mongod --shardsvr --replSet shard3 --port 22003 --dbpath /data/mongodbtest/shard3/data  --logpath /data/mongodbtest/shard3/log/shard3.log --fork --nojournal  --oplogSize 10

  分别对每个分片配置副本集。
  任意登陆一个机器,比如登陆192.168.1.106,连接mongodb
  #设置第一个分片副本集
[iyunv@localhost ~]/usr/bin/mongo  127.0.0.1:22001

  >use admin                        //使用admin数据库
  >config = { _id:"shard1", members:[                  //定义副本集配置
  {_id:0,host:"192.168.1.106:22001"},
  {_id:1,host:"192.168.1.107:22001"},
  {_id:2,host:"192.168.1.108:22001",arbiterOnly:true}
  ]
  }
  >rs.initiate(config);      //初始化副本集配置
  #设置第二个分片副本集
[iyunv@localhost ~]/usr/bin/mongo  127.0.0.1:22002

  >use admin                        //使用admin数据库
  >config = { _id:"shard1", members:[                  //定义副本集配置
  {_id:0,host:"192.168.1.106:22002"},
  {_id:1,host:"192.168.1.107:22002"},
  {_id:2,host:"192.168.1.108:22002",arbiterOnly:true}
  ]
  }
  >rs.initiate(config);      //初始化副本集配置
  #设置第三个分片副本集
[iyunv@localhost ~]/usr/bin/mongo  127.0.0.1:22003

  >use admin                        //使用admin数据库
  >config = { _id:"shard1", members:[                  //定义副本集配置
  {_id:0,host:"192.168.1.106:22003"},
  {_id:1,host:"192.168.1.107:22003"},
  {_id:2,host:"192.168.1.108:22003",arbiterOnly:true}
  ]
  }
  >rs.initiate(config);      //初始化副本集配置
  9、目前搭建了mongodb配置服务器、路由服务器,各个分片服务器,不过应用程序连接到 mongos 路由服务器并不能使用分片机制,还需要在程序里设置分片配置,让分片生效。
  #连接到mongos
[iyunv@localhost ~]/usrbin/mongo  127.0.0.1:20000

  >user  admin            
  如里shard是单台服务器,用 db.runCommand( { addshard : “[: ]” } )这样的命令加入;
  如果shard是副本集,用db.runCommand( { addshard : “replicaSetName/[:port][,serverhostname2[:port],…]” }) 。
  >db.runCommand( { addshard : "shard1/192.168.1.106:22001,192.168.1.107:22001,192.168.1.108:22001"});  #串联路由服务器与分配副本集1
  >db.runCommand( { addshard : "shard2/192.168.1.106:22002,192.168.1.107:22002,192.168.1.108:22002"});  #串联路由服务器与分配副本集2
  >db.runCommand( { addshard : "shard3/192.168.1.106:22003,192.168.1.107:22003,192.168.1.108:22003"});  #串联路由服务器与分配副本集3
  #查看分片服务器的配置
  >db.runCommand( { listshards : 1 } );
  {
  "shards" : [
  {
  "_id" : "shard1",
  "host" : "shard1/192.168.1.106:22001,192.168.1.107:22001"
  },
  {
  "_id" : "shard2",
  "host" : "shard2/192.168.1.106:22002,192.168.1.107:22002"
  },
  {
  "_id" : "shard3",
  "host" : "shard3/192.168.1.106:22003,192.168.1.107:22003"
  }
  ],
  "ok" : 1
  }
  因为192.168.0.138是每个分片副本集的仲裁节点,所以在上面结果没有列出来。

运维网声明 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-424225-1-1.html 上篇帖子: 奋力的蜗牛MMD 下篇帖子: 基础拾遗
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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