当前位置:  编程技术>软件工程/软件设计
本页文章导读:
    ▪[OceanBase] 架构设计      最近花了点时间研究了下OceanBase,非常有意思,写点东西记录一下学到的东西。 参考文档:https://github.com/alibaba/oceanbase/wiki/OceanBase%E6%9E%B6%E6%9E%84%E4%BB%8B%E7%BB%8D OceanBase的产生背景 OceanBase最初是.........
    ▪装饰模式(Decorator Pattern)            动态或者静态地为一个对象附加一个职责或者功能,称为装饰模式。它是属于结构设计模式之一,比较常用。      使用场合和优势:  为子类提供了一.........
    ▪sybase分页查询优化支持排序      上一篇( Sybase 海量数据分页瞬间完成)是不支持排序的,这次又写了一个支持排序的,不过要在数据库排序列加上索引,并在程序中指定索引名字。(注:sybase的jdbc API不是很智能不指定.........

[1][OceanBase] 架构设计
    来源: 互联网  发布时间: 2013-11-19

最近花了点时间研究了下OceanBase,非常有意思,写点东西记录一下学到的东西。

参考文档:https://github.com/alibaba/oceanbase/wiki/OceanBase%E6%9E%B6%E6%9E%84%E4%BB%8B%E7%BB%8D

OceanBase的产生背景

OceanBase最初是为了解决淘宝网的大规模数据而产生的(数百亿条的记录、数十TB的数据、数万TPS、数十万QPS),传统的如Oracle单机数据库肯定无法支撑(加再多硬件也不行,RAC的可扩展性太差),于是乎,有段时间,淘宝就开始用MySQL取代Oracle,然后就是疯狂分库(通常的做法是根据某个业务字段,通常取用户编号,哈希后取模,根据取模的结果将数据分布到不同的数据库服务器上,客户端请求通过数据库中间层路由到不同的数据库服务器上),这种方式有如下弊端:

1)添加节点比较复杂,往往需要人工介入;

2)有些范围查询需要访问几乎所有的分区数据库,性能变的更差;

