理性选择key-value Store

2023-11-09

前言

开源产品固然好,但是各种场景的数据需求确实多少有些差距,利用现有的软硬件资源面对现有的问题快速做出调整是才是数据库工程师的真正价值。

综述

key-value store由于本身实现不像成熟RDBMS那么复杂,换句话说开发周期不常,性能更是由于去掉了ACID的约束,从一个个benchmark上看对比起主流开源关系型数据库mysql innodb的曲线都非常好看,op/s号称高一个数量级的不是没有,request latency更是有redis类似的内存性数据库,在高并发的场景下99.95%响应在1ms以下一点也不惊奇。其实对于了解oltp数据系统的同学来说,这其实一点也不神奇。

需求

使用key value store的需求:

业务篇

  1. 提高DB端的响应延迟。因为我本身也有计算、多个api调用提交(整体响应时间以最慢api时间为准:-) )、网络等开销(这个尤其适用于有专有技术平台的公司场景),因为及时我有其他复杂逻辑托我后腿了,我也不想因DB的响应延迟拖后腿,因为这个我们不可控。
  2. Memcache只是缓存
    典型的应用场景:

    function query_memcache($sql,$type=”){

    $key = md5($key);

    if(!($value = $_SGLOBAL['memcache']->get($key))){ //Cache中没有,则从My SQL中查询

    $query = $this->query($key,$type);

    while($item = $this->fetch_array($query)){

    $result[] = $item;

    }

    $value = $result;

    //将Key和Value写入MemCache

    $_SGLOBAL['memcache']->set($key,$result,0,$MEMCACHE_LIFETIME);

    }

    return $value;

    }

    先去mc查询,没有就查db,查上来顺手种下mc
    但是Memcache只能作为缓存,缓存顾名思义,需要预热、程序逻辑种植,不能持久化存储。
    系统因为各种原因的mc穿透导致db无响应导致百页的情况,应该最为常见。
  3. 如果可能请不要Sharding    了解类Mysql DB的同学知道,replication很可能成为DB资源瓶颈,所以我们业务在评估资源的时候发现要面对一堆数据库配置和五花八门的Hash函数,所以我们感叹:你们后端的同学能不能给点力,不让我开发周期一拖再拖。更不能接受的就是因为db要resharding,我们还要花大量时间改造代码。
  4. 多数nosql产品对开发友好    面向文档的(mongoDB),直接存储json(Couchbase),多种内存结构hashset,list…(redis) …等等
  5. 尝试下新技术    nosql听上去很霸气

系统运维篇

  1. TCO的降低    能替代mc+mysql,按照kv的性能测试来看,确实能节省整体TCO
  2. 减少部分运维工作    能省去了部分因为性能不足导致的扩容
  3. 安全性及可用性    kvDB的大多数都是支持持久化数据的。可用性就是指同步数据的方式,最常见就是replication。效率和可靠性都是需要考量的。
  4. 我要尝试下新技术    nosql听上去很霸气
总结:
可见开发和运维人员对与数据库系统是不一样的,短期和中长期的效益都很重要。

选择

KVDB产品非常多,很难对他们所有都很了解,故这里引用篇对比:  http://asyty.iteye.com/blog/1202106 

表一 主流NOSQL简单对比

参考:http://kkovacs.eu/cassandra-vs-mongodb-vs-couchdb-vs-redis

  Cassandra Mongodb CouchDB Redis Riak HBase
开发语言 JAVA C++ Erlang C / C++ Erlang/ C / JAVASCRIPT JAVA
特点

分布式与复制的权衡

根据列和键范围进行查询

BigTable类似的功能:列,列族

写比读快很多

主从复制

查询利用javascript表达式

比CouchDB更容易就地升级

内置Sharding

数据存储使用的是内存映射文件

数据库崩溃后需要对表进行修复

持久性更好

双向复制

主主复制(master-master replication)

冲突检测

多版本并发控制,写操作不会阻塞读取

通用的技术文档

只崩溃设计Crash-only

需要经常压缩

视图:嵌入式map/reduce

格式化视图:lists & shows

服务器端文档验证可行

身份验证可行

通过_changes实时更新

附件处理

内存数据库

主从复制

简单的Key-Value

操作符较为复杂,如

ZREVRANGEBYS

CORE INCR & co

(有利于速率限制和统计)

有集合

(union/diff/inter)

有列表

(a queue; blocking pop)

有散列(多字段对象)

NoSQL中唯一处理交易的数据库

分布式与复制的权衡post-commit 和pre-commit hooks

安全性验证

内置的全文检索

Javascript或

