Warning: Undefined global variable $debug in /var/www/ourcoders/tiny4cocoa/application/controllers/baseController.php on line 124
zhh-4096 的技术动态 - OurCoders (我们程序员)

zhh-4096的技术动态

zhh-4096
2020-01-21 00:00:00 发布
一听做企业应用就高大上,一说到外包就觉得丢脸,可是呢,企业应用就是外包的同义词啊。在互联网公司里撸代码又能高贵到哪去,大家都是curd码农。像大叔我这种从外包做到互联网,从应用系统做到中间件再做到数据库这类基础产品的,才叫能屈能伸,脏活细活高端的活全都可以做。
zhh-4096
2020-01-20 00:00:00 发布
在别处看到这篇文章 中台,我信了你的邪 | 深氪 写得很不错,特意转出来。曾在淘宝的中间件团队做过两年多,又在传统行业参与过某个大厂的数据平台建设,还做过不少业务系统,虽然没有正式参与过一个"中台"项目,但是很认同这篇文章想表达的东西: 不了解业务和组织架构的情况下,搞啥台都能搞垮台。
zhh-4096
2020-01-20 02:06:18 发布
当一个牛掰的老板,技术好不好,代码写得厉不厉害,这些东西太次要了,但是有两点是必须的:做好决断、不怕背锅。
zhh-4096
2020-01-20 00:06:18 发布
好多年没写servlet也没跟进Java EE了,看到Tomcat的最新代码冒出一堆jakarta.servlet包才知道原来java.servlet不给用了啊,那现有的老应用要升级不得大改?!有点感慨,Java EE这东西已经进入历史了!
zhh-4096
2020-01-18 00:00:00 发布
Lealone RC2要推迟发布了,春节前完不成了,代码已经全开源,但是目前引入了新的副本一致性协议,还有几个bug没修复。最近一段时间花在了一个比较重要的应用项目上,若是合同能签下来还得至少加班忙两个月。这项目一方面做得好能赚点钱,另一面长远看有机会当Lealone的最佳应用案例,所以打算亲自管。
zhh-4096
2020-01-18 00:00:00 发布
谈了几小时业务,可惜项目时间紧,我的数据库还没正式发布,还不稳定,不然的话太适合这个项目了。也是OLTP场景,上线半年内暂时用不到分布式数据库的功能,弄个复制集群就够用了,但是应用服务器层就得事先按分布式的架构弄。然后必须保证切换到分布式数据库时不改动现有的应用代码。

传统的MySQL分库分表中间件通常适合一开始就需要sharding的场景,如果应用没事先这么做,后期改起来麻烦。而现在的NewSQL数据库虽然可以做到不影响应用代码,但是必须从一开始就得部署一套分布式数据库集群,太浪费钱了。我非常确信我的数据库的方向走对了,从单机版到复制集群版,最后到sharding集群版,应用可以在不同阶段使用不同的部署模式,规模大了之后再无痛升级到更大的集群。
zhh-4096
2020-01-18 11:08:27 发布
企业从国家那里拿到的经费在各地都大同小异,从10万到30万,这里都能看到一个官方现成的:网页链接 不是什么秘密,经费不多,不过可以少交一点税。若是做数据库,在高校做,从国家拿钱就容易一些。
zhh-4096
2020-01-18 02:08:27 发布
经纬这么看好某NewSQL友商,从天使轮一直跟到C轮了!就像我前年在某乎上的预测一样,分布式数据库的市场规模是比不过MongoDB的,国内能有3000家公司真需要分布式数据库就挺了不起了,还是开源软件,这个转化率能达到10%说明销售做得很牛掰了。想走出国门,美帝还有小强数据库,这个小强在美帝更流行。
zhh-4096
2020-01-17 20:08:31 发布
又到周末,上一次提交代码已经是7天前了,看来计划又得延期几周了!当一个技术宅其实挺好的,管业务聊需求跟人应酬扯蛋是没法专心撸代码的。今天甲方又说给我们做,我们把条件谈得这么宽松这么偏向我们了,还给!事情来得容易自己都会有顾忌,哪有那么好的事!这年头还有老板要做电商平台?!!!
zhh-4096
2020-01-17 19:08:31 发布
公司这边最近4年做过的项目真的挺杂的,小程序、公众号、APP相关的技术和项目都做过,规模不大的游戏也做过,运营商的项目就更不用说了。甚至跟北斗相关的软硬件项目都做过,就是在各类车辆装上一个综端,然后通过北斗定位的系统。应用项目,常常就是只要你能想到的基本上别人也能想到。
zhh-4096
2020-01-17 17:08:37 发布
做应用项目真的耽误事,同事(合伙人)出差跟甲方沟通去了4天,我自己与项目介绍人和同事们聊需求也花了两天,了解小程序这类相关技术又花了一天,时间和钱花了估计最后这项目也做不成。做项目就是这样,大多数都是在扯蛋,聊10个能谈成一个就不错了,优质项目更是稀缺,还得应酬!

每次像这样花钱花 ...全文
zhh-4096
2020-01-16 00:00:00 发布
过去4年,大大小小的项目,我跟我的合伙人总共接了10几个。

总结一个规律是:如果是甲方搞不定的问题或者我们给的整套解决方案能为甲方大量减少成本的那类项目才有钱赚(我只亲自接这一类);

其他的无一例外,要么给钱给得拖拖拉拉,要么老板中途跑路,要么甲方运营失败导致我们这边做开发的不但一毛钱收不到还得自己出开发成本(有个游戏项目就是这样)。

不给20%-30%预付款的项目80+%都可能耍流氓!
zhh-4096
2020-01-15 19:07:54 发布
我这个老板就是光杆司令,只有我看到一个好项目并且决定亲自带时才会有几个队友,平时基本上都是一个人在做数据库,所以当我不带项目时大多时间都是在家工作的,带团队做应用项目时才会去公司或者直接去甲方那里办公。这就是我过去4年的工作模式。
zhh-4096
2020-01-15 17:07:54 发布
遇到高质量的应用项目(对客户不是可有可无的,预算也够)我还是会去管的。比如最近在谈的项目,我跟合伙人就在找靠谱的前端外包,因为时间比较紧张,我们也一直不养前端团队,对这一块不太放心,若是搞砸了不但赔钱还影响公司口碑,所以很慎重。

做应用项目的一个好处是可以切入一个新行业,不但能了解业务,整套的解决方案都是我们在做。通常客户更愿意为这一整套解决方案付钱,客户往往不知道数据库这种东西的,也不愿意为单独的数据库花钱,预算是给整套解决方案的,所以对于我们乙方来说也会优先选择开源免费的数据库。
zhh-4096
2020-01-14 22:08:17 发布
开一家小公司,养一个10+人的团队专门做大前端的外包项目估计能赚一点钱。以前只做web还好说,现在前端的事这么杂,传统项目型的公司根本没有必要专门养一个前端团队,专注后端和业务就好。有些应用项目只需要web前端,比如面向企业内部的系统大多如此;有些to c的项目往往更侧重app,另一些电商类的,大前端全做。

若是项目没有密集到来,做app的前端开发可能没有事做,而其他人又忙死。把前端的活交给专业的前端外包公司能省不少钱。前端不太涉及业务逻辑,所以也更适合外包。前端只是杂,重复性比较高,做熟练了以后,容易行成一整套组件,接到新的项目时利用好现有的东西能做得很快的。当年我做php时,如果不需要太花哨,表单型的web页面一天随便都能做完10几个。

我们之前也把web前端开发外包给一家专门做网页设计的小公司,如今应该跟上时代了,除了传统的web,小程序、安卓、iOS应该全都囊括了。设计公司,也是可以考虑做前端开发的业务的,之前我们的前端团队就有专门的设计师,如果懂一点前端开发优势会跟大。

我们这种小公司,前端外包出去的活最少都有几千,大多都是上万的,好点的5-10万。也没有多大的技术含量,最难的一次,外包的前端也没搞定,还是我亲自去解决最核心的问题。
zhh-4096
2020-01-14 16:08:17 发布
web、小程序、安卓、iOS,一个中等规模的项目每样配两个前端就得8个人,太花钱了!Flutter这类技术要想在功能和性能上满足要求替换前4者路还长。4年前我们也有个前端小团队,只会最简单的web,后来干脆不要了,把前端开发都外包了,有应用项目就把前端包给别人做,我们做后端和需求分析。
zhh-4096
2020-01-13 00:00:00 发布
因工作关系,今天第一次接触小程序,快速看了一下两个大厂的小程序玩法。总结就是:在原本已经混乱的前端圈又乱上加乱。都想搞自己的生态,然后让开发者自己去适应,重新学一个技术平台。

