В днешно време Docker е най-разпространеният инструмент за създаване, внедряване и стартиране на приложения чрез използване на контейнери. Позволява ни да пакетираме приложение с всички необходими части, като библиотеки и други зависимости, и да го изпратим като един пакет. Може да се разглежда като виртуална машина, но вместо да създава цяла виртуална операционна система, Docker позволява на приложенията да използват същото ядро на Linux като системата, на която работят, и изисква приложенията да се доставят само с неща, които все още не се изпълняват. хост компютъра. Това дава значително увеличение на производителността и намалява размера на приложението.
В случай на Docker Images, те идват с предварително дефинирана версия на ОС и пакетите се инсталират по начин, който е решен от лицето, създало изображението. Възможно е да искате да използвате различна ОС или може би искате да инсталирате пакетите по различен начин. В тези случаи трябва да използвате чисто изображение на Docker OS и да инсталирате софтуера от нулата.
Репликацията е често срещана функция в средата на база данни, така че след като сте разположили TimescaleDB Docker Images, ако искате да конфигурирате настройка за репликация, ще трябва да го направите ръчно от контейнера, като използвате Docker файл или дори скрипт. Тази задача може да бъде сложна, ако нямате познания за Docker.
В този блог ще видим как можем да внедрим TimescaleDB чрез Docker, като използваме TimescaleDB Docker Image, а след това ще видим как да го инсталираме от нулата с помощта на изображение на CentOS Docker и ClusterControl.
Как да внедрите TimescaleDB с изображение на Docker
Първо, нека видим как да разположим TimescaleDB, като използваме изображение на Docker, достъпно в Docker Hub.
$ docker search timescaledb
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
timescale/timescaledb An open-source time-series database optimize… 52
Ще вземем първия резултат. И така, трябва да изтеглим това изображение:
$ docker pull timescale/timescaledb
И стартирайте контейнерите на възел, които преобразуват локален порт към порта на базата данни в контейнера:
$ docker run -d --name timescaledb1 -p 7551:5432 timescale/timescaledb
$ docker run -d --name timescaledb2 -p 7552:5432 timescale/timescaledb
След като изпълните тези команди, трябва да създадете тази Docker среда:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6d3bfc75fe39 timescale/timescaledb "docker-entrypoint.s…" 15 minutes ago Up 15 minutes 0.0.0.0:7552->5432/tcp timescaledb2
748d5167041f timescale/timescaledb "docker-entrypoint.s…" 16 minutes ago Up 16 minutes 0.0.0.0:7551->5432/tcp timescaledb1
Сега можете да получите достъп до всеки възел със следните команди:
$ docker exec -ti [db-container] bash
$ su postgres
$ psql
psql (9.6.13)
Type "help" for help.
postgres=#
Както можете да видите, това изображение на Docker съдържа версия TimescaleDB 9.6 по подразбиране и е инсталирано на Alpine Linux v3.9. Можете да използвате различна версия на TimescaleDB, като промените етикета:
$ docker pull timescale/timescaledb:latest-pg11
След това можете да създадете потребител на база данни, да промените конфигурацията според вашите изисквания или да конфигурирате ръчно репликация между възлите.
Как да разположите TimescaleDB с ClusterControl
Сега, нека да видим как да разположим TimescaleDB с Docker, като използваме изображение на CentOS Docker (centos) и изображение на Docker ClusterControl (severalnines/clustercontrol).
Първо, ще разположим ClusterControl Docker Container, използвайки най-новата версия, така че трябва да изтеглим изображението за докер няколко деветки/clustercontrol.
$ docker pull severalnines/clustercontrol
След това ще стартираме контейнера ClusterControl и ще публикуваме порт 5000 за достъп до него.
$ docker run -d --name clustercontrol -p 5000:80 severalnines/clustercontrol
Сега можем да отворим потребителския интерфейс на ClusterControl на адрес http://[Docker_Host]:5000/clustercontrol и да създадем администраторски потребител и парола по подразбиране.
Официалното изображение на Docker на CentOS идва без SSH услуга, така че ще го инсталираме и ще разрешим връзката от възела ClusterControl без парола с помощта на SSH ключ.
$ docker search centos
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
centos The official build of CentOS. 5378 [OK]
И така, ще изтеглим официалното изображение на Docker на CentOS.
$ docker pull centos
След това ще изпълним два контейнера на възли, timescale1 и timescale2, свързани с ClusterControl и ще съпоставим локален порт за свързване към базата данни (по избор).
$ docker run -dt --privileged --name timescale1 -p 8551:5432 --link clustercontrol:clustercontrol centos /usr/sbin/init
$ docker run -dt --privileged --name timescale2 -p 8552:5432 --link clustercontrol:clustercontrol centos /usr/sbin/init
Тъй като трябва да инсталираме и конфигурираме SSH услугата, трябва да стартираме контейнера с привилегировани и /usr/sbin/init параметри, за да можем да управляваме услугата вътре в контейнера.
След като изпълним тези команди, трябва да създадем тази Docker среда:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
230686d8126e centos "/usr/sbin/init" 4 seconds ago Up 3 seconds 0.0.0.0:8552->5432/tcp timescale2
c0e7b245f7fe centos "/usr/sbin/init" 23 seconds ago Up 22 seconds 0.0.0.0:8551->5432/tcp timescale1
7eadb6bb72fb severalnines/clustercontrol "/entrypoint.sh" 2 weeks ago Up About an hour (healthy) 22/tcp, 443/tcp, 3306/tcp, 9500-9501/tcp, 9510-9511/tcp, 9999/tcp, 0.0.0.0:5000->80/tcp clustercontrol
Имаме достъп до всеки възел със следната команда:
$ docker exec -ti [db-container] bash
Както споменахме по-рано, трябва да инсталираме SSH услугата, така че нека да я инсталираме, да разрешим root достъпа и да зададем root парола за всеки контейнер на база данни:
$ docker exec -ti [db-container] yum update -y
$ docker exec -ti [db-container] yum install -y openssh-server openssh-clients
$ docker exec -it [db-container] sed -i 's|^#PermitRootLogin.*|PermitRootLogin yes|g' /etc/ssh/sshd_config
$ docker exec -it [db-container] systemctl start sshd
$ docker exec -it [db-container] passwd
Последната стъпка е да настроите SSH без парола към всички контейнери на база данни. За това трябва да знаем IP адреса за всеки възел на базата данни. За да го разберем, можем да изпълним следната команда за всеки възел:
$ docker inspect [db-container] |grep IPAddress
"IPAddress": "172.17.0.5",
След това прикачете към интерактивната конзола на контейнера ClusterControl:
$ docker exec -it clustercontrol bash
И копирайте SSH ключа във всички контейнери на база данни:
$ ssh-copy-id 172.17.0.5
Сега имаме стартирани и работещи сървърни възли, трябва да разположим нашия клъстер от база данни. За да го направим по лесен начин, ще използваме ClusterControl.
За да извършите внедряване от ClusterControl, отворете потребителския интерфейс на ClusterControl на адрес http://[Docker_Host]:5000/clustercontrol, след което изберете опцията „Внедряване“ и следвайте инструкциите, които се появяват.
Когато избираме TimescaleDB, трябва да посочим потребител, ключ или парола и порт за свързване чрез SSH към нашите сървъри. Също така имаме нужда от име за нашия нов клъстер и ако искаме ClusterControl да инсталира съответния софтуер и конфигурации вместо нас.
След като настроим информацията за SSH достъп, трябва да дефинираме потребителя на базата данни, версията и datadir (по избор). Можем също да посочим кое хранилище да използваме.
В следващата стъпка трябва да добавим нашите сървъри към клъстера, който ще създадем.
Тук трябва да използваме IP адреса, който получихме от всеки контейнер по-рано.
В последната стъпка можем да изберем дали нашата репликация ще бъде синхронна или асинхронна.
Можем да наблюдаваме състоянието на създаването на нашия нов клъстер от монитора на активността на ClusterControl.
След като задачата приключи, можем да видим нашия клъстер в главния екран на ClusterControl.
Имайте предвид, че ако искате да добавите още възли в режим на готовност, можете да го направите от потребителския интерфейс на ClusterControl в менюто Действия на клъстера.
По същия начин, ако вашият TimescaleDB клъстер работи на Docker и искате ClusterControl да го управлява, за да може да използва всички функции на тази система като наблюдение, архивиране, автоматично превключване при отказ и дори повече, можете просто да стартирате Контейнер ClusterControl в същата Docker мрежа като контейнерите на базата данни. Единственото изискване е да се гарантира, че целевите контейнери имат инсталирани свързани с SSH пакети (openssh-server, openssh-clients). След това разрешете SSH без парола от ClusterControl към контейнерите на базата данни. След като приключите, използвайте функцията „Импортиране на съществуващ сървър/клъстер“ и клъстерът трябва да бъде импортиран в ClusterControl.
Един възможен проблем при стартиране на контейнери е присвояването на IP адрес или име на хост. Без инструмент за оркестриране като Kubernetes, IP адресът или името на хост може да са различни, ако спрете възлите и създадете нови контейнери, преди да го стартирате отново. Ще имате различен IP адрес за старите възли и ClusterControl предполага, че всички възли работят в среда със специален IP адрес или име на хост, така че след промяна на IP адреса трябва да импортирате отново клъстера в ClusterControl. Има много решения за този проблем, можете да проверите тази връзка, за да използвате Kubernetes със StatefulSet, или тази за стартиране на контейнери без инструмент за оркестриране.
Заключение
Както видяхме, внедряването на TimescaleDB с Docker трябва да бъде лесно, ако не искате да конфигурирате среда за репликация или отказ и ако не искате да правите промени в версията на ОС или инсталацията на пакети от база данни.
С ClusterControl можете да импортирате или разгръщате своя TimescaleDB клъстер с Docker, като използвате изображението на ОС, което предпочитате, както и да автоматизирате задачите за наблюдение и управление като архивиране и автоматично превключване/възстановяване.