搭建mongodb集群(副本集+分片)

本文涉及的产品
云数据库 MongoDB,通用型 2核4GB
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介: 搭建mongodb集群(副本集+分片) 转载自:http://blog.csdn.net/bluejoe2000/article/details/41323051 完整的搭建mongodb集群(副本集+分片)的例子。

搭建mongodb集群(副本集+分片)

完整的搭建mongodb集群(副本集+分片)的例子。。。

准备四台机器,分别是bluejoe1,bluejoe2,bluejoe3,以及bluejoe0

副本集及分片策略确定如下:

 

  • 将创建3个副本集,命名为shard1,shard2,shard3;
  • 以上3个副本集作为3个分片;
  • 每个副本集包含3个副本(主、辅1、辅2);
  • 副本分开存储,即shard1存在bluejoe1、bluejoe2、bluejoe3上各一份。。。以此类推
  • 将创建3个配置库实例,一台机器一个
  • bluejoe0上配置一个mongos(mongos一般可以配置在应用端)
画了一个图:
 
 
具体操作步骤如下:
  1. 在bluejoe1上下载mongdb安装包;
  2. 解压至/usr/local/mongdb(注意改名);
  3. 创建data/db1,db2,db3目录,启动3个mongod实例,注意replSet的名字:
    [java]  view plain ?
    1. mkdir /usr/local/mongodb/data/db1 /usr/local/mongodb/data/db2 /usr/local/mongodb/data/db3  
    2. nohup /usr/local/mongodb/bin/mongod --dbpath /usr/local/mongodb/data/db1 --port 10001 --replSet db1 --logpath=/usr/local/mongodb/log/db1.log &  
    3. nohup /usr/local/mongodb/bin/mongod --dbpath /usr/local/mongodb/data/db2 --port 10002 --replSet db2 --logpath=/usr/local/mongodb/log/db2.log &  
    4. nohup /usr/local/mongodb/bin/mongod --dbpath /usr/local/mongodb/data/db3 --port 10003 --replSet db3 --logpath=/usr/local/mongodb/log/db3.log &  
  4. 使用scp命令,将mongodb目录复制至bluejoe2和bluejoe3机器,并按照第3步启动每台机器上的3个实例;
  5. 初始化副本:
    [java]  view plain ?
    1. mongo bluejoe1:10001  
    2.   
    3.     use admin  
    4.       
    5.     db.runCommand(  
    6.     {  
    7.         "replSetInitiate":  
    8.         {  
    9.             "_id":"db1",  
    10.             "members":  
    11.             [  
    12.                 {  
    13.                     "_id":1,  
    14.                     "host":"bluejoe1:10001"  
    15.                 },  
    16.                 {  
    17.                     "_id":2,  
    18.                     "host":"bluejoe2:10001"  
    19.                 },  
    20.                 {  
    21.                     "_id":3,  
    22.                     "host":"bluejoe3:10001"  
    23.                 }  
    24.             ]  
    25.         }  
    26.     })  
    27.       
    28.   
    29. mongo bluejoe1:10002  
    30.   
    31.     use admin  
    32.       
    33.     db.runCommand(  
    34.     {  
    35.         "replSetInitiate":  
    36.         {  
    37.             "_id":"db2",  
    38.             "members":  
    39.             [  
    40.                 {  
    41.                     "_id":1,  
    42.                     "host":"bluejoe1:10002"  
    43.                 },  
    44.                 {  
    45.                     "_id":2,  
    46.                     "host":"bluejoe2:10002"  
    47.                 },  
    48.                 {  
    49.                     "_id":3,  
    50.                     "host":"bluejoe3:10002"  
    51.                 }  
    52.             ]  
    53.         }  
    54.     })  
    55.       
    56. mongo bluejoe1:10003  
    57.   
    58.     use admin  
    59.       
    60.     db.runCommand(  
    61.     {  
    62.         "replSetInitiate":  
    63.         {  
    64.             "_id":"db3",  
    65.             "members":  
    66.             [  
    67.                 {  
    68.                     "_id":1,  
    69.                     "host":"bluejoe1:10003"  
    70.                 },  
    71.                 {  
    72.                     "_id":2,  
    73.                     "host":"bluejoe2:10003"  
    74.                 },  
    75.                 {  
    76.                     "_id":3,  
    77.                     "host":"bluejoe3:10003"  
    78.                 }  
    79.             ]  
    80.         }  
    81.     })  
  6. 观察副本集的实时复制特性
    1. 连接上bluejoe1:10001,看到db1:PRIMARY>的字样,说明它是db1的主节点
    2. 创建一张新表,创建几条测试记录
    3. 连接上bluejoe3:10002,看到shard1:SECONDARY>的字样,说明它是shard1的辅助节点
    4. 注意此时无法查询前面新增的记录,会报错not master and slaveOk=false
    5. 回到bluejoe1:10001,设置slaveOk
      [html]  view plain ?
      1. db.getMongo().setSlaveOk()  
    6. 再回到bluejoe3:10002,即可看到主节点写入的记录
  • 观察副本集的故障转移特性
    1. 杀掉bluejoe1:10001的进程
    2. 再次连接上bluejoe3:10002,看到shard1:PRIMARY>的字样,说明它已经变成shard1的主节点
    3. 如果这时再启动bluejoe1:10001,则发现它已经变成shard1:SECONDARY>
  • 创建data/configdb,启动配置库实例:
    [html]  view plain ?
    1. mkdir /usr/local/mongodb/data/configdb  
    2. nohup /usr/local/mongodb/bin/mongod --dbpath /usr/local/mongodb/data/configdb --port 20000 --logpath=/usr/local/mongodb/log/configdb.log &  

    如果需要关闭mongod服务,可使用--shutdown选项,如:
    [java]  view plain ?
    1. /usr/local/mongodb/bin/mongod --dbpath /usr/local/mongodb/data/configdb --shutdown  
     
    到现在为止应该有12个mongd实例,其中3个为配置库实例,剩下的属于3个副本集;
  • 接下来管理分片,在bluejoe0上启动mongs:

    [html]  view plain ?
    1. nohup /usr/local/mongodb/bin/mongos --port 30000 --configdb bluejoe1:20000,bluejoe2:20000,bluejoe3:20000 &  
  • 连接上mongos,配置分片信息:
    [html]  view plain ?
    1. mongo bluejoe0:30000  
    2.   
    3. mongos> use admin  
    4. switched to db admin  
    5.       
    6. db.runCommand({"addShard":"db1/bluejoe1:10001"})  
    7. db.runCommand({"addShard":"db2/bluejoe1:10002"})  
    8. db.runCommand({"addShard":"db3/bluejoe1:10003"})  
  • 查看分片情况:
    [html]  view plain ?
    1. mongos>  db.runCommand({listshards:1})  
    2. {  
    3. <span style="white-space:pre">  </span>"shards" : [  
    4. <span style="white-space:pre">      </span>{  
    5. <span style="white-space:pre">          </span>"_id" : "db1",  
    6. <span style="white-space:pre">          </span>"host" : "db1/bluejoe1:10001,bluejoe2:10001,bluejoe3:10001"  
    7. <span style="white-space:pre">      </span>},  
    8. <span style="white-space:pre">      </span>{  
    9. <span style="white-space:pre">          </span>"_id" : "db2",  
    10. <span style="white-space:pre">          </span>"host" : "db2/bluejoe1:10002,bluejoe2:10002,bluejoe3:10002"  
    11. <span style="white-space:pre">      </span>},  
    12. <span style="white-space:pre">      </span>{  
    13. <span style="white-space:pre">          </span>"_id" : "db3",  
    14. <span style="white-space:pre">          </span>"host" : "db3/bluejoe1:10003,bluejoe2:10003,bluejoe3:10003"  
    15. <span style="white-space:pre">      </span>}  
    16. <span style="white-space:pre">  </span>],  
    17. <span style="white-space:pre">  </span>"ok" : 1  
    18. }  
    可以看出,尽管注册的时候只是提供了副本集的主节点,但mongos已知晓了各辅助节点;

  • 对某个库开启分片功能:
    [html]  view plain ?
    1. mongos> db.runCommand({"enablesharding":"test"})  
    2. { "ok" : 1 }  
    3. mongos> db.runCommand({"shardcollection":"test.person","key":{_id:'hashed'}})  
    4. { "collectionsharded" : "test.person", "ok" : 1 }  
  • 插入测试数据:
    [html]  view plain ?
    1. mongos> for(var i=0;i<10;i++){db.person.insert({name:"bluejoe"+i});}  
    2. WriteResult({ "nInserted" : 1 })  
  • 查看数据分片存储情况:
    [html]  view plain ?
    1. [root@hadoop0 ~]# mongo bluejoe3:10002  
    2. MongoDB shell version: 2.6.5  
    3. connecting to: bluejoe3:10002/test  
    4. shard1:PRIMARY> db.person.find()  
    5. { "_id" : ObjectId("546ff1013a0d0ec68b42a914"), "name" : "bluejoe0" }  
    6. { "_id" : ObjectId("546ff1013a0d0ec68b42a915"), "name" : "bluejoe1" }  
    7. { "_id" : ObjectId("546ff1013a0d0ec68b42a91a"), "name" : "bluejoe6" }  
    8. { "_id" : ObjectId("546ff1013a0d0ec68b42a91b"), "name" : "bluejoe7" }  
    9. { "_id" : ObjectId("546ff1013a0d0ec68b42a91c"), "name" : "bluejoe8" }  
    10. shard1:PRIMARY> exit  
    11. bye  
    12. [root@hadoop0 ~]# mongo bluejoe2:10001  
    13. MongoDB shell version: 2.6.5  
    14. connecting to: bluejoe2:10001/test  
    15. shard2:PRIMARY> db.person.find()  
    16. { "_id" : ObjectId("546ff1013a0d0ec68b42a918"), "name" : "bluejoe4" }  
    17. shard2:PRIMARY> exit  
    18. bye  
    19. [root@hadoop0 ~]# mongo bluejoe3:10001  
    20. MongoDB shell version: 2.6.5  
    21. connecting to: bluejoe3:10001/test  
    22. shard3:PRIMARY> db.person.find()  
    23. { "_id" : ObjectId("546ff1013a0d0ec68b42a916"), "name" : "bluejoe2" }  
    24. { "_id" : ObjectId("546ff1013a0d0ec68b42a917"), "name" : "bluejoe3" }  
    25. { "_id" : ObjectId("546ff1013a0d0ec68b42a919"), "name" : "bluejoe5" }  
    26. { "_id" : ObjectId("546ff1013a0d0ec68b42a91d"), "name" : "bluejoe9" }  
    27. shard3:PRIMARY>   
