Русский
Русский
English
Статистика
Реклама

Mariadb

KODI собираем удобный и функциональный медиацентр для дома. Часть 6. Синхронизация медиатеки. MariaDB

12.04.2021 02:07:50 | Автор: admin

Лирическое отступление

Уже более года в качестве медиацентра использую KODI. Начиналось всё с каких-то базовых вещей, но даже от такого функционала я был в полном восторге. Просмотр ТВ, фильмов и сериалов теперь не выглядит каким-то квестом, а все мои домашние также полюбили KODI, и я даже не представляю, как раньше могли справляться без него.

Но я все больше погружался в его возможности и постепенно наращивал функционал. Реализовал, казалось бы, простые вещи, но, если сложить все мелкие детали воедино понимаешь, насколько все комфортно, логично и продумано, а главное - функционально. Именно такую оценку я даю всему конечному результату. Для кого-то это будет вовсе не так, конечно, ведь у всех свои фломастеры. Но после первых публикаций я получил массу положительных откликов от аудитории и гостей хабра, и понял, что кому-то пригодился мой опыт. Это приятно. Поэтому, хочется продолжать.

Если вы пропустили предыдущие публикации обязательно загляните в них, возможно и для вас найдется что-то интересное. Если в двух словах установили и настроили с нуля ОС и KODI, настроили просмотр торрент-контента, YouTube, IPTV. Поговорили об управлении с других устройств, резервном копировании, анализе трафика и даже научили KODI запускать ретро-игры.

Все предыдущие публикации:

KODI: собираем удобный и функциональный медиацентр для дома. Часть 1
KODI: собираем удобный и функциональный медиацентр для дома. Часть 2
KODI: собираем удобный и функциональный медиацентр для дома. Часть 3. Ретро-игры
KODI: собираем удобный и функциональный медиацентр для дома. Часть 4. Архив IPTV
KODI: собираем удобный и функциональный медиацентр для дома. Часть 5. Яндекс.Музыка

Зачем это все затевалось?

Среди медиаустройств, в моем домашнем обиходе два телевизора. Основной в гостиной работает с KODI, второй на кухне под управлением Tizen OS. Мысль о том, что последнего также нужно посадить на KODI возникла спустя пару недель после запуска медиацентра на основном телевизоре. Но руки все никак не доходили

Каждый раз, переключая ужасного качества каналы кабельного ТВ на кухне, я вспоминал о своей затее. И вот пришло время воплотить ее в жизнь. Для этой задачи в поднебесной был заказан Raspberry Pi 3 и все та же аэромышь, как и для основного телевизора (подробнее о ней в первой части).

Итого, в гостиной KODI на базе неттопа с Kubuntu 20.04 на борту, на кухне LibreELEC на базе третьей малинки.

Кухонный медиацентр должен выполнять всего две задачи:
просмотр IPTV. Буду использовать все тот же сервис ilook и дополнение PVR IPTV Simple Client. К слову, сервис позволяет использовать плейлист на двух устройствах без дополнительной платы за тариф.
просмотр торрент-видео. Потому как локальной библиотеки фильмов и сериалов у меня нет.

О том, как установить LibreELEC на малинку описывать, думаю, не стоит. А как подключить IPTV и Elementum для просмотра торрентов я рассказывал в другой публикации.

Общее понимание архитектуры есть, причем же здесь MariaDB в заголовке? Представьте, вы смотрите фильм в гостиной, идете обедать на кухню и продолжаете просмотр ровно с того места, на котором остановились. Здорово, не правда ли?

KODI позволяет реализовать синхронизацию медиатеки на разных устройствах. Для этого потребуется MySQL-сервер, на котором и будет храниться эта медиатека. Сервер может быть поднят на совершенно сторонней машине, хоть под управлением Windows. В моем случае, основной медиацентр работает 24/7, аппаратные ресурсы позволяют сервером назначает его, на нем и будем поднимать базу данных.

Надеюсь, суть и прелести такой архитектуры домашних медиацентров понятна.

Подготовка серверной части. MariaDB

Прочитав Wiki на официальном сайте KODI, решил, что все довольно просто и понятно бери и делай. Но на практике оказалось все иначе БД не наполняется моей медиатекой, в логах ошибки не поддаются пониманию или записей нет вообще, от того понять, что сделано не так достаточно трудно. Второе устройство подключать к БД смысла нет синхронизировать нечего.

В комментариях к предыдущей публикации был затронут этот вопрос и @vyacheslavteplyakov дал понять, что Wiki не обновляется и информация, вероятно, устарела. Но и указал на основные подводные камни и как их обойти.

Особенности:

  • Использовать MariaDB;

  • Медиатека должна быть размещена в сетевом каталоге;

  • Все пути к медиатеке на всех устройствах должны быть абсолютные;

  • Сетевые каталоги NFS или SMB, если вынуждены использовать NTFS, то только с авторизацией по учетной записи с паролем;

  • Версии KODI на всех устройствах должны быть одинаковы.

С задачей и подводными камнями разобрались приступаем к работе. Напомню, сервером у нас будет KODI на неттопе с Kubuntu 20.04.

Устанавливаем сервер MariaDB

sudo apt updatesudo apt install mariadb-server

Cледующим шагом является запуск встроенного скрипта безопасности. Этот скрипт меняет ряд наименее защищенных опций, используемых по умолчанию, для таких функций, как, например, удаленный вход для пользователя root и тестовые пользователи.

Запускаем скрипт безопасности

sudo mysql_secure_installation

Откроется серия диалогов, где можно внести некоторые изменения в параметры безопасности установки MariaDB. Параметры установите, исходя из собственной безопасности. Учитывая, что моя БД будет наполняться лишь медиатекой и находится она в изолированной домашней сети сделал так:

root@kodi-pc:/# sudo mysql_secure_installationNOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!In order to log into MariaDB to secure it, we'll need the currentpassword for the root user.  If you've just installed MariaDB, andyou haven't set the root password yet, the password will be blank,so you should just press enter here.Enter current password for root (enter for none):

Пароль не задаем, нажимаем ENTER.

Setting the root password ensures that nobody can log into the MariaDBroot user without the proper authorisation.Set root password? [Y/n]

Отклоняем (N).

By default, a MariaDB installation has an anonymous user, allowing anyoneto log into MariaDB without having to have a user account created forthem.  This is intended only for testing, and to make the installationgo a bit smoother.  You should remove them before moving into aproduction environment.Remove anonymous users? [Y/n]

Удаляем (Y).

Normally, root should only be allowed to connect from 'localhost'.  Thisensures that someone cannot guess at the root password from the network.Disallow root login remotely? [Y/n]

Отклоняем (N).

By default, MariaDB comes with a database named 'test' that anyone canaccess.  This is also intended only for testing, and should be removedbefore moving into a production environment.Remove test database and access to it? [Y/n]

Удаляем (Y).

Reloading the privilege tables will ensure that all changes made so farwill take effect immediately.Reload privilege tables now? [Y/n]

Соглашаемся (Y).

Теперь создадим пользователя, из-под которого будут работать с БД наши медиацентры. Для создания пользователя kodi с паролем kodi запускаем оболочку MariaDB и выполняем команду

sudo mariadbGRANT ALL ON *.* TO 'kodi'@'localhost' IDENTIFIED BY 'kodi' WITH GRANT OPTION;

Разрешаем доступ с любого хоста ко всем базам данных на сервере для пользователя kodi

GRANT ALL PRIVILEGES ON *.* TO kodi@'%' IDENTIFIED BY 'kodi';

Очищаем привилегии, чтобы они были сохранены и доступны в текущем сеансе

FLUSH PRIVILEGES;

Оболочку MariaDB можно закрывать, выполнив команду

exit

Для организации доступа вне локального хоста, необходимо указать порт 3306 и bind-address 0.0.0.0. Открываем конфигурационный файл MariaDB

sudo mcedit /etc/mysql/mariadb.conf.d/50-server.cnf

Раскомментировать параметр

port = 3306

Для параметра bind-address установить 0.0.0.0 (вместо 127.0.0.1)

bind-address = 0.0.0.0

Для применения изменений перезапускаем MySQL-сервер

sudo service mysql restart

На данном этапе можно проверить, верно ли мы все сделали. Для этого лучше всего подключиться к нашему серверу со сторонней машины. Это гарантирует работоспособность доступа к БД вне локального хоста.

Как вариант - MySQL Workbench.

Создаем новое подключение:
Connection Method - Standart (TCP/IP)
Hostname 192.168.0.50 (заменить на адрес вашего сервера)
Port 3306
Username kodi (имя пользователя, если создавали своего)

Нажимаем Test Connection, вводим пароль и в случае, если все корректно получаем соответствующее сообщение:

Подключение к серверу также должно быть успешным. Вы должны увидеть ничего. Это тоже хороший знак. Сейчас мы и займемся наполнением БД.

Подготовка серверной части. KODI

Как и говорил выше, медиатека должна быть размещена в сетевом каталоге, так как она будет одна на все устройства. В моем случае библиотека фильмов и сериалов состоит не из локальных медиафайлов, а наполняется из торрент-трекеров дополнения Elementum.

Библиотеку мы настраивали еще в первой части. Никуда ее не переносим, пути оставляем прежние:
/mnt/kodi/library/Movies библиотека фильмов
/mnt/kodi/library/Shows библиотека сериалов

Необходимо лишь расшарить каталог /mnt/kodi/library. Конфигурируем samba

sudo mcedit /etc/samba/smb.conf

В конец конфигурационного файла вставляем:

[library]comment = librarypath = /mnt/kodi/library/browsable = yeswritable = yesguest ok = yesread only = noforce user = nobodyforce group = nogroupforce create mode = 0777force directory mode = 0777

И перезапускаем сервис samba

sudo /etc/init.d/smbd restart

Теперь наша библиотека будет доступна всем устройствам в домашней сети.

Важно! В источниках медиатеки также необходимо указать абсолютный путь к директории с файлами библиотеки! Хоть она и находится локально на этом устройстве (сервере).

Переходим в Настройки/Медиа/Медиатека/Видео и в существующих источниках Movies и Shows изменяем пути на нужные, выбрав Добавить сетевой адрес. В качестве логина и пароля используйте данные вашей учетной записи в Kubuntu.

После изменения путей, источники будут отображаться и в KODI, как сетевые.

Теперь дадим понять KODI, что мы хотим работать с базой данных. Для этого в файле advancedsettings.xml (/home/имя_пользователя/.kodi/userdata/) добавить:

<advancedsettings>  <videodatabase>    <type>mysql</type>    <host>192.168.0.50</host>    <port>3306</port>    <user>kodi</user>    <pass>kodi</pass>  </videodatabase>  <videolibrary>    <importwatchedstate>true</importwatchedstate>    <importresumepoint>true</importresumepoint>  </videolibrary></advancedsettings>

Если файл advancedsettings.xml отсутствует создайте его вручную. Параметры изменить в соответствии с вашими настройками, где:
Host IP-адрес вашего MySQL-сервера;
User имя пользователя MariaDB;
Pass пароль пользователя MariaDB.

На стороне сервера всё готово. Можно проверить. Перезапускаем KODI и, в зависимости от объема вашей медиатеки, ждем какое-то время, пока KODI ее обработает.

Информация о моей медиатеке:
Фильмов 322
Сериалов 68

Размер - 380 Кб

Общее количество файлов (nfo и strm) 3826

Моя медиатека обрабатывалась порядка 10 минут. По завершении обновления медиатеки давайте посмотрим на нашу БД. Снова подключаемся к серверу с помощью MySQL Workbench.

Как видим, KODI самостоятельно создал БД MyVideos119 и наполнил ее всеми нашими фильмами и сериалами. Например, в таблице Movie - фильмы. Значит, мы все сделали правильно.

После завершения импорта медиатеки в БД, можно еще оценить и ее ресурсопотребление. Моя медиатека заняла в ОЗУ чуть более 100 Мб. Это дает понять, что, даже значительный рост количества фильмов и сериалов, не скажется на производительности основного моего медиацентра.

Настройка клиентской части

Настройки других устройств, которые необходимо синхронизировать с сервером, очень просты:

  • advancedsettings настраиваем, также как на сервере;

  • добавляем источники в Настройки/Медиа/Медиатека/Видео также, как и на сервере, указывая абсолютные сетевые пути;

  • если вы, как и я используете дополнение Elementum в его настройках также изменить пути на абсолютные до сервера (путь к библиотеке и путь к торрент-файлам). Таким образом, где бы вы не начали смотреть (скачивать) фильм, сохранится он на сервере. Да и в моем случае, не рационально было бы для малинки иметь свое файловое хранилище.