浏览器没在手机上像在PC上一样获得成功真是太可惜了,原本那么简单的事非得变成现在这个局面,大厂提供了啥服务,我把自己的web应用跑在浏览器里通过http或https去调就好了。现在各大厂都想把原本属于浏览器该做的事都用自己独有的方式做了,这么玩下去不乱才怪。
zhh-4096
2020-01-13 00:00:00 发布
有感于最近在谈的一个项目,客户就要原生的,iOS和安卓得写两套代码,这就算了,前端圈又搞出个小程序,又得再搞一套代码。这就是典型的想用一套新方案解决老问题,最后发现不但解决不了,骑虎难下,新老方案都要去做。一件事重复了三次!
zhh-4096
2020-01-11 09:08:37 发布
阿里开源了一款chaos相关的工具,然后看到数据库友商也把自己的开源了,在我看来更像是被动开源。做开源数据库本来就靠一些商业工具或增值服务赚钱,大厂一开源,小厂完全没抵抗力。

为啥阿里做的数据库不开源也不担心没人用?这是个值得思考的问题,做开源的靠免费拉拢用户,然后想赚更多钱最终也会走上卖云服务这条路,云厂商就是干这个事的,只要我的商业数据库遵循一样的协议和SQL标准,等用户做好了上云的准备后直接用我的数据库就好了,所以我为什么要开源,开源了大家的实现都能抄就难有差异了。
zhh-4096
2020-01-11 01:08:37 发布
最近有个应用项目看到一家投标的公司给的技术方案里也列了友商的分布式数据库,这开源数据库确实在国内火了,这也是开源的优势了,不花钱,哪怕多搞几台便宜的服务器也比买oracle强。

连电信运营商这种有钱的主用CDH都不舍得掏钱,所以我对这类基础开源软件的盈利模式是不太乐观的,MongoDB卖得最好的还是云服务而且还得改协议不让云厂商拿自己做的产品跟自己竞争。

RedHat的成功很难复制,而且Linux这杆大旗一直是Linus加上无数的共献者在扛,搞死了一票商业Unix玩家后,RedHat坐收渔利而已。
zhh-4096
2020-01-10 00:00:00 发布
入门级的架构师通常喜欢从网上搜集互联网一线大厂的架构,然后一招鲜吃遍天,让业务往里面套。高级的架构师是没有招数的,会先去了解业务,然后才得出一个专有的架构。

就如我前几天谈到的那个移动运营商有关MR数据的应用一样,如果MR数据是要跟其他数据关联起来做用户画像类型的应用那么就适合放到hadoop里做批量数据分析;如果只是用于网优,那么一台普通的开发用的笔记本电脑就够了。

有一家客户想做一个网优软件,一开始他们看到其他友商是用集群存MR数据做分析的,也是后来我看完了他们几十页的需求文档后才告诉他们不需要买10几台服务器搭hadoop集群的,因为需求里做完业务算法后就不需要原始数据了,一天几百亿,存下来没用,浪费钱,用一台机器做预计算就好了。

所以,好的架构师是要懂业务的,不理解业务是做不好应用项目的。
zhh-4096
2020-01-10 20:09:17 发布
做应用项目是挺辛苦的,今天刚初步聊了一下,我合伙人立马就买了车票,明天就出差了。本来也要我一起去,刚好周末两天家里乔迁新居就不去了。做项目,出差真是家常便饭了,赚的都是幸苦钱,要么忙死要么闲死,要长期维持一个20人的开发团队是很难的,所以只能外包,但是若是做现场开发,外包就行不通。

实话实说,做这类项目(跟甲方签合同,不是转包二三次那类),还是比较适合刚出校门不久的那些普通大学的人(当跳板),或者年纪超过30了,想回来二三线城市过日子赚点幸苦钱的人,这类人最稳定,来了就能干活,不会轻易跑路。

我自己当然会更乐意做产品,但是产品在短期内是难有利润的,要么找风投要钱,要么接点应用项目赚点快钱。做应用项目也会影响产品研发进度的,控制不好,创业就白干了。所以很多做基础产品或者做to C产品的创业公司都倾向于找风投。我一个同事之前创业做to C的产品,没拿到融资,然后为了生存,去接外包项目,公司也一直起不来。

所以,创业就是要放手一博,要么成,要么关门。若还年轻,创业接外包赚幸苦钱还不如跑到大公司拿薪水舒服,做项目只适合没得选的大龄码农维持生存。别以为自己创业不用看老板或上级脸色了,客户的脸色更不好看。
zhh-4096
2020-01-10 11:09:17 发布
有点猛!单机场景,创建10万个JDBC长连接只需要300M左右的内存!这是开源的H2和MySQL数据库无法想象的事。
zhh-4096
2020-01-08 16:07:35 发布
有时会画一些简单的草图,然后看着它思考,这样直观一些。今天就在盯着这张草图在想怎么优化复制协议和算法。前两个是update和delete发生冲突时如何做(就是检测到行锁冲突了),最后一个是insert没有主键的表,用append在btree那里新增记录时在不同节点得到的rowid不同如何破解(mysql分组复制还不支持这种场景,表要有主键才能用分组复制的功能)。

我突然发现这三种场景也有可能在客户端发出sql语句开始然后收到服务器端的响应,这样经过一个round trip后,在客户端判断出存在冲突或rowid不一致时然后再额外发起一个不影响客户端延迟的异步提交操作完成处理。也就是说,客户端只要在第一个round trip完成后,在客户端那里把冲突识别了,再异步提交到服务器端就可以了,不需要等待这个提交操作发出去就能去干别的事了。

服务器端即便还没有收到提交请求,它也能在后端做跟客户端一样的事。

所以,如果不发生冲突,显然就是正常的情况了,一个round trip就能结束客户端发起的写操作;如果发生冲突了只需要多加一个异步提交的操作就能完成,那么这种复制算法和协议绝对是目前世界上最先进的技术方案了。

我还在思考可能的漏洞,即便有错,这种对等架构下的多节点可写方案配上为不同场景做特殊优化,就是一次头脑解放运动,不必固守在老派的Paxos思想框架里!
zhh-4096
2020-01-08 13:07:35 发布
在OLTP关系数据库这个领域我已经有了非常深的思考和实践。这个领域非常抽象的说就是在解决吞吐、延迟和可用性问题。

我目前使用的数据库全链路异步化和全局统一调度器方案可以说对于吞吐问题在理论上已经接近完美:锁、IO不挂起线程,耗时的计算也不会一直占用cpu,理论上所有线程只要有事做就一直在运转,优先级高的小任务能更快结束。

延迟问题很多时候就是在考虑如何减少网络round trip的次数,这个在数据库处于复制和sharding模式下设计的算法和协议要重点考虑的。分布式事务同样非常在乎延迟问题。在延迟这个问题上我也做了无数尝试。

可用性问题并不仅仅是CAP中的A,我最近在思考如何在Java开发的数据库中尽可能杜绝出现OOM,这也可以说是资源可用性问题,如果不限流不能有效管理内存同样会造成系统资源耗尽,然后崩溃,那就谈不上可用了。这个方向我还在探索。
zhh-4096
2020-01-08 07:07:35 发布
[VLDB]P-Tree 支持 HTAP 场景的多版本索引结构 这篇2019年发的论文,绝大多数核心思想都跟我的Lealone数据库中使用的异步并行化btree相似:路径copy、异步执行批量操作、并行化读写、在value中嵌套另一个btree。
zhh-4096
2020-01-07 00:00:00 发布
开了个新坑: HSQLDB-Research 网页链接 HSQLDB 这个数据库有两点我想Research一下,纯粹就是不太常见,所以好奇。

第一,用AVL Tree来做存储引擎,这是关系数据库不常用的,更多的是BTree;第二,事务并发控制,HSQLDB把数据库教科书上常见的并发控制算法都实现了,例如: 2PL、MVCC、MV2PL,前两者分别是悲观和乐观并发控制,MV2PL算是综合体,读用多版本,写加锁。

InnoDB和H2的MVCC其实都是MV2PL,我的Lealone有点类似MV2PL,但是锁是轻量级的,可以叫MV2PLL,后面两个LL代表Lightweight Lock。

轻量级锁的创建和释放,开销都很低,也不会挂起线程,所以用了MV2PLL之后,就没必要再把传统的2PL、MVCC、MV2PL都实现了。

