Архитектура высокой доступности MySQL Кластер PXC

MySQL

1. РХС-кластер

Percona XtraDB Cluster (сокращенно PXC) — это решение Percona с открытым исходным кодом для обеспечения высокой доступности MySQL. Он интегрирует Percona Server и Percona XtraBackup с библиотекой Galera для синхронной репликации с несколькими мастерами. По сравнению с традиционной асинхронной репликацией MySQL, она может обеспечить высокую согласованность данных, состояние данных на любом узле в кластере в любое время полностью согласовано, а вся архитектура децентрализована, а все узлы одноранговые. Да, это позволяет вам писать и читать на любом узле, а кластер будет синхронизировать состояние данных со всеми остальными узлами. Но в настоящее время кластер PXC поддерживает только механизм хранения InnoDB и имеет следующие ограничения:

  • При добавлении нового узла необходимо скопировать полный набор данных с одного из существующих узлов. Если это 100 ГБ, скопируйте 100 ГБ. Чтобы уменьшить нагрузку на сеть, рекомендуется использовать резервное копирование, чтобы скорректировать начальное состояние данных всех узлов, чтобы оно было согласованным перед созданием кластера.
  • LOCK TABLES не поддерживается, а UNLOCK TABLES не поддерживается в случае установки с несколькими мастерами.
  • Функции блокировки, такие как GET_LOCK(), RELEASE_LOCK() и т. д., не поддерживаются.
  • Транзакции XA (распределенные транзакции) также не поддерживаются из-за возможного отката при фиксации.
  • Все таблицы должны иметь первичный ключ.
  • Поскольку узлы являются одноранговыми, пропускная способность записи всего кластера ограничивается узлом с наихудшей производительностью, и если один узел работает медленно, весь кластер работает медленно. Поэтому следует убедиться, что аппаратная конфигурация всех узлов согласована, и избегать перегрузки одного узла.
  • Максимально допустимый размер транзакции определяется параметрами wsrep_max_ws_rows и wsrep_max_ws_size вместе, поэтому очень большие транзакции разбиваются на серию меньших транзакций, таких как LOAD DATA INFILE.
  • Из-за использования оптимистической блокировки для управления параллелизмом на уровне кластера транзакции все еще могут быть прерваны на этапе COMMIT. Если две транзакции записываются в одну и ту же строку на разных узлах кластера, только одна из них может быть успешно зафиксирована, а другая будет прервана.

Несмотря на то, что кластер PXC имеет вышеуказанные ограничения, на данный момент он по-прежнему является лучшим решением для согласованности данных и высокой доступности.Этапы построения следующие:

2. Кластерная конструкция

Чтобы обеспечить высокую доступность кластера, в кластере должно быть не менее 3 узлов.Вот пример построения 3-узлового кластера следующим образом:

2.1 Подготовка к установке

1. Удалить MariaDB

1. Здесь моя версия сервера — Centos 7.x, а встроенную базу данных MariaDB необходимо удалить, чтобы она не повлияла на последующие установки:

yum -y remove mari*

2. Открытый порт доступа к стене

Откройте следующие четыре порта брандмауэра, их функции и команды открытия следующие:

# MySQL 对外提供服务的端口
firewall-cmd --zone=public --add-port=3306/tcp --permanent
# 请求进行全量同步(SST)的端口
firewall-cmd --zone=public --add-port=4444/tcp --permanent
# 集群中各个节点间的通讯端口
firewall-cmd --zone=public --add-port=4567/tcp --permanent
# 请求进行增量同步(IST)的端口
firewall-cmd --zone=public --add-port=4568/tcp --permanent

3. Закройте СЕЛИНУКС

Модули безопасности SELinux могут ограничивать доступ к данным в Percona XtraDB Cluster. можно использовать во время выполненияsetenforce 0команду или изменив/etc/selinux/configЗначение свойства SELINUX в ​​файле отключено, чтобы сделать изменение постоянным:

vi /etc/selinux/config
# 修改
SELINUX=disabled

После изменения этого файла вам необходимо перезапустить, чтобы изменения вступили в силу:

reboot

2.2 Онлайн-установка

После настройки источника yum используйте команду yum для прямой онлайн-установки.Команда выглядит следующим образом:

sudo yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
sudo yum install Percona-XtraDB-Cluster-57

После завершения установки с помощью приведенной выше команды одновременно будет установлена ​​база данных Percona Server. Она была расширена и улучшена на основе версии сообщества MySQL и полностью совместима с исходной версией. Метод использования также полностью то же самое Команда запуска выглядит следующим образом:

sudo systemctl start mysql

2.3 Изменить пароль

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

sudo grep 'temporary password' /var/log/mysqld.log

Войдите в систему с учетной записью root и измените пароль учетной записи:

