MyCat - 日志模块 - 日志表的 ID 生成分析 | 学习笔记

简介: 快速学习 MyCat - 日志模块 - 日志表的 ID 生成分析

开发者学堂课程【全面讲解开源数据库中间件 MyCat 使用及原理(四):MyCat - 日志模块 - 日志表的 ID 生成分析】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/758/detail/13322


MyCat - 日志模块 - 日志表的 ID 生成分析

内容介绍:

一、日志表的 ID 生成分析

二、分布式 ID 生成

 

一、日志表的 ID 生成分析

对于插入日志,需要向表结构中插入一条数据。

在插入数据前,先要分析 id 的内容,该 id 设置的不是组件自增

image.png

1.分析:

为什么 tb_operatelog 这种表设置的不是组件自增?

原因是这张表将来的数据量可能会很大,这张表存储的是操作日志,操作日志随时间的累计数据量会非常大(大到一个服务器的磁盘存储不下)。这时需要考虑到扩容,就要使用到 MyCat 对该块数据库表进行分片。也就是说这张表到最后需要进行水平拆分,可能会拆分为多张表。假如这张表被拆分为两张表,tb_operatelog 被拆分到两个数据库中,两个数据库中都有这张表,并且表结构相同,但是其中存储的数据不同。

如果将该表的组件设置为组件自增(都从 1 开始),则两个数据库都从 1 开始自增,发现组件冲突。不同的数据库中存储不同的数据,表结构相同,最终出现组件冲突。

所以不能使用组件自增。

image.png

 

二、分布式 ID 生成

既然不能使用组件自增,则要如何生产该组件,并且要保证不会出现重复的 id?

方式较多,可以使用 UUID,也可以借助于 Redis。

这里推荐一种分布式 ID 的生成算法

1. snowflake(雪花算法)

snowflake 是 Twitter 开源的分布式 ID 生成算法,结果是一个 long 型的 ID。(能够保证在分布式集群环境下,不会出现重复的 id )

2.核心思想∶

使用 41bit 作为毫秒数,10bit 作为机器的 ID  ( 5 个 bit 是数据中心,5 个 bit 的机器 ID ),12bit 作为毫秒内的流水号(意味着每个节点在每毫秒可以产生 4096 个 ID),最后还有一个符号位,永远是 0 ;

3.如何实现

Twitter 提供的 snowflake 算法是由 64 位二进制组成的,64 位二进制分为 5 个部分组成。第一位是不用的,永远是 0。第二位是表的时间戳(是毫秒值,仅仅提供毫秒值是不行的,因为同一个毫秒中可能要生成多个 id ),为了解决在同一个毫秒内也可能会产生多个 id 的情况,引入了最后 12 位的序列号(在一个毫秒内要生成多个 id,前面的毫秒值不同,后面的序列号也不同,会自增生成序列号)。

image.png

这样可以解决同一个毫秒值内通过序列号进行区分。

但是在集群环境下多态机器,同一个毫秒值多态机器都从某一个值开始向上自增,则有可能其序列号和毫秒值都相同。

所以在雪花算法中又引入了工作机器 id,机器工作 id 实际上分为两个部分,第一个五位和第二个五位,第一个五位代表机器 id,第二个五位表示数据中心的 id。

通过机器 id 和数据中心的 id 来进行区分,再去生成 id 时需要指定机器 id 和数据中心 id ,从而区分不同的服务器。机器 id 和数据中心 id 的取值分别从 0 到 31、3到 31。(从 0-31 的原因:五个二进制位就是 2 的 5 次方,2 的 5 次方是 32,所以从0-31)

通过机器 id 和数据中心的 id 来区分或者生成不同的 id ,即使在集群环境下也不会出现重复的 id 。能够支持的集群容量是 1024(32*32)台服务器,能够保证在集群数量在 1024 台之内不出现重复的 id 。

4.使用方式:

//构造 Idworker

Idworker idworker=new Idworker (1,1);

//0-31 , 0-31,(1,1)表示数据中心的 id 和机器 id

for (int i=0 ; i<10000 ;i++){

long id = idworker . nextId();

System.out.println(id);

}

要在日志模块中使用,则需要引入 Idworker

这里已经引入:

image.png

要在 v_service_log 中使用,需要将 pom.xml 引入

最好让 Idworker 不用每次都创建(new),交给 Spring 容器管理,所以进行如下配置:

@Bean

