mysql序列号生成软件_GitHub - spcent/seq: 基于mysql的序列号生成器
seq
分布式架構(gòu)下,唯一序列號生成是我們在設(shè)計一個系統(tǒng),尤其是數(shù)據(jù)庫使用分庫分表的時候常常會遇見的問題。當(dāng)分成若干個sharding表后,如何能夠快速拿到一個唯一序列號,是經(jīng)常遇到的問題。
基于mysql的全局唯一序列號生成器,用go實現(xiàn),同時支持worker和db模式。對于訂單號,可以選擇worker模式,對于用戶id這種,可以采用db模式。
特性
分布式:可任意橫向擴(kuò)展
高性能:分配ID只能訪問內(nèi)存
易用性:對外提供HTTP服務(wù)
唯一性:MySQL自增ID,永不重復(fù)
高可靠:MySQL持久化
依賴項
本項目使用下列優(yōu)秀的項目作為必要組件。
gopkg.in/yaml.v2
github.com/go-sql-driver/mysql
github.com/satori/go.uuid
安裝
注意:需要在啟動之前創(chuàng)建數(shù)據(jù)庫并修改配置文件中數(shù)據(jù)庫的配置。
單獨編譯:
git clone https://github.com/spcent/seq.git
cd seq
go build .
./seq
Docker 方式:
Dockerfile 使用了 Docker 多階段構(gòu)建功能,需保證 Docker 版本在 17.05 及以上。詳見:Use multi-stage builds
git clone https://github.com/spcent/seq.git
cd seq
docker build -t seq:latest .
docker run -p 8000:8000 seq:latest
初始化數(shù)據(jù)庫
數(shù)據(jù)庫名稱可以自定義,修改config.yml即可。
然后導(dǎo)入下面的SQL生成數(shù)據(jù)表。
create database seq;
CREATE TABLE `seq_number` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
`uuid` char(36) NOT NULL COMMENT '機(jī)器識別碼',
PRIMARY KEY (`id`),
UNIQUE KEY `uniq_uuid` (`uuid`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
使用
curl http://localhost:8000/nextId
{"code":0,"msg":"ok","data":{"id":101}}
curl http://localhost:8000/nextIdSimple
102
curl http://localhost:8000/worker/1
{"code":0,"msg":"ok","data":{"id":390637407633936384}}
原理
服務(wù)初始化后第一次請求會在 MySQL 數(shù)據(jù)庫中插入一條數(shù)據(jù),以生成初始 ID。
后續(xù)的請求,都會在內(nèi)存中進(jìn)行自增返回,并且保證返回的 ID 不會超過設(shè)置的上限,到達(dá)上限后會再次從 MySQL 中更新數(shù)據(jù),返回新的初始 ID 。
參考
Tinyid(https://github.com/didi/tinyid): 是用Java開發(fā)的一款分布式id生成系統(tǒng),基于數(shù)據(jù)庫號段算法實現(xiàn),關(guān)于這個算法可以參考美團(tuán)leaf或者tinyid原理介紹。Tinyid擴(kuò)展了leaf-segment算法,支持了多db(master),同時提供了java-client(sdk)使id生成本地化,獲得了更好的性能與可用性。Tinyid在滴滴客服部門使用,均通過tinyid-client方式接入,每天生成億級別的id。
百度uid-generator(https://github.com/baidu/uid-generator): 這是基于snowflake方案實現(xiàn)的開源組件,借用未來時間、緩存等手段,qps可達(dá)600w+
美團(tuán)leaf(https://tech.meituan.com/MT_Leaf.html): 該篇文章詳細(xì)的介紹了db號段和snowflake方案,近期也進(jìn)行了Leaf開源
核心SQL
REPLACE INTO `seq_number` (uuid) VALUES ("54f5a3e2-e04c-4664-81db-d7f6a1259d01");
TODO
高可用(在ab測試中,發(fā)現(xiàn)存在請求被hang住的情況,響應(yīng)時間不是太穩(wěn)定)
批量獲取
提高rpc接口
總結(jié)
以上是生活随笔為你收集整理的mysql序列号生成软件_GitHub - spcent/seq: 基于mysql的序列号生成器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python真好玩 pdf 下载_Pyt
- 下一篇: mysql自定义序号_mysql序列号生