目录

目录 1

1. 前言 1

2. 名词 1

3. 功能 1

4. 唯一性原理 2

5. 系统结构 2

5.1. mooon-uniq-agent 2

5.2. mooon-uniq-master 2

6. 限制 3

7. 核心思想 4

8. 编译&安装 4

9. 启动&运行 5

10. 编程使用 5

1. 前言

源码位置:https://github.com/eyjian/mooon/tree/master/application/uniq_id

mooon-uniq-id可单机运行,也可以由1~255台机器组成集群分布式运行。性能极高,单机批量取(每批限定最多100个),每秒可提供唯一ID服务。

mooon-uniq-id还具极高的可用性,只要有一台机器正常即可正常提供服务。

2. 名词

Lable 机器标签

3. 功能

mooon-uniq-id提供64位无符号整数唯一ID和类似于订单号、流水号的字符串唯一ID。

4. 唯一性原理

mooon-uniq-id生成的唯一ID通过以下公式保证:

唯一ID = 机器唯一标签 + 本机递增序列号 + 系统时间

机器唯一标签自动生成,取值从1~255,故最多支持255台机器组成集群。时间粒度为小时,单台机器一小时内的递增序列号值为536870911个,只要一小时内提供的唯一ID数不超过536870911个即是安全的。如果需求超过536870911,则可以扩展到分钟的粒度,mooon-uniq-id保留了6位供用户自由支配,这保留的6位可以用于存储分钟值。

5. 系统结构

mooon-uniq-id的实现为天,则7天内master不可用都不影响正常服务,agent为master的依赖非常低,因此叫弱主架构。

mooon-uniq-id由mooon-uniq-agent和mooon-uniq-master组成弱主架构,为保证可用性mooon-uniq-agent至少1台以上,而且只要有一台可以用即整体可用。

而mooon-uniq-master一般可部署2台形成主备,实际上部署一台也完全无问题,因为mooon-uniq-master只要在租期内恢复正常即可。

5.1. mooon-uniq-agent

对外提供获取唯一ID服务的是mooon-uniq-agent,至少应当部署2台,以提供必要的可用性,部署的越多可用性越高,同时每秒提供的唯一ID个数也越多,支撑的并发数也越大。

mooon-uniq-agent在能够对外服务之前,都必须先从mooon-uniq-master租约到机器标签,否则不能服务。

5.2. mooon-uniq-master

mooon-uniq-master负责租约的管理,包括租约的初始化、租约的分配和租约的过期管理和回收。

默认情况下,mooon-uniq-agent每隔1分钟以心跳的形式向mooon-uniq-master续租机器标签,可以通过命令行参数“--interval”修改续租间隔,参数值的单位为秒,默认值为600即1分钟。

mooon-uniq-master将机器标签存储在MySQL表中,各机器标签的状态也存储在MySQL表中。mooon-uniq-master对MySQL有依赖,但也不是强依赖,因为只要在租期内可以成功续租或新租成功即可,而一旦集群上线后,99.999%的时间都只是续租。

在启动mooon-uniq-master之前,需要先创建好如下3个MySQL库和表:

-- CREATE DATABASE IF NOT EXISTS uniq_id DEFAULT CHARSET utf8 COLLATE utf8_general_ci;

-- Label资源池表

-- mooon-uniq-master第一次启动时会初始化表t_label_pool

DROP TABLE IF EXISTS t_label_pool;

CREATE TABLE t_label_pool (

f_label TINYINT UNSIGNED NOT NULL,

PRIMARY KEY (f_label)

);

-- Label在线表

-- f_label为主键,保证同一时间不可能有两个IP租赁同一个Label,

-- 但一个IP可能同时持有一个或多个过期的Label,和一个当前有效的Label

DROP TABLE IF EXISTS t_label_online;

CREATE TABLE t_label_online (

f_label TINYINT UNSIGNED NOT NULL,

f_ip CHAR(16) NOT NULL,

f_time DATETIME NOT NULL,

PRIMARY KEY (f_label),

KEY idx_ip(f_ip),

KEY idx_time(f_time)

);

-- Label日志表

-- 记录租约和续租情况

DROP TABLE IF EXISTS t_label_log;

CREATE TABLE t_label_log (

f_id BIGINT NOT NULL AUTO_INCREMENT,

f_label TINYINT UNSIGNED NOT NULL,

f_ip CHAR(16) NOT NULL,

f_event TINYINT NOT NULL,

f_time DATETIME NOT NULL,

PRIMARY KEY (f_id),

KEY idx_label(f_label),

KEY idx_ip(f_ip),

KEY idx_event(f_event),

KEY idx_time(f_time)

);

6. 限制

ID具备唯一性,但不具备递增性。

7. 核心思想

