今天和团队分享了MongoDB的实战,继续聊聊MongoDB副本集的配置和部署。什么是副本集?副本集是MongoDB的复制系统,用于将数据同步到各个服务器。单节点在测试环境还好,线上生产环境就不适合了,因为如果单节点出现故障,会导致应用宕机。所以这个时候,我们可以利用MongoDB的复制功能,进行多节点部署。其中一台服务器节点宕机,其他节点运行,进行故障转移,这样应用不会受到影响,从而更加高可用。在故障转移方面,MongoDB最初支持一种称为“主从”的模式。在这种模式下,MongoDB不会做自动故障转移。这种模式已经不推荐了,这里就不介绍了。由于在副本集中添加或删除节点非常方便,所以即使一开始是单节点,也建议大家从副本集开始,方便后续添加节点。成员介绍副本集成员这里主要介绍仲裁者和延迟备份节点。说到仲裁者,需要说一下,在复制集的成员中选举主节点的过程有一个“多数”原则,即n/2+1。仲裁者的作用是“参加选举”而不保存数据。解决的办法是一开始我们的应用量小的时候,没有资源,不想保存三份或者三份以上的数据。rs.add({"_id":3,"host":"server-3:27017","arbiterOnly":true})这里注意:最多只能使用一个仲裁器奇数节点不需要仲裁器使用奇数尽可能说完仲裁者,再来说说“延迟备份节点”。我们公司的运维师傅在跟团队分享的时候特别强调了这一点,有一段血泪史。延迟备份节点的主要作用是防止有人不小心删除了主数据库,或者应用程序中的严重错误导致所有数据被破坏。为避免此类问题,请设置延迟备份节点。强烈建议在线配置,有血泪史。rs.add({_id:4,host:"server-4:27020",priority:0,hidden:true,slaveDelay:7200,votes:0,buildIndexes:true,arbiterOnly:false})其实这也是备份方式之一是保证计划。副本集初始化副本集成员启动后,我将这里的配置放在***段。这里直接说说副本集启动后的初始化操作。会员初始化操作主要有四个步骤:会员在local.me上创建自己的标识符,删除本地已有数据,进行数据同步。将同步源的所有记录数据克隆到本地。这一步是最耗时的。***oplog同步时记录的操作。创建索引并同步索引创建过程中的所有操作。通过以上4步,副本集初始化完成。副本集备份备份方式简单总结有以下四种:1、文件系统快照:文件系统快照需要文件系统本身的支持,mongod启用了日志系统。后面会讲到配置。2.复制数据目录:复制数据目录下的所有文件。在备份过程中,我们需要防止数据文件发生变化,否则将无法使用。为保证数据不变,可以通过db.fsyncLock()锁定所有数据库,后续操作运行后会加入队列。cp-R/data/db/*/backup/db.fsyncUnlock()#解锁数据库允许再次写操作3.mongodump:备份恢复速度慢,不推荐4.延迟备份节点:原则上是不算作备份策略。但更重要的是用它来延缓和防止数据误操作。副本集部署***最后说到副本集配置,这里我们配置mongod.conf配置,replaSetName设置为test_rs的名字,配置如下:storage:dbPath:/test/mongodb/rs1#配置路径journal:enabled:true#打开日志系统systemLog:destination:filelogAppend:truepath:/test/log/mongodb/rs1.log#logprocessManagement:pidFilePath:/var/run/mongodb/rs1.pidnet:port:27018bindIp:1.2.3.4#bindingfixedIPreplication:replSetName:"test_rs"#选择的配置名称security:authorization:enabledkeyFile:/test/mongodb/key/test_rs.key除了上面的配置,我们还可以配置init的启动脚本。d、可以去github上搜索一下,有很多启动脚本是通过sudoservicemongodb.rs1start开始处理的,通过多节点启动和加入副本集。由于mongo默认是没有密码的,对于数据库的配置,除了配置账号密码外,如果我们在腾讯云或者阿里云的服务器上,还需要配置一个安全组,只允许访问几台机器内网的固定IP和固定端口。配置优化除了启动MongoDB配置外,我们还需要对服务器进行一些配置调整,主要如下:禁止过度分配内存:overcommit_memory=2禁用大内存页HugePage:修改文件描述符>20000or***limit关闭周期性任务,如软件包自动更新,消耗CPU和内存资源,导致服务异常抖动(类似Redis异步任务hgetall)其中vercommit_memory设置为1满足所有内存分配请求(redis部署),并且设置2分配虚拟空间不超过swap和超分配总和的一小部分,设置为0让内核猜测超分配大小。禁止大内存:如果不能全部存入内存,不管内存容量多大,都可以使用大内存。从KB到MB。至此,我们的服务部署就结束了。由于个人经验所限,难免会有一些疏漏甚至错误。请留言指出,万分感谢。
