MongoDB 高可用集群 -复制集搭建(mongodb拷贝集合命令)
wptr33 2025-05-02 13:51 29 浏览
环境准备
mongodb-4.4.14为例,多台(最少2台)虚拟机
原理
MongoDB复制集由一组MongoDB实例(进程)组成,包含一个Primary节点和多个Secondary节点,MongoDB Driver(客户端)的所有数据都写入Primary,Secondary从Primary同步写入的数据,以保持复制集内所有成员存储相同的数据集,提供数据的高可用。
下图(图片源于MongoDB官方文档)是一个典型的MongoDB复制集,包含一个Primary节点和2个Secondary节点。
数据同步
Primary与Secondary之间通过oplog来同步数据,Primary上的写操作完成后,会向特殊的local.oplog.rs集合写入一条oplog,Secondary不断的从Primary获取新的oplog并应用。
因oplog的数据会不断增加,local.oplog.rs被设置成为一个capped集合,当容量达到配置上限时,会将最旧的数据删除掉。另外考虑到oplog在Secondary上可能重复应用,oplog必须具有幂等性,即重复应用也会得到相同的结果。
如下oplog的格式,包含ts、h、op、ns、o等字段。
{
"ts" : Timestamp(1446011584, 2),
"h" : NumberLong("1687359108795812092"),
"v" : 2,
"op" : "i",
"ns" : "test.nosql",
"o" : { "_id" : ObjectId("563062c0b085733f34ab4129"), "name" : "mongodb", "score" : "100" }
}- ts:操作时间,当前timestamp + 计数器,计数器每秒都被重置。
- h:操作的全局唯一标识。
- v:oplog版本信息。
- op:操作类型。
- i:插入操作。
- u:更新操作。
- d:删除操作。
- c:执行命令(如createDatabase,dropDatabase)。
- n:空操作,特殊用途。
- ns:操作针对的集合。
- o:操作内容,如果是更新操作。
- o2:操作查询条件,仅update操作包含该字段。
Secondary初次同步数据时,会先执行init sync,从Primary(或其他数据更新的Secondary)同步全量数据,然后不断通过执行tailable cursor从Primary的local.oplog.rs集合里查询最新的oplog并应用到自身。
异常处理(rollback)
当Primary宕机时,如果有数据未同步到Secondary,并且在Primary重新加入时,新的Primary上已经发生了写操作,则旧Primary需要回滚部分操作,以保证数据集与新的Primary一致。旧Primary将回滚的数据写到单独的rollback目录下,数据库管理员可根据需要使用mongorestore进行恢复。
- 下载mongodb-4.4.14版本
- 上传到服务器并解压:/usr/local/mongodb-4.4.14
- 切换目录到
cd /usr/local/mongodb-4.4.14在mongodb-4.4.14目录下 创建 conf;data;logs;pids 文件夹(命令:mkdir conf data logs pids)
- 在conf文件夹下创建mongo.conf(没配置权限认证)
cd conf- 配置mongo.conf
#编辑
vim mongo.confsystemLog:
quiet: false
#日志保存路径
path: /usr/local/mongodb-4.4.14/logs/mongodb.log
#日志不追加写入(每天生成一个日志文件)
logAppend: false
# 日志输出目的地,可以指定为 “file” 或者“syslog”,表述输出到日志文件,如果不指定,则会输出到标准输出中(standard output)
destination: file
processManagement:
#开启子进程
fork: true
#进程描述文件
pidFilePath: /usr/local/mongodb-4.4.14/pids/mongodb.pid
net:
#允许哪些ip访问
bindIp: 0.0.0.0
#mongo端口
port: 37600
#最大连接数
maxIncomingConnections: 5000
#开启输入验证
wireObjectCheck: true
storage:
#数据保存路径
dbPath: /usr/local/mongodb-4.4.14/data
#是否开启 journal 日志持久存储,journal 日志用来数据恢复,是 mongod 最基础的特性,通常用于故障恢复
journal:
enabled: true
#设置引擎
engine: wiredTiger
operationProfiling:
#指定慢查询时间,单位毫秒,如果打开功能,则向system.profile集合写入数据
slowOpThresholdMs: 300
#off、slowOp、all,分别对应关闭,仅打开慢查询,记录所有操作
mode: slowOp
#复制集相关配置
replication:
replSetName: rs0
#开启数据安全认证模式
#security:
# keyFile: mongodb-keyfile
# authorization: enabled
- 启动MongoDB
切换到MongoDB的bin目录
cd /usr/local/mongodb-4.4.14/bin
#执行启动命令
./mongod -f ../conf/mongo.conf
-----------------每台机器都做以上操作---完成MongoDB的安装--------------
#执行关闭命令
./mongod -f ../conf/mongo.conf --shutdown- 连接 MongoDB
cd /usr/local/mongodb-4.4.14/bin
#(随机选择一台机器)无密码连接命令
./mongo --host ip:port- 在节点中初始化集群节点
rs.initiate({
_id:"rs0",
members:[
{_id:0, host:"ip:端口", priority:2},
{_id:1, host:"ip:端口", priority:1},
# arbiterOnly节点可选,在服务器台数较少时,不需要此节点
{_id:2, host:"ip:端口", arbiterOnly:true}
]
});
刚执行一小段时间内不会出现主节点,主节点的选举有一个过程
- 在主节点中添加和删除节点(节点管理)
#添加节点
rs.add({host:"ip:端口"})
#删除节点
rs.remove("ip:端口")- not master and slaveok=false”错误解决方法
在SECONDARY节点中,操作数据库时有可能会出现此错误,SECONDARY是不允许读写的,如果非要解决命令如下:
rs.slaveOk();
如果命令过期,按照提示重新修改命令再次执行,这样就副本节点可读
- 查询数据库列表命令
show dbsadmin 0.000GB
config 0.000GB
local 0.959GB
- 切换到admin数据库
use admin- 创建管理员账号(内主数据库admin)[优先关闭权限认证配置,用户创建成功后再开启权限配置]
db.createUser(
{
user: "root",
pwd: "root123456",
roles: [ { role: "root", db: "admin" } ]
}
)- admin数据库授权账号
#如果返回1,则表示成功
db.auth("root", "root123456")- 退出系统,关闭无密码连接
exit- 用密码连接mongodb
./mongo –host localhost:37600 -u "root" --authenticationDatabase "admin" -p- 输入密码
root123456----------------以上完成集群和账号创建
-----------------------------
集群安全认证
- 关闭集群
先关闭从节点,最后关闭主节点防止主从切换,开启权限验证配置,在配置中打开以下几项配置
#开启数据安全认证模式
security:
keyFile: mongodb-keyfile
authorization: enabled- mongodb-keyfile文件
生成mongodb-keyfile文件时,切换到MongoDB的bin目录下执行以下命令生成key文件,所有集群都使用一个mongodb-keyfile文件
/usr/local/mongodb-4.4.14/bin
#生成mongodb-keyfile文件命令
openssl rand -base64 741 > mongodb-keyfile
#授权key文件
chmod 600 /usr/local/mongodb-4.4.14/bin/mongodb-keyfile把mongodb-keyfile文件分别复制到其他机器的
/usr/local/mongodb-4.4.14/bin目录下,并且授权。
- 开启集群
先启动主节点,在启动从节点;切换到MongoDB的bin目录,执行开启命令:
./mongod -f ../conf/mongo.conf- MongoDB复制集群对外的连接地址
mongodb://数据库用户名:数据库用户密码@主数据库ip:端口,从数据库ip1:端口,从主数据库ip2:端口/业务数据库?replicaSet=rs0&authSource=业务数据库&readPerference=secondarypreferred
复制集的读写设置
- Read Preference
默认情况下,复制集的所有读请求都发到Primary,Driver可通过设置Read Preference来将读请求路由到其他的节点。
1.primary:默认规则,所有读请求发到Primary。
2.primaryPreferred:Primary优先,如果Primary不可达,请求Secondary。
3.secondary:所有的读请求都发到Secondary。
4.secondaryPreferred:Secondary优先,当所有Secondary不可达时,请求Primary。
5.nearest:读请求发送到最近的可达节点上(通过ping探测得出最近的节点)。
- Write Concern
默认情况下,Primary完成写操作即返回,Driver可通过配置Write Concern来设置写成功的规则,详情请参见Write Concern。如下的write concern规则设置写必须在大多数节点上成功,超时时间为5秒。
#设置方式是针对单个请求
db.products.insert(
{ item: "envelopes", qty : 100, type: "Clasp" },
{ writeConcern: { w: majority, wtimeout: 5000 } }
)
#修改副本集默认的write concern,这样就不用单独设置每个请求
cfg = rs.conf()
cfg.settings = {}
cfg.settings.getLastErrorDefaults = { w: "majority", wtimeout: 5000 }
rs.reconfig(cfg)
-------------------MongoDB 高可用集搭 -复制集搭建完成------------------
相关推荐
- oracle数据导入导出_oracle数据导入导出工具
-
关于oracle的数据导入导出,这个功能的使用场景,一般是换服务环境,把原先的oracle数据导入到另外一台oracle数据库,或者导出备份使用。只不过oracle的导入导出命令不好记忆,稍稍有点复杂...
- 继续学习Python中的while true/break语句
-
上次讲到if语句的用法,大家在微信公众号问了小编很多问题,那么小编在这几种解决一下,1.else和elif是子模块,不能单独使用2.一个if语句中可以包括很多个elif语句,但结尾只能有一个...
- python continue和break的区别_python中break语句和continue语句的区别
-
python中循环语句经常会使用continue和break,那么这2者的区别是?continue是跳出本次循环,进行下一次循环;break是跳出整个循环;例如:...
- 简单学Python——关键字6——break和continue
-
Python退出循环,有break语句和continue语句两种实现方式。break语句和continue语句的区别:break语句作用是终止循环。continue语句作用是跳出本轮循环,继续下一次循...
- 2-1,0基础学Python之 break退出循环、 continue继续循环 多重循
-
用for循环或者while循环时,如果要在循环体内直接退出循环,可以使用break语句。比如计算1至100的整数和,我们用while来实现:sum=0x=1whileTrue...
- Python 中 break 和 continue 傻傻分不清
-
大家好啊,我是大田。...
- python中的流程控制语句:continue、break 和 return使用方法
-
Python中,continue、break和return是控制流程的关键语句,用于在循环或函数中提前退出或跳过某些操作。它们的用途和区别如下:1.continue(跳过当前循环的剩余部分,进...
- L017:continue和break - 教程文案
-
continue和break在Python中,continue和break是用于控制循环(如for和while)执行流程的关键字,它们的作用如下:1.continue:跳过当前迭代,...
- 作为前端开发者,你都经历过怎样的面试?
-
已经裸辞1个月了,最近开始投简历找工作,遇到各种各样的面试,今天分享一下。其实在职的时候也做过面试官,面试官时,感觉自己问的问题很难区分候选人的能力,最好的办法就是看看候选人的github上的代码仓库...
- 面试被问 const 是否不可变?这样回答才显功底
-
作为前端开发者,我在学习ES6特性时,总被const的"善变"搞得一头雾水——为什么用const声明的数组还能push元素?为什么基本类型赋值就会报错?直到翻遍MDN文档、对着内存图反...
- 2023金九银十必看前端面试题!2w字精品!
-
导文2023金九银十必看前端面试题!金九银十黄金期来了想要跳槽的小伙伴快来看啊CSS1.请解释CSS的盒模型是什么,并描述其组成部分。...
- 前端面试总结_前端面试题整理
-
记得当时大二的时候,看到实验室的学长学姐忙于各种春招,有些收获了大厂offer,有些还在苦苦面试,其实那时候的心里还蛮忐忑的,不知道自己大三的时候会是什么样的一个水平,所以从19年的寒假放完,大二下学...
- 由浅入深,66条JavaScript面试知识点(七)
-
作者:JakeZhang转发链接:https://juejin.im/post/5ef8377f6fb9a07e693a6061目录...
- 2024前端面试真题之—VUE篇_前端面试题vue2020及答案
-
添加图片注释,不超过140字(可选)...
- 今年最常见的前端面试题,你会做几道?
-
在面试或招聘前端开发人员时,期望、现实和需求之间总是存在着巨大差距。面试其实是一个交流想法的地方,挑战人们的思考方式,并客观地分析给定的问题。可以通过面试了解人们如何做出决策,了解一个人对技术和解决问...
- 一周热门
- 最近发表
-
- oracle数据导入导出_oracle数据导入导出工具
- 继续学习Python中的while true/break语句
- python continue和break的区别_python中break语句和continue语句的区别
- 简单学Python——关键字6——break和continue
- 2-1,0基础学Python之 break退出循环、 continue继续循环 多重循
- Python 中 break 和 continue 傻傻分不清
- python中的流程控制语句:continue、break 和 return使用方法
- L017:continue和break - 教程文案
- 作为前端开发者,你都经历过怎样的面试?
- 面试被问 const 是否不可变?这样回答才显功底
- 标签列表
-
- git pull (33)
- git fetch (35)
- mysql insert (35)
- mysql distinct (37)
- concat_ws (36)
- java continue (36)
- jenkins官网 (37)
- mysql 子查询 (37)
- python元组 (33)
- mybatis 分页 (35)
- vba split (37)
- redis watch (34)
- python list sort (37)
- nvarchar2 (34)
- mysql not null (36)
- hmset (35)
- python telnet (35)
- python readlines() 方法 (36)
- munmap (35)
- docker network create (35)
- redis 集合 (37)
- python sftp (37)
- setpriority (34)
- c语言 switch (34)
- git commit (34)
