博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
思考线上如何既保证不影响查询,又能做更新操作
阅读量:6900 次
发布时间:2019-06-27

本文共 917 字,大约阅读时间需要 3 分钟。

目前遇到的情况有:

 

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

转载于:https://www.cnblogs.com/wangtao_20/p/4066198.html

你可能感兴趣的文章
USACO题目——Transformations
查看>>
除了 UCAN 发布的鹿班和普惠体,这些设计工具也来自阿里
查看>>
转载----Python正则表达式指南
查看>>
.Net使用system.Security.Cryptography.RNGCryptoServiceProvider类与System.Random类生成随机数
查看>>
HDU 1394 Minimum Inversion Number 线段树
查看>>
Java 集合系列04之 fail-fast总结(通过ArrayList来说明fail-fast的原理、解决办法)
查看>>
ssm框架整合
查看>>
C/C++里自带提供的整数进制转换的几种方式(转载)
查看>>
JAVA类加载顺序
查看>>
数据结构复习
查看>>
JSONPlaceholder - 免费的在线REST服务(提供测试用的HTTP请求假数据)
查看>>
今天购买了一个云服务器
查看>>
C#以管理员身份运行程序
查看>>
关于学习uCOS-II
查看>>
BZOJ3572:[HNOI2014]世界树——题解
查看>>
inline 函数
查看>>
[摘录]遇见未知的自己(二)
查看>>
python基础===修改idle的输入风格
查看>>
对Linux下TCP连接相关配置的优化记录(转载)
查看>>
微信里如何判断页面被分享成功
查看>>