Erlang Map/reduce

分布式与复制的权衡

模仿BigTable

Map/reduce Hadoop

利用服务器端扫描进行查询预测叠加并获取过滤

优化的实时查询

高性能Thrift网关

HTTP支持XML、Protobuf和二进制

Cascading、hive、

pig source和sink模块

基于Jruby的shell

无单点故障

类似MySQL的随机访问性能

证书 Apache Apache Apache BSD Apache Apache
协议 自定义/Thrift 自定义/BSON HTTP/REST Telnet-Like HTTP/REST

HTTP/REST/Thrift

最佳适用 基于JAVA,写操作较多,读少 动态的查询,定义索引而非map/reduce。数据变化快,磁盘不够用,可以使用MongoDB 有大量数据,但更新不大,需要预先定义查询 数据快速变化,数据库大小可以预见(适合内存存取数据)

简单的类似Cassandra

或Dynamo的功能,较强的单点容错性和扩展性

随机数据、实时读取海量数据
应用场景 银行,金融行业。数据分析

MySQL或

PostgreSQL

的替代品

CRM、CMS系统 股价系统,数据分析,实时数据采集以及实时通信场景 销售点数据采集。工厂控制系统。需要零停机时间的场景

喜欢bigTable,需要随即、实时的读写大数据(Big Data)

当然这个对比有很多问题,很多产品是解决不是同一个问题,故不应该列在里面,更奇怪的是没有把mysql列入里面,mysql(注意这里不是指handlersocket plugin)能做很多nosql做不了的事情,用作nosql DB同样的功能更为容易,为什么不拿出来对比下。

测试

之前围绕着Mysql,Redis,LevelDB,Hbase做过一些不同目的的性能测试,也算对这些产品的性能有了大概了解,未来需要对性能数据完善一下!

Mysql 内存访问性能测试

 原文发布时间为:2013-10-11

本文来自云栖社区合作伙伴“Linux中国”

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

