mysql 初始化序列_GitHub - IMAUZS/seq: 基于mysql的序列号生成器
seq
分布式架構(gòu)下,唯一序列號(hào)生成是我們?cè)谠O(shè)計(jì)一個(gè)系統(tǒng),尤其是數(shù)據(jù)庫(kù)使用分庫(kù)分表的時(shí)候常常會(huì)遇見(jiàn)的問(wèn)題。當(dāng)分成若干個(gè)sharding表后,如何能夠快速拿到一個(gè)唯一序列號(hào),是經(jīng)常遇到的問(wèn)題。
基于mysql的全局唯一序列號(hào)生成器,用go實(shí)現(xiàn),同時(shí)支持worker和db模式。對(duì)于訂單號(hào),可以選擇worker模式,對(duì)于用戶id這種,可以采用db模式。
特性
分布式:可任意橫向擴(kuò)展
高性能:分配ID只能訪問(wèn)內(nèi)存
易用性:對(duì)外提供HTTP服務(wù)
唯一性:MySQL自增ID,永不重復(fù)
高可靠:MySQL持久化
依賴項(xiàng)
本項(xiàng)目使用下列優(yōu)秀的項(xiàng)目作為必要組件。
gopkg.in/yaml.v2
github.com/go-sql-driver/mysql
github.com/satori/go.uuid
安裝
注意:需要在啟動(dòng)之前創(chuàng)建數(shù)據(jù)庫(kù)并修改配置文件中數(shù)據(jù)庫(kù)的配置。
單獨(dú)編譯:
git clone https://github.com/spcent/seq.git
cd seq
go build .
./seq
Docker 方式:
Dockerfile 使用了 Docker 多階段構(gòu)建功能,需保證 Docker 版本在 17.05 及以上。詳見(jiàn):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ù)庫(kù)
數(shù)據(jù)庫(kù)名稱可以自定義,修改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ī)器識(shí)別碼',
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ù)初始化后第一次請(qǐng)求會(huì)在 MySQL 數(shù)據(jù)庫(kù)中插入一條數(shù)據(jù),以生成初始 ID。
后續(xù)的請(qǐng)求,都會(huì)在內(nèi)存中進(jìn)行自增返回,并且保證返回的 ID 不會(huì)超過(guò)設(shè)置的上限,到達(dá)上限后會(huì)再次從 MySQL 中更新數(shù)據(jù),返回新的初始 ID 。
參考
Tinyid(https://github.com/didi/tinyid): 是用Java開(kāi)發(fā)的一款分布式id生成系統(tǒng),基于數(shù)據(jù)庫(kù)號(hào)段算法實(shí)現(xiàn),關(guān)于這個(gè)算法可以參考美團(tuán)leaf或者tinyid原理介紹。Tinyid擴(kuò)展了leaf-segment算法,支持了多db(master),同時(shí)提供了java-client(sdk)使id生成本地化,獲得了更好的性能與可用性。Tinyid在滴滴客服部門(mén)使用,均通過(guò)tinyid-client方式接入,每天生成億級(jí)別的id。
百度uid-generator(https://github.com/baidu/uid-generator): 這是基于snowflake方案實(shí)現(xiàn)的開(kāi)源組件,借用未來(lái)時(shí)間、緩存等手段,qps可達(dá)600w+
美團(tuán)leaf(https://tech.meituan.com/MT_Leaf.html): 該篇文章詳細(xì)的介紹了db號(hào)段和snowflake方案,近期也進(jìn)行了Leaf開(kāi)源
核心SQL
REPLACE INTO `seq_number` (uuid) VALUES ("54f5a3e2-e04c-4664-81db-d7f6a1259d01");
TODO
高可用(在ab測(cè)試中,發(fā)現(xiàn)存在請(qǐng)求被hang住的情況,響應(yīng)時(shí)間不是太穩(wěn)定)
批量獲取
提高rpc接口
總結(jié)
以上是生活随笔為你收集整理的mysql 初始化序列_GitHub - IMAUZS/seq: 基于mysql的序列号生成器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 安卓课程设计报告
- 下一篇: 计算机多媒体技术广泛应用于各个领域,新时