Связаться по:
vkarabedyants Telegram Viber

Блог о системном администрировании серверов и сайтов

Установка, настройка программного обеспечения Linux, Windows операционных систем

Установка 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

  1. True Multi-master. Чтение и запись на любой узел в любое время.
  2. Синхронная репликация. Отсутствует ведомое устройство, данные не теряются при сбое узла.
  3. Tightly Coupled. Все узлы имеют одинаковое состояние. Нет разнесенных данных между разрешенными узлами.
  4. Многопоточный Slave. Для лучшей производительности. Для любой рабочей нагрузки.
  5. Нет операций переключения мастер-слэйва или использования VIP.
  6. Горячий режим ожидания. Отсутствие простоев при переходе на другой ресурс (так как нет перехода на другой ресурс).
  7. Автоматическое создание узлов. Не нужно вручную создавать резервную копию базы данных и копировать ее на новый узел.
  8. Поддерживает InnoDB.
  9. Прозрачный для приложений. Требуется минимальные изменения в приложении или вообще не трубует изменений.
  10. Нет необходимости разделения чтения и записи.
  11. Результатом этого является решение высокой доступности, которое является одновременно надежным с точки зрения целостности данных и высокой производительности с отказоустойчивостью.

кластер базы данных

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

  1. Между двумя центрами обработки данных (кластер для центров обработки данных). Для целей безопасности вы должны настроить VPN и MariaDB через SSL .
  2. В вашей локальной сети / VLAN (единый кластер центра обработки данных) — VPN не требуется, но вы должны настроить MariaDB через SSL .

Что нужно для установки кластера высокой доступности MariaDB Galera?

  1. Минимум два сервера (могут быть облачные или физические). Для промышленного используйте четыре сервера (рекомендуется минимум три сервера).
  2. Частная сеть (LAN / VLAN) между серверами
  3. VPN между двумя центрами обработки данных, если устанавливается между двумя IDC
  4. Ubuntu Linux 16.04 LTS на обоих серверах

Давайте приступим к установке и настройке MariaDB Galera на Ubuntu.

Шаг 1 — Настройка /etc/hosts

Отредактируйте файлы setup /etc/hosts на обоих серверах :

sudo vi /etc/hosts

Установите правильный частный IP-адрес согласно рис. 01 или согласно настройке:

 192.168.2.45 mdb01
 192.168.2.46 mdb02

Закройте и сохраните файл. Проверьте:

ping -c2 mdb01 
ping -c2 mdb02

Шаг 2. Включение репозиториев MariaDB для версии 10.1.

Введите следующие команды, чтобы разрешить репозиториям mariadb установить версию 10.1 на обоих серверах :

$ 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 на обоих серверах :

$ sudo apt-get install mariadb-server rsync

Пример результата:

настройка galera mariadb

Вы должны установить пароль пользователя MariaDB root:

установка базы данных

Шаг 4. Создание SSL-сертификатов для кластера MariaDB Galera

Введите следующие команды для создания сертификата CA, сервера и клиента, чтобы мы могли иметь защищенные зашифрованные соединения между узлами с использованием протокола SSL. Это включает как соединения между клиентами базы данных и серверами через стандартную поддержку SSL в MySQL, так и шифрование трафика репликации, в частности к самому Galera Cluster. Реализация SSL распространяется по всему кластеру и не поддерживает аутентификацию для трафика репликации. Вы должны включить SSL для всех узлов в кластере или ни для одного из них:

$ 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

Чтобы избежать проблем, я устанавливаю их общее имя следующим образом:

  1. Общее имя CA: MariaDB admin
  2. Общее имя сервера: MariaDB server
  3. Клиентское общее имя: MariaDB client

Настройка клиента и сервера mysql для ssl

Отредактируйте файл /etc/mysql/my.cnf:

$ sudo vi /etc/mysql/my.cnf

Найдите и обновите раздел [клиент] следующим образом:

[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] следующим образом:

