美文网首页db
MongoDB 分片集群搭建

MongoDB 分片集群搭建

作者: 飘逸峰 | 来源:发表于2020-03-19 17:04 被阅读0次

    摘要

    • 本文内容基于mongodb4.2.3
    • 本文基于本地安装,也就是ip相同,端口不同
    • 3个shard复制集(3台),1个config复制集(3台),2个router

    安装MongoDB

    下载地址 : https://www.mongodb.com/download-center

    下载后解压即可,可以将bin目录配置到$PATH中

    目录设计

    ├── config
    │  ├── node1
    │  │  ├── db
    │  │  ├── logs
    │  │  └── mongod.conf
    │  ├── node2
    │  │  ├── db
    │  │  ├── logs
    │  │  └── mongod.conf
    │  └── node3
    │     ├── db
    │     ├── logs
    │     └── mongod.conf
    ├── keyfile.key
    ├── router
    │  ├── node1
    │  │  ├── logs
    │  │  └── mongos.conf
    │  └── node2
    │     ├── logs
    │     └── mongos.conf
    ├── shard1
    │  ├── node1
    │  │  ├── db
    │  │  ├── logs
    │  │  └── mongod.conf
    │  ├── node2
    │  │  ├── db
    │  │  ├── logs
    │  │  └── mongod.conf
    │  └── node3
    │     ├── db
    │     ├── logs
    │     └── mongod.conf
    ├── shard2
    │  ├── node1
    │  │  ├── db
    │  │  ├── logs
    │  │  └── mongod.conf
    │  ├── node2
    │  │  ├── db
    │  │  ├── logs
    │  │  └── mongod.conf
    │  └── node3
    │     ├── db
    │     ├── logs
    │     └── mongod.conf
    └── shard3
       ├── node1
       │  ├── db
       │  ├── logs
       │  └── mongod.conf
       ├── node2
       │  ├── db
       │  ├── logs
       │  └── mongod.conf
       └── node3
          ├── db
          ├── logs
          └── mongod.conf
    

    端口分配

     shard1 28011~28013
     shard2 28021~28023
     shard3 28031~28033
     config 29011~29013
     router 29021~29022
    

    配置文件

    shard

    以shard1为例,三个node下都有mongod.conf,要注意替换文件路径和端口

    systemLog:
       destination: file
       path: "/Users/hanqf/myservice_dir/mongodb-mongos/shard1/node1/logs/mongo.log" #注意修改路径
       logAppend: true
    storage:
       journal:
          enabled: true
       dbPath: "/Users/hanqf/myservice_dir/mongodb-mongos/shard1/node1/db" #注意修改路径
    processManagement:
       fork: true
    net:
       bindIp: 0.0.0.0
       port: 28011   #注意修改端口
    setParameter:
       enableLocalhostAuthBypass: true
    replication:
       replSetName: "shard1" #复制集名称
    sharding:
       clusterRole: shardsvr #作为分片服务
    security:
        authorization: "enabled"
        keyFile: /Users/hanqf/myservice_dir/mongodb-mongos/keyFile.key #密钥文件,用于集群内部认证
    

    config

    systemLog:
       destination: file
       path: "/Users/hanqf/myservice_dir/mongodb-mongos/config/node1/logs/mongo.log" #注意修改路径
       logAppend: true
    storage:
       journal:
          enabled: true
       dbPath: "/Users/hanqf/myservice_dir/mongodb-mongos/config/node1/db" #注意修改路径
    processManagement:
       fork: true
    net:
       bindIp: 0.0.0.0
       port: 29011  #注意修改端口
    setParameter:
       enableLocalhostAuthBypass: true
    replication:
       replSetName: "config" #复制集名称
    sharding:
       clusterRole: configsvr #作为配置服务
    security:
      authorization: "enabled"
      keyFile: /Users/hanqf/myservice_dir/mongodb-mongos/keyFile.key #密钥文件,用于集群内部认证
    

    router

    systemLog:
       destination: file
       path: "/Users/hanqf/myservice_dir/mongodb-mongos/router/node1/logs/mongos.log" #注意修改路径
       logAppend: true
    processManagement:
       fork: true
    net:
       bindIp: 0.0.0.0
       port: 29021   #注意修改端口
    setParameter:
       enableLocalhostAuthBypass: true
    replication:
       localPingThresholdMs: 15
    sharding:
       configDB: config/127.0.0.1:29011,127.0.0.1:29012,127.0.0.1:29013 #关联配置服务
    security:
        keyFile: /Users/hanqf/myservice_dir/mongodb-mongos/keyFile.key #密钥文件,用于集群内部认证
    

    keyFile

    cd /Users/hanqf/myservice_dir/mongodb-mongos
    openssl rand -base64 741 > keyFile.key
    chmod 400 mongodb-keyfile
    

    配置config复制集

    启动

    mongod --config /Users/hanqf/myservice_dir/mongodb-mongos/config/node1/mongod.conf
    mongod --config /Users/hanqf/myservice_dir/mongodb-mongos/config/node2/mongod.conf
    mongod --config /Users/hanqf/myservice_dir/mongodb-mongos/config/node3/mongod.conf
    

    登录及配置

    #登录任意一台config
    mongo --host 127.0.0.1:29011
    
    >rs.initiate(
      {
        _id: "config",
        configsvr: true,
        members: [
          { _id : 0, host : "127.0.0.1:29011" },
          { _id : 1, host : "127.0.0.1:29012" },
          { _id : 2, host : "127.0.0.1:29013" }
        ]
      }
    );
    
    #创建超级管理员,此时要求登录的是主库
    >rs.isMaster() #验证是否主库
    >use admin
    >db.createUser(
       {
         user: "root",
         pwd: "password",
         roles: [ { role: "root", db: "admin" } ]
       }
     );
    
    

    验证用户是否可以登录

    mongo --host 127.0.0.1:29011
    >use admin
    >db.auth("root","password")
    

    配置shard复制集

    启动shard1服务

    mongod --config /Users/hanqf/myservice_dir/mongodb-mongos/shard1/node1/mongod.conf
    mongod --config /Users/hanqf/myservice_dir/mongodb-mongos/shard1/node2/mongod.conf
    mongod --config /Users/hanqf/myservice_dir/mongodb-mongos/shard1/node3/mongod.conf
    

    登录及配置

    #登录任意一台config
    mongo --host 127.0.0.1:28011
    
    >rs.initiate(
      {
        _id: "shard1",
        members: [
          { _id : 0, host : "127.0.0.1:28011" },
          { _id : 1, host : "127.0.0.1:28012" },
          { _id : 2, host : "127.0.0.1:28013" }
        ]
      }
    );
    
    #创建超级管理员,此时要求登录的是主库
    >rs.isMaster() #验证是否主库
    >use admin
    >db.createUser(
       {
         user: "root",
         pwd: "password",
         roles: [ { role: "root", db: "admin" } ]
       }
     );
    

    启动shard2服务

    mongod --config /Users/hanqf/myservice_dir/mongodb-mongos/shard2/node1/mongod.conf
    mongod --config /Users/hanqf/myservice_dir/mongodb-mongos/shard2/node2/mongod.conf
    mongod --config /Users/hanqf/myservice_dir/mongodb-mongos/shard2/node3/mongod.conf
    

    登录及配置

    #登录任意一台config
    mongo --host 127.0.0.1:28021
    
    >rs.initiate(
      {
        _id: "shard2",
        members: [
          { _id : 0, host : "127.0.0.1:28021" },
          { _id : 1, host : "127.0.0.1:28022" },
          { _id : 2, host : "127.0.0.1:28023" }
        ]
      }
    );
    
    #创建超级管理员,此时要求登录的是主库
    >rs.isMaster() #验证是否主库
    >use admin
    >db.createUser(
       {
         user: "root",
         pwd: "password",
         roles: [ { role: "root", db: "admin" } ]
       }
     );
    

    启动shard3服务

    mongod --config /Users/hanqf/myservice_dir/mongodb-mongos/shard3/node1/mongod.conf
    mongod --config /Users/hanqf/myservice_dir/mongodb-mongos/shard3/node2/mongod.conf
    mongod --config /Users/hanqf/myservice_dir/mongodb-mongos/shard3/node3/mongod.conf
    

    登录及配置

    #登录任意一台config
    mongo --host 127.0.0.1:28031
    
    >rs.initiate(
      {
        _id: "shard3",
        members: [
          { _id : 0, host : "127.0.0.1:28031" },
          { _id : 1, host : "127.0.0.1:28032" },
          { _id : 2, host : "127.0.0.1:28033" }
        ]
      }
    );
    
    #创建超级管理员,此时要求登录的是主库
    >rs.isMaster() #验证是否主库
    >use admin
    >db.createUser(
       {
         user: "root",
         pwd: "password",
         roles: [ { role: "root", db: "admin" } ]
       }
     );
    

    启动router服务

    mongos --config /Users/hanqf/myservice_dir/mongodb-mongos/router/node1/mongos.conf
    mongos --config /Users/hanqf/myservice_dir/mongodb-mongos/router/node2/mongos.conf
    

    分片配置

    登录任意router

    mongo --host 127.0.0.1:29021
    >use admin
    >db.auth("root","password")
    
    >sh.addShard( "shard1/127.0.0.1:28011,127.0.0.1:28012,127.0.0.1:28013")
    >sh.addShard( "shard2/127.0.0.1:28021,127.0.0.1:28022,127.0.0.1:28023")
    >sh.addShard( "shard3/127.0.0.1:28031,127.0.0.1:28032,127.0.0.1:28033")
    #查看集群状态
    >sh.status()
    
    #创建数据库用户,客户端可以使用该用户连接mongo路由
    >use springboot
    >db.createUser(
       {
         user: "springboot",
         pwd: "123456",
         roles: [ { role: "dbOwner", db: "springboot" } ]
       }
      );
    
    #指定要分片的数据库
    >sh.enableSharding("springboot")
    #指定集合的分片规则
    #这里表示指定springboot库下的user集合的_id字段(也就是主键,每个集合都有这个字段)按hash散列进行分片,{ id : 1 }表示按字段id进度范围分片,这里id必须是整型
    #要分片存储的集合都需要指定分片规则,分片规则一经创建不可修改,只能删除集合再重新设置
    >sh.shardCollection("springboot.user", { _id : "hashed" } )
    
    >use springboot
    #查询user的集合状态
    >db.user.stats()
    

    注意

    • 正式环境注意权限控制,使客户端只能连接router
    • 可以创建任意多个router
    • springboot连接方式:
      spring.data.mongodb.uri=mongodb://springboot:123456@127.0.0.1:29021,127.0.0.1:29022/springboot?authSource=springboot

    相关文章

      网友评论

        本文标题:MongoDB 分片集群搭建

        本文链接:https://www.haomeiwen.com/subject/xcblyhtx.html