HSQLDB代码的可读性没有H2那么好,如果第一次选一个数据库的代码来看,选了HSQLDB估计会看得有点晕,若是看过H2之后再看HSQLDB就会好理解一些,我刚刚花了一点点时间随手写了个简单的HSQLDB代码导读: 网页链接 有空闲时间再补充了。

HSQLDB的事务并发控制做得比H2细一些,存储引擎H2的更好,其他的两者不相上下。

阅读HSQLDB的代码几年前就有这个打算了,NoSQL多年以前就把Java社区最流行的HBase和Cassandra都看过了,RDBMS算上H2和现在的HSQLDB也是Java社区排前两名的开源产品了,算是完整了,若是不看老觉得还缺点什么。
zhh-4096
2020-01-07 00:00:00 发布
H2和hsqldb是java社区最活跃最流行的两个开源关系数据库。读了两者的代码后,我敢说Lealone是用Java语言开发的开源OLTP关系数据库中技术最先进的一个了,已经做得非常深了,如果读H2和hsqldb的代码像是在学初中数学,那么看Lealone的代码就像是在学微积分和线性代数了。
zhh-4096
2020-01-07 00:00:00 发布
晚上花了两小时研究了一个hsqldb,把开发测试环境也弄好了,第一次读它的代码,debug了几条crud语句在后端的执行流程,虽说H2的代码跟它没关系了,不过读过H2的代码并且又做了一个Java写的数据库后,再看hsqldb这种东西真的好简单啊,随便debug几条调用链就知道它核心的东西怎么玩了。基础稳学啥都快!

也是一条连接对应一个线程的并发处理方案,没啥亮点,居然用的是AVL,insert 新记录时要加写锁,至少在这点上H2的实现还是领先hsqldb了,H2前几年用的COW Btree也是单线程写多线程读,现在支持多线程并发写了(不过也只是在root那里玩玩CAS而已)。
zhh-4096
2020-01-06 00:00:00 发布
开源软件的红利大多被云厂商收割了。如今再做开源软件,在没有名气和用户量之前,一条可行的路线是:免费开源给用户用,开源协议只对云厂商严格,对其他个人和企业宽松,尽可能多的把亮眼的功能免费放出来用,先把用户拉上船再说,等用户量上去了,再打包卖给云厂商,用户对开源软件的付费意愿低,但是却舍得购买云服务。

比如flink卖给阿里就是一个成功上岸的好例子,9000万欧元的卖身价还是挺值的。

云厂商除了有平台优势之外,通常能为应用提供全套的产品服务(解决方案),单独的某个开源产品通常只是支撑应用运行的一个组件,跟云厂商的产品套件没法比。
zhh-4096
2020-01-06 00:00:00 发布
看 hsqldb 数据库的源代码,作者应该是有强迫症和洁癖的,这是我迄今看到的最奇特的代码风格了,特别强调 “对齐”、"空行" 的使用!随意给个代码链接: 网页链接
zhh-4096
2020-01-06 00:00:00 发布
Apache 社区没有一个高质量高流行度的关系数据库,只有一个不太常用的 Apache Derby (比H2、hsqldb还小众),还是IBM捐出去的(从Informix的手上收购来的Cloudscape)。H2、hsqldb都没有在Apache 社区下面开发维护,而是自己搞一个小社区。连一些流行的ORM/SQLMapping框架都不在Apache麾下。Hibernate我就没记得哪时有放到Apache社区,iBatis早期在Apache,后来跳出来了,还改名为MyBatis。

对于这个现象我自己有两个看法:

1.关系数据库的商业价值高,或者说容易商业化,开发者们还是更倾向把控制权尽可能掌握在自己手中,包括选用什么样的开源协议自己可以定,一旦捐给Apache了,就只能用Apache的宽松协议进行开发维护。所以还是适合捐一些低商业价值的数据库,就比如Derby,这东西对IBM来说就是个鸡肋了。

2. iBatis当年从Apache退出,我印象里官方给的说法是受不了Apache那堆流程还有管理方式(也包括源代码版本控制)。的确,当Git很流行时,Apache早期还在用SVN,当GitHub已经在玩新的协作方式时,Apache才后知后觉慢慢在GitHub上有了代码镜像。

也有人给我建议,让我把我的数据库捐给Apache,一方面是行不通,捐给Apache前,开源项目要初具社区规模了,要有一定的用户和活跃度,我的项目还不满足这些要求。另一方面,当然是最重要的,我并没有考虑把我的项目捐给Apache。最后一点,因为我的数据库从H2演化而来,有一些代码依然遵守H2的开源协议,这个协议无法放到Apache社区下开发。
zhh-4096
2020-01-06 00:00:00 发布
Carnegie Mellon Database Group 弄的这个专业的数据库网站很好: 网页链接 目前收集了680多个数据库(不仅仅是RDBMS),从链接中的统计数据看,论数量,美国第一,中国也排第4了。按开发语言算,Java排第一,已经超过C++了!连数据库这类C/C++的传统优势领域都被Java超越了。
zhh-4096
2020-01-06 00:00:00 发布
包含测试代码在内,hsqldb 网页链接 目前有35万行Java代码左右,而H2 网页链接 数据库有33万多行。两个数据库每个时期的核心研发人员都是一到两个,hsqldb的核心开发(Fred Toussi)一直活跃,而H2的创始人(Thomas Mueller)最近3年已经不是主力了。

一些历史八卦:

H2的创始人Thomas Mueller在1998年做了一个叫Hypersonic SQL的开源数据库,后来他加入了一家叫PointBase Micro的公司做商业版的Java数据库,不能再继续开发Hypersonic SQL。

到了2001年,Hypersonic SQL开源社区成立了一个开发组继续开发,换了个名字,就有了现在的hsqldb。

在2004年,Thomas Mueller估计是离职了,开始启动H2数据库这个项目,H2这个名字表示Hypersonic SQL 2,但是并没有复用Hypersonic SQL的代码,而是从头开始的。

到了2012年,我在H2数据库的基础上改造,才有了我现在的Lealone数据库。
zhh-4096
2020-01-05 00:00:00 发布
MySQL 社区的产品(组件)真是乱轰轰,MySQL Cluster、InnoDB Cluster、MySQL NDB Cluster、MySQL Router、MySQL Proxy、MySQL Group Replication、MySQL Server,这么一大坨……数据库无非就4种部署模式,按规模从小到大排成这样: 嵌入式、单机(最经典的client-server模式)、复制集群、sharding集群。

所以,MySQL这一堆东西满足这4种场景了吗?如果满足了,怎么对应?为什么 MySQL 有Proxy、Router、Cluster这几样东西之后,还一堆大厂造自己的分库分表中间件?甚至还有新出的号称兼容MySQL的分布式数据库?分布式跟Cluster又有什么差别?

我对行业里这种名词满天飞的现象是很无语的,甚至有时同行聊起来用了不同的名词都不知道对方说的是不是跟自己想的是同一个东西!!!

没有那么玄乎的,理解上面说的4种部署模式就差不多了!
zhh-4096
2020-01-05 00:00:00 发布
我的 H2-Research 项目也跟 H2 数据库的最新代码保持同步了: 网页链接 如果装了Maven 和 Eclipse,照着 README 里的几步操作,两分钟就能把一个数据库的开发测试环境搭起来了。今年很重要的工作就是Java数据库知识普及,就从最简单的 H2 开始,最后再讲我的 Lealone 如何玩出更多新花样。
zhh-4096
2020-01-05 00:00:00 发布
MySQL这代码都到8.0了还是没有达到它该有的水准,算法、数据结构也不那么新潮。技术能不能流行也成了玄学,命好,怎样折腾都好。js和php也同样是命好!
zhh-4096
2020-01-04 00:00:00 发布
MySQL的代码在GitHub上已经连续三个多月没有提交记录了:网页链接 有点不合常理啊。
zhh-4096
2020-01-04 00:00:00 发布
主要是想看看怎么少花体力和脑力完整支持MySQL的协议和语法。在JVM里是可以把一些类似DLL的东西拿来用的,或者在MySQL里集成JVM也可以,我就是想把MySQL的网络和协议层、sql parser层弄出来,然后再转到我的java AST,看MySQL代码这个鬼样子,还是挺难剥离的。
zhh-4096
2020-01-04 00:00:00 发布
虽然一边是Java另一边是C++,读过H2数据库的代码再阅读MySQL还是有帮助的,核心的东西还是比较相似: one thread per connection、一个大switch处理所有协议包,SQL parser倒是不一样,一个是手写的递归下降parser,另一个基于yacc生成,优化和执行倒是很相似,不讲什么套路,volcano那种东西滚一边去,咱们走随性的路线。甚至连索引、MVCC都差不多。当然,代码两者也是一锅粥,H2算是MySQL的功能简化版,所以代码实现得没MySQL那么杂乱,只好一点点。