理性选择key-value Store 的相关文章

  • 有没有办法在javascript中代理(拦截)一个类的所有方法?

    我希望能够在类本身的构造函数内代理类的所有方法 class Boy constructor proxy logic do something before each call of all methods inside class like
  • Brunch 源映射:在 Chrome 开发工具中未命中断点

    我正在使用 Brunch 中内置的默认源映射 我看到文件很好 但无法在源映射文件中命中断点 使用 Javascript 访问调试器debugger 有效 这让我相信早午餐方面出了问题 这是我的 brunch config js module
  • 在 React 组件中等待异步函数并显示 Spinner

    初学者在这里 尝试从服务器获取一些数据并在获取后将其显示在我的反应组件中 但是 我在将异步函数集成到我的反应组件中时遇到了麻烦 import React useState from react import request from gra
  • 网络上的等角柱状图

    我计划为游戏的标记 图钉 构建在线地图 但我无法设置标记的正确纬度 原始地图是一个2048 2048px 的正方形 然后我得到了标记 数千个 地图坐标使用 0 到 100 之间的 x y 表示法设置 0 0 是top left角和100 1
  • querySelector 搜索直接子级[重复]

    这个问题在这里已经有答案了 我有一些类似 jquery 的函数 function elem return gt someselector elem 问题是我怎样才能做同样的事情querySelector 问题是 gt 选择器中querySe
  • 玉石压痕错误

    因此 对于我的 Express 网站 我使用 jade 所以我决定尝试修改我的布局文件 以便我可以开始设计我的网站 我修改了原始布局代码 有效 但我开始在任何扩展布局的文件中出现缩进错误 如下所示 500 Error home kevin
  • 如何正确地将节点从引用传递到上下文?

    我正在尝试将节点从引用传递到上下文 但是因为我在第一次渲染后没有重新渲染 所以传递的节 点是null 我考虑了两种变体 但我认为它们不是最好的 To pass ref代替ref current 但在用例中 我将被迫使用类似的东西contex
  • 无需重定向的 HTML 页面提交

    有没有什么方法可以在不使用ajax的情况下提交html表单而无需从当前页面重定向 你可以设置一个target 为您form 这样您就可以将表单提交到新选项卡 target blank 或一个小的 隐藏的iframe target nameo
  • 指定 HTML5 输入类型 = 日期的值输出?

    我想将本机日期选择器添加到我的应用程序中 该应用程序当前使用遗留的本地系统 日期输入支持尚未广泛普及 但如果我可以基于兼容性提供这两种实现 那就太理想了 有没有办法指定 HTML 日期选择器给出的值的输出 歌剧的默认设置是yyyy mm d
  • 为什么这个递归函数返回未定义?

    我正在尝试编写一个使用递归组合两个字符串的函数 我的代码如下 但我不知道为什么该函数返回未定义 特别是当我在基本情况下使用 console log 时 它不会打印未定义而是打印正确的值 var str3 function merge str
  • NodeJS - 将相对路径转换为绝对路径

    In my 文件系统我的工作目录在这里 C temp a b c d 在 b bb 下有文件 tmp txt C temp a b bb tmp txt 如果我想从工作目录转到该文件 我将使用以下路径 bb tmp txt 如果该文件不存在
  • 如何将React JS状态保存到本地存储中

    我不知道如何将 React js 状态存储到本地存储中 import React Component from react import App css import auth createUserProfileDocument from
  • 基于范围内变量的角度设置形式动作

    我一直在尝试设置一个搜索表单 可以在其中注入表单操作属性 在我的表格中我有
  • 为什么 TypeScript 混合了模块和原型模式?

    我正在查看此页面上 TypeScript 生成的 JS 代码 http www typescriptlang org Playground http www typescriptlang org Playground 基本上 要创建一个Gr
  • chrome 选项卡/窗口中的 window.open 行为

    我有一小段 javascript 旨在打开两个或更多选项卡 这在 FF 和 IE 中工作正常 但 chrome 会在新窗口而不是选项卡中打开第二个窗口 它不依赖于 url 因为我已经尝试过使用两个相同的 url 第一个在选项卡中打开 第二个
  • JavaScript setTimeout 和更改系统时间会导致问题

    我注意到如果我设置setTimeout未来1分钟 然后将我的系统时间更改为过去5分钟 setTimeout功能将在 6 分钟后触发 我这样做是因为我想看看夏令时系统时钟更改期间会发生什么 我的 JavaScript 网页使用setTimeo
  • eventSources 到事件 Json,完整日历

    我正在尝试从 eventSources 获取 json 调用到我的事件 我在 eventSources 中返回的 json 是 title Title Test start 1305841052 当我将此字符串传递到事件中时 它会正确显示日
  • 加载 Angular 库时,IE9 和 IE10 中出现 Angular JS“SCRIPT5007:预期对象”错误

    我正在开发一个 AngularJS 应用程序 该应用程序应在 Firefox IE 9 和 IE 10 上运行 我使用最新版本的 angularjs 库 现在是 1 3 15 服务器端是在JavaEE平台上用Java编写的 服务器运行在Gl
  • 测试 jQueryUI 是否已加载

    我正在尝试调试网站 并且我认为 jQueryUI 可能未正确加载 如何测试 jQueryUI 是否已加载 if jQuery ui UI loaded OR if typeof jQuery ui undefined UI loaded 应
  • jQuery appendTo(), json 在 IE 6,7,8 中不起作用

    我这两天绞尽脑汁想找到解决办法 我使用 jQuery ajax 从数据库中获取值 以便在另一个框发生更改时更新一个框 php 脚本从数据库中获取值 然后输出 json 它在 FF 中工作正常 但在所有版本的 IE 中 选择框都不会更新 我已