接着Hadoop如火如荼,于是这些技术人员又在考虑是否可以使用HBase,但HBase有个致命缺陷:只能支持单行事务(HBase的体系架构可参考我的另一篇博文:http://blog.csdn.net/u010415792/article/details/8902746,因为写在HBase里是针对某个HRegion,而HRegion是分布在各个结点中,所以至多只能保证单行事务的原子性),而淘宝的业务必须支持跨行跨表事务。

因此,需要开发出一个新的数据库,即有良好的可扩展性,又能支持跨行跨表事务,于是OceanBase应运而生!

OceanBase的架构设计



通过分析发现,虽然淘宝在线业务的数据量十分庞大,但最近一段时间(例如一天)的修改量往往不多,因此,OceanBase决定采用单台更新服务器来记录最近一段时间的修改增量,而以前的数据保持不变,称为基准数据。基准数据以类似分布式文件系统的方式存储于多台基准数据服务器中,每次查询都需要把基准数据和增量数据融合后返回给客户端。这样,写事务都集中在单台更新服务器上,避免了复杂的分布式事务,高效地实现了跨行跨表事务;另外,更新服务器上的修改增量能够定期分发到多台基准数据服务器中,避免成为瓶颈,实现了良好的扩展性。

  • RootServer:(存放元数据)管理集群中的服务器,tablat数据分布及副本管理。
  • UpdateServer:存储增量更新数据,往往和RootServer公用一台物理服务器。
  • ChunkServer:存储基准数据,基准数据有多个副本(类似Hadoop)
  • MergeServer:接受客户端请求,合并UpdataServer和ChunkServer的数据返回给客户端,并定期把UpdateServer上的数据合并到ChunkServer上。
架构分析

从上面可以看出,OceanBase融合了分布式存储系统和关系数据库这两种技术。通过分布式存储技术将基准数据分布到多台ChunkServer,实现数据复制、负载均衡、服务器故障检测与自动容错,等等;UpdateServer相当于一个高性能的内存数据库,底层采用关系数据库技术实现。OceanBase相当于GFS + MemSQL,ChunkServer的实现类似GFS,UpdateServer的实现类似MemSQL,目标是成为可扩展的、支持每秒百万级跨行跨表事务操作的分布式数据库。

OceanBase最大的亮点在于把写集中到一个单点UpdateServer,这样的好处是可以让一致性和可用性兼得,实现跨行跨表事务,坏处是UpdateServer单点性能有可能成为瓶颈,因此它的配置要非常非高(大内存+SSD+存储Cache)。

作者:u010415792 发表于2013-5-15 11:12:10 原文链接
阅读:51 评论:0 查看评论

    
[2]装饰模式(Decorator Pattern)
    来源: 互联网  发布时间: 2013-11-19

      动态或者静态地为一个对象附加一个职责或者功能,称为装饰模式。它是属于结构设计模式之一,比较常用。

     使用场合和优势:

  •  为子类提供了一个可选项。
  •  在不影响其它对象的前提下,给一个对象添加一个新方法。
  •  很容易动态地添加和删除某个职责。
  •  比静态继承更具有灵活性。
  •  对于对象来说是透明的。
  •      下列UML类图展示了装饰模式的经典实现模型。

          

     我们将要定义一个Shape接口和图的实现类。之后,我们创建抽象装饰类ShapeDecorator,它实现了Shape接口。RedShapeDecorator 是 ShapeDecorator的扩展类,DecoratorPatternDemo则是对这个模式的测试类. UML类图如下所示。


            定义Shape接口.

    public interface Shape {
        void draw();
    }
            Shape的子类Circle、Rectangle.

    public class Rectangle implements Shape {
    
        @Override
        public void draw() {
            System.out.println("Shape: Rectangle");
        }
    }

         
    public class Circle implements Shape {
    
        @Override
        public void draw() {
            System.out.println("Shape: Circle");
        }
    }
    
     

        抽象装饰类ShapeDecorator。

        

    public abstract class ShapeDecorator implements Shape {
        protected Shape decoratedShape;
    
        public ShapeDecorator(Shape decoratedShape){
            this.decoratedShape = decoratedShape;
        }
    
        public void draw(){
            decoratedShape.draw();
        }
    }

        ShapeDecorator的扩展类。

    public class RedShapeDecorator extends ShapeDecorator {
    
        public RedShapeDecorator(Shape decoratedShape) {
            super(decoratedShape);
        }
    
        @Override
        public void draw() {
            decoratedShape.draw();
            setRedBorder(decoratedShape);
        }
    
        private void setRedBorder(Shape decoratedShape){
            System.out.println("Border Color: Red");
        }
    }

          测试类:

    public class DecoratorPatternDemo {
        public static void main(String[] args) {
    
            Shape circle = new Circle();
    
            Shape redCircle = new RedShapeDecorator(new Circle());
    
            Shape redRectangle = new RedShapeDecorator(new Rectangle());
            System.out.println("Circle with normal border");
            circle.draw();
    
            System.out.println("\nCircle of red border");
            redCircle.draw();
    
            System.out.println("\nRectangle of red border");
            redRectangle.draw();
        }
    }

           你会发现装饰模式与适配器模式有点像,但是适配器模式强调的是协调两个对象,而装饰模式则是添加新的功能给某个对象。

    作者:GreatElite 发表于2013-5-15 16:49:47 原文链接
    阅读:4 评论:0 查看评论

        
    [3]sybase分页查询优化支持排序
        来源: 互联网  发布时间: 2013-11-19

    上一篇( Sybase 海量数据分页瞬间完成)是不支持排序的,这次又写了一个支持排序的,不过要在数据库排序列加上索引,并在程序中指定索引名字。(注:sybase的jdbc API不是很智能不指定就没用使用索引搞的速度很慢)

    带排序分页代码下载

    测试代码如下:

     /**   * @param args   * @throws InterruptedException   */  public static void main(String[] args) throws InterruptedException {   StringBuilder sql = new StringBuilder("select t.keyId,t.pvcode" +     ",t.spType,t.factory,t.spareType,t.spareNum," +     "t.spareFuncNum,t.spareState,t.spareSerialNum,t.spareHardVersion,t.spareSoftVersion," +     "t.spareEnName,t.spareZhName,t.spareAddress " +     " from province_Spare_Info_ALL t where 1=1 order by factory");//   PagingService service = new PagingService();   int pageSize = 15;   int startNum = pageSize * 0;//第一页   //首次加载效率   long b = System.currentTimeMillis();   getPage(service ,sql.toString(),startNum,pageSize);   long e = System.currentTimeMillis();   System.out.println("首次加载时间"+(e-b));   Thread.currentThread().sleep(10000);//缓存5.5秒后可查询 我得电脑是4.7秒   //缓存之后效率   startNum = pageSize * 8000;//第8000页   b = System.currentTimeMillis();   getPage(service ,sql.toString(),startNum,pageSize);    e = System.currentTimeMillis();   System.out.println("翻到第8000时间"+(e-b));   

      startNum = pageSize * 40000;//第40000页   b = System.currentTimeMillis();   getPage(service ,sql.toString(),startNum,pageSize);    e = System.currentTimeMillis();   System.out.println("翻到第40000时间"+(e-b));  }  public static void getPage(PagingService service,String sql, int startNum, int pageSize ){   /*    * 我这里主键的索引是 province_pk_1    * factory 字段加的索引名叫province_index_1    * 如果就一个主键那写null就可以。如果几个索引那用哪个索引写哪个索引的名字    */   Page page = service.findPageBySql(sql, ProvinceSpareInfoAll.class, "keyId", startNum, pageSize,"province_index_1");//province_pk_1   List list = page.getData();   System.out.println(page.getTotalCount());   for (Object object : list) {    ProvinceSpareInfoAll p = (ProvinceSpareInfoAll)object;    System.out.print(p.getKeyId()+" ");   }   System.out.println();  }


     

    作者:damenggege123 发表于2013-5-15 15:45:45 原文链接
    阅读:71 评论:0 查看评论

        
    最新技术文章:
    ▪主-主数据库系统架构    ▪java.lang.UnsupportedClassVersionError: Bad version number i...    ▪eclipse项目出现红色叉叉解决方案
    ▪Play!framework 项目部署到Tomcat    ▪dedecms如何做中英文网站?    ▪Spring Batch Framework– introduction chapter(上)
    ▪第三章 AOP 基于@AspectJ的AOP    ▪基于插件的服务集成方式    ▪Online Coding开发模式 (通过在线配置实现一个表...
    ▪观察者模式(Observer)    ▪工厂模式 - 程序实现(java)    ▪几种web并行化编程实现
    ▪机器学习理论与实战(二)决策树    ▪Hibernate(四)——全面解析一对多关联映射    ▪我所理解的设计模式(C++实现)——解释器模...
    ▪利用规则引擎打造轻量级的面向服务编程模式...    ▪google blink的设计计划: Out-of-Progress iframes    ▪FS SIP呼叫的消息线程和状态机线程
    ▪XML FREESWITCH APPLICATION 实现    ▪Drupal 实战    ▪Blink: Chromium的新渲染引擎
    ▪(十四)桥接模式详解(都市异能版)    ▪你不知道的Eclipse用法:使用Allocation tracker跟...    ▪Linux内核-进程
    ▪你不知道的Eclipse用法:使用Metrics 测量复杂度    ▪IT行业为什么没有进度    ▪Exchange Server 2010/2013三种不同的故障转移
    ▪第二章 IoC Spring自动扫描和管理Bean    ▪CMMI简介    ▪目标检测(Object Detection)原理与实现(六)
    ▪值班总结(1)——探讨sql语句的执行机制    ▪第二章 IoC Annotation注入    ▪CentOS 6.4下安装Vagrant
    ▪Java NIO框架Netty1简单发送接受    ▪漫画研发之八:会吃的孩子有奶吃    ▪比较ASP和ASP.NET
    ▪spring 配置文件详解    ▪Struts2第一个工程helloStruts极其基本配置    ▪Python学习入门基础教程(learning Python)--2 Python简... iis7站长之家
    ▪.NET领域驱动设计—初尝(三:穿过迷雾走向光...    ▪linux下的块设备驱动(一)    ▪Modem项目工作总结
    ▪工作流--JBPM简介及开发环境搭建    ▪工作流--JBPM核心服务及表结构    ▪Eclipse:使用JDepend 进行依赖项检查
    ▪windows下用putty上传文件到远程Linux方法    ▪iBatis和Hibernate的5点区别    ▪基于学习的Indexing算法
    ▪设计模式11---设计模式之中介者模式(Mediator...    ▪带你走进EJB--JMS编程模型    ▪从抽象谈起(二):观察者模式与回调
    ▪设计模式09---设计模式之生成器模式(Builder)也...    ▪svn_resin_持续优化中    ▪Bitmap recycle方法与制作Bitmap的内存缓存
    ▪Hibernate从入门到精通(四)基本映射    ▪设计模式10---设计模式之原型模式(Prototype)    ▪Dreamer 3.0 支持json、xml、文件上传
    ▪Eclipse:使用PMD预先检测错误    ▪Jspx.net Framework 5.1 发布    ▪从抽象谈起(一):工厂模式与策略模式
    ▪Eclipse:使用CheckStyle实施编码标准    ▪【论文阅读】《Chain Replication for Supporting High T...    ▪Struts2 Path_路径问题
    ▪spring 配置文件详解    ▪Struts2第一个工程helloStruts极其基本配置    ▪Python学习入门基础教程(learning Python)--2 Python简...
    ▪maven springmvc环境配置    ▪基于SCRUM的金融软件开发项目    ▪software quality assurance 常见问题收录
    ▪Redis集群明细文档    ▪Dreamer 框架 比Struts2 更加灵活    ▪Maven POM入门
    ▪git 分支篇-----不断更新中    ▪Oracle非主键自增长    ▪php设计模式——UML类图
    ▪Matlab,Visio等生成的图片的字体嵌入问题解决...    ▪用Darwin和live555实现的直播框架    ▪学习ORM框架—hibernate(二):由hibernate接口谈...
    ▪(十)装饰器模式详解(与IO不解的情缘)    ▪无锁编程:最简单例子    ▪【虚拟化实战】网络设计之四Teaming
    ▪OSGi:生命周期层    ▪Javascript/Jquery——简单定时器    ▪java代码 发送GET、POST请求
    ▪Entity Framework底层操作封装(3)    ▪HttpClient 发送GET、POST请求    ▪使用spring框架,应用启动时,加载数据
    ▪Linux下Apache网站目录读写权限的设置    ▪单键模式的C++描述    ▪学习ORM框架—hibernate(一):初识hibernate
     


    站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3