AppBoxFuture(二): Say goodbye to sql!
信息管理类应用系统离不开关系数据存储,目前大家基本都使用的是传统的数据库如MySql、Postgres等。作者从事信息化建设十多年,个人认为传统的数据库存在以下的问题:
扩展问题:
系统数据的不断增长是个绕不过去的坎,传统数据库的存储结构一般都基于B+tree,单表数据在一定范围内没有问题,但数据量增大到一定程度后性能便会不断下降,只能通过分库分表的方式或升级硬件来解决,随之而来的是提高了应用软件的开发难度及相应的硬件成本。作者曾建设过一个北斗监控平台,其中单表记录10多亿,经过优化虽能实行秒级查询一天轨迹,但备份及定期删除历史数据非常慢且影响在线操作,后来只能手工实现了一套文件存储来解决(那个时代还没有NoSql)。
可用性问题:
传统数据库只能使用主从的方式来保障可用性,运维较复杂。作者曾经碰到过一次闪电导致机房(等保三级)内一台数据库用SAN存储的电源背板烧坏,虽这台存储冗余电源,RAID10统统没用,导致系统停用两天。
开发人员问题:
由于开发人员对sql的熟悉程度不同,经常能碰到写的很烂的sql语句。另外如果使用ORM,则ORM->Sql字符串->网络传输->Sql引擎分析->执行->网络传输->ORM存在较大性能损耗。作者的一个朋友在一家公司做运维,他说他公司的开发只管程序能否跑通,从不管sql优化问题,导致系统很慢,出了问题全丢给运维处理。
由于存在上述问题,作者一直在寻找新的适合于信息管理类系统的存储技术,既能简单的随需扩展,又能保障高可用高性能,还能兼顾大数据存储与分析,最好建设与运维的成本尽可能的低(作者接触的都是中小微企业)。因此先后学习了互联网企业常用的NewSql(TiDB, Cockroach)、NoSql(Cassandra, Kudu, ES等)技术,希望能将这些技术应用于传统的信息管理系统的建设。但随着进一步的深入了解,这些技术都存在这样或那样的问题,比如或架构复杂问题,或事务一致性问题,或性能问题(如并发扣减库存)。
在学习了上述技术的原理后,作者就想能否重新实现一套适合于上述要求的分布式数据库,直接集成至应用框架内,从而可以:
简化应用系统架构
整个应用系统由一个或多个节点组成,每个节点负责处理用户请求及存储,随需扩展节点。
表分区
大表支持定义为按分区键分区存储(类似于Cassandra的PartionKey),同时支持分区索引及全局索引,以避免热点问题,另外删除整个分区对性能的影响较小。
强一致性事务
基于Raft及2PC支持分布式事务(类似于TiDB, Cockroach)。
简单的Api
支持框架的实体模型与存储结构的直接映射,避免sql字符串转换与分析损耗,另由于直接进程内访问存储引擎,可减少网络通信开销。
举个简单的保存例子:
var pos = new Entities.VehiclePosition(vehicleId); //车辆位置,根据id分区
pos.LAT = 32.22223;
pos.LNG = 100.2123;
await EntityStore.SaveAsync(pos);
再举个简单的表扫描查询例子,支持其他查询方式如索引扫描,聚合扫描等:
var q = new TableScan<Entities.VehiclePosition>();
q.Partions(p => p.VehicleId == vehicleId); //指定分区条件
q.Filter(t => t.CreateTime >= startday && t.CreateTime < endday); //指定分区内记录过滤条件
var list = await q.ToListAsync(t => new {t.Id, t.LAT, t.LNG}); //选择指定列
小Tip:
- 在实现表扫描及聚合扫描时,作者利用C#的Emit直接生成条件过滤代码,类似于PG10 llvm生成代码。
- 关于Join将只支持LeftJoin,复杂Join只能在服务代码内利用C#的Linq处理。
- 目前事务隔离级别只支持ReadCommitted及Seializable,但纯读支持本地读、线性一致性读、事务读。
目前作者还在不断踩坑与尝试实现上述目标,当然首先要感谢上述所提的那些技术先驱们,在此希望有志同道合者来共同完成它。已实现的技术原型参考前篇
AppBoxFuture(一): Hello Future!,下篇“分而治之”将介绍框架如何在较低的硬件下保障高性能。
AppBoxFuture(二): Say goodbye to sql!的更多相关文章
- MyBatis基础入门《二十》动态SQL(foreach)
MyBatis基础入门<二十>动态SQL(foreach) 1. 迭代一个集合,通常用于in条件 2. 属性 > item > index > collection : ...
- mybatis 学习笔记(二):mybatis SQL注入问题
mybatis 学习笔记(二):mybatis SQL注入问题 SQL 注入攻击 首先了解下概念,什么叫SQL 注入: SQL注入攻击,简称SQL攻击或注入攻击,是发生于应用程序之数据库层的安全漏洞. ...
- 第三周博客之二---Oracle中的sql语句
一.用户及权限(DBA有最高系统权限) 1.数据库的安全性:系统的安全性.数据的安全性 2.权限分类: 2.1系统权限:获得后可访问数据库 常用的有create table,create user,c ...
- 分享泛微公司OA系统用于二次开发的sql脚本
本单位用的oa系统就是泛微公司的oa协同办公平台,下面是我对他进行二次开发统计用到的写数据库脚本,只做开发参考使用,对于该系统的二次开发技术交流可以加我q:2050372586 [仪表盘]格式sql编 ...
- NHibernate初学二之简单执行SQL及HQL、Linq
上篇文章简单介绍NHibernate之简单增删改查,本文将会简单介绍有关执行NHibernate的SQL.HQL及存储过程: 一:执行SQL语句实例,运用CreateSQLQuery方法 public ...
- MySQL性能优化(二)-- 数据类型,SQL,八种连接
一.mysql数据类型优化原则 1. 能够使用最小数据类型存储时,尽量使用最小数据类型存储(前提是要评估字段值的真实数据存储范围) eg:create table aaa(id1 int(10) ze ...
- ADO.NET 快速入门(十二):从 SQL Server 生成 XML 数据
本文演示如何使用2种不同的方法从 SQL Server 生成 XML. 方法1:使用了 SqlCommand 的 ExecuteXmlReader 方法获取 XmlReader,然后使用 Data ...
- (二)HTML5 - Web SQL 本地数据库
简介 WEB SQL Database即本地的SQLite数据库,使用的方式和方法和SQLite基本相同 判断浏览器是否支持 if (!window.openDatabase) { alert('Da ...
- 为代码减负之<二>存储过程(SQL)
在上篇博客中介绍到了触发器的使用,而且当中也提到了触发器是个特殊的存储过程,那么什么是存储过程呢?他们 两个又究竟有什么差别呢? 事实上最基本的差别就是,触发器是当满足条件时系统自己主动运行的,而存储 ...
随机推荐
- oracle基础语句练习
1. 创建相关表结构 Emp----员工信息表 Ename ), --姓名 Empno ), --编号 Deptno ), --所在部门 Job ), --工种(人员类别),如:manager 经理, ...
- Vue(三十二)SSR服务端渲染Nuxt.js
初始化Nuxt.js项目步骤 1.使用脚手架工具 create-nuxt-app 创建Nuxt项目 使用yarn或者npm $ yarn create nuxt-app <项目名> 注:根 ...
- redis离线集群安装
用一个叫redis-trib.rb的ruby脚本.redis-trib.rb是redis官方推出的管理redis集群的工具,集成在redis的源码src目录下(redis-xxx/src/).是基于r ...
- ASP.NET Core知多少(6):VS Code联调Angular + .NetCore
ASP.NET Core知多少系列:总体介绍及目录 1. 引言 最近在看<程序员的成长课>,讲到程序员如何构建技能树,印象深刻.作为一名后台开发的程序员,深感技能单一,就别说技能树了.作为 ...
- CASE WHEN 高阶用法?
两个表做关联时,以左表为准,若左表某列不为空,则与右表对应列进行关联匹配,为空则不做匹配. 以上做法,有一种说不出来的感觉,不管怎样,问题是解决了. 如有更好的解决思路,请留言告知,不甚感激!
- 一个开源的,跨平台的.NET机器学习框架ML.NET
微软在Build 2018大会上推出的一款面向.NET开发人员的开源,跨平台机器学习框架ML.NET. ML.NET将允许.NET开发人员开发他们自己的模型,并将自定义ML集成到他们的应用程序中,而无 ...
- Echarts 几个常用图
最近公司业务上的 需求,要求做一些图表,我们技术框架上选择方便使用的Echarts. 下面是效果图: 下面是具体代码: <!DOCTYPE html> <html> <h ...
- java中this和super关键字的使用
这几天看到类在继承时会用到this和super,这里就做了一点总结,与各位共同交流,有错误请各位指正~ this this是自身的一个对象,代表对象本身,可以理解为:指向对象本身的一个指针. this ...
- (转)浅谈Session与Cookie的区别与联系
一.Session的概念 Session 是存放在服务器端的,类似于Session结构来存放用户数据,当浏览器 第一次发送请求时,服务器自动生成了一个Session和一个Session ID用来唯一标 ...
- [Abp 源码分析]九、事件总线
0.简介 事件总线就是订阅/发布模式的一种实现,本质上事件总线的存在是为了降低耦合而存在的. 从上图可以看到事件由发布者发布到事件总线处理器当中,然后经由事件总线处理器调用订阅者的处理方法,而发布者和 ...