zoukankan      html  css  js  c++  java
  • MongoDB Replica Sets +Sharding高可用集群搭建

    集群由三台服务器(假定ip地址为:serverA,serverB,serverC)组成,采用mongodb的复制集+分片(Replica Sets+Sharding) 实现集群的高可靠/高可用以及数据读写的负载均衡。 三台机器分成两个复制集,两个复制集组成一个集群的两个分片(shard1和shard2)。具体如下:

      1、ServerA的s1-1 / ServerB的s1-2 / ServerC的s1-3 组成一个3节点的复制集s1
      2、ServerA的s2-1 / ServerB的s2-2 / ServerC的s2-3 组成一个3节点的复制集s2
      3、复制集s1和s2 组成有两个片的分片集群
      4、为确保配置信息高可用,集群采用3个配置节点存储集群配置信息: ServerA的c1 / ServerB的c2 / ServerC的c3
      5、为对外服务提供高可用,集群采用3个路由节点对外提供服务:ServerA的mongos 1 / ServerB的mongos 2/ ServerC的mongos 3,也可以结合keepalive对外提供一个vip.
     
    mongodb集群逻辑结构:
     
    mongodb服务进程规划:
     
    每台机器运行4个服务进程(2+1+1),端口和目录规划:
     

     详细配置步骤如下:

     1、配置shard1用到复制集 s1:

      在serverA上:mongod --replSet s1 --port 27020 --dbpath=/data/mongo/s1_1/db --logpath=/data/mongo/s1_1/log/mongo.log --logappend --fork

      在serverB上:mongod --replSet s1 --port 27020 --dbpath=/data/mongo/s1_2/db --logpath=/data/mongo/s1_2/log/mongo.log --logappend --fork

      在serverC上:mongod --replSet s1 --port 27020 --dbpath=/data/mongo/s1_3/db --logpath=/data/mongo/s1_3/log/mongo.log --logappend --fork

      连接三个节点的任一个初始化复制集s1 

      >use admin

      >config = {_id:'s1',members:[{_id:0,host:'serverA:27020'},{_id:1,host:'serverB:27020'},{_id:2,host:'serverC:27020'}]}

      >rs.initiate(config)

      >rs.status()

      另外对复制集s1的所有节点都执行如下命令确保所有节点都能分担读取的压力

      >db.getMongo().setSlaveOk();

     2、配置shard2用到复制集 s2:

      在serverA上:mongod --replSet s2 --port 27021 --dbpath=/data/mongo/s2_1/db --logpath=/data/mongo/s2_1/log/mongo.log --logappend --fork

      在serverB上:mongod --replSet s2 --port 27021 --dbpath=/data/mongo/s2_2/db --logpath=/data/mongo/s2_2/log/mongo.log --logappend --fork

      在serverC上:mongod --replSet s2 --port 27021 --dbpath=/data/mongo/s2_3/db --logpath=/data/mongo/s2_3/log/mongo.log --logappend --fork 

      连接三个节点的任一个初始化复制集s2 

      >use admin

      >config = {_id:'s2',members:[{_id:0,host:'serverA:27021'},{_id:1,host:'serverB:27021'},{_id:2,host:'serverC:27021'}]}

      >rs.initiate(config)

      >rs.status()

      另外对复制集s2的所有节点都执行如下命令确保所有节点都能分担读取的压力

      >db.getMongo().setSlaveOk();

     3、配置三台Config Server:

      在serverA上:mongod  -fork --configsvr --dbpath /data/mongo/config/db --port 27018 --logpath /data/mongo/config/log/mongo.log --fork

      在serverB上:mongod  -fork --configsvr --dbpath /data/mongo/config/db --port 27018 --logpath /data/mongo/config/log/mongo.log --fork

      在serverC上:mongod  -fork --configsvr --dbpath /data/mongo/config/db --port 27018 --logpath /data/mongo/config/log/mongo.log --fork

     4、配置三台Route Server:

      在serverA上:mongos -fork --logpath /data/mongo/route/log/mongo.log --configdb ServerA:27018,ServerB:27018,ServerC:27018 --port 27017

      在serverB上:mongos -fork --logpath /data/mongo/route/log/mongo.log --configdb ServerA:27018,ServerB:27018,ServerC:27018 --port 27017

      在serverC上:mongos -fork --logpath /data/mongo/route/log/mongo.log --configdb ServerA:27018,ServerB:27018,ServerC:27018 --port 27017

     5、配置Shard Cluster:

      连接任一mongos进程执行以下命令:

      use admin

      db.runCommand({addShard:"shard1/serverA:27020,serverB:27020,serverC:27020"})

      db.runCommand({addShard:"shard2/serverA:27021,serverB:27021,serverC:27021"})

      db.printShardingStatus()

    6、激活数据库及集合的分片功能:

      连接任一mongos进程执行以下命令:

      db.runCommand({enablesharding:"testdb"})

      db.runCommand({shardcollection:"testdb.collection_test",key:{_id:1}})

    7、登录mongos添加用户:

        use admin

        db.addUser("<user>","<password>")

      db.addUser("<user>","<password>",true) //添加只读用户

    8、关闭三台机器的全部mongod,mongos:

      sudo killall mongod

      sudo killall mongos

    9、生成keyfile:(每个进程的key file都保持一致)

      openssl rand -base64 753 >keyfile

      将生成的keyfile 拷贝到mongod/mongos 进程对应的文件夹

      并执行语句更改权限:sudo chmod 600 keyfile

      使用--keyFile参数指定前面生成的keyfile文件,重启三台机器全部mongod,mongos进程 

      在serverA上:mongod --replSet s1 --port 27020 --dbpath=/data/mongo/s1_1/db --logpath=/data/mongo/s1_1/log/mongo.log --logappend --fork --keyFile  /data/mongo/s1_1/keyfile

      在serverB上:mongod --replSet s1 --port 27020 --dbpath=/data/mongo/s1_2/db --logpath=/data/mongo/s1_2/log/mongo.log --logappend --fork --keyFile  /data/mongo/s1_2/keyfile

      在serverC上:mongod --replSet s1 --port 27020 --dbpath=/data/mongo/s1_3/db --logpath=/data/mongo/s1_3/log/mongo.log --logappend --fork --keyFile  /data/mongo/s1_3/keyfile

      

      在serverA上:mongod --replSet s2 --port 27021 --dbpath=/data/mongo/s2_1/db --logpath=/data/mongo/s2_1/log/mongo.log --logappend --fork --keyFile  /data/mongo/s2_1/keyfile

      在serverB上:mongod --replSet s2 --port 27021 --dbpath=/data/mongo/s2_2/db --logpath=/data/mongo/s2_2/log/mongo.log --logappend --fork --keyFile  /data/mongo/s2_2/keyfile

      在serverC上:mongod --replSet s2 --port 27021 --dbpath=/data/mongo/s2_3/db --logpath=/data/mongo/s2_3/log/mongo.log --logappend --fork --keyFile  /data/mongo/s2_3/keyfile

      

      在serverA上:mongod  -fork --configsvr --dbpath /data/mongo/config/db --port 27018 --logpath /data/mongo/config/log/mongo.log --fork --keyFile  /data/mongo/config/keyfile

      在serverB上:mongod  -fork --configsvr --dbpath /data/mongo/config/db --port 27018 --logpath /data/mongo/config/log/mongo.log --fork --keyFile  /data/mongo/config/keyfile

      在serverC上:mongod  -fork --configsvr --dbpath /data/mongo/config/db --port 27018 --logpath /data/mongo/config/log/mongo.log --fork --keyFile  /data/mongo/config/keyfile

      在serverA上:mongos -fork --logpath /data/mongo/route/log/mongo.log --configdb ServerA:27018,ServerB:27018,ServerC:27018 --port 27017 --keyFile  /data/mongo/route/keyfile

      在serverB上:mongos -fork --logpath /data/mongo/route/log/mongo.log --configdb ServerA:27018,ServerB:27018,ServerC:27018 --port 27017 --keyFile  /data/mongo/route/keyfile

      在serverC上:mongos -fork --logpath /data/mongo/route/log/mongo.log --configdb ServerA:27018,ServerB:27018,ServerC:27018 --port 27017 --keyFile  /data/mongo/route/keyfile

    (转:http://www.cnblogs.com/ylh1223/archive/2013/04/23/3037301.html

  • 相关阅读:
    微软Office团队做产品的十大经验教训 沧海
    Definitio of Business Intelligence 沧海
    爱购家园,轻松工作,轻松生活 沧海
    SAAS概述 沧海
    一定要做自己最内行的东西,一定要在自己本身的职位上来提升自己 沧海
    Android应用的构成 沧海
    管理的最高境界,就是激发每个员工的潜力。让每个员工都觉得自己的工作是一份事业。 沧海
    The life cycle of a typical project 一个典型的项目生命周期 沧海
    印度英语的特点归纳 沧海
    3G时代的移动业务赢利模式分析 沧海
  • 原文地址:https://www.cnblogs.com/wangsdragon/p/MongoDB.html
Copyright © 2011-2022 走看看