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