Установка MariaDB Galera для управления кластером репликации
Как установить и настроить мастер MariaDB Galera для управления кластером на сервере Ubuntu Linux 16.04 LTS, чтобы получить масштабируемость как для чтения, так и для записи?
MariaDB Galera Cluster является открытым исходным кодом и бесплатным синхронным мульти-мастер-кластером для базы данных MariaDB. Он доступен только в Linux и поддерживает только системы хранения XtraDB / InnoDB. Существует экспериментальная поддержка MyISAM, но она недостаточно проверена. Начиная с MariaDB 10.1, wsrep API для Galera Cluster включен по умолчанию.
Преимущества кластера Galera
- True Multi-master. Чтение и запись на любой узел в любое время.
- Синхронная репликация. Отсутствует ведомое устройство, данные не теряются при сбое узла.
- Tightly Coupled. Все узлы имеют одинаковое состояние. Нет разнесенных данных между разрешенными узлами.
- Многопоточный Slave. Для лучшей производительности. Для любой рабочей нагрузки.
- Нет операций переключения мастер-слэйва или использования VIP.
- Горячий режим ожидания. Отсутствие простоев при переходе на другой ресурс (так как нет перехода на другой ресурс).
- Автоматическое создание узлов. Не нужно вручную создавать резервную копию базы данных и копировать ее на новый узел.
- Поддерживает InnoDB.
- Прозрачный для приложений. Требуется минимальные изменения в приложении или вообще не трубует изменений.
- Нет необходимости разделения чтения и записи.
- Результатом этого является решение высокой доступности, которое является одновременно надежным с точки зрения целостности данных и высокой производительности с отказоустойчивостью.
Galera Cluster для MariaDB — это простое в использовании решение с высокой доступностью, которое обеспечивает высокую производительность системы, отсутствие потери данных и масштабируемость для будущего роста. Вы можете настроить его следующим образом
- Между двумя центрами обработки данных (кластер для центров обработки данных). Для целей безопасности вы должны настроить VPN и MariaDB через SSL .
- В вашей локальной сети / VLAN (единый кластер центра обработки данных) — VPN не требуется, но вы должны настроить MariaDB через SSL .
Что нужно для установки кластера высокой доступности MariaDB Galera?
- Минимум два сервера (могут быть облачные или физические). Для промышленного используйте четыре сервера (рекомендуется минимум три сервера).
- Частная сеть (LAN / VLAN) между серверами
- VPN между двумя центрами обработки данных, если устанавливается между двумя IDC
- Ubuntu Linux 16.04 LTS на обоих серверах
Давайте приступим к установке и настройке MariaDB Galera на Ubuntu.
Шаг 1 — Настройка /etc/hosts
Отредактируйте файлы setup /etc/hosts на обоих серверах :
1 |
sudo vi /etc/hosts |
Установите правильный частный IP-адрес согласно рис. 01 или согласно настройке:
1 2 |
192.168.2.45 mdb01 192.168.2.46 mdb02 |
Закройте и сохраните файл. Проверьте:
1 2 |
ping -c2 mdb01 ping -c2 mdb02 |
Шаг 2. Включение репозиториев MariaDB для версии 10.1.
Введите следующие команды, чтобы разрешить репозиториям mariadb установить версию 10.1 на обоих серверах :
1 2 3 4 |
$ sudo apt-get install software-properties-common $ sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8 $ sudo add-apt-repository 'deb [arch=amd64,i386,ppc64el] http://mirror.lstn.net/mariadb/repo/10.1/ubuntu xenial main' $ sudo apt-get update |
Пример результата:
Шаг 3. Установите сервер MariaDB v10.1 на Ubuntu Linux.
Введите следующую команду apt-get command / apt на обоих серверах :
1 |
$ sudo apt-get install mariadb-server rsync |
Пример результата:
Вы должны установить пароль пользователя MariaDB root:
Шаг 4. Создание SSL-сертификатов для кластера MariaDB Galera
Введите следующие команды для создания сертификата CA, сервера и клиента, чтобы мы могли иметь защищенные зашифрованные соединения между узлами с использованием протокола SSL. Это включает как соединения между клиентами базы данных и серверами через стандартную поддержку SSL в MySQL, так и шифрование трафика репликации, в частности к самому Galera Cluster. Реализация SSL распространяется по всему кластеру и не поддерживает аутентификацию для трафика репликации. Вы должны включить SSL для всех узлов в кластере или ни для одного из них:
1 2 3 4 5 6 7 8 9 |
$ sudo openssl genrsa 2048 > ca-key.pem $ sudo openssl req -new -x509 -nodes -days 730 -key ca-key.pem -out ca-cert.pem $ sudo openssl req -newkey rsa:2048 -days 730 -nodes -keyout server-key.pem -out server-req.pem $ sudo openssl rsa -in server-key.pem -out server-key.pem $ sudo openssl x509 -req -in server-req.pem -days 730 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem $ sudo openssl req -newkey rsa:2048 -days 730 -nodes -keyout client-key.pem -out client-req.pem $ sudo openssl rsa -in client-key.pem -out client-key.pem $ sudo openssl x509 -req -in client-req.pem -days 365000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out client-cert.pem $ sudo openssl verify -CAfile ca-cert.pem server-cert.pem client-cert.pem |
Чтобы избежать проблем, я устанавливаю их общее имя следующим образом:
- Общее имя CA: MariaDB admin
- Общее имя сервера: MariaDB server
- Клиентское общее имя: MariaDB client
Настройка клиента и сервера mysql для ssl
Отредактируйте файл /etc/mysql/my.cnf:
1 |
$ sudo vi /etc/mysql/my.cnf |
Найдите и обновите раздел [клиент] следующим образом:
1 2 3 4 5 6 |
[client] port = 3306 socket = /var/run/mysqld/mysqld.sock ssl-ca=/etc/mysql/ssl/ca-cert.pem ssl-cert=/etc/mysql/ssl/client-cert.pem ssl-key=/etc/mysql/ssl/client-key.pem |
Найдите и обновите раздел [mysqld] следующим образом:
1 2 3 4 |
[mysqld] ssl-ca=/etc/mysql/ssl/ca-cert.pem ssl-cert=/etc/mysql/ssl/server-cert.pem ssl-key=/etc/mysql/ssl/server-key.pem |
Сохраните и закройте файл.
Установка сертификатов на других узлах
Копирование сертификатов во все остальные узлы:
1 2 3 4 |
ssh root@192.168.2.46 mkdir -p /etc/mysql/ssl/ scp * root@192.168.2.46:/etc/mysql/ssl/ ssh root@192.168.2.47 mkdir -p /etc/mysql/ssl/ scp * root@192.168.2.47:/etc/mysql/ssl/ |
Шаг 5. Настройте сервер кластера MariaDB Galera.
Создайте на обоих серверах следующий файл:
1 |
$ sudo vi /etc/mysql/conf.d/galera.cnf |
Добавьте следующий текст на сервере mdb01 :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
[mysqld] #mysql settings binlog_format=ROW default-storage-engine=innodb innodb_autoinc_lock_mode=2 query_cache_size=0 query_cache_type=0 innodb_flush_log_at_trx_commit=0 innodb_buffer_pool_size=256M <strong>bind-address=192.168.2.45</strong> #Galera settings wsrep_provider="/usr/lib/galera/libgalera_smm.so" #SSL for Galera wsrep_provider_options="socket.ssl_key=/etc/mysql/ssl/server-key.pem;socket.ssl_cert=/etc/mysql/ssl/server-cert.pem;socket.ssl_ca=/etc/mysql/ssl/ca-cert.pem" wsrep_cluster_name="cbz_cluster" <strong>wsrep_cluster_address="gcomm://192.168.2.45,192.168.2.46"</strong> wsrep_sst_method=rsync wsrep_on=ON <strong>wsrep_node_address="192.168.2.45" wsrep_node_name="mdb01"</strong> |
Добавьте следующий текст на сервере mdb02 :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
[mysqld] #mysql settings binlog_format=ROW default-storage-engine=innodb innodb_autoinc_lock_mode=2 query_cache_size=0 query_cache_type=0 innodb_flush_log_at_trx_commit=0 innodb_buffer_pool_size=256M <strong>bind-address=192.168.2.46</strong> #Galera settings wsrep_provider="/usr/lib/galera/libgalera_smm.so" #SSL for Galera wsrep_provider_options="socket.ssl_key=/etc/mysql/ssl/server-key.pem;socket.ssl_cert=/etc/mysql/ssl/server-cert.pem;socket.ssl_ca=/etc/mysql/ssl/ca-cert.pem" wsrep_cluster_name="cbz_cluster" <strong>wsrep_cluster_address="gcomm://192.168.2.45,192.168.2.46"</strong> wsrep_sst_method=rsync wsrep_on=ON <strong>wsrep_node_address="192.168.2.46" wsrep_node_name="mdb02"</strong> |
Сохраните и закройте файл.
Шаг 6. Запустите кластер MariaDB на сервере mdb01.
Введите следующую команду:
1 |
$ sudo systemctl stop mysql |
Начальная загрузка кластера
Начальная загрузка — инициализация кластера. Введите следующую команду на сервере mdb01 :
1 |
$ sudo /usr/bin/galera_new_cluster |
Убедитесь, что MySQL запущен:
1 2 3 |
$ ps aux | grep mysql mysql 10587 14.0 15.5 1266120 155268 ? Ssl 01:50 0:00 /usr/sbin/mysqld --wsrep-new-cluster --wsrep_start _position=00000000-0000-0000-0000-000000000000:-1 root 20822 0.0 0.0 12948 980 pts/0 S+ 01:22 0:00 grep --color=auto mysql |
Убедитесь, что SSL работает
Введите следующую команду
1 |
$ grep ssl /var/log/syslog |
Убедитесь, что кластер работает
Введите следующую команду, чтобы проверить, что кластер и первый узел работают:
1 |
$ mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size';" |
Пример результата:
Шаг 7. Присоединитесь к кластеру MariaDB на сервере mdb02.
Введите следующую команду на сервере mdb01 , чтобы присоединиться к кластеру mdb01:
1 2 |
$ sudo systemctl mysql stop $ sudo systemctl mysql start |
Проверьте:
1 |
$ mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size';" |
Результат:
1 2 3 4 5 6 |
Введите пароль: + -------------------- + ------- + | Variable_name | Значение | + -------------------- + ------- + | Wsrep_cluster_size | 2 | + -------------------- + ------- + |
Обратите внимание, что значение 2 указывает, что в нашем кластере есть два мастер-узла для управления узлом. Если вы присоединитесь к третьему узлу, он должен быть следующим:
1 2 3 4 5 6 |
Введите пароль: + -------------------- + ------- + | Variable_name | Значение | + -------------------- + ------- + | Wsrep_cluster_size | 3 | + -------------------- + ------- + |
Ниже приведена дополнительная информация о вашем кластере:
1 |
$ mysql -u root -p -e "show status like 'wsrep%';" |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
+------------------------------+--------------------------------------+ | Variable_name | Value | +------------------------------+--------------------------------------+ | wsrep_apply_oooe | 0.000000 | | wsrep_apply_oool | 0.000000 | | wsrep_apply_window | 0.000000 | | wsrep_causal_reads | 0 | | wsrep_cert_deps_distance | 0.000000 | | wsrep_cert_index_size | 0 | | wsrep_cert_interval | 0.000000 | | wsrep_cluster_conf_id | 2 | | wsrep_cluster_size | 2 | | wsrep_cluster_state_uuid | 1ff614b2-01e1-11e7-8e6b-6613e80d4934 | | wsrep_cluster_status | Primary | | wsrep_commit_oooe | 0.000000 | | wsrep_commit_oool | 0.000000 | | wsrep_commit_window | 0.000000 | | wsrep_connected | ON | | wsrep_desync_count | 0 | | wsrep_evs_delayed | | | wsrep_evs_evict_list | | | wsrep_evs_repl_latency | 0/0/0/0/0 | | wsrep_evs_state | OPERATIONAL | | wsrep_flow_control_paused | 0.000000 | | wsrep_flow_control_paused_ns | 0 | | wsrep_flow_control_recv | 0 | | wsrep_flow_control_sent | 0 | | wsrep_gcomm_uuid | 1ff51705-01e1-11e7-96a2-ca7fb2d337c2 | | wsrep_incoming_addresses | 192.168.2.46:3306,192.168.2.45:3306 | | wsrep_last_committed | 0 | | wsrep_local_bf_aborts | 0 | | wsrep_local_cached_downto | 18446744073709551615 | | wsrep_local_cert_failures | 0 | | wsrep_local_commits | 0 | | wsrep_local_index | 1 | | wsrep_local_recv_queue | 0 | | wsrep_local_recv_queue_avg | 0.000000 | | wsrep_local_recv_queue_max | 1 | | wsrep_local_recv_queue_min | 0 | | wsrep_local_replays | 0 | | wsrep_local_send_queue | 0 | | wsrep_local_send_queue_avg | 0.000000 | | wsrep_local_send_queue_max | 1 | | wsrep_local_send_queue_min | 0 | | wsrep_local_state | 4 | | wsrep_local_state_comment | Synced | | wsrep_local_state_uuid | 1ff614b2-01e1-11e7-8e6b-6613e80d4934 | | wsrep_protocol_version | 7 | | wsrep_provider_name | Galera | | wsrep_provider_vendor | Codership Oy | | wsrep_provider_version | 25.3.19(r3667) | | wsrep_ready | ON | | wsrep_received | 6 | | wsrep_received_bytes | 407 | | wsrep_repl_data_bytes | 0 | | wsrep_repl_keys | 0 | | wsrep_repl_keys_bytes | 0 | | wsrep_repl_other_bytes | 0 | | wsrep_replicated | 0 | | wsrep_replicated_bytes | 0 | | wsrep_thread_count | 2 | +------------------------------+--------------------------------------+ |
Теперь вы можете создать базу данных и таблицу на любом узле, и она будет реплицироваться на обоих узлах:
1 |
{vitek@mdb01:~ }$ mysql -u root -p -e 'create database foobar;' |
От второго узла проверьте его:
1 |
{vitek@mdb02:~ }$ mysql -u root -p -e 'show databases;' |
Примеры результатов:
1 2 3 4 5 6 7 8 9 |
+--------------------+ | Database | +--------------------+ | demo | | foobar | | information_schema | | mysql | | performance_schema | +--------------------+ |
Вы можете выполнить миграцию из автономной среды MariaDB в кластерную установку следующим образом:
1 2 3 4 5 6 7 |
## На старом MariaDB сервере## ## Выполните дамп базы данных foobar без движка ## $ mysqldump -u root -p --skip-create-options foobar > foobar.sql ## Копируйте foobar.sql на любую кластерную ноду, например mdb02 ## $ scp foobar.sql 192.168.2.46:/root/ ## Восстановите БД, на mdb02 ## $ mysql -u root -p foobar < foobar.sql |
Необходима настройка или сопровождение кластера базы данных, обращайтесь [email protected]
«Для промышленного используйте четыре сервера (рекомендуется минимум три сервера)» — Для промышленного использования лучше использовать нечетное количество нод (исключение ситуации когда между парами падает канал). Ничего не сказано про wsrep_sst_method=xtrabackup, этот метод более приемлем в продакшене так как не лочит базу в момент восстановления кластера или добавления нод.