×

Mongodb集群的三种搭建方式

96
前海征信移动端团队
2017.09.05 23:34* 字数 1482

最近,对Mongodb的勒索案件层出不穷,大多数是对于Mongo没有进行安全认证的配置,导致了数据直接被攻击者拿到。我们今天讲讲如何配置Mongo集群,并进行安全配置。

Mongo有三种集群方式
1.Replica Set副本
2.Sharding分片
3.Master-slave主备

通常来说,我们用第1、2种较多,第3种官方并不推荐。下面,我们来讲解下这三种集群方式的搭建方式。本文,假设读者已经对Docker有所了解,我们整个过程使用Docker搭建Mongo的集群环境。

1.Replica Set

Replica Set架构

如上图所示:
Mongodb(M)表示主节点,Mongodb(S)表示备节点,Mongodb(A)表示仲裁节点。主备节点存储数据,仲裁节点不存储数据。客户端同时连接主节点与备节点,不连接仲裁节点。
默认设置下,主节点提供所有增删查改服务,备节点不提供任何服务。但是可以通过设置使备节点提供查询服务,这样就可以减少主节点的压力,当客户端进行数据查询时,请求自动转到备节点上。

Master节点

docker run -d -p 27018:27018 --name mongo_master -v /share/disk0/mongodb_cluster/mongodb_node1/master_server/data:/data/db mongo:latest
mongod --port "27018" --dbpath "/data/db" --replSet "rs1"

Slaver节点

docker run -d -p 27118:27118 --name mongo_slaver -v /share/disk0/mongodb_cluster/mongodb_node1/slaver_server/data:/data/db mongo:latest
mongod --port "27118" --dbpath "/data/db" --replSet "rs1"

Arbiter节点

docker run -d -p 27218:27218 --name mongo_arbiter -v /share/disk0/mongodb_cluster/mongodb_node1/arbiter_server/data:/data/db mongo:latest
mongod --port "27218" --dbpath "/data/db" --replSet "rs1"

然后进入Primary节点
docker exec -it mongo_master /bin/sh
mongo --port 27018
rs.initiate()
rs.add("192.168.99.100: 27118")
rs.addArb("192.168.99.100: 27218")
rs.conf()
rs.status()

由于没有设置Mongodb的用户名和密码,这样非常的不安全,下面给它设置一个密码,这里,只要在Primary节点配置即可,rs.status()可以看到谁被选中为Primary节点。
use admin
db.createUser( {
user: "admin",
pwd: "P@ssw0rd",
roles: [ { role: "root", db: "admin" } ]
});

我们设置好了密码后,将这三个Docker容器删除,不删除目录文件夹,然后启动时,添加--auth参数。
docker stop mongo_master mongo_slaver mongo_arbiter

docker rm mongo_master mongo_slaver mongo_arbiter

docker run -d -p 27018:27018 --name mongo_master -v /share/disk0/mongodb_cluster/mongodb_node1/msater_server/data:/data/db mongo:latest
mongod --auth --port "27018" --dbpath "/data/db" --replSet "rs1"

docker run -d -p 27118:27118 --name mongo_master -v /share/disk0/mongodb_cluster/mongodb_node1/slaver_server/data:/data/db mongo:latest
mongod --auth --port "27118" --dbpath "/data/db" --replSet "rs1"

docker run -d -p 27218:27218 --name mongo_master -v /share/disk0/mongodb_cluster/mongodb_node1/arbiter_server/data:/data/db mongo:latest
mongod --auth --port "27218" --dbpath "/data/db" --replSet "rs1"

2.Sharding分片集群

Sharding架构.png

如上图所示,现假设我们有三台服务器,三台服务器上配置各配置一个分片,一个配置服务,一个Router服务。其中,每个分片,都是Replica Set,在第一节中介绍过,但是配置还是稍有不同。

在所有服务器上运行如下Docker容器

1.数据容器Master

