Skip to content

Latest commit

 

History

History
262 lines (198 loc) · 9.55 KB

README_ru.md

File metadata and controls

262 lines (198 loc) · 9.55 KB

Go VShard Router

go vshard router logo

Go Reference Actions Status Go Report Card Code Coverage License

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
Loading

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

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

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

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

С помощью 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

Сначала вам необходимо импортировать пакет 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)
}

Провайдеры

topology

Мы понимаем, что реализации логгеров, метрик, а так же источников топологии могут сильно отличаться в реализации и использовании. Поэтому 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.

Бенчмарки

Go Bench

Бенчмарк Число запусков Время (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

  • 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