Для упрощения настройки своей малинки я просто перенес конфигурационные файлы с основного медиацентра:

/home/kodi/.kodi/userdata/advancedsettings.xml
/home/kodi/.kodi/userdata/sources.xml
/home/kodi/.kodi/userdata/addon_data/plugin.video.elementum/settings.xml
/home/kodi/.kodi/userdata/addon_data/script.elementum.burst/settings.xml

По завершении настройки, перезапускаем KODI и наблюдаем, как пустая библиотека начинает наполняться и полностью соответствует библиотеке на основном медиацентре, вплоть до просмотренных или не просмотренных серий, а также просматриваемые сейчас и даже с временной меткой, на которой был остановлен просмотр.

Проделав этот путь, понимаешь, что все было так просто, но в тоже время не так и очевидно с первого взгляда. Надеюсь, кому-то мой опыт поможет избежать зря потраченных сил и времени.

Если мой медиацентр обзаведется еще какими-то интересными возможностями - обязательно сделаю отчет в следующих публикациях.

Всем хорошего времяпрепровождения с медиацентром KODI!

Подробнее..

Изучаем Bash путем написания интерактивой игры, создаем культуру DevOps, а также шпаргалка по MariaDB и MySQL

14.01.2021 16:09:15 | Автор: admin

Начинаем 2021 год с нового дайджеста полезных материалов. Собрали много инсайтов, записей важных вебинаров, книжек и шпаргалок. Оставайтесь с нами станьте частью DevNation!

Начни новое:

  • 5 тенденций гибридного облака, на которые стоит обратить внимание в 2021 году

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

    Вкратце: главный архитектор Red Hat Эмили Бренд (Emily Brand) и другие эксперты делятся советами с ИТ-руководителям.

  • Удаленная работа: 3 способа взбодрить свою команду в 2021 году

    Новый Год это новая возможность подзарядить энергией вашу команду. Представляем новые методики, которые помогут стимулировать креативность, сотрудничество и вовлеченность на виртуальных рабочих местах.

    Вкратце: главный технический специалист Red Hat по работе с публичным сектором Дэвил Эгтс (David Egts) рассказывает о виртуальных комнатах отдыха и других подобных вещах.

Почитать на досуге:

Скачать:

  • Шпаргалка по MariaDB и MySQL

    Полезные команды для подключения к серверам, анализа данных и других ключевых операций, которые можно применять из командной строки и в составе SQL-сценариев, причем многие из них также можно задействовать через программные библиотеки.

Еще полезное:

  • Запускаем Kubernetes на Raspberry Pi

    Каждую главу этой электронной книги можно читать как самостоятельную единицу или как часть общего руководства по запуску Kubernetes на Raspberry Pi.

  • Шпаргалка по Kubectl

    9 критически важных команд kubectl для устранения неполадок и управления при администрировании кластера Kubernetes.

  • Шпаргалка по Emacs

    В Emacs огромное множество клавиатурных сокращений для быстрого вызова команд, эта шпаргалка познакомит с основными из них.

Подробнее..

Изучаем Bash путем написания интерактивной игры, создаем культуру DevOps, а также шпаргалка по MariaDB и MySQL

14.01.2021 18:11:53 | Автор: admin

Начинаем 2021 год с нового дайджеста полезных материалов. Собрали много инсайтов, записей важных вебинаров, книжек и шпаргалок. Оставайтесь с нами станьте частью DevNation!

Начни новое:

  • 5 тенденций гибридного облака, на которые стоит обратить внимание в 2021 году

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

    Вкратце: главный архитектор Red Hat Эмили Бренд (Emily Brand) и другие эксперты делятся советами с ИТ-руководителям.

  • Удаленная работа: 3 способа взбодрить свою команду в 2021 году

    Новый Год это новая возможность подзарядить энергией вашу команду. Представляем новые методики, которые помогут стимулировать креативность, сотрудничество и вовлеченность на виртуальных рабочих местах.

    Вкратце: главный технический специалист Red Hat по работе с публичным сектором Дэвил Эгтс (David Egts) рассказывает о виртуальных комнатах отдыха и других подобных вещах.

Почитать на досуге:

Скачать:

  • Шпаргалка по MariaDB и MySQL

    Полезные команды для подключения к серверам, анализа данных и других ключевых операций, которые можно применять из командной строки и в составе SQL-сценариев, причем многие из них также можно задействовать через программные библиотеки.

Еще полезное:

  • Запускаем Kubernetes на Raspberry Pi

    Каждую главу этой электронной книги можно читать как самостоятельную единицу или как часть общего руководства по запуску Kubernetes на Raspberry Pi.

  • Шпаргалка по Kubectl

    9 критически важных команд kubectl для устранения неполадок и управления при администрировании кластера Kubernetes.

  • Шпаргалка по Emacs

    В Emacs огромное множество клавиатурных сокращений для быстрого вызова команд, эта шпаргалка познакомит с основными из них.

Подробнее..

Перевод Автоматизируем установку WordPress с NGINX Unit и Ubuntu

23.10.2020 08:18:45 | Автор: admin


Есть множество материалов по установке WordPress, поиск в Google по ключевым словам "WordPress install" выдаст порядка полумиллиона результатов. Но тем не менее фактически среди них весьма мало годных руководств, по которым можно установить и настроить WordPress и нижележащую операционную систему так, чтобы они были способны к поддержке в течение длительного периода времени. Возможно, правильные настройки сильно зависят от конкретных потребностей, или же это связано с тем, что подробное объяснение делает статью тяжелой для чтения.


В этой статье мы постараемся собрать лучшее из двух подходов, предоставляя скрипт на bash для автоматической установки WordPress на Ubuntu, а также пройдемся по нему, поясняя, что делает каждый его кусочек, а также на какие компромиссы мы пошли при его разработке. Если вы опытный пользователь можете пропустить текст статьи и просто взять скрипт для модификации и использования в ваших окружениях. На выходе скрипта получается настраиваемая установка Wordpress с поддержкой Lets Encrypt, работающая на NGINX Unit и пригодная для промышленного применения.


Разработанная архитектура для развертывания WordPress с использованием NGINX Unit описана в более старой статье, сейчас мы также дополнительно настроим вещи, которые там не были охвачены (как и во многих других руководствах):


  • WordPress CLI
  • Let's Encrypt и сертификаты TLS\SSL
  • Автоматическое обновление сертификатов
  • Кэширование NGINX
  • Сжатие NGINX
  • Поддержка HTTPS и HTTP/2
  • Автоматизация процесса

В статье будет описана установка на одном сервере, на котором будут размещены одновременно сервер обработки статики, сервер обработки PHP, база данных. Установка с поддержкой множества виртуальных хостов и сервисов потенциальная тема на будущее. Хотите, чтобы мы написали о чем-то, чего нет в этих статьях пишите в комментариях.


Требования


  • Сервер-контейнер (LXC или LXD), виртуальная машина, или обычный железный сервер, с не менее чем 512Мб оперативной памяти и установленной Ubuntu 18.04 или более свежей.
  • Доступные из интернета порты 80 и 443
  • Доменное имя, связанное с публичным ip-адресом этого сервера
  • Доступ с правами root (sudo).

Обзор архитектуры


Архитектура такая же, как было описано ранее, трехуровневое web-приложение. Оно состоит из скриптов PHP, исполняемых на обработчике PHP, и статических файлов, обрабатываемых веб-сервером.



Общие принципы


  • Многие команды для настройки в скрипте обернуты в условия (if) для идемпотентности: скрипт можно запускать несколько раз без риска изменения настроек, которые уже готовы.
  • Скрипт старается устанавливать ПО из репозиториев, так что вы можете применять обновления системы в одну команду (apt upgrade для Ubuntu).
  • Команды стараются определить, что они запускаются в контейнере, чтобы изменить соответствующим образом свои настройки.
  • Для того, чтобы задать число запускаемых процессов\потоков в настройках, скрипт пробует угадать автоматические параметры настройки для работы в контейнерах, виртуальных машинах, железных серверах.
  • При описании настроек всегда думаем в первую очередь об автоматизации, которая, как мы надеемся, станет основой для создания вашей собственной инфраструктуры как кода.
  • Все команды запускаются от пользователя root, потому что они изменяют основные системные настройки, но непосредственно WordPress работает от обычного пользователя.

Установка переменных окружения


Установите следующие переменные окружения, прежде чем запускать скрипт:


  • WORDPRESS_DB_PASSWORD пароль к базе данных WordPress
  • WORDPRESS_ADMIN_USER имя администратора WordPress
  • WORDPRESS_ADMIN_PASSWORD пароль администратора WordPress
  • WORDPRESS_ADMIN_EMAIL email администратора WordPress
  • WORDPRESS_URL полный URL сайта WordPress, начиная с https://.
  • LETS_ENCRYPT_STAGING пустая по-умолчанию, но, выставив значение в 1, вы будете использовать staging сервера Lets Encrypt, необходимые для частого запроса сертификатов при тестировании ваших настроек, иначе Lets Encrypt может временно заблокировать ваш ip-адрес из-за большого числа запросов.

Скрипт проверяет, что эти связанные с WordPress переменные выставлены, и завершает работу, если нет.
Строки скрипта 572-576 проверяют значение LETS_ENCRYPT_STAGING.


Установка производных переменных окружения


Скрипт в строках 55-61 выставляет следующие переменные окружения, либо в некоторое жестко заданное значение, либо с применением значения, полученного из переменных, установленных в предыдущем разделе:


  • DEBIAN_FRONTEND="noninteractive" сообщает приложениям, что они запускаются в скрипте и нет возможности взаимодействия с пользователем.
  • WORDPRESS_CLI_VERSION="2.4.0" версия приложения WordPress CLI.
  • WORDPRESS_CLI_MD5= "dedd5a662b80cda66e9e25d44c23b25c" контрольная сумма исполняемого файла WordPress CLI 2.4.0 (версия указывается в переменной WORDPRESS_CLI_VERSION). Скрипт на 162 строке использует это значение для проверки, что был скачан корректный файл WordPress CLI.
  • UPLOAD_MAX_FILESIZE="16M" максимальный размер файла, который может быть закачан в WordPress. Эта настройка используется в нескольких местах, так что проще задавать ее в одном месте.
  • TLS_HOSTNAME= "$(echo ${WORDPRESS_URL} | cut -d'/' -f3)" hostname системы, извлекаемый из переменной WORDPRESS_URL. Используется для получения соответствующих TLS/SSL сертификатов от Lets Encrypt, а также для внутренней проверки WordPress.
  • NGINX_CONF_DIR="/etc/nginx" путь к каталогу с настройками NGINX, включая основной файл nginx.conf.
  • CERT_DIR="/etc/letsencrypt/live/${TLS_HOSTNAME}" путь к сертификатам Lets Encrypt для сайта WordPress, получаемый из переменной TLS_HOSTNAME.

Назначение hostname WordPress серверу


Скрипт устанавливает hostname серверу, чтобы значение соответствовало доменному имени сайта. Это не обязательно, но так удобнее отправлять исходящую почту через SMTP при настройке единственного сервера, как это настраивается скриптом.


код скрипта
# Change the hostname to be the same as the WordPress hostnameif [ ! "$(hostname)" == "${TLS_HOSTNAME}" ]; then  echo " Changing hostname to ${TLS_HOSTNAME}"  hostnamectl set-hostname "${TLS_HOSTNAME}"fi

Добавление hostname в /etc/hosts


Дополнение WPCron используется для запуска периодических задач, требует, чтобы WordPress мог получить доступ к самому себе через HTTP. Чтобы убедиться, что WP-Cron работает корректно на всех окружениях, скрипт добавляет строчку в файл /etc/hosts, так что WordPress может получить доступ к самому себе через интерфейс loopback:


код скрипта
# Add the hostname to /etc/hostsif [ "$(grep -m1 "${TLS_HOSTNAME}" /etc/hosts)" = "" ]; then  echo " Adding hostname ${TLS_HOSTNAME} to /etc/hosts so that WordPress can ping itself"  printf "::1 %s\n127.0.0.1 %s\n" "${TLS_HOSTNAME}" "${TLS_HOSTNAME}" >> /etc/hostsfi

Установка инструментов, требуемых для последующих шагов


Оставшаяся часть скрипта нуждается в некоторых программах и подразумевает, что репозитории актуальны. Мы обновляем список репозиториев, после чего устанавливаем нужные инструменты:


код скрипта
# Make sure tools needed for install are presentecho " Installing prerequisite tools"apt-get -qq updateapt-get -qq install -y \  bc \  ca-certificates \  coreutils \  curl \  gnupg2 \  lsb-release

Добавление репозиториев NGINX Unit и NGINX


