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

[经验分享] mongodb分片+副本集实验

[复制链接]

尚未签到

发表于 2015-7-7 06:50:57 | 显示全部楼层 |阅读模式
  该实验在两台虚拟机搭建一个自动故障转移集群,因为副本集只会自动切换主库,而应用是不会自动变换IP的,为了实现应用对主数据库的自动查找,可以利用mongodb的mongos,为此需要将两台虚拟机搭建成一个分片节点。
  环境:
  两台服务器[windows与Linux是宿主的关系]:
  Ubuntu Linux:192.168.56.101
  Windows:192.168.56.1
  其中Linux上启动3个mongod来创建副本集,windows服务上创建路由服务器,配置服务器和一个分片。
  
  Linux上创建副本集:
  启动3个mongod进程分别为:
  192.168.56.101:10101
  192.168.56.101:20101
  192.168.56.101:30101
  其中192.168.56.101:30101为仲裁机器
  
  ./mongod--dbpath=/usr/local/mongodb2.0.1/db --logpath=/usr/local/mongodb2.0.1/log/mongod.log --logappend --fork --port=10101-replSet test
  
  ./mongod--dbpath=/usr/local/mongodb2.0.2/db --logpath=/usr/local/mongodb2.0.2/log/mongod.log --logappend --fork --port=20101-replSet test
  
  ./mongod--dbpath=/usr/local/mongodb2.0.3/db --logpath=/usr/local/mongodb2.0.3/log/mongod.log --logappend --fork --port=30101-replSet test
  
  登陆192.168.56.101:10101配置初始化副本集:
  ./mongo 192.168.56.101:10101
  use admin
  
  db.runCommand({"replSetInitiate":{"_id":"test","members":[{"_id":0,"host":"192.168.56.101:10101"},{"_id":1,"host":"192.168.56.101:20101"},{"_id":2,"host":"192.168.56.101:30101",arbiterOnly:true}]}})
  
  返回:
  {
      "info" : "Config now saved locally. Should come online in about a minute.",
      "ok" : 1
  }
  说明初始化配置成功。
  运行rs.status();
  
  PRIMARY> rs.status();
  {
  "set" : "test",
  "date" : ISODate("2013-04-01T03:15:09Z"),
  "myState" : 1,
  "members" : [
  {
  "_id" : 0,
  "name" : "192.168.56.101:10101",
  "health" : 1,
  "state" : 1,
  "stateStr" : "PRIMARY",
  "optime" : {
  "t" : 1364786052000,
  "i" : 1
  },
  "optimeDate" : ISODate("2013-04-01T03:14:12Z"),
  "self" : true
  },
  {
  "_id" : 1,
  "name" : "192.168.56.101:20101",
  "health" : 1,
  "state" : 2,
  "stateStr" : "SECONDARY",
  "uptime" : 51,
  "optime" : {
  "t" : 1364786052000,
  "i" : 1
  },
  "optimeDate" : ISODate("2013-04-01T03:14:12Z"),
  "lastHeartbeat" : ISODate("2013-04-01T03:15:08Z"),
  "pingMs" : 0
  },
  {
  "_id" : 2,
  "name" : "192.168.56.101:30101",
  "health" : 1,
  "state" : 7,
  "stateStr" : "ARBITER",
  "uptime" : 51,
  "optime" : {
  "t" : 0,
  "i" : 0
  },
  "optimeDate" : ISODate("1970-01-01T00:00:00Z"),
  "lastHeartbeat" : ISODate("2013-04-01T03:15:08Z"),
  "pingMs" : 2899947
  }
  ],
  "ok" : 1
  }
  
  PRIMARY表示192.168.56.101:10101为主节点。192.168.56.101:20101为从节点SECONDARY,仲裁节点为192.168.56.101:30101.
  
  至此,副本集已经建立完毕【测试副本集过程省略】。
  
  创建分片:
  Winows机器上启动3个mongod.
  192.168.56.1:10001【配置服务器】
  192.168.56.1:20001【mongos服务器】
  192.168.56.1:30001【分片节点】
  1:开启config服务器192.168.56.1:10001
  mongod -dbpath D:\software\mongodb2.4.1\db -logpath D:\software\mongodb2.4.1\log\mongod.log -port 10001 -logappend
  
  2. 开启mongos服务器192.168.56.1:20001
  mongos --port=20001 --configdb=192.168.56.1:10001 [指定配置服务器192.168.56.1:10001],以后添加查询都是通过mongos服务器对外接口的
  
  3:启动mongod分片服务器192.168.56.1:30001
  mongod -dbpath D:\software\mongodb2.4.3\db -logpath D:\software\mongodb2.4.3\log\mongod.log -port 30001 -logappend
  
  4:服务配置
  登陆mongos[192.168.56.1:20001]
  mongo 192.168.56.1:20001
  use admin
