MySQL/MariaDB
MySQL/MariaDB-сервер (далее - MySQL) используется как постоянное хранилище для большинства данных биллинговой системы. Доступ к нему со стороны приложений биллинга осуществляется посредством сетевого соединения, поэтому MySQL может быть установлен на отдельной машине с любой поддерживаемой ОС. Для небольших баз, либо тестовых целей возможна установка MySQL на одну машину с сервером биллинга и другими серверными приложениями - весь процесс установки описан под этот случай и все конфигурации по умолчанию также ориентированы на этот случай.
Для работы биллинга необходим MySQL/MariaDB-сервер версии 5.5 и новее. Служба MySQL-сервера должна быть запущена до момента старта всех серверных приложений биллинга.
Подключение к MySQL для каждого приложения настраивается в .properties- или .xml- файле, например data/data.properties для сервера биллинга, планировщика и загрузчика логов, и inet-access.xml для приложения InetAccess.
db.driver=com.mysql.jdbc.Driverdb.url=jdbc:mysql://127.0.0.1/bgbilling?useUnicode=true&characterEncoding=UTF-8&allowUrlInLocalInfile=true&zeroDateTimeBehavior=convertToNull&jdbcCompliantTruncation=falsedb.user=billdb.pswd=bgbillingЕсли база данных MySQL и приложения биллинга установлены на одной машине, то ничего менять не надо. В противном случае вместо 127.0.0.1 указывается IP-адрес машины с БД. Параметры db.user и db.pswd определяют имя пользователя и пароль, под которыми приложение будет подключаться к базе данных. Возможна настройка отдельного пользователя MySQL для каждого серверного приложения биллинга, это позволит сразу видеть источник запроса на MySQL-сервере.
Обратите внимание на параметры URL characterEncoding и connectionCollation - значения должны соответствовать реальной картине с кодировками (см. ниже).
Пользователь bill с паролем bgbilling создаётся при начальном создании БД при установке сервера биллинга (скрипт dump.sql).
Установка
Linux
Для установки MySQL/MariaDB требуются привилегии root или sudo.
Обратите внимание, что для заливки дампа базы помимо сервера MySQL вам понадобится клиентское приложение mysql.
Возможно несколько вариантов установки сервера БД, рассмотрим их.
MariaDB
Для установки MariaDB на Linux, Вы можете воспользоваться предусмотренным системой способом установки. Например, для Linux с пакетным менеджером yum:
yum updateyum install mariadb-server mariadb-clientДля Linux с пакетным менеджером apt:
apt-get updateapt-get install mariadb-server mariadb-clientMariaDB из репозитария MariaDB
Для установки MariaDB версии отличной от поставляемой с текущей ОС воспользуйтесь репозитарием MariaDB: https://downloads.mariadb.org/mariadb/repositories/
Пример для Debian 9 и MariaDB 10.2
apt-get install software-properties-common dirmngrapt-key adv --recv-keys --keyserver keyserver.ubuntu.com 0xF1656F24C74CD1D8add-apt-repository 'deb [arch=amd64,i386,ppc64el] http://ams2.mirrors.digitalocean.com/mariadb/repo/10.2/debian stretch main'apt-get updateapt-get install mariadb-server mariadb-clientПример для CentOS 7 и MariaDB 10.2
{ \ echo '[mariadb]'; \ echo 'name = MariaDB'; \ echo 'baseurl = http://yum.mariadb.org/10.2/centos7-amd64'; \ echo 'gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB'; \ echo 'gpgcheck=1'; \} > /etc/yum.repos.d/MariaDB.repoyum install MariaDB-server MariaDB-clientMySQL
Для установки MySQL воспользуйтесь репозитарием MySQL для вашей операционной системы: https://dev.mysql.com/downloads/
Пример для Debian или Ubuntu
Выполните:
curl -fsSL https://dev.mysql.com/get/mysql-apt-config_0.8.9-1_all.deb -o mysql-apt-config.debdpkg -i mysql-apt-config.debвыберите версию MySQL, нажмите OK, затем:
apt-get updateapt-get install mysql-server mysql-clientПри установке Вам предложат указать пароль для пользователя root MySQL.
Подробнее: https://dev.mysql.com/doc/mysql-apt-repo-quick-guide/en/
Пример для CentOS 7, Red Hat Enterprise Linux 7
wget http://repo.mysql.com/mysql57-community-release-el7.rpmrpm -ivh mysql57-community-release-el7.rpmyum updateyum install mysql-server mysql-clientПодробнее: https://dev.mysql.com/doc/mysql-yum-repo-quick-guide/en/
Windows
Для установки MySQL-сервера на Windows-машине загрузите последнюю версию с сайта http://dev.mysql.com/downloads/mysql/. Рекомендуем установить MySQL Server в корень диска, например в папку C:\MySQL.
Служба сервера обычно устанавливается и стартует автоматически. Обратите внимание, что для заливки дампа базы помимо сервера MySQL вам понадобится клиентское приложение mysql.
Настройка
В зависимости от дистрибутива, конфигурация MySQL/MariaDB может находиться в файле /etc/my.cnf и/или в директориях /etc/my.cnf.d/ или в /etc/mysql/.
Рекомендуемые параметры конфигурации с описанием параметров:
# For advice on how to change settings please see# http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html [client]# Кодировка по-умолчанию при подключении консольным клиентом и mysqldumpdefault-character-set = utf8mb4[mysqld]# Кодировка сервераcharacter-set-client-handshake = FALSEcharacter-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci# Интерфейс, на котором будет открыт порт#bind-address = 127.0.0.1# Каталог для хранения БД, высокие требования по надёжности и скорости#datadir = /var/lib/mysql# каталог для хранения временных файлов, желательно чтобы это был tmpfs#tmpdir = /tmp#log-error = /var/lib/mysql/mysqld.log# PID файл процесса#pid-file = /var/run/mysqld/mysqld.pid# Логирование запросов, выполняющихся длительное время#log-slow-queries = /var/log/slowquery.log#long_query_time = 1# Ограничение на максимальное число соединений с БДmax_connections = 1000# Тип хранилища таблиц по-умолчаниюdefault-storage-engine = InnoDB # Режим разбора SQL-запросовsql_mode =# Отключаем DNS резолвинг для устанавливаемых соединенийskip-name-resolve# Максимальный размер пакета с запросом, принимаемого серверомmax_allowed_packet = 64M# Для каждой таблицы InnoDB - отдельный файлinnodb_file_per_table=1# Путь к каталогу под журнал транзакций, можно вынести на отдельный диск#innodb_log_group_home_dir = # Размер главного буфера InnoDB, он должен составлять порядка 70-80% от RAM сервера для выделенного сервера БД.# Если же на сервере присутствуют другие приложения - то с учетом того, чтобы хватило памяти всем.innodb_buffer_pool_size = 512M# Размер каждого файла журнала в группе журналов (указывается в мегабайтах),# рекомендуемое значение - 25% от innodb_buffer_pool_size, но в пределах 64M-512Minnodb_log_file_size = 128M# кол-во файлов в группе журналовinnodb_log_files_in_group = 2innodb_log_buffer_size = 16M# Вызов sync диска не на каждой транзакции, а раз в секунду - ускорение работы, меньше зависимость от скорости дискаinnodb_flush_log_at_trx_commit = 2innodb_flush_method = O_DIRECT# Число одновременно работающих потоков InnoDB, рекомендуемые границы: 16 - 256innodb_thread_concurrency = 128 # Время ожидания прекращения блокировки (записи) прежде чем будет произведен откат транзакцииinnodb_lock_wait_timeout = 120# Максимальное кол-во одновременно открытых таблицtable_open_cache = 1024# Максимальный размер временной таблицы, которая будет расположена в RAMmax_heap_table_size = 64Mtmp_table_size = 64M# Буферы на каждый потокread_buffer_size = 2Mread_rnd_buffer_size = 8Msort_buffer_size = 8Mjoin_buffer_size = 8Mkey_buffer_size = 32M# Размер кэша запросовquery_cache_size = 64M# максимальный раз, при котором результат запроса будет помещен в кэшquery_cache_limit = 4Mbulk_insert_buffer_size = 64Mmyisam_sort_buffer_size = 64M[mysqldump]# Маскимально возможный размера пакета при снятии дампов утилитой mysqldumpmax_allowed_packet = 64M[mysqld_safe]# Лимит количества открытых файлов (в дополнение к лимиту ОС)open-files-limit = 4096Из предложенных параметров настройке обычно подлежат следующие параметры:
innodb_buffer_pool_size - размер буфера InnoDB , в которой MySQL будет хранить данные для чтения таблиц и их индексов. Чем больше значение, тем меньше операций с диском. Однако сервер при этом не должен уходить в swap;
innodb_log_file_size - размер файлов логов транзакций InnoDB, он не должен быть слишком маленьким по сравнению с innodb_buffer_pool_size, но следует также учитывать, что при старте MySQL будет перечитывать данные логи. Диапазона 64M-512M для биллинга обычно достаточно (подробнее).
В параметре sql_mode запрещается установка режимов STRICT_TRANS_TABLES и STRICT_ALL_TABLES , это приведёт к неработоспособности некоторых компонентов биллинговой системы (legacy).
В параметре wait_timeout запрещается установка значения, меньше чем 28800 - биллинг работает с пулом соединений к БД, которые могут быть неактивны, он сам следит за их закрытием, поэтому нет необходимости, чтобы MySQL закрывал соединения по таймауту. Если уже у Вас к БД подключаются другие приложения, которым необходимо маленькое значение параметра wait_timeout, то добавьте в URL подключения к БД (db.url) всех приложений параметр &interactiveClient=true (в этому случае для соединений биллинга будет работать параметр interactive_timeout вместо wait_timeout).
В случае использования Nginx как proxy для MySQL для балансировки нагрузки следует установить значение конфигурации Nginx proxy_timeout не меньше чем максимум от (wait_timeout, interactive_timeout).
См. также wiki.
Кодировки
Рекомендуемая для использования кодировка для новых инсталляций - utf8mb4.
Проверить текущие кодировки БД можно запросами (из sql-клиента):
SHOW VARIABLES LIKE 'character_set%';SHOW VARIABLES LIKE 'colla%';utf8mb4
"Правильный" UTF-8, длиной от 1 до 4 байт. Конфигурация MySQL/MariaDB:
[client]default-character-set = utf8mb4[mysqld]character-set-client-handshake = FALSEcharacter-set-server = utf8mb4 collation-server = utf8mb4_unicode_ciВ параметрах подключения приложений биллинга к БД (db.url) указываем useUnicode=true и characterEncoding=UTF-8, параметр connectionCollation не указываем:
useUnicode=true&characterEncoding=UTF-8&utf8
"Ограниченный" UTF-8, длиной от 1 до 3 байт.
[client]default-character-set=utf8[mysqld]character-set-server=utf8collation-server=utf8_unicode_ciinit_connect="SET collation_connection = utf8_unicode_ci;"В параметрах подключения приложений биллинга к БД (db.url):
useUnicode=true&characterEncoding=UTF-8&connectionCollation=utf8_unicode_ci&Если collation установлен именно "utf8_unicode_ci" — также обратите внимание на параметр "connectionCollation=utf8_unicode_ci" в db.url в data.properties (см. выше). Здесь и в других местах его приходится дополнительно прописывать, т.к. для MySQL collation по-умолчанию для utf8 является utf8_general_ci.
Дополнительная конфигурация службы Linux
Для стабильной работы MySQL/MariaDB в Linux рекомендуется увеличить лимиты открытых пользователем файлов (файловых дескрипторов). Для этого в файле /etc/security/limits.conf необходимо указать:
mysql soft nofile 10000mysql hard nofile 10000В некоторых дистрибутивах (например, RHEL/CentOS 7) systemd не использует PAM и лимиты из файла limits.conf игнорируются. Поэтому в дополнение к редактированию limits.conf рекомендуется создать файл дополнительной конфигурации для сервиса systemd. Например, если файл сервиса (каталог /lib/systemd/system) называется mysqld.service, то создаем каталог /etc/systemd/system/mysqld.service.d и в нем файл с именем override.conf и содержимым:
[Service]LimitNOFILE=10000При использовании ntp мы также рекомендуем настроить сервис MySQL/MariaDB так, чтобы он стартовал после выполнения синхронизации времени. Поэтому общее содержимое override.conf может быть таким:
[Unit]After=time-sync.target[Service]LimitNOFILE=10000Действия при смене datadir
Убедитесь, что у пользователя mysql есть права на новую директорию, если это не так, то дайте ему их (например, новая директория - это /new/data/dir):
chown -R mysql:mysql /new/data/dirЕсли в системе включен SELinux, то ему также нужно будет указать, что MySQL может работать с новой директорией:
semanage fcontext -a -t mysqld_db_t "/new/data/dir(/.*)?"restorecon -Rv /new/data/dir