相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。 &nbsp; 相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
目录
相关文章
|
1月前
|
存储 负载均衡 NoSQL
MongoDB分片技术:实现水平扩展的利器
【4月更文挑战第30天】MongoDB的分片技术是应对数据增长和复杂业务需求的解决方案,它将数据水平拆分存储在多个实例上,实现数据库的水平扩展。分片带来水平扩展性、负载均衡、高可用性和灵活的数据管理。分片工作涉及mongos路由进程、config server和shard实例。设置分片包括部署配置服务器、添加分片、启动mongos、配置分片键和开始分片。选择合适的分片键和有效管理能确保系统性能和稳定性。
|
24天前
|
存储 负载均衡 NoSQL
MongoDB的架构设计基于三种集群模式
【6月更文挑战第5天】MongoDB的架构设计基于三种集群模式
26 3
|
23天前
|
存储 负载均衡 NoSQL
MongoDB的分片功能
【6月更文挑战第6天】MongoDB的分片功能
22 1
|
1月前
|
监控 NoSQL MongoDB
【MongoDB 专栏】MongoDB 的副本集故障转移与恢复
【5月更文挑战第11天】MongoDB的副本集是高可用性关键,提供数据冗余和自动故障转移。由主节点和从节点组成,主节点处理写操作,从节点同步数据。当主节点故障,副本集通过选举产生新主节点,确保服务不间断。故障转移涉及节点优先级和数据同步状态的考量。恢复阶段解决数据不一致,重点包括节点部署监控、数据同步策略、选举机制和备份恢复计划。网络延迟和大规模数据可能带来挑战,需优化网络、性能调优和定期演练。随着技术进步,副本集的故障转移与恢复将更高效、智能,保障数据安全,支撑业务系统的稳定运行。
【MongoDB 专栏】MongoDB 的副本集故障转移与恢复
|
1月前
|
NoSQL 算法 测试技术
【MongoDB 专栏】MongoDB 的自动分片与手动分片
【5月更文挑战第11天】MongoDB的分片技术在处理大规模数据和高并发场景中至关重要,提供自动和手动两种方式。自动分片基于预定义规则,简化管理,适合大部分场景,但灵活性有限。手动分片则允许用户自定义策略,实现高效布局,适用于有特殊需求的应用,但配置复杂。选择分片方式需考虑业务需求、数据特点和技术能力。正确实施分片策略能构建高性能、可扩展的系统,支持企业业务发展。随着技术进步,未来的分片技术将更加智能和易用。
【MongoDB 专栏】MongoDB 的自动分片与手动分片
|
1月前
|
存储 监控 NoSQL
【MongoDB 专栏】MongoDB 分片策略与最佳实践
【5月更文挑战第10天】MongoDB 分片是应对大数据量的扩展策略,涉及哈希和范围分片两种策略。分片架构包含分片服务器、配置服务器和路由服务器。最佳实践包括选择合适分片键、监控调整、避免热点数据等。注意数据分布不均和跨分片查询的挑战。通过实例展示了如何在电商场景中应用分片。文章旨在帮助理解并优化 MongoDB 分片使用。
【MongoDB 专栏】MongoDB 分片策略与最佳实践
|
1月前
|
NoSQL MongoDB 数据库
国内唯一 阿里云荣膺MongoDB“2024年度DBaaS认证合作伙伴奖”
阿里云连续第五年斩获MongoDB合作伙伴奖项,也是唯一获此殊荣的中国云厂商。一起学习MongoDB副本集的选举机制以及可能会出现的特殊情况。
国内唯一 阿里云荣膺MongoDB“2024年度DBaaS认证合作伙伴奖”
|
22天前
|
存储 监控 NoSQL
MongoDB分片:打造高性能大数据与高并发处理的完美解决方案
MongoDB分片:打造高性能大数据与高并发处理的完美解决方案
|
22天前
|
存储 监控 NoSQL
MongoDB 副本集:构建可靠的数据备份与高可用性系统
MongoDB 副本集:构建可靠的数据备份与高可用性系统
|
1月前
|
监控 NoSQL 算法
【MongoDB】 MongoDB的副本集是什么?
【4月更文挑战第1天】【MongoDB】 MongoDB的副本集是什么?