# 登录服务
mysql -u root -p
# 修改密码
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
# 退出服务
mysql> exit

Затем остановите службу MySQL с помощью следующей команды:

sudo systemctl stop mysql

2.4 Создание кластера

Описанный выше процесс установки выполняется одинаково на трех хостах, после чего можно начинать построение кластера. Сначала нужно изменить/etc/my.cnfфайл, содержимое, которое необходимо добавить на первый узел, выглядит следующим образом:

[mysqld]

# PXC集群中每个MySQL实例的唯一标识,不能重复
server-id=1  

wsrep_provider=/usr/lib64/galera3/libgalera_smm.so

# PXC集群的名称和所有服务地址
wsrep_cluster_name=pxc-cluster  
wsrep_cluster_address=gcomm://192.168.0.226,192.168.0.227,192.168.0.228

# 当前节点的名称和服务地址
wsrep_node_name=pxc1 
wsrep_node_address=192.168.0.226

# 指定同步方法和账户信息,这个用户在下文会进行创建
wsrep_sst_method=xtrabackup-v2 
wsrep_sst_auth= sstuser:123456

#开启严厉模式,它会阻止用户执行 Percona XtraDB Cluster 所不支持的功能。
pxc_strict_mode=ENFORCING  

# 指定二进制日志的格式
binlog_format=ROW 
# 指定默认的存储引擎
default_storage_engine=InnoDB 
# Galera 仅支持 InnoDB 的 interleaved(2) 锁定模式:
# 该模式下所有 INSERT SQL 都不会有表级 AUTO-INC 锁,多个语句可以同时执行
innodb_autoinc_lock_mode=2 

Конфигурация второго и третьего узлов в основном такая же, как и выше, но идентификатор сервера, имя и адрес текущего узла необходимо изменить следующим образом:

server-id=2
wsrep_node_name=pxc2
wsrep_node_address=192.168.0.227
server-id=3
wsrep_node_name=pxc3
wsrep_node_address=192.168.0.228

2.5 Запуск кластера

Первую ноду нужно запустить в режиме загрузки:

sudo systemctl start mysql@bootstrap.service

Перед добавлением других узлов в кластер необходимо войти в текущий узел, чтобы создать пользователя и предоставить разрешения для операций SST.Команда выглядит следующим образом:

# 创建用户
CREATE USER 'sstuser'@'localhost' IDENTIFIED BY '123456';
# 授予权限
GRANT RELOAD, LOCK TABLES, PROCESS, REPLICATION CLIENT ON *.* TO 'sstuser'@'localhost';
# 刷新权限
FLUSH PRIVILEGES;

Затем запустите службу базы данных в обычном режиме на втором и третьем узлах с помощью следующих команд:

sudo systemctl start mysql

После запуска вы можете войти в любой узел и использовать следующие команды для просмотра состояния кластера. Значение wsrep_cluster_size в выводе должно быть 3, то есть общее количество узлов в кластере равно 3, что означает, что все узлы успешно присоединились к кластеру, и кластер построен.

mysql> show status like 'wsrep%';
+----------------------------------+----------------------------------------------------------+
| Variable_name                    | Value                                                    |
+----------------------------------+----------------------------------------------------------+
| wsrep_local_state_uuid           | 8bcc22cf-bfab-11e9-8a49-6e46c7af709e                     |
.......
| wsrep_incoming_addresses         | 192.168.0.227:3306,192.168.0.228:3306,192.168.0.226:3306 |
| wsrep_gcomm_uuid                 | c8afc276-c623-11e9-a9ea-677d72419479                     |
| wsrep_cluster_conf_id            | 3                                                        |
| wsrep_cluster_size               | 3                                                        |
| wsrep_cluster_state_uuid         | 8bcc22cf-bfab-11e9-8a49-6e46c7af709e                     |
| wsrep_cluster_status             | Primary                                                  |
| wsrep_connected                  | ON                                                       |
| wsrep_local_bf_aborts            | 0                                                        |
| wsrep_local_index                | 2                                                        |
| wsrep_provider_name              | Galera                                                   |
| wsrep_provider_vendor            | Codership Oy <info@codership.com>                        |
| wsrep_provider_version           | 3.37(rff05089)                                           |
| wsrep_ready                      | ON                                                       |
+----------------------------------+----------------------------------------------------------+

2.6 Узел в автономном режиме

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

systemctl stop mysql@bootstrap.service

Другие узлы могут быть отключены как обычно:

service stop mysql

Поскольку все узлы равны, эффект отключения первого узла и других узлов в автономном режиме одинаков.Все вышесказанное касается построения кластера PXC.

использованная литература

Percona XtraDB Cluster 5.7 Documentation

Дополнительные статьи см. в [Full Stack Engineer Manual], адрес GitHub:GitHub.com/Black and WhiteShould/…