再谈谈AlloyDB与众不同的地方

​昨天发了一篇关于AlloyDB的再谈众文章,有朋友给我留言,谈A同也有朋友通过微信做了一些交流,地方实际上AlloyDB到底能不能成功,再谈众能获得多大的谈A同成功还是个未知数。并且因为AlloyDB旨在GCP上提供,地方不提供云下版本,再谈众因此我也没办法真实的谈A同去体验AlloyDB,仅仅从发布会上及会后一些体验者的地方实验报告中获得一些特性方面的信息。只不过我觉得AlloyDB为云原生数据库提供了一个十分好的再谈众样板,在很多设计上都具有划时代意义的谈A同创新。如谷歌官方所说,地方AlloyDB关注的再谈众是未来及当下数据库用户的最大的关注点:高可扩展性、高性能、谈A同高可用性、地方易于管理、实时运维可观测性、AL/ML能力。

如上图所示,通过Intelligent Database Storage Engine,AlloyDB消除了数据库BLOCK的回写,服务器租用只剩下WAL WRITE。计算引擎只需要把WAL写入低延时日志存储层,那么事务提交就完成了。数据文件的落盘是异步的,通过LPS服务使用WAL来完成。这种设计参考了分布式消息中间件等的设计思路,以往采用此类实现的都是一些简单的系统,而谷歌把这种设计用到了十分复杂的数据库上。

消除块写,是充分利用现代硬件和云平台的高可扩展性和性能特点的一种设计。通过并行的LPS可以并发处理大量的WAL写入和BLOCK落盘,通过低延时的LOG STORE,可以快速的完成WAL落盘,避免引起数据库事务提交的性能问题。这也是AlloyDB不支持跨数据中心的主要原因(跨数据中心需要通过复制)。高防服务器昨天和朋友的交流中,也表示了对LOG STORE与计算节点分离后的性能问题的担忧,不过想想Oracle的Exadata,计算节点与存储节点之间也存在复杂的IO路径,只要能够优化好,实际上也是问题不大的。我们的传统数据库架构,从服务器到存储系统,也有很长的IO路径。

昨天大家比较关心的另外一个问题,如果计算引擎不写BLOCK了,那么是不是要等LPS完成日志数据重演,数据才能读取呢?实际上这个担心是不必要的,谷歌也意识到了AlloyDB的读取路径有点长,因此为了降低OLTP的延时,设计了一种多层缓冲机制的读取架构。源码库如果LPS还没有完成某个BLOCK的持久化写入,那么这个BLOCK相关的数据是在LPS BUFFER CACHE里缓存的,可以直接从LPS BUFFER CACHE里命中该数据(哪怕写入完成,如果该BLOCK还没有老化,那么在BUFFER CACHE中也可能命中),如果在此层命中,则访问效率会更高,因为LPS所在的设备的IO性能更好。

我觉得还是用昨天那张写入流程的图可以更为准确的描述写入操作。在WAL落盘的同时,WAL STREAM会被同步到只读节点,用于更新只读节点的BUFFER CACHE(与主节点的BUFFER CACHE同步)。为什么要这么做呢?对于基于“日志就是数据库”理念设计的读写分离共享存储数据库系统,只读节点与主节点之间并不是完全实时的,因为只有当BLOCK被写入后,从节点才能获取到最新的版本。在主节点缓冲区中暂时没有落盘的数据有可能没有提交就已经落盘,也有可能落盘后还没有提交。因此对从节点的一致性读造成了影响。去年的一篇分析PolarDB的架构的文章中,我也提出了这个问题,当时我也提出了可以采用缓冲区融合或者更为简化的方案来替代目前PolarDB仅仅依靠日志重演来实现主从同步的方案。

在那篇文章里,我也分析了PolarDB日志重演算法可能引发的一些读节点因为重演延时而导致的读最新数据的阻塞问题。

在那篇文章中,我也谈到了目前PolarDB采用的日志重演的方式存在的缺陷以及通过WAL STREAMS直接同步BUFFER CACHE的设想。在这里我就不多说了,大家有兴趣可以区翻阅一下。PolarDB设计了多种结构来避免重演存在的问题,设计也十分精巧,只不过还是没有脱离BLOCK持久化的惯性,因此每个从节点都需要独立的重演日志。AlloyDB在这方面的解决方案更加漂亮,AlloyDB的从节点不需要重演日志,因为日志重演变成了一个公共服务,不论主节点还是从节点,一个集群里只需要一次统一的持久化为目的的重演。

利用WAL STREAMS同步了BUFFER CACHE后,主从节点之间就没有任何数据延迟了。国内现在有些数据库厂商也都在搞类似Aurora的分布式数据库产品,AlloyDB是一个很好的学习榜样。我不太赞成数据库厂商去通过类似Oracle Cache fusion的方式来实现类似RAC的功能,因为这个太复杂了,DLM/GES/GCS等服务想要做好并不容易。而类似AlloyDB这种实现是很容易的,也能够满足绝大多数用户的需求。特别是云原生数据库,这种架构比CACHE FUSION为核心的RAC有更好的横向扩展能力。

