Мы продолжаем погружение в основы операционной системы 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.

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

Комментарии (1)


  1. maximnik0q
    08.11.2023 20:09

    будущих релизах будут использованы уже 32-битные указатели, что снимет это ограничение.

    Может быть 64 битные ?