Skip to content

Latest commit

 

History

History
237 lines (193 loc) · 8.15 KB

README_ru.md

File metadata and controls

237 lines (193 loc) · 8.15 KB

Go VShard Router

go vshard router logo

Go Reference Actions Status Go Report Card codecov

Translations:

go-vshard-router — библиотека для отправки запросов напрямую в стораджа в шардированный кластер tarantool, без использования tarantool-router. Эта библиотека написана на основе модуля библиотеки tarantool vhsard router. go-vshard-router применяет новый подход к созданию кластера

Схема кластера с tarantool-proxy

graph TD
    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
Loading

Новая схема использования

graph TD
    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

    ROUTER1["Tarantool vshard-router(As contorol plane)"]
    ROUTER1 --> MASTER1
    ROUTER1 --> REPLICA1
Loading

Как начать использовать?

Предварительные условия

  • Go: любая из двух последних мажорных версий releases.

Установка Go-Vshard-Router

С помощью Go module можно добавить следующий импорт

import "github.com/tarantool/go-vshard-router"

в ваш код, а затем go [build|run|test] автоматически получит необходимые зависимости.

В противном случае выполните следующую команду Go, чтобы установить пакет go-vshard-router:

$ go get -u github.com/tarantool/go-vshard-router

Использование Go-Vshard-Router

Сначала вам необходимо импортировать пакет go-vshard-router для его использования.

package main

import (
  "context"
  "fmt"
  "strconv"
  "time"

  vshardrouter "github.com/tarantool/go-vshard-router"
  "github.com/tarantool/go-vshard-router/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{
      vshardrouter.ReplicasetInfo{
        Name: "replcaset_1",
        UUID: uuid.New(),
      }: {
        {
          Addr: "127.0.0.1:1001",
          Name: "1_1",
        },
        {
          Addr: "127.0.0.1:1002",
          Name: "1_2",
        },
      },
      vshardrouter.ReplicasetInfo{
        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 := vshardrouter.BucketIDStrCRC32(strconv.FormatUint(user.ID, 10), directRouter.RouterBucketCount())

  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)
}

Провайдеры

Как источник конфигурации вы можете использовать провайдеры топологии(конфигурации). На данный момент есть поддержка следующих провайдеров:

  • etcd (для конфигурации аналогичной moonlibs/config в etcd v2 для tarantool версии ниже 3)
  • static (для указания конфигурации прямо из кода и простоты тестирования)
  • viper
    • etcd v3
    • consul
    • files

Ознакомьтесь с другими примерами

Быстрое начало

Познакомьтесь с Полной документацией, которая включает в себя примеры и теорию.

Сервис с go-vshard-router поверх примера тарантула из оригинальной библиотеки vshard с использованием raft.

Бенчмарки

Go Bench

Бенчмарк Число запусков Время (ns/op) Память (B/op) Аллокации (allocs/op)
BenchmarkCallSimpleInsert_GO-12 14216 81118 1419 29
BenchmarkCallSimpleInsert_Lua-12 9580 123307 1131 19
BenchmarkCallSimpleSelect_GO-12 18832 65190 1879 38
BenchmarkCallSimpleSelect_Lua-12 9963 104781 1617 28

Топология:

  • 4 репликасета (x2 инстанса на репликасет)
  • 4 тарантул прокси
  • 1 инстанс гошного сервиса

сценарий constant VUes: в нагрузке близкой к продовой

select

  • go-vshard-router: uncritically worse latency, but 3 times more rps Image alt
  • tarantool-router: (80% cpu, heavy rps kills proxy at 100% cpu) Image alt