昨天很多朋友对AlloyDB如何实现HTAP,实现分析类SQL 100倍的性能提升。也有一些朋友对100倍的性能提升提出了疑问,认为很难实现。AlloyDB的HTAP是通过实例内的列引擎实现的。行数据在内存中生成了列缓冲副本,这个实现方式十分类似于Oracle的in-memory db。

AlloyDB通过AI/ML引擎自动推荐列缓冲建议,用户可以使用自动或者手动方式来建立列缓冲。实际上,HTAP中的AP不仅仅是列缓冲就能解决的,列缓冲只能解决一部分问题,OLAP数据库产品有着更为复杂的索引与执行器优化机制。昨天一个朋友也质疑AlloyDB在AP上100倍的性能提升问题。我也仔细阅读了谷歌官网的文档,也认真看了一些体验者的实验。

谷歌的官方说明是具体提升的倍数是和应用场景相关的,他们目前也在通过进一步的优化,从而让各种场景都能有更大的性能提升。这说明100倍不是覆盖所有的场景。我看了一些案例,大多数是逻辑比较简单的超大表的查询或者全表扫描,分组统计,并没有特别复杂的多表关联。对于AlloyDB的理解我也还比较肤浅,只不过在多年的数据库应用经验中,我看到了一种全新的云原生数据库设计方案,我觉得我们的数据库架构师能够认真研究一下,应该是能从中学到不少好东西的。

