ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Go 数据库分库分表:Sharding-JDBC 不适用?go-sharding 实战

Go 数据库分库分表:Sharding-JDBC 不适用?go-sharding 实战 Go 数据库分库分表Sharding-JDBC 不适用go-sharding 实战单库扛不住时怎么分库分表本文讲解落地方案并给出 Go 实战代码。一、什么时候分库分表单表行数 5000 万单库写入 QPS 2 万单库容量 1TB性能退化明显二、分片策略2.1 哈希分片funcshard(iint64,slotint)string{returnfmt.Sprintf(ds_%d,i%int64(slot))}优点均匀分布、简单。缺点扩容时需要 rehash。2.2 范围分片funcshard(uidint64)string{ifuid1_000_000{returnds_a}elseifuid10_000_000{returnds_b}returnds_c}适合时间序列数据按 ID 或时间切段。2.3 列表分片varregionMapmap[string]string{BJ:ds_bj,SH:ds_sh,GD:ds_gd,}funcshardByRegion(regionstring)string{returnregionMap[region]}适合枚举型字段。三、go-sharding 库实战importgithub.com/go-gorm/shardingdb,_:gorm.Open(mysql.Open(dsn0),gorm.Config{})db.Use(sharding.Register(sharding.Config{ShardingColumn:uid,NumberOfShards:64,},orders))db.Create(Order{UID:42,Amount:199})db.Where(uid ?,42).First(order)库内部用 lookup_table 抽象定位分片。四、go-sql-rewrite 中间件importgithub.com/rguliyev/sql-maskerdsn:fmt.Sprintf(query_urls%s;gorm_db?,strings.Join(dbs,,))db,err:gorm.Open(mysql.Open(dsn))原理在 driver 层拦截 SQL按分片键重写。五、跨分片查询5.1 分页方案不能简单 OFFSET得用 “二次查询 归并”funcfetchAll(uidMin,uidMaxint64)[]Order{res:make([][]Order,len(shards))varwg sync.WaitGroupfori,sh:rangeshards{wg.Add(1)gofunc(iint,shstring){deferwg.Done()res[i]queryShard(sh,uidMin,uidMax)}(i,sh)}wg.Wait()merged:[]Order{}for_,list:rangeres{mergedappend(merged,list...)}sort.Slice(merged,func(i,jint)bool{returnmerged[i].IDmerged[j].ID})returnmerged}5.2 聚合方案把聚合推到各 shard结果汇总SELECTcount(*)cnt,sum(amt)totalFROMtableWHEREdate?每个 shard 都跑一次再聚合。六、扩容与一致性 hash扩容时希望最小数据迁移typeConsistentHashstruct{ringmap[uint32]stringreplicasint}func(h*ConsistentHash)Add(nodestring){fori:0;ih.replicas;i{key:hash(nodestrconv.Itoa(i))h.ring[key]node}}Virtual nodes 让数据均匀。七、踩坑清单跨 shard 事务XA 难度大尽量改造业务分片键不可变用户订单等关键字段数据倾斜小心被均匀哈希打到莫一片动库前迁移好历史预先 rebalance不要分库过早单机 90 分效率时再分八、生产实战电商订单按 user_id 哈希分 8 个库每库按 time 划分 32 张表共 256 张历史订单归档到冷库Hot 表保留 6 个月九、未来趋势DBmesh / Vitess 帮助 SQL 透明分片各大云原生数据库 TiDB、PolarDB-X 提供原生分布式能力读写分离与多写冲突解决越来越自动化十、总结与展望分库分表是经典大表的演进方向但同时也是架构复杂化的开始。采用 hash 分片二次查询是好的入手点结合一致性 hash 与数据迁移工具扩容可控。未来Go 生态在分布式 DB 接入上会更智能同时提供 GraphQL/Rest 屏蔽跨 shard 查询。十一、参考文献go-mysql-org 文档sharding-jdbc 文档参考虽然 Java但理论通用Vitess 官方文档
返回列表