思考线上如何既保证不影响查询,又能做更新操作

目前遇到的情况有:

 

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

posted @ 2014-11-02 15:52  王滔  阅读(720)  评论(0编辑  收藏  举报