应用开发
上一篇:七彩虹B85性能全面评测(一探七彩虹B85主板的卓越表现与可靠性能)
下一篇:大家好,本教程将学习如何在 ubuntu 15.04 上面安装 puppet,它可以用来管理你的服务器基础环境。puppet 是由 puppet 实验室Puppet Labs开发并维护的一款开源的配置管理软件,它能够帮我们自动化供给、配置和管理服务器的基础环境。不管我们管理的是几个服务器还是数以千计的计算机组成的业务报表体系,puppet 都能够使管理员从繁琐的手动配置调整中解放出来,腾出时间和精力去提系统的升整体效率。它能够确保所有自动化流程作业的一致性、可靠性以及稳定性。它让管理员和开发者更紧密的联系在一起,使开发者更容易产出付出设计良好、简洁清晰的代码。puppet 提供了配置管理和数据中心自动化的两个解决方案。这两个解决方案分别是 puppet 开源版 和 puppet 企业版。puppet 开源版以 Apache 2.0 许可证发布,它是一个非常灵活、可定制的解决方案,设置初衷是帮助管理员去完成那些重复性操作工作。pupprt 企业版是一个全平台复杂 IT 环境下的成熟解决方案,它除了拥有开源版本所有优势以外还有移动端 apps、只有商业版才有的加强支持,以及模块化和集成管理等。Puppet 使用 SSL 证书来认证主控服务器与代理节点之间的通信。本教程将要介绍如何在运行 ubuntu 15.04 的主控服务器和代理节点上面安装开源版的 puppet。在这里,我们用一台服务器做主控服务器master,管理和控制剩余的当作 puppet 代理节点agent node的服务器,这些代理节点将依据主控服务器来进行配置。在 ubuntu 15.04 只需要简单的几步就能安装配置好 puppet,用它来管理我们的服务器基础环境非常的方便。(LCTT 译注:puppet 采用 C/S 架构,所以必须有至少有一台作为服务器,其他作为客户端处理)复制代码代码如下:注意,puppet 主控服务器必使用 8140 端口来运行,所以请务必保证开启8140端口。2. 用 NTP 更新时间复制代码代码如下:17 Jun 00:17:08 ntpdate[882]: adjust time server 66.175.209.17 offset -0.001938 sec    复制代码代码如下:复制代码代码如下:下载完成,我们来安装它:复制代码代码如下:使用 apt 包管理命令更新一下本地的软件源:复制代码代码如下:现在我们就可以安装 puppetmaster-passenger 了复制代码代码如下:提示: 在安装的时候可能会报错:复制代码代码如下:现在我们已经安装好了 puppet 主控服务器。因为我们使用的是配合 apache 的 passenger,由 apache 来控制 puppet 主控服务器,当 apache 运行时 puppet 主控服务器才运行。在开始之前,我们需要通过停止 apache 服务来让 puppet 主控服务器停止运行。复制代码代码如下:复制代码代码如下:在新创建的文件里面添加以下内容:复制代码代码如下:这样在以后的系统软件升级中, puppet 主控服务器将不会跟随系统软件一起升级。5. 配置 Puppet 主控服务器复制代码代码如下:现在来配置该证书,在创建 puppet 主控服务器证书时,我们需要包括代理节点与主控服务器沟通所用的每个 DNS 名称。使用文本编辑器来修改服务器的配置文件 puppet.conf:复制代码代码如下:输出的结果像下面这样复制代码代码如下:在这我们需要注释掉 templatedir 这行使它失效。然后在文件的 [main] 小节的结尾添加下面的信息。复制代码代码如下:编辑完成后保存退出。使用下面的命令来生成一个新的证书。复制代码代码如下:至此,证书已经生成。一旦我们看到 Notice: Starting Puppet master version 3.8.1,就表明证书就已经制作好了。我们按下 CTRL-C 回到 shell 命令行。查看新生成证书的信息,可以使用下面的命令。复制代码代码如下:复制代码代码如下:在刚打开的文件里面添加下面这几行:复制代码代码如下:以上这几行的意思是给代理节点部署 apache web 服务。7. 运行 puppet 主控服务复制代码代码如下:我们 puppet 主控服务器已经运行,不过它还不能管理任何代理节点。现在我们给 puppet 主控服务器添加代理节点.提示: 假如报错Job for apache2.service failed. see systemctl status apache2.service and journalctl -xe for details.复制代码代码如下:使用 apt 包管理命令更新一下本地的软件源:复制代码代码如下:通过远程仓库安装:复制代码代码如下:Puppet 代理默认是不启动的。这里我们需要使用文本编辑器修改 /etc/default/puppet 文件,使它正常工作:复制代码代码如下:更改 START 的值改成 yes 。复制代码代码如下:最后保存并退出。9. 使用 Apt 工具锁定代理软件的版本复制代码代码如下:在新建的文件里面加入如下内容复制代码代码如下:这样 puppet 就不会随着系统软件升级而随意升级了。10. 配置 puppet 代理节点复制代码代码如下:它看起来和服务器的配置文件完全一样。同样注释掉 templatedir 这行。不同的是在这里我们需要删除掉所有关于[master] 的部分。假定主控服务器可以通过名字“puppet-master”访问,我们的客户端应该可以和它相互连接通信。假如不行的话,我们需要使用完整的主机域名 puppetmaster.example.com复制代码代码如下:在文件的结尾增加上面3行,增加之后文件内容像下面这样:复制代码代码如下:最后保存并退出。使用下面的命令来启动客户端软件:复制代码代码如下:假如一切顺利的话,我们不会看到命令行有任何输出。 第一次运行的时候,代理节点会生成一个 ssl 证书并且给服务器发送一个请求,经过签名确认后,两台机器就可以互相通信了。提示: 假如这是你添加的第一个代理节点,建议你在添加其他节点前先给这个证书签名。一旦能够通过并正常运行,回过头来再添加其他代理节点。11. 在主控服务器上对证书请求进行签名复制代码代码如下:因为只设置了一台代理节点服务器,所以我们将只看到一个请求。看起来类似如上,代理节点的完整域名即其主机名。注意有没有“+”号在前面,代表这个证书有没有被签名。使用带有主机名的 puppet cert sign 这个命令来签署这个签名请求,如下:复制代码代码如下:主控服务器现在可以通讯和控制它签名过的代理节点了。假如想签署所有的当前请求,可以使用 -all 选项,如下所示:复制代码代码如下:复制代码代码如下:假如我们想查看所有的签署和未签署的请求,使用下面这条命令:复制代码代码如下:复制代码代码如下:这里向我们展示了主清单如何立即影响到了一个单一的服务器。假如我们打算运行的 puppet 清单与主清单没有什么关联,我们可以简单使用 puppet apply 带上相应的清单文件的路径即可。它仅将清单应用到我们运行该清单的代理节点上。复制代码代码如下:复制代码代码如下:添加下面的内容进去复制代码代码如下:这里的配置显示我们将在名为 puppetnode 和 puppetnode1 的2个指定的节点上面安装 apache 服务。这里可以添加其他我们需要安装部署的具体节点进去。15. 配置清单模块复制代码代码如下:警告: 千万不要在一个已经部署 apache 环境的机器上面使用这个模块,否则它将清空你没有被 puppet 管理的 apache 配置。现在用文本编辑器来修改 site.pp :复制代码代码如下:添加下面的内容进去,在 puppetnode 上面安装 apache 服务。复制代码代码如下:保存退出。然后重新运行该清单来为我们的代理节点部署 apache 配置。总结现在我们已经成功的在 ubuntu 15.04 上面部署并运行 puppet 来管理代理节点服务器的基础运行环境。我们学习了 puppet 是如何工作的,编写清单文件,节点与主机间使用 ssl 证书认证的认证过程。使用 puppet 开源软件配置管理工具在众多的代理节点上来控制、管理和配置重复性任务是非常容易的。