0%

之前对 G1 之前的垃圾回收器进行了整理《JVM 垃圾回收器小记》,但是留下了 G1 的坑长久未填,现在把相关的概念、配置参数以及 G1 的流程进行了整理。

基本概念

Region

不同于之前的垃圾回收按照连续的物理内存空间进行划分产生 Yong、Tenured、MetaSpace 区域并使用分代垃圾回收处理。G1 将整个堆空间切分成若干个小型的区域 Region 来存放对象,每个 Region 可以单独作为 YongTenured 或者 Humongous(大对象分配区域),这使得不同代的内存区域在物理上是可以割裂的。

阅读全文 »

通过 spring-kafka 的集成,我们可以通过注解 @KafkaListener 以及 spring.kafka.consumer 相关配置轻松的管理 kafka 消费。但是消费速度往往仍然不够理想,需要进一步调整。

在 kafka 的实现中,某个 topic 的 partition 即分区的数量,基本上决定在这个 topic 下的最大并发程度。因为客户端的数量是受限于 partition 数量的。对于一定数量的 partition 而言,客户端数量如果更少,将有部分客户端会被分配上多个分区;如果客户端数量更多,超过 partition 数量的客户端将会无法消费,这是由 kafka 本身的负载均衡策略决定的。
尽管我们可以动态地调整 partition,但是对于基于 Key 的消息,并需要有序消费时,由于 kafka 通过 Key 进行 hash 分片,更改 partition 数量将无法保证有序性。

阅读全文 »

能力各异的垃圾回收器

Serial

Serial 收集器是一个新生代串行垃圾回收器,单线程执行,使用复制算法,整个流程会 STW。在单核环境下可能会不存在线程切换的问题而有略高的效率。也是之前 client 模式下的默认垃圾回收器。

ParNew

ParNew 收集器是一个新生代并行垃圾回收器,多线程执行,使用复制算法,整个流程会 STW。除了使用多个线程进行垃圾回收之外,其余和 Serial 一致。

阅读全文 »

最近工作也比较忙,很久没有写新的日记了。开始重新整理一下知识点,先找一个有意思点开始吧。

复制原理

这个原理其实十分简单,只要搜索一下,那些搜索引擎就会给出图示和合理的答案:

  1. 主库开启二进制日志(或者叫主机日志)bin-log。这会使得数据库在更新时记录下它的操作动作。
  2. 从机开启 slave 模式,使用一个 IO 线程去请求 master 的数据,记录在中继日志 relay-log 中;master 方面有一个 dump 线程配合传输这份数据。
  3. 从机的另一个 SQL 线程读取中继日志内容并解析后执行相应的操作。

复制方案

通常的,我们做主从复制,不仅仅为了数据备份。同时会在从机上设置只读,对 MySQL 集群做读写分离,提高数据库的响(wu)应(jin)速(qi)度(yong),所以一般都采用了异步复制方案。主机采用完全独立的 dump 线程来传输 bin-log,备份完全异步化。

阅读全文 »

在 ES 中所有的字段都是由映射规则所控制,这将输入的数据信息转化成对应的数据格式来进行索引或保存。配置合理的映射规则有助于维护文档,增加操作效率。在了解映射相关配置之前需要了解一下 ES 的数据类型和元字段的意义。

字段类型

  • text
    文本类型,十分常用的类型,通常作用于需要被全文检索的字段上。这样的字段内容会被分词器拆成词项后生成倒排索引,它不用于排序,也很少用于聚合。
  • keyword
    关键字类型,通常用于索引结构化的字段(通常意义明确,用于过滤),这样的字段只能被精确搜索。
    阅读全文 »

分片路由

ES 在创建新文档时候时如何选择具体存储在哪个分片上?这就是一个文档分片路由的机制。ES 使用路由值(routing)的哈希散列进行分片的路由:index_of_shards = hash(routing) % num_of_shards

ES 查询请求过程

假设在一个多分片的 ES 进行查询,会有以下几个步骤:

  1. 请求被某个节点接受
  2. 接受请求的节点将该请求广播到所有节点
  3. 每个分片进行搜索,并返回
  4. 各个分片的结果在一个节点合并,排序,返回响应
阅读全文 »

创建文档

ES 提供了一套遵守 Restful 语义的接口,相关的操作可以通过不同的请求方法来进行调用,比如简单的新增可以使用 POST 请求或者 PUT 请求

1
2
3
4
5
6
7
8
9
10
11
12
# PUT 多次请求结果幂等,仅增加文档版本号,文档编号不可省略
PUT /<索引>/<类型>/<编号>
{
"字段A": "值A",
"字段B": "值B"
}
# POST 请求在版本号省略时,可以自动生成字符串文档编号
POST /<索引>/<类型>/[编号]
{
"字段A": "值A",
"字段B": "值B"
}
阅读全文 »

  • 初始化仓库
    1
    2
    3
    4
    # 初始化一个 git 仓库并且建立工作目录
    git init
    # 初始化一个干净的仓库,使用 bare 选项不带有工作目录,使用 shared 选项,提供组可写的权限
    git init --bare --shared
  • 克隆仓库
    1
    2
    # 在未指定协议的时候优先会采用 ssh
    git clone [地址]
  • 暂存文件
    将文件提交至暂存区(进入 staged 状态)
    1
    2
    3
    git add [路径]
    # 只暂存所有已经跟踪的文件,这通常可以减少多余文件的提交
    git add -u
    阅读全文 »

新建索引

新建索引很简单,但是需要注意的是:

  • ES 中索引名称不能包含大写字母
  • 不能再次 PUT 一个已经存在的索引
  • ES 默认给索引设置 5 个分片和 1 个副本,该值可以通过 setting 参数域进行修改。其中副本数在索引创建之后支持修改,而分片数无法修改!
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    PUT /person
    # 可选项,不附加请求体的情况下统一使用默认值
    {
    "settings": {
    # 分片数量
    "number_of_shards": 3,
    # 副本数量
    "number_of_replicas": 1
    }
    }
    阅读全文 »

在服务端进行消息过滤,可以减少不必要的流量,提高带宽利用度和吞吐量。
RocketMQ 支持多种方式来进行服务端的消息过滤

消息使用 Tag 标签

作为一条 Message,它有着特定的 Topic,同时也可以指定唯一的 Tag 标记子分类。消费方在订阅消息时候,Broker 可以在指定 Topic 的 ConsumeQueue 下按 Tag 进行过滤,只从 CommitLog 中取出 Tag 命中的消息。

阅读全文 »