想当初在六七年前重构H2的代码做了maven模块划分时可是脱了一层皮的![笑cry]
zhh-4096
2020-01-04 00:00:00 发布
在网上搜MySQL源码,搜到这位博主 网页链接 从去年4月份写了一篇从源码构建MySQL开发调试环境的文章开始,然后连续写了12篇,断更了,关键是还没怎么入门。读大型项目源码,是一件很苦的活,绝大多数人都是刚开始有一点激情,最后都会知难而退的,能坚持两年时间下来也就不愁找工作了。
zhh-4096
2020-01-04 00:00:00 发布
每次刚有一点点探索mysql实现细节的好奇心,网页链接 看到这一大坨东西就给我泼了一盆冷水,然后就没有然后了。[摊手]
zhh-4096
2020-01-03 00:07:08 发布
我对物联网的数据处理问题没什么兴趣。类似电信和移动这类运营商的基站的MR数据算不算物联网数据处理的场景?这类项目我做过两个了,一个存hadoop里,原始数据全存,做批量分析;

另一个存单机版的H2数据库里,入库时就按各类业务算法提前处理了,不存原始数据,只存预处理后的数据,能把每天几百亿的原始数据(基本上是数字类型的字段)预先处理后得到几百万的规模,然后再建索引进行二次分析查询即可。一台普通的服务器就能搞定所有需求了!

这类场景入库丢几条数据无关紧要,不管你是用hadoop还是现在时髦的时序数据库存这些原始数据都是件简单的事,我反而觉得按业务需求做预处理那种方案更省钱且稍微有一点点难度。
zhh-4096
2019-12-31 20:07:33 发布
在晚饭之前,把2019年最后一天最重要的一件事做完了,那就是每年的年度总结: <<再见 2019,你好 2020>> 网页链接 也算是有进步,连年度总结这种流水账都写得一年比一年长,当然,最重要的是真实二字。
zhh-4096
2019-12-30 02:07:49 发布
还是返回Future的异步api更优雅一些,从早上折腾到现在,用好泛型能让代码更漂亮。弄了个很巧妙的send方法,能自动处理所有的请求和响应包,还能返回不同类型的Future,并且同时支持异步和同步:

<R, P extends AckPacket> Future<R> send(Packet packet, AckPacketHandler<R, P> ackPacketHandler)
zhh-4096
2019-12-29 17:07:50 发布
Java 社区的 Project Loom 搞了几年,一直在踩坑一样,现在切换到lightweight thread 的路子上了 网页链接 (是不是又有点 Java 1.0 时代green thread 的味道?)

Java 社区的协程解决方案我从10年前就开始关注了,直到 Quasar GitHub - puniverse/quasar: Fibers, Channels and Actors for the JVM 稍微有点进展,但是依然难用,再到 Kotlin 的协程,虽然已经能用于生产环境,但是这个方案也只适合新的 Kotlin 应用,而且也只是在编译层面解决问题,对 Java 社区现有的大量代码没有用处。

所以我对于 Quasar 和 Kotlin 的协程都是不感冒的,还是希望在 JVM 层做一些实质性的改进,也就是 lightweight thread 的方向。java.lang.Thread 本身就已经对线程做了很好的抽象,只要在 JVM 层面不要跟 OSThread 一对一的绑定就是一个切入点,然后还需要处理很多原来需要同步的地方,比如把锁也变成轻量级的锁,避免对OS的系统调用。我在数据库里实现轻量级的行(列)锁也是类似这种原理。

在 JVM 层面实现 lightweight thread 我预估的难度主要有两个: 1. 新的调度器;2. JVM和标准库有太多同步的地方了,如何把原先的重量级锁(通常涉及OS的系统调用)变成轻量级锁。

传统数据库的问题也几乎一样: 重量级线程 + 重量级锁,我的工作也是加入新的调度器,然后把锁变轻量。都是一个很复杂繁琐的工程问题。
zhh-4096
2019-12-28 00:00:00 发布
2014年花了10个月读过不少HotSpot VM的代码还是有用的,虽然过了几年好多细节都忘了,但是现在只要对java代码的性能问题比较敏感的地方,还是能够从java标准库经过jni再找到对应jvm层的cpp代码,然后大致评估出是否有性能开销的。
zhh-4096
2019-12-28 00:00:00 发布
对一个大中型系统进行异步化后如何优雅的处理异常?这是一个挺刺手的问题。不管是vert.x通过AsyncResult用if else判断成功或失败,还是RxJava那种为成功失败单独弄链式风格的处理器,代码规模大了之后都是很繁琐的。

我不想每次异步调用都处理一次异常情况,只关心正常的结果,然后在某个局部或全局的地方捕获异常,同时错误堆栈要能方便查找问题,尽可能像同步调用产生的异常那样直观。

如果调用异步方法的线程和执行回调的线程不是同一个,在后者中抛出的异常堆栈是极其难排查原因的,上下文已经丢失了。特别是数据库这类场景,需要在客户端把服务器端传回来的异常堆栈跟客户端自己的调用链衔接起来才来得到完整的信息。

当然也有一种办法就是在执行异步方法前就把当前的调用栈构建出来了,然后保存到回调的闭包当中,但是无条件事先构建调用栈会有一点性能损失,并且在绝大多数调用成功的场景下都是没必要的。
zhh-4096
2019-12-25 02:07:06 发布
刚想到了一个有点意思的新问题:用Java开发的数据库,运行时有可能杜绝出现OOM吗?用过hadoop生态圈里那些开源项目就知道这是个头疼的问题。在数据库里面实现了统一的异步任务调度器后,连一个循环的执行次数我都是能精确控制的,其他流控问题更加不在话下,所以这个问题有可能被解决掉的。
zhh-4096
2019-12-24 21:07:06 发布
搞定了分布式OLTP场景下的关系数据库并且做了很好的模块划分后,我真的发现后端好多系统都是没必要存在的。zookeeper这种在配置中心常用的组件也只适合在低并发场景下存点应用配置和状态信息,远远满足不了数据库场景下的记录复制需求,只要把数据库的SQL层去掉,轻量化之后数据库自带的复制和存储组件完全能胜任zookeeper的工作。

缓存系统也是一样,当初也是因为数据库的存储是面向硬盘设计的并且简单的crud也得经过缓慢的SQL层,所以应用不得不引入redis这种缓存系统。现代数据库为了支持内存临时表其实也会用并发跳表这种高性能的数据结构,若是在客户端提供kv接口然后数据库后端绕过SQL层,不就变成一个缓存系统了。而且这种方案还能轻易解决数据一致性问题。

最后,再说到应用服务器集群,像tomcat和vert.x的集群要么自己实现session状态的管理要么借助第三方的集群框架,所以如果分布式数据库去掉SQL层或可选的去掉事务引擎,留下分布式存储,然后把单机版的tomcat或vert.x集成一下又能构建一个应用服务器集群了。
zhh-4096
2019-12-24 14:07:11 发布
编译器、数据库,在这两个领域内,有Jeffrey D.Ullman参与编著的两套教科书对我的帮助很大。

编译器相关的两本书:
<<自动机理论、语言和计算导论>> 自动机理论、语言和计算导论
<<编译原理>>(龙书) 第一版: 编译原理 第二版: 网页链接

数据库相关的两本书:
<<数据库系统基础教程>> 网页链接
<<数据库系统实现>> 网页链接

自动机那本书读过之后再看龙书其实更容易理解,我是全自学的,龙书其实就是编译原理的入门书,各方面适度讲一下就行了,当年我就是靠这书上学到的知识就能读懂javac的代码了。要想挑战编译器优化这种高级主题可以看<<高级编译器设计与实现>>(鲸书) 网页链接 龙书的定位没必要改,结合自动机那本书就是给首次接触编译器的人看的。

数据库那两本书更加不用提了,甚至好过<<数据库系统概念>> 网页链接 那两本书是我推荐给所有想做数据库研发的人看的最好的入门和初步进阶的教科书,亲自做过一个数据库产品后我更加确信这两本书有价值。

最后,再转发一次我几年前写的一篇文章<<想通过自学成为一个有良好计算机专业素养的Java程序员要读哪些书?>> 网页链接 里面列的Java、编译器、数据库相关的书,绝大多数依然有用。
zhh-4096
2019-12-24 10:07:11 发布
看到王垠喷编译器领域,虽然跟我无关,我还是想说几句。严格来说我并没有做过编译器的工作,我只是在2006/2007年研究过一年多程序语言和编译器,看了很多书,也完整读过javac这个java前端编译器的代码,还定制过javac用于开发新的web框架。然后又在2014年研究HotSpot VM的代码研究了10个月,目的是为了做代码半自动化分析。

