当前位置: 首页 > news >正文

ttlsa教程系列之mongodb——(五)mongodb架构-复制原理复制集

为什么80%的码农都做不了架构师?>>>   hot3.png

mongodb集群:复制,复制集和分片。 强烈建议在生产环境中使用mongodb的复制功能。复制具有故障切换,读扩展,热备份和离线批处理操作。 默认情况下,主节点负责客户端所有的读写请求,从节点不可读不可写。 一. 工作原理 1. mongodb的复制至少需要两个实例。其中一个是主节点,负责处理客户端请求,其余的都是从节点,负责复制主节点上的数据。主节点记录在其上的所有操作oplog,从节点定期轮询主节点获取这些操作,然后对自己的数据副本执行这些操作,从而保证从节点的数据与主节点一致。 2. 主节点的操作记录称为oplog(operation log),存储在local数据库中(local数据库不会被复制,用来存放复制状态信息的)。oplog中的每个文档代表着主节点上执行的操作。oplog只作为从节点与主节点保持数据同步的机制。 3. oplog.rs是一个固定长度的capped collection。默认情况下,64位的实例将使用oplog 5%的可用空间,这个空间将在local数据库中分配,并在服务器启动时预先分配。 4. 如果从节点落后主节点很远了,oplog日志从节点还没执行完,oplog可能已经轮滚一圈了,那么从节点将会追赶不上主节点了,复制将会停止。从节点需要重新做完整的同步,可以用{resync:1}命令来手动执行重新同步或在启动从节点时指定--autoresync选项让其自动重新同步。重新同步的代价昂贵,应尽量避免,避免的方法就是配置足够大的oplog。 查看oplog信息:
> db.oplog.rs.stats()
{
        "ns" : "local.oplog.rs",
        "count" : 7276573,
        "size" : 1980730564,
        "avgObjSize" : 272.20651314842854,
        "storageSize" : 2097156096,
        "numExtents" : 1,
        "nindexes" : 0,
        "lastExtentSize" : 2097156096,
        "paddingFactor" : 1,
        "systemFlags" : 0,
        "userFlags" : 0,
        "totalIndexSize" : 0,
        "indexSizes" : {

        },
        "capped" : true,
        "max" : 2147483647,
        "ok" : 1
}
查看oplog.rs内容:
> db.oplog.rs.find().limit(1).toArray()
[
        {
                "ts" : Timestamp(1357529944000, 1),
                "h" : NumberLong("-3237467944396345731"),
                "v" : 2,
                "op" : "i",
                "ns" : "ttlsa_event.ttlsa_events",
                "o" : {
                        "_id" : ObjectId("50ea43599ca66a2d7e000000"),
                        "aid" : 110000,
                        "kid" : 10007,
                        "tag" : "Mobile",
                        "uid" : 368514901,
                        "stmp" : 1357529945,
                        "born" : 1357529945,
                        "total" : 1,
                        "val" : [
                                {
                                        "nickname" : "m44332148",
                                        "productid" : 109350,
                                        "product" : "三国时代OL",
                                        "stmp" : 1357529945
                                }
                        ]
                }
        }
]
字段说明: ts:操作的时间戳,用于跟踪操作执行的时间。 op:操作类型,i代表插入,u代表更新,d代表delete ns:执行操作的集合名 o: 文档内容 二. 复制 mongodb支持传统的master-slave架构。没有自动故障转移功能,需要指定master和slave端。强烈推荐使用复制集架构,复制集架构比复制架构更好维护,功能更强。 master-slave架构一般使用于下面两种情况: 1. slave超过11个 2. 需要复制单一的数据库 master-salve架构配置: // master server启动master,只需指定master参数
# mongod --master
// slave server启动slave,需要指定slave参数和master的IP和端口
# mongod --slave --source master_server:27017
主从复制的选项有: 1. --only 在slave节点上指定只复制的数据库 2. --slavedelay 指定slave节点延时多少秒同步master 3. --fastsync 以master节点的数据快照为基础启动slave节点 4. --autoresync 如果slave节点不同步了,则主动重新同步 5. --oplogSize master节点oplog大小 三. 复制集 复制集最少需要三台服务器或两台服务器+仲裁一台。 复制集的配置参见:http://www.ttlsa.com/html/1093.html 查看master 的oplog元数据信息:
> db.printReplicationInfo()
configured oplog size: 2000MB
log length start to end: 16685504secs (4634.86hrs)
oplog first event time: Mon Jan 07 2013 11:42:50 GMT+0800 (CST)
oplog last event time: Fri Jul 19 2013 14:34:34 GMT+0800 (CST)
now: Fri Jul 19 2013 14:34:38 GMT+0800 (CST)
字段说明: configured oplog size: oplog文件大小 log length start to end: oplog日志的启用时间段 oplog first event time: 第一个事务日志的产生时间 oplog last event time: 最后一个事务日志的产生时间 now: 现在的时间 查看slave的同步状态:
> db.printSlaveReplicationInfo()
source:   10.1.11.157:27017
         no replication info, yet.  State: ARBITER
source:   10.1.11.156:27017
         syncedTo: Fri Jul 19 2013 14:34:42 GMT+0800 (CST)
                 = 2 secs ago (0hrs)
字段说明: source:从库的IP以及端口 syncedTo:当前的同步情况 增加节点:
ttlsa:PRIMARY> rs.add("10.1.11.111:27017")
减少节点:
ttlsa:PRIMARY> rs.remove("10.1.11.111:27017")
允许从库读操作:
ttlsa:SECONDARY> db.getMongo().setSlaveOK()
手动转移primary:
ttlsa:SECONDARY> rs.freeze([secs]) //make a node ineligible to become primary for the time specified 
ttlsa:PRIMARY> rs.stepDown([secs]) //step down as primary (momentarily) (disconnects)
复制集状态: 1. STARTUP:刚加入到复制集中,配置还未加载 2. STARTUP2:配置已加载完,初始化状态 3. RECOVERING:正在恢复,不适用读 4. ARBITER: 仲裁者 5. DOWN:节点不可到达 6. UNKNOWN:未获取其他节点状态而不知是什么状态,一般发生在只有两个成员的架构,脑裂 7. REMOVED:移除复制集 8. ROLLBACK:数据回滚,在回滚结束时,转移到RECOVERING或SECONDARY状态 9. FATAL:出错。查看日志grep "replSet FATAL"找出错原因,重新做同步 10. PRIMARY:主节点 11. SECONDARY:备份节点 四. 复制认证 如果启用了认证,需要在主节点和从节点上的local数据库下,建个相同的用户名和密码的用户,可读写。 从节点连接主节点时,会用存储在local.system.users中的用户进行认证,最先尝试用repl用户,若没有,则用local.system.users中的第一个可用用户。
> use local
> db.addUser("repl","password")
五. 分片 分片下一节说。 转载请注明出处: http://www.ttlsa.com/html/1679.html

转载于:https://my.oschina.net/766/blog/210943

相关文章:

  • Eclipse中java获得mysql的查询结果集
  • 成熟的软件组件都是老板用大把、大把的钱堆出来烧出来的,以最简单的数据库访问组件为例...
  • Cookie 在前端中的实践
  • 事务(Transaction)
  • Android之ubuntu源码开发环境搭建笔记
  • [转]Nodejs基础中间件Connect
  • mybatis 中的where标签
  • 高并发量网站解决方案
  • WinPcap的开发与应用:获取设备列表
  • 什么是JSON ?
  • Java-优秀博客推荐
  • ConfigFileApplicationListener
  • iOS网络监测区分2、3、4G
  • 剑指offer---3、按之字形顺序打印二叉树
  • 艾森尼克:提供高品质大通量RO膜,树立滤芯行业新标杆!
  • 07.Android之多媒体问题
  • android图片蒙层
  • js操作时间(持续更新)
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • Redis中的lru算法实现
  • 阿里云Kubernetes容器服务上体验Knative
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 技术胖1-4季视频复习— (看视频笔记)
  • 将回调地狱按在地上摩擦的Promise
  • 每天一个设计模式之命令模式
  • 如何实现 font-size 的响应式
  • 首页查询功能的一次实现过程
  • 小程序01:wepy框架整合iview webapp UI
  • PostgreSQL之连接数修改
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • ​Python 3 新特性:类型注解
  • ​RecSys 2022 | 面向人岗匹配的双向选择偏好建模
  • $.ajax,axios,fetch三种ajax请求的区别
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (五)Python 垃圾回收机制
  • (转)c++ std::pair 与 std::make
  • .[hudsonL@cock.li].mkp勒索病毒数据怎么处理|数据解密恢复
  • .naturalWidth 和naturalHeight属性,
  • .net core webapi Startup 注入ConfigurePrimaryHttpMessageHandler
  • .Net Core/.Net6/.Net8 ,启动配置/Program.cs 配置
  • .NET Core/Framework 创建委托以大幅度提高反射调用的性能
  • .net php 通信,flash与asp/php/asp.net通信的方法
  • .NET Standard 支持的 .NET Framework 和 .NET Core
  • .NET8.0 AOT 经验分享 FreeSql/FreeRedis/FreeScheduler 均已通过测试
  • .net流程开发平台的一些难点(1)
  • /usr/lib/mysql/plugin权限_给数据库增加密码策略遇到的权限问题
  • @hook扩展分析
  • []使用 Tortoise SVN 创建 Externals 外部引用目录
  • [2021 蓝帽杯] One Pointer PHP
  • [8481302]博弈论 斯坦福game theory stanford week 1
  • [Android] Android ActivityManager
  • [android学习笔记]学习jni编程
  • [AutoSAR系列] 1.3 AutoSar 架构
  • [C++]priority_queue的介绍及模拟实现