Скрипт устанавливает NGINX Unit и NGINX с открытым исходным кодом из официальных репозиториев NGINX, чтобы удостовериться, что используются версии с последними обновлениями безопасности и исправлениями ошибок.


Скрипт добавляет репозиторий NGINX Unit, а затем репозиторий NGINX, добавляя ключ репозиториев и файлы настроек apt, задающих доступ к репозиториям через интернет.


Реальная установка NGINX Unit и NGINX происходит в следующем разделе. Мы предварительно добавляем репозитории, чтобы не обновлять метаданные несколько раз, что делает установку быстрее.


код скрипта
# Install the NGINX Unit repositoryif [ ! -f /etc/apt/sources.list.d/unit.list ]; then  echo " Installing NGINX Unit repository"  curl -fsSL https://nginx.org/keys/nginx_signing.key | apt-key add -  echo "deb https://packages.nginx.org/unit/ubuntu/ $(lsb_release -cs) unit" > /etc/apt/sources.list.d/unit.listfi# Install the NGINX repositoryif [ ! -f /etc/apt/sources.list.d/nginx.list ]; then  echo " Installing NGINX repository"  curl -fsSL https://nginx.org/keys/nginx_signing.key | apt-key add -  echo "deb https://nginx.org/packages/mainline/ubuntu $(lsb_release -cs) nginx" > /etc/apt/sources.list.d/nginx.listfi

Установка NGINX, NGINX Unit, PHP MariaDB, Certbot (Lets Encrypt) и их зависимостей


Как только все репозитории добавлены, обновляем метаданные и устанавливаем приложения. Пакеты, устанавливаемые скриптом, также включают расширения PHP, рекомендуемые при запуске WordPress.org


код скрипта
echo " Updating repository metadata"apt-get -qq update# Install PHP with dependencies and NGINX Unitecho " Installing PHP, NGINX Unit, NGINX, Certbot, and MariaDB"apt-get -qq install -y --no-install-recommends \  certbot \  python3-certbot-nginx \  php-cli \  php-common \  php-bcmath \  php-curl \  php-gd \  php-imagick \  php-mbstring \  php-mysql \  php-opcache \  php-xml \  php-zip \  ghostscript \  nginx \  unit \  unit-php \  mariadb-server

Настройка PHP для использования с NGINX Unit и WordPress


Скрипт создает файл настроек в каталоге conf.d. Тут задается максимальный размер загружаемых файлов для PHP, включается вывод ошибок PHP в STDERR, так что они будут записаны в журнал NGINX Unit, а также перезапускается NGINX Unit.


код скрипта
# Find the major and minor PHP version so that we can write to its conf.d directoryPHP_MAJOR_MINOR_VERSION="$(php -v | head -n1 | cut -d' ' -f2 | cut -d'.' -f1,2)"if [ ! -f "/etc/php/${PHP_MAJOR_MINOR_VERSION}/embed/conf.d/30-wordpress-overrides.ini" ]; then  echo " Configuring PHP for use with NGINX Unit and WordPress"  # Add PHP configuration overrides  cat > "/etc/php/${PHP_MAJOR_MINOR_VERSION}/embed/conf.d/30-wordpress-overrides.ini" << EOM; Set a larger maximum upload size so that WordPress can handle; bigger media files.upload_max_filesize=${UPLOAD_MAX_FILESIZE}post_max_size=${UPLOAD_MAX_FILESIZE}; Write error log to STDERR so that error messages show up in the NGINX Unit logerror_log=/dev/stderrEOMfi# Restart NGINX Unit because we have reconfigured PHPecho " Restarting NGINX Unit"service unit restart

Задание настроек базы данных MariaDB для WordPress


Мы выбрали MariaDB вместо MySQL, поскольку у нее больше активность сообщества, кроме того, она, возможно, предоставляет более высокую производительность по умолчанию (вероятно, тут все проще: чтобы поставить MySQL, надо добавить еще один репозиторий, прим. переводчика).


Скрипт создает новую базу данных и создает учетные данные для доступа WordPress через интерфейс loopback:


код скрипта
# Set up the WordPress databaseecho " Configuring MariaDB for WordPress"mysqladmin create wordpress || echo "Ignoring above error because database may already exist"mysql -e "GRANT ALL PRIVILEGES ON wordpress.* TO \"wordpress\"@\"localhost\" IDENTIFIED BY \"$WORDPRESS_DB_PASSWORD\"; FLUSH PRIVILEGES;"

Установка программы WordPress CLI


На этом шаге скрипт устанавливает программу WP-CLI. С его помощью можно установить и управлять настройками WordPress без необходимости ручной правки файлов, обновления базы или входа в панель управления. Также с его помощью можно установить темы и дополнения и выполнить обновление WordPress.


код скрипта
if [ ! -f /usr/local/bin/wp ]; then  # Install the WordPress CLI  echo " Installing the WordPress CLI tool"  curl --retry 6 -Ls "https://github.com/wp-cli/wp-cli/releases/download/v${WORDPRESS_CLI_VERSION}/wp-cli-${WORDPRESS_CLI_VERSION}.phar" > /usr/local/bin/wp  echo "$WORDPRESS_CLI_MD5 /usr/local/bin/wp" | md5sum -c -  chmod +x /usr/local/bin/wpfi

Установка и настройка WordPress


Скрипт устанавливает последнюю версию WordPress в каталог /var/www/wordpress, а также изменяет настройки:


  • Соединение с базой данных работает через unix domain socket вместо TCP на loopback, чтобы сократить трафик TCP.
  • WordPress добавляет префикс https:// к URL, если клиенты соединяются с NGINX по протоколу HTTPS, а также отправляет удаленный hostname (как это предоставляет NGINX) в PHP. Мы применяем кусочек кода, чтобы это настроить.
  • WordPress нужно HTTPS для входа
  • Структура URL по молчанию основывается на ресурсах
  • Выставляются правильные права на файловой системе для каталога WordPress.

код скрипта
if [ ! -d /var/www/wordpress ]; then  # Create WordPress directories  mkdir -p /var/www/wordpress  chown -R www-data:www-data /var/www  # Download WordPress using the WordPress CLI  echo " Installing WordPress"  su -s /bin/sh -c 'wp --path=/var/www/wordpress core download' www-data  WP_CONFIG_CREATE_CMD="wp --path=/var/www/wordpress config create --extra-php --dbname=wordpress --dbuser=wordpress --dbhost=\"localhost:/var/run/mysqld/mysqld.sock\" --dbpass=\"${WORDPRESS_DB_PASSWORD}\""  # This snippet is injected into the wp-config.php file when it is created;  # it informs WordPress that we are behind a reverse proxy and as such  # allows it to generate links using HTTPS  cat > /tmp/wp_forwarded_for.php << 'EOM'/* Turn HTTPS 'on' if HTTP_X_FORWARDED_PROTO matches 'https' */if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && strpos($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') !== false) {    $_SERVER['HTTPS'] = 'on';}if (isset($_SERVER['HTTP_X_FORWARDED_HOST'])) {    $_SERVER['HTTP_HOST'] = $_SERVER['HTTP_X_FORWARDED_HOST'];}EOM  # Create WordPress configuration  su -s /bin/sh -p -c "cat /tmp/wp_forwarded_for.php | ${WP_CONFIG_CREATE_CMD}" www-data  rm /tmp/wp_forwarded_for.php  su -s /bin/sh -p -c "wp --path=/var/www/wordpress config set 'FORCE_SSL_ADMIN' 'true'" www-data  # Install WordPress  WP_SITE_INSTALL_CMD="wp --path=/var/www/wordpress core install --url=\"${WORDPRESS_URL}\" --title=\"${WORDPRESS_SITE_TITLE}\" --admin_user=\"${WORDPRESS_ADMIN_USER}\" --admin_password=\"${WORDPRESS_ADMIN_PASSWORD}\" --admin_email=\"${WORDPRESS_ADMIN_EMAIL}\" --skip-email"  su -s /bin/sh -p -c "${WP_SITE_INSTALL_CMD}" www-data  # Set permalink structure to a sensible default that isn't in the UI  su -s /bin/sh -p -c "wp --path=/var/www/wordpress option update permalink_structure '/%year%/%monthnum%/%postname%/'" www-data  # Remove sample file because it is cruft and could be a security problem  rm /var/www/wordpress/wp-config-sample.php  # Ensure that WordPress permissions are correct  find /var/www/wordpress -type d -exec chmod g+s {} \;  chmod g+w /var/www/wordpress/wp-content  chmod -R g+w /var/www/wordpress/wp-content/themes  chmod -R g+w /var/www/wordpress/wp-content/pluginsfi

Настройка NGINX Unit


Скрипт настраивает NGINX Unit для запуска PHP и обработки путей WordPress, изолируя пространство имен процессов PHP и оптимизируя настройки производительности. Тут есть три функции, на которые стоит обратить внимание:


  • Поддержка пространств имен определяется по условию, основана на проверке запуска скрипта в контейнере. Это нужно, поскольку большинство настроек контейнеров не поддерживают вложенный запуск контейнеров.
  • Если есть поддержка пространств имен, отключается пространство имен network. Это нужно, чтобы позволить WordPress одновременно подключаться и к endpoints и быть доступным в интернете.
  • Максимальное число процессов определяется следующим образом: (Доступная память для запущенных MariaDB и NGINX Uniy)/(предел по оперативной памяти в PHP + 5)
    Это значение устанавливается в настройках NGINX Unit.

Также это значение подразумевает, что всегда есть как минимум два запущенных процесса PHP, что важно, поскольку WordPress делает много асинхронных запросов к самому себе, а без дополнительных процессов запуск, к примеру, WP-Cron, сломается. Вы, возможно, захотите увеличить или уменьшить эти ограничения, основываясь на ваших локальных настройках, потому что созданные настройки здесь консервативные. На большинстве производственных систем настройки находятся между 10 и 100.


код скрипта
if [ "${container:-unknown}" != "lxc" ] && [ "$(grep -m1 -a container=lxc /proc/1/environ | tr -d '\0')" == "" ]; then  NAMESPACES='"namespaces": {        "cgroup": true,        "credential": true,        "mount": true,        "network": false,        "pid": true,        "uname": true    }'else  NAMESPACES='"namespaces": {}'fiPHP_MEM_LIMIT="$(grep 'memory_limit' /etc/php/7.4/embed/php.ini | tr -d ' ' | cut -f2 -d= | numfmt --from=iec)"AVAIL_MEM="$(grep MemAvailable /proc/meminfo | tr -d ' kB' | cut -f2 -d: | numfmt --from-unit=K)"MAX_PHP_PROCESSES="$(echo "${AVAIL_MEM}/${PHP_MEM_LIMIT}+5" | bc)"echo " Calculated the maximum number of PHP processes as ${MAX_PHP_PROCESSES}. You may want to tune this value due to variations in your configuration. It is not unusual to see values between 10-100 in production configurations."echo " Configuring NGINX Unit to use PHP and WordPress"cat > /tmp/wordpress.json << EOM{  "settings": {    "http": {      "header_read_timeout": 30,      "body_read_timeout": 30,      "send_timeout": 30,      "idle_timeout": 180,      "max_body_size": $(numfmt --from=iec ${UPLOAD_MAX_FILESIZE})    }  },  "listeners": {    "127.0.0.1:8080": {      "pass": "routes/wordpress"    }  },  "routes": {    "wordpress": [      {        "match": {          "uri": [            "*.php",            "*.php/*",            "/wp-admin/"          ]        },        "action": {          "pass": "applications/wordpress/direct"        }      },      {        "action": {          "share": "/var/www/wordpress",          "fallback": {            "pass": "applications/wordpress/index"          }        }      }    ]  },  "applications": {    "wordpress": {      "type": "php",      "user": "www-data",      "group": "www-data",      "processes": {        "max": ${MAX_PHP_PROCESSES},        "spare": 1      },      "isolation": {        ${NAMESPACES}      },      "targets": {        "direct": {          "root": "/var/www/wordpress/"        },        "index": {          "root": "/var/www/wordpress/",          "script": "index.php"        }      }    }  }}EOMcurl -X PUT --data-binary @/tmp/wordpress.json --unix-socket /run/control.unit.sock http://localhost/config

Настройка NGINX


Настройка основных параметров NGINX


Скрипт создает каталог для кэша NGINX, а затем создает основной файл настройки nginx.conf. Обратите внимание на число процессов-обработчиков и задание максимального размера файла для загрузки. Также есть строка, на которой подключается файл настройки сжатия, определяемый в следующем разделе, далее идут настройки кэширования.