docker run -d -p 27018:27018 --name mongodb_shard_master -v /share/disk0/mongodb_cluster/mongodb_node/shard_server_master/data:/data/db mongo:latest mongod --shardsvr --port 27018 --replSet rs1 --dbpath /data/db

2.数据容器Slaver

docker run -d -p 27118:27118 --name mongodb_shard_slaver -v /share/disk0/mongodb_cluster/mongodb_node/shard_server_slaver/data:/data/db mongo:latest mongod --shardsvr --port 27118 --replSet rs1 --dbpath /data/db

3.数据容器Arbiter

docker run -d -p 27118:27118 --name mongodb_shard_arbiter -v /share/disk0/mongodb_cluster/mongodb_node/shard_server_arbiter/data:/data/db mongo:latest mongod --shardsvr --port 27118 --replSet rs1 --dbpath /data/db

4.配置Sharding Replica Set

docker exec -it mongo_master /bin/sh
mongo --port 27018
rs.initiate()
rs.add("服务器IP: 27118")
rs.addArb("服务器IP: 27218")
rs.conf()
rs.status()
use admin
db.createUser( {
user: "admin",
pwd: "P@ssw0rd",
roles: [ { role: "root", db: "admin" } ]
});

5.配置服务容器

docker run -t -i -d -p 27019:27019 --name mongodb_configrs -v /share/disk0/mongodb_cluster/mongodb_node/config_server/data:/data/db mongo:latest mongod --configsvr --replSet csrs --dbpath /data/db
这里--configsvr默认是27019端口

假设在服务器1上运行如下命令
docker exec -it mongodb_configrs /bin/sh
mongo --port 27019
rs.initiate()
rs.add("服务器2IP: 27019")
rs.addArb("服务器3IP: 27019")
rs.conf()
rs.status()

6.路由服务容器

这里需要在服务器2、3上先运行配置服务容器
docker run -t -i -d -p 27020:27020 --name mongodb_router -v /share/disk0/mongodb_cluster/mongodb_node1/router_server/data:/data/db mongo:latest mongos --configdb csrs/服务器1IP:27019,服务器2IP:27019,服务器3IP:27019 --port 27020
这样,路由服务容器和配置服务容器建立了关系。然后通过路由服务添加分片到配置服务中
docker exec -it mongodb_router /bin/sh
mongo --port 27020
use admin
db.runCommand({addshard:"rs1/服务器1IP:27018"}) //会自动找到rs1中的备用和仲裁节点
db.runCommand({addshard:"rs2/服务器2IP:27018"})
db.runCommand({addshard:"rs3/服务器3IP:27018"})
db.runCommand({listshards:1})

use admin
db.createUser( {
user: "admin",
pwd: "P@ssword",
roles: [ { role: "root", db: "admin" } ]
});

7.最后,通第一节中,删除分片容器和路由容器,在启动容器时,带上--auth。这样,连接Mongodb时,必须使用用户名密码登陆。

3.Master-Slave

这种模式比较简单,但是官方已经不推荐使用。只用于开发时调试可以使用。

服务器1

docker run -t -i -d -p 27018:27018 --name mongodb_master -v /share/disk0/mongodb_cluster/mongodb_node/master_server/data:/data/db mongo:latest mongod --port 27018 --master --dbpath /data/db

docker exec -it mongodb_master /bin/sh
use admin
db.createUser( {
user: "admin",
pwd: "P@ssword",
roles: [ { role: "root", db: "admin" } ]
});
docker stop mongodb_master
docker rm mongodb_master
docker run -t -i -d -p 27018:27018 --name mongodb_master -v /share/disk0/mongodb_cluster/mongodb_node/master_server/data:/data/db mongo:latest mongod --auth --port 27018 --master --dbpath /data/db

服务器2

docker run -t -i -d -p 27018:27018 --name mongodb_slave -v /share/disk0/mongodb_cluster/mongodb_node/slave_server/data:/data/db mongo:latest mongod --port 27018 --slave --source 服务器1IP: 27018 --dbpath /data/db

这里,同服务器1一样设置密码即可。

代码研究
Web note ad 1