Docker搭建MongoDB集群

开发 架构
主从复制模式的集群中只能有一个主节点,主节点提供所有的增、删、查、改服务,从节点不提供任何服务,但是可以通过设置使从节点提供查询服务,这样可以减少主节点的压力。

1、 MongoDB分布式集群架构

(1)主从复制模式(Master-Slaver Relication)

  • 该模式已经从3.6版本开始被废弃了。
  • 这种方式比单节点的可用性好很多,可用于备份、故障恢复、读扩展等。集群中的主从节点均运行 MongoDB 实例,完成数据的存储、查询与修改操作。
  • 主从复制模式的集群中只能有一个主节点,主节点提供所有的增、删、查、改服务,从节点不提供任何服务,但是可以通过设置使从节点提供查询服务,这样可以减少主节点的压力。
  • 另外,每个从节点要知道主节点的地址,主节点记录在其上的所有操作,从节点定期轮询主节点获取这些操作,然后对自己的数据副本执行这些操作,从而保证从节点的数据与主节点一致。
  • 在主从复制的集群中,当主节点出现故障时,只能人工介入,指定新的主节点,从节点不会自动升级为主节点。同时,在这段时间内,该集群架构只能处于只读状态。

(2)副本集模式(Replica Set)

  • 取代了Master-Slaver模式,是一种互为主从的关系, Replica Set 将数据复制多份保存,不同服务器保存同一份数据,在出现故障时自动切换,实现故障转移。
  • 此集群拥有一个主节点和多个从节点,这一点与主从复制模式类似,且主从节点所负责的工作也类似,但是副本集与主从复制的区别在于:当集群中主节点发生故障时,副本集可以自动投票,选举出新的主节点,并引导其余的从节点连接新的主节点,而且这个过程对应用是透明的。
  • 可以说,MongoDB 的副本集是自带故障转移功能的主从复制。
  • MongoDB 副本集使用的是 N 个 mongod 节点构建的具备自动容错功能、自动恢复功能的高可用方案。在副本集中,任何节点都可作为主节点,但为了维持数据一致性,只能有一个主节点。
  • 主节点负责数据的写入和更新,并在更新数据的同时,将操作信息写入名为 oplog 的日志文件当中。主节点还负责指定其他节点为从节点,并设置从节点数据的可读性,从而让从节点来分担集群读取数据的压力。
  • 另外,从节点会定时轮询读取 oplog 日志,根据日志内容同步更新自身的数据,保持与主节点一致。
  • 在一些场景中,用户还可以使用副本集来扩展读性能,客户端有能力发送读写操作给不同的服务器,也可以在不同的数据中心获取不同的副本来扩展分布式应用的能力。
  • 在副本集中还有一个额外的仲裁节点(不需要使用专用的硬件设备),负责在主节点发生故障时,参与选举新节点作为主节点。
  • 副本集中的各节点会通过心跳信息来检测各自的健康状况,当主节点出现故障时,多个从节点会触发一次新的选举操作,并选举其中一个作为新的主节点。为了保证选举票数不同,副本集的节点数保持为奇数。

(3)分片模式(Sharding)

  • 副本集可以解决主节点发生故障导致数据丢失或不可用的问题,但遇到需要存储海量数据的情况时,副本集机制就束手无策了。副本集中的一台机器可能不足以存储数据,或者说集群不足以提供可接受的读写吞吐量。这就需要用到 MongoDB 的分片(Sharding)技术,这也是 MongoDB 的另外一种集群部署模式。
  • 分片是指将数据拆分并分散存放在不同机器上的过程。有时也用分区来表示这个概念。将数据分散到不同的机器上,不需要功能强大的大型计算机就可以存储更多的数据,处理更大的负载。

2、Docker部署MongoDB集群(Replica Set模式-单台)

mongodb版本信息:

MongoDB shell version v5.0.5

MongoDB server version: 5.0.5

单台的集成了一下shell脚本,多台的是分开的,一步一步的。

mongodb集群搭建

(1)镜像下载

docker pull mongo:5.0.5

(2)备份原来数据库数据(如果需要)

例如原数据库启动命令:
docker run -e TZ=Asia/Shanghai -d --name mongodb --restart always \
-p 27017:27017 \
-v /opt/mongodb/data/configdb:/data/configdb \
-v /opt/mongodb/data/db:/data/db \
-v /opt/mongodb/backup:/data/backup \
--log-opt max-size=10m \
--log-opt max-file=1 \
mongo:5.0.5 --auth

