Mongodb本机部署副本集
目录知识储备1.为什么我们需要搭建副本集模式呢?2.副本集成员构架应用目标实践步骤写在最后知识储备1.为什么我们需要搭建副本集模式呢?MongoDB独立模式可以简单且快速的构建MongoDB数据库系统,然而独立模式存在弊端,即一旦MongoDB发生宕机,将会面临数据丢失的风险,这在生产环境中是不允许发生的,此时我们可以利用MongoDB提供的高可用机制,即复制。MongoDB支持两种复制类型:传统
目录
知识储备
1.为什么我们需要搭建副本集模式呢?
MongoDB独立模式可以简单且快速的构建MongoDB数据库系统,然而独立模式存在弊端,即一旦MongoDB发生宕机,将会面临数据丢失的风险,这在生产环境中是不允许发生的,此时我们可以利用MongoDB提供的高可用机制,即复制。
MongoDB支持两种复制类型:传统的主/从复制和副本集,副本集可以理解为传统主/从复制的一种复杂形
式 , 支持自动故障恢复功能 , 拥有更高的可用性 。
2.副本集成员构架
客户端程序(Client Application)通过驱动器(Driver)连接副本集主节点(Primary)进行读写操作,当主节点数据副本发生变化,此时副本节点(Secondary)通过Replication(复制)同步主节点的数据副本,使副本集中副本节点与主节点存储相同数据副本。
副本集中的各节点还会通过传递心跳信息(Heartbeat)来检测各自的健康状态。当主节点故障时,拥有投票权的副本节点和仲裁节点(Arbiter)会触发一次新的选举操作,并从副本节点中选举出新的主节点,以确保副本集正常运行。
应用目标
学习回顾完上述基础知识框架以后,我们有了更明确的实践目标。知道我们接下来要实践的内容从哪里来,到哪里去,要完成具体哪个任务。此篇博文主要记录如何在本机完成MongoDB副本集的部署。
实践步骤
一、部署副本集
1. 创建数据目录
打开dos窗口 (win+R)
创建如下三个文件夹 : 为每个成员创建必要的数据目录
mkdir d:\srv\mongodb\rs0-0
mkdir d:\srv\mongodb\rs0-1
mkdir d:\srv\mongodb\rs0-2
执行完上述操作之后,会在d:\srv\mongodb\目录下创建rs0-0、rs0-1和\rs0-2三个文件夹。
相应文件夹路径下具体结果如图所示:
2. 启动副本集
First memeber: 新打开一个dos窗口执行如下命令(以管理员身份打开):
C:\WINDOWS\system32> mongod --replSet rs0 --port 27017 --dbpath d:\srv\mongodb\rs0-0
Second member: 再新打开一个dos窗口 执行如下命令(以管理员身份打开):
C:\WINDOWS\system32> mongod --replSet rs0 --port 27019 --dbpath d:\srv\mongodb\rs0-1
Third member: 再次新打开一个dos窗口 执行如下命令(以管理员身份打开):
C:\WINDOWS\system32>mongod --replSet rs0 --port 27020 --dbpath d:\srv\mongodb\rs0-2
这将以名为rs0的副本集的成员的身份启动每个实例,
每个实例运行在不同的端口上(27017,27019,27020),
并使用 --dbpath设置指定数据目录的路径
3. 关闭MongoDB服务
- 任务栏搜索服务和应用程序,找到相应位置
- 选择MongoDB服务,单击将服务手动关闭
4.登录mongod实例
通过mongo shell连接到mongod实例之一,通过指定其端口号来指示哪个实例
(采用cmd打开mongodb服务需要提前配置环境变量,没有相应概念的小伙伴找找其他资料; 也可以直接打开找到mongo.exe文件所在位置打开mongo shell)
这里采用第一种方式:直接使用cmd连接mongo客户端
C:\WINDOWS\system32>mongo --port 27020
运行结果如下:
5. 创建副本集配置对象rsconf
>rsconf = { _id: "rs0", members: [ { _id: 0, host: "127.0.0.1:27017" }, {_id: 1, host: "127.0.0.1:27019"}, { _id: 2, host: "127.0.0.1:27020" }]}
运行结果如下:
_id 为rs0
members共有三个副本集节点(注意仔细查看运行信息:标注了三个端口情况)
6. 初始化副本集
使用rs.initiate()初始化副本集,然后将rsconf文件传递给rs.initiate()
> rs.initiate(rsconf)
运行结果如下:
ok:1 表示初始化成功
7. 查看副本集成员状态
- 主节点查看成员状态:
rs0:PRIMARY> rs.status()
部分结果如下:
- 副节点查看成员状态:
rs0:SECONDARY> rs.status()
部分结果如下:
8. 判断是否为主节点
如何判断主节点和辅助节点 : db.isMaster()
rs0:PRIMARY> db.isMaster()
- hosts标注三个副本集结点的端口号
- primary指明主节点
- me指明当前端口所对应的节点
至此,本机环境的MongoDB副本集部署完成,接下来我们需要使用副本集完成数据一致性的检验以及其他配置。
二、验证副本集数据的一致性
1. 主节点添加数据
向主节点添加一条数据,查看辅助接点是否也有此条数据
(按照上述的配置,主节点的端口是27020,此端口是随机的可能存在差异)
- 使用admin数据库
rs0:PRIMARY> db
rs0:PRIMARY> use admin
- 给变量p赋值
rs0:PRIMARY> p={"ammeterId" : "110004217635", "rulerCode" : "04000102", "dataItem" : "193710", "terminalTime" : "2019-06-20 19:29:51", "storageTime" : "2019-06-21 10:30:12" }
- 插入变量p
rs0:PRIMARY> db.zt.insert(p)
- 查找对应记录
rs0:PRIMARY>db.zt.find().pretty()
2. 副节点查看数据
新开一个dos窗口,登录到辅助节点
查看辅助节点(27019)是否有主节点(27020)插入的数据
C:\WINDOWS\system32> mongo --port 27019
运行结果如下:
同理执行主节点上述操作:
rs0:SECONDARY> db
test
rs0:SECONDARY> use admin
switched to db admin
rs0:SECONDARY> db.zt.find()
{
“_id” : ObjectId(“6198e49b2614961bf6baa4aa”),
“ammeterId” : “110004217635”,
“rulerCode” : “04000102”,
“dataItem” : “193710”,
“terminalTime” : “2019-06-20 19:29:51”,
“storageTime” : “2019-06-21 10:30:12”
}
特别想强调一点,在查询数据的过程中会遇到一个错误:
报错信息及解决方法在结果图中给出:
db.getMongo().setSecondaryOk()
三、移除一台服务器
移除27019这个辅助节点,删除服务必须在admin数据库下,在执行下面操作之前,先执行 use admin操作。然后执行以下操作:
- 关闭副节点
- 此时在主节点上查看状态rs.status()是会看到一些辅助节点的错误信息的如下
- 连接到主节点mongoshell
执行以下命令来移除该成员 rs.remove(“127.0.0.1:27019”)
- 此时再在主节点查看副本集状态信息,则不会有辅助节点的错误信息 。表明删除辅助节点(移除一台服务器)成功
如图所示只存在两个端口,不存在27019端口相关信息。
四、 添加一台服务器
将一个新的活跃成员添加到副本集,就像处理其他成员一样
- 首先打开一个新的命令提示符并且创建数据目录, (新成员的端口为 27019)
C:\WINDOWS\system32>mongod --replSet rs0 --port 27019 --dbpath d:\srv\mongodb\rs0-1
2.连接到主节点(27020)的mongoshell控制台,将这个新成员添加到副本集 rs.add("127.0.0.1:27019")
3. 查看副本集状态信息 rs.status()
如图所示:新添加节点id为3 端口号为27019
五、 故障转移
移除当前主节点27020观察故障转移,首先执行use admin,然后执行以下操作。
- 连接到mongo实例通过mongo+27020
执行以下命令 db.shutdownServer()
- 此时,主节点27020的服务已经关闭,然后查询剩下的副节点的状态,从结果看27017变成了新的主节点。
- 重新添加27020节点,发现27020变成副节点。
具体操作原理和步骤参照如何添加新节点:
主节点添加新的副本集节点
查看节点信息:
id为4 端口号为27020 端口状态为secondary
六、 调整副本优先级
rs0:PRIMARY> con=rs.conf()
- 所有节点默认优先级为1
- 修改27019端口的优先级为2
rs0:PRIMARY>con.members[1].priority = 2
- 然后将优先级的操作应用到副本集,之后会发现27019变成了主节点
rs0:PRIMARY> rs.reconfig(con)
七、配置隐藏节点
- 将副本集配置信息赋值到变量con。
rs0:PRIMARY> con=rs.conf()
2. 设置服务器中副本节点(27020)的优先级为0
3. 设置服务器中副本节点为隐藏节点
4. 将调整副本集成员的操作应用到副本集
5. 验证隐藏节点信息(27020端口的hidden属性修改为true)
八、配置延迟节点
延迟节点是副本节点的另一种表现形式,它代表此节点的数据与主节点的数
据有一定的延迟同步,通过设定一个延迟的属性来确定。实现延迟副本节点的前
提是该节点为隐藏节点。
- 将副本集配置信息赋值到变量cfg
rs0:PRIMARY> cfg = rs.conf()
- 设置延迟时间为3600秒
rs0:PRIMARY> cfg.members[2].slaveDelay =3600
- 将调整副本集成员的操作应用到副本集
九、配置副本集投票权
副本集中允许有七个拥有投票权的成员,配置副本集成员拥有投票权需要修
改参数votes的值为1,如修改值为0则代表该成员不具备投票权,默认情况下在
副本集中创建的成员都具备投票权,即votes的值为1。
- 将副本集配置信息赋值到变量cfg
cfg = rs.conf()
- 设置端口27020中隐藏节点的投票权设置为0,即不可投票
cfg.members[2].votes = 0
- 将调整副本集成员的操作应用到副本集
rs.reconfig(cfg)
写在最后
- 本次实践反反复复折腾了好几个轮回,理清实践所需的知识框架和目的之后对实践的理解更深刻,也知道从哪里来,到哪里去,更明白我在完成什么样的一个小目标。
- 如何看配置成功或者失败的相关信息也是需要不断提升的地方,借此机会将每部分对应的结果图分析都做了一个简明扼要的提示,也有利于加深对项目的理解。
更多推荐
所有评论(0)