mongodb docker 集群搭建
Published:
Replica Set 架构 mongodb docker 集群搭建。
结构:Replica Set 架构(一主一从一仲裁)
优点:具备故障转移能力、仲裁节点起到选举作用节省部分资源
集群搭建配置
0、若测试时需要删除当前集群,重新建集群
cd /home/ls/mongodb_cluster
docker-compose -f mongodb_cluster.yml down
rm -rf /home/ls/mongodb_cluster/mongodb.key
rm -rf /home/ls/mongodb_cluster/data
1、生成 keyFile
mkdir /home/ls/mongodb_cluster
cd /home/ls/mongodb_cluster
openssl rand -base64 756 > mongodb.key
chmod 400 mongodb.key
2、编写配置文件
cd /home/ls/mongodb_cluster
vim mongodb_cluster.yml
内容如下:
version: '3.6'
services:
master:
image: mongo:3.6.4
container_name: qs_master
volumes:
- /home/ls/mongodb_cluster/data/replset/master:/data/db
- /home/ls/mongodb_cluster/mongodb.key:/data/mongodb.key
ports:
- 8027:27017
networks:
- mongoNet
environment:
MONGO_INITDB_ROOT_USERNAME: ***
MONGO_INITDB_ROOT_PASSWORD: ***
command: mongod --dbpath /data/db --replSet qs_mongo --oplogSize 128 --keyFile /data/mongodb.key
entrypoint:
- bash
- -c
- |
chmod 400 /data/mongodb.key
chown 999:999 /data/mongodb.key
exec docker-entrypoint.sh $$@
slave:
image: mongo:3.6.4
container_name: qs_slave
volumes:
- /home/ls/mongodb_cluster/data/replset/slaver:/data/db
- /home/ls/mongodb_cluster/mongodb.key:/data/mongodb.key
ports:
- 8028:27017
networks:
- mongoNet
environment:
MONGO_INITDB_ROOT_USERNAME: ***
MONGO_INITDB_ROOT_PASSWORD: ***
command: mongod --dbpath /data/db --replSet qs_mongo --oplogSize 128 --keyFile /data/mongodb.key
entrypoint:
- bash
- -c
- |
chmod 400 /data/mongodb.key
chown 999:999 /data/mongodb.key
exec docker-entrypoint.sh $$@
arbiter:
image: mongo:3.6.4
container_name: qs_arbiter
volumes:
- /home/ls/mongodb_cluster/data/replset/arbiter:/data/db
- /home/ls/mongodb_cluster/mongodb.key:/data/mongodb.key
ports:
- 8029:27017
networks:
- mongoNet
environment:
MONGO_INITDB_ROOT_USERNAME: ***
MONGO_INITDB_ROOT_PASSWORD: ***
command: mongod --dbpath /data/db --replSet qs_mongo --smallfiles --oplogSize 128 --keyFile /data/mongodb.key
entrypoint:
- bash
- -c
- |
chmod 400 /data/mongodb.key
chown 999:999 /data/mongodb.key
exec docker-entrypoint.sh $$@
networks:
mongoNet:
driver: bridge
3、根据配置文件创建容器
注:这里使用 docker-compose
而不是 docker
,docker-compose
是 docker 中用于集群管理的工具。
docker-compose -f mongodb_cluster.yml up -d
4、可查看刚刚创建的容器
通过 docker 查看
docker ps -a
# 注意到这里显示的容器名为 qs_master、qs_slave、qs_arbiter(跟配置文件的 container_name 一致)
通过 docker-compose 查看
docker-compose -f mongodb_cluster.yml ps -a
# 注意这里要指定配置文件是什么,该命令只会显示该配置文件下的集群容器信息
# 注意到这里显示的容器名为 master、slave、arbiter(看配置文件每个容器的头部名一致)
5、在 master 节点上配置主从仲裁信息
docker-compose -f mongodb_cluster.yml exec master mongo admin -u *** -p ***
# 在 master 节点上配置从和仲裁节点的信息
# !!!有时候会报错时间戳哈希错误,请记得再输一次!!!
rs.initiate()
rs.add('slave:27017')
rs.add('arbiter:27017',true)
# 查看配置与副本级状态
rs.conf()
rs.status()
# 退出
exit
至此搭建成功
集群测试
测试同步功能
1、在 master 节点上插入信息
docker-compose -f mongodb_cluster.yml exec master mongo admin -u *** -p ***
use test
db.test.insert({msg: 'this is from primary', ts: new Date()})
exit
2、在 slave 中检测信息是否同步
docker-compose -f mongodb_cluster.yml exec slave mongo admin -u *** -p ***
# 因为默认从节点是不可读的,所以先需要开启读权限
rs.slaveOk()
use test
db.test.find()
exit
3、在 arbiter 中检测信息是否同步
docker-compose -f mongodb_cluster.yml exec arbiter mongo admin -u *** -p ***
(这里会显示读取失败,因为仲裁节点不是用来读的)
rs.slaveOk()
use test
db.test.find()
exit
故障转移测试
1、查看节点当前的性质
# master 节点是 PRIMARY
docker-compose -f mongodb_cluster.yml exec master mongo admin -u *** -p ***
# 显示 newset:PRIMARY>
# slave 节点是 SECONDARY
docker-compose -f mongodb_cluster.yml exec slave mongo admin -u *** -p ***
# 显示 newset:SECONDARY>
# arbiter 节点是 ARBITER
docker-compose -f mongodb_cluster.yml exec arbiter mongo admin -u *** -p ***
# 显示 newset:ARBITER>
2、假设 master 节点掉线了
docker-compose -f mongodb_cluster.yml stop master
3、查看节点当前的性质,发现 slave 节点变为 PRIMARY,故障转移成功
# slave 节点是 PRIMARY
docker-compose -f mongodb_cluster.yml exec slave mongo admin -u *** -p ***
# 显示 newset:PRIMARY>
# arbiter 节点是 ARBITER
docker-compose -f mongodb_cluster.yml exec arbiter mongo admin -u *** -p ***
# 显示 newset:ARBITER>
MongoDB 基础使用
1、安装镜像启动容器
# 安装 MongoDB 最新版本的镜像
docker pull mongo
# MongoDB 容器基本创建方法和数据目录挂载
docker run -itd -p 8030:27017 -v /home/lsy/test_db:/data/db --name test mongo --auth
2、连接创建管理用户
- mongodb是没有默认管理员账号,所以要先添加管理员账号,在开启权限认证。
- 切换到admin数据库,添加的账号才是管理员账号。
- 用户只能在用户所在数据库登录,包括管理员账号。
- mongo的用户是以数据库为单位来建立的,每个数据库有自己的管理员。
- 管理员可以管理所有数据库,但是不能直接管理其他数据库,要先在admin数据库认证后才可以。
# 尝试连接
docker exec -it test mongo admin
# 添加管理用户
db.createUser({ user:'lsy', pwd:'***', roles:[ { role:'userAdminAnyDatabase', db: 'admin'}]});
db.auth('lsy', '***')
3、创建新数据库
# 如果数据库不存在,则创建数据库,否则切换到指定数据库。
use student
# 为当前数据库添加用户
db.createUser({ user:'boy', pwd:'***', roles:[ { role:'readWrite', db: 'student'}]})
db.auth('boy', '***')
# 每个数据库都有自己的 user 表
show users
exit
4、正常连接
docker exec -it test /bin/bash
mongo
use admin
db.auth('lsy', '***')
exit
补充:可视化工具 MongoDB Compass