Author Archives: guoguo

简单重试逻辑

应用场景 定时任务重试 回调业务时的延时计算 定义工具类 使用方法 举例: 简单的基于数据库的任务处理方法,当任务数量不太多,也不太关注是否及时时可以使用 任务状态枚举类 任务存储 任务拉取 任务执行

Posted in 编程工具 | Leave a comment

理解索引而不需要理解数据结构

Understanding Indexing Without Needing to Understand Data Structures MySQL UC 2011 – April 12, 2011 Zardosht Kasheff 什么是表? (key,value)对集合的词典 确保你可以 修改 这个词典(插入、删除、修改)和 查询(点查询、范围查询)词典 B-Tree和Fractal Tree是两个词典的例子 哈希则不是(不支持范围查询) 例子: 然后我们插入一批数据 a b c 100 5 45 101 92 2 156 56 45 165 6 2 … Continue reading

Posted in 未分类 | Leave a comment

Vertical简要

数据分析工作负载VS事务性工作负载证明商业和技术可靠的大规模分布式数据库,支持ACID、有效存储PB级别数据的系统 分析数据库的架构,关注与C-Store不同的点 实施和部署的经验,为什么引入那些不同 现实世界的经验可以引导未来大规模数据分析系统研究的方向2.背景 2.1.1设计目标:分析工作负载不是事务工作负载 事务工作负载:每秒事务数多,每个事务会影响少数几个元组,大部分的事务是增加一个新行或者修改部分已存在的列 分析工作负载:每秒事务数少,每个事务检查很多表中的元组,比如分析用户的行为,行处理每秒很多数据量级的增加,即使是小公司 最初就是设计一个分布式数据库 1、新节点加入系统性能有线性的扩展。使用共享磁盘的架构也能获得这样的扩展,但这很快会成为系统的瓶颈 2、优化和执行的引擎避免大量的网络数据传输,以避免内部互联成为系统瓶颈 3、查询和加载数据每秒都会有很多,必须关注支持高插入,否则只能有限的应用,批量的加载应该很快而又不能影响并行的查询 4、操作可在线,管理和维护任务不应该停止或暂停查询 5、易于使用是一个明确的目标。用CPU换时间,形式上减少复杂的网络和磁盘设置,减少性能的调优,自动化的物理设计和管理3数据模型 3.1 (列)计划 属性排序子集(经过编码和压缩并按某种次序排序和分割的纵列集合) 加载过程中自动维护 每个Projection都有自己的排序,数据是完全排序的 任意数量、带有不同排序的推算或表列的子集是被允许的,可针对不同的查询进行优化。不同排序规则,可被看成物化视图,但它们是物理数据结构,不是辅助索引。它不包含聚集、连接、额外的查询,认为它们在现实的分布式数据库中是不切实际的。 2.2连接索引,没有被实现,代价比带来的优势要少,实现复杂,执行代价在重现全元组在分布式查询时很高。 明确存储行ID,会点用很多空间,我们高效的压缩实现有助于减少这种开销,但没有计划实现它 3.3预连接推算 没有预期使用的多和重要:在小表连接操作上已经够好(高度优化的hash和合并算法),用户一般不愿意减慢 批量数据加载数据去优化查询速度。在加载数据时比连接查询时能够进行的优化机会要少,因为数据库在加载流中没有什么先验。3.4 编码和压缩 不同列有不同的编码,同样的列在他们的每个推测中也可有不同的编码 自动:根据类型和配置,当使用场景不同确时 替换:低基数列3.5 分区 c-store节点内水平分区,在单个节点使用并行提升性能 获得节点性并行并不需要硬盘物理分隔,在运行时逻辑分区,然后并行处理。尽管能够自动并行化,也提供根据value保持在物理上隔离 分区原因:快速批量删除(其它系统分区也是如此),否则需要查询所有物理文件要删除的行,添加删除标记,比起直接删文件慢的多 增加了存储的需求,在元组没有执行合并操作前影响查询性能。如果分区在所有推算上都一致,批量删除才是快速的,所以它是表层次的,而不是推算层次的分区原因:增加查询性能,它保存最小值和最大值在每个ROS中,在做计划时就能够修剪容器。分区使这种技术更高效,分区使列数据不混合 3.6 分割:集群分布 可以指定列做hash到段 c-store根据projection的排序字段的第一个列分割物理存储到段 完全的分布式存储系统,分配存储元组到不同计算结点 节点内水平分区和节点外水平分区(分割) 分割对每个推算在排序方式上可能不同,推算分割提供决定把元组映射到节点,可以做许多重要的优化。( … Continue reading

Posted in 未分类 | Leave a comment

ToKuDB简要

介绍TokuDB存储引擎是Tokutek2009年发布的一个数据库存储引擎,于2013年4月开源。支持MySQL/MariaDB。它和InnoDB一样支持事务、MVCC。 特色: Franctal Tree而不是B-Tree 内部结点不仅有指向父子的指针还有Buffer区,数据写入先写buffer区,FIFO结构,写入只需要顺序添加到Buffer区就可返回,后续满时一次性刷新到下面的子树中,插入数据基本上是一个顺序添加的过程。可轻松应对随机IO,减少空间碎片。 出色的压缩性能 块大小默认是4MB 在线DDL数据结构: 一、Buffered Tree:类B-Tree,写时直接写到Root结点,如果Root结点满了,就把数据刷新到它子结点上,如果子结点满了就继续刷新到子子结点,一直这样下去。因此,只有当结点满时才有Disk Seek产生。Node大小可设置很大,比如4MB,为提高读,需要对Node做更细划分,分成小块,随机读IO复杂度也为O(logN)。 写: 写时不产生disk seek,因为总是先写Root,由于经常被操作,可认为树顶部结点一直在Page Cache中。 节点数据紧凑,大Node压缩有优势 天然适合做事务,没有undo log,叶子结点上做mvcc二、Fractal-Tree(Buffer-Tree的变种)buffered(4,16)-tree,OMT结构维护结点数据,大小4MB,nonleaf节点OMT结构,leaf节点多个OMT(4MB/64KB) OMT:Order Maintenance Tree元素用数组表示,具有父子关系的元素尽量相邻存储,cpu cache line(如果一个节点的周边节点能在文件中紧邻的被存储,当读取其中一个的时候,其他节点被prefetching出来,io数则可以减少。这就是vEB layout) 结点刷新:Node完成写时检查是否满足flush条件,满足加到flush队列,后台线程并行处理从队列中读取的任务。 CheckPoint:60秒一次,sharp checkpoint无Fuzz Checkpoint,会对所有索引加只读锁,其它线程写node时,会clone一个Node。做完后检查LSN,以清理无用的log。基本上这个操作不影响前台读写操作,但是因为会进行数据压缩和clone node、写磁盘的操作,会造成一定的性能波动。 Cache:LRU,写cache时添加node到cache链表,然后检查cache状态,设置了四个水平位(低水平位,低警示点,高警示点,高水平位),高于高水平位,客户端线程进入等待状态,超过低警示点,开始收集逐出数据。 三、读: KEY读:每次读数据都要从ROOT到LEAF,做数据合并,才能得到完整的ROW数据。 范围读:对树做深度优先遍历,在LEAF结点返回,痛苦。四、Schema Changes列修改:Broadcast类型的Message,从Root广播到每一节点,最后到达LEAF结点。(Mysql对列修改会先关闭表,再打开表,关闭时Tokudb会把脏Node写盘,有些性能消耗),腾讯的游戏运维部门在InnoDB上实现了类似的功能。 索引:两种索引,cst_(clustering index)和cvr_(covering index),每个都是一个单独的F-tree文件 offline方式:启动多个线程,遍历记录生成索引,速度快,但创建过程中写操作不可用。 hot方式:速度慢,创建过程读写不受影响log:log manager来管理log文件,无重做日志组的概念,当日志写满后重新生成一个文件继续写,checkpoint后检查数据都被刷新到磁盘后会删除,达到InnoDB类似的效果;分in … Continue reading

Posted in 未分类 | Leave a comment

适配器模式

适配器模式 结构型设计模式,使接口不兼容的对象能相互合作 适配器实现了其中一个对象的接口,并对另一个对象进行封装。 适用场景 希望使用某个类,但接口与其它类不兼容 复用一些类,它们在同一继承体系,但它们的一些共有方法不是所有这一继承体系子类的共性 优点: 符合单一职责原则,可将接口或数据转换代码从程序主要业务逻辑中分离 开闭原则,只要客户端通过客户端接口与适配器进行交互,可在不修改现有客户端代码的情况下添加新的类型的适配器 缺点: 代码整体复杂度增加,需要新增加一系列接口和类,有时直接更改服务类使其与其它代码兼容会更简单

Posted in 设计模式 | Tagged | Leave a comment

策略模式

策略模式 行为设计模式,定义一系列算法,并将不同的算法放入独立的类中,以使算法的对象能相互替换。 优点: 运行时切换对象内的算法 算法实现与使用算法的代码隔离 组合代替继承 开闭原则,无需对上下文进行修改引入新的策略 缺点: 算法极少改变,没有必要引入新的类和接口。使用它会让程序变得复杂 客户端必须知晓策略间的不同,因为它要选择策略 使用函数的方式和使用策略完全相同,而又无需要借助额外的类和接口,使代码更简洁

Posted in 设计模式 | Tagged | Leave a comment

go语言开发环境配置

这篇Blog的代码的高亮显示真心不错,花花绿绿的… ‘;’ 1、编译vimgdb 下载vimgdb73和vim73 安装依赖 安装 安装vimgdb runtime 打开vim 添加配置.vimrc 在vim中执行gdb时,报 “Unable to read from GDB pseudo tty” 的错误,因为没有安装 gdb ,所以安装gdb 2、安装vundle Configure Plugins在.vimrc文件的开头添加下面的内容,有些不是必须的,可以注掉 vim +PluginInstall +qall3、官方vim-lang插件 4、代码补全的插件gocode 配置go的环境变量,比如我的配置,GOPATH变量是必须要配置的,PATH中必须把GOPATH的bin也添加进去,否则没有自动提示,会提示找不到模式 Set up gocodeThen you need to get the appropriate version of … Continue reading

Posted in 未分类 | Leave a comment

nginx动态处理图片模块

nginx的Http Image Filter Module可以动态处理JPEG,GIF,PNG格式的图片,它在0.7.54+版本后引入nginx,要使用它需要在./configure时添加 –with-http_image_filter_module 打开它,它需要libgd的支持,所以要使用它我们先要在机器上安装libgd,centos和debian的用户可以使用它们的包管理器去安装,如果要手动安装,对于64位的系统需要在编译时添加相应参数(使生成64位的二进制文件),这里只有32位的linux系统安装的例子。 1、需要的程序文件 jpegsrc.v6b.tar.gzlibpng-1.5.12.tar.gzpierrejoye-gd-libgd-5551f61978e3.tar.gzfreetype-2.3.5.tar.gzpcre-8.31.tar.gznginx-1.3.4.tar.gz 3、定制 模块的crop是从中间去截取,并且对于宽图,只能得到中间的一片图像,不符合大多数的情况,我们需要从顶部截取并且当图宽时,把宽缩放到规定的大小,然后再截取(原始逻辑是把高缩放到指定大小再截取),没有直接在原crop基础上修改。代码位置:src/http/modules/ngx_http_image_filter_module.c新增加指令crop_guoguo主要修改的代码 4、nginx配置文件

Posted in 未分类 | Leave a comment