一个兼容Redis协议的ID生成器

flike · · 1768 次点击 · 开始浏览    置顶
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。

# idgo 简介 ## 1. idgo 特点 idgo 是一个利用 MySQL 批量生成 ID 的 ID 生成器, 主要有以下特点: - 生成的 ID 是顺序递增的。 - 每次通过事务批量取 ID,性能较高,且不会对 MySQL 造成压力。 - 当 ID 生成器服务崩溃后,可以继续生成有效 ID,避免了 ID 回绕的风险。 - 服务端模拟 Redis 协议,通过`GET`和`SET`获取和设置 key 。不必开发专门的获取 ID 的 SDK ,直接使用 Reids 的 SDK 就可。 业界已经有利于 MySQL 生成 ID 的方案,都是通过: ``` REPLACE INTO Tickets64 (stub) VALUES ('a'); SELECT LAST_INSERT_ID(); ``` 这种方式生成 ID 的弊端就是每生成一个 ID 都需要查询一下 MySQL,当 ID 生成过快时会对 MySQL 造成很大的压力。这正式我开发这个项目的原因。服务端兼容 Redis 协议是为了避免单独开发和 idgo 通信的 SDK 。 ## 2. idgo 架构 idgo 和前端应用是才有 redis 协议通信的,然后每个`id_key`是存储在 MySQL 数据库中,每个 key 会在 MySQL 中生成一张表,表中只有一条记录。这样做的目的是保证当 idgo 由于意外崩溃后,`id_key`对应的值不会丢失,这样就避免产生了 id 回绕的风险。 ![idgo_arch]( http://ww2.sinaimg.cn/large/6e5705a5gw1f2nz3bot3tj20qo0k0mxe.jpg) idgo 目前只支持四个 redis 命令: ``` 1 . SET key value,通过这个操作设置 id 生成器的初始值。 例如: SET abc 123 2. GET key,通过该命令获取 id 。 3. EXISTS key,查看一个 key 是否存在。 4. DEL key,删除一个 key 。 ``` ## 3. 安装和使用 idgo 1. 安装 idgo ``` 1. 安装 Go 语言环境( Go 版本 1.3 以上),具体步骤请 Google 。 2. 安装 godep 工具, go get github.com/tools/godep 。 2. git clone https://github.com/flike/idgo src/github.com/flike/idgo 3. cd src/github.com/flike/idgo 4. source ./dev.sh 5. make 6. 设置配置文件 7. 运行 idgo 。./bin/idgo -config=etc/idgo.toml ``` 设置配置文件(`etc/idgo.toml`): ``` #idgo 的 IP 和 port addr="127.0.0.1:6389" #log_path: /Users/flike/src #日志级别 log_level="debug" [storage_db] mysql_host="127.0.0.1" mysql_port=3306 db_name="idgo_test" user="root" password="" max_idle_conns=64 ``` 操作演示: ``` #启动 idgo ➜ idgo git:(master) ✗ ./bin/idgo -config=etc/idgo.toml 2016/04/07 11:51:20 - INFO - server.go:[62] - [server] "NewServer" "Server running" "netProto=tcp|address=127.0.0.1:6389" req_id=0 2016/04/07 11:51:20 - INFO - main.go:[80] - [main] "main" "Idgo start!" "" req_id=0 #启动一个客户端连接 idgo ➜ ~ redis-cli -p 6389 redis 127.0.0.1:6389> get abc (integer) 0 redis 127.0.0.1:6389> set abc 100 OK redis 127.0.0.1:6389> get abc (integer) 101 redis 127.0.0.1:6389> get abc (integer) 102 redis 127.0.0.1:6389> get abc (integer) 103 redis 127.0.0.1:6389> get abc (integer) 104 redis 127.0.0.1:6389> ``` ## 4. 压力测试 压测环境 |类别|名称| |---|---| |OS |CentOS release 6.4| |CPU |Common KVM CPU @ 2.13GHz| |RAM |2GB| |DISK |50GB| |Mysql |5.1.73| 本地 mac 连接远程该 MySQL 实例压测 ID 生成服务。 每秒中可以生成 20 多万个 ID 。性能方面完全不会有瓶颈。 ## 5.ID 生成服务宕机后的恢复方案 当 idgo 服务意外宕机后,可以切从库,然后将 idgo 对应的 key 加上适当的偏移量。 # License MIT 开源地址: https://github.com/flike/idgo

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1768 次点击  
加入收藏 微博
2 回复  |  直到 2016-04-07 07:27:57
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传