MongoDB副本集搭建

89 阅读2分钟

我正在参加「掘金·启航计划」

环境: centos7 docker vbox虚拟机

目的:入门熟悉下mongodb副本集

简介

MongoDB中的副本集是一组维护相同数据集合的 mongod进程。副本集提供了冗余和高可用性(主节点挂了之后可以调度其他节点进行提升),并且这是所有生产部署的基础。

它含有三种角色:主节点,副本节点,仲裁者

拉取mongo

docker pull mongo

运行并挂载容器

-d 后台运行

--name 取名

-p 本机开放端口:docker端口

--restart=always 随着docker的启动而启动

--privileged=true 获取root权限

-v 目标路径:源路径 挂载路径,它会自动创建没有的目录

--replSet 副本集名字

容器1

docker run -d --name mongo1 -p 27001:27017 \
--restart=always --privileged=true \
-v /dzz/mongo1/db:/data/db \
-v /dzz/mongo1/log:/data/log \
mongo --replSet mongo_all

容器2

docker run -d --name mongo2 -p 27002:27017 \
--restart=always --privileged=true \
-v /dzz/mongo2/db:/data/db \
-v /dzz/mongo2/log:/data/log \
mongo --replSet mongo_all

容器3

docker run -d --name mongo3 -p 27003:27017 \
--restart=always --privileged=true \
-v /dzz/mongo3/db:/data/db \
-v /dzz/mongo3/log:/data/log \
mongo --replSet mongo_all

docker ps查看启动的容器

docker inspect 容器名或ID 查看详细信息

进入mongo

选择其中一个作为主节点

首先进入容器内部

docker exec -it mongo1 bash

在进入mongo里

mongo

image.png

创建集群

自己取名={_id:"副本集名称",members:[{_id:0,host:"IP地址:27001",priority:优先级数字越大越高},{_id:1,host:"IP地址:27002",priority:优先级数字越大越高},{_id:2,host:"IP地址:27003",arbiterOnly:仲裁节点为true}]};

mycfg={_id:"mongo_all",members:[{_id:0,host:"192.168.56.106:27001",priority:2},{_id:1,host:"192.168.56.106:27002",priority:1},{_id:2,host:"192.168.56.106:27003",arbiterOnly:true}]};

rs.initiate(mycfg); #初始化

结果

在主节点mongo1创建数据库

use db1;
db.db1.insert({"name": "dzz"}); #想要查看数据库需要插入一些数据

查看db1

show dbs;

image.png

在另一个终端打开mongo2(副本节点)

show dbs;

报错

image.png

原因:SECONDARY(副本节点)不允许读

解决:

rs.slaveOk();

查看数据库

show dbs;

image.png

mongo3是仲裁节点,负责主节点挂了之后升级副本节点

完毕!