DSC0000.png
  添加分片:
  A添加192.168.56.1:30001这台分片。运行:
  db.runCommand({"addshard":"192.168.56.1:30001",allowLocal:true})
DSC0001.png
  B 添加刚才创建的副本集,添加主节点192.168.56.101:10101为分片,运行:
  db.runCommand({addshard:"test/192.168.56.101:10101"})
  【test为副本集名称,192.168.56.101:10101为副本集主节点】
DSC0002.png
  C 设置分片


  • 开启数据库分片功能,命令很简单 enablesharding(),这里我就开启ShardTest数据库。运行:  db.runCommand({"enablesharding":"ShardTest"})
DSC0003.png


  • 指定集合中分片的片键,这里我就指定为person.name字段。运行:  db.runCommand({"shardcollection":"ShardTest.person","key":{"name":1}})
    DSC0004.png
  查看效果:
  至此我们的分片操作全部结束,接下来我们通过mongos向mongodb插入10w记录,然后通过printShardingStatus命令查看mongodb的数据分片情况。运行:
  use ShardTest
  for(var i=0;i> { "name" : "guo0" }
  on : test从无穷小到guo0的片键在test分片上,记在192.168.101:10101这个副本集上。
  2.{ "name" : "guo0" } -->> { "name" : "guo9999" } on : sha
  rd0000即在192.168.56.1:30001机器上。
  3.{ "name" : "guo9999" } -->> { "name" : { "$maxKey" : 1 }on : shard0000从9999到无穷大的片键也分片在shard0000上
  分区情况为:3:1,从后面的 on shardXXXX也能看得出。
  
  此时登陆到192.168.101:10101查询person集合的数据,发现并没有记录,根据上面的片键分片策略无穷小到guo0分配到test副本集上,这也是正常的。因为我们添加的记录都是》=0的。为了测试片键分配策略,我们添加一些负数记录,看是否存储到test副本集上。
  在mongos上执行:
  for(var i=-10000;i rs.status();
  {
      "set" : "test",
      "date" : ISODate("2013-04-01T04:57:42Z"),
      "myState" : 1,
      "syncingTo" : "192.168.56.101:10101",
      "members" : [
          {
              "_id" : 0,
              "name" : "192.168.56.101:10101",
              "health" : 0,
              "state" : 8,
              "stateStr" : "(not reachable/healthy)",
              "uptime" : 0,
              "optime" : {
                  "t" : 1364791344000,
                  "i" : 246
              },
              "optimeDate" : ISODate("2013-04-01T04:42:24Z"),
              "lastHeartbeat" : ISODate("2013-04-01T04:54:43Z"),
              "pingMs" : 0,
              "errmsg" : "socket exception"
          },
          {
              "_id" : 1,
              "name" : "192.168.56.101:20101",
              "health" : 1,
              "state" : 1,
              "stateStr" : "PRIMARY",
              "optime" : {
                  "t" : 1364791344000,
                  "i" : 246
              },
              "optimeDate" : ISODate("2013-04-01T04:42:24Z"),
              "self" : true
          },
          {
              "_id" : 2,
              "name" : "192.168.56.101:30101",
              "health" : 1,
              "state" : 7,
              "stateStr" : "ARBITER",
              "uptime" : 6193,
              "optime" : {
                  "t" : 0,
                  "i" : 0
              },
              "optimeDate" : ISODate("1970-01-01T00:00:00Z"),
              "lastHeartbeat" : ISODate("2013-04-01T04:57:41Z"),
              "pingMs" : 0
          }
      ],
      "ok" : 1
  }
  PRIMARY>
  在通过mongos[192.168.56.1:20001]添加一条记录{"name":"guo-10001"},看副本集是否还能进行添加。
DSC0005.png
  再登陆副本集节点192.168.56.101:20101查询。
DSC0006.png
  发现副本集中的从节点192.168.56.1::20101已经接替节点192.168.56.1:10101成为主节点。
  
  综上所述,可以对数据库服务器做副本集并使所有的访问都通过mongos来达到数据库服务器故障的自动转移。

运维网声明 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-83859-1-1.html 上篇帖子: MongoDB学习系列(3)--解决MongoDB Unexpected Shutdown问题 下篇帖子: 使用Spring MVC 发布基于Mongodb 的Restful资源
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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