код скрипта
# Make directory for NGINX cachemkdir -p /var/cache/nginx/proxyecho " Configuring NGINX"cat > ${NGINX_CONF_DIR}/nginx.conf << EOMuser nginx;worker_processes auto;error_log  /var/log/nginx/error.log warn;pid        /var/run/nginx.pid;events {    worker_connections  1024;}http {    include       ${NGINX_CONF_DIR}/mime.types;    default_type  application/octet-stream;    log_format  main  '\$remote_addr - \$remote_user [\$time_local] "\$request" '                      '\$status \$body_bytes_sent "\$http_referer" '                      '"\$http_user_agent" "\$http_x_forwarded_for"';    access_log  /var/log/nginx/access.log  main;    sendfile        on;    client_max_body_size ${UPLOAD_MAX_FILESIZE};    keepalive_timeout  65;    # gzip settings    include ${NGINX_CONF_DIR}/gzip_compression.conf;    # Cache settings    proxy_cache_path /var/cache/nginx/proxy        levels=1:2        keys_zone=wp_cache:10m        max_size=10g        inactive=60m        use_temp_path=off;    include ${NGINX_CONF_DIR}/conf.d/*.conf;}EOM

Настройка сжатия NGINX


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


код скрипта
cat > ${NGINX_CONF_DIR}/gzip_compression.conf << 'EOM'# Credit: https://github.com/h5bp/server-configs-nginx/# ----------------------------------------------------------------------# | Compression                                                        |# ----------------------------------------------------------------------# https://nginx.org/en/docs/http/ngx_http_gzip_module.html# Enable gzip compression.# Default: offgzip on;# Compression level (1-9).# 5 is a perfect compromise between size and CPU usage, offering about 75%# reduction for most ASCII files (almost identical to level 9).# Default: 1gzip_comp_level 6;# Don't compress anything that's already small and unlikely to shrink much if at# all (the default is 20 bytes, which is bad as that usually leads to larger# files after gzipping).# Default: 20gzip_min_length 256;# Compress data even for clients that are connecting to us via proxies,# identified by the "Via" header (required for CloudFront).# Default: offgzip_proxied any;# Tell proxies to cache both the gzipped and regular version of a resource# whenever the client's Accept-Encoding capabilities header varies;# Avoids the issue where a non-gzip capable client (which is extremely rare# today) would display gibberish if their proxy gave them the gzipped version.# Default: offgzip_vary on;# Compress all output labeled with one of the following MIME-types.# `text/html` is always compressed by gzip module.# Default: text/htmlgzip_types  application/atom+xml  application/geo+json  application/javascript  application/x-javascript  application/json  application/ld+json  application/manifest+json  application/rdf+xml  application/rss+xml  application/vnd.ms-fontobject  application/wasm  application/x-web-app-manifest+json  application/xhtml+xml  application/xml  font/eot  font/otf  font/ttf  image/bmp  image/svg+xml  text/cache-manifest  text/calendar  text/css  text/javascript  text/markdown  text/plain  text/xml  text/vcard  text/vnd.rim.location.xloc  text/vtt  text/x-component  text/x-cross-domain-policy;EOM

Настройка NGINX для WordPress


Далее скрипт создает файл настройки для WordPress default.conf в каталоге conf.d. Здесь настраивается:


  • Активация сертификатов TLS, полученных от Let's Encrypt через Certbot (его настройка будет в следующем разделе)
  • Настройка параметров безопасности TLS, основанная на рекомендациях от Let's Encrypt
  • Подключение кэширования пропускаемых запросов на 1 час по умолчанию
  • Отключение журналирования доступа, а также журналирования ошибок, если файл не найден, для двух общих запрашиваемых файлов: favicon.ico и robots.txt
  • Запрет доступа к скрытым файлам и некоторым файлам .php, чтобы предотвратить нелегальный доступ или непреднамеренный запуск
  • Отключение журналирования доступа для статики и файлов шрифтов
  • Задание заголовка Access-Control-Allow-Origin для файлов шрифтов
  • Добавление маршрутизации для index.php и прочей статики.

