Установка инфраструктурных сервисов
Важно
Перед установкой инфраструктурных сервисов выполните Подготовку внутренней инфраструктуры и Установку кластера kubernetes в закрытом контуре.
Примечание
Настройки, используемые в запросах:
<nexus_registry> — внутренний репозиторий (пакеты, докер образы).
Установка СУБД (dlh-admdb1-tst)
Примечание
IPv6 должен быть отключен.
Для отключения выполните:
1# echo 'net.ipv6.conf.all.disable_ipv6 = 1' | sudo tee -a /etc/sysctl.conf > /dev/null
2# echo 'net.ipv6.conf.default.disable_ipv6 = 1' | sudo tee -a /etc/sysctl.conf > /dev/null
3# echo 'net.ipv6.conf.lo.disable_ipv6 = 1' | sudo tee -a /etc/sysctl.conf > /dev/null
4# sudo sysctl -p > /dev/null
5# sed -i '/^deb/s/^/#/' /etc/apt/sources.list /etc/apt/sources.list.d/*.list
6# curl http://<nexus_registry>/gpg | sudo apt-key add -
7# add-apt-repository -y "deb [arch=amd64] http://<nexus_registry>:8081/repository/test-deb jammy main"
8# apt update
9# apt upgrade
10# apt install docker-ce git curl net-tools telnet -y
11# systemctl enable docker
12# echo '{ "insecure-registries":["<nexus_registry>:5000"] }' | sudo tee /etc/docker/daemon.json
13# systemctl restart docker
14# mkdir -p /opt/data/postgres/initdb
15# cd /opt/data/postgres
1# nano docker-compose.yml
2version: '3.3'
3services:
4 db:
5 hostname: db
6 container_name: db
7 image: <nexus_registry>:5000/postgres:16.1
8 environment:
9 POSTGRES_USER: postgres
10 POSTGRES_PASSWORD: tee0Agha
11 restart: always
12 ports:
13 - '5432:5432'
14 volumes:
15 - ./initdb:/docker-entrypoint-initdb.d
16 - ./data:/var/lib/postgresql/data
17
18# nano initdb/init-user-db.sh
19#!/bin/bash
20set -e
21
22psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL
23 CREATE USER dlh_user with encrypted password 'dlh_user';
24
25 SELECT 'CREATE DATABASE data_catalogue'
26 WHERE NOT EXISTS (SELECT FROM pg_database WHERE datname = 'data_catalogue')\gexec
27 GRANT ALL PRIVILEGES ON DATABASE data_catalogue TO dlh_user;
28 GRANT USAGE, CREATE ON SCHEMA public TO dlh_user;
29
30 SELECT 'CREATE DATABASE raw_data_catalogue'
31 WHERE NOT EXISTS (SELECT FROM pg_database WHERE datname = 'raw_data_catalogue')\gexec
32 GRANT ALL PRIVILEGES ON DATABASE raw_data_catalogue TO dlh_user;
33 GRANT USAGE, CREATE ON SCHEMA public TO dlh_user;
34
35 SELECT 'CREATE DATABASE transformation_catalogue'
36 WHERE NOT EXISTS (SELECT FROM pg_database WHERE datname = 'transformation_catalogue')\gexec
37 GRANT ALL PRIVILEGES ON DATABASE transformation_catalogue TO dlh_user;
38
39 CREATE USER superset with encrypted password 'superset';
40 SELECT 'CREATE DATABASE superset'
41 WHERE NOT EXISTS (SELECT FROM pg_database WHERE datname = 'superset')\gexec
42 ALTER DATABASE superset OWNER TO superset;
43 GRANT ALL ON DATABASE superset TO superset;
44
45 CREATE USER airflow with encrypted password 'dlhairflowdb';
46 SELECT 'CREATE DATABASE airflow'
47 WHERE NOT EXISTS (SELECT FROM pg_database WHERE datname = 'airflow')\gexec
48 ALTER DATABASE airflow OWNER TO airflow;
49 GRANT ALL PRIVILEGES ON DATABASE airflow TO airflow;
50
51EOSQL
52
53# docker compose up -d
Важно
При настройке мониторинга, необходимо отслеживать занимаемое пространство wal-логами. В случае нарушения работы репликации, wal-логи могут активно расти и занять все свободное дисковое пространство, что приведет к остановке СУБД.
Настройка репликации СУБД (dlh-db1-tst)
Настройка ОС реплики СУБД
1# echo 'net.ipv6.conf.all.disable_ipv6 = 1' | sudo tee -a /etc/sysctl.conf > /dev/null
2# echo 'net.ipv6.conf.default.disable_ipv6 = 1' | sudo tee -a /etc/sysctl.conf > /dev/null
3# echo 'net.ipv6.conf.lo.disable_ipv6 = 1' | sudo tee -a /etc/sysctl.conf > /dev/null
4# sudo sysctl -p > /dev/null
5# sed -i '/^deb/s/^/#/' /etc/apt/sources.list /etc/apt/sources.list.d/*.list
6# curl http://<nexus_registry>/gpg | sudo apt-key add -
7# add-apt-repository -y "deb [arch=amd64] http://<nexus_registry>:8081/repository/test-deb jammy main"
8# apt update
9# apt upgrade
10# apt install docker-ce git curl net-tools telnet -y
11# systemctl enable docker
12# echo '{ "insecure-registries":["<nexus_registry>:5000"] }' | sudo tee /etc/docker/daemon.json
13# systemctl restart docker
Настройка основной СУБД (dlh-admdb1-tst)
1# cd /opt/data/postgres
2# echo "wal_level = replica
3max_wal_senders = 2
4max_replication_slots = 2
5hot_standby = on
6hot_standby_feedback = on" >> ./data/postgresql.conf
7# echo "host replication all 10.0.2.72/32 md5" >> ./data/pg_hba.conf
8# docker compose restart
Настройка реплицирующей СУБД
1# echo 10.0.2.71 dlh-admdb1-tst | sudo tee -a /etc/hosts
2# mkdir -p /opt/data/postgres-slave
3# cd /opt/data/postgres-slave
4
5# nano docker-compose.yml
6version: '3.3'
7services:
8 db-slave:
9 hostname: db-slave
10 container_name: db-slave
11 image: <nexus_registry>:5000/postgres:16.1
12 environment:
13 POSTGRES_USER: postgres
14 POSTGRES_PASSWORD: postgres
15 restart: always
16 ports:
17 - '5432:5432'
18 volumes:
19 - ./data:/var/lib/postgresql/data
20
21# docker compose up -d
22# rm data/* -r
23# docker exec -it db-slave bash
24# su - postgres -c "pg_basebackup --host=dlh-admdb1-tst --username=postgres --pgdata=/var/lib/postgresql/data --wal-method=stream --write-recovery-conf"
Через некоторое время репликация включится.
Проверка репликации, на основной СУБД (dlh-admdb1-tst):
1# docker exec -it db su - postgres -c "psql -c 'select * from pg_stat_replication;'"
Проверка репликации, на реплицирующей СУБД (dlh-db1-tst):
1# docker exec -it db-slave su - postgres -c "psql -c 'select * from pg_stat_wal_receiver;'"
Установка Apache Airflow и sftp
Подготовка ОС
1# echo 'net.ipv6.conf.all.disable_ipv6 = 1' | sudo tee -a /etc/sysctl.conf > /dev/null
2# echo 'net.ipv6.conf.default.disable_ipv6 = 1' | sudo tee -a /etc/sysctl.conf > /dev/null
3# echo 'net.ipv6.conf.lo.disable_ipv6 = 1' | sudo tee -a /etc/sysctl.conf > /dev/null
4# sudo sysctl -p > /dev/null
5# sed -i '/^deb/s/^/#/' /etc/apt/sources.list /etc/apt/sources.list.d/*.list
6# curl http://<nexus_registry>/gpg | sudo apt-key add -
7# add-apt-repository -y "deb [arch=amd64] http://<nexus_registry>:8081/repository/test-deb jammy main"
8# apt update
9# apt upgrade
10# apt install docker-ce git curl net-tools telnet -y
11# systemctl enable docker
12# echo '{ "insecure-registries":["<nexus_registry>:5000"] }' | sudo tee /etc/docker/daemon.json
13# systemctl restart docker
Запуск Airflow
1# export $(cat local-environment/bootstrap/airflow/docker/.env | xargs)
2# docker compose -f docker-compose-redis.yml -f docker-compose-airflow.yml config > run_airflow.yml
3# docker network create -d bridge ext_network
4# docker compose -f run_airflow.yml up -d
Настройка sftp
1# useradd -d /opt/data/airflow/local-environment/data -u 50000 airflow
2# passwd airflow (указать пароль для пользователя)
3# chown -R airflow:airflow local-environment/
4# echo '
5Match User airflow
6 ForceCommand internal-sftp
7 PasswordAuthentication yes
8 ChrootDirectory /opt/data/airflow/local-environment/data/airflow
9 PermitTunnel no
10 AllowAgentForwarding no
11 AllowTcpForwarding no
12 X11Forwarding no' | sudo tee -a /etc/ssh/sshd_config
13# useradd sftp_dlh -d /opt/data/sftp/sftp_dlh -m -s /bin/false
14# passwd sftp_dlh (указать пароль для пользователя)
15# mkdir -p /opt/data/sftp/sftp_dlh/chroot
16# chown -R sftp_dlh:sftp_dlh /opt/data/sftp/sftp_dlh/chroot
17# echo '
18Match User sftp_dlh
19 X11Forwarding no
20 AllowTcpForwarding no
21 ChrootDirectory %h
22 ForceCommand internal-sftp
23 AuthorizedKeysFile %h/.ssh/authorized_keys ' | sudo tee -a /etc/ssh/sshd_config
24# systemctl restart sshd
После отработки инициализирующих контейнеров и запуска приложения станет доступен веб-интерфейс Airflow по адресу http://<IP сервера>:8080.
Подготовка к установке Superset
Подготовка ОС
1# echo 'net.ipv6.conf.all.disable_ipv6 = 1' | sudo tee -a /etc/sysctl.conf > /dev/null
2# echo 'net.ipv6.conf.default.disable_ipv6 = 1' | sudo tee -a /etc/sysctl.conf > /dev/null
3# echo 'net.ipv6.conf.lo.disable_ipv6 = 1' | sudo tee -a /etc/sysctl.conf > /dev/null
4# sudo sysctl -p > /dev/null
5# sed -i '/^deb/s/^/#/' /etc/apt/sources.list /etc/apt/sources.list.d/*.list
6# curl http://<nexus_registry>/gpg | sudo apt-key add -
7# add-apt-repository -y "deb [arch=amd64] http://<nexus_registry>:8081/repository/test-deb jammy main"
8# apt update
9# apt upgrade
10# apt install docker-ce git curl net-tools telnet -y
11# systemctl enable docker
12# echo '{ "insecure-registries":["<nexus_registry>:5000"] }' | sudo tee /etc/docker/daemon.json
13# systemctl restart docker
Установка Superset
1# mkdir -p /opt/data/superset
2# scp -r {user_name}@{host}:/home/{user_name}/repo/superset /opt/data/
3# cd /opt/data/superset
В файле в секции database configurations /opt/data/superset/docker/.env-non-dev укажите актуальные значения.
Запустите Superset.
1# docker compose up -d
После отработки инициализирующих контейнеров и запуска приложения станет доступен веб-интерфейс Superset по адресу http://<IP сервера>:8088.
Настройте Superset в его базе (dlh-admdb1-tst).
1# docker exec -it db bash 2# su - postgres 3$ psql -d superset
Добавьте права «all datasource access on all datasource access» роли Gamma.
1INSERT INTO public.ab_permission_view_role (id, permission_view_id, role_id) 2 VALUES ((SELECT MAX(id)+1 FROM public.ab_permission_view_role), 3 (SELECT pv.id 4 FROM public.ab_permission_view AS pv 5 JOIN public.ab_permission AS p 6 ON pv.permission_id = p.id 7 JOIN public.ab_view_menu AS vm 8 ON vm.id = pv.view_menu_id 9 WHERE p.name = 'all_datasource_access' AND vm.name = 'all_datasource_access'), (SELECT id FROM public.ab_role WHERE name = 'Gamma'));
Добавьте права на чтение графиков для роли Public.
1INSERT INTO public.ab_permission_view_role (id, permission_view_id, role_id) 2VALUES ((SELECT MAX(id)+1 FROM public.ab_permission_view_role), 3 (SELECT pv.id 4FROM public.ab_permission_view AS pv 5JOIN public.ab_permission AS p 6ON pv.permission_id = p.id 7JOIN public.ab_view_menu AS vm 8ON vm.id = pv.view_menu_id 9WHERE p.name = 'can_read' AND vm.name = 'Chart'), (SELECT id FROM public.ab_role WHERE name = 'Public')); 10 11INSERT INTO public.ab_permission_view_role (id, permission_view_id, role_id) 12VALUES ((SELECT MAX(id)+1 FROM public.ab_permission_view_role), 13 (SELECT pv.id 14FROM public.ab_permission_view AS pv 15JOIN public.ab_permission AS p 16ON pv.permission_id = p.id 17JOIN public.ab_view_menu AS vm 18ON vm.id = pv.view_menu_id 19WHERE p.name = 'all_datasource_access' AND vm.name = 'all_datasource_access'), (SELECT id FROM public.ab_role WHERE name = 'Public')); 20 21INSERT INTO public.ab_permission_view_role (id, permission_view_id, role_id) 22VALUES ((SELECT MAX(id)+1 FROM public.ab_permission_view_role), 23 (SELECT pv.id 24FROM public.ab_permission_view AS pv 25JOIN public.ab_permission AS p 26ON pv.permission_id = p.id 27JOIN public.ab_view_menu AS vm 28ON vm.id = pv.view_menu_id 29WHERE p.name = 'all_database_access' AND vm.name = 'all_database_access'), (SELECT id FROM public.ab_role WHERE name = 'Public')); 30 31DELETE FROM public.ab_permission_view_role WHERE permission_view_id = (SELECT pv.id 32FROM public.ab_permission_view AS pv 33JOIN public.ab_permission AS p 34ON pv.permission_id = p.id 35JOIN public.ab_view_menu AS vm 36ON vm.id = pv.view_menu_id 37WHERE p.name = 'can_write' AND vm.name = 'Chart') AND role_id = (SELECT id FROM public.ab_role WHERE name = 'Public');
Установка Pulsar
Подготовка ОС
1# echo 'net.ipv6.conf.all.disable_ipv6 = 1' | sudo tee -a /etc/sysctl.conf > /dev/null
2# echo 'net.ipv6.conf.default.disable_ipv6 = 1' | sudo tee -a /etc/sysctl.conf > /dev/null
3# echo 'net.ipv6.conf.lo.disable_ipv6 = 1' | sudo tee -a /etc/sysctl.conf > /dev/null
4# sudo sysctl -p > /dev/null
5# sed -i '/^deb/s/^/#/' /etc/apt/sources.list /etc/apt/sources.list.d/*.list
6# curl http://<nexus_registry>/gpg | sudo apt-key add -
7# add-apt-repository -y "deb [arch=amd64] http://<nexus_registry>:8081/repository/test-deb jammy main"
8# apt update
9# apt upgrade
10# apt install docker-ce git curl net-tools telnet -y
11# systemctl enable docker
12# echo '{
13 "insecure-registries":["<nexus_registry>:5000"],
14 "log-driver": "json-file",
15 "log-opts": {"max-size": "10m", "max-file": "3"}
16}' | sudo tee /etc/docker/daemon.json
17# systemctl restart docker
Установка Pulsar
1# mkdir -p /opt/data/pulsar
2# cd /opt/data/pulsar
3# chown 10000 -R conf/ data/
4# docker compose up -d
После запуска всех сервисов создайте функцию и пользователя веб-интерфейса.
1# ./create_pulsar_debezium_router_function.sh
2# ./create_webui_user.sh
После успешного запуска всех сервисов будет доступен веб-интерфейс Pulsar http://<IP сервера>:9527.
Настройка Kafka-Kraft
Создайте каталог /opt/kafka и сопутствующие каталоги для данных на каждом хосте кафка кластера и выставить необходимые права.
1# mkdir -p /opt/kafka/{clusterID,data} 2# chown -R 1000:1000 /opt/kafka/*
Скопируйте содержимое репозитория в /opt/kafka на каждом хосте кафка кластера.
1# cp -r ./scripts /opt/kafka/ 2# cp docker-compose-kafka.yml /opt/kafka/
На каждой ноде кластера kafka отредактируйте в файле docker-compose-kafka.yml значение ключей:
Ключ
Описание
hostname
Привести нумерацию и наименования хоста
к соотвествию с реальным hostname.
KAFKA_LISTENERS
Привести нумерацию наименования хоста к
соотвествию.
KAFKA_ADVERTISED_LISTENERS
Привести нумерацию наименования хоста к
соотвествию.
KAFKA_CONTROLLER_QUORUM_VOTERS
Указать ip адреса хостов кафки.
KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS
Указать ip адреса хостов кафки.
KAFKA_NODE_ID
Пронумеровать последовательно каждую
ноду kafka.
Сгенерируйте ClusterID на первой ноде Kafka.
1# chown -R 1000:1000 /opt/kafka/clusterID 2# docker run -v /opt/kafka/scripts/create_cluster_id.sh:/tmp/create_cluster_id.sh -v /opt/kafka/clusterID:/tmp/clusterID <nexus_registry>:5000/kafka:7.5.3 bash -c '/tmp/create_cluster_id.sh'
Результатом выполнения команды будет сообщение:
Cluster id has been created...а в директории /opt/kafka/clusterID появиться файл clusterID.
Скопируйте полученный файл из п.4 по пути /opt/kafka/clusterID с первой ноды kafka по такому же пути на все ноды.
Запустите cluster kafka выполнив последовательно на каждом хосте kafka следующую команду:
1# docker compose -f /opt/kafka/docker-compose-kafka.yml up -d
Проверьте по логам наличие ошибок:
1# docker compose -f /opt/kafka/docker-compose-kafka.yml logs kafka
Тестирование:
Создайте топик:
1# docker exec -ti kafka /usr/bin/kafka-topics --create --bootstrap-server <ip-kafka1>:9092,<ip-kafka2>:9092,<ip-kafka3>:9092 --replication-factor 3 --partitions 3 --topic topic1
Запишите в топик данные:
1# docker exec -ti kafka /usr/bin/kafka-console-producer --bootstrap-server <ip-kafka1>:9092,<ip-kafka2>:9092,<ip-kafka3>:9092 --topic topic1
Считайте из топика данные:
1# docker exec -ti kafka /usr/bin/kafka-console-consumer --bootstrap-server <ip-kafka1>:9092,<ip-kafka2>:9092,<ip-kafka3>:9092 --topic topic1 --from-beginning
где <ip-kafka> - ip адрес хоста соответствующей кафки
Через Kafka WEB-UI посмотрите состояние кластера Kafka. Все ноды должны присутствовать в списке brokers:
В браузере открыть ссылку - http://<ip addr kafka>:8090/ui/clusters/UFD/brokers, где <ip addr kafka> - ip адрес любого хоста кафки.
Установка Apicurio server
Создайте каталог /opt/apicurio на хосте:
1# mkdir -p /opt/apicurio
Скопируйте содержимое репозитория в /opt/apicurio:
1# cp -r ./jmx_exporter /opt/apicurio/ 2# cp -r ./logconfig /opt/apicurio/ 3# cp docker-compose-apicurio.yml /opt/apicurio/
Создайте БД apicurio в СУБД PG.
Отредактируйте в файле docker-compose-apicurio.yml значение ключей:
Ключ
Описание
REGISTRY_DATASOURCE_URL
IP адрес СУБД PG и бд apicurio.
REGISTRY_DATASOURCE_USERNAME
Логин доступа до БД apicurio в PG.
REGISTRY_DATASOURCE_PASSWORD
Пароль доступа до БД apicurio в PG.
Запустите Apicurio server, выполнив последовательно на каждом хосте kafka-connect следующую команду:
1# docker compose -f /opt/apicurio/docker-compose-apicurio.yml up -d
Проверьте по логам наличие ошибок:
1# docker compose -f /opt/apicurio/docker-compose-apicurio.yml logs
Установка Kafka-Connect
Создайте каталог /opt/kconnect на каждом хосте kafka-connect кластера:
1# mkdir -p /opt/kconnect
Скопируйте содержимое репозитория в /opt/kconnect на каждом хосте kafka-connect кластера:
1# cp docker-compose-kconnect.yml /opt/kconnect/
На каждой ноде кластера kafka-connect отредактируйте в файле docker-compose-kconnect.yml значение ключей:
Ключ
Описание
hostname
Привести нумерацию и наименования хоста к
соотвествию с реальным hostname.
container_name
Привести нумерацию к соотвествию.
BOOTSTRAP_SERVERS
IP адрес хостов kafka-kraft и порты
(по-умолчанию 9092).
ADVERTISED_HOST_NAME
Привести нумерацию и наименования хоста к
соотвествию.
CONNECT_KEY_CONVERTER_APICURIO.
REGISTRY_URL
Адрес APICURIO API URL
(http://<IP APICURIO SERVER>:8080/apis/registry/v2)
APICURIO_REGISTRY_URL
Адрес APICURIO API URL
(http://<IP APICURIO SERVER>:8080/apis/registry/v2)
CONFIG_STORAGE_TOPIC
Префикс для соответствующего стенда
(пример dev.dlh.kconnect-configs для dev стенда)
OFFSET_STORAGE_TOPIC
Префикс для соответствующего стенда
(пример dev.dlh.kconnect-offsets для dev стенда)
STATUS_STORAGE_TOPIC
Префикс для соответствующего стенда
(пример dev.dlh.kconnect-statuses для dev стенда)
Запустите cluster kafka-connect, выполнив последовательно на каждом хосте kafka-connect следующую команду:
1# docker compose -f /opt/kconnect/docker-compose-kconnect.yml up -d
Проверьте по логам наличие ошибок:
1# docker compose -f /opt/kconnect/docker-compose-kconnect.yml logs
Настройка Vault
Включите хранение секретов по пути secret:
1# vault secrets enable -path=secret/ kv
Успешный ответ:
Success! Enabled the kv secrets engine at: secret/
Создайте подгруппу DLH через создание тестового ключа:
1# vault kv put secret/dlh/hello foo=world
Успешный ответ:
Success! Data written to: secret/dlh/hello
Создайте security policy для доступов и применить правило:
1# nano dlh-policy.hcl 2path "secret/*" { 3 capabilities = ["list"] 4} 5path "secret/data/dlh/*" { 6 capabilities = ["list", "read", "create", "update", "delete"] 7} 8path "secret/delete/dlh/*" { 9 capabilities = ["update"] 10} 11path "secret/destroy/dlh/*" { 12 capabilities = ["update"] 13} 14path "secret/metadata/dlh/*" { 15 capabilities = ["list", "read", "delete"] 16} 17 18# vault policy write dlh-policy dlh-policy.hcl
Разрешите время жизни токенов на 1 год:
1# vault write sys/auth/token/tune default_lease_ttl=9000h
Создайте токен для доступа к ключам и задайте ему policy:
1# vault token create -policy=dlh-policy -renewable
Полученный токен укажите в настройках VAULT для DLH.