0%

上篇 - 分布式唯一全局 ID 解决方案之一

1、UidGenerator 分布式 ID 生成器

1.1、概述

UidGenerator 是 Java 实现的,基于 Snowflake 算法的唯一 ID 生成器。UidGenerator 以组件形式工作在应用项目中, 支持自定义 workerId 位数和初始化策略, 从而适用于 Docker 等虚拟化环境下实例自动重启、漂移等场景。在实现上, UidGenerator 通过借用未来时间来解决 sequence 天然存在的并发限制;采用 RingBuffer 来缓存已生成的 UID, 并行化 UID 的生产和消费, 同时对 CacheLine 补齐,避免了由 RingBuffer 带来的硬件级「伪共享」问题。 最终单机 QPS 可达 600 万。依赖 Java8 及以上版本, MySQL (内置 WorkerID 分配器, 启动阶段通过数据库进行分配;如自定义实现,则数据库非必选依赖)。

1.2、结构

Snowflake 算法描述:指定机器 & 同一时刻 & 某一并发序列,是唯一的。据此可生成一个 64 bit 的唯一 ID(Long 型),默认采用下图字节分配方式:

uid-generate-1

  • sign(1bit):符号位,固定是 0,表示全部 ID 都是正整数
  • delta seconds (28 bits):当前时间,相对于时间基点 2016-05-20 的增量值,单位为秒,最多可支持约 8.7 年
  • worker id (22 bits):机器 ID,最多可支持约 420w 次机器启动。内置实现为在启动时由数据库分配,默认分配策略为用后即弃,后续可提供复用策略
  • sequence (13 bits):每秒下的并发序列,13 bits 可支持每秒 8192 个并发
阅读全文 »

1、分布式 ID 简介

1.1、业务背景

在复杂的分布式系统中,往往需要对大量的数据和消息进行唯一标识。比如在美团点评的金融、支付、餐饮、酒店、猫眼电影等产品的系统中数据日渐增长,对数据分库分表后需要有一个唯一 ID 来标识一条数据或消息。具体一点的如订单、骑手、优惠劵也都需要有唯一标识,此时一个能够生成全局唯一 ID 的系统是非常必要的。

1.2、ID 生成规则的硬性要求

  • 全局唯一:不能出现重复的 ID ,既然是唯一标识,这是最基本的要求
  • 单调递增:保证下一个 ID 大于上一个 ID,例如事务版本号、IM 增量信息、排序等特殊需求
  • 趋势递增:在 MySQL 的 InnoDB 存储引擎中使用的是聚集索引,由于多数 RDBMS 使用 BTree 的数据结构来存储索引数据,在主键的选择上面应该尽量使用有序的主键来保证写入性能
  • 信息安全:如果 ID 是连续的,恶意用户的爬取工作就非常容易做了,直接按照顺序下载指定 URL 即可 所以在一些应用场景下,需要 ID 无规则或者不规则,让竞争对手不好猜

上述的全局唯一、单调递增、趋势递增需求分别对应三类不同的业务场景,但单调递增和信息安全这两个需求是互斥的,无法使用同一个方案满足

1.3、ID 生成系统的可用性要求

  • 低延迟:发一个获取分布式 ID 的请求,服务器就要快,极速
  • 高可用:一个获取分布式 ID 的请求,服务器就要在保证 99.999% 成功率的情况下创建一个唯一分布式 ID
  • 高 QPS:假如并发一堆创建分布式 ID 的请求同时杀过来,服务器要顶得住且一下子成功创建 10 万个唯一分布式 ID
阅读全文 »

系统级命令

获取符合规则的键名列表

KEYS 命令需要遍历 Redis 中的所有键,当键的数量较多时会严重影响性能,在生产环境中应该禁用该命令。

1
KEYS pattern

示例:

1
2
redis> KEYS *
1) "book"
阅读全文 »

前言

负载均衡的实现

  • TCP 层实现的负载均衡,例如:LVS(调度性能强悍)
  • 应用层实现的负载均衡,例如:Nginx、Haproxy、Apache (mod_proxy)、Varnish、Squid、Ribbon

Keepalived 概述

Keepalived 简介

  Keepalived 是 Linux 下一个轻量级别的高可用开源解决方案,高可用 (High Avalilability),其实两种不同的含义:广义来讲,是指整个系统的高可用行,狭义的来讲就是之主机的冗余和接管,它与 HeartBeat RoseHA 实现相同类似的功能,都可以实现服务或者网络的高可用;但是又有差别,HeartBeat 是一个专业的、功能完善的高可用软件,它提供了 HA 软件所需的基本功能,比如:心跳检测、资源接管、检测集群中的服务、在集群节点转移共享 IP 地址的所有者等等。HeartBeat 功能强大,但是部署和使用相对比较麻烦,与 HeartBeat 相比,Keepalived 主要是通过虚拟路由冗余来实现高可用功能,虽然它没有 HeartBeat 功能强大,但是 Keepalived 部署和使用非常的简单,所有配置只需要一个配置文件即可以完成。Keepalived 实现了轻量级的高可用,一般用于前端高可用,且不需要共享存储,一般常用于两个节点的高可用。而 Heartbeat 用于服务的高可用,且需要共享存储,一般用于多节点的高可用。

  Keepalived 起初是专为 LVS 设计的,用来管理并监控 LVS 集群系统中各个服务节点的状态,后来又加入了可以实现高可用的 VRRP 功能。因此,Keepalived 除了能够管理 LVS 软件外,还可以实现任意两台主机之间,例如 Master 和 Backup 主机之间的故障转移和自动切换,这个主机可以是普通的不能停机的业务服务器,也可以是 LVS 负载均衡、Nginx 反向代理这样的服务器。Keepalived 软件主要是通过 VRRP 协议实现高可用功能的,VRRP 是 Virtual Router Redundancy Protocol(虚拟路由冗余协议)的缩写,VRRP 出现的目的就是为了解决静态路由的单点故障问题的,它能保证当个别节点宕机时,整个网络可以不间断、稳定地运行。所以,Keepalived 一方面具有配置管理 LVS 的功能,同时还具有对 LVS 下面节点进行健康检查的功能,另一方面也可以实现系统网络服务的高可用功能。

阅读全文 »

索引介绍

索引是一种特殊的文件(InnoDB 数据表上的索引是表空间的一个组成部分),包含了对数据表里所有记录的引用指针。索引分单列索引和组合索引。单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引,即一个索引包含多个列。创建索引时,需要确保该索引是应用在 SQL 查询语句的条件 (一般是 WHERE、JOIN 子句的条件)。

索引的类型(四种)

  • FULLTEXT:即为全文索引,目前只有 MyISAM 引擎支持,其可以在 CREATE TABLE,ALTER TABLE,CREATE INDEX 使用,不过目前只有 CHAR、VARCHAR、TEXT 列上可以创建全文索引
  • HASH:由于 HASH 的唯一性及类似键值对的形式,很适合作为索引,HASH 索引可以一次定位,不需要像树形索引那样逐层查找,因此具有极高的效率。但是,这种高效是有条件的,即只在 “=” 和 “in” 条件下才高效,对于范围查询、排序及组合索引仍然效率不高
  • BTREE:一种将索引值按一定的算法,存入一个树形的数据结构中(二叉树),每次查询都是从树的入口 Root 开始,依次遍历 Node,获取 Leaf,这是 MySQL 里默认和最常用的索引类型
  • RTREE:在 MySQL 很少使用,仅支持 geometry 数据类型,支持该类型的存储引擎有 MyISAM、BDb、InnoDb、NDb、Archive,相对于 BTREE,RTREE 的优势在于范围查找
阅读全文 »

Java 虚拟机

JVM 内存结构

JVM 内存结构主要有三大块:栈、堆内存、方法区。堆内存是 JVM 中最大的一块,由新生代和老年代组成,不包括永久代(方法区);而新生代内存又被分成 Eden 空间、From Survivor 空间、To Survivor 空间,默认情况下新生代按照 8:1:1 的比例来分配。方法区存储类信息、静态变量、常量、常量池等数据,是线程共享的区域,为了与 Java 堆区分,方法区还有一个别名 Non-Heap (非堆)。栈又分为 Java 虚拟机栈和本地方法栈,主要用于方法的执行。

java-jvm-architecture

阅读全文 »

Puppeteer 介绍

Puppeteer 是什么

Puppeteer 是一个 NodeJs 库,它提供了一个高级 API 来通过 DevTools 协议控制 Chromium 或 Chrome。相比较 Selenium 或是 PhantomJs,它最大的特点就是完全可以在内存中模拟 DOM 操作,即在 V8 引擎中处理而不打开浏览器,而且关键的是该项目是 Chrome 团队在维护,会拥有更好的兼容性和前景,更多资料可参考以下站点:Puppeteer GithubPuppeteer 中文文档DevTools Protocol 文档Chromium 命令行启动参数

Puppeteer 的功能

  • 生成页面的截图和 PDF
  • 自动提交表单,进行 UI 测试,键盘输入等
  • 捕获网站的时间线跟踪,用来帮助分析性能问题
  • 抓取 SPA(单页应用),并生成预渲染内容,即 “SSR”(服务器端渲染)
  • 创建一个最新的自动化测试环境,使用最新的 JavaScript 和浏览器功能,直接在最新版本的 Chrome 中运行测试
  • 测试浏览器扩展,Chrome / Chromium 扩展当前只能在非无头模式下使用,目前还无法测试扩展弹出窗口或内容脚本
阅读全文 »

背景

很多优秀的程序员和技术人员喜欢写技术文章和技术博客,通过这样的方式分享传播知识和经验,扩大自己的知名度和影响力,吸引粉丝关注,甚至有些技术博主还通过写文章来获取广告收入,还通过这种方法获得了出版书的机会以及工作机会。因此,写技术文章是一件非常值得投入的事情,帮助了自己,也让大众受益。但是,写技术文章通常也很耗时,特别是一些优质文章,不仅需要旁征博引、构思文章结构、照顾读者受众,还需要做很多前期工作,例如搭建环境、写 Demo 代码、测试代码等等。一篇优质技术文章通常需要 3-6 个小时来完成,可花了很多时间来写文章,最终发布出来的文章得不到很多人的关注是一件相当令人沮丧的事情。因此,优质文章值得获取关注和传播,让更多的技术工作者通过阅读文章获取知识获益。每个技术博主都有自己喜欢的技术媒体平台,例如简书、知乎、掘金、CSDN、微信公众号等等。很多技术博主也喜欢将文章发布在不同的平台上,寻求最大的关注度,同时也防止自己辛辛苦苦写的文章被别人复制粘贴盗版过去。然而,在多个平台上发文是一件麻烦的事情:博主需要同时登陆多个媒体平台,将自己的文章复制一个一个粘贴过去;更麻烦的是,有些平台只支持 Markdown,有些平台只支持富文本,博主需要在这两者之间来回转换,这增加了工作量。一文多发平台 ArtiPub 就解决了这样的问题,下面将介绍开源的一文多发平台 ArtiPub。

ArtiPub 简介

ArtiPub(Article Publisher 的简称,意为” 文章发布者”)是一款开源的一文多发平台,可以帮助文章作者将编写好的文章自动发布到简书、掘金、SegmentFault、CSDN、知乎、开源中国等技术媒体平台,传播优质知识,获取最大的曝光度。ArtiPub 安装简单,提供了多种安装方式(Docker、NPM、源码),可以一键安装使用,安装一般只要 5 分钟。ArtiPub 目前支持文章编辑、文章发布、数据统计的功能,后期会加入存量文章导入、数据分析的功能。此外,ArtiPub 日后还会接入更多媒体渠道,真正做到让文章随处可阅。用户使用 ArtiPub 也很简单,只需要在浏览器上打开 ArtiPub 的 Web 界面,将文章以 Markdown 的形式输入到编辑器,然后点击一键发布,等待不到 1 分钟,文章就自动同步到各大技术媒体平台了。此外,文章的阅读、点赞、评论数据还将周期性的被同步回来,让作者可以近实时看到文章的传播情况。

阅读全文 »

相关站点

拉取 Consul 镜像

1
2
3
4
5
# 拉取最新版本的镜像
# docker pull consul:latest

# 拉取特定版本的镜像
# docker pull consul:1.7.3

Docker 安装 Consul(单机)

1
2
3
4
5
6
7
# 创建并启动容器,默认是以开发模式启动,数据保存在内存中
# docker run -d --name=consul -e CONSUL_BIND_INTERFACE=eth0 consul:1.7.3

# 查看容器的运行状态
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7c43babcc760 consul:1.7.3 "docker-entrypoint.s…" 38 seconds ago Up 37 seconds 8300-8302/tcp, 8500/tcp, 8301-8302/udp, 8600/tcp, 8600/udp consul
阅读全文 »