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.Driver
db.url=jdbc:mysql://127.0.0.1/bgbilling?useUnicode=true&characterEncoding=UTF-8&allowUrlInLocalInfile=true&zeroDateTimeBehavior=convertToNull&jdbcCompliantTruncation=false
db.user=bill
db.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 update
yum install mariadb-server mariadb-client

Для Linux с пакетным менеджером apt:

apt-get update
apt-get install mariadb-server mariadb-client

MariaDB из репозитария MariaDB

Для установки MariaDB версии отличной от поставляемой с текущей ОС воспользуйтесь репозитарием MariaDB: https://downloads.mariadb.org/mariadb/repositories/

Пример для Debian 9 и MariaDB 10.2

apt-get install software-properties-common dirmngr
apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 0xF1656F24C74CD1D8
add-apt-repository 'deb [arch=amd64,i386,ppc64el] http://ams2.mirrors.digitalocean.com/mariadb/repo/10.2/debian stretch main'
 
apt-get update
apt-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.repo
 
yum install MariaDB-server MariaDB-client

MySQL

Для установки 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.deb
dpkg -i mysql-apt-config.deb

выберите версию MySQL, нажмите OK, затем:

apt-get update
apt-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.rpm
rpm -ivh mysql57-community-release-el7.rpm
yum update
yum 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]
# Кодировка по-умолчанию при подключении консольным клиентом и mysqldump
default-character-set = utf8mb4
 
[mysqld]
# Кодировка сервера
character-set-client-handshake = FALSE
character-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-512M
innodb_log_file_size = 128M
# кол-во файлов в группе журналов
innodb_log_files_in_group = 2
innodb_log_buffer_size = 16M
 
# Вызов sync диска не на каждой транзакции, а раз в секунду - ускорение работы, меньше зависимость от скорости диска
innodb_flush_log_at_trx_commit = 2
innodb_flush_method = O_DIRECT
 
# Число одновременно работающих потоков InnoDB, рекомендуемые границы: 16 - 256
innodb_thread_concurrency = 128
 
# Время ожидания прекращения блокировки (записи) прежде чем будет произведен откат транзакции
innodb_lock_wait_timeout = 120
 
# Максимальное кол-во одновременно открытых таблиц
table_open_cache = 1024
 
# Максимальный размер временной таблицы, которая будет расположена в RAM
max_heap_table_size = 64M
tmp_table_size = 64M
 
# Буферы на каждый поток
read_buffer_size = 2M
read_rnd_buffer_size = 8M
sort_buffer_size = 8M
join_buffer_size = 8M
key_buffer_size = 32M
 
# Размер кэша запросов
query_cache_size = 64M
# максимальный раз, при котором результат запроса будет помещен в кэш
query_cache_limit = 4M
 
bulk_insert_buffer_size = 64M
myisam_sort_buffer_size = 64M
 
[mysqldump]
# Маскимально возможный размера пакета при снятии дампов утилитой mysqldump
max_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 = FALSE
character-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=utf8
collation-server=utf8_unicode_ci
init_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 10000
mysql 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