[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

Сохраните и закройте файл.

Установка сертификатов на других узлах

Копирование сертификатов во все остальные узлы:

ssh [email protected] mkdir -p /etc/mysql/ssl/
scp * [email protected]:/etc/mysql/ssl/
ssh [email protected] mkdir -p /etc/mysql/ssl/
scp * [email protected]:/etc/mysql/ssl/

Шаг 5. Настройте сервер кластера MariaDB Galera.

Создайте на обоих серверах следующий файл:

$ sudo vi /etc/mysql/conf.d/galera.cnf

Добавьте следующий текст на сервере mdb01 :

[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
bind-address=192.168.2.45

#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"
wsrep_cluster_address="gcomm://192.168.2.45,192.168.2.46"
wsrep_sst_method=rsync
wsrep_on=ON
wsrep_node_address="192.168.2.45"
wsrep_node_name="mdb01"

Добавьте следующий текст на сервере mdb02 :

[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
bind-address=192.168.2.46

#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"
wsrep_cluster_address="gcomm://192.168.2.45,192.168.2.46"
wsrep_sst_method=rsync
wsrep_on=ON
wsrep_node_address="192.168.2.46"
wsrep_node_name="mdb02"

Сохраните и закройте файл.

Шаг 6. Запустите кластер MariaDB на сервере mdb01.

Введите следующую команду:

$ sudo systemctl stop mysql

Начальная загрузка кластера

Начальная загрузка — инициализация кластера. Введите следующую команду на сервере mdb01 :

$ sudo /usr/bin/galera_new_cluster

Убедитесь, что MySQL запущен:

$ 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 работает

Введите следующую команду

$ grep ssl /var/log/syslog

Убедитесь, что кластер работает

Введите следующую команду, чтобы проверить, что кластер и первый узел работают:

$ mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size';"

Пример результата:

загрузка кластера базы данных

Шаг 7. Присоединитесь к кластеру MariaDB на сервере mdb02.

Введите следующую команду на сервере mdb01 , чтобы присоединиться к кластеру mdb01:

$ sudo systemctl mysql stop 
$ sudo systemctl mysql start

Проверьте:

$ mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size';"

Результат:

  Введите пароль: 
 + -------------------- + ------- +
 |  Variable_name |  Значение |
 + -------------------- + ------- +
 |  Wsrep_cluster_size |  2 |
 + -------------------- + ------- +

Обратите внимание, что значение 2 указывает, что в нашем кластере есть два мастер-узла для управления узлом. Если вы присоединитесь к третьему узлу, он должен быть следующим:

  Введите пароль: 
 + -------------------- + ------- +
 |  Variable_name |  Значение |
 + -------------------- + ------- +
 |  Wsrep_cluster_size |  3 |
 + -------------------- + ------- +

Ниже приведена дополнительная информация о вашем кластере:

$ mysql -u root -p -e "show status like 'wsrep%';"
+------------------------------+--------------------------------------+
| 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                                    |
+------------------------------+--------------------------------------+

Теперь вы можете создать базу данных и таблицу на любом узле, и она будет реплицироваться на обоих узлах:

{[email protected]:~ }$ mysql -u root -p -e 'create database foobar;'

От второго узла проверьте его:

{[email protected]:~ }$ mysql -u root -p -e 'show databases;'

Примеры результатов:

+--------------------+
| Database           |
+--------------------+
| demo               |
| foobar             |
| information_schema |
| mysql              |
| performance_schema |
+--------------------+

Вы можете выполнить миграцию из автономной среды MariaDB в кластерную установку следующим образом:

## На старом 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]

1 Response

  1. Dmitriy

    «Для промышленного используйте четыре сервера (рекомендуется минимум три сервера)» — Для промышленного использования лучше использовать нечетное количество нод (исключение ситуации когда между парами падает канал). Ничего не сказано про wsrep_sst_method=xtrabackup, этот метод более приемлем в продакшене так как не лочит базу в момент восстановления кластера или добавления нод.

Оставить комментарий

Лимит времени истёк. Пожалуйста, перезагрузите CAPTCHA.