Руководство по установке для тестовых сред EVTP#
Общая подготовка любого узла, с которым планируется работа#
ВАЖНО! Для выполнения установки необходимо иметь доступ к узлу, с которого будет осуществляться установка — локально или по SSH под пользователем, имеющим на узле права администратора (находящимся в группе wheel), либо под пользователем root.
ВАЖНО! Некоторые команды выполняются под пользователем root. Перед выполнением команды будет сообщение: «Выполните следующие команды под пользователем root».
Также необходимо уметь пользоваться консолью для выполнения команд.
В случае, если для выполнения какой-либо команды ниже не хватает прав вашего пользователя — повторить команду, добавив к ней в начале sudo. Например:
sudo yum -y install unzip
Также желательно уметь пользоваться оболочками, подобными Far или Midnight Commander, для навигации и работы с файлами.
ВАЖНО! Данная инструкция реализована для узла с ОС Linux CentOS 8.0 и выше, имеющего доступ к сети Интернет. Менеджеры пакетов на других версиях Linux и способы их установки в корпоративных сетях могут отличаться.
Проверка версии Linux:
cat /etc/*-release
Первая строчка вывода покажет версию (например, «CentOS Linux release 8.1.1911 (Core)»).
ВАЖНО! Предполагается, что все упомянутые ниже произвольные текстовые метки содержат буквы только латинского алфавита. Использование алфавитов других языков не проверялось.
ВАЖНО! Для работы компонента EVTP необходим предварительно настроенный кластер Zookeeper. С настройками и установкой можно ознакомиться на официальном сайте Zookeeper.
Подключиться к узлу, на котором будет осуществляться установка, по SSH или локально под пользователем, имеющим на узле права администратора (находящимся в группе wheel), либо под пользователем
root.
Для входа по SSH с локальной машины - запустить локальный терминал (консоль) и ввести в командной строке:
"ssh <имя_пользователя>@<ip_адрес_узла>"
, где <имя_пользователя> — логин пользователя, под которым хотим зайти на удаленный узел. Например, «ssh root@IP_ADDRESS». После ввода в консоли будет запрошен пароль — ввести пароль пользователя, под которым хотим зайти на удаленный узел (процесс ввода в консоли никак не будет отображаться) и нажать enter (для mac — return).
При подключении по SSH сразу после подключения вы окажетесь в домашней директории пользователя, под которым выполнено подключение.
Проверить версию Python командой:
(python3 --version)
Если вывод консоли: -bash: python3: command not found) - проверить наличие версий ниже:
python2 --version или python --version
Если никакая версия не обнаружена - установить Python версии 2.7.18.
Если при попытке установки системных программ через репозиторий yam появляется проблема похожая на:
CentOS-8 - AppStream 28 B/s | 38 B 00:01
Error: Failed to download metadata for repo 'AppStream': Cannot prepare internal mirrorlist: No URLs in mirrorlist
Выполните следующие команды под пользователем root:
cd /etc/yum.repos.d/
sudo sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
sudo sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
И далее выполните команду установки Python:
sudo dnf module install python27
Подготовка узлов для развертывания компонента#
Подключиться к узлу, с которого будет осуществляться установка, по SSH или локально под пользователем, имеющим на узле права администратора (находящимся в группе wheel), либо под пользователем
root.
Для входа по SSH с локальной машины — запустить локальный терминал (консоль) и ввести в командной строке
ssh <имя_пользователя>@<ip_адрес_узла>
, где <имя_пользователя> - логин пользователя, под которым хотим зайти на удаленный узел. Например, «ssh em@IP_ADDRESS». После ввода в консоли будет запрошен пароль — ввести пароль пользователя, под которым хотим зайти на удаленный узел (процесс ввода в консоли никак не будет отображаться) и нажать enter (для mac - return).
При подключении по SSH сразу после подключения вы окажетесь в домашней директории пользователя, под которым выполнено подключение.
Установка пакетов unzip, openJDK 11:
Проверить наличие пакетов unzip и openJDK 11.
Проверка — ввод в консоли unzip без аргументов. При наличии пакета — будет выведена справка об аргументах. При отсутствии — сообщение о неизвестной команде.
При отсутствии пакета выполнить команду:
sudo yum -y install unzip
Проверить наличие пакета openjdk-11.
Для этого ввести в консоли команду:
java -version
При наличии пакета — будет выведено сообщение вида:
openjdk version "11.0.13" 2021-10-19 LTS
OpenJDK Runtime Environment 18.9 (build 11.0.13+8-LTS)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.13+8-LTS, mixed mode, sharing)
При отсутствии - сообщение о неизвестной команде. При отсутствии пакета выполнить:
sudo yum -y install java-11-openjdk
sudo echo "export JAVA_HOME=\$(dirname \$(dirname \$(realpath \$(which java))))" > /etc/profile.d/java.sh
sudo source /etc/profile.d/java.sh
echo $JAVA_HOME
Ответ в терминале: /usr/lib/jvm/java-11-openjdk-11.0.13.0.8-4.el8_5.x86_64
При установленной версии Java, отличающейся от необходимой, выполнить:
sudo update-alternatives --config java
В консоле отобразится список всех java версий:
* 1 java-11-openjdk.x86_64 (/usr/lib/jvm/java-11-openjdk-11.0.13.0.8-4.el8_5.x86_64/bin/java)
+ 2 java-17-openjdk.x86_64 (/usr/lib/jvm/java-17-openjdk-17.0.1.0.12-2.el8_5.x86_64/bin/java)
, где «+» означает, что данная версия сейчас установлена.
Вводим номер строки, которая нам необходима, к примеру: 1.
Повторяем команды:
sudo echo "export JAVA_HOME=\$(dirname \$(dirname \$(realpath \$(which java))))" > /etc/profile.d/java.sh
sudo source /etc/profile.d/java.sh
echo $JAVA_HOME
Ответ в терминале: /usr/lib/jvm/java-11-openjdk-11.0.13.0.8-4.el8_5.x86_64
Создать пользователя, к примеру, с именем flink, с доступом к планируемым директориям установки ПО, данных и логов (значения из пунктов 18-20).
Для этого создать необходимые директории и сменить их владельца.
Создание пользователя:
Прописать возможность входа пользователя под ssh с паролем.
Для этого выполнить команды:
sudo yum –y install nano - установка текстового редактора
sudo nano /etc/ssh/sshd_config
Файл sshd_config откроется во встроенном текстовом редакторе.
Найти строку PasswordAuthentication no и изменить ее на PasswordAuthentication yes
Сохранить изменения (ctrl+o, ctrl+x) и перезапустить службу SSH командой:
sudo systemctl restart sshd)
,или через «mc».
Создать для дальнейшего выполнения установки пользователя flink и задать его пароль.
Для этого выполнить команды:
Создает пользователя с именем «flink»
useradd flink
Создать пароль для пользователя «flink»
passwd flink
Терминал попросит ввести новый пароль для пользователя flink. Необходимо ввести пароль, нажать Enter, повторно ввести пароль для подтверждения и снова нажать Enter.
Создание директорий и смена владельца:
Создание директории для установки, в конфигурационном файле vars.yml параметр flink.installdir.
mkdir /opt/flink/
Смена владельца директории flink.
chown flink:flink /opt/flink/
Создание директории, в конфигурационном файле vars.yml параметр flink.logdir.
mkdir /opt/flink-log/
Смена владельца директории flink-log.
chown flink:flink /opt/flink-log/
Создание директории, в конфигурационном файле vars.yml параметр flink.datadir.
mkdir /opt/flink-data/
Смена владельца директории flink-data.
chown flink:flink /opt/flink-data/
Создание директории, в конфигурационном файле vars.yml параметр storage_dir.
mkdir /opt/flink-dev/
Смена владельца директории flink-dev.
chown flink:flink /opt/flink-dev/
Подготовка к созданию системных или пользовательских сервисов обслуживания.
Пункт 3 или 4 необходимо выполнить для подготовки сервисов обслуживания. Выбор типа сервисов зависит от политики безопасности в компании.
Для системных сервисов обслуживания. Для автоматического перезапуска
Flink JobmanagerиFlink Taskmanagerв случае перезагрузки сервера и корректной работы скриптов Ansible необходимо перед установкой компонента создать системные или пользовательский сервисы обслуживания.
Выдать пользователю права для создания сервисов и права для управления сервисами. Для этого под пользователем root добавить строки в файл /etc/sudoers через sudoedit или visudo:
flink ALL= NOPASSWD: /bin/systemctl start flink_jobmanager.service
flink ALL= NOPASSWD: /bin/systemctl stop flink_jobmanager.service
flink ALL= NOPASSWD: /bin/systemctl status flink_jobmanager.service
flink ALL= NOPASSWD: /bin/systemctl restart flink_jobmanager.service
flink ALL= NOPASSWD: /bin/systemctl enable flink_jobmanager.service
flink ALL= NOPASSWD: /bin/systemctl disable flink_jobmanager.service
flink ALL= NOPASSWD: /bin/systemctl daemon-reload
flink ALL= NOPASSWD: /bin/sudoedit /etc/systemd/system/flink_jobmanager.service
flink ALL= NOPASSWD: /bin/systemctl start flink_taskmanager.service
flink ALL= NOPASSWD: /bin/systemctl stop flink_taskmanager.service
flink ALL= NOPASSWD: /bin/systemctl status flink_taskmanager.service
flink ALL= NOPASSWD: /bin/systemctl restart flink_taskmanager.service
flink ALL= NOPASSWD: /bin/systemctl enable flink_taskmanager.service
flink ALL= NOPASSWD: /bin/systemctl disable flink_taskmanager.service
flink ALL= NOPASSWD: /bin/systemctl daemon-reload
flink ALL= NOPASSWD: /bin/sudoedit /etc/systemd/system/flink_taskmanager.service
Для пользовательских сервисов обслуживания. Добавьте пользователя flink в список исключений, чтобы пользовательский сервис приложения не завершался принудительно.
Для пользователя необходимо включить linger:
loginctl enable-linger flink
Дайте возможность пользовательским сервисам работать как долговременные, выполнив команды под пользователем root:
systemctl restart systemd-logind
loginctl enable-linger flink
Создание системных или пользовательских сервисов обслуживания.
Сервисы возможно создать как руками, так и с помощью PLAYBOOK. Пункты 5 и 6 описывают создание системных сервисов обслуживания. Пункт 7 описывает создание пользовательских сервисов обслуживания. В пункте 23 раздела «Подготовка узла, с которого будет осуществляться установка» описан запуск PLAYBOOK по созданию сервисов.
Создание системных сервисов обслуживания.
Под пользователем flink выполните следующие действия:
Создайте файл сервиса. Для этого выполните команду sudo /bin/sudoedit /etc/systemd/system/flink_jobmanager.service.
Будет создан файл flink_jobmanager.service, наполните его следующим содержимым:
[Unit]
Description=Apache Flink Jobmanager service
After=local-fs.target network.service
[Service]
WorkingDirectory={{ Директория установки}}
Type=simple
User={{ Пользователь под которым будет запускаться сервис }}
ExecStart={{ Директория установки }}/bin/jobmanager.sh start-foreground {{ адрес сервера }} {{ flink.port }}
LimitNOFILE=512000
LimitNPROC=512000
Restart=on-failure
RestartSec=30
[Install]
WantedBy=default.target
Для инициализации сервиса выполните команду sudo systemctl daemon-reload.
Под пользователем
flinkвыполните следующие действия:
Создайте файл сервиса. Для этого выполните команду sudo /bin/sudoedit /etc/systemd/system/flink_taskmanager.service.
Будет создан файл flink_taskmanager.service, наполните его следующим содержимым:
[Unit]
Description=Apache Flink taskmanager service
After=local-fs.target network.service
[Service]
WorkingDirectory={{ Директория установки }}
Type=simple
User={{ Пользователь под которым будет запускаться сервис }}
ExecStartPre=/bin/sleep 5
ExecStart={{ Директория установки }}/bin/taskmanager.sh start-foreground
LimitNOFILE=512000
LimitNPROC=512000
Restart=on-failure
RestartSec=30
[Install]
WantedBy=default.target
Для инициализации сервиса выполните команду sudo systemctl daemon-reload.
Создание пользовательских сервисов обслуживания:
Под пользователем flink выполните следующие действия:
Создайте файл сервиса ~/.config/systemd/user/flink_jobmanager.service со следующим содержимым:
[Unit]
Description=Apache Flink Jobmanager service
[Service]
WorkingDirectory={{ Директория установки }}
Type=simple
ExecStart={{ Директория установки }}/bin/jobmanager.sh start-foreground {{ адрес сервера }} {{ flink.port }}
LimitNOFILE=512000
LimitNPROC=512000
Restart=on-failure
RestartSec=30
[Install]
WantedBy=default.target
Создайте файл сервиса `~/.config/systemd/user/flink_taskmanager.service` со следующим содержимым:
[Unit]
Description=Apache Flink Taskmanager service
[Service]
WorkingDirectory={{ Директория установки }}
Type=simple
ExecStart={{ Директория установки }}/bin/taskmanager.sh start-foreground
LimitNOFILE=512000
LimitNPROC=512000
Restart=on-failure
RestartSec=30
[Install]
WantedBy=default.target
Для инициализации сервиса выполните команду `sudo systemctl --user daemon-reload`.
Подготовка узла, с которого будет осуществляться установка#
ВАЖНО! В инструкции изложено развертывание ландшафта-примера. С описанием иных параметров можно ознакомиться в файле ./install/Ansible/roles/flink/defaults/main.yml после подготовки дистрибутива, а так же в документации к продукту.
На сервере, с которого будет производиться установка, необходимо наличие следующих пакетов:
ansible
для python3 использовать команду
sudo pip3 install ==2.9.27для python2 использовать команду
sudo pip2 install ansible==2.9.27для unzip и openjdk-11
sudo yum -y install unzip java-11-openjdkдля sshpass
sudo yum -y install http://mirror.centos.org/centos/8-stream/AppStream/x86_64/os/Packages/sshpass-1.09-4.el8.x86_64.rpm
Так же требуется groovy:
curl -O https://groovy.jfrog.io/artifactory/dist-release-local/groovy-zips/apache-groovy-binary-3.0.18.zip
, или загрузить через команду scp: unzip apache-groovy-binary-3.0.18.zip
Необходимо задать переменную JAVA HOME:
sudo echo "export JAVA_HOME=\$(dirname \$(dirname \$(realpath \$(which java))))" > /etc/profile.d/java.sh
sudo source /etc/profile.d/java.sh
Проверить результат set | grep JAVA_HOME
Если вывод пустой - переменная не установилась.
Успешный вывод JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.16.1.1-1.el8_4.x86_64
Более подробно взаимодействие с java-11-openjdk описано в пункте 1 раздела «Подготовка узлов для развертывания компонента».
Скачать полный дистрибутив EM-*-distrib.zip продукта EM на сервер, с которого будет производиться установка и последовательно разархивировать его.
Для отправки на сервер дистрибутива в случае подключения по SSH можно использовать SCP/SFTP-клиент.
Поэтапно разархивировать дистрибутив:
unzip EM-*-distrib.zip
unzip EM-*-owned-distrib.zip
unzip dependency-resolver-*-distrib.zip
В директории src в файле TgzArchiver.groovy заменить следующие строки:
а. (14 строка) Utils.ant.untar src: archive.path, dest: tmpDir, overwrite: „true“ на [«bash», «-c», «mkdir -p ${tmpDir} && tar -pxvf ${archive.path} -C ${tmpDir}»].execute().waitForProcessOutput()
б. (16 строка) Utils.ant.untar src: archive.path, dest: tmpDir, compression: „gzip“, overwrite: „true“ на [«bash», «-c», «mkdir -p ${tmpDir} && tar -pxvzf ${archive.path} -C ${tmpDir}»].execute().waitForProcessOutput()
в. (45 строка) Utils.ant.tar destfile: «$dir-packed», basedir: dir, compression: „gzip“ на [«bash», «-c», «cd ${dir.path} && tar -pvczf …/$dir.name-packed *»].execute().waitForProcessOutput()
Из директории, где находится папка с groovy, производим склейку дистрибутива:
./groovy-3.0.18/bin/groovy -cp ./src merge.groovy --report ./Report.json EM-*-party-distrib.zip EM-*-owned-distrib.zip
ВАЖНО! Сохранять последовательность party-, owned- архивов
Распаковываем получившийся единый архив:
unzip -o EM-*-owned-distrib.zip
unzip -o EVTP-scripts-*.zip -d install
unzip -o EVTP-flink-*.zip -d install/Ansible
Переходим в директорию ролей установки:
cd install/AnsibleПеремещаем файлы в нужные каталоги командами:
mv package/bh files
mv files/*encrypt*-cli* .
cd files
mv flink*.tar flink.tar
unzip event-process-flow.zip
mkdir -p jobs/current
for file in *.jar; do mv $file jobs/current/$(echo $file | sed 's/-[0-9\\.]*.jar/.jar/'); done
Убеждаемся, что в install/Ansible появился encrypt-cli*.jar, созданы и не пустые директории: files (там находится event-process-flow.zip) и inventories с подкаталогом !EXAMPLE!
Копируем директорию inventories/!EXAMPLE! в соседнюю директорию (например inventories/DEV) командой:
cd ../
mkdir inventories/DEV
cp -r inventories/\!EXAMPLE\!/* inventories/DEV/
Заполняем файл inventory в скопированной директории, указывая в секции flink_jobmanager fqdn или ip-адреса хостов, на которые будет производиться установка jobmanager-ов, а также в секции flink_taskmanager fqdn или ip-адреса хостов, на которые будет производиться установка taskmanager-ов (fqdn предпочтителен).
ВАЖНО! Не следует даже при установке на тот же хост указывать localhost или 127.0.0.1.
В подкаталог ssl помещаем хранилище сертификатов, содержащее подписанный сертификат брокера и сертификат доверенного УЦ с именем flink.jks. Так же в подкаталог ssl помещаем сертификаты, необходимые для подключения к Kafka и Zookeeper.
Чувствительную информацию заполняем в файле vault.yml. Файл очищаем от старых значений-примеров. Для этого необходимо воспользоваться утилитой ansible-vault (находиться в комплекте с пакетом ansible).
Для шифрования пароля следует выполнить команду на сервере, с которого производится развертывание EVTP, например: ansible-vault encrypt_string -n flink_password 'PA$$W0Rd'
, где –n означает имя переменной, а значение в кавычках – шифруемый пароль. При выполнении команды будет интерактивно запрошен ключ шифрования и подтверждение ключа. Его необходимо запомнить. В результате полученный вывод команды необходимо вставить в файл vault.yml с новой строки.
Необходимо с одним и тем же значением ключа шифрования осуществить заполнение для переменных
flink_password,jks_password,kafka_jks_password,zk_jks_password.
Таким образом, необходимо последовательно выполнить команды:
ansible-vault encrypt_string -n flink_password 'PA$$W0Rd' # пароль пользователя для ssh-подключения к хостам развертывания:
ansible-vault encrypt_string -n jks_password 'PA$$W0Rd' # пароль от хранилища сертификатов от хостов Flink
ansible-vault encrypt_string -n kafka_jks_password 'PA$$W0Rd' # пароль от хранилища сертификатов брокеров Kafka
ansible-vault encrypt_string -n zk_jks_password 'PA$$W0Rd' # пароль от хранилища сертификатов кластера Zookeeper
Переходим в подкаталог inventories/DEV/group_vars/all и заполняем конфигурацию. Можно обратиться к документации к разделам Настройка inventory и Пример заполненного файла vars.yml в документе Руководство по установке.
В файле vars.yml в параметры ansible_user и ansible_password указываем логин для ssh-подключения к хостам развертывания, ранее указанным в файле inventory и переменную для пароля пользователя.
Пример:
ansible_user: flink
ansible_password: "{{ flink_password }}"
В файле vars.yml в блок flink в параметр installdir указываем абсолютный путь на серверах развертывания до установленного приложения.
Пример:
flink:
installdir: /opt/flink
В файле vars.yml в блок flink в параметр datadir указываем абсолютный путь на серверах развертывания до сохраненных состояний job.
Пример:
flink:
datadir: /opt/flink-data
В файле vars.yml в блок flink в параметр logdir указываем абсолютный путь на серверах развертывания до логов установленного приложения.
Пример:
flink:
logdir: /opt/flink-log
В файле vars.yml в блоке flink блок security отвечает за соединение между job менеджером и task менеджером.
keystore_path, truststore_path — путь до сертификата из пункта 13;
keystore_pass, truststore_pass, key_pass — имя переменной с паролем от сертификата из пункта 14, передается в кавычках:
"{{ имя переменной }}".
Пример:
flink:
security:
keystore_path: ssl/flink.jks
truststore_path: ssl/flink.jks
keystore_pass: "{{ jks_password }}"
truststore_pass: "{{ jks_password }}"
key_pass: "{{ jks_password }}"
В файле vars.yml в блоке flink блок high_availability отвечает за настройку отказоустойчивости при использовании кластера. В нашей инсталляции представлен пример использования файловой системы для хранения данных и подключение zookeeper.
Пример:
flink:
high_availability:
enable: true
storage_dir: /opt/flink-dev
filesystem_type: file://
zookeeper: хост:2181,хост:2181
zookeeper_settings:
protocol: SSL
keystore_path: ssl/zookeeper.jks
keystore_pass: "{{ zk_jks_password }}"
truststore_path: ssl/zookeeper.jks
truststore_pass: "{{ zk_jks_password }}"
key_pass: "{{ zk_jks_password }}"
В файле vars.yml блок flink_presets.kafka_job_universal отвечает за настройки для подключения к Kafka по умолчанию.
bootstrap.servers — список брокеров для соединения с кластером кафка;
ssl.truststore.location, ssl.keystore.location — путь до сертификата для подключения к Kafka из пункта 13;
ssl.truststore.password, ssl.keystore.password, ssl.key.password — имя переменной с паролем от сертификата из пункта 14, передается в кавычках:
"{{ имя переменной }}".
Пример:
flink_presets:
kafka_job_universal:
type: kafka
security.protocol: SSL
bootstrap.servers: хост:9093
ssl.truststore.location: ssl/kafka.jks
ssl.keystore.location: ssl/kafka.jks
ssl.truststore.password: "{{ kafka_jks_password }}"
ssl.keystore.password: "{{ kafka_jks_password }}"
ssl.key.password: "{{ kafka_jks_password }}"
ssl.endpoint.identification.algorithm: ""
Можно выполнить playbook flink_system_service.yml или flink_user_service.yml вместо пунктов 5-7 «Подготовки узлов для развертывания компонента» В примере описан запуск playbook(s) по созданию системных сервисов.
Переходим в подкаталог Ansible, который содержит playbook(s) для запуска. Запускаем команду создания системных сервисов на хостах установки: ansible-playbook -i inventories/DEV/inventory flink_system_service.yml --ask-vault-pass
, где DEV – имя подкаталога из п. 11 инструкции подготовки хоста развертывания. После запуска необходимо по запросу в интерактивном режиме ввести ключ шифрования паролей, созданный в п. 14 инструкции подготовки хоста развертывания. После выполнения команды не должно быть строк со значением «FAILED!»
Запускаем установку и запуск компонента командой:
ansible-playbook -i inventories/DEV/inventory flink.yml --ask-vault-pass
, где DEV – имя подкаталога из п. 11 инструкции подготовки хоста развертывания. После запуска необходимо по запросу в интерактивном режиме ввести ключ шифрования паролей, созданный в п. 14. После выполнения команды не должно быть строк с префиксом «FAILED!».
Список доступных PLAYBOOK:
flink.yml — устанавливает EVTP;
flink_system_service.yml— устанавливает системные сервисы для EVTP;
flink_user_service.yml — устанавливает пользовательские сервисы для EVTP.
Запуск обработчика#
На узле, на котором расположен Job Manager, выполните команду:
<директория установки (задается в пункте 18)>/flink/bin/flink run -d -p 1 -C file:///<полный путь до fat Jar универсального обработчика> -c ru.sbt.cep.flow.event.process.Main <полный путь до Jar универсального обработчика> --config "<полный путь до конфигурации обработчика>" --defaults "<полный путь до файла с настройками транспорта>"
Описание конфигурации обработчика находится в документе Руководство пользователя EVTP, раздел Построение потока обработки;
Файл defaults.json находится <директория установки (задается в пункте 18)>/mapping;
Jar-ники расположены в <директория установки (задается в пункте 18)>/jobs/current.
Дополнительно может использоваться параметр -s "<полный путь до сохраненного состояния (задается в пункте 19)>" для запуска обработчика из сохраненного состояния.