Translations:
go-vshard-router — библиотека для отправки запросов напрямую в стораджа в шардированный кластер tarantool, без использования tarantool-router. Эта библиотека написана на основе модуля библиотеки tarantool vhsard router и коннектора go-tarantool. go-vshard-router применяет новый подход к созданию кластера
graph TD
%% Старая схема кластера
subgraph Old_Cluster_Schema["Old Cluster Schema"]
direction LR
subgraph Tarantool Database Cluster
subgraph Replicaset 1
Master_001_1
Replica_001_2
end
end
ROUTER1["Tarantool vshard-router 1_1"] --> Master_001_1
ROUTER2["Tarantool vshard-router 1_2"] --> Master_001_1
ROUTER3["Tarantool vshard-router 1_3"] --> Master_001_1
ROUTER1["Tarantool vshard-router 1_1"] --> Replica_001_2
ROUTER2["Tarantool vshard-router 1_2"] --> Replica_001_2
ROUTER3["Tarantool vshard-router 1_3"] --> Replica_001_2
GO["Golang service"]
GO --> ROUTER1
GO --> ROUTER2
GO --> ROUTER3
end
%% Новая схема кластера
subgraph New_Cluster_Schema["New Cluster Schema"]
direction LR
subgraph Application Host
Golang_Service
end
Golang_Service --> |iproto| MASTER1
Golang_Service --> |iproto| REPLICA1
MASTER1["Master 001_1"]
REPLICA1["Replica 001_2"]
subgraph Tarantool Database Cluster
subgraph Replicaset 1
MASTER1
REPLICA1
end
end
end
С помощью Go module можно добавить следующий импорт
import "github.com/tarantool/go-vshard-router/v2"
в ваш код, а затем go [build|run|test]
автоматически получит необходимые зависимости.
В противном случае выполните следующую команду Go, чтобы установить пакет go-vshard-router:
$ go get -u github.com/tarantool/go-vshard-router/v2
Сначала вам необходимо импортировать пакет go-vshard-router для его использования.
package main
import (
"context"
"fmt"
"strconv"
"time"
vshardrouter "github.com/tarantool/go-vshard-router/v2"
"github.com/tarantool/go-vshard-router/v2/providers/static"
"github.com/google/uuid"
"github.com/tarantool/go-tarantool/v2"
)
func main() {
ctx := context.Background()
directRouter, err := vshardrouter.NewRouter(ctx, vshardrouter.Config{
DiscoveryTimeout: time.Minute,
DiscoveryMode: vshardrouter.DiscoveryModeOn,
TopologyProvider: static.NewProvider(map[vshardrouter.ReplicasetInfo][]vshardrouter.InstanceInfo{
{Name: "replcaset_1", UUID: uuid.New()}: {
{Addr: "127.0.0.1:1001", Name: "1_1"},
{Addr: "127.0.0.1:1002", Name: "1_2"},
},
{Name: "replcaset_2", UUID: uuid.New()}: {
{Addr: "127.0.0.1:2001", Name: "2_1"},
{Addr: "127.0.0.1:2002", Name: "2_2"},
},
}),
TotalBucketCount: 128000,
PoolOpts: tarantool.Opts{
Timeout: time.Second,
},
})
if err != nil {
panic(err)
}
user := struct {
ID uint64
}{
ID: 123,
}
bucketID := directRouter.BucketIDStrCRC32(strconv.FormatUint(user.ID, 10))
resp, err := directRouter.Call(
ctx,
bucketID,
vshardrouter.CallModeBRO,
"storage.api.get_user_info",
[]interface{}{&struct {
BucketID uint64 `msgpack:"bucket_id" json:"bucket_id,omitempty"`
Body map[string]interface{} `msgpack:"body"`
}{
BucketID: bucketID,
Body: map[string]interface{}{
"user_id": "123456",
},
}}, vshardrouter.CallOpts{Timeout: time.Second * 2},
)
if err != nil {
panic(err)
}
info := &struct {
BirthDay int
}{}
err = resp.GetTyped(&[]interface{}{info})
if err != nil {
panic(err)
}
interfaceResult, err := resp.Get()
if err != nil {
panic(err)
}
fmt.Printf("interface result: %v", interfaceResult)
fmt.Printf("get typed result: %v", info)
}
Мы понимаем, что реализации логгеров, метрик, а так же источников топологии могут сильно отличаться в реализации и использовании. Поэтому go-vshard-router дает возможность вам самим выбирать инструменты, которые вы считаете правильным использовать или реализовать их самим за счет использования интерфейсов.
Как источник конфигурации вы можете использовать провайдеры топологии(конфигурации). На данный момент есть поддержка следующих провайдеров:
- etcd (для конфигурации аналогичной moonlibs/config в etcd v2 для tarantool версии ниже 3)
- static (для указания конфигурации прямо из кода и простоты тестирования)
- viper
- etcd v3
- consul
- files
Также доступны провайдеры метрик, вы можете использовать готовые провайдеры метрик, которые можно зарегестрировать в prometheus и передать go-vshard-router. Что позволит вам не задумываться над опциями и настройкой метрик. На данный момент доступны следующие провайдеры:
- stdout (builtin)
- slog
Познакомьтесь с Полной документацией, которая включает в себя примеры и теорию.
Сервис с go-vshard-router поверх примера тарантула из оригинальной библиотеки vshard с использованием raft.
Бенчмарк | Число запусков | Время (ns/op) | Память (B/op) | Аллокации (allocs/op) |
---|---|---|---|---|
BenchmarkCallSimpleInsert_GO-12 | 14929 | 77443 | 2308 | 34 |
BenchmarkCallSimpleInsert_Lua-12 | 10196 | 116101 | 1098 | 19 |
BenchmarkCallSimpleSelect_GO-12 | 20065 | 60521 | 2534 | 40 |
BenchmarkCallSimpleSelect_Lua-12 | 12064 | 99874 | 1153 | 20 |
Топология:
- 4 репликасета (x2 инстанса на репликасет)
- 4 тарантул прокси
- 1 инстанс гошного сервиса
сценарий constant VUes: в нагрузке близкой к продовой
select