要保证ID的唯一性,最关键是要保证同一个机器标签不能同时出现在多台机器上。mooon-uniq-id的实现引入租约,每台mooon-uniq-agent在服务之前需要先成功租约到机器标签,在租约期内独占标签,并且可以在租期内续租。

在租期后,每个机器标签还有一段冻结期,处于冻结期的机器标签不会被租约。

通过这样的一种机制保证了机器标签的安全性,只要每台mooon-uniq-agent保证序列号在该机器上唯一,那么两者相结合即保证了整体上的唯一性。

序列号总是有限的,为保证永久的唯一性,在组成唯一ID时,加上了时间共同组成唯一性。

8. 编译&安装

mooon-uniq-id依赖mooon基础库,使用git或TortoiseGit下载mooon库源码:

https://github.com/eyjian/mooon/tree/master/mooon

同样,使用git或TortoiseGit下载mooon-uniq-id源码:

https://github.com/eyjian/mooon/tree/master/application/uniq_id

两者均采用CMake编译,且编译方法相同,先编译mooon基础库,编译和安装步骤:

1) 进入源代码目录,执行cmake生成Makefile文件,安装目录指定为/usr/local/mooon:

cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=/usr/local/mooon .

2) 执行make编译源代码:

make

3) 在make成功后,执行“make install”完成安装:

/usr/local/mooon

├── bin

├── CMake.common

├── include

│     └── mooon

│           ├── net

│           ├── sys

│           └── utils

└── lib

└── libmooon.a

接着编译和安装mooon-uniq-id,方法相同,安装路径也请指定为/usr/local/mooon。

9. 启动&运行

