您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# MyCat 中怎么实现一个全局序列号
## 1. 全局序列号概述
### 1.1 什么是全局序列号
全局序列号(Global Sequence)在分布式系统中指能够跨节点、跨服务保证唯一性的数字序列。在数据库中间件场景下,全局序列号主要用于解决分库分表环境中的主键冲突问题。
### 1.2 为什么需要全局序列号
在MyCat分库分表环境中:
- 自增ID无法保证全局唯一
- 不同分片可能生成相同ID
- 业务需要连续的序号展示
- 分布式事务需要唯一标识
### 1.3 常见实现方案对比
| 方案类型 | 优点 | 缺点 | 适用场景 |
|---------|------|------|---------|
| 数据库自增 | 简单 | 不适用于分布式 | 单库 |
| UUID | 全局唯一 | 无序、存储大 | 不要求有序 |
| Redis生成 | 高性能 | 需要维护Redis | 高并发场景 |
| 雪花算法 | 分布式友好 | 时钟回拨问题 | 分布式系统 |
| MyCat全局序列 | 内置支持 | 依赖配置 | MyCat环境 |
## 2. MyCat全局序列实现原理
### 2.1 整体架构设计
MyCat全局序列通过`SEQUENCE`处理器实现核心逻辑:
Client -> MyCat Server -> Sequence Handler -> 数据源/算法
### 2.2 关键组件
1. **SequenceHandler**:接口定义序列操作
2. **SequenceConf**:配置加载器
3. **SequenceProcessor**:实际处理器
4. **Sequence存储**:DB/本地文件等
### 2.3 工作流程
1. 解析SQL获取序列需求
2. 根据配置选择处理器
3. 获取下一个序列值
4. 返回拼接的SQL语句
## 3. 本地文件方式实现
### 3.1 配置步骤
1. 修改`sequence_conf.properties`:
```properties
# 默认使用文件方式
GLOBAL.HISIDS=
GLOBAL.MINID=10001
GLOBAL.MAXID=20000
GLOBAL.CURID=10000
server.xml
:<system>
<property name="sequnceHandlerType">0</property>
</system>
优点: - 配置简单 - 不依赖外部组件 - 性能较好
缺点: - MyCat重启可能导致序列不连续 - 单点故障风险 - 不适合高并发场景
CREATE TABLE MYCAT_SEQUENCE (
name VARCHAR(64) NOT NULL,
current_value BIGINT NOT NULL,
increment INT NOT NULL DEFAULT 1,
PRIMARY KEY (name)
);
INSERT INTO MYCAT_SEQUENCE(name,current_value,increment)
VALUES ('GLOBAL', 1, 1);
<system>
<property name="sequnceHandlerType">1</property>
</system>
关键方法在DBSequnceHandler
中:
public class DBSequnceHandler implements SequenceHandler {
public long nextId(String prefixName) {
// 获取数据库连接
// 执行更新语句
// 返回新ID
}
}
<property name="sequenceHandlerType">1</property>
<property name="sequenceHandlerPattern">(\w+)_SEQ</property>
<property name="sequence_db_table">MYCAT_SEQUENCE</property>
<property name="sequence_db_maxValue">10000</property>
/*!mycat:catlet=io.mycat.route.sequence.BatchSequenceRoute */
select next_val from MYCAT_SEQUENCE where name='GLOBAL';
server.xml
:<system>
<property name="sequnceHandlerType">2</property>
<property name="workerId">123</property>
</system>
0 | 41位时间戳 | 10位机器ID | 12位序列号
MyCat实现方案: 1. 记录最后时间戳 2. 检测到回拨时: - 小幅度回拨:等待 - 大幅度回拨:报警人工干预
# workerId配置
mycat.instance.id=123
# 数据中心ID
mycat.datacenter.id=1
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
</dependency>
<system>
<property name="sequnceHandlerType">3</property>
<property name="zkURL">127.0.0.1:2181</property>
</system>
自定义SequenceHandler:
public class EtcdSequenceHandler implements SequenceHandler {
private Client etcdClient;
public long nextId(String prefix) {
// 使用etcd的原子操作
}
}
根据业务场景选择:
场景特征 | 推荐方案 |
---|---|
小型系统 | 本地文件 |
中型系统 | 数据库方式 |
大型分布式 | 雪花算法 |
需要严格递增 | 分布式ID生成器 |
sequence.prefetch.size=1000
ORDER.sequnce.min=100000
USER.sequence.min=200000
关键监控点: 1. 序列号生成速率 2. 序列号冲突次数 3. 获取序列号延迟 4. 存储空间使用率
现象:达到MAXID后无法继续生成
解决方案:
1. 定期检查剩余ID量
2. 动态调整MAXID
3. 实现环形序列复用
解决方案架构:
[DC1 MyCat] -> [全局协调服务] <- [DC2 MyCat]
优化方案: 1. 增加本地缓存 2. 批量获取序列号 3. 异步刷新机制
<system>
<property name="sequenceHandlerType">1</property>
<property name="sequence_db_table">MYCAT_SEQUENCE</property>
<property name="sequence_db_maxValue">1000000</property>
</system>
# 全局序列
GLOBAL.HISIDS=
GLOBAL.MINID=1001
GLOBAL.MAXID=999999999
GLOBAL.CURID=1000
实现方式 | QPS | 平均延迟 | 资源消耗 |
---|---|---|---|
本地文件 | 15,000 | 2ms | 低 |
数据库 | 5,000 | 8ms | 中 |
雪花算法 | 50,000 | 1ms | 低 |
ZK | 3,000 | 15ms | 高 |
”`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。