1.进入原mongo容器: docker exec -it mongodb bash
2.备份原mongo库:mongodump --host 127.0.0.1 --port 27017 -u root -p db_root_password -o /data/backup --authenticationDatabase admin
3.停掉原mongo容器(如果部署在同一台端口冲突可先停掉): docker stop mongodb
4.拷贝备份文件:
mkdir /opt/mongo/mongo_master
cp /opt/mongodb/backup -r /opt/mongo/mongo_master

(3)建立集群网络和集群

for conf in 27018_mongo-master 27019_mongo-salve 27020_mongo-arbiter; do \
echo "conf len= ${#conf}, port=${conf:0:5}, name=${conf:6:${#conf}}";
if [ ${conf:0:5} == 27018 ]
then
docker network create mongo-network
echo "create mongo-network"
fi
docker run -d --restart=always \
-p ${conf:0:5}:27017 \
--name ${conf:6:${#conf}} \
-v /opt/mongo/${conf:6:${#conf}}/configdb/:/data/configdb \
-v /opt/mongo/${conf:6:${#conf}}/db/:/data/db \
-v /opt/mongo/${conf:6:${#conf}}/backup:/data/backup \
--net=mongo-network \
mongodb:5.0.5 \
mongod --dbpath /data/db --replSet mongoreplset
done

(4)配置集群

1. 进入master容器中的mongo:docker exec -it mongo-master mongo
2. 配置集群:IP为部署数据库的服务器IP,例如IP是10.9.21.12
config = {_id:"mongoreplset", version:1, members:[{_id:0, host:"10.9.21.12:27018", priority:5}, {_id:1, host:"10.9.21.12:27019", priority:2}, {_id:2, host:"10.9.21.12:27020", priority:3}]}

rs.initiate(config)

3. 退出: exit

4. 验证集群配置:
docker exec -it mongo-master mongo
会有如下提示:mongoreplset:PRIMARY>
docker exec -it mongo-salve mongo
会有如下提示:mongoreplset:SECONDARY>
docker exec -it mongo-arbiter mongo
会有如下提示:mongoreplset:SECONDARY>

(5)加载备份数据(如果需要)

1. 进入master容器中:docker exec -it mongo-master bash
2. 加载备份数据:
mongorestore --host 127.0.0.1 --port 27017 /data/backup/
3. 退出:exit

(6)如无需加载备份数据,需创建数据库用户

1. 进入master容器中的mongo:docker exec -it mongo-master mongo
2. 创建用户:
use admin
db.createUser(
{
user: "root",
pwd: "db_root_password",
roles: ["root"]
}
)
db.auth("root", "Synjones2021")
db.createUser(
{
user: "user01",
pwd: "db_user01_password",
roles: ["readWriteAnyDatabase"]
}
)
exit

(7)删除已部署集群容器

for folder in mongo-master mongo-salve mongo-arbiter; do \
docker rm -f ${folder};
echo "delete ${folder} complete";
done

(8)部署带权限的集群

for conf in 27018_mongo-master 27019_mongo-salve 27020_mongo-arbiter; do \
if [ ${conf:0:5} == 27018 ]
then
docker network create mongo-network
echo "create mongo-network complete"
mkdir /opt/mongo/mongo-key
openssl rand -base64 756 > /opt/mongo/mongo-key/mongo-replication.key
chmod 400 /opt/mongo/mongo-key/mongo-replication.key
sudo chown 999:999 /opt/mongo/mongo-key/mongo-replication.key
echo "create mongo-replication.key complete"
fi
docker run -d --restart=always \
-p ${conf:0:5}:27017 \
--name ${conf:6:${#conf}} \
-v /opt/mongo/${conf:6:${#conf}}/configdb/:/data/configdb \
-v /opt/mongo/${conf:6:${#conf}}/db/:/data/db \
-v /opt/mongo/${conf:6:${#conf}}/backup:/data/backup \
-v /opt/mongo/mongo-key/:/data/key \
--net=mongo-network \
mongodb:5.0.5 \
mongod --dbpath /data/db --replSet mongoreplset \
--oplogSize 128 \
--auth --keyFile=/data/key/mongo-replication.key
done

(9)mongodb集群的连接地址

如下:
mongodb://user01:db_user01_password@10.9.21.12:27018,10.9.21.12:27019,10.9.21.12:27020

(10)工具验证

也可使用Studio 3T for MongoDB软件进行导出和导入数据。

3、Docker部署MongoDB集群(Replica Set模式-多台)

假设一共有两台机器:10.9.21.13(主)、10.9.21.11(从)

(1)备份原来数据库数据(如果需要)

例如原数据库启动命令:
docker run -e TZ=Asia/Shanghai -d --name mongodb --restart always \
-p 27017:27017 \
-v /opt/mongodb/data/configdb:/data/configdb \
-v /opt/mongodb/data/db:/data/db \
-v /opt/mongodb/backup:/data/backup \
--log-opt max-size=10m \
--log-opt max-file=1 \
dining-mongo:1.0 --auth

1.进入原mongo容器: docker exec -it mongodb bash
2.备份原mongo库:mongodump --host 127.0.0.1 --port 27017 -u root -p db_root_password -o /data/backup --authenticationDatabase admin
3.停掉原mongo容器(如果部署在同一台端口冲突可先停掉): docker stop mongodb
4.拷贝备份文件(-v /opt/mongodb/backup:/data/backup):
将备份文件拷贝出来备用

(2)建立数据库集群网络

假设一共有两台机器:10.9.21.13()、10.9.21.11(),两台机器均要创建 mongo-network
docker network ls
docker network create mongo-network

(3)建立集群

假设一共有两台机器:10.9.21.13(主)、10.9.21.11(从)

10.9.21.13(主)

docker run -d --restart=always \
-p 27017:27017 \
--name mongo-master \
-v /opt/mongo/mongo_master/configdb/:/data/configdb \
-v /opt/mongo/mongo_master/db/:/data/db \
-v /opt/mongo/mongo_master/backup:/data/backup \
--net=mongo-network \
mongo:5.0.5 \
mongod --dbpath /data/db --replSet mongoreplset

10.9.21.11(从)

拷贝备份文件进入-v /opt/mongo/mongo-salve/backup(如果需要)
可参考:
进入备份文件夹backup:zip -r ttt.zip *
跨机器拷贝:scp /opt/x/backup/tt.zip @10.9.21.13:/opt/mongo/mongo_master/backup
解压:unzip tt.zip

docker run -d --restart=always \
-p 27018:27017 \
--name mongo-salve \
-v /opt/mongo/mongo-salve/configdb/:/data/configdb \
-v /opt/mongo/mongo-salve/db/:/data/db \
-v /opt/mongo/mongo-salve/backup:/data/backup \
--net=mongo-network \
mongo:5.0.5 \
mongod --dbpath /data/db --replSet mongoreplset

docker run -d --restart=always \
-p 27019:27017 \
--name mongo-arbiter \
-v /opt/mongo/mongo-arbiter/configdb/:/data/configdb \
-v /opt/mongo/mongo-arbiter/db/:/data/db \
-v /opt/mongo/mongo-arbiter/backup:/data/backup \
--net=mongo-network \
mongo:5.0.5 \
mongod --dbpath /data/db --replSet mongoreplset

(4)配置集群

1. 进入master容器:docker exec -it mongo-master bash
2. 进入mongo:mongo
3. 配置集群:IP为部署数据库的服务器IP
config = {_id:"mongoreplset", version:1, members:[{_id:0, host:"10.9.21.13:27017", priority:5}, {_id:1, host:"10.9.21.11:27018", priority:2}, {_id:2, host:"10.9.21.11:27019", priority:3}]}
rs.initiate(config)
4. 退出mongo:exit
5. 加载旧库的备份数据(如果需要,将3.1备份的数据拷贝到主机相应的挂载目录):
mongorestore --host 127.0.0.1 --port 27017 /data/backup/
6. 退出容器: exit
7. 验证集群:
10.9.21.13() docker exec -it mongo-master mongo
会有如下提示:mongoreplset:PRIMARY>
10.9.21.11() docker exec -it mongo-salve mongo
会有如下提示:mongoreplset:SECONDARY>
10.9.21.11() docker exec -it mongo-arbiter mongo
会有如下提示:mongoreplset:SECONDARY>

(5)建立集群权限文件

1.在10.9.21.13(),生成节点通信密钥:
mkdir /opt/mongo/mongo-key
openssl rand -base64 756 > /opt/mongo/mongo-key/mongo-replication.key

2.拷贝集群授权文件到10.9.21.11()
10.9.21.11()创建目录/opt/mongo/mongo-key
mkdir /opt/mongo/mongo-key
10.9.21.13()上执行如下命令:
scp /opt/mongo/mongo-key/mongo-replication.key @10.9.21.11:/opt/mongo/mongo-key/

3.在10.9.21.13()上修改密钥权限
chmod 400 /opt/mongo/mongo-key/mongo-replication.key
sudo chown 999:999 /opt/mongo/mongo-key/mongo-replication.key

4.在10.9.21.11()上修改密钥权限
chmod 400 /opt/mongo/mongo-key/mongo-replication.key
sudo chown 999:999 /opt/mongo/mongo-key/mongo-replication.key

(6)删除已部署集群容器

docker rm -f mongo-master
docker rm -f mongo-salve
docker rm -f mongo-arbiter

(7)部署带权限的集群

docker run -e TZ=Asia/Shanghai -d --restart always \
-p 27017:27017 \
--name mongo-master \
-v /opt/mongo/mongo_master/configdb/:/data/configdb \
-v /opt/mongo/mongo_master/db/:/data/db \
-v /opt/mongo/mongo_master/backup/:/data/backup \
-v /opt/mongo/mongo-key/:/data/key \
--net=mongo-network \
--log-opt max-size=10m \
--log-opt max-file=1 \
mongo:5.0.5 \
mongod --dbpath /data/db --replSet mongoreplset \
--oplogSize 128 \
--auth --keyFile=/data/key/mongo-replication.key
docker run -e TZ=Asia/Shanghai -d --restart always \
-p 27018:27017 \
--name mongo-salve \
-v /opt/mongo/mongo-salve/configdb/:/data/configdb \
-v /opt/mongo/mongo-salve/db/:/data/db \
-v /opt/mongo/mongo-salve/backup/:/data/backup \
-v /opt/mongo/mongo-key/:/data/key \
--net=mongo-network \
--log-opt max-size=10m \
--log-opt max-file=1 \
mongo:5.0.5 \
mongod --dbpath /data/db --replSet mongoreplset \
--oplogSize 128 \
--auth --keyFile=/data/key/mongo-replication.key
docker run -e TZ=Asia/Shanghai -d --restart always \
-p 27019:27017 \
--name mongo-arbiter \
-v /opt/mongo/mongo-arbiter/configdb/:/data/configdb \
-v /opt/mongo/mongo-arbiter/db/:/data/db \
-v /opt/mongo/mongo-arbiter/backup/:/data/backup \
-v /opt/mongo/mongo-key/:/data/key \
--net=mongo-network \
--log-opt max-size=10m \
--log-opt max-file=1 \
mongo:5.0.5 \
mongod --dbpath /data/db --replSet mongoreplset \
--oplogSize 128 \
--auth --keyFile=/data/key/mongo-replication.key
责任编辑:姜华 来源: 魔法小木瓜
相关推荐

2024-03-07 16:03:56

RedisDocker

2014-03-28 09:35:11

MongoDBSharding

2017-07-11 13:30:12

RedisDockerLinux

2023-04-07 08:28:14

2023-06-12 07:41:16

dockerspark集群

2016-01-07 09:36:20

Docker容器

2023-11-13 09:03:10

2015-05-27 10:29:41

DockerHadoopHadoop集群

2023-02-14 08:01:32

2015-06-16 16:20:40

2016-10-27 09:37:10

Hadoop集群配置

2011-12-07 16:11:50

Hadoop集群搭建

2015-01-08 10:29:59

Shipyardweb管理集中化

2017-04-26 08:51:36

MongoDB集群实战

2020-12-14 12:48:51

Kafka集群节点

2015-05-06 13:34:14

MySQL集群搭建

2023-10-09 07:31:25

2018-01-29 12:39:56

数据库MongoDB集群

2015-05-07 15:00:41

MongoDB分片与集群NoSQL

2021-01-07 10:18:03

Redis数据库环境搭建
点赞
收藏

51CTO技术栈公众号