OpenVMS: операционная система для атомных станций. Redis

от автора

Мы продолжаем погружение в основы операционной системы OpenVMS. В прошлых статьях мы установили её в качестве виртуальной машины, настроили сеть и активировали лицензии. Бонусом поставили туда SSH и даже организовали Web-интерфейс для удобного управления. Теперь пришла пора попробовать раскатать какой-нибудь простой сервис вроде Redis.

Уверены, что большинство наших читателей c Хабра знает, что это такое. Но если вы впервые слышите эту аббревиатуру, немного расскажем о ней. Расшифровывается она как Remote Dictionary Server. Это скоростная in-memory NoSQL СУБД, используемая для работы с парами «ключ:значение». Чаще всего её используют в качестве кэша перед основными БД, такими как MariaDB или PostgreSQL.

Немного подробностей о Redis

Redis написана на C, её портировали на множество операционных систем, в том числе и OpenVMS. Несомненно, это заслуга того, что Redis — продукт с открытым исходным кодом (распространяется по лицензии BSD). Текущая версия порта для OpenVMS — 6.2.1, выпущенная в 2021 году.

В него включили независимый от языка API, что позволяет напрямую использовать Redis из таких языков, как COBOL и FORTRAN. Кое-какой функционал вроде сохранения на диск пока не завезли. Но пообещали это исправить в будущих релизах.

Из любопытных особенностей отметим, что данные с плавающей точкой нужно хранить строго в формате IEEE-754. Корни этого ограничения растут из необходимости сохранить совместимость с мейнфреймами IBM S/390. Там этот стандарт был реализован аппаратно, начиная с процессоров IBM S/390 G5.

Также стоит учитывать, что некоторые фичи Redis при работе в кластере могут работать некорректно. В документации к пакету VMS Software просит сообщать обо всех проблемах, связанных с кластеризацией и репликацией. Ну и вишенкой на торте будет то, что текущий порт построен с использованием 32-битных указателей, что накладывает ограничение на максимальный размер кэша в 1Gb. В будущих релизах будут использованы уже 32-битные указатели, что снимет это ограничение.

Установка

Заходим на портал VSI (доступно обладателям хоббийной лицензии) и скачиваем пакет с именем VSI-X86VMS-REDIS-V0602-1-1.ZIP. Заливаем его с помощью FileZilla по SFTP-протоколу:

Открываем либо SSH-подключение, либо Telnet. Я воспользуюсь своим любимым IBM ThinkPad X41 Tablet с Windows XP на борту и открою Telnet-соединение с помощью легендарного HyperTerminal:

$ SET DEFAULT DKA100:[SOFT]

Убедимся, что в списке файлов есть нужный нам архив с именем VSI-X86VMS-REDIS-V0602-1-1.ZIP;1

$ DIR  Directory DKA100:[SOFT]  MANIFEST.TXT;3      MANIFEST.TXT;2      MANIFEST.TXT;1 VSI-X86VMS-CIVETWEB-V0114-0D-1-RNOTES.PDF;1 VSI-X86VMS-CIVETWEB-V0114-0D-1.PCSI$COMPRESSED;1 VSI-X86VMS-CIVETWEB-V0114-0D-1.PCSI$COMPRESSED_VNC;1 VSI-X86VMS-LUA-V0503-5D-1-RNOTES.PDF;1 VSI-X86VMS-LUA-V0503-5D-1.PCSI$COMPRESSED;1 VSI-X86VMS-LUA-V0503-5D-1.PCSI$COMPRESSED_VNC;1 VSI-X86VMS-REDIS-V0602-1-1.ZIP;1 VSI-X86VMS-WEBUI-V0401-1-1.PCSI$COMPRESSED;1 VSI-X86VMS-WEBUI-V0401-1-1.PCSI$COMPRESSED_VNC;1 X86VMS-CIVETWEB-V0114-0D-1.ZIP;1        X86VMS-LUA-V0503-5D-1.ZIP;1 X86VMS-WEBUI-V0401-1-1-RNOTES.PDF;1     X86VMS-WEBUI-V0401-1-1.ZIP;1  Total of 16 files.

Видим «хламовник» из инсталляторов, оставшихся там с момента написания предыдущих статей. Теперь распакуем архив. Если вы не делали UNZIP постоянным алиасом, то перед вызовом выполните:

$ UNZIP :== $SYS$COMMON:[SYSHLP.UNSUPPORTED.UNZIP]UNZIP.EXE

Распаковываем содержимое, соглашаясь на замену файла MANIFEST.TXT.

