MongoDB 分片集群搭建

摘要

  • 本文内容基于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:[email protected]:29021,127.0.0.1:29022/springboot?authSource=springboot

你可能感兴趣的:(MongoDB 分片集群搭建)