1979 год. СССР запускает свой первый океанографический спутник, французы успешно испытывают первую ракету в семействе Arian, а в недрах лабораторий Министерства обороны США завершают создание языка программирования Ада. В этом же году Уильям Л. Фэйрмэн (William L. Fairman) регистрирует частную компанию FairСom, ставшую пионером в отрасли разработки программного обеспечения.
«Ну и что?» — спросите вы. Какая-то странная компания, о которой даже Wikipedia ничего не знает. Упоминания есть, а отдельной страницы нет. Вроде бы делает базу данных FairСom DB. Кажется, что ничего интересного. Но это только на первый взгляд. А что, если мы вам скажем, что эта база данных обеспечивает работу экстренной службы 911, через неё проходят все планы полётов в воздушном пространстве США, а также записываются все котировки на фондовом рынке в режиме реального времени? Подробности — под катом.
![](https://habrastorage.org/getpro/habr/upload_files/cee/6b0/7ac/cee6b07acbc8c71e707e08b1b036a95f.png)
Предыстория. Сначала был NOTAM
В гражданской авиации есть такой вид извещений, как NOTAM (Notice To Air Missions). Любые изменения, которые могут повлиять на безопасность полётов, выпускаются в виде NOTAM. Начал извергаться вулкан, сломалось освещение на рулёжной дорожке аэропорта или замечены стаи птиц в опасной близости от аэродрома — на каждое такое событие издаётся соответствующий NOTAM. Далее он рассылается потребителям: диспетчерам и пилотам.
Задумка отличная, но у неё масса недостатков. Нет NOTAM — лететь нельзя. Иначе, прилетев и зайдя на заранее выбранную полосу, можно внезапно обнаружить, что на ней уже есть самолёты. Подобный инцидент имел место в 2017 году в аэропорту Сан-Франциско. Причём NOTAM о закрытии одной из полос был, правда где-то в недрах 27-страничного брифинга. Даже отдохнувшим пилотам сложно запомнить такой объём информации, не говоря уже про специалиста, который завершает смену. А теперь представьте, что на длинных рейсах может быть 200-страничный NOTAM.
Когда разрабатывались стандарты извещений NOTAM, они были рассчитаны на передачу через телеграф. Отсутствие регистра, обилие сокращений и нормальных знаков препинания превращают столь полезный и необходимый инструмент в информационный мусор. Так что даже такая консервативная отрасль, как гражданская авиация, вынуждена будет меняться и серьёзно перерабатывать NOTAM с учётом современных средств связи. Видимо, помимо этого им придётся ещё и подумать про хранение, так как существующая десятилетиями система стала доставлять проблемы.
11 января 2023 года произошёл коллапс, затронувший всё воздушное пространство США. Более тысячи рейсов было отменено, ещё 6 700 рейсов задержаны. Миллионы путешественников застряли в аэропортах. Причиной был назван «сбой компьютера» федерального управления гражданской авиации (FAA), который привёл к недоступности системы извещений NOTAM. Спустя 8 дней причиной сбоя был официально заявлен человеческий фактор. Из предельно короткого объяснения FAA стало понятно, что возникла проблема синхронизации основной и резервной базы данных. Специалисты подрядной организации пытались решить проблему, но вместо этого лишь усугубили положение, случайно удалив данные.
Что за база данных?
Нам стало интересно, о какой вообще СУБД идёт речь. Внимание привлёк блог FairСom, где с гордостью говорится о том, что их FairСom DB обслуживает все 100 процентов планов полётов на территории США. Делать какие-либо выводы о том, что она обслуживает и систему NOTAM, нельзя, но предположить такое вполне возможно. Особенно в контексте того, что упоминается мультимодельность.
FairСom DB — это кроссплатформенная СУБД на основе движка c-treeACE. Примечательно то, что она действительно работает практически на чём угодно. Заявлена поддержка:
Windows (x64).
Linux (x86, x64, ARM, IBM Power 7/8/9).
macOS (10.14/10.15 x64 и 11 Intel/ARM).
IBM AIX (6.1/7.1 32-битные и 64-битные).
HP-UX (RISC/Itanium 32-битные и 64-битные).
Solaris (V5.10/5.11 x86/x64/SPARC).
QNX 6 Neutrino (32-битная версия).
В отличие от многих компаний, которые закрывают доступ к своим продуктам до оформления сделки, FairСom поступает иным образом. Можно скачивать, устанавливать и использовать полнофункциональную версию FairCom DB Dev Edition Server, но с единственным ограничением: сервер работает только 3 часа, после чего выключается. Хорошая новость в том, что перезапускать его можно неограниченное количество раз и это напрямую разрешено, о чём прямо говорится в приветственном письме после регистрации.
Изюминка этой СУБД в том, что не нужно выбирать между NoSQL и SQL. Она одновременно предоставляет API для работы с NoSQL и поддерживает обычные SQL-запросы. «Из коробки» доступен целый спектр протоколов и портов, которые нужны для решения наиболее популярных бизнес-задач.
Установка и тестирование
Мы решили протестировать FairCom DB на одноплатном компьютере Raspberry Pi 3 B+. ОС — 64-битная версия Raspberry Pi OS без десктопного окружения. Перед началом работы рекомендуем обновить пакеты до последних версий и перезагрузиться:
$ sudo apt update && sudo apt -y upgrade && sudo reboot
Список доступных для скачивания пакетов есть на сайте FairCom. Чтобы скачивать было удобнее, можно воспользоваться каким-нибудь консольным браузером, например links2. Заходим на https://learn.faircomcorp.com/faircom_db_packages и скачиваем нужный вариант:
![](https://habrastorage.org/getpro/habr/upload_files/d53/594/c22/d53594c2207fec58f1a9bcbb58b90691.png)
Распаковываем полученный архив:
$ tar xvzf FairCom-DB.linux.arm_generic.64bit.v12.0.2.432.220411.tar.gz
Заходим в директорию:
$ cd FairCom-DB.linux.arm_generic.64bit.v12.0.2.432/server
И запускаем сервер скриптом:
$ ./startserver
В ответ появится строка Starting the FairCom Database Engine… И всё. Проверяем, что сервер действительно запущен:
$ ps -ef | grep faircom
avahi 388 1 0 12:30 ? 00:00:00 avahi-daemon: running [faircomdb.local]
user 1947 1 4 12:56 pts/0 00:00:03 ./faircom
user 1985 705 0 12:57 pts/0 00:00:00 grep --color=auto faircom
Заглянем в веб-интерфейс администратора по адресу https://[IP-адрес]:8443/
![](https://habrastorage.org/getpro/habr/upload_files/b78/018/35b/b7801835b9dd7b102c2abaa5d1ae35e9.png)
Здесь есть полный набор того, что нужно для управления. Логин и пароль по умолчанию — admin/admin (или в другом регистре — ADMIN/ADMIN). Вместе с инструментами для просмотра существующей структуры БД есть наглядный мониторинг текущей нагрузки:
![](https://habrastorage.org/getpro/habr/upload_files/ac1/ac7/97d/ac1ac797d22b410c09e57b7fe1dc775c.png)
Производитель заявляет, что на одиночном сервере им удавалось достичь показателя в 12 млн транзакций в секунду. Понятно, что на обычной «малинке» до таких цифр, как до Луны. Было бы интересно узнать, сколько транзакций сможет выдержать одноплатник, но это тема для отдельной статьи. Так что попробуем чуть более простой вариант: использовать FairCom DB в качестве накопителя данных, поступающих из умного дома на базе Node-Red.
Взаимодействие с Node-Red
Основа Node-Red — палитра инструментов. По умолчанию палитра содержит около 50 инструментов, позволяющих выполнять лишь базовые вещи. Простой способ установки через менеджер палитры не сработает, так как ему нужен специфичный набор node-red-contrib-ctreesql. Его можно найти в директории с драйверами в распакованном архиве с FairCom DB.
Перед установкой проверяем наличие трёх составляющих: NodeJS версии 10 и выше, npm и Python. Последний нужен для сборки модуля ffi-napi, используемого для подключения к JavaScript сторонних библиотек на других языках — например, на C.
Берём Ubuntu 18.04 LTS и для начала устанавливаем 14-ю версию NodeJS. Тянем curl’ом скрипт, добавляющий нам репозитории:
$ curl -sL https://deb.nodesource.com/setup_14.x | sudo bash -
И теперь выполняем установку вместе с npm:
$ sudo apt -y install nodejs npm
Теперь ставим Node-Red:
$ sudo npm install -g --unsafe-perm node-red
После установки запускаем Node-Red и проверяем, что всё работает. Можно добавить -v для более детального вывода:
$ node-red -v
Прерываем выполнение с помощью Ctrl+C и приступаем к установке node-red-contrib-ctreesql. Вначале нам нужно будет установить одну библиотеку, которая идёт в комплекте с сервером FairCom DB. Переходим в директорию:
$ cd FairCom-DB.linux.x64.64bit.v12.0.2.432/drivers/ctree.drivers/lib
Копируем библиотеку в директорию /lib64:
$ sudo cp libctsqlapi.so /lib64
Даём понять системе, что намерены использовать эту библиотеку, и заставляем ldconfig создать необходимые ссылки на неё:
$ sudo ldconfig
Переходим обратно в домашнюю директорию и заходим в скрытую папку .node-red:
$ cd .node-red
Устанавливаем сам набор инструментов в палитру:
$ npm --prefix . install /home/user/FairCom-DB.linux.x64.64bit.v12.0.2.432/drivers/node-red.sql/
Запускаем Node-Red и убеждаемся, что палитра пополнилась новым элементом:
$ node-red
![](https://habrastorage.org/getpro/habr/upload_files/198/76a/0a9/19876a0a9057d41010b0d7e112bed078.png)
Построим простейшую схему для выполнения произвольного SQL-запроса. Начнём с настройки ноды ctreeSQL:
![](https://habrastorage.org/getpro/habr/upload_files/154/a86/0b6/154a860b6e62364cf55a447daefcd51e.png)
Теперь добавим ноды Inject и Debug. В первой оставляем msg.payload = timestamp, а вот в msg.topic пропишем наш запрос к базе данных select * from admin.syscolumns. Нода Debug позволит нам увидеть ответ на данный запрос. Заранее нажимаем на пиктограмму с пауком в правой верхней части окна. Тыкаем Deploy и после этого нажимаем на кнопку ноды Inject:
![](https://habrastorage.org/getpro/habr/upload_files/bd1/f8d/4a3/bd1f8d4a3d4cb274fb783627e4f19cbd.png)
Видим, что в ответ на запрос нам пришёл объект, который сразу можно использовать. Одной из особенностей Node-Red является удобный способ экспорта и импорта схем. Так что если захотите воспроизвести эту схему, то просто импортируйте этот JSON:
[{"id":"ae1fcb054f4d6f84","type":"tab","label":"Flow 1","disabled":false,"info":"","env":[]},{"id":"2ccc6ada5e811f81","type":"ctreeSQL","z":"ae1fcb054f4d6f84","mydb":"41861c5b2f96f711","querytype":"select","name":"","x":160,"y":160,"wires":[["370afbbec7a6f491"]]},{"id":"98f73eea358aab12","type":"inject","z":"ae1fcb054f4d6f84","name":"select * from admin.syscolumns","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"select * from admin.syscolumns","payload":"","payloadType":"date","x":170,"y":40,"wires":[["2ccc6ada5e811f81"]]},{"id":"370afbbec7a6f491","type":"debug","z":"ae1fcb054f4d6f84","name":"debug 1","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":180,"y":280,"wires":[]},{"id":"41861c5b2f96f711","type":"ctreeSQL_connection","host":"localhost","port":"6597","db":"ctreeSQL"}]
Что в итоге?
Любопытство и желание узнать больше о причинах сбоя в системе NOTAM привели нас к одной из старейших и интересных СУБД, причём она используется и сейчас — в той же авиации. К слову, можно поработать с ней и обычным пользователям. Например, настроить крон на перезапуск каждые 3 часа — и вот у вас есть интересная СУБД с классным мониторингом.
К слову, у компании помимо FairCom DB есть и FairCom Edge. Это база данных, разработанная специально для интернета вещей. Там «из коробки» предоставляются MQTT-брокер и куча всяких полезных IoT-фич. Если вам интересна эта тема, можем рассказать об FairCom Edge в другой своей статье. Подписывайтесь, чтобы не пропустить!