код скрипта
cat > ${NGINX_CONF_DIR}/conf.d/default.conf << EOMupstream unit_php_upstream {    server 127.0.0.1:8080;    keepalive 32;}server {    listen 80;    listen [::]:80;    # ACME-challenge used by Certbot for Let's Encrypt    location ^~ /.well-known/acme-challenge/ {      root /var/www/certbot;    }    location / {      return 301 https://${TLS_HOSTNAME}\$request_uri;    }}server {    listen      443 ssl http2;    listen [::]:443 ssl http2;    server_name ${TLS_HOSTNAME};    root        /var/www/wordpress/;    # Let's Encrypt configuration    ssl_certificate         ${CERT_DIR}/fullchain.pem;    ssl_certificate_key     ${CERT_DIR}/privkey.pem;    ssl_trusted_certificate ${CERT_DIR}/chain.pem;    include ${NGINX_CONF_DIR}/options-ssl-nginx.conf;    ssl_dhparam ${NGINX_CONF_DIR}/ssl-dhparams.pem;    # OCSP stapling    ssl_stapling on;    ssl_stapling_verify on;    # Proxy caching    proxy_cache wp_cache;    proxy_cache_valid 200 302 1h;    proxy_cache_valid 404 1m;    proxy_cache_revalidate on;    proxy_cache_background_update on;    proxy_cache_lock on;    proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504;    location = /favicon.ico {        log_not_found off;        access_log off;    }    location = /robots.txt {        allow all;        log_not_found off;        access_log off;    }    # Deny all attempts to access hidden files such as .htaccess, .htpasswd,    # .DS_Store (Mac)    # Keep logging the requests to parse later (or to pass to firewall utilities    # such as fail2ban)    location ~ /\. {        deny all;    }    # Deny access to any files with a .php extension in the uploads directory;    # works in subdirectory installs and also in multi-site network.    # Keep logging the requests to parse later (or to pass to firewall utilities    # such as fail2ban).    location ~* /(?:uploads|files)/.*\.php\$ {        deny all;    }    # WordPress: deny access to wp-content, wp-includes PHP files    location ~* ^/(?:wp-content|wp-includes)/.*\.php\$ {        deny all;    }    # Deny public access to wp-config.php    location ~* wp-config.php {        deny all;    }    # Do not log access for static assets, media    location ~* \.(?:css(\.map)?|js(\.map)?|jpe?g|png|gif|ico|cur|heic|webp|tiff?|mp3|m4a|aac|ogg|midi?|wav|mp4|mov|webm|mpe?g|avi|ogv|flv|wmv)$ {        access_log off;    }    location ~* \.(?:svgz?|ttf|ttc|otf|eot|woff2?)$ {        add_header Access-Control-Allow-Origin "*";        access_log off;    }    location / {        try_files \$uri @index_php;    }    location @index_php {        proxy_socket_keepalive on;        proxy_http_version 1.1;        proxy_set_header Connection "";        proxy_set_header X-Real-IP \$remote_addr;        proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;        proxy_set_header X-Forwarded-Proto \$scheme;        proxy_set_header Host \$host;        proxy_pass       http://unit_php_upstream;    }    location ~* \.php\$ {        proxy_socket_keepalive on;        proxy_http_version 1.1;        proxy_set_header Connection "";        proxy_set_header X-Real-IP \$remote_addr;        proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;        proxy_set_header X-Forwarded-Proto \$scheme;        proxy_set_header Host \$host;        try_files        \$uri =404;        proxy_pass       http://unit_php_upstream;    }}EOM

Настройка Certbot для сертификатов от Let's Encrypt и их автоматическое продление


Certbot бесплатный инструмент от Electronic Frontier Foundation (EFF), с помощью которого можно получать и автоматически обновлять сертификаты TLS от Let's Encrypt. Скрипт выполняет следующие действия, приводящие к настройке Certbot для обработки сертификатов от Let's Encrypt в NGINX:


  • Останавливает NGINX
  • Скачивает рекомендуемые параметры TLS
  • Запускает Certbot, чтобы получить сертификаты для сайта
  • Перезапускает NGINX для использования сертификатов
  • Настраивает ежедневный запуск Certbot в 3:24 ночи для проверки необходимости обновления сертификатов, а также, при необходимости, скачивания новых сертификатов и перезагрузки NGINX.

код скрипта
echo " Stopping NGINX in order to set up Let's Encrypt"service nginx stopmkdir -p /var/www/certbotchown www-data:www-data /var/www/certbotchmod g+s /var/www/certbotif [ ! -f ${NGINX_CONF_DIR}/options-ssl-nginx.conf ]; then  echo " Downloading recommended TLS parameters"  curl --retry 6 -Ls -z "Tue, 14 Apr 2020 16:36:07 GMT" \    -o "${NGINX_CONF_DIR}/options-ssl-nginx.conf" \    "https://raw.githubusercontent.com/certbot/certbot/master/certbot-nginx/certbot_nginx/_internal/tls_configs/options-ssl-nginx.conf" \    || echo "Couldn't download latest options-ssl-nginx.conf"fiif [ ! -f ${NGINX_CONF_DIR}/ssl-dhparams.pem ]; then  echo " Downloading recommended TLS DH parameters"  curl --retry 6 -Ls -z "Tue, 14 Apr 2020 16:49:18 GMT" \    -o "${NGINX_CONF_DIR}/ssl-dhparams.pem" \    "https://raw.githubusercontent.com/certbot/certbot/master/certbot/certbot/ssl-dhparams.pem" \    || echo "Couldn't download latest ssl-dhparams.pem"fi# If tls_certs_init.sh hasn't been run before, remove the self-signed certsif [ ! -d "/etc/letsencrypt/accounts" ]; then  echo " Removing self-signed certificates"  rm -rf "${CERT_DIR}"fiif [ "" = "${LETS_ENCRYPT_STAGING:-}" ] || [ "0" = "${LETS_ENCRYPT_STAGING}" ]; then  CERTBOT_STAGING_FLAG=""else  CERTBOT_STAGING_FLAG="--staging"fiif [ ! -f "${CERT_DIR}/fullchain.pem" ]; then  echo " Generating certificates with Let's Encrypt"  certbot certonly --standalone \         -m "${WORDPRESS_ADMIN_EMAIL}" \         ${CERTBOT_STAGING_FLAG} \         --agree-tos --force-renewal --non-interactive \         -d "${TLS_HOSTNAME}"fiecho " Starting NGINX in order to use new configuration"service nginx start# Write crontab for periodic Let's Encrypt cert renewalif [ "$(crontab -l | grep -m1 'certbot renew')" == "" ]; then  echo " Adding certbot to crontab for automatic Let's Encrypt renewal"  (crontab -l 2>/dev/null; echo "24 3 * * * certbot renew --nginx --post-hook 'service nginx reload'") | crontab -fi

Дополнительная настройка вашего сайта


Мы выше рассказали о том, как наш скрипт настраивает NGINX и NGINX Unit для обслуживания готового к промышленной работе сайта с включенным TLS\SSL. Вы можете также, в зависимости от ваших нужд, добавить в будущем:


  • Поддержку Brotli, улучшенное сжатие на лету по HTTPS
  • ModSecurity с правилами для WordPress, чтобы предотвратить автоматические атаки на ваш сайт
  • Резервное копирование для WordPress, подходящее вам
  • Защиту с помощью AppArmor (на Ubuntu)
  • Postfix или msmtp, чтобы WordPress мог отправлять почту
  • Проверки вашего сайта, чтобы вы понимали, сколько трафика он может выдержать

Для еще более лучшей производительности сайта мы рекомендуем обновиться до NGINX Plus, наш коммерческий продукт корпоративного уровня, основанный на NGINX c открытым исходным кодом. Его подписчики получат динамически загружаемый модуль Brotli, а также (за дополнительную оплату) NGINX ModSecurity WAF. Мы также предлагаем NGINX App Protect, модуль WAF для NGINX Plus, основанный на технологии, ведущей в отрасли безопасности, от F5.


N.B. За поддержкой высоконагруженного сайта вы можете обратиться к специалистам Southbridge. Обеспечим быструю и надежную работу вашего сайта или сервиса под любой нагрузкой.
Подробнее..

Базы данных. Тенденции общемировые и в России

19.12.2020 00:19:44 | Автор: admin

Эта статья не является ответом на множество вопросов по базам данных (БД) и системам управлениям базами данных (СУБД). Я как автор выражаю своё собственное мнение о трендах, стараясь опираться на беспристрастные показатели, статистики и т.д., но для примера приводя собственный опыт. Я не являюсь ангажированным представителем какой-либо компании и выражаю точку зрения опираясь на опыт более 25 лет работы с разными СУБД, в том числе, которую создавал своими руками. Не так много даже опытных программистов и архитекторов, которые знают все термины, технологии, какие подводные камни и куда идёт движение. Тема поистине огромная, поэтому в рамках одной статьи не раскрыть даже верхний уровень информации. Если кто-то не встретит свою любимую СУБД или её невероятный плюс, который стоит упомянуть, то прошу в комментариях указать и этим дополнить общую картину, что поможет другим разобраться и понять лучше предметную область. Поехали!

Open Source DBMS vs Commercial DBMS

Для начала приведу график с сайта, db-engines.com, по моим ощущениям, неплохо отслеживающим тренды БД. Именно этот график добавил желания написать статью о текущем положении дел. Когда мы говорим фразу база данных, то на самом деле чаще имеем в виду конкретную систему управления базами данных (СУБД), поэтому если в тексте встретится БД вместо СУБД, то это в силу такой привычки.

Open Source DBMS системы управления баз данных с открытым исходным кодом догнали коммерческие СУБД с закрытым исходным кодом. Open Source 49.98% против 50.02% у Commercial. Итогом 2020 года становится момент, когда можно будет сказать, что open source не менее популярны. Как вы видите, эта ситуация возникла не внезапно. Подсчёт на графике не в численном соотношении, а в очках, которые набирают те или иные системы.

Для интереса можете посмотреть на сайте где находится ваша любимая СУБД в рейтинге. Итогом последнего года стал вылет Microsoft Access из десятки, он вместе с языком программирования COBOL напоминает, что жизненный цикл технологий может быть очень длинным. Полагаю, что в следующем году IBM DB2 будет опускаться сильнее всего в топе. Топ 10 СУБД это 75% всех набранных баллов. За год топ 10 в очках почти не поменялся.

Open Source вырос качественно за последние годы и всё больше ИТ специалистов, принимающих решение задаются вопросом, а стоят ли лицензии Oracle, MS SQL, IBM DB2 и прочих коммерческих продуктов, чтобы в них вкладываться. Не в малой степени этому способствуют аппетиты одноимённых компаний. В последние годы стало модно в коммерческих продуктах продавать enterprise licenses (лицензии уровня предприятий без искусственных ограничений функционала) за ядра процессоров. Можете по ссылке посчитать, что выходит для сервера с 4 процессорами по 16 ядер - всего 64 ядра если вам не подходят лицензии за пользователей.

MS SQL - 439 936$

Oracle - 1 368 000$

Мало того, запутанная система лицензирования, в которой не всегда разбираются даже в компаниях, продающих эти лицензии приводит к ситуации, когда к вам придут и скажут, что вы не докупили лицензий за нечто на сумму большую чем вы уже приобрели и заложили в бюджет. И это не редкая ситуация.

Прошлый 2019 год и текущий 2020 проходили с растущим влиянием компании AMD и её центральных процессоров, включая серверные EPYC, которые кардинально меняют стоимость физических ядер, а это значит, что ядер будут покупать всё больше. Многоядерность AMD развилась с внедрением чиплетов и теперь 64 ядра в одном процессоре - это реальность. Готовы ли будут компании покупать платные лицензии платных СУБД на ядра в разы больше? Не уверен. Физический сервер будет получаться по стоимости на порядок ниже лицензий. Серверный рынок довольно инертный и на AMD не перейдут и за несколько лет, но Oracle, Microsoft и прочие начнут терять долю ещё быстрее если не изменят политику. Microsoft выпускал версию SQL Server для Linux, но опять же за деньги и не нашлось большого числа желающих её купить. IBM DB2 теряет долю рынка уже давно.

Переход многих компаний на микросервисы (наверняка слышали на российских конференциях и форумах мы пилим монолит на микросервисы) зачастую приводит к отделению данных физически на разные сервера, для коммерческих СУБД это платные лицензии, для Open Source нет. Чтобы не выйти из бюджета выбирают бесплатные решения.

Уместно будет сказать, что бизнес коммерческих СУБД выгоден и ими владеют богатейшие люди планеты. В топе самых богатых людей оказываются владельцы компаний, владеющих коммерческими СУБД: Билл Гейтс (Microsoft), Ларри Эллисон (Oracle), которые занимают значительную долю в топе СУБД. Ещё из топ 10 списка Forbes богатейших людей, у которых есть огромные или облачные БД присутствуют Джефф Безос (Amazon RDS), Ларри Пейдж и Сергей Брин (Google с их Bigtable).

В последнее время крупные ИТ компании с большими деньгами развивают open source проекты. Можно было бы подумать, что они прониклись идеями сообщества открытого кода, хотят сделать полезное для общества, их наполнило человеколюбие и прочее меценатство. Но нет, нужно понимать, что крупные акулы в бизнесе рассчитывают на некотором этапе монетизировать эти вложения, повысить положительное мнение о своих компаниях, занять рынки, воспользоваться бесплатным трудом сообщества, взять выстрелившие идеи. Шутка ли тысячи светлых голов коммитят в репозитории качественный код, тестируют на реальных проектах и денег не просят.

Тот же MySQL несмотря на название open source был уже продан за 1 млрд.$, Sun Microsystem, а потом поглощён Oracle. Основатель MySQL Майкл Видениус переоткрыл проект назвав его MariaDB. Я был на его выступлении в Москве где он призывал переходить на их продолжение оригинальной СУБД и надо сказать, что немалая часть разработчиков так и поступило. MariaDB уже на 12 месте.

Коммерческие СУБД дороги, но есть и масса плюсов, они стабильны, удобны, легко интегрируемы в ИТ инфраструктуру, есть система подготовки специалистов, сторонние компании расширяют функционал. Плюсом open source помимо бесплатности и растущей части возможностей платных СУБД можно считать и то, что вы можете взять код БД и поменять под свои нужды, как делал Facebook c MySQL. Для одной СУБД open source может быть несколько движков или несколько веток развития и вы можете выбирать любой вариант, который вам подходит. Влетевшая в топ 10 SQLite - мультиплатформенный продукт. Это персональная БД не использующая парадигму Сервер-Клиент, когда вам нужно с минимальными затратами просто локально хранить данные для приложения и пользоваться всеми плюсами СУБД.

Что в России: Нужно понимать, что когда в 70-80 годах году появились первые коммерческие продукты, например Oracle, у нас ещё был Брежнев, Олимпиада в Москве, перестройка, отставание в электронной промышленности и т.д. Мы пока догоняем или развиваем существующие системы.

Первые версии СУБД в мире были коммерческие, распространялись точечно, требовали присутствия специалистов. Покупать программное обеспечение (ПО) за валюту в нашей стране исторически не всегда принято (опустим обсуждение политических и экономических мотивов), поэтому альтернатива в виде бесплатных СУБД и пиратских версий коммерческих продуктов присутствуют. В институтах сейчас часто учат на бесплатных движках БД, открытое ПО это стильно, модно, молодёжно. Поэтому рынок очень быстро наполняется специалистами в области open source. В России есть разработки СУБД в виде ClickHouse, Tarantool, ветки PostgreSQL и т.д., коммерческих экспортируемых БД нет. Есть реестр российских программ где можно поинтересоваться текущим положением дел по отечественным СУБД. Состав правда вызывает сомнение, например, наряду с названиями, которые вы могли слышать встречаются и с названием типа Паспортный стол общежитий ВУЗа.

Переход на open source в России ускорился и в связи с санкциями. Помнится, выходившая новость об Oracle о возможном запрете продавать технологии для нефтегазовой отрасли России поменяло вектор видения будущего в умах и бюджетах некоторых наших компаний с хорошими бюджетами на ИТ. Как выше сказал фраза мы пилим монолит на микросервисы зачастую приводит в Open Source. В России, да как и во всём мире, растут PostgreSQL, MySQL, SQLite, MongoDB проекты.

Многим могло показаться, что open source давно обогнал commercial, но это мнение может сложиться если вы относитесь к миру online проектов, сайтов, приложений для смартфонов и т.д. Из этого следует следующее сравнение online vs. offline.

БД online проектов против offline

Есть 2 класса проектов, которые в чём-то похожи, а в чём-то нет. Это проекты с основным направлением онлайн продаж или оффлайн бизнес.

Если вы берёте классический бизнес оффлайн, связанный с добычей природных ресурсов, банковским делом, дистрибьюцией (оптовые продажи) или ритейлом (розничные продажи), то развивался он чаще всего из стека технологий на базе Windows решений. И переходя в онлайн он может использовать стек технологий WISA (Windows, IIS, MS SQL, ASP.Net). Есть и онлайн проекты изначально на WISA, для примера, всем известный StackOverflow. На текущий момент, в чисто онлайн проектах доминирует стек технологий типа LAMP (Linux Apache MySQL PHP). Новые молодые команды, приходящие в существующий бизнес, часто не работали с Windows стэком технологий и предлагают переписывать существующие системы. В России эта тенденция очень хорошо ощущается в последние годы.

Деньги любят счёт, и чтобы сравнить долю онлайн или оффлайн проектов давайте посмотрим рейтинг по выручке в мире. В топе ритейл, добыча ресурсов, автомобилестроение и т.д. В крупнейших компаниях (не только России) обычно зоопарк из технологий, тут будут ERP, CRM системы в виде SAP, Microsoft Dynamics NAV или AX, 1C в России и много чего ещё. Компании с большим оборотом используют разные системы управления предприятием, которые в свою очередь часто используют коммерческие БД, Oracle, MS SQL, IBM DB2.

Но капитализация компаний в мире за последние 10 лет изменилась и мы видим, что в топе теперь ИТ гиганты и всего 2 компании из прошлого топа Microsoft и Alphabet (Google). В динамике изменения тут. Это значит смещение денежного потока в онлайн. Мы все уже привыкли и платить онлайн и переводить деньги, покупать товары с доставкой и т.д. А текущий 2020 год принёс немало прибыли именно онлайн компаниям.

Рейтинг компаний России по выручке. На первых местах добыча ресурсов, банки, ритейл, а не ИТ корпорации. Яндекс на 113 месте. Правда по капитализации Яндекс входит в топ 20. Тенденции по внедрению большего числа решений с open source есть, причины описаны выше. Исторически многие крупнейшие онлайн-ритейлеры (магазины) в России на платных БД, но задумываются над переходом тестируя части функционала на open source. Банки начали миграцию в онлайн, пример Тинькофф банка подтверждает, что нужно развивать онлайн банкинг.

По итогам года из-за текущей ситуации с вирусом явно число и размер online проектов выросло. Растут и облачные решения, об этом ниже.

Реляционные СУБД против остальных

Обилие статей в том числе на Хабре про разные виды БД вводят в заблуждение, что весь мир уже перестаёт использовать классические реляционные СУБД. На самом деле RDBMS это подавляющее большинство всех СУБД в мире. На другие виды приходится около части и нужно понимать, что это чаще всего специфический функционал.

Для примера скажу, что в данный момент изо дня в день в работе типичной крупной компании может широко использоваться одновременно разные СУБД как платные MS SQL(Oracle) и ещё набор из MongoDB, Redis, MySQL, ClickHouse, ElasticSearch и т.д.

Рассмотрим очень кратко основные типы:

Relational: Главный тип, который ассоциируется с БД. Данные хранятся в виде 2-мерных таблиц с определёнными столбцами и строками, в которых хранятся значения. Индексы используются для ускорения поиска по указанному в создании индекса полю или полям. Связь между 2 таблицами идёт по одинаковым полям в них ключам (Key). Для добавления, изменения, удаления данных используется язык SQL (Structured Query Language), о нём ниже. Описание структуры данных хранится в самой же БД в данных системных реляционных таблиц. Эта простая идея с 2-мерными таблицами выдержала проверку временем и продолжает быть самой распространённой.

Document stores:

Отличие от реляционных БД в том, что данные хранятся в виде документов с любой структурой. То есть колонки таблицы жёстко не определены. Но тем не менее можно создавать индексы, которые вставляют ссылку на строку если находится указанный аттрибут документа. Типичный представитель MongoDB хранение документов используя синтаксис JSON (Java Script Object Notation). На самом деле BSON (Binary JSON), который компактнее, как и любые бинарные типы чем строковые.

Вот так выглядят строки в коллекции (это аналог таблиц)

Точно также таблицы могут ссылаться друг на друга.

Key-Value : появился этот тип NoSQL решения из-за необходимости быстро записывать, менять и получать значения по какому-то параметру. Не редко это используют для некритичных, быстроменяющихся значений, которые нет смысла записывать и хранить. Типичный представитель Redis. На старом ноутбуке вы можете получить десятки тысяч операций в секунду по записи, изменению данных. Достигается это тем что данные хранятся в памяти, с которой операции быстрее. Отсюда же и минус, что если памяти недостаточно, то скорость будет деградировать. Например, вы хотите измерять число запросов с 1 IP за минуту. Заводится строка где ключ это IP, любое обращение добавляет счётчику +1. Если запросов много, то троттлинг (ограничение). Ключ может иметь TTL и обнуляться раз в X минут.

Search Engines: Поиск это важная функция в любой системе. Если c поиском по точному совпадению в виде ID (кода, артикула, партномера и т.д.) реляционные БД справляются очень качественно и быстро, то поиск внутри документа по фразе, включая использование разных форм слова, множественного числа и прочих составляющих живого языка уже не выходит так быстро. Нужно сканировать данные от начала до конца и выискивать походящие документы. Поэтому поступают так как делают крупные поисковики индексируя страницы, если представить по простому, то они проходят по документам предварительно, составляют список слов, которые встречаются в документе и когда нужен поиск, то ищут по преподготовленным спискам слов с ссылками на документы, чем больше слов совпало тем вероятнее, что этот документ и нужен. Типичный представитель ElasticSearch его большое число инсталляций обусловлено ещё и тем, что существует типичный стек ELK (англ. лось) ElasticSearch+Logstash+Kibana для мониторинга событий, например, логов веб серверов или сервисов.

Wide column stores: Лучше всего представлять как среднее между реляционной БД и Key-Value БД. Есть таблицы, строки и колонки. Но колонки не имеют жёсткой структуры и могут иметь в разных строках разные названия и значения.

Представители этого типа БД Cassandra, HBase.

Graph : Тип БД, который призван обрабатывать данные, которые представлены в виде графов. В виде графов можно представить населённые пункты (вершины) и дороги между ними (ребро). Типичная задача поиск нахождения кратчайшего маршрута между пунктами путём обхода графа в ширину или более продвинутыми алгоритмами.

Также удобно представлять графами связи между людьми (вершины), что он знает кого-то (ребро) или их возраст и интересы. Формула химического соединения можно представить, что вершины графаатомы молекулы, а рёбра это связи между молекулам. Теория графов обширна и развивается с 18 века, так что математическая база накоплена большая. Типичный представитель графовой СУБД - Neo4j.

Columnstore

Хотя в рейтинге db-engines этот вид не идёт отдельно, а относится к реляционным, но стоит его упомянуть. Коммерческие реляционные СУБД включают в себя и этот вид как отдельную особенность, но и существуют специализированные отдельные решения. Основное отличие колоночных БД, что данные хранятся не в строках, а в столбцах. Если у вас в столбце одни и те же значения, то они очень сильно компрессируются и меньше места занимают на диске и в памяти. Представители этого типа ClickHouse, Vertica. Эту картинку с анимацией лучше смотреть на сайте ClickHouse.

В последнее время стала появляться в диаграммах СУБД ClickHouse от Яндекса. Цифры разные, но то что её стали замечать и включать уже хорошо для её развития.

Multi-model databases

Во многих СУБД, помимо основного исторического типа хранения добавлялись новые с течением времени. Мир не стоит на месте, поэтому если создатели СУБД видели необходимость поддержать другие типы хранения данных, то они добавлялись. Поэтому у большинства современных СУБД из топа в описании может присутствовать multi-model. Перевод крупных реляционных СУБД в разряд multi-model ограничила рост многих NoSQL решений в последние годы. Зачем использовать что-то ещё, если нужный тип включен в основную СУБД как вторичный.

SQL vs NoSQL

Сам термин NoSQL возник чуть более 10 лет назад примерно в 2009 году и как говорят сейчас пошёл хайп. Многие новые программные продукты, которые были призваны решить некую проблему присущую связке Реляционная БД + SQL гордо начали именоваться NoSQL, чтобы показать, что они новые и продвигают невиданные доселе технологии способные решить много проблем. А проблемы действительно были. Нужна была возможность легко горизонтально масштабировать решения в связи с ростом данных, которые могли прибывать в больших количествах, объёмы данных стали резко увеличиваться. Причём стали сохраняться данные, которые не были структурированы, например, с сайта информация на что кликал, куда переходил пользователь, что искал, какие элементы всплывали, баннер показывался и т.д. Всё это сваливается и хранится. Сейчас вы и не удивляетесь, что вам упорно показывают рекламу по теме, которая вас однажды заинтересовала, вас уверенно ведут к воронке принятия решения, о покупке, подписке и т.д.

График роста данных, он немного не свежий, но показывающий рост данных более 10 лет назад.

По своему опыту скажу, в 0-вых годах оффлайн компании генерили больше долларов выручки на 1 Gb данных в БД, чем сейчас онлайн компания. И соотношение примерно раз в 100-200 меньше долларов на Гб у онлайн.

Второй вытекающей из роста данных проблемой SQL были тяжелые транзакционные операции по записи в БД и не могли достигать показателя 10 или 100 тысяч в секунду на простом оборудовании. Я не буду сейчас распространяться, что есть плюс, а что минус транзакций, но оказалось, что можно ускорить транзакции, упростить их или часто они не нужны. Не нужны если данных так много, что потеряв некоторые вы восстановите всю картину запросто на оставшихся данных. Не все данные важны настолько, что их частичная потеря критична для бизнеса.

И появились простые, но эффективные NoSQL системы, которые решают проблемы, не связанные накопленными ограничениями SQL, работают быстро и чаще всего ещё и бесплатные. Но чудес не бывает, поэтому часто NoSQL решения имеют ограниченный функционал или работают быстро пока не кончится какой-нибудь ресурс, например, оперативная память или число коннектов.

Часто можно встретить такого рода картинки классификаций NoSQL БД по типам и с примерами СУБД. Выше мы их рассмотрели.

A что же SQL Structured Query Language структурированный язык запросов? Он существует с начала 1970-х годов, был стандартизирован и благодаря этим стандартам, которые поддерживают все создатели реляционных БД минимизирует разницу в работе с разными реляционными СУБД. Да, производители вставляют свои собственные фичи (features - особенности), которые могут выходить за пределы стандартов SQL, так как предлагают некую новые конкурентные технологии, если они будут поддержаны массово, то эти новые технологии и их описание будут включены со временем в стандарт SQL. Если вы пишете SQL запросы в одной СУБД, то вам не составит большого труда перейти на другую и продолжить работать с ней. Мало того, часто в клиентах NoSQL СУБД, есть фишка в виде запросов на SQL. Например, для MongoDB я часто использую Studio3T, где вы можете писать обычный SQL и он переводится в специализированные запросы MongoDB, для самого MongoDB есть SQL адаптер. ClickHouse и Tarantool (российские разработки) поддерживают SQL запросы. Также во многих NoSQL СУБД появились особенности присущие SQL, например, join-ы, схемы данных, логика NULL для значений и т.д.

Cloud DBs vs DBs

Облачные технологии постепенно растут. Рост этот составляет десятки и сотни процентов в год на разные облачные технологии. Среди них есть и облачные БД. Если в любой области экономики есть рост с такими цифрами значит всё больше усилий будут прилагать компании, чтобы занять этот рынок и получить свой кусок пирога, а дальше заинтересовать побольше клиентов и включить их в этот пирог растущий дальше. Да, мы с вами это часть их пирога. На Хабре много статей про облака, плюсы и минусы, чтобы не повторяться можно почитать например, тут или в другой статье по соответствующим тэгам.

По оценкам Gartner объём всего облачного рынка за 5 лет вырастет в 2 раза.

Вот такие распределения по компаниям если брать BPaaS и IaaS. По моим ощущениям очень похоже на правду. AWS лидер, Microsoft понемногу догоняет в последние годы, Alibaba растёт и дешевле всего на рынке Китая, который уже нельзя игнорировать глобальным компаниям.

Рынок БД в облаке (DBaaS) выглядит в цифрах гораздо скромнее по сравнению с цифрами всех облачных трат, при том, что каждая компания имеет свои БД и не малые.

Объясняется это такими факторами:

  1. Зачастую компании не используют специфичные облачные БД провайдера, потому что нужно адаптировать приложения, есть особенности, которые не позволяют это делать. Чаще сейчас используется облачная инфраструктура, то есть вы получаете свои виртуальные хосты с CPU, RAM, SSD(HDD) и используете её, чтобы там установить экземпляры стандартных СУБД.

  2. Компании не спешат переводить именно данные в облако, переводя туда другие сервисы. Встаёт вопрос безопасности данных. Одно дело, когда ваши данные в конкретном точном месте вашей сети, физических хостингов, пускай и распределённых по миру, а другое когда вы затолкали данные в чёрный ящик поставщика облачных услуг и вам непонятно как, где оно хранится, как охраняется и т.д.

  3. Кто столкнулся с облаками, тот знает, что траты могут возникнуть откуда вы не ждёте и соответственно не просчитали стоимость. Приведу пример, положить данные на хранение в холодное облачное хранилище стоит не дорого, а вот скачать обратно уже в десятки или сотни раз дороже. Поэтому если вы делаете бэкапы и храните их не трогая, то это дешевле своих дисков, но вот когда захотите обратно скачать, то сначала вы подождёте много часов до извлечения, а потом заплатите значительную сумму за каждый Mb. И такая ситуация и для AWS и для Azure и остальных. Вот недавняя история про NASA, когда им аудиторы сказали, что будут платить гораздо больше. Случаи перерасходов бюджетов от роста функционала сплошь и рядом.

  4. Скорости перемещения информации из облака иногда удручают. Например, вы сделали бэкап на одном хостинге в облако, а потом решили поднять на другом хостинге. Это же облако. Но если вы и подключили платную опцию, что у вас распределённое хранение данных во многих регионах, то вас может неприятно удивить скорость восстановления в соседнем штате США. Если бэкап на сотни Gb, то в разы будет быстрее сделать бэкап на локальный диск, скопировать по выделенному каналу бэкап и поднять его на другом хостинге.

  5. Могут возникать небольшие изменения производительности, которые трудно чем-то объяснить как работой соседних виртуальных хостов, которые разделяют с вами физический хост провайдера. Если вы работали с виртуальными хостами в локальной сети, то наверняка сталкивались как могут влиять друг на друга загруженные виртуальные сервера на одной физике. В своей сети вы можете на это повлиять или сделать замеры вынося виртуальные сервера с физического сервера.

  6. Если вас подсадили на облака, то вы зависите от этого провайдера облачных услуг, а это ещё одна точка отказа в вашей информационной инфраструктуре. Например, Alibaba выключает ресурсы не глядя, как только пробьёт 12 часов и что-то у вас превратится в тыкву по причине того, что на вашем счете в облаке нет заранее добавленных юаней.

  7. В России к этому добавляется ситуация, что не так давно проводилась масштабная блокировка зарубежных ресурсов, блокировали многое включая IP адреса облачных БД. Это реальность и она может быть во многих странах.

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

В России есть Яндекс.Облако, SberCloud, честно не пользовался ими в плане БД. Был опыт использования других сервисов Яндекса, которые потом перевели в облако, поменяли протоколы и сделали платными. Пока не заинтересовали платить деньги, так как есть другие поставщики как Microsoft, Google, которые имеют бесплатные квоты для небольших объёмов и есть ещё ряд преимуществ.

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

Если вам нужно развернуть быстро в любой точке мира функционал, то альтернативы облакам нет, но будьте готовы потом оплачивать счета соразмерные потраченным ресурсам, про которые вы и не подозревали. Нужно просчитывать заранее траты или пробовать в реалиях. И безопасность в облаках ещё не убедительна.

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

OLTP vs OLAP

Данные в БД могут использоваться для проведения текущих операций бизнеса Online Transaction Processing (OLTP): найти клиента, выписать счёт, оплатить ресурс, списать остаток со склада при заказе товара и т.д. Почти все эти операции должны проводиться в режиме реального времени. Если пользователь на сайте или во внутрикорпоративной системе ожидает по несколько секунд простые операции и это проблема с БД, то значит есть что оптимизировать. OLTP изначально проектируются для ведения бизнеса в реальном времени. Если компания имеет базы данных, то там есть OLTP.

Есть данные, которые используются для анализа работы компании Online Analytical Processing (OLAP). То есть для OLAP собираются большие массивы данных и чтобы их быстро просчитывать в любом разрезе нужна простая магия по предрасчитыванию всего, что с наибольшей вероятность может понадобится бизнесу. То есть если вы хотите знать количества кликов на вашем глобальном сайте по странам или страницам, то их нужно заранее просчитать да ещё делая эту группировку по времени, чтобы потом смотреть динамику во времени, сравнивать с историческими трендами. И OLAP хранилища могут быть не реляционными да и вообще не структурированными, использовать специализированные языки управления большими массивами данных, или языки для статистической обработки данных. В последнее время стало модно называть обычных специалистов по аналитике в бизнесе Data Scientist. Это не совсем верно, но термин уже прижился. Обычно это смесь из следующих ингредиентов SQL, Python, R, фреймворков для работы с нейронными сетями, математическими моделями разного вида и т.д.

Количество OLAP БД обычно меньше в количественном отношении чем OLTP, но размеры их больше. Для OLAP БД важна поддержка многопоточности, когда запрос распараллеливается между ядрами и каждое ядро делает свою часть работы. Если ваша OLAP СУБД умеет шардироваться на много серверов, хорошо работает с многопоточностью, поддерживает все последние SIMD (single instruction, multiple data) инструкции процессоров, когда за 1 операцию обрабатываются большие пакеты данных, то скорость обработки данных увеличивается кратно на все эти множители.

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

SSD vs HDD vs Storage vs Tape vs Other

Эта часть о том на каких хранителях хранить данные для БД.

В 2020 году не остаётся сомнений в том, что SSD побеждают в борьбе с HDD. В серверных системах с БД это понимание пришло гораздо раньше, чем где либо. Всё дело в том, что в большинстве типов БД, важно не последовательное чтение, а чтение в память из разных мест с диска. И такая же случайная запись для данных. С этим нет проблем у SSD, тогда как скорость доступа до случайного места на диске у HDD достигается скоростью вращения шпинделя и скоростью перемещения считывающего механизма между дорожками. Попробуйте одновременно копировать несколько десятков файлов на HDD из разных мест, скорость быстро деградирует до неприемлемых значений. Так и запросы данных от 1000 пользователей, которые лежат в разных местах диска быстро сведут на нет скорость любого HDD. Поэтому для операционных OLTP систем нет большого смысла использовать HDD. На картинке ниже обычные SSD c 6000 IOPS (операций считывания и записи на диск в секунду), в серверных решениях особенно с NVME есть гораздо больше, но стоит отделять маркетинговые цифры на коротких замерах, попадающих в кэш от реальной работы диска в таком режиме круглыми сутками.

HDD есть смысл использовать в OLAP системах, когда данные лежат последовательно и их нужно читать и записывать только так или есть смысл использовать для бэкапов данных, это крупная последовательная запись и чтение. Также в больших архивных БД и везде где стоимость хранения 1 Гб это решающая единица. HDD дешевле SSD по стоимости за 1 Гб.

По отказоустойчивости SSD лучше HDD если их рассматривать как отдельные устройства. Это личный опыт на тысячах экземплярах. Выходы из строя SSD гораздо реже HDD, но нужно понимать, что это статистика по серверным моделям, многие из которых производились по нормам SLC и MLC, стоящие дороже, позволяющие перезаписывать данные гораздо больше раз чем продвигаемые сейчас TLC и QLC, которые не рекомендуются для БД. Для серверных систем где хранятся БД используют диски и комплектующие с повышенной отказоустойчивостью. SSD диск в 1Tb и стоимостью 1000$ - это нормальная ситуация для БД. В них заложены возможности работать месяцами на пределе, не только много читая, но и много записывая, не перегреваясь или резко сбрасывая скорость. Не нашлось картинки по сравнению отказоустойчивости серверных SSD и HDD, но есть про обычные. SSD выходят из строя реже.

Форм-фактор SSD это 2.5 дюйма устройства для горячей замены, PCI-X карты, U.2 серверный аналог M.2, который в настольных компьютерах. Современный протокол SSD NVME.

Storage Система Хранения Данных (СХД) - это внешние хранилища данных, которые подключаются к серверам по оптоволокну или сетевому интерфейсу. Хранилища ставятся в те же серверные стойки, что и сервера и соединяются с ними. СХД это ещё один огромный пласт информации, которого хватит на 10 статей. Специализированное оборудование для хранения данных. Их основное предназначение это высокая отказоустойчивость, повышенная скорость обработки данных. Стоимости хранилищ данных начинаются от десятков тысяч долларов за продвинутые версии и это с минимальным набором дисков. Верхняя планка не ограничена, она может достигать и миллионов долларов и больше. Современные СХД могут иметь в названии слова типа AllFlash что подразумевает отказ в них от HDD и внутренние алгоритмы и код оптимизированы только под SSD.

После поглощения EMC компания DELL упрочила своё положение на рынке хранилищ уровня предприятий. Huawei растёт на глазах и становится заметным игроком несмотря на санкции США. В России нет своих хранилищ данных мирового уровня, все значимые игроки рынка просто перемаркируют готовые изделия своей торговой маркой или собирают из частей известных производителей или вендоров свой вариант.

Intel Optane (3D Xpoint) специфичный вид энергонезависимой памяти, самый быстрый на данный момент на случайное чтение, но на случайную запись нет такого явного преимущества, а в последовательном чтении и записи проигрывает топовым SSD. Не развился из-за высокой цены на накопители и отсутствия накопителей большого объёма. Так SSD+NVME обеспечивают лучшие показатели цена/качество. За цену Optane можно купить несколько SSD, которые в RAID будут давать большую скорость.

RAID Нет смысла повторяться для чего нужны объединения дисков в массивы, для скорости и для отказоустойчивости. Прочитать можно здесь. Смотря какую задачу вы решаете, тот RAID и используется. Для OLTP БД чаще всего встречается RAID10.

Tape ленточное хранение данных. Многие будут удивлены, но в 2020 году ленты ещё живы. Выходят новые версии картриджей с лентами, выпускаются огромные библиотеки хранения на сотни картриджей. Всё объясняется тем, что стоимость хранения на лентах продолжает быть самой низкой. Хранение плёнки не требует электричества, длительность хранения выше чем на дисках, но скорость доступа очень низкая и это последовательное чтение и запись. Есть подозрение, что в облаках самые холодные хранилища архивных данных могут использовать и ленты.

Возможности СУБД

Любые особенности СУБД это конкурентные преимущества, которые играют роль при выборе для развёртывания её в своей инфраструктуре. Я не буду рассматривать всем понятные темы как безошибочность работы СУБД, поддержка разных наборов символов, сортировок для любой страны и т.д., как должно быть лучше очевидно. Также про стоимость было сказано выше. Разговор будет про важные и востребованные технологии и части СУБД. На самом деле их больше.

Горизонтальное масштабирование из коробки: Horizontal scaling vs Vertical Scaling.

Это то, что в немалой степени определило появление множества видов БД и СУБД в последние 10-15 лет. Если в начале 2000-x Oracle, Microsoft, IBM вели обратную агитацию и призывали объединять разрозненные данные из множества филиалов компаний в единый центр где стоит мощный сервер с данными и все работают удалённо с этими данными, включая появившиеся корпоративные сайты, Web API, мобильных клиентов, то уже в конце 2000-x при взрывном росте данных стало понятно, что вертикально масштабировать (покупать всё больший сервер) стоит уже слишком дорого или уже невозможно. Упирались в число CPU, дисков, сеть, соединений и т.д. для центральных узлов инфраструктуры. Поэтому появились решения, позволяющие распределять данные на множество серверов БД.

Большую роль в этом сыграли социальные сети и поисковые сайты, которые очень быстро набирали число пользователей, контент их рос в геометрической прогрессии, особенно после добавления файлов мультимедиа или видео. Также важно географическое распределение серверов, когда данные по клиентам хранят на серверах, которые ближе к нему географически и значит время отклика быстрее. Изначально распределение данных на множество небольших серверов делалось на уровне приложений, потом такие возможности стали включать в доделанные под себя движки СУБД, а дальше это стало трендом.

Не стоит думать, что горизонтальное масштабирование решит все ваши проблемы. Наоборот оно привнесёт усложнение всего и вся: кода, инфраструктуры, поиска ошибок и много чего ещё. А это тоже всё деньги. Но вам уже не понадобятся очень мощные и дорогие сервера, ваш проект сможет пережить большие нагрузки. Отдельные узлы хранящие данные часто называют шардами, а процесс распределения данных и запросов между узлами шардированием. Если правильно выбирать ключ шардирования, то запросы за данными идут только к той шарде где они есть. Брать на себя распределение запросов может как само приложение так и движок СУБД. Ниже на картинке пример, когда используется hash функция для шардирования, чтобы определить какой сервер использовать. И ещё у каждой шарды могут быть копии (реплики).

В данный момент, не так просто купить новые 8 процессорные сервера для пиковой производительности, их число очень ограничено они не нужны рынку, вытеснены 4 процессорными, которые дешевле и не в 2 раза, а больше. И если брать реальный пример, то 2 процессорный современный сервер по мощности вычислений сопоставим или превосходит 8 процессорный сервер 10 летней давности. Помимо процессоров ускорились все компоненты серверов: память, шина и т.д. Тот же самый запрос будет работать в 2-3 раза быстрее, если все данные в памяти. СУБД очень хорошо умеют использовать ядра и параллелить выполнение запросов.

У облачных провайдеров при росте числа ядер в виртуальном сервере в 2 раза цена растёт быстрее чем в 2 раза и имеет место ограничение на число ядер, потому, что провайдеру не выгодны виртуалки, которым нужно выдавать большую часть физического сервера, что с ним делать когда вы не нагружаете его, мощности простаивают.

Итог: для реально больших проектов вам понадобится горизонтальное масштабирование, если вы не доросли до такого, то лучше не усложняйте сервисы и БД разнесением на множество узлов, если только в СУБД это не поддерживается совершенно прозрачно для приложений. Проще проводить действия в оперативной памяти одного сервера чем тащить разрозненные куски данных с разных узлов и объединять их, чтобы получать результат.

Отказоустойчивость из коробки - High Availability. Master-master, master-slave.

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

Для БД дублируются сервера, которые запускают СУБД как программное обеспечение, дублируются данные, в самом простом случае это RAID массивы из дублирующих дисков. В специализированных СХД дублируются диски, блоки питания, процессоры, память, есть батарейка, которая даст возможность сохранить данные из кэша на диск.

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

Выглядит примерно так. Есть одна БД с данными, они расходятся на остальные сервера, возможно в удалённом дата-центре. Slave-копии могут использоваться для чтения, запросы за данными могут направляться на копии. Называется Master-Slave.

Но рано или поздно начнёт возникать ситуация, что ваша БД не успевает записывать. Хочется, чтобы данные могли записываться в другой копии, она была бы не только для чтения. Эта схема посложнее, так как нужно ещё разрешать конфликты если изменения одинаковых данных происходит на разных узлах в одно время, а если у вас master копии далеко, то вероятность конфликтов увеличивается. Это называется Master-Master. Плюс у master могут быть slave копии.

Дублирования данных на другие сервера могут быть как по всей БД, так и по отдельным таблицам.

Хорошо, когда ваша СУБД поддерживает такое распространение данных, на вас не ложится груз проблем как зафиксировав изменение данных в одном месте добиваться, чтобы данные появились в другом. А если сеть моргнула, а если копия не отвечает, и ещё много если на себя берёт движок. Если master становится недоступным, то происходит автоматическое перераспределение ролей, вчерашний slave становится master, а все остальные копии принимают от него данные. Приложение не замечает переключение, потому что работает через роутер, который также переключается. У вас сломался сервер с БД, а простоя нет, всё продолжает работать как ни в чём не бывало. Также можно проводить работы с экземпляром БД выключая его из работы, установить обновление СУБД и потом обратно ввести в работу.

Продвинутые хранилища СХД умеют копировать данные на другое хранилище в фоновом режиме на уровне дисков. У вас просто копия диска в другом месте. В ряде случаев можно использовать такие копии, но обычно они не доступны даже для чтения до момента прекращения синхронизации.

Online maintenance - online alter

24/7/365 означает, что ваш проект работает всегда 24 часа, 7 дней в неделю и все 365 дней. У вас нет окна для работ по обслуживанию БД (maintenance). Значит все операции по созданию архивных копий, перестройки индексов, созданию таблиц, удалению колонок и много чего ещё, что должно проходить онлайн без заметной деградации производительности. То есть пока вы перестраиваете таблицу, например, удаляя колонку данных в реляционной БД, то таблица будет доступна, а будет создаваться копия, которая будет содержать все изменения пока идёт процесс перестройки. Не всегда есть возможность иметь много копий серверов с БД, для платных СУБД это ещё и деньги, чтобы проводить работы по очереди, поэтому возможность изменений структур без прерывания работы очень важно.

Мониторинг

Каждая интенсивно используемая и изменяемая БД рано или поздно сталкивается с вопросами производительности. Но как понять, что проблемы начались заранее не доводя до потери денег компаниями? Нужно мониторить состояние вашей СУБД. Если вы можете делать замеры текущего состояния, а ещё лучше смотреть статистику, которая собирает сама же СУБД, то вы из коробки можете решить множество проблем. В платных СУБД есть невероятно огромное количество метрик и статистик, есть сторонние компании, создающие инструменты мониторинга. Рынок очень конкурентный и в каждом инструменте есть свои особенности. Бесплатные СУБД в последние годы сильно улучшились в плане мониторинга и к ним тоже стали создавать мониторинги, только часто они уже не бесплатные.

Инструменты управления СУБД

Какая бы прекрасная СУБД у вас не была, но управление ей должно быть удобное. Конечно, всё можно делать из текстовых командных строк, поставляемых с СУБД, но многие вещи удобнее и интуитивнее делать из интерфейса, мало того вам не нужно помнить полный синтаксис команды наизусть и вы не ошибётесь. У удобного инструмента есть плагины от сторонних компаний, например, расширенные подсказчики для набора текста, они очень помогают и ускоряют написание кода, также вы можете щёлкать на всплывающих подсказках и смотреть исходный код для таблиц, процедур. Ещё очень важная функция это выполнение запросов на множестве БД одновременно, у вас настроены коннекты сотен серверов и БД и вы можете распространить на них изменение очень быстро работая в одном окне. Ещё из интересного есть средства для помощи просмотра планов исполнения запросов на стороне сервера с подсказками какие индексы нужно построить, которые кардинально ускорят запрос.

Или для некоторых СУБД есть прекрасная возможность, востребованная у работающих с крупными данными, когда виден % исполнения запроса. Вы видите когда закончится запрос и выдаст результат.

Ещё из интересного: скриптование данных это создание инструкций SQL, которые создадут копию данных на другом сервере, миграция данных, сравнение структур данных, сравнение данных, экспорт в другие форматы, системы контроля версий и обновления product-среды и т.д.

Есть инструменты, которые используются для управления разными типами БД, например, DataGrip от JetBrains (те самые которые причастны к Kotlin, ReSharper, GoLand и т.д.) очень мощный и настраиваемый. Картинка СУБД, с которыми он работает.

Расширение функционала СУБД на другом языке программирования

Какой бы мощной не была СУБД, но рано или поздно может не хватить встроенных функций. Например, какой-то новый вид хэширования или сжатия данных, который нужно поддержать на уровне БД. Если в языках программирования вы скачиваете нужную библиотеку, исходники и можете вставить вызов этого кода и не нужно придумывать велосипед, тратить ресурсы компании, то такой же подход можно реализовать и в СУБД. Вы можете расширить функционал СУБД из коробки своими подключаемыми модулями и они будут работать так же как просто как встроенные команды. Мало того, часто такие расширения могут работать быстрее чем встроенный код самой СУБД. Конечно, есть ряд ограничений, который накладывается на такого рода расширения, но сам факт наличия возможности писать код на распространённых языках программирования немаловажный плюс.

Логирование изменений

Важным вопросом бывает вопрос, а что было с данными или структурами БД на некий момент назад. Логирование изменений пригодится, когда вы поменяете структуры или данные, а понадобится вернуть обратно сами данные, либо структуры таблиц, индексы, либо код SQL в запросах. Вы будете знать, что на такой-то момент было так. Также это предохраняет от уничтожения данных, чаще всего непреднамеренного. В каждой СУБД название технологий разное, для примера Flashback Data Archive, Temporal history, Change Tracking, Data Audit и т.д.

Если ваша СУБД умеет, просто включать или выключать такое логирование, то это то что обязательно пригодится. Но чудес не бывает, поэтому если вы начинаете логировать, то привносите нагрузку, например, загружаются диски, растёт размер логов, они могут быть в БД или отдельно, если БД имеет копию, то сохранение в БД расходится по копиям.

Бизнес-логика в БД или нет

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

Бизнес-логика - это ряд правил, которые влияют на всю информационную структуру компании. Есть несколько подходов по хранению бизнес-логики. Например, на уровне приложений (сервисов, микро-сервисов) или если бизнес-логика в БД, то помимо хранения данных ещё и решает интеллектуально как возвращать данные, как накладывать фильтры, объединять данные из разных источников и т.д. Это даёт ряд преимуществ по гибкости и скорости изменений, но растёт нагрузка и в итоге упирается в производительность. Или, например, вы решили запретить редактировать данные прошлых годов, это правило легко реализуется на БД вместо того, чтобы отслеживать все возможные способы сделать это из сервисов, программ, сайтов и т.д. Чем больше способов управлять бизнес-логикой на БД тем лучше, вы будете иметь разные способы решить бизнес-задачу.

Если БД нагружена, то выносится бизнес-логика на уровень сервисов, кэшируются всеми способами результаты и т.д. БД используется только для быстрого получения данных.

Не все БД позволяют хранить код запросов в БД, например, в ClickHouse нет даже полноценного языка скриптов. Как организовывать хранение бизнес-логики компания решает самостоятельно, здесь нет универсальных правил.

Поддержка JSON

Самый скачиваемый NuGet-ом пакет в Micrsoft Visual Studio для языка C# - это библиотека для работы с JSON (JavaScript Object Notation). Этот пример показывает, что если нечто востребовано, то оно будет пробиваться везде где сможет даже у Microsoft, который исторически развивал XML. Хотя хранение в JSON противоречит правилам реляционных БД, но реальность такова, что слишком много данных в JSON в ИТ инфраструктуре и поддержку этого формата вставляют в СУБД разного типа.

In Memory

Оперативная память RAM быстрее любых жёстких дисков. Поэтому для максимального ускорения операций, в том числе с БД нужно по максимуму использовать память. Скажу сразу, что во всех СУБД память стараются использовать по полной и БД любого типа работает быстрее если много памяти на сервере. Часто запись на диск данных откладывается и не происходит непосредственно во время проведения операции записи. Есть много технологий и в разных СУБД они разные или могут называться по-разному, чтобы снизить число обращений к дискам.

Какие-то СУБД поддерживают возможность In-Memory как вариант работы, а некоторые объявляют эту возможность как главную, например, Tarantool.

Сжатие данных

Немаловажный параметр, который позволит экономить на размерах дисков и памяти серверов. Кроме этого сжатие ускоряет в разы операции чтения данных, сохранения копий данных и т.д. Например для OLAP хранилищ это значит более быстрое получение результатов запросов по огромной массе данных. Нужно понимать, что сжатие не бесплатно для ресурсов, но плюсов больше чем минусов, алгоритмы сжатия используются быстрые, которые не сильно нагружают CPU. Обычно сжатие задаётся на уровне СУБД и в работе программного обеспечения никак не сказывается, то есть ничего не нужно менять в коде.

Временные (temporary) объекты

Непростая логика получения данных может проходить несколько этапов, когда формируются отдельные наборы, которые участвуют дальше в последующей выборке. Не всегда нужно временные наборы сохранять в полноценные данные, они могут сохраняться в памяти пока существует коннект от клиента и не нужно думать об их высвобождении после отключения. Это могут быть переменные, таблицы, временные таблицы, которые видны другим коннектам. Временные объекты СУБД стараются держать в памяти так как их предназначение говорит, что ими быстро воспользуются и уничтожат, нет смысла фиксировать их изменения на диск.

MapReduce

Под этим устоявшимся термином от Google будем обозначать класс задач по распределённым вычислениям. Название идёт от двух шагов Map распределяющего входные данные между распределёнными узлами и Reduce получение результатов от распределённых узлов и формирование итогового результата. Представители Apache Hadoop и Spark это целый набор библиотек, файловой распределённой системы HDFS и много чего ещё. Примером СУБД для работы с такими фреймворками является Hive, реляционная СУБД с поддержкой SQL. Тренды.

Стоит сказать, что в операционных БД эти технологии не используются. Используются в специализированных хранилищах данных, когда есть смысл раскидывать данные и проводить распределённые вычисления. Для большинства компаний без петабайт данных хватает обычных СУБД с их распределением вычислений между хостами, параллелизмом и т.д. По графикам и снижению рейтинга Hive можно сказать, что интерес к этим технологиям как минимум не растёт последние годы.

Работа с пространственными данными

Если необходимо находить объекты в реальном мире и чаще всего это задача нахождения ближайших объектов по отношению к некой точке в пространстве. Но как искать такие данные в реляционных данных? В принципе ничего не мешает делать свои собственные способы как искать в любом виде БД ближайшие точки, как подготавливать данные, чтобы поиск был быстрым. Разработчики СУБД тоже увидев спрос на такие поиски добавили технологии для пространственных индексов (spatial index) в виде сеток или часто можно встретить реализацию индексов с помощью R-tree дерева.

Graph data

Возможность работы с иерархическими или графовыми данными. Выше было описание и примеры для чего часто используется представления в виде графов.

Безопасность

Обычно БД находятся внутри защищённого контура сети. И напрямую никто не открывает порты наружу. Если вы всё же каким-то образом открыли доступ до сервера, то не сомневайтесь, что сначала будут прощупывать порты, нет ли там БД известного типа и потом пытаться сломать. Информация имеет ценность, поэтому открыть доступ к серверам БД наружу это как выставить сейф с деньгами в окно - странный вариант.

В самих БД есть ряд технологий, которые позволяют снизить риск доступа к данным. Это шифрование бэкапов, когда даже украв диск с копиями БД без пароля с ним ничего нельзя сделать. Файлы работающей БД вы скорее всего не сможете просто прочитать, СУБД получает к ним эксклюзивный доступ. В каждой СУБД есть разграничение прав пользователей, группы в которые включаются пользователи, права на разные операции на сервере СУБД включая чтение данных, запись, изменение структур, настроек и т.д. Огромное число видов доступа под любые задачи из реальной жизни. Доступы можно раздавать, отнимать, явно запрещать доступ к неким ресурсам. Вопросы безопасности - это огромный и очень интересный пласт информации не для этой статьи. Не забывайте ставить обновления, так как уязвимости находятся и закрываются производителями СУБД. Проводите сторонний аудит безопасности ИТ инфраструктуры проверенными компаниями. Вы будете неприятно удивлены когда до ваших данных доберутся аудиторы безопасности (пентестеры), правда чаще это будет не из-за проблем безопасности самой СУБД или вашей БД.

Использование GPU, NPU (Neural Processing Unit), Google TPU (Tensor Processing Unit)

На современном этапе развития БД каких-то массовых использований графических и специализированных процессоров в движках СУБД не наблюдается. Да, GPU и NPU используются для математических расчётов, обучения нейронных сетей, но размер оперативной памяти GPU и NPU меньше чем у обычных серверов, а задача выборки или обновления данных (наиболее частые в БД) не требуют огромной вычислительной мощности. Данные из БД можно подавать на вход специализированных фреймворков работающих с нейронными сетями для дальнейших итераций. DPU (Data Processing Unit) это класс процессоров не имеющего стандартов, обычно интегрированных в сетевые карты. Их будущее ещё под вопросом.

Community

Большое сообщество единомышленников, использующих то же ПО обеспечит вам ответы на вопросы, которые могут быть не так тривиальны. Первое, что стоит смотреть при непонятной ошибке это аналогичные вопросы с тем же текстом ошибки или описанием ситуации. Для разных СУБД есть множество сайтов с авторитетными авторами. Тем не менее приведу статистику с StackOverflow.com сколько вопросов есть по топовым БД, на каждый может быть несколько ответов. Наверняка Ваш вопрос будет уже с решением если сообщество большое. Такая вот накопленная KnowledgeBase.

Tag

Count

MySQL

598,350

SQL Server

285,092

Mongodb

129,907

Oracle

122,385

Postgresql

117,427

sqlite

82,596

ms-access

46,177

elasticsearch

44,482

redis

18,290

db2

10,485

clickhouse

530

tarantool

103

Для общей картины, изображение связей БД, фреймворков, языков программирования, платформ взятых . Не смотрим % использования - это всегда причина для холиваров (holy war - священная война). Здесь больше интересны связи, что с чем чаще входит в связь. Красным отмечены СУБД. Куда делись Oracle и IBM DB2 это загадка на совести составителей диаграммы.

Подведём итоги: Все СУБД из топа завоевали это место в процессе естественного отбора и имеют свой кусок рынка. OpenSource побеждает Commercial СУБД, в России процесс ускорился в этом направлении. СУБД Online проектов растут в количестве отнимая долю в выручке у оффлайн бизнеса. Реляционные БД в ближайшее время не сдадут позиции и будут преобладать. Для управления БД будет доминировать язык SQL. Для хранения данных операционных БД используется флеш-память. Чем больше возможностей и особенностей у СУБД и большее число людей использует, то тем проще её интегрировать в инфраструктуру и поддерживать. Переход в облака БД идёт фрагментарно, в ближайшие годы большая часть данных будет храниться локально. Российские технологии по БД в мировом масштабе не особо заметны, но есть такие и пожелаем им успеха.

Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru