# Заметки к книге Обеспечение высокой доступности систем на основе MySQL

Применяя репликацию для масштабирования, важно знать, что репликация MySQL является асинхронной. То есть, сначала транзакции фиксируются на главном сервере, а затем реплицируются на подчиненный сервер и там исполняются. Это означает, что при непрерывной репликации подчиненный сервер будет «отставать» от главного.

## Установка MySQL

Подробнее описано здесь - https://git.da2001.ru/da2001/notes/src/branch/master/mysql.md

```bash
su -
wget https://dev.mysql.com/get/mysql-apt-config_0.8.36-1_all.deb
apt install -y ./mysql-apt-config_0.8.36-1_all.deb

dpkg-reconfigure mysql-apt-config

apt update
apt install mysql-server
```

## Репликация - первые шаги

### Настройка главного сервера

Для работы репликации необходим двоичный жернал и уникальный идентификатор сервера.

```bash
cat my.cnf
...
log-bin       = master-bin
log-bin-index = master-bin.index
server-id     = 1
```

- `master-bin` - базовое имя для давоичного журнала, журналов может быть несколько
- `master-bin.index` - имя индексного файла двоичного журнала, в котором содержится список всех файлов двоичного журнала

Для того чтобы подключить подчиненный сервер, на главном сервере должен быть пользователь с особыми полномочиями репликации.

Создание пользователя репликации на главном сервере (в книге используется устаревший вариант, предлагаю современный)

```bash
master> CREATE USER 'repl_user'@'%' IDENTIFIED BY 'strong_password';
Query OK, 0 rows affected (0.00 sec)
master> GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%' WITH GRANT OPTION;
Query OK, 0 rows affected (0.00 sec)
```

### Настройка подчинённого сервера

```bash
cat my.cnf
...
relay-log       = slave-relay-bin
relay-log-index = slave-relay-bin.index
server-id       = 2
```

### Подключение подчинённого сервера к главному

В книге используется устаревший вариант, предлагаю современный

```bash
slave> CHANGE REPLICATION SOURCE TO
  SOURCE_HOST = 'master-1',
  SOURCE_PORT = 3306,
  SOURCE_USER = 'repl_user',
  SOURCE_PASSWORD = 'strong_password',
  SOURCE_LOG_FILE = 'mysql-bin.000002',      # обязательно!
  SOURCE_LOG_POS = 158,                      # обязательно!
  SOURCE_CONNECTION_AUTO_FAILOVER = 1,       # опционально, для асинхронной реплики
  GET_SOURCE_PUBLIC_KEY = 1;                 # для MySQL 8.0 с sha2
Query OK, 0 rows affected (0.00 sec)
slave> START REPLICA;
Query OK, 0 rows affected (0.15 sec)
```
