В данной статье рассмотрен процесс установки MySQL и MariaDB на пустой вновь созданный VDS, а так же как настройка репликации master-slave и master-master между двумя серверами MySQL/MariaDB.
Все действия в консоли сервера в рамках данной статьи производятся от имени суперпользователя root.
На свежеустановленном VDS в консоли запускаем команды:
apt-get update
apt-get install -y mysql-server mysql-client
В процессе установки вам будет предложено задать пароль для аккаунта root@localhost
в MySQL.
С основными отличиями MariaDB от MySQL можно ознакомиться на официальном сайте. Рассмотрим краткую выдержку:
Если вам больше нравится MariaDB, а не MySQL, инструкции по установке MariaDB выглядят следующим образом.
Сначала пропишем настройки репозитория MariaDB (для Debian Wheezy):
apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 0xcbcb082a1bb943db
echo 'deb http://ftp.osuosl.org/pub/mariadb/repo/5.5/debian wheezy main' > /etc/apt/sources.list.d/mariadb.list
echo 'Package: *' > /etc/apt/preferences.d/mariadb
echo 'Pin: origin ftp.osuosl.org' >> /etc/apt/preferences.d/mariadb
echo 'Pin-Priority: 1000' >> /etc/apt/preferences.d/mariadb
Если вы ставите MariaDB на Ubuntu 12.04, то вторая строчка будет выглядеть так:
echo 'deb http://ftp.osuosl.org/pub/mariadb/repo/5.5/ubuntu precise main' > /etc/apt/sources.list.d/mariadb.list
А для Ubuntu 14.04 так:
echo 'deb http://ftp.osuosl.org/pub/mariadb/repo/5.5/ubuntu trusty main' > /etc/apt/sources.list.d/mariadb.list
Производим установку MariaDB:
apt-get update
apt-get install mariadb-server
Так же, как и в случае MySQL, на этом этапе вам будет предложено установить пароль для root@localhost
.
По-умолчанию конфигурационный файл MySQL /etc/mysql/my.cnf
содержит инструкции, предписывающие, что сервер будет
доступен для подключения к нему только внутри вашего VDS на loopback-интерфейсе или через unix-сокет. Если вы планируете
подключаться к MySQL с других серверов, а это вам точно потребуется для настройки репликации, необходимо внести
изменения в my.cnf
.
nano /etc/mysql/my.cnf
В этом файле нужно найти строчку
bind-address = 127.0.0.1
И поставить символ комментария (#
) в начало этой строки, после чего сохранить изменения. Для применения изменений
перезапускаем mysql:
/etc/init.d/mysql restart
Устанавливаем пароль для доступа mysql-пользователем root к базе данных при подключении с других серверов:
echo "GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'Passw0rd' WITH GRANT OPTION;" | mysql -u root -p
Здесь ключ -p
в конце требуется указывать только если при установке MySQL вы задавали пароль для root@localhost
.
Для репликации master-slave вам потребуется два сервера с MySQL или MariaDB. Желательно, чтобы на обоих серверах стояла одна и та же версия СУБД: успешность и стабильность репликации между MySQL и MariaDB мы не проверяли. Мы подразумеваем, что для обоих серверв с MySQL/MariaDB проделаны все описанные выше шаги, включая разрешение доступа с других серверов.
Итак, настроим репликацию. Для этого отредактируем на обоих серверах файл конфигурации:
nano /etc/mysql/my.cnf
Убедимся, что строка, начинающаяся с bind-address
, закомментирована, то есть выглядит так:
bind-address = 127.0.0.1
Убираем значок комментария (#
) в строке с server-id
. Каждый сервер в кластере должен иметь уникальное значение
server-id
, например на master сервере указываем:
server-id = 1
На slave сервере соответственно:
server-id = 2
Также понадобится добавить или изменить параметры auto_increment_offset и auto_increment_increment.
На мастере:
auto_increment_offset = 1
auto_increment_increment = 2
На slave:
auto_increment_offset = 2
auto_increment_increment = 2
На master сервере раскомментируем строку log_bin
:
log_bin = /var/log/mysql/mysql-bin.log
На обоих серверах раскомментируем строку binlog_do_db
и впишем туда список баз данных, участвующих в репликации.
Например, пусть у нас требуется настроить репликацию для БД с именем testdb
. Тогда в binlog_do_db
пишем:
binlog_do_db = testdb
На slave сервере так же потребуется после binlog_do_db
добавить строки:
relay-log = /var/log/mysql/mysql-relay-bin
relay-log-index = /var/log/mysql/mysql-relay-bin.index
Теперь сохраняем измененный конфигурационный файл my.cnf
на обоих серверах и перезапускаем MySQL, чтобы изменения
вступили в силу. Для этого в консоли обоих серверов выполняем:
/etc/init.d/mysql restart
Добавляем на master сервере пользователя для репликации (вместо 193.107.0.2 следует подставить ip-адрес slave сервера):
mysql-master:~# echo "GRANT replication slave ON *.* TO 'replication'@'193.107.0.2' IDENTIFIED BY 'ReplicaPass';" | mysql -u root -p
Если на master сервере в базе testdb
уже есть какие-то данные, то копируем их на slave. Для этого на master заходим в консоль MySQL:
mysql-master:~# mysql -u root -p
Блокируем БД от записи в командной строке mysql:
> FLUSH TABLES WITH READ LOCK;
> SET GLOBAL read_only = ON;
По завершении команд остаёмся в командной строке mysql и переводим клиента mysql в фоновый (background) режим, для чего
на клавиатуре нажимаем сочетание клавиш ctrl+z
. После этого мы оказываемся в командной строке bash:
[1]+ Stopped mysql
mysql-master:~#
Производим дамп базы данных testdb и возвращаем консоль mysql из фонового режима назад:
mysql-master:~# mysqldump testdb > testdb_dump.sql
mysql-master:~# fg
Мы снова оказались в консоли mysql. Смотрим статус мастера:
show master status;
Нам показывается таблица вида:
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 107 | testdb | |
+------------------+----------+--------------+------------------+
Из этой таблицы нам потребуются значения столбцов File и Position, в данном случае соответственно mysql-bin.000001
и
107
. Запоминаем или записываем их и разрешаем запись в базу:
> SET GLOBAL read_only = OFF;
Завершаем сеанс работы с mysql на мастере (ctrl+d
или командой exit
в консоли mysql) и импортируем сделанный ранее
дамп testdb_dump.sql
в MySQL на slave сервере. Для этого в консоли slave сервера выполняем:
mysql-slave:~# mysqladmin create testdb
А в консоли master сервера:
mysql-master:~# mysql -uroot -p -h 193.107.0.2 testdb < testdb_dump.sql
Вместо 193.107.0.2
подставьте ip адрес slave сервера.
Теперь на slave сервере запускаем репликацию (в командной строке подставляем вместо 193.107.0.1
ip-адрес мастера, а в
полях MASTER_LOG_FILE
и MASTER_LOG_POS
значения, запомненые ранее):
mysql-slave:~# echo "CHANGE MASTER TO MASTER_HOST = '193.107.0.1', MASTER_USER = 'replication', \
MASTER_PASSWORD = 'ReplicaPass', MASTER_LOG_FILE = 'mysql-bin.000001', \
MASTER_LOG_POS = 107;" | mysql -u root -p
mysql-slave:~# echo "START SLAVE;" | mysql -u root -p
Репликация запущена. Посмотреть статус репликации можно командой:
mysql-slave:~# echo "SHOW SLAVE STATUS\G" | mysql -uroot -p
Репликация мастер-мастер заключается в симметричной настройке репликации мастер-слейв. То есть, в данном случае потребуется добавить репликацию со слейва на мастер точно таким же способом.
Тарифы на облачные VDS и VPS