随机推荐

  • 广告投放算法:受众行为分析与人群定向

    引言 物以类聚 人以群分 这句古语不仅揭示了物与人的自组织趋向 更隐含了 聚类 和 人群 之间的内在联系 例如在现代数字广告投放系统中 最为关键的 人群定向 功能正是通过 聚类 算法得以实现的 如果您厌倦了隔靴搔痒的空大宣传 不妨就随笔者一
  • 微信支付服务端开发总结

    原文链接 http blog csdn net baple article details 68059283 前言 最近应公司业务需求 把微信支付完成了 当然已经顺利上线 但是开发的过程是也是踩了很多坑 下面我就先说说开发流程 以及在开发中
  • Kotlin泛型的型变之路

    一 JAVA泛型的协变 简而言之 协变就是 如果A是B的子类 那么Generic a 就是Generic 实际上就是List a
  • SMT精密电阻对照表

    SMT 精密电阻对照表 代码 阻值 代码 阻值 代码 阻值 代码 阻值 01 100 27 187 53 348 79 649 02 102 28 191 54 357 80 665
  • head first 设计模式:策略模式

    策略模式 定义了算法族 分别封装起来 让他们之间可以互相替换 此模式让算法的变化独立于使用算法的客户 差不多应该是不固定模块的分离 当涉及 维护 时 为了 复用 reuse 目的而使用继承 结局并不完美 设计原则 找出应用中可能需要变化之外
  • CMOS图像传感器——了解光圈

    在之前有提到传感器英寸 也提到了曝光三要素之一的ISO 这里主要说明另外一个曝光三要素 光圈 在本文中 我们将介绍光圈及其工作原理 一 什么是光圈 光圈可以定义为镜头中的开口 光线通过该开口进入相机 类比眼睛是的工作原理 就容易理解了 当人
  • Java定时任务调度工具详解之Timer篇(初级)Timer函数的综合应用

    一 通过模拟两个机器人的定时行为来加深对Timer相关函数的理解 实现两个机器人第一个机器人会隔两秒打印最近一次计划的时间 执行内容 第二个机器人会模拟往桶里倒水 知道桶里的水满为止 代码示例 DancingRobot类 package c
  • ImageMagick 安装教程

    1 双击打开 ImageMagick exe 2 先点 I acccept 再点四次 Next 切记不要修改安装路径 3 默认勾选前两个 点Next 4 点Install 安装即可 之后点Next Finish就安装完了
  • 2022年“网络安全”赛项浙江省宁波市选拔赛任务书

    2022浙江省宁波市 网络安全 项目比赛任务书 A模块基础设施设置 安全加固 200分 A 1 登录安全加固 windows linux A 2 数据库加固 Linux A 3服务加固 SSH VSFTPD Linux A 4防火墙策略 L
  • student1和student2 和teacher 类,多线程问题

    参照例15 7 编写一个Java应用程序 要求有student1 student2和teacher 3个线程 其中 student1准备睡10分钟后再开始上课 student2准备睡1小时后再开始上课 teacher在输出3句 上课 后吵醒
  • 聊聊区块链--如何投资数字货币

    想知道更多关于区块链技术知识 请百度 链客区块链技术问答社区 链客 有问必答 未经允许 拒绝转载 https www liankexing com note note page id 7071 html 1 比特币 bitcoin 比特币是
  • Unity Fixed Joint 固定关节组件详解

    Chinar blog www chinar xin Unity物理引擎 Fixed Joint 固定关节 本文提供全流程 中文翻译 Chinar 的初衷是将一种简单的生活方式带给世人 使有限时间 具备无限可能 Chinar 心分享 心创新
  • bash脚本-----在耗时任务中显示旋转器动画

    1 bin bash sleep 5 pid frames while kill 0 pid 2 gt 1 gt dev null do for frame in frames do printf r frame Loading sleep
  • C++课设-学生信息管理系统

    前言 上学期的一个简单的C 课设项目 代码在后面 附github项目链接 一 问题描述 建立学生信息数据 包括学号 姓名 性别 三科成绩 出生时间 年龄 必须计算得到 使用继承的方法构造至少3个类 即学生类 虚基类 一年级学生和二年级学生类
  • 输入一个矩阵,按照从外向里依顺序一次打印

    输入一个矩阵 按照从外向里以顺时针的顺序依次打印出每一个数字 例如 如果输入如下4 X 4矩阵 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1 2 3 4 8 12 16 15 14 13
  • Fedora 22安装后无法找到Realtek无线网卡的解决

    在主目录中建立一个文件夹 mkdir Reaktek 接着进入该目录 执行 git clone https github com lwfinger rtlwifi new git 会出现rtlwifi new的文件夹 进入文件夹 执行 ma
  • 编译安装LNMP全程实录

    此次是在CentOs 7 4上进行安装配置 先把编译环境配置好 yum y install gcc automake autoconf libtool make yum install gcc gcc c 准备一些软件的安装包 安装包 地址
  • 线性代数——求逆矩阵

    方法一 行列式分之一乘伴随矩阵 方法二 在右边拼个单位阵做初等行变换使得左边的原矩阵变为单位阵 这时右边即逆矩阵 抽象矩阵求逆 用公式AB E 利用计算技巧凑出公式 两边加E 提取公因式 没有公因式可提时利用隐形的E AA 1 因为E可看作
  • 【Deepin】 Deepin 系统安装教程

    安装过程 准备 准备足够的磁盘空间 下载 格式化 制作启动盘 安装 设置U盘启动项 根据引导安装 新建分区 设置 记录一下第N次安装Deepin系统的过程 准备 准备足够的磁盘空间 deepin用于生活日常的话 不需要太大的空间 我准备了4
  • 理性选择key-value Store

    前言 开源产品固然好 但是各种场景的数据需求确实多少有些差距 利用现有的软硬件资源面对现有的问题快速做出调整是才是数据库工程师的真正价值 综述 key value store由于本身实现不像成熟RDBMS那么复杂 换句话说开发周期不常 性能