$ UNZIP VSI-X86VMS-REDIS-V0602-1-1.ZIP

Запускаем установку:

$ PRODUCT INSTALL REDIS  Performing product kit validation of signed kits ... %PCSI-I-VSIVALPASSED, validation of DKA100:[SOFT]VSI-X86VMS-REDIS-V0602-1-1.PCSI $COMPRESSED;1 succeeded  The following product has been selected:     VSI X86VMS REDIS V6.2-1                Layered Product  Do you want to continue? [YES] YES  Portion done: 0%...10%...40%...50%...60%...90%...100%  The following product has been installed:     VSI X86VMS REDIS V6.2-1                Layered Product  VSI X86VMS REDIS V6.2-1: Redis for OpenVMS is based on Redis Version 6.2.1      Post-installation tasks are required.      To start Redis at system boot time, add the following lines to     SYS$MANAGER:SYSTARTUP_VMS.COM:          $ file := SYS$STARTUP:REDIS$STARTUP.COM         $ if f$search("''file'") .nes. "" then @'file'      To shutdown REDIS at system shutdown, add the following lines     to SYS$MANAGER:SYSHUTDWN.COM:         $ file := SYS$STARTUP:REDIS$SHUTDOWN.COM        $ if f$search("''file'") .nes. "" then @'file'

Чтобы редактор EDIT сразу открывался в интерактивном режиме, предварительно выполните:

$ SET TERM/INQUIRE

Следуя инструкции инсталлятора, добавляем Redis в автозапуск:

$ EDIT SYS$MANAGER:SYSTARTUP_VMS.COM

Дописываем в конец файла, но перед EXIT:

$ file := SYS$STARTUP:REDIS$STARTUP.COM  $ if f$search("''file'") .nes. "" then @'file'

Обратите внимание, что в части («»file’») символы «» — это не две двойные кавычки, а одна двойная кавычка и два апострофа, а ‘» — это один апостроф и одна двойная кавычка.

Чтобы сохраниться и выйти, нажимаем CTRL + Z. Проделываем то же самое с конфигурационным файлом, который отвечает за завершение работы:

$ EDIT SYS$MANAGER:SYSHUTDWN.COM

Добавляем пару строк в конец файла:

$ file := SYS$STARTUP:REDIS$SHUTDOWN.COM $ if f$search("''file'") .nes. "" then @'file'

Сохраняемся и выходим. Теперь сервер Redis будет автоматически запускаться при старте сервера и корректно завершать работу при его выключении.

Первый старт

Пришла пора первый раз запустить Redis. При этом будет создан дефолтный конфиг:

$ @SYS$STARTUP:REDIS$STARTUP.COM  %REDIS-I-START, starting the Redis broker $ run/detach -      /process_name="REDIS SERVER" -      /priv=(tmpmbx,bypass,sysprv,detach,netmbx) -      /authorize -      /input=sys$startup:redis$run.com -      /output=redis$root:[logs]redis.log -      sys$system:loginout.exe %RUN-S-PROC_ID, identification of created process is 00000470

Теперь давайте заглянем в него:

$ SET DEFAULT REDIS$ROOT:[CONF] $ EDIT REDIS.CONF

По умолчанию Redis запускается на локалхосте:

bind 127.0.0.1

Простоты ради укажем, что хотим назначить сервер на наш локальный адрес:

bind 192.168.88.29

Обратите внимание, что если вы последуете совету из комментария к конфигу и банально закомментируете эту строку, то Redis не запустится, а в логах будет висеть что-то вроде:
Could not create server TCP listening socket ::*:6379: unknown name or service

Выходим из редактора и перезапускаем Redis. Для этого выполняем остановку и старт демона:

$ @SYS$STARTUP:REDIS$SHUTDOWN.COM $ @SYS$STARTUP:REDIS$STARTUP.COM

Проверяем, что наш REDIS SERVER появился в процессах:

$ SH SYS

Берём какой-нибудь десктопный клиент и пробуем подключиться без какой-либо аутентификации, указав только IP-адрес и стандартный порт 6379:

После успешного соединения мы видим установленную версию Redis, в качестве операционной системы фигурирует наша OpenVMS версии 9.2-1.

Тюнинг переменных

Внимательный администратор в любом случае заглянет в логи и обнаружит там весьма неприятные записи:

