docker swarm - запуск tarantool

Thank you for reading this post, don't forget to subscribe!

Настройка master-master-master:

 

cat tarantool-stack.yml

[codesyntax lang="php"]

[/codesyntax]

В дан­ном при­ме­ре запус­ка­ют­ся 3 сер­ви­са tarantool c одной кон­фи­гу­ра­ци­ей app_lua (в дан­ном слу­чае она external)

app.lua

[codesyntax lang="php"]

[/codesyntax]

Для настрой­ки Shard исполь­зу­ет­ся та же конфигурация

Здесь при ини­ци­а­ли­за­ции созда­ет­ся БД test

Для настрой­ки Shard исполь­зу­ет­ся та же конфигурация

Биб­лио­те­ка уров­ня при­ло­же­ния, кото­рая обес­пе­чи­ва­ет сег­мен­ти­ро­ва­ние и надеж­ную репли­ка­цию на сто­роне кли­ен­та для tarantool . Реа­ли­зу­ет одно­фаз­ные и двух­фаз­ные про­то­ко­лы опе­ра­ций (с под­держ­кой пакет­ной обра­бот­ки), отсле­жи­ва­ет доступ­ность узлов и авто­ма­ти­че­ски исклю­ча­ет отка­зав­шие узлы из кластера.

Для раз­де­ле­ния дан­ных меж­ду узла­ми исполь­зу­ет­ся вари­ант согла­со­ван­но­го хеширования.

  • redundancy - коэф­фи­ци­ент избы­точ­но­сти. Сколь­ко копий каж­до­го кор­те­жа нуж­но хра­нить в кластере
  • zone - зона резер­ви­ро­ва­ния. Может пред­став­лять одну маши­ну или один центр обра­бот­ки дан­ных. Коли­че­ство зон долж­но быть боль­ше или рав­но коэф­фи­ци­ен­ту избы­точ­но­сти: дуб­ли­ро­ва­ние дан­ных в одной зоне не уве­ли­чи­ва­ет доступность.

К теку­щей кон­фи­гу­ра­ции добав­ля­ем:

[codesyntax lang="php"]

[/codesyntax]

Дан­ную кон­фи­гу­ра­цию мож­но доба­вить как в файл ини­ци­а­ции БД, так и уже в рабо­та­ю­щей Базе из кон­со­ли:

docker exec -it 71b8935d0cd3 console

… вво­дим всё выше­на­пи­сан­ное, затем

shard = require('shard')

shard.init(cfg)

И для про­вер­ки вне­сем дан­ные в один из экзем­пля­ров tarantool

shard.tester:insert{1,'Tuple #1'}

В дру­гом экзем­пля­ре из кон­со­ли выпол­ним селект:

shard.tester:select{1}

---  вывод

- - - [1, 'Tuple #1']

Зна­чит репли­ка­ция работает

 

Настройка master-slave-slave:

cat docker-compose-replica.yml

[codesyntax lang="php"]

[/codesyntax]

cat app.lua

[codesyntax lang="php"]

[/codesyntax]

cat app-replica.lua

[codesyntax lang="php"]

[/codesyntax]

Основ­ное отли­чие двух кон­фи­гов это в том что для масте­ра - read_only = false, для слей­вов - read_only = true.

Так же в docker-compose.yml для реплик ука­зы­ва­ет­ся один и тот репли­ка­ци­он­ный ресурс: TARANTOOL_REPLICATION_SOURCE: replicator:password@tarantool1:3301

Для масте­ра он отсутствует.

 

админ­ка доступ­на на гите:
git clone https://github.com/basis-company/tarantool-admin.git

docker config create app_lua app.lua
docker config create app_replica_lua app-replica.lua
запус­ка­ем стек:
docker stack deploy -c docker-compose-replica.yml tarantool

 

Настрой­ка мастер-мастер на хосто­вых системах

Важ­но! Экзем­пля­ры таран­ту­ла нуж­но запус­кать в опре­де­лен­ной последовательности:

  1. Запус­ка­ем экзем­пляр таран­ту­ла на 1-вом сер­ве­ре, в каче­стве поля listener ука­зы­ва­ем само­го себя.

cat /etc/tarantool/instances.available/my_app.lua

systemctl start tarantool@my_app

  1. Далее запус­ка­ем экзем­пляр таран­ту­ла на 2-ом сер­ве­ре, в каче­стве поля listener ука­зы­ва­ем само­го себя и 1-ый сервер

cat /etc/tarantool/instances.available/my_app.lua

systemctl start tarantool@my_app

  1. Воз­вра­ща­ем­ся на пер­вый сер­вер и добав­ля­ем в поле listener 2-ой сервер

cat /etc/tarantool/instances.available/my_app.lua

Рестар­ту­ем сервис.

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

Под­клю­чить­ся к экзем­пля­ру это­го же сер­ве­ра мож­но командой:

tarantoolctl enter my_app ### здесь мы без про­блем попа­да­ем в экзем­пляр без логи­на и паро­ля (вро­де как под­клю­ча­ем­ся под учет­кой admin)

Под­клю­чить­ся к экзем­пля­ру 2го сер­ве­ра с 1го (или дру­го­го сер­ве­ра) сер­ве­ра мож­но так:

tarantool

tarantool> console = require('console')

tarantool> console.connect('replicator:password@10.242.144.4:3301')

Здесь при под­клю­че­нии мы явно ука­зы­ва­ем логин и пароль для под­клю­че­ния. Необ­хо­ди­мо, что­бы у поль­зо­ва­те­ля были необ­хо­ди­мые права.

#выдать пра­ва на под­клю­че­ние, чте­ние, запись, выпол­не­ние #box.schema.user.grant('replicator', 'read,write,execute,session,usage', 'universe')

Про­ве­рить суще­ству­ет ли поль­зо­ва­тель командой:

box.schema.user.exists('replicator') ##вер­нет true или false

box.space # посмот­реть все спейсы

Важ­но!! В кон­со­ле таран­ту­ла сохра­ня­ет­ся исто­рия всех команд, в том чис­ле и коман­ды с паро­ля­ми, поэто­му есть необ­хо­ди­мость ее зачи­щать после настро­ек. Мож­но это делать так:

os.execute("clear") # очист­ка исто­рии кон­со­ли таранул

---

for i = 1, 255 do
print()
End

-----

либо так, заби­ва­ем кон­соль пусты­ми стро­ка­ми и для дру­го­го поль­зо­ва­те­ля она будет выгля­деть пустой

Для настрой­ки шар­ди­ро­ва­ния таран­ту­ла нам необ­хо­ди­мо поста­вить допол­ни­тель­ный пакет

yum install install tarantool-shard

Необ­хо­ди­мо раз­ру­шить репли­ка­цию и при­сту­пить к настрой­ке шардинга.