public IdWorker idworker(){

return new IdWorker(workerId:0,datacenterId:0)

}

对于 Bean 注解,其含义为将当前方法的返回值作为 Spring 容器中的 Bean 存在。

在后续的插入日志中,直接注入该 IdWorker 即可。

相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
相关文章
|
2月前
|
监控 安全 程序员
Python日志模块配置:从print到logging的优雅升级指南
从 `print` 到 `logging` 是 Python 开发的必经之路。`print` 调试简单却难维护,日志混乱、无法分级、缺乏上下文;而 `logging` 支持级别控制、多输出、结构化记录,助力项目可维护性升级。本文详解痛点、优势、迁移方案与最佳实践,助你构建专业日志系统,让程序“有记忆”。
269 0
|
8月前
|
存储 运维 监控
SelectDB 实现日志高效存储与实时分析,完成任务可领取积分、餐具套装/水杯/帆布包!
SelectDB 实现日志高效存储与实时分析,完成任务可领取积分、餐具套装/水杯/帆布包!
|
3月前
|
监控 安全 搜索推荐
使用EventLog Analyzer进行日志取证分析
EventLog Analyzer助力企业通过集中采集、归档与分析系统日志及syslog,快速构建“数字犯罪现场”,精准追溯安全事件根源。其强大搜索功能可秒级定位入侵时间、人员与路径,生成合规与取证报表,确保日志安全防篡改,大幅提升调查效率,为执法提供有力证据支持。
168 0
|
8月前
|
SQL 监控 数据挖掘
SLS 重磅升级:超大规模数据实现完全精确分析
SLS 全新推出的「SQL 完全精确」模式,通过“限”与“换”的策略切换,在快速分析与精确计算之间实现平衡,满足用户对于超大数据规模分析结果精确的刚性需求。标志着其在超大规模日志数据分析领域再次迈出了重要的一步。
584 117
|
5月前
|
监控 安全 NoSQL
【DevOps】Logstash详解:高效日志管理与分析工具
Logstash是ELK Stack核心组件之一,具备强大的日志收集、处理与转发能力。它支持多种数据来源,提供灵活的过滤、转换机制,并可通过插件扩展功能,广泛应用于系统日志分析、性能优化及安全合规等领域,是现代日志管理的关键工具。
838 0
|
7月前
|
自然语言处理 监控 安全
阿里云发布可观测MCP!支持自然语言查询和分析多模态日志
阿里云可观测官方发布了Observable MCP Server,提供了一系列访问阿里云可观测各产品的工具能力,包含阿里云日志服务SLS、阿里云应用实时监控服务ARMS等,支持用户通过自然语言形式查询
957 0
阿里云发布可观测MCP!支持自然语言查询和分析多模态日志
|
6月前
|
人工智能 运维 监控
Aipy实战:分析apache2日志中的网站攻击痕迹
Apache2日志系统灵活且信息全面,但安全分析、实时分析和合规性审计存在较高技术门槛。为降低难度,可借助AI工具如aipy高效分析日志,快速发现攻击痕迹并提供反制措施。通过结合AI与学习技术知识,新手运维人员能更轻松掌握复杂日志分析任务,提升工作效率与技能水平。
|
9月前
|
存储 消息中间件 缓存
MiniMax GenAI 可观测性分析 :基于阿里云 SelectDB 构建 PB 级别日志系统
基于阿里云SelectDB,MiniMax构建了覆盖国内及海外业务的日志可观测中台,总体数据规模超过数PB,日均新增日志写入量达数百TB。系统在P95分位查询场景下的响应时间小于3秒,峰值时刻实现了超过10GB/s的读写吞吐。通过存算分离、高压缩比算法和单副本热缓存等技术手段,MiniMax在优化性能的同时显著降低了建设成本,计算资源用量降低40%,热数据存储用量降低50%,为未来业务的高速发展和技术演进奠定了坚实基础。
393 1
MiniMax GenAI 可观测性分析 :基于阿里云 SelectDB 构建 PB 级别日志系统
|
9月前
|
SQL 存储 自然语言处理
让跨 project 联查更轻松,SLS StoreView 查询和分析实践
让跨 project 联查更轻松,SLS StoreView 查询和分析实践
195 1
|
11月前
|
机器学习/深度学习 人工智能 运维
智能日志分析:用AI点亮运维的未来
智能日志分析:用AI点亮运维的未来
3510 15