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数据的一个快照。然后把命令重新执行一遍。

  • 相关阅读:
    Java基础知识(一)环境变量的设置、变量与常量、自动类型转换、自增长、赋值运算符
    ModelState
    DOM
    正则表达式常见形式
    通过JS设置一个元素的文本
    JS(三) 原型对象与原型链
    JS(二)call方法和apply方法
    第四周学习进度表
    敏捷开发方法综述
    数组02
  • 原文地址:https://www.cnblogs.com/wangtao_20/p/4066198.html
Copyright © 2011-2022 走看看