引言
上一章节中,我们详细介绍了在典型的三节点复制集环境中搭建MongoDB的步骤和注意事项。从准备配置文件到启动MongoDB进程,我们一步步指导读者完成了环境的设置。在本章节中,我们将进一步深入,重点讲解如何进行复制集的配置和安全验证,以及连接方式的选择。通过学习这些内容,读者将能够更好地理解和应用MongoDB的复制集功能,确保数据的可靠性和安全性。
配置复制集
在复制集中,可以通过使用replSetInitiate命令或mongo shell的rs.initiate()方法来进行初始化。一旦初始化完成,各个成员之间会开始发送心跳消息,并进行Primary选举操作。在此过程中,节点需要获得足够多成员的投票支持,才能成为Primary节点,而其他节点则会成为Secondary节点。
方法1:
代码语言:txt复制 #mongo ‐‐port 28017
# 初始化复制集
> rs.initiate()
# 将其余成员添加到复制集
> rs.add("192.168.65.174:28018")
> rs.add("192.168.65.174:28019")
方法2:
代码语言:txt复制 # mongo ‐‐port 28017
# 初始化复制集
> rs.initiate({
_id: "rs0",
members: [{
_id: 0,host: "192.168.65.174:28017"
},{
_id: 1,host: "192.168.65.174:28018"
},{
_id: 2,host: "192.168.65.174:28019"
}]
})
验证
MongoDB 主节点进行写入
代码语言:txt复制 # mongo ‐‐port 28017
rs0:PRIMARY> db.user.insert([{name:"xiaoyu"},{name:"monkey"}])
MongoDB 从节点进行读
代码语言:txt复制 # mongo ‐‐port 28018
# 指定从节点可读
rs0:SECONDARY> rs.secondaryOk()
rs0:SECONDARY> db.user.find()
复制集状态查询
查看最新复制集整体状态:
rs.status()
在复制集中,可以查看各成员的当前状态,以了解它们是否健康、是否在进行全量同步、心跳信息、增量同步信息、选举信息以及上一次的心跳时间等。通过这些信息,您可以监控和评估复制集的运行状况。
在复制集中,通过查看"members"字段,可以获得关于所有成员的状态信息。这些信息可以帮助我们判断成员的健康状况,了解它们是否在进行全量同步,以及其他相关信息。下面是一些主要的状态字段的解释:
- health:表示成员是否健康,这是通过心跳检测来确定的。
- state/stateStr:表示成员的状态。如果成员是主节点,则状态为PRIMARY;如果成员是备用节点,则状态为SECONDARY。当节点发生故障时,可能会出现一些其他的状态,例如RECOVERY。
- uptime:表示成员的启动时间,即成员运行的时间。
- optime/optimeDate:表示成员最后一次同步oplog的时间。oplog是MongoDB中的操作日志,用于在复制集中同步数据变更。
- optimeDurable/optimeDurableDate:表示成员最后一次同步oplog的时间,这个时间是持久的,即该时间点之前的所有数据变更已经被持久化到磁盘上。
- pingMs:表示成员与当前节点之间的ping时延,即网络延迟。
- syncingTo:表示成员正在从哪个节点进行同步操作,即同步来源。
查看当前节点角色:
db.isMaster()
除了当前节点的角色信息,你可以通过发送一个特定的命令来获取更详细的信息,包括整个复制集的成员列表、真正的主节点(Primary)是谁以及与复制集相关的协议配置信息等。Driver 在首次连接复制集时会发送该命令。
Mongo Shell
复制集命令
命令 | 描述 |
---|---|
rs.add() | 为复制集新增节点 |
rs.addArb() | 为复制集新增一个 arbiter |
rs.conf() | 返回复制集配置信息 |
rs.freeze() | 防止当前节点在一段时间内选举成为主节点 |
rs.help() | 返回 replica set 的命令帮助 |
rs.initiate() | 初始化一个新的复制集 |
rs.printReplicationInfo() | 以主节点的视角返回复制的状态报告 |
rs.printSecondaryReplicationInfo() | 以从节点的视角返回复制状态报告 |
rs.reconfig() | 通过重新应用复制集配置来为复制集更新配置 |
rs.remove() | 从复制集中移除一个节点 |
rs.secondaryOk() | 为当前的连接设置 从节点可读 |
rs.status() | 返回复制集状态信息。 |
rs.stepDown() | 让当前的 primary 变为从节点并触发 election |
rs.syncFrom() | 设置复制集节点从哪个节点处同步数据,将会覆盖默认选取逻辑 |
安全认证
创建用户
在主节点服务器上,启动mongo
代码语言:txt复制 use admin
#创建用户
db.createUser( {
user: "xiaoyu",
pwd: "xiaoyu",
roles: [ { role: "clusterAdmin", db: "admin" } ,
{ role: "userAdminAnyDatabase", db: "admin"},
{ role: "userAdminAnyDatabase", db: "admin"},
{ role: "readWriteAnyDatabase", db: "admin"}]
})
创建keyFile文件
KeyFile文件在MongoDB集群中的作用是提供安全认证机制。它用于在集群节点之间进行身份验证,以增加集群的安全性。(开启keyfile认证就默认开启了auth认证了)。
代码语言:txt复制 #mongo.key采用随机算法生成,用作节点内部通信的密钥文件。
openssl rand ‐base64 756 > /data/mongo.key
#权限必须是600
chmod 600 /data/mongo.key
在进行复制集的初始化之前,请确保先停止所有主从节点上的mongod服务。然后,创建一个名为keyFile的文件,并将其拷贝到复制集的其他从节点服务器上。在复制集的每个从节点上,将keyFile文件的路径地址配置到mongo.conf配置文件中的keyFile字段,并设置keyFile文件的权限为600。最后,启动mongod服务。这样做的目的是为了确保keyFile文件能够被所有节点正确访问,并提供必要的安全认证机制。
代码语言:txt复制 # 启动mongod
mongod ‐f /data/db1/mongod.conf ‐‐keyFile /data/mongo.key
mongod ‐f /data/db2/mongod.conf ‐‐keyFile /data/mongo.key
mongod ‐f /data/db3/mongod.conf ‐‐keyFile /data/mongo.key
测试
代码语言:txt复制1 #进入主节点
2 mongo ‐‐port 28017
代码语言:txt复制1 #进入主节点
2 mongo ‐‐port 28017 ‐uxiaoyu ‐pxiaoyu ‐‐authenticationDatabase=admin
复制集连接方式
方式一:在连接复制集时直接连接到主节点(Primary),并且在正常情况下可以进行读写操作,但一旦主节点发生故障切换,你无法正常访问数据库,
方式二(强烈推荐):通过使用高可用URI连接到MongoDB,当主节点发生故障切换时,MongoDB驱动程序可以自动感知并将流量路由到新的主节点。这种方式可以提供更高的可用性和自动故障转移。
springboot操作复制集配置
spring:
data:
mongodb:
uri:
mongodb://xiaoyu:xiaoyu@192.168.65.174:28017,192.168.65.174:28018,192.168.65.174:28019/test?authSource=admin&replicaSet=rs0
总结
本章介绍了MongoDB复制集的配置和使用方法。首先,我们学习了如何初始化和添加节点到复制集,并验证了主节点的写入和从节点的读取功能。然后,我们了解了如何查询复制集的状态,包括成员的健康状况、同步信息和角色等。最后,我们介绍了如何配置复制集的安全认证,包括创建用户和生成keyFile文件,并演示了使用认证信息连接复制集的方式。通过本章的学习,你将掌握MongoDB复制集的基本使用和配置方法。
我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!