zoukankan      html  css  js  c++  java
  • 思考线上如何既保证不影响查询,又能做更新操作

    目前遇到的情况有:

    一、数据库进行在线ddl(修改表结构和字段)

    也是使用重名表名的方式。复制一张表,包括里面的数据,假设名称为tmp。在这张tmp表上面执行dll语句操作。此时要记录某个时刻开始对数据库的更新操作sql,缓存起来。

    执行dll操作完毕。就把之前缓存起的sql放到这个tmp表中执行一遍。

    二、sphinx重建索引。此时要不能关掉shpinx,要保证能够进行正常的查询服务

    使用的是重名名的方式。把最新的索引结果保存在一个.new这样的文件中。原来的所以文件假设是master,那么现在要把这个master用.new来替换掉,因为索引更新了。

    怎么保证,替换操作进行的同时,不影响客户端查询sphinx索引呢。不可能关掉sphinx服务吧。

    发送发送SIGHUP 给searchd,等待所以子进程退出,退出后才执行下面的步骤

    master>重命名为>old

    把new文件重命名为master,以便提供给正在使用的sphinx查询使用。

    然后让sphinx进程加载替换后的所以文件。如果加载成功。就正常。加载失败,则回滚:

    searchd会把.old文件回滚为当前文件,并把刚建立的新索引重命名为 .new

    三、redis主从同步数据时候,主服务器此时有更新操作。怎么办。

    现在看到redis针对这种情况的处理是:先把更新的命令缓存起来。然后把这些命令同步到从服务器去执行。

    具体是:同步的时候,先把当前内存数据库的数据做一个快照保存在磁盘上,目的是把这个文件中的数据发给从服务器。从服务器然后载入到内存中。在这个同步文件的过程中。

    主要服务器仍然能够接受客户端的查询操作和更新(写入)操作。执行更新操作,会额外把把这些更新命令缓存起来。等到数据库快照同步完毕后,就会把这些命令发给从服务器去执行。

    相当于主服务器执行哪些更新操作,从服务器把这些更新操作在那边也执行一遍。当然是在之前数据库快照的基础上去执行更新操作才会正确。

    最终结果是,从服务器就是主服务器的redis数据的一个快照。然后把命令重新执行一遍。

  • 相关阅读:
    数据库范式
    SQL基础
    JAVA流
    response.getWriter()和jsp中的out对象的区别
    JAVA排序(冒泡,直接选择,反转)
    Collections类常用方法
    JAVA集合
    JAVA面向对象(重载,重写 常用的 toString/equals)
    Java面向对象一(封装 继承 多态 类 对象 方法)
    JAVA基础
  • 原文地址:https://www.cnblogs.com/wangtao_20/p/4066198.html
Copyright © 2011-2022 走看看