从MySQL InnoDB物理文件格式深入理解索引

1. InnoDB物理文件的基本结构

InnoDB的物理文件有很多种,包括:
 
1)系统表空间(system tablespace)。文件以ibdata1、ibdata2等命名,包括元数据数据字典(表、列、索引等)、double write buffer、插入缓冲索引页(change buffer)、系统事务信息(sys_trx)、默认包含undo回滚段(rollback segment)。
2)用户表空间。innodb_file_per_table=true时,一个表对应一个独立的文件,文件以db_name/table_name.ibd命名。行存储在这类文件。另外还有5.[……]

继续阅读

从服务和存储角度看异地多活的高可用架构

1. 前言

互联网公司的分布式系统要对外提供可靠的服务,一般都会有一套高可用的架构,在CAP理论下,分区容忍性往往是不能舍弃的,所以对于系统可用性(Availability)、数据一致性(Consistency)的容忍程度,决定了能提供什么样的服务等级。简单的系统部署在单地域单机房,但是大型互联网公司,一般都不采用这样的单点架构,从同城双活到异地灾备,再到异地多活。Google在2015所发表的一篇论文《High-Availability at Massive Scale: Building Google’s Data Infrastructure for Ads》也介绍了类似的[……]

继续阅读

广告系统的平台架构与交互流程

商业化是互联网产品常用的流量变现手段,商业化平台(广告平台)其核心是围绕客户(商家、广告主等),用户(网民、用户产品使用者),平台三者展开的商业活动。在业界比较大的广告平台包括:百度凤巢,腾讯广点通,阿里妈妈,头条巨量等。
 
这些广告平台面向的业务领域大体相同,都在计算广告学的范畴内,不管是展示广告、效果广告、信息流广告,还是CPT、CPM、CPC模式,也不管是竞价RTB还是合约广告,其系统架构上必然有很多共性,本文就尝试抽象一种通用的广告系统架构,从工程角度阐述其模块构成,从模块交互流转角度介绍主业务流程。
 
下文提到的每一个模块都可以展开为一个超大的工程或者[……]

继续阅读

阿里云第一届PolarDB数据库性能大赛Java排名第一分享

参加天池大赛-阿里云第一届PolarDB数据库性能大赛,比赛以NVME Optane SSD为背景,在此之上开发单机存储引擎比拼性能,支持C++和Java语言。我的完赛成绩是Java语言排名第一,总排名20(共1653人参赛,队伍名称:neoremind),与C++第一差距在2.1%(<9s)。众所周知,类似的系统如果想榨干硬件,那么越贴近底层越好,Java存在一些天然的劣势,但是作为这么多年的资深JAVAer,还是想挑战一把。

本文是解题报告,源码地址https://github.com/neoremind/2018-polar-race,其中的架构设计是通用的,只是实现语言是Jav[……]

继续阅读

消息队列技术点梳理(思维导图版)

消息队列作为服务/应用之间的通信中间件,可以起到业务耦合、广播消息、保证最终一致性以及错峰流控(克服短板瓶颈)等作用。本文不打算详细深入讲解消息队列,而是体系化的梳理消息队列可能涉及的技术点,起到提纲挈领的作用,构造一个宏观的概念,使用思维导图梳理。
 
再介绍之前,先简短比较下RPC和消息队列。RPC大多属于请求-应答模式,也包括越来越多响应式范式,对于需要点对点交互、强事务保证和延迟敏感的服务/应用之间的通信,RPC是优于消息队列的。那么消息队列(下文也简称MQ,即Message Queue)可以看做是一种异步RPC,把一次RPC变为两次,进行内容转存,再在合适的时机投递出去[……]

继续阅读

Nesto – Hulu用户分析平台的OLAP引擎

本文主要介绍Hulu用户分析平台使用的OLAP引擎——Nesto(Nested Store),是一个提供近实时数据导入,嵌套结构、TB级数据量、秒级查询延迟的分布式OLAP解决方案,包括一个交互式查询引擎和数据处理基础设施。

 

1. 项目背景

Nesto起源于用户分析团队,业务上需要一个面向用户、分析型的产品,提供任意维度的Ad-Hoc交互式查询、导出数据,供运营、产品、第三方数据公司使用。
 
一个典型场景是:导出2018年1月看过《冰与火之歌》第7季第7集(S7E7)超过5次的新注册用户,包括用户名、email两个域,用于发送营销[……]

继续阅读

使用火焰图做性能分析

系统性能的评估维度可能很多,包括应用的吞吐量、响应时间、任务完成时间和资源利用率等。但是这些指标(metrics)仅仅是表象,一旦发现异常,如何从代码级别定位性能问题才是解决问题的关键,本文介绍了一种使用火焰图(Flame Graph)来做性能分析的方法,在实战中具备很高的可操作性和快速pinpoint问题的能力。

下面按照1. 发现问题,2. 分析问题,3. 解决问题三个章节展开,最后是4. Lesson Learned。

 

1. 发现问题

最近公司完成大数据集群的迁移,应用大多是Spark开发的,但是仍然存在一个老的每日运行的Hadoop任务突然发现指标异常,主要体现在[……]

继续阅读

浅谈从Google Mesa到百度PALO

最近在研究OLAP相关的技术,正好看到Google 2014年的论文《Mesa: Geo-Replicated, Near RealTime, Scalable Data Warehousing》,以及百度最近2017年开源的基于Mesa+Impala的实现系统PALO,本篇就尝试结合起来看下二者,主要是学习介绍性质的文章。
 

1. Mesa

Mesa是一个Google内部使用的数据仓库系统,从论文的标题可以抓住几个关键词:可实现跨DC复制的、近实时的、可扩展的。这几点算是Mesa的特色所在,同时和Mesa要解决的问题背景有很大关系,Mesa主要解决Google在线广告报表和[……]

继续阅读

JAVA并发编程实战笔记

第二次认真读了Doug Lea的Java Concurrency In Practice这本大作,记录笔记在此链接

[……]

继续阅读

Easy-mapper – 一个灵活可扩展的高性能Bean mapping类库

1 背景

做Java开发都避免不了和各种Bean打交道,包括POJO、BO、VO、PO、DTO等,而Java的应用非常讲究分层的架构,因此就会存在对象在各个层次之间作为参数或者输出传递的过程,这里转换的工作往往非常繁琐。
 
这里举个例子,做过Java的都会深有体会,下面代码的set/get看起来不那么优雅 🙁
ElementConf ef = new ElementConf();
ef.setTplConfId(tplConfModel.getTplConfIdKey());
ef.setTemplateId(tplConfModel.getTemplateId[......]

从JVM说起到初探Scala应用实践

最近在公司组内分享了一次关于JVM、Scala以及Spark介绍性质浅析的议题,这种形式的分享可以鞭策自己主动、自驱的完成一些既定目标,还能和有经验的人士一起交流,共享与学习是每一个做技术的同胞都应该拥抱的价值观。

PPT见连接,请点此

[……]

继续阅读

大塞车游戏活动的算法解

最近在公司组织的培训上,遇到了一个很有意思的算法题,这篇文章就借这个为题提供一个解。

解的代码用Java实现,并配有演示,已经放到了github上https://github.com/neoremind/big-traffic-jam-solver
 
首先感谢李培英老师,《职业化研讨》这门课非常值得公司内的一线管理人员去学习。在讲到职业化内涵里的“规则意识”一节时,让大家做了一个简单的大塞车游戏,规则如下:
 
1、邀请10人以上的学员(注意是偶数,当然越多越好),列成两队,面对面的坐在椅子上。
2、中间叫做“鸿沟&rdq[……]

继续阅读

Flume+Kafka收集Docker容器内分布式日志应用实践

1 背景和问题

随着云计算、PaaS平台的普及,虚拟化、容器化等技术的应用,例如Docker等技术,越来越多的服务会部署在云端。通常,我们需要需要获取日志,来进行监控、分析、预测、统计等工作,但是云端的服务不是物理的固定资源,日志获取的难度增加了,以往可以SSH登陆的或者FTP获取的,现在可不那么容易获得,但这又是工程师迫切需要的,最典型的场景便是:上线过程中,一切都在GUI化的PaaS平台点点鼠标完成,但是我们需要结合tail -F、grep等命令来观察日志,判断是否上线成功。当然这是一种情况,完善的PaaS平台会为我们完成这个工作,但是还有非常多的ad-hoc的需求,PaaS平台无法满足[……]

继续阅读

使用Scala开发一个DSL来做远程调用

问题背景

最近在实施微服务化过程中,发现了一类潜在需求(这就是传说中开发者的敏锐嗅觉=_ =?):

如何快速的来进行远程RPC调用,来进行测试、排查问题?

服务调用方式有两种形式,如下图所示。
第一种,传统的方式,服务provider提供SDK,服务consumer在构建环境中引入SDK依赖,并且配置IP:PORT,直连调用。
 
第二种,改进的方式,服务provider通过平台治理中心来生成SDK,实际就是将API的接口和签名、类定义信息进行统一的schema描述(可以使用proto)后,由平台负责生成SDK,服务consumer可以通过契约schema的方式、[……]

继续阅读

Java的业务逻辑验证框架fluent-validator

1 背景

在互联网行业中,基于Java开发的业务类系统,不管是服务端还是客户端,业务逻辑代码的更新往往是非常频繁的,这源于功能的快速迭代特性。在一般公司内部,特别是使用Java web技术构建的平台中,不管是基于模块化还是服务化的,业务逻辑都会相对复杂。

这些系统之间、系统内部往往存在大量的API接口,这些接口一般都需要对入参(输入参数的简称)做校验,以保证:
1) 核心业务逻辑能够顺利按照预期执行。
2) 数据能够正常存取。
3) 数据安全性。包括符合约束以及限制,有访问权限控制以及不出现SQL注入等问题。

开发人员在维护核心业务逻辑的同时,还需要为输入做严格的校验。当输入不合法[……]

继续阅读