Joey
Joey
## 前言 LevelDB是Google出品的具有读写高性能的存储引擎,其没有采用传统的B+ Tree(MySQL InnoDB)的存储模型,而是使用了LSM(Log Structure Merge-Tree)。LSM模型中的一个重要组成就是称作SSTable(Sorted String Table)的结构。本文先简单介绍LSM中使用的几种结构,然后着重介绍在众多Compaction算法中的Leveled-Compaction。 ## LSM LSM是通过将磁盘的随机写改为顺序写来提高写的性能,核心思想是把数据的添加或修改放到内存中,当内存中数据达到一定size后,然后dump(也就是变成了顺序写)到磁盘中。LSM中有MemTable、ImmutableMemTable、SSTable等几个概念,下面分别介绍 ### MemTable MemTable在内存中,记录最近修改的数据。一般其内部使用SkipList结构存储按key排序后的有序数据,当其存储的数据达到一定size后,就变成ImmutableMemTable,同时新建一个新的MemTable;后续的数据修改操作均在新的MemTable内进行。 ### ImmutableMemTable ImmutableMemTable就是只读不写的MemTable,它与MemTable一起保证的写操作无锁化。其内部的数据是有序的,所以dump到磁盘时保证了高效的顺序写,形成了新的SSTable文件。 ### SSTable SSTable内存储的是一系列的有序键值对,形式如下图所示。当SSTable文件较大时,为了提高读的性能,也可以生成key-offset索引,此索引一般都记录在内存中。 ## SSTable Compaction 由于不断有ImmutableMemTable会dump到磁盘中成为新的SSTable文件,所以SSTable文件的数量会逐渐增多,其内部存储的数据也会产生很多过期数据(key的旧数据),所以需要对SSTable文件进行定期Compaction,一方面减少SSTable文件的数量,同时也删除过期的数据。 SSTable Compaction有多种算法,比如Cassandra默认的基于文件大小的Size-Tired Compaction、基于时间序列的Date-Tiered Compaction,以及Leveled Compaction。...
### Job summary The CS2C Innovation Center team is looking for several experienced developers to join us in Beijing and Zhengzhou, China. In this roll, you will be engaged in...
# 说明 本文以 FAQ 的形式,介绍如何基于 micro 微服务框架,以及其为 go 提供的 go-micro 库构建微服务系统。 # FAQ ## Q:micro 提供了什么 micro 框架基于 go 语言实现,其是一个微服务的 ecosystem,提供了多个组件: * API:位于 [micro/api](https://github.com/micro/micro/api) 下,可以作为微服务系统中的 API 网关,其提供了自动将 HTTP PATH 的访问转换为对应...
## 前言 flask是Python众多web框架中的一个,相比于django,flask是一个micro web framework,学习成本低,易上手。同时flask extension设计得非常方便,flask生态圈比较完善。sqlalchemy也是老牌的python ORM框架,其内置的events注册机制,可以灵活实现各种功能。flask-sqlalchemy则利用了flask和sqlalchemy易于扩展的优点,在flask中对sqlalchemy做了封装,为flask使用者节省了不少时间,少写代码,简化逻辑。本文对flask-sqlalchemy进行简单介绍。 ## flask-sqlalchemy在sqlalchemy基础上封装了什么 - db.query扩展了sqlalchemy.orm.query.Query,增加了get_or_404、first_or_404和paginate函数 - flask-sqlalchemy中的SQLAlchemy类,附加了sqlalchemy和sqlalchemy.orm中的所有属性/- 函数,所有比如db.Column。并把db.relatetionship/relation等属性设置为sqlalchemy的relati- on的扩展。【见flask-sqlalchemy文件init.py中的_include_sqlalchemy函数】 - flask-sqlalchemy中的db.session其实就是sqlalchemy中的scope_session,适配flask的reque- st/response server的特点 - flask-sqlalchemy中把sqlalchemy的session与flask的signal注册在一起【flask - signal主要是connection和send,实现为signal register callback函数】 - flask-sqlalchemy其实就是使用flask extension实现的一个扩展 ## 了解一下sqlalchemy的event注册方式...
## 写在前面 上一篇[【Envoy.EP1】](https://github.com/imjoey/blog/issues/29) 介绍了如何使用`filesystem`和`runtime对象` 来实现 Envoy 的动态配置。但生产环境下,要配置的 Envoy 实例很多而且配置也更复杂,`filesystem` 就无法满足需求了;同时 Envoy 支持对接外部的配置服务(基于 RESTful 接口),所以这篇文章继续探究更方便的、可用于生产环境的 Envoy 的动态配置方式 --- xDS。 > 本文源于官方文档[Dynamic configuration](https://www.envoyproxy.io/docs/envoy/latest/intro/arch_overview/dynamic_configuration.html?highlight=rds)翻译和整理而来。 ## xDS xDS 是一类发现服务的统称,其包括如下几类: * SDS/EDS: Service/Endpoint(v2) Discovery Service...
## 写在前面 本文主要以 Envoy 官方 Examples 来介绍如何部署Envoy,并详细解释各配置项。 ## Envoy 的编译和安装 官方提供了两种编译方式的指导: * 使用 Envoy 官方提供的具有完整Envoy 编译环境的 Container,详见[指导文档](https://github.com/envoyproxy/envoy/blob/master/ci/README.md)。 * 完全自行编译,详见[指导文档](https://github.com/envoyproxy/envoy/blob/master/bazel/README.md)。 同时官方也提供了已经编译好的 docker 镜像。 * [envoyproxy/envoy](https://hub.docker.com/r/envoyproxy/envoy/tags/): Release binary with symbols stripped on...
## 写在前面 近期一直在学习 Service Mesh,接下来将通过写一些文章巩固知识。计划分成以下章节: 1. Service Mesh介绍 2. Envoy 介绍 3. [初战 Envoy](https://github.com/imjoey/blog/issues/26) 3.1. [【Envoy.EP1】如何使用 filesystem 动态配置 Envoy](https://github.com/imjoey/blog/issues/29) 3.2.[【Envoy.EP2】如何使用 xDS 动态配置 Envoy](https://github.com/imjoey/blog/issues/30) 4. Istio 介绍 5. 初战 Istio
## 写在前面 本文详细介绍如何基于 `filesystem` 和借助 `runtime` 对象实现 Envoy 的动态配置。 > 这里吐槽一下 Envoy 的官方文档,runtime 这块儿介绍的很模糊,我尝试了很久才成功。 ^_^ > 注:本文中均以 Data-Plane API v1 版本来介绍。 ## 如何开启全局 runtime configuration 在介绍开启方法前,需要先明确两点: 1. Envoy 中有很多配置项都有 runtime...
> 此文暂时是攒出来的,快糙猛的认识 Zipkin,后续会整理。 ## Zipkin 的架构 Zipkin主要包括四个模块 * Collector 接收或收集各应用传输的数据 * Storage 存储接受或收集过来的数据,当前支持Memory,MySQL,Cassandra,ElasticSearch等,默认存储在内存中。 * API(Query) 负责查询Storage中存储的数据,提供简单的JSON API获取数据,主要提供给web UI使用 * Web 提供简单的web界面 ## Zipkin 的几个基本概念 * Span:基本工作单元,一次链路调用(可以是RPC,DB等没有特定的限制)创建一个span,通过一个64位ID标识它, span通过还有其他的数据,例如描述信息,时间戳,key-value对的(Annotation)tag信息,parent-id等,其中parent-id 可以表示span调用链路来源,通俗的理解span就是一次请求信息 * Trace:类似于树结构的Span集合,表示一条调用链路,存在唯一标识,即TraceId...
# 写在前面 本文是转载[原文](https://github.com/grpc/grpc-go/blob/master/Documentation/grpc-metadata.md)而来。 在 gRPC 中自定义 metadata 可用于传输定制数据,如可添加 `X-B3-****` 用于分布式调用追踪系统 Zipkin 等。 # Metadata gRPC supports sending metadata between client and server. This doc shows how to send and receive...