1129:M 04 Nov 2023 11:17:25.961 # You requested maxclients of 10000 requiring at least 10032 max file descriptors.  1129:M 04 Nov 2023 11:17:25.961 # Server can't set maximum open files to 10032 because of OS error: function not implemented .  1129:M 04 Nov 2023 11:17:25.961 # Current maximum open files is 128. maxclients has been reduced to 96 to compensate for low FILLM. If you need higher maxclients increase FILLM (and/or CHANNELCNT). 

Получается, что всего система способна держать лишь 96 одновременных соединений. Но не спешите с выводами. В OpenVMS такое поведение не баг, а фича. Ради безопасности операционная система по умолчанию не даёт приложениям открывать более 128 файлов, что автоматически накладывает ограничение на количество одновременно поддерживаемых соединений. Так что давайте поправим переменную CHANNELCNT:

$ EDIT SYS$SYSTEM:MODPARAMS.DAT

Ограничим количество I/O-каналов (CHANNELCNT) максимально безопасным значением в 65 535. Чтобы получать вменяемые информационные сообщения, снабдим изменение комментарием. Например, по шаблону ПЕРЕМЕННАЯ=ЗНАЧЕНИЕ ! ДАТА ПРИЧИНА. Заносим в файл строку:

CHANNELCNT=65535 ! 04/11/2023 INCREASE FOR REDIS SERVER

Выходим и запускаем утилиту AUTOGEN, чтобы безопасно применить изменения. Это более предпочтительный способ, чем задавать переменные напрямую из SYSGEN.

$ @SYS$UPDATE:AUTOGEN SAVPARAMS GENPARAMS

Далее система выполнит сохранение текущих переменных системы и сгенерирует список изменений. Вместе с этим будет сгенерирован отчёт, где будут перечислены все планируемые изменения и потенциальные проблемы. Посмотреть его можно здесь:

$ EDIT SYS$SYSTEM:AGEN:PARAMS.REPORT

Если всё хорошо, то проходимся по второму кругу и перезагружаемся для применения настроек:

$ @SYS$UPDATE:AUTOGEN GENPARAMS REBOOT

Перезагружаем сервер:

$ REBOOT

После перезагрузки проверяем, что теперь максимальное значение переменной увеличилось. Последовательно выполняем команды для вызова утилиты SYSGEN, использования текущего набора переменных и отображения значения переменной CHANNELCNT:

$ MC SYSGEN  SYSGEN > USE CURRENT  SYSGEN > SHOW CHANNELCNT

Убеждаемся, что в разделе Max написано 65 535. Выходим из утилиты:

SYSGEN > EXIT

Осталось подкорректировать лимит FILLM. Это не общая переменная, а ограничение, устанавливаемое на конкретный аккаунт пользователя. В нашем случае мы действовали от имени SYSTEM, поэтому нам предстоит внести изменения в этот аккаунт. Нам потребуется утилита AUTHORIZE, лежащая по адресу SYS$SYSTEM. Открываем её:

$ SET DEFAULT SYS$SYSTEM

И запускаем утилиту:

$ RUN AUTHORIZE

Указываем значение квоты FILLM для пользователя SYSTEM, равное 10 032, что будет соответствовать стандартным 10 000 соединений (параметр maxclients):

UAF> MODIFY SYSTEM/FILLM=10032

Выходим:

UAF> EXIT

Теперь можно выполнить Logout и Login пользователем SYSTEM, после чего остановить и запустить сервер Redis. Ну или просто перезагрузиться. Поскольку инстанс у нас хоббийный, никаких проблем с тем, чтобы лишний раз отправить систему в ребут, нет. Разумеется, на продакшн-сервере нужно действовать иначе.

После перезагрузки открываем клиент Redis и смотрим, что у нас теперь не 96 разрешённых соединений, а 10 000.

Enjoy!

Вместо заключения

Мы получили вполне рабочий Redis на OpenVMS, но стоит понимать, что годится он лишь для тестовых и хоббийных целей. В таком состоянии, как сейчас, он ни разу не production-ready. Однако отметим, что работа в этом направлении ведётся. Видно, что VMS Software прикладывает большие усилия, чтобы решать широкий спектр современных задач с помощью OpenVMS.

С учётом крутой стабильности и безопасности такой подход себя вполне оправдывает. Раздача хоббийных лицензий — это вполне конкретный и практичный шаг к тому, чтобы операционная система набирала популярность. Надеемся, что эта статья также подстегнёт ваш интерес к изучению этой системы. Тем более, что применяемые в ней решения проверены годами эксплуатации.


ссылка на оригинал статьи https://habr.com/ru/articles/772580/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *