分片

分片外掛程式使用 SQL 解析器,並替換為將大型資料表分割成較小的資料表,將查詢重新導向到分片資料表。提供高性能資料庫存取。

https://github.com/go-gorm/sharding

功能

  • 非侵入式設計。載入外掛程式,指定設定檔,即可完成所有設定。
  • 極速。無基於網路的中介軟體,速度與 Go 一樣快。
  • 支援多個資料庫。已測試 PostgreSQL,MySQL 和 SQLite 即將推出。
  • 允許您自訂主鍵產生器(內建 keygen、Sequence、Snowflake …)。

用法

設定分片中介軟體,註冊您要分片的資料表。請參閱 Godoc 以取得設定檔詳細資料。

import (
"fmt"

"gorm.io/driver/postgres"
"gorm.io/gorm"
"gorm.io/sharding"
)

dsn := "postgres://127.0.0.1:5432/sharding-db?sslmode=disable"
db, err := gorm.Open(postgres.New(postgres.Config{DSN: dsn}))

db.Use(sharding.Register(sharding.Config{
ShardingKey: "user_id",
NumberOfShards: 64,
PrimaryKeyGenerator: sharding.PKSnowflake,
}, "orders").Register(sharding.Config{
ShardingKey: "user_id",
NumberOfShards: 256,
PrimaryKeyGenerator: sharding.PKSnowflake,
// This case for show up give notifications, audit_logs table use same sharding rule.
}, Notification{}, AuditLog{}))

照常使用 db 會話。請注意,在操作分片資料表時,查詢應具有分片金鑰

// Gorm create example, this will insert to orders_02
db.Create(&Order{UserID: 2})
// sql: INSERT INTO orders_2 ...

// Show have use Raw SQL to insert, this will insert into orders_03
db.Exec("INSERT INTO orders(user_id) VALUES(?)", int64(3))

// This will throw ErrMissingShardingKey error, because there not have sharding key presented.
db.Create(&Order{Amount: 10, ProductID: 100})
fmt.Println(err)

// Find, this will redirect query to orders_02
var orders []Order
db.Model(&Order{}).Where("user_id", int64(2)).Find(&orders)
fmt.Printf("%#v\n", orders)

// Raw SQL also supported
db.Raw("SELECT * FROM orders WHERE user_id = ?", int64(3)).Scan(&orders)
fmt.Printf("%#v\n", orders)

// This will throw ErrMissingShardingKey error, because WHERE conditions not included sharding key
err = db.Model(&Order{}).Where("product_id", "1").Find(&orders).Error
fmt.Println(err)

// Update and Delete are similar to create and query
db.Exec("UPDATE orders SET product_id = ? WHERE user_id = ?", 2, int64(3))
err = db.Exec("DELETE FROM orders WHERE product_id = 3").Error
fmt.Println(err) // ErrMissingShardingKey

完整的範例 在此

白金贊助商

金牌贊助商

白金贊助商

金牌贊助商