先说编译器教科书的问题,我当年买过读过很多编译器的书(前几年在github上还列了书单),包括龙书、虎书、鲸书我都有。王垠喷龙书花了大量篇幅讲parser,以现在的眼光看,parser确实是个死领域了,没必要花大量时间去折腾,我也同意他说的写parser用递归下降更灵活的说法。javac的parser和我现在做的数据库的parser都是用手写的递归下降算法。

但是,还得为龙书说点好话,回到过去,在编译器还是一个大热门的年代,为了研究如何对程序语言做词法和语法解析也是做了很多工作的,图灵奖还给过做自动机理论的研究者,自动机理论也用于词法分析。龙书是编译器领域最早成名的教材,花大量篇幅讲编译器前端的内容只是历史原因而已,而且龙书的作者也写过另一本自动机和计算复杂性的教科书,这书可以当成龙书的前导教材看。

编译器现在业内基本上都有共识了吧,重点早就放在优化和多语言支持方面了。讲编译器优化最早出名的教科书是鲸书,这本书还是有难度的。

多语言支持方面现在的GraalVM做得比较好,Oracle也用它卖钱了。当然HotSpot VM里的C1和C2编译器都没有用LLVM啊,JVM除了JIT还有GC,这两者都是技术性很强的工作。

V8也是做HotSpot VM的人跑去弄的,没有V8也许整个js/node.js圈就不是如今的面貌了。

王同学若是受到赵海平面试的刺激就走极端否定编译器领域的人那就不太合适了吧,少数人不代表整体啊,R大也做过编译器还在阿里工作过,你看R大的口碑多好!
zhh-4096
2019-12-23 00:00:00 发布
直到现在,花了一周,总算用 “命令模式” 把数据库整个协议层的的代码重构完了,真是个体力活。设计模式最大的缺点就是代码膨胀,好处就是代代码看起来优雅,若是对设计模式不熟悉的人,估计又会去骂Java写出的代码啰嗦了,一层套一层的。

当一个项目的规模大了之后,用好设计模式对于项目的可维护性还是有用的。比如我这个数据库光是协议层就有点规模了,协议包的类型就有70多种: 网页链接 然后我把协议包分成几大类: 网页链接 每一个协议包就对应一个普通的POJO,最后每一个协议包还对应一个PacketHandler: 网页链接

只要按PacketType找到对应的PacketHandler,然后通过一些范型的小技巧,就能把协议包对应的POJO传到PacketHandler的handle方法中。
zhh-4096
2019-12-21 22:12:05 发布
王垠同学搞PLT(程序语言理论),在国内找工作还是比较吃亏的,这个方向的人做IDE相关的工作比较合适,或者做编译器前端的工作也可以(就像javac这种,难点都在程序语言语义方面)。做JVM或编译器优化需要补很多知识的,而且也需要很好的工程经验。很多外行都是想当然,以为搞PLT的做JVM或编译器优化的工作也是顺便的事,在我看来这是两个方向,只是有关联。

搞PLT的就不要瞎扯数据库领域的东西了,SQL parser是数据库中很容易的工作,即便没学过编译原理也知道怎么写的。说真的,几年前我还真想过要是王垠跟我一起合作我们俩要如何互补,最后经过类似的分析,得出的结果是能互补的东西很有限,特别是做数据库,我的结论是学PLT对做数据库帮助不大。如果我现在回去改JVM的代码,然后基于JVM做运行时的代码分析工作,对javac的需求就很弱了,也没怎么需要用PLT的知识。
zhh-4096
2019-12-21 13:12:05 发布
花了几天用 “命令模式” 重构数据库整个协议层的设计与实现,做完大半了,总觉得很鸡肋。原先在一个四五百行的大switch中搞定的事,弄成 “命令模式” 后,每一种协议命令包以及对应的响应包都要弄成独立的POJO类,然后配上编解码器,最后再配上一一对应的命令处理类,总共新增了100多个类![笑cry]
zhh-4096
2019-12-17 00:00:00 发布
Lealone数据库的开发计划做了一些调整:1. 在RC2版本中提前包含所有之前未开源的功能,包括最新的分布式事务和最新的副本强一致性协议,不等到GA版了,可提前用,RC2最迟在春节前发布。2. 在RC2发布后,没有RC3了,试用一段时间,修复一些新发现的bug后,稳定了就直接发GA版。总之,会加速GA版的发布。
zhh-4096
2019-12-16 00:00:00 发布
现在主流的与数据库复制相关的一致性算法(协议)在工程实现上分为两大派: Strong Leader 和 Leaderless。

Strong Leader: 只有一个节点可写,并且需要实现Leader选举。比较有代表性的论文是Leslie Lamport那几篇Paxos相关的论文以及Diego Ongaro 和 John Ousterhout的Raft。

Leaderless: 所有节点都可写,因为没有Leader,所以自然不需要实现Leader选举。这一派比较有份量的论文不多,比较出名的是CMU发表的EPaxos,论文在这里 网页链接 这个是正确性证明的论文: 网页链接

Leaderless 这个派系在工程实现上要比Strong Leader复杂一些,EPaxos就相当复杂,通过40多页的证明也能从一个侧面看出它的复杂性。Apache Cassandra 对EPaxos做了工程实现 网页链接 从2014年就开始做了,估计会合并到4.0(还未发布),Cassandra 这种对等架构的系统的确适合Leaderless。除了 Cassandra 我还没有找到其他用 EPaxos 的数据库。

我的Lealone也属于Leaderless派系,但是跟EPaxos差别很大。

采用Strong Leader实现的数据库或相关产品比Leaderless更多。

MySQL Group Replication 实际上同时支持 Strong Leader 和 Leaderless 网页链接 它的Single-Primary部署模式就是Strong Leader,而Multi-Primary部署模式就是Leaderless。不过它的Multi-Primary模式跟Leaderless还是有点差别,客户端并不是并行写多个Primary的,看它的架构 网页链接 需要客户端先接入一个Primary,然后再由此Primary并行写到其他Primary,这种设计我想是为了兼容现有的客户端吧,如果在客户端实现并行写多个Primary,需要修改客户端协议,用不同语言实现的客户端需要做改动还是挺麻烦的。

但是我看到MySQL Connector/J 8.0 网页链接 又提供了Replication相关的功能,没去翻代码,不太确信它是否支持在客户端并行写多个Primary,我的Lealone就是并行写多个节点的,这样可以减少一次round trip。

用 MySQL Group Replication 有一个前提条件让我印象特别深刻,网页链接 就是每个表必须有主键或者不为null的唯一键。因为我最近在我的Lealone数据库中实现复制算法时刚好碰到没有主键的表当执行insert时会有问题。因为Lealone跟MySQL都类似,对于没有主键的表,insert新记录时,会为这条记录自动生成一个递增的逻辑rowId,这个rowId是用来关联索引的。

在Group Replication的场景下,如果每个节点对同一条记录生成不同的rowId是错误的,检测rowId的一致性需要另外的技巧(这时行锁是用不上的,因为是新记录,所以没法用行锁,行锁只用于已经存在的记录)。

如果已经有主键或者不为null的唯一键,就算不同客户端发起的insert操作在不同节点上的执行顺序全乱了,因为存在唯一性约束,所以总是能检测到冲突的,在哪个节点上都存在冲突,而rowId是否一致在单独的节点上是看不出来的,只能全局看。
zhh-4096
2019-12-14 11:07:58 发布
看你们从微博吃瓜吃到某乎也分辩不出个胜负,王垠 vs 鸟哥 vs 赵海平,谁厉害?语言实现,后两者同一个级别,能ko王垠,pl理论水平王垠能ko后两者啊。程序语言设计和实现通常都是两拨人,两者都硬的才是最牛的,当然这样的人极少。
zhh-4096
2019-12-13 22:07:22 发布
2019年对于我而言实在是太特别了,我把数据库的默认端口号都改成9210了,默认端口号改过至少3次了,不会再改了!
zhh-4096
2019-12-13 11:07:22 发布
看到 Nginx 创始人因 Nginx 版权问题被前雇主起诉的新闻,类似这样的问题也是我之前最担心的。很多年前看到oschina网站收录 Lealone 时在开发厂商那一栏填上阿里巴巴,那时我就发过声明 Lealone 是我在辞职之后才开始做的研究型项目,这网站现在都还没改过来: 网页链接 去年看到<<2018年阿里巴巴重要开源项目汇总>> 2018年阿里巴巴重要开源项目汇总(持续更新中) 这篇文章也把 Lealone 归到阿里巴巴,我又声明了一次。还好我刚去看官方最新文档时已经把 Lealone 的介绍删除了: 网页链接 我很感谢阿里巴巴对 Lealone 的宣传,但是 Lealone 的版权确实不属于阿里巴巴。
zhh-4096
2019-11-30 19:08:18 发布
我在Lealone里设计了一个叫lealone的数据库,这个数据库相当于元数据库,或者说用来管理其他数据库的数据库,这个lealone数据库也有自己独立的用户,只有用这个lealone数据库里的用户登录才能创建出其他用户级的数据库。相当于有root权限,执行超级危险的操作,包括管理集群的功能。
zhh-4096
2019-11-30 19:08:18 发布
Lealone的数据库对象模型更像PostgreSQL,最上层是Database,然后才是Schema,而Schema下面才是表。MySQL少了一层了,Database和Schema是一个意思。Lealone的每个Database都有自己独立的用户,MySQL不是这样的,相当于Lealone的一个Database逻辑实例就是整个MySQL了。

Lealone的这种方式更适合在一个集群中混合运行不同的Database逻辑实例,比如有些Database实例只需要跑在一台服务器上,有些需要运行在复制模式,而另一些运行在sharding模式。

Lealone也支持use命令,但针对的是Schema,而不是切换数据库。
每个Database会有一个叫public的Schema,如果在表名之前没有指定模式名就默认是public。
zhh-4096
2019-11-29 00:00:00 发布
网页链接 我的知乎备份完了,只保留了两个严肃的回答,其他都删除了,没精力玩知乎了。
zhh-4096
2019-11-29 00:00:00 发布
不看转发还好,一看转发能把我气死。所以,一提到数据库就只知道优化器,做优化器的人才牛逼对吧?!搞清楚OLTP看重什么先,OLAP又看重什么?大叔我已经很谦虚了,在那8点当中我没有提到我的bats大一统sql引擎,那是因为我觉得里面还没有达到我满意的技术突破所以不提,能看懂bats里面那80万行代码的人全国屈指可数,sql引擎难个毛线啊,90%都是体力活,这已经是我第三次做sql引擎了!!!微博的蠢货实在是多,再骂两天我就闭嘴了,没力气骂了!!!
zhh-4096
2019-11-28 00:00:00 发布
GitHub这网站是不是访问量大了,还是因为被微软收购后技术变差了,我每天都要花一些时间在这个网站上,这一年明显体验变差了,有时登录不上去,有时打开很慢,有时页面布局全乱了。现在又打不开了!
zhh-4096
2019-11-28 00:00:00 发布
对于偏工程问题的解决方案,对这类方案做形式化证明来确保其正确性,这个证明不但不好做,还常常像个裹脚布。哪怕是国内国外的数据库教科书,也极少对具体算法、数据结构、模型、协议给出形式化证明的,这进一步加剧了读者对形式化证明的轻视。学计算机不像学数学那样严肃,学数学就是学推导和证明。
zhh-4096
2019-11-27 00:00:00 发布
外行人是不会懂得我在数据库这个领域牛逼在哪里的?
以下所列的原创技术,哪一项拿出来都是超重量级的。

1. 数据库全链路异步化
2. 统一异步任务调度器、轻量级行列锁
3. 异步并行化无锁b-tree
4. 新的分布式事务模型(基于 轻量级行列锁 + 有效性检查)
5. 新的副本强一致性协议(同样基于 轻量级行列锁 + 有效性检查)
6. 统一分布式事务模型和副本强一致性协议
7, 基于b-tree leaf page的sharding算法
8. 支持单机模式、复制模式、sharding模式,并在三种模式之间无缝迁移

按数字大小排序,1到8环环相扣,有了前面的技术支撑,后面的技术实现起来更完美更高效。
zhh-4096
2019-11-27 00:00:00 发布
分布式数据库最难的理论问题就是分布式事务和副本强一致性了,任何一个能高效解决都不容易,如果能统一用一套理论解释清楚并统一用一套代码高效实现,给个图灵奖都不为过。Leslie Lamport弄出Paxos这么复杂的协议都能得图灵奖,Paxos也只不过更适用于副本强一致性问题。
zhh-4096
2019-11-27 00:00:00 发布
没想到时隔4年多,还能在分布式事务和副本强一致性这个方向做更进一步的技术创新,而且统一得更完美了。

早期的方案,副本冲突检测是在客户端做的,需要把被更新的每条记录的多个副本的版本号发回客户端,如果发现这些版本号没有超过一半是相同的,那就盲目重试。

这种方案有两个缺点,对于带where条件的update语句,如果要更新的记录很多,需要返回大量的版本号给客户端,所以不太适合批量更新。另一个缺点是忙目重试,有可能造成一直重试下去,所以只能限定重试次数。

最新的方案使用轻量级行锁了,不再有上面两个缺点,不需要把版本号发回客户端了,直接在数据库上面做锁冲突检测、撤销、重试。
zhh-4096
2019-11-25 23:07:16 发布
目前Lealone的开发流程还没有到很正式的阶段,不像Apache里的项目先开一个jira issue,然后开发,接着做完整测试,最后通过了再合并到主干。我这边还是处于有什么想法了就去试,做到一半为了防止丢失代码就临时提交代码到GitHub的阶段。所以,还是便捷优先,GA后再考虑开发流程规范化的事。
zhh-4096
2019-11-25 18:07:16 发布
2019广西最具竞争力民营企业 2019广西民营企业100强榜单发布 2019广西民营企业制造业100强 2019广西民营企业100强榜单发布 桂林的优势在电子、农副食品加工、医药制造领域。柳州的优势是汽车制造业,南宁是农副食品加工。
zhh-4096
2019-11-25 12:07:16 发布
之前我也说过几次,2010-2013这几年,AliSQL团队太菜,若是把MySQL的强一致性复制问题解决掉了,OceanBase这产品根本就没有必要存在。当时我就在TDDL小组(MySQL分库分表中间件小组),MySQL的异步复制带来的延迟问题也是我在TDDL里通过不优美的方式解决的,我们只是上层的Java团队,这是数据库层面的问题,不适合放到上层做。

包括MySQL的连接数问题也一样,我跟另一个同事又花了两个月做了一个DB-Proxy的东西,结果做完了又不用,这本身就不太适合放到上层做。

我们团队在2010年就开始研究Paxos了(官博上估计都还有相关文章),但是一个Java中间件团队能做什么呢?AliSQL不属于我们团队负责,还是MySQL的定制版。MySQL的复制问题不解决是不可能用到支付宝这类金融场景的。

OceanBase最初想对标HBase,结果完败,HBase在阿里遍地开花,然后只能跑到支付宝,把Paxos这类技术用上了,才有了翻身机会。
zhh-4096
2019-11-25 00:07:00 发布
网页链接 这里也提到了一句"2019年桂林市人民政府工作报告中,为重振桂林工业雄风" 重点是这个重振。所以咱们广西人不用自卑,就如我昨天的微博说的,很多人只知道桂林旅游出名,其实过去工业也挺牛的,只是存在一些原因为了保住这个国家级的旅游名片做了一些牺牲而已。
zhh-4096
2019-11-22 00:00:00 发布
最近又改进了复制协议的实现。做数据库这几年,反反复复应用了三个最基本的设计思路:1. 轻量级行(列)锁;2. 基于全部或大部分参与者列表的有效性检查;3. 读写请求接入节点做决策。1是解决并发控制问题的有效办法,2和3为分布式数据库中的ACID和CAP问题提供了清晰的思路,3还能避免不必要的选举。
zhh-4096
2019-11-21 09:07:53 发布
看到网友AT我,才知道数据库连接池这样的过时技术都能单独写书了!我就不在人家的地盘吐槽了,挡人财路不好。我早就不关注这类技术了,还专门写过一篇短文:数据库连接池这样的技术应该扫进历史的垃圾堆中 对于Lealone这样的数据库是不需要用连接池的,在客户端有多少个线程就打开相应个数的JDBC连接即可。
zhh-4096
2019-11-20 20:07:53 发布
Lealone下一个(第二个)RC版就会开源最新的完整的分布式事务和副本强一致性协议的实现代码了。当然,你也能看到我是如何把它俩统一的。截止今天,已经提交了大半的代码了。因为Lealone 5.0使用了新的异步任务调度器,存储层也大改了(用了异步btree),所以对原有的分布式事务和复制协议影响都很大。
zhh-4096
2019-11-16 19:06:47 发布
公司里就有一些对外和对内的商业应用项目,所以我的数据库不缺小白鼠。这些应用基本上都是用vert.x开发的,数据库也有用h2的,从一开始就想到要为我的数据库做打算,方便迁移,而且也能跟vert.x良好集成,从应用层到数据库全使用最现代的异步与响应式编程模型。类似这种事,也是架构师级别的人要做的。
zhh-4096
2019-11-16 15:06:47 发布
睡觉前再发一条diss类的微博,对于某数据库,我依然认为我四年前的观点是没错的:选择go和rust开发数据库纯粹就是为了迎合两个社区,填补空白,就是一种投机行为(从商业的角度看这是个好选择)。现在也确实收获了不少star,也确实容易吸引眼球。

若是换成c++或java,这两个社区的人对于那样的没什么原创技术的系统是没多少兴趣的,这两社区太多数据库和存储计算相关的开源项目了。哪怕像我做的数据库有那么多的原创技术,要想在java社区获得关注也得花大力气主动出击。

当然,用go和rust同时开发,甚至还用C++做的存储引擎的数据库,现在自然要面对维护成本的问题,特别是现在都在以不同方式统一数据库和大数据时,多语言开发代价是很大的,而我统一用java开发却带来了极大便利。
zhh-4096
2019-11-15 00:00:00 发布
过去20年,对于我而言,投资回报率最高的语言和技术平台就是java了,这期间冒出来的流行一时的语言或框架已经数不清了,忍住诱惑,没有动摇。回望过去,我的选择是对的,没有浪费太多时间在一些不值得投入的技术上。现在新入行的码农想找一个能20年不担心饭碗的语言和技术平台已经很难了。
zhh-4096
2019-11-15 00:00:00 发布
今年除了不久前大boss提到区块链火了一阵外,其他都相对比较平静了。web前端也没有新的框架来挑战三座大山,AI领域也逐渐降温,大数据领域更是凄惨,Java这边依然无惊无喜,Golang那边的布道师们没啥话题吵了翻来覆去聊泛型,node.js除了给前端当工具用之外,还有沙雕要去用node.js统一大后端吗?!
zhh-4096
2019-11-15 00:00:00 发布
我接下来的两个目标: 1. 在后续的3+个月继续增强Lealone数据库的稳定性,在单机和分布式OLTP场景中,不管是易用性还是性能,都要把MySQL和TiDB甩出一大截,而且全开源;2. 继续投入Bats这个大一统SQL引擎,要在OLAP和批处理场景中跟PostgreSQL和其他SQL on Hadoop方案一决高下。 Lealone + Bats 将实现我的大一统梦想,实现数据库和大数据的统一。
zhh-4096
2019-11-15 00:00:00 发布
我的Lealone数据库终于发布第一个RC版了 网页链接 顺便写了一个简短但是图文并茂的使用文档: 网页链接 体验过后,看看易用性是不是直接秒杀MySQL的复制集群使用方式,并且秒杀落后的MySQL分库分表中间件。
zhh-4096
2019-11-14 00:00:00 发布
基于事件循环的并发模型太容易产生死锁了,今天又碰到了一个,需要非常小心确保事件循环线程运行的所有代码没有同步等待。对于js这种天生没有同步的语言基于事件循环来做烦恼没这么多,对于java这类遍地是同步的语言就要非常谨慎了。当然,这跟用不用协程没有关系,基于jvm的语言都要面临相同的问题。
zhh-4096
2019-11-14 00:00:00 发布
Lealone数据库的所有文档已经全部转移到这里了: 网页链接 接下来会逐渐增多。还把N年前两篇分布式事务的老文档也重新上传了,就当是了解最初的想法吧: 网页链接 网页链接
zhh-4096
2019-11-13 18:06:29 发布
windows下的bat脚本,如果参数中包含等号,为啥不能识别。比如我想在-url参数后面跟一个带等号的jdbc连接字符串就不行,用单引号或双引号都没用。
zhh-4096
2019-11-12 00:00:00 发布
如何评价开源数据库lealone的分布式事务模型?
4年前的回帖,虽然很老了,不保密了,撤销删除。Lealone 5.0将全部开源,6.0再想别的技术创新卖点。
zhh-4096
2019-11-12 00:00:00 发布
chrome这个辣鸡辣鸡辣鸡浏览器,我已经试了不少于5种办法了,都没有办法让它别启动software_reporter_tool,每次都搞好几个进程出来,在那里猛耗我的cpu,其他啥都干不了,每次都得手工结束。改manifest.json的allow-reporter-logs参数也没用。辣鸡chrome!
zhh-4096
2019-11-10 16:06:31 发布
网页链接 今天看到Firebird这个陌生的名字,数据库的排名还挺高,查看了一下历史,原来是那个死去的Borland公司的InterBase,都快20年了还活者,还在开发新版本,当年我用 Delphi 时是用过InterBase的。
zhh-4096
2019-11-10 16:06:31 发布
网页链接 某国内数据库还得在国外多宣传,光是国内火没什么用呢,流行度比CockroachDB还差20多个名次。更没有超过三大Java开源关系数据库: Derby、HyperSQL、H2。
zhh-4096
2019-11-10 16:07:34 发布
C++/Go/Rust那边做数据库的国内同行我觉得还是底气不太够,如果开源的关系数据库或NoSQL产品的代码都很精通了,并且自己做的产品确实比开源的牛掰很多,直接怼就完了。像我这边是Java的,我也精通H2数据库啊,我就敢说我的Lealone比H2强太多了,甚至不谦虚地说,Lealone是最先进的Java开源关系数据库。
zhh-4096
2019-11-10 15:06:31 发布
这周才关注搜狗的股票,市值居然这么低,输入法、搜索、AI全做,要说业务广度和技术难度比做个MongoDB高多了,但是后者的市值是搜狗的3+倍。从技术人员的角度看可能不服,但是投资人和股民也许不看重这些。这两者的对比也让我多思考一些技术以外的东西,MongoDB这家公司营销远比技术做得好。
zhh-4096
2019-11-10 14:06:34 发布
数据库异步化已经是大势所趋,只是MySQL和PostgreSQL社区没跟上时代,原本异步化的数据库客户端是数据库厂商的事,但是没上心,现在变成应用层(框架开发者们)按协议开发自己的异步客户端了,每一家的API又不统一,又回到JDBC之前那种混乱的状态,连vert.x自己都提供了两套异步SQL API。
zhh-4096
2019-11-10 11:06:34 发布
vert.x 3.8 已经支持异步访问PostgreSQL和MySQL了 网页链接 网页链接 我简单翻了一下代码,网络框架用的是netty,然后从头用异步的方式实现PostgreSQL和MySQL的客户端协议,不过,不是在JDBC的基础上扩展的,而是用另一套API,并且不依赖PostgreSQL和MySQL的JDBC驱动。
zhh-4096
2019-11-10 11:06:34 发布
一年没关注vert.x就变到4.0了 网页链接 变化好块,我还在用3.5.1,先熟悉一下最新版本,然后跟我的数据库再深度集成一下,先做第一个应用项目。
zhh-4096
2019-11-10 02:06:34 发布
微软的数据库产品喜好大集成,SQL Server从关系数据库开始扩展到OLAP、图数据库,然后再集成hadoop/spark玩大数据处理;Cosmos DB更是个大杂烩,流行的几大开源的NoSQL产品的api和协议都尽可能支持了。所以小公司还是得做有特色的垂直领域的产品有活路一些,还好我做的跟微软这两大产品有巨大差别。
zhh-4096
2019-11-09 00:00:00 发布
SQL Server 这个微软的数据库都快被我遗忘了,都已经连发了2017和2019两个版本了,刚粗略读完了两篇 网页链接 网页链接 基本上在搞大集成了,两个大版本没什么太让人兴奋的点。之前看微软一篇论文提到能加快恢复的速度倒是多看了几眼,数据库基础领域乏善可陈。
zhh-4096
2019-11-09 00:00:00 发布
在db-engines网站看了一下,我的Lealone是少有的原生支持嵌入模式、client-server模式、复制集群模式、sharding集群模式的关系数据库了。这也算得上是设计层面的创新。
zhh-4096
2019-11-09 00:00:00 发布
Lealone也有一个集成sqlline 网页链接 的插件,如果喜欢带颜色的sql客户端,就可以用sqlline插件。默认不带这个插件。
zhh-4096
2019-11-09 00:00:00 发布
网页链接 一起床就加了个小功能,现在数据库的使用体验已经极简了,下一个不到3M的包,解压,数据库都不用启动,一条命令就能用嵌入式的方式体验了: sqlshell -url jdbc
:lealone:embed:test -user root 浏览器的方案,你还不得启动耗内存的chrome,然后再下个10几M的包,启动要几秒。
zhh-4096
2019-11-09 00:00:00 发布
睡觉,周末好好加班,过去5天大多数时间都浪费在杂事上了,只提交了两次代码。还是有个团队好,一个人做数据库只适合做核心的东西,并打好大的框架,工程细节类的太耗时间了,得有人做,如果只有一个人,其他杂事一多,就没法安静地写代码,产品进度就受到影响。
zhh-4096
2019-11-06 00:00:00 发布
跟数据库沾点边的,从前端到后端,从数据库到大数据,从单机到分布式,甚至跟应用相关的连接池、ORM框架、应用服务器集成,你都能从我这三个项目找到对应的或深或浅的玩法:网页链接
zhh-4096
2019-11-06 00:00:00 发布
某公司办的Hackathon也在尝试把数据库放浏览器跑,我去年也在折腾类似的事,结论是用处不大。一方面是浏览器可用内存和硬盘空间都很有限,另一方面基本上是个阉割版,再者浏览器厂商内嵌SQLite的方案都没能搞起来,而且一些用js写的数据库也没啥应用场景。所以,最后还不如弄个前端ORM框架实在。
zhh-4096
2019-11-06 00:00:00 发布
在同一个事务中对同一条记录更新了多次,内部实现不能进行过早的优化,比如为了省内存用链表实现undo log时只保留了此记录最新修改的版本,这样就不能实现rollback到保存点的功能了。
zhh-4096
2019-11-05 22:06:39 发布
全中国数据库主流圈子的名单 网页链接 听过的不足10个,并且这其中还多是阿里的。我这类简直就是非主流中的非主流了。[允悲]
zhh-4096
2019-11-05 14:06:52 发布
办点小事就浪费了一天多时间,所以那种应酬多开会多的CEO/CTO是不太可能再专心撸代码的,我也是今年没接任何应用项目才有大半年的时间宅在房里撸撸代码。
zhh-4096
2019-11-05 01:06:57 发布
如果你对SQL引擎感兴趣,那么你不应该跳到OLTP领域,而是赶紧往OLAP跑。在我没有做Bats大一统SQL引擎前我也是认为PostgreSQL的SQL引擎是最好的,现在再翻看PostgreSQL内核的书讲SQL引擎的实现才发现糟糕得很,可扩展性比calcite差得不只一星半点。OLTP最难也是最有趣的是并发控制和工业级的btree实现。
zhh-4096
2019-11-05 00:06:57 发布
刚看到一篇VLDB 2019的论文 网页链接 看了ABSTRACT就迫不及待想发一条微博了。 看来学术圈也在努力思考怎么统一处理分布式事务和副本强一致性问题了,我又提前几年走在了前面了,就如我在别人的这篇文章中所说的那样 Snapshot Isolation综述 统一是迟早的,就看啥时普及而已。
zhh-4096
2019-11-04 20:06:57 发布
如果使用跟MVCC类似的多版本技术来实现可重复读是很浪费内存的,特别是并发事务很多时(包括只包含查询的事务),如果更老的事务一直没结束,就算同一条记录被不同事务更新了一千次了,最坏时也得保留一千个版本,最后还得处理老版本的GC问题。所以事务隔离级别默认设置成“读已提交”最合适。
zhh-4096
2019-11-03 00:00:00 发布
网页链接 看到这个回答的最后,差点吓尿了。还好我创业不要风投的钱,也不借钱,现在即便专心做数据库也不拖累其他任何人。否则的话,要是明年这数据库产品不卖钱欠一身债的话,想卖艺20年还账都没机会。创业还是挺凶险的,还好我走了一条几乎零风险的路。
zhh-4096
2019-11-03 00:00:00 发布
不管是做Rust的人跑去国内某数据库创业公司,还是做OS的人抄cassandra做ScyllaDB,就如我以前所说,程序语言和OS跟DB是不同的领域,其他领域你再有经验,DB是小白的话,短期内也难搞出什么名堂的。

ScyllaDB的快也是在OS层面用了非常规的东西,也不属于DB领域的创新,只能疲于抄别人的特性,再加上用了不是OS层面的大众技术,再配上C++这种容易翻船的语言,想替换cassandra简直太难了,都过去四五年了,也动摇不了cassandra啊。
zhh-4096
2019-11-03 00:00:00 发布
前两天看到PostgreSQL的SSI(Serializable Snapshot Isolation)我心想说怎么有点眼熟,早上在电脑上搜论文果真找到了,我2015年还在微博提到过,链接都记下来了 网页链接 是Michael James Cahill 2009年的博士论文。一个小领域,足足写了130多页的pdf论文!
zhh-4096
2019-11-02 00:00:00 发布
被Java并发库的ConcurrentHashMap坑了一下,IDE有时给的智能提示容易手误,原本要调containsKey的,结果不小心选了contains方法,差别大了去了!!!一看javadoc才发现contains是个遗留方法,实际上等价于containsValue,但是这个遗留方法居然没加Deprecated……赶紧搜了一下整个项目,还好只有一处!
zhh-4096
2019-11-01 00:00:00 发布
网页链接 果真看到有人提MySQL这个费解的问题了,我的合理猜测是,要避免幻读,只需要InnoDB的MVCC功能就够了,用不到间隙锁;

这个间隙锁只用于带where条件更新的时候锁住一个范围避免在update时有新的事务在这个范围内新增记录,这只是它自身的功能,不是SQL标准,H2数据库和我做的数据库目前都不支持这种间隙锁的功能,用处太有限。
zhh-4096
2019-11-01 00:05:33 发布
我看到一个网友经常提到PostgreSQL有Common Table Expressions & Recursive Queries,然后MySQL好晚才支持,所以经常拿MySQL开刀。怎么讲呢,这个功能在互联网应用比较少用而已,我做了那么多应用也没正儿八经用过这功能,MySQL堆功能不积极,比较实用范。

但是这功能难不难实现呢,不难啊,H2数据库和我的Lealone在N年前就有了,我也只是在单元测试代码中用过。见 网页链接 搜索WITH RECURSIVE

类似这种事,我就认为是体力活而已,我不太热衷做这种事,也不喜欢谈论这方面的问题,因为没什么技术含量,普通人用得也不多。
zhh-4096
2019-10-31 21:06:27 发布
我有一个做性能测试不合大众直觉的结论:在客户端观测到的结果是不科学的,低并发时测得的结果充其量只是在测整个调用链路的时间消耗,并且单一客户端是无法模拟高并发场景的,要看数据库的性能好坏还得看后端的吞吐量和平均响应时间。
zhh-4096
2019-10-31 20:06:27 发布
同一个客户端,开多条TCP连接跟只开一条TCP连接猛发,哪个更快?跑在同一个OS之上的不同JVM进程都是会调用同一个send方法的,比如windows就是WSASend,所以走到OS那一层就是走独木桥了,Java NIO并没有消息缓存队列,还是得靠应用层做的,想批量发,还得靠应用层做消息合并,少调OS的send。
zhh-4096
2019-10-31 19:06:27 发布
除非语言层面有类似协程的东西,否则我是不太乐意在应用层写异步代码的。但是我这里说的数据库异步化跟应用关系不大,数据库是一个非常独立的后端服务,自成一体的。异步JDBC只是数据库异步化很小的一部分,如果用异步JDBC还是推荐配合协程一起用,或者有框架封装好了,否则还是用同步JDBC更容易维护。
zhh-4096
2019-10-31 18:06:27 发布
目前Bats 网页链接 这个我花了8个多月研究与开发的大一统SQL引擎还远没有满足我的期望,受drill和calcite的约束,没办法放飞自我,设计得太复杂了,我希望在下一个6.0版本中能有更好的思路。Lealone + Bats 就是我的终极目标,横跨数据库(含OLTP和OLAP)、大数据两个领域,实现真正的大一统。
zhh-4096
2019-10-31 17:06:27 发布
我已经开源的Lealone数据库: 网页链接 对数据库圈子独一无二的两个重量级贡献,一个是用统一的线程池(调度器)做全链路异步化,这个比较好抄,只是工程量大而已;另一个就是异步并行化lock-free btree了,这个就不好抄了,在H2 MVStoe或InnoDB、RocksDB上面实现少说也得重写一半的代码。

zhh-4096

自言自语之地,现在是微博V2.0,微博V1.0是:2010年7月29日-2017年11月16日

0 1920 666
关注粉丝微博