zoukankan      html  css  js  c++  java
  • mongoDB oplog的说明及应用

    mongoDB oplog 说明

    ts:8字节的时间戳,由4字节unix timestamp + 4字节自增计数表示。这个值很重要,在选举(如master宕机时)新primary时,会选择ts最大的那个secondary作为新primary。
    op:1字节的操作类型,例如i表示insert,d表示delete。
    ns:操作所在的namespace。
    o:操作所对应的document,即当前操作的内容(比如更新操作时要更新的的字段和值)
    o2: 在执行更新操作时的where条件,仅限于update时才有该属性

    "i": insert
    "u": update
    "d": delete
    "c": db cmd
    "db":声明当前数据库 (其中ns 被设置成为=>数据库名称+ '.')
    "n":  no op,即空操作,其会定期执行以确保时效性

    节选自:http://www.cnblogs.com/daizhj/archive/2011/06/27/mongodb_sourcecode_oplog.html

    在实践的时候还得注意一个点:mongoDB的副本集(replSet)

    当使用复制集(Replica sets)模式时,其会使用下面的local数据库:

    local.system.replset 用于复制集配置对象存储 (通过shell下的rs.conf()或直接查询)
    local.oplog.rs       一个capped collection集合.可在命令行下使用--oplogSize 选项设置该集合大小尺寸.
    local.replset.minvalid  通常在复制集内使用,用于跟踪同步状态(sync status)


    mongoDB oplog 的应用

    如果需要及时获取mongoDB的增量信息,就可以应用oplog了!

    常用的场景模式:索引更新,主动更新缓存等。

    通常一个服务监控oplog,将“增量信息”经过一定的处理后塞到ActiveMQ中,相关的应用程序再从ActiveMQ中获取消息进行消费。

     

    概要的实例代码:

    public static void main(String[] args) throws UnknownHostException {
    	Mongo mongo = new Mongo("199.155.122.226", 11112);
    	DB db = mongo.getDB("local");
    	DBCollection collection = db.getCollection("oplog.rs");
    	if (collection != null) {
    		BSONTimestamp ts = new BSONTimestamp(1, 1);
    		final BasicDBObject query = new BasicDBObject();
    		query.append("ts", new BasicDBObject(QueryOperators.GT, ts));
    		DBCursor cursor = collection.find(query).sort(
    				new BasicDBObject("$natural", 1));
    		while (cursor != null && cursor.hasNext()) {
    			DBObject obj = cursor.next();
    			System.out.println(obj.toString());
    		}
    	}
    }
    

      

    注意点:

    1)如果当前服务断掉了,要有个断点机制,下次可以接着来。这个主要是对ts字段进行控制。

    因此需要实时记录读到了什么位置。

    2)如果应用端是异构的,采用一种跨语言的协议,例如ProtoBuf。

    3)消息中间件(ActiveMQ)起到解耦、缓冲的作用。

  • 相关阅读:
    MySQL 中 truncate 和 delete 的坑
    理解 Linux 中的 inodes
    Linux 下date命令的常见用法
    Linux 下du命令详解
    nc
    启动Tomcat时报错:错误: 代理抛出异常错误: java.rmi.server.ExportException: Port already in use: 1101; nested exception is: java.net.BindException: Address already in use: JVM_Bind
    ssm调用webservice接口并进行文件传输
    mybatis 中 执行INSERT操作后获取自增主键
    mysql时间差8小时
    生成验证码工具类
  • 原文地址:https://www.cnblogs.com/huangfox/p/3484497.html
Copyright © 2011-2022 走看看