Принцип репликации master-slave в Mysql
Репликация master-slave означает, что один сервер действует как главный сервер базы данных, другой или несколько серверов действуют как подчиненный сервер базы данных, а данные с главного сервера автоматически копируются на подчиненный сервер. Для многоуровневой репликации сервер базы данных может действовать как ведущий или подчиненный. В основе репликации master-slave MySQL лежит то, что главный сервер записывает двоичный журнал изменений базы данных, а подчиненный сервер автоматически выполняет обновление через двоичный журнал главного сервера.
Типы репликации master-slave Mysql
-
Репликация на основе операторов:
Оператор, выполняемый на главном сервере, снова выполняется на подчиненном сервере, который поддерживается после MySQL-3.23.
Существующие проблемы: время может быть не полностью синхронизировано, что приводит к отклонению, и пользователь, выполняющий оператор, также может быть другим пользователем.
-
Репликация на основе строк:
Скопируйте измененное содержимое напрямую на главный сервер, независимо от того, какой оператор вызвал изменение содержимого.Это было введено после MySQL-5.0.
Существующая проблема: если количество измененных строк слишком велико, вызванные служебные данные относительно велики.
MySQL использует репликацию на основе операторов по умолчанию.Когда репликация на основе операторов вызывает проблемы, используется репликация на основе строк, и MySQL автоматически выбирает.
В архитектуре репликации MySQL master-slave операции чтения могут выполняться на всех серверах, а операции записи — только на главном сервере. Хотя архитектура репликации ведущий-подчиненный обеспечивает расширение операций чтения, при большом количестве операций записи (нескольким подчиненным серверам также необходимо синхронизировать данные с главного сервера) главный сервер неизбежно станет узким местом производительности при репликации одиночного сервера. мастер-модель.
Как работает репликация master-slave в Mysql
Как показано на рисунке выше, любые изменения на главном сервере будут сохраняться в двоичном журнале, поток ввода-вывода (фактически клиентский процесс основного сервера) запускается с сервера и подключается к основному серверу. запросить чтение двоичного журнала, а затем записать прочитанный двоичный журнал в локальный журнал Realy. Запустите поток SQL с сервера, чтобы регулярно проверять журнал Realy, и, если будут обнаружены какие-либо изменения, немедленно выполнить измененное содержимое на локальном компьютере.
Если есть один ведущий и несколько подчиненных, то основная библиотека отвечает как за запись, так и за предоставление двоичных журналов для нескольких подчиненных библиотек. В это время вы можете сделать небольшую настройку, только дать двоичный журнал одному подчиненному устройству, а затем включить двоичный журнал и отправить его собственный двоичный журнал другим подчиненным устройствам. Или просто это никогда не записывает, отвечает только за пересылку бинарного лога другим подчиненным, поэтому производительность архитектуры может быть намного лучше, и задержка между данными должна быть немного лучше.
MySQL репликация из основного процесса
- Процесс ввода-вывода на ведомом устройстве подключается к ведущему и запрашивает содержимое журнала из указанного местоположения указанного файла журнала (или из первого журнала).
- После того, как мастер получит запрос от процесса ввода-вывода подчиненного устройства, процесс ввода-вывода, ответственный за репликацию, прочитает информацию журнала после указанного местоположения журнала в соответствии с информацией запроса и вернет ее процессу ввода-вывода подчиненного устройства. В дополнение к информации, содержащейся в журнале, возвращаемая информация также включает в себя имя файла бинарного журнала и местонахождение бинарного журнала, где возвращенная информация была отправлена на Мастер.
- После того, как процесс ввода-вывода подчиненного устройства получает информацию, он по очереди добавляет полученное содержимое журнала в конец файла журнала ретрансляции на стороне подчиненного устройства и записывает прочитанное имя файла и местоположение бинарного журнала на стороне главного устройства. в файл master-info. , чтобы Мастеру можно было четко указать, с чего начать чтение журнала при следующем чтении.
- После того, как процесс Slave Sql обнаружит новое добавленное содержимое в журнале реле, он немедленно проанализирует содержимое журнала реле в виде исполняемого содержимого, когда оно фактически выполняется на стороне ведущего, и выполнит его самостоятельно.
Linux устанавливает mysql8 и реализует синхронизацию master-slave.
Подготовка сервера
Подготовьте серверы Server1 и Server2.Если они находятся на одном сервере, вам необходимо изменить их порты при установке mysql.
удалить mysql
Перед установкой вы должны проверить, установлен ли mysql на хосте, если он установлен, вы должны сначала удалить его.
установить mysql
Загрузите пакет:
wget https://repo.mysql.com//mysql80-community-release-el7-1.noarch.rpm
Локальная установка:
yum localinstall mysql80-community-release-el7-1.noarch.rpm
Установите mysql:
yum install mysql-community-server
Начать при загрузке:
systemctl enable mysqld
systemctl daemon-reload
Запустите mysql:
systemctl start mysqld
Вышеуказанные шаги установят mysql8.
Получите временный пароль для mysql:
grep 'temporary password' /var/log/mysqld.log
Вход в mysql:
mysql -uroot -p
Вам будет предложено ввести пароль, для входа введите полученный ранее временный пароль.
На этом этапе вам нужно изменить пароль mysql, иначе следующие шаги заставят вас изменить пароль:
ALTER USER 'root'@'localhost' IDENTIFIED BY '121b33dAj934J1^Sj9ag';
По умолчанию в mysql8 есть требования к надежности пароля, и его нужно ставить посложнее, иначе выдаст ошибку.
Обновить конфигурацию:
FLUSH PRIVILEGES;
конфигурация ведущий-ведомый
Перед настройкой master-slave необходимо убедиться, что две библиотеки mysql должны быть синхронизированы в одном и том же состоянии.
хозяин
Файл конфигурации по умолчанию/etc/my.cnfВниз.
Добавьте новую конфигурацию в файл конфигурации:
[mysqld]
## 同一局域网内注意要唯一
server-id=100
## 开启二进制日志功能,可以随便取(关键)
log-bin=mysql-bin
После изменения конфигурации необходимо перезапустить, чтобы изменения вступили в силу:
service mysql restart
После перезагрузки введите mysql:
mysql -uroot -p
Создайте пользователя для синхронизации данных в базе данных master и предоставьте подчиненному пользователю полномочия REPLICATION SLAVE и полномочия REPLICATION CLIENT для синхронизации данных между главной и подчиненной библиотеками.
CREATE USER 'slave'@'%' IDENTIFIED BY '@#$Rfg345634523rft4fa';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
в предложении%Это означает, что все сервера могут использовать этого пользователя, если вы хотите указать конкретный ip, установите%Измените его на ip.
Проверяем состояние основного mysql:
show master status;
записыватьFileиPositionзначения и не выполняйте другие операции, чтобы избежатьPositionПеремена.
от
в отmy.cnfВ конфигурацию добавлено:
mysqld]
## 设置server_id,注意要唯一
server-id=101
## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
log-bin=mysql-slave-bin
## relay_log配置中继日志
relay_log=edu-mysql-relay-bin
После изменения конфигурации необходимо перезапустить, чтобы изменения вступили в силу:
service mysql restart
После перезагрузки введите mysql:
mysql -uroot -p
change master to master_host='172.17.0.2', master_user='slave', master_password='@#$Rfg345634523rft4fa', master_port=3306, master_log_file='mysql-bin.000001', master_log_pos= 2830, master_connect_retry=30;
master_host: адрес мастера
master_port: Номер порта Мастера
master_user: Пользователь для синхронизации данных
master_password: пароль пользователя, используемый для синхронизации
master_log_file: Указывает, из какого файла журнала ведомое устройство начинает копирование данных, что является значением поля «Файл», упомянутого выше.
master_log_pos: С какой позиции начать чтение, то есть значение поля «Позиция», упомянутого выше.
master_connect_retry: если соединение не удалось, интервал повтора в секундах, по умолчанию 60 секунд.
Просмотрите статус синхронизации master-slave из mysql:
show slave status \G;
В настоящее время и SlaveIORunning, и SlaveSQLRunning имеют значение No, поскольку мы не начали процесс репликации master-slave.
Включить репликацию master-slave:
start slave;
Еще раз проверьте статус синхронизации:
show slave status \G;
И SlaveIORunning, и SlaveSQLRunning имеют значение «Да», что указывает на то, что репликация ведущий-ведомый включена.
Если SlaveIORunning всегда подключается, есть четыре причины:
1. Сеть заблокирована, проверьте ip порт
2. Пароль неверный, проверьте имя пользователя и пароль, используемые для синхронизации
3. Если позиция неверна, проверьте позицию мастера.
4. Проблема с правилом пароля, характерная для mysql8, вызвана:
ALTER USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY '@#$Rfg345634523rft4fa';
Измените правило пароля на: mysql_native_password
Если вам нужно указать, какую базу данных вы хотите синхронизировать master-slave, вы можетеmy.cnfДобавить конфигурацию:
binlog-do-db:指定mysql的binlog日志记录哪个db
или в рабствеmy.cnfДобавить конфигурацию:
replicate-do-db=需要复制的数据库名,如果复制多个数据库,重复设置这个选项即可 replicate-ignore-db=需要复制的数据库名,如果复制多个数据库,重复设置这个选项即可
Если вы хотите синхронизировать все библиотеки и таблицы, выполните из mysql:
STOP SLAVE SQL_THREAD;
CHANGE REPLICATION FILTER REPLICATE_DO_DB = ();
start SLAVE SQL_THREAD;
Если есть проблема с вышеуказанными шагами, вы можете просмотреть журнал:
/etc/log/mysqld.log
На данный момент работа по созданию синхронизации master-slave mysql8 завершена.