简单点可以放到crontab中自动拉起,比如借助process_monitor.sh(下载:https://github.com/eyjian/mooon/blob/master/mooon/shell/process_monitor.sh)的监控和自动重启功能:

* * * * * /usr/local/bin/process_monitor.sh "/usr/local/uniq_id/bin/uniq_master" "/usr/local/uniq_id/bin/uniq_master --db_host=127.0.0.1 --db_port=3306 --db_user=zhangsan --db_pass='zS2018' --db_name=uniq_id"

* * * * * /usr/local/bin/process_monitor.sh "/usr/local/uniq_id/bin/uniq_agent" "/usr/local/uniq_id/bin/uniq_agent --master_nodes=192.168.31.33.225.168.251:16200,192.168.31.35:16200"

10. 编程使用

可以参考uniq_test.cpp或uniq_stress.cpp使用mooon-uniq-id,如:

bool polling = false; // 轮询还是随机选择mooon-uniq-agent

const uint32_t timeout_milliseconds = 200;

const uint8_t retry_times = 5;

// 注意:需要捕获CSyscallException和CException两种异常

try

{

// agent_nodes为mooon-uniq-agent连接信息,多个间以逗号分隔,注意不要包含空格:

// 如:192.168.1.31:6200,192.168.1.32:6200,192.168.1.33:6200

mooon::CUniqId uniq_id(agent_nodes, timeout_milliseconds, retry_times, polling);

// 取交易流水号

//

// %L 为取mooon-uniq-agent的机器标签,每个mooon-uniq-agent不会有相同的标签

// %Y 为YYYY格式的年,如2017

// %M 为MM格式的月,如:04或12等

// %D 为DD格式的日,如:01或31等

// %m 为mm格式的分钟,如:09或59等

// %H 为hh格式的小时,24小时制,如:03或23等

// %5S 表示取5位的序列号,不足时前补0

std::string transaction_id = uniq_id.get_transaction_id("%L%Y%M%D%m%5S");

fprintf(stdout, "%s\n", transaction_id.c_str());

// 取8字节无符号整数值

const uint64_t uniq_id = uniq_id.get_uniq_id();

union mooon::UniqID uid;

uid.value = uniq_id;

fprintf(stdout, "id: %" PRIu64" => %s\n", uniq_id, uid.id.str().c_str());

}

catch (mooon::sys::CSyscallException& ex)

{

fprintf(stderr, "%s\n", ex.str().c_str());

}

catch (mooon::utils::CException& ex)

{

fprintf(stderr, "%s\n", ex.str().c_str());

}

高性能高可用的分布式唯一ID服务——mooon-uniq-id的更多相关文章

  1. 高性能高可用的微服务框架TarsGo的腾讯实践

    conference/2.3 高性能高可用的微服务框架TarsGo的腾讯实践 - 陈明杰.pdf at master · gopherchina/conferencehttps://github.co ...

  2. RHEL 5.4下部署LVS(DR)+keepalived实现高性能高可用负载均衡

    原文地址:http://www.cnblogs.com/mchina/archive/2012/05/23/2514728.html 一.简介 LVS是Linux Virtual Server的简写, ...

  3. 高可用,完全分布式Hadoop集群HDFS和MapReduce安装配置指南

    原文:http://my.oschina.net/wstone/blog/365010#OSC_h3_13 (WJW)高可用,完全分布式Hadoop集群HDFS和MapReduce安装配置指南 [X] ...

  4. RHEL 5.4下部署LVS(DR)+keepalived实现高性能高可用负载均衡(转)

    一.简介 LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统.本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一. ...

  5. 【FastDFS】如何打造一款高可用的分布式文件系统?这次我明白了!!

    写在前面 前面我们学习了如何基于两台服务器搭建FastDFS环境,而往往在生产环境中,需要FastDFS做到高可用,那如何基于FastDFS打造一款高可用的分布式文件系统呢?别急,今天,我们就一起来基 ...

  6. CentOS 6.3下部署LVS(NAT)+keepalived实现高性能高可用负载均衡

    一.简介 VS/NAT原理图: 二.系统环境 实验拓扑: 系统平台:CentOS 6.3 Kernel:2.6.32-279.el6.i686 LVS版本:ipvsadm-1.26 keepalive ...

  7. 转载--CentOS 6.3下部署LVS(NAT)+keepalived实现高性能高可用负载均衡

    源地址:http://www.cnblogs.com/mchina/archive/2012/08/27/2644391.html 一.简介 VS/NAT原理图: 二.系统环境 实验拓扑: 系统平台: ...

  8. CentOS 6.3下部署LVS(NAT)+keepalived实现高性能高可用负载均衡【转】

    CentOS 6.3下部署LVS(NAT)+keepalived实现高性能高可用负载均衡   一.简介 VS/NAT原理图: 二.系统环境 实验拓扑: 系统平台:CentOS 6.3 Kernel:2 ...

  9. CentOS 6.3下部署LVS(NAT模式)+keepalived实现高性能高可用负载均衡

    一.简介 VS/NAT原理图: 二.系统环境 实验拓扑: 系统平台:CentOS 6.3 Kernel:2.6.32-279.el6.i686 LVS版本:ipvsadm-1.26 keepalive ...

随机推荐

  1. maven项目运行报错invalid LOC header (bad signature)

    切换到项目目录pom.xml文件夹 执行以下命令: mvn test -e -X 找到出错信息 进入目录删除文件. 在ide里面重新部署项目即可.

  2. 百度地图插件(百度地图AK申请配置指南)

    百度地图AK申请配置指南     [LBS云] 百度地图AK申请配置指南 1. 该文档是详细版,图文并茂: 2. 该指南是针对browser-mobile-sever三种终端开发的申请与配置说明: 3 ...

  3. js DomContentLoaded 和 load 的区别

    如题:DOMContentLoaded和load都是页面加载的时候触发的事件.区别在于触发的时机不一样. 浏览器渲染页面DOM文档加载的步骤: 1.解析HTML结构. 2.加载外部脚本和css文件. ...

  4. PAT 1006 换个格式输出整数 (15)(C++&JAVA&Python)

    1006 换个格式输出整数 (15)(15 分) 让我们用字母B来表示"百".字母S表示"十",用"12...n"来表示个位数字n(& ...

  5. IDEA 的基本介绍

    1.工具界面 (1)工程下的 src 类似于 Eclipse 下的 src 目录, 用于存放代码. (2)工程下的.idea 和 project01.iml 文件都是 IDEA 工程特有的.类似于 E ...

  6. 图片延时加载原理 和 使用jquery实现的一个图片延迟加载插件(含图片延迟加载原理)

    图片加载技术分为:图片预加载和图片延时加载. javascript图片预加载和延时加载的区别主要体现在图片传输到客户端的时机上,都是为了提升用户体验的,延时加载又叫懒加载.两种技术的本质:两者的行为是 ...

  7. 工具类官网Web原型制作分享-Adobe

    Adobe是全球知名的软件开发团队,研发了设计创意领域全球领先的优秀软件产品,为设计行业提供了巨大的价值. 网站原型以图文排版为主,顶部一级导航,弹出面板和面板的使用实现了一级导航下拉的效果. 本原型 ...

  8. h5页面适配iPhone X的方法

    一.原生适配iphoneX 原生适配很简单,查看机型图:   只要用 #define KIsiPhoneX ([UIScreen mainScreen].bounds.size.height>8 ...

  9. json数据映射填充到html元素显示

    映射算法做了改进,支持name重复映射 <!DOCTYPE html> <html> <head> <meta charset="UTF-8&quo ...

  10. [cmd]如何设置 Windows 默认命令行窗口大小和缓冲区大小

    Windows 命令行 cmd 窗口系统默认的大小(80*40)对于现在的屏幕配置已经跟不上时代了,我们总是要把它改大些,而且缓冲区大小也想改得大大的.单纯的为当前的 Windows 命令行窗口修改显 ...