Разделы сайта
Выбор редакции:
- На время полета отключить мобильный телефон
- Телефон службы поддержки киевстар или как позвонить оператору Дополнительная информация по обращению в справочную службу
- Левитирующая колонка красная Будущее, в котором возможны такие технические новинки, уже наступило
- Что такое майнинг криптовалюты простым языком
- Детализация звонков МТС: все способы получения распечатки звонков
- Интеграция виртуальной АТС Zadarma и Zoho CRM
- Цветомузыка на arduino Цветомузыка на микроконтроллере avr
- Настройка VPN-подключения средствами ОС Windows
- Что делать, если Mac греется на Windows Охлаждаем MacBook на Windows
- Ваш Mac начнёт дико тормозить, но это можно избежать
Реклама
Основы репликации в MySQL. Настройка репликации баз данных mysql Установка и настройка Master |
Всем доброго дня! Сегодня в нашей статье мы рассмотрим примеры настройки репликации типа “master-slave”. Немного теорииЗачем нужна репликация? В первую очередь это подстраховка на случай, если основной mysql-сервер выйдет из строя, тогда можно переключиться на slave-сервер и продолжить работу. Во вторых, это возможность уменьшить нагрузку на основной сервер Mysql, используя master-сервер только для записи, а операции на чтение выполнять на slave-сервере. Как происходит репликация? Master-сервер пишет binlog-и, в которых указывает операции, которые выполняются над базой данных (базами данных) и запоминает смещение в журнале от его начала до текущей записи (позицию). Slave-сервер подключается к master-у, сравнивает значения позиций и считывает изменения в журнале начиная со значения собственной позиции и заканчивая значением позициии master-a. Изменения (команды) он применяет к базам данных на slave-сервере. Установка и настройка MasterИзменяем my.cnf на головном сервере: Server-id = 1 - указываем id сервера log_bin = /var/log/mysql/mysql-bin.log - наименое лога и его путь Небольшое уточнение: по умолчанию, мастер пишет binlog-и для всех баз данных, это можно изменить с помощью "binlog-do-db". В логи будет записываться значения, когда будет использоваться определенная БД, изменения в остальных БД не будут записываться. Здесь же можно указать, сколько дней хранить логи, какой их максимальный размер (параметры expire_logs_days и max_binlog_size). Добавляем в MySQL пользователя, под правами которого будет производиться репликация: GRANT replication slave ON *.* TO имя_пользователя@ip_slave_сервера IDENTIFIED BY "пароль"; replication slave - привилегия, позволяющая пользователю читать binlog-и. ip_slave_сервера - ip сервера, с которого будет подключаться пользователь. Перезагружаем mysql-сервер: /etc/init.d/mysql restart Проверяем работу мастера: Show master status; Должны увидеть название binlog-a и позицию в нем. При выполнении команд над БД, позиция будет меняться. Настройка SlaveВ файл my.cnf вносим измнения: Server-id = 2 - идентификатор slave-сервера должен обязательно отличаться от идентификатора master. relay-log = /var/lib/mysql/mysql-relay-bin - как и двоичный журнал, состоит из набора пронумерованных файлов, содержащих события, которые описывают изменения в базе данных. relay-log-index = /var/lib/mysql/mysql-relay-bin.index - индексный файл, который содержит имена всех используемых файлов журналов relay. replicate-do-db = БД, которая будет реплицироваться. Важное замечание! При организации cross db (когда используется одна БД, а данные обновляются в другой БД) в настройках мастер-сервера не нужно указывать binlog-do-db, binlog-и должны писаться для всех баз данных, а в настройках slave нужно вместо replicate-do-db указать replicate-wild-do-table=db_name.%, где db_name - имя реплицируемой БД. Перезагружаем mysql-сервер: /etc/init.d/mysql restart Включение репликацииSET GLOBAL read_only = ON; Смотрим состояние master-a: Show master status; Запоминаем значения File и Position (а лучше их записать). Сейчас значение Position не должно изменяется. Делаем дамп мастера командой mysqldump: Mysqldump -uname -ppassword db_master_name > dump_db, где name - имя пользователя, password - пароль, db_master_name - имя БД, dump_db - название дампа. После завершения дампа разрешаем запись в БД: SET GLOBAL read_only = OFF; Переносим дамп на slave и разворачиваем Mysql -uname -ppassword db_slave_name < dump_db Настраиваем репликацию CHANGE MASTER TO MASTER_HOST = “ip-мастера”, MASTER_USER = "имя_пользователя ", MASTER_PASSWORD = "password ", MASTER_LOG_FILE = "название лога", MASTER_LOG_POS = позицию; ip-мастера - ip сервера, на котором расположен master, имя_пользователя - имя пользователя, которого мы создали на master-е, название лога - значение File на мастере, когда делал дамп БД, позицию - значение Position на мастере, когда делал дамп БД. Запускаем slave: Start slave; Смотрим как идет репликация: На мастере: SHOW MASTER STATUS\G На slave: SHOW SLAVE STATUS\G Настройки безопасности на master-сервереПараметр bind-address в /etc/mysql/my.cnf задает, какой ip-адрес mysql-сервер будет слушать в ожидании соединения. Обычно он имеет значение bind-address = 127.0.0.1. Но после настройки slave-сервера, нам нужно разрешить подключение со slave-сервера и при этом должны работать локальные подключения. Bind-address может разрешить подключение только с одного ip либо со всех. Т.к. нам нужно указать больше одного ip для соединения, мы комментируем строку с bind-address = 127.0.0.1. Теперь mysql-сервер будет принимать соединения со всех ip-адресов, что очень опасно. Решить эту проблему нам поможет iptables: Iptables -I INPUT -p tcp -s ip_slave_server-a --dport 3306 -j ACCEPT -в начале разрешаем подключение с ip-адреса slave-сервера iptables -I INPUT -p tcp --dport 3306 -j DROP - потом запрещаем подключение со всех остальных ip-адресов. Теперь у нас будет работать 2 MySQL сервера в режиме master-slave, что существенно повышает надежность сайта и для некоторых Drupal сайтов помогает увеличить скорость работы. В следующей статье рассмотрим переключение между режимами master и slave в случае падения master сервера. С репликацией серверов MySQL я познакомился относительно недавно, и по мере проведения разных опытов с настройкой, записывал, что у меня получалось. Когда материала набралось достаточно много, появилась идея написать эту статью. Я постарался собрать советы и решения по некоторым самым основным вопросам, с которыми я столкнулся. По ходу дела я буду давать ссылки на документацию и другие источники. Не могу претендовать на полноту описания, но надеюсь, что статья будет полезной. Небольшое введениеРепликация (от лат. replico -повторяю) — это тиражирование изменений данных с главного сервера БД на одном или нескольких зависимых серверах. Главный сервер будем называть мастером , а зависимые — репликами .Изменения данных, происходящие на мастере, повторяются на репликах (но не наоборот). Поэтому запросы на изменение данных (INSERT, UPDATE, DELETE и т. д.) выполняются только на мастере, а запросы на чтение данных (проще говоря, SELECT) могут выполняться как на репликах, так и на мастере. Процесс репликации на одной из реплик не влияет на работу других реплик, и практически не влияет на работу мастера. Репликация производится при помощи бинарных логов , ведущихся на мастере. В них сохраняются все запросы, приводящие (или потенциально приводящие) к изменениям в БД (запросы сохраняются не в явном виде, поэтому если захочется их посмотреть, придется воспользоваться утилитой mysqlbinlog). Бинлоги передаются на реплики (бинлог, скачанный с мастера, называется "relay binlog ") и сохраненные запросы выполняются, начиная с определенной позиции. Важно понимать, что при репликации передаются не сами измененные данные, а только запросы, вызывающие изменения. При репликации содержимое БД дублируется на нескольких серверах. Зачем необходимо прибегать к дублированию? Есть несколько причин:
Настройка репликацииДопустим, у нас есть работающая база данных MySQL, уже наполненная данными и включенная в работу. И по одной из причин, описанных выше, мы собираемся включить репликацию нашего сервера. Наши исходные данные:
Настройки мастераОбязательно укажем уникальный ID сервера, путь для бинарных логов и имя БД для репликации в секции :server-id = 1 log-bin = /var/lib/mysql/mysql-bin replicate-do-db = testdb Убедитесь, что у вас достаточно места на диске для бинарных логов. Добавим пользователя replication, под правами которого будет производится репликация. Будет достаточно привилегии "replication slave ": Перезагрузим MySQL, чтобы изменения в конфиге вступили в силу: Если все прошло успешно, команда "show master status " должна показать примерно следующее: Настройки репликиУкажем ID сервера, имя БД для репликации и путь к relay-бинлогам в секции конфига, затем перезагрузим MySQL:server-id = 2 relay-log = /var/lib/mysql/mysql-relay-bin relay-log-index = /var/lib/mysql/mysql-relay-bin.index replicate-do-db = testdb Root@replica# service mysqld restart Переносим данныеЗдесь нам придется заблокировать БД для записи. Для этого можно либо остановить работу приложений, либо воспользоваться установкой флажка read_only на мастере (внимание: на пользователей с привилегией SUPER этот флаг не действует). Если у нас есть таблицы MyISAM, сделаем также "flush tables ":mysql@master> FLUSH TABLES WITH READ LOCK; mysql@master> SET GLOBAL read_only = ON; Посмотрим состояние мастера командой «show master status» и запомним значения File и Position (после успешной блокировки мастера они не должны изменятся): Делаем дамп БД, и после завершения операции снимаем блокировку мастера: Переносим дамп на реплику и восстанавливаем из него данные. Посмотрим, как идет репликация командой "show slave status ": Наиболее интересные сейчас значения я выделил. При успешном начале репликации их значения должны быть примерно такими, как в листинге (см. описание команды "show slave status " в документации). Значение Seconds_Behind_Master может быть любым целым числом. Путем этих нехитрых действий мы получаем реплику, данные которой идентичны данным на мастере.
Добавляем репликиПусть у нас уже есть работающие мастер и реплика, и нам нужно добавить к ним еще одну. Сделать это даже проще, чем добавить первую реплику к мастеру. И гораздо приятнее то, что нет необходимости останавливать для этого мастер.Для начала настроим MySQL на второй реплике и убедимся, что мы внесли нужные параметры в конфиг: server-id = 3 replicate-do-db = testdb Теперь остановим репликацию на первой реплике: Реплика продолжит работать нормально, однако данные на ней уже не будут актуальными. Посмотрим статус и запомним позицию мастера, до которой реплика дошла перед остановкой репликации: Нам нужные будет значения Master_Log_File и Exec_Master_Log_Pos: Создадим дамп БД и продолжим репликацию на первой реплике: Восстановим данные из дампа на второй реплике. Затем включим репликацию: Значения MASTER_LOG_FILE и MASTER_LOG_POS — это соответственно значения Master_Log_File и Exec_Master_Log_Pos из результата команды «show slave status » на первой реплике. Объединяем репликиИногда возникает такая ситуация: на мастере существует две БД, одна из которых реплицируется на одной реплике, а вторая — на другой. Как настроить репликацию двух БД на обеих репликах, не делая их дампы на мастере и не выключая его из работы? Достаточно просто, с использованием команды "start slave until ".Итак, у нас имеется master с базами данных testdb1 и testdb2, которые реплицируются соответственно на репликах replica-1 и replica-2. Настроим репликацию обеих БД на replica-1 без остановки мастера. Остановим репликацию на replica-2 командой и запомним позицию мастера: mysql@replica-2> STOP SLAVE; mysql@replica-2> SHOW SLAVE STATUS\G Master_Log_File: mysql-bin.000015 Exec_Master_Log_Pos: 231 Создадим дамп БД testdb2 и возобновим репликацию (на этом манипуляции с replica-2 закончились). Дамп восстановим на replica-1. Ситуация на replica-1 такая: БД testdb1 находится на одной позиции мастера и продолжает реплицироваться, БД testdb2 восстановлена из дампа с другой позиции. Синхронизируем их. Остановим репликацию и запомним позицию мастера: Убедимся, что в конфиге на replica-1 в секции указано имя второй БД: Перезагрузим MySQL, чтобы изменения в конфиге вступили в силу. Кстати, можно было просто перезагрузить MySQL, не останавливая репликацию — из лога мы бы узнали, на какой позиции мастера репликация остановилась. Теперь проведем репликацию с позиции, на которой была приостановлена replica-2 до позиции, на которой мы только что приостановили репликацию: Репликация закончится, как только реплика дойдет до указанной позиции в секции until, после чего обе наши БД будут соответствовать одной и той же позиции мастера (на которой мы остановили репликацию на replica-1). Убедимся в этом: Добавим в конфиг на replica-1 в секции имена обеих БД: Важно: каждая БД должна быть указана на отдельной строке. Рокировка мастера и репликиПереключить реплику в режим мастера бывает необходимо, например, в случае отказа мастера или при проведении на нем технических работ. Для возможности такого переключения необходимо настроить реплику подобно мастеру, или сделать её пассивным мастером .Включим ведение бинарных логов (дополнительно к relay-бинлогам) в конфиге в секции : И добавим пользователя для ведения репликации: Пассивный мастер ведет репликацию как и обычная реплика, но кроме этого создает бинарные логии — то есть, мы можем начать репликацию с него. Убедимся в этом командой "show master status ": Теперь, чтобы перевести пассивный мастер в активный режим, необходимо остановить репликацию на нем и включить репликацию на бывшем активном мастере. Чтобы в момент переключения данные не были утеряны, активный мастер
необходимо заблокировать на запись. ЗаключениеМы немного разобрались в том, как настраивать репликацию в MySQL и выполнять некоторые основные операции. К сожалению, за рамками статьи остались следующие важные вопросы:
Спасибо за внимание! Теги: Добавить метки Репликация - механизм синхронизации содержимого нескольких копий объекта. Под этим процессом понимается копирование данных из одного источника на множество других и наоборот. Обозначения:
Для настройки репликации в MySQL необходимо выполнить ниже описанную последовательность действий, но это не догма и параметры могут изменяться в зависимости от обстоятельств. На главном сервере отредактируем файл файл my.cnf, в секцию mysqld добавить строки: Server-id = log-bin = mysql-bin log-bin-index = mysql-bin.index log-error = mysql-bin.err relay-log = relay-bin relay-log-info-file = relay-bin.info relay-log-index = relay-bin.index expire_logs_days=7 binlog-do-db =
На подчиненном отредактируем файл файл my.cnf, в секцию mysqld добавить строки: Server-id = master-host = master master-user = replication master-password = password master-port = 3306 relay-log = relay-bin relay-log-info-file = relay-log.info relay-log-index = relay-log.index replicate-do-db = На главном сервере добавим пользователя replication с правами на репликацию данных: GRAANT REPLICATION SLAVE ON *.* TO "replication"@"replica" IDENTIFIED BY "password" Заблокируем реплицируемые базы на главном сервере от изменения данных, программно или с помощью функционала MySQL: Mysql@master> FLUSH TABLES WITH READ LOCK; mysql@master> SET GLOBAL read_only = ON; Для разблокировки используется команда: Mysql@master> SET GLOBAL read_only = OFF; Сделаем резервные копии всех баз данных на главном сервере (или тех которые нам необходимы): Root@master# tar -czf mysqldir.tar.gz /var/lib/mysql/ или средствами утилиты mysqldump: Root@master# mysqldump -u root -p --lock-all-tables > dbdump.sql Остановим оба сервера (в отдельных случаях можно обойтись и без этого): Root@master# mysqlamdin -u root -p shutdown root@replica# mysqlamdin -u root -p shutdown Восстановим реплицируемые базы данных на подчиненном сервере с помощью копирования директории. Перед началом репликации базы данных должны быть одинаковы: Root@replica# cd /var/lib/mysql root@replica# tar -xzf mysqldir.tar.gz или функционала mysql, тогда mysql на подчиненном сервере не было необходимости останавливать: Root@replica# mysql -u root -p < dbdump.sql Запустим mysql на главном сервере (а затем - на подчиненном, если это необходимо): Root@master# /etc/init.d/mysql start root@replica# /etc/init.d/mysql start Проверим работы главного и подчиненного серверов: Mysql@replica> start slave; mysql@replica> SHOW SLAVE STATUS\G mysql@master> SHOW MASTER STATUS\G На подчиненном сервере проверить логи в файле master.info, там должны содержаться запросы на изменение данных в базе. Так этот файл бинарный необходимо сначала преобразовать его в текстовый формат: Root@replica# mysqlbinlog master.info > master_info.sql При возникновении ошибок, можно использовать команды: Mysql@replica> stop slave; mysql@replica> RESET SLAVE; mysql@master> RESET MASTER; и повторить все действия начиная с блокировки баз данных. Для горячего добавления серверов репликации можно исользовать синтаксис: Mysql@replica> SHOW SLAVE STATUS\G mysql@master> SHOW MASTER STATUS\G mysql@replica-2> CHANGE MASTER TO MASTER_HOST = "master", MASTER_USER ="replication ", MASTER_PASSWORD = "password ", MASTER_LOG_FILE ="mysql-bin.000004 ", MASTER_LOG_POS = 155; mysql@replica-2> START SLAVE; Информация из статусов покажет позицию и имя текущего файла лога. В случае асинхронной репликации обновление одной реплики распространяется на другие спустя некоторое время, а не в той же транзакции. Таким образом, при асинхронной репликации вводится задержка, или время ожидания, в течение которого отдельные реплики могут быть фактически неидентичными. Но у данного вида репликации есть и положительные моменты: главному серверу не надо беспокоится о синхронизации данных, можно блокировать базу (например, для создания резервной копии) на подчиненной машине, без проблем для пользователей. Список использованный источников
При полном или частичном использовании любых материалов с сайта вы обязаны явным образом указывать ссылку на в качестве источника. В наши дни база данных MySQL используется уже практически везде, где только можно. Невозможно представить сайта, который бы работал без MySQL. Конечно, есть некоторые исключения, но основную часть рынка занимает именно эта система баз данных. И самая популярная из реализаций - MariaDB. Когда проект небольшой, для его работы достаточно одного сервера, на котором расположены все службы: веб-сервер, сервер баз данных и почтовый сервер. Но когда проект становится более большим может понадобится выделить для каждой службы отдельный сервер или даже разделить одну службу на несколько серверов, например, MySQL. Для того чтобы поддерживать синхронное состояние баз данных на всех серверах одновременно нужно использовать репликацию. В этой статье мы рассмотрим как настраивается репликация MySQL с помощью MariaDB Galera Cluster. ЧТО ТАКОЕ MARIADB GALERA?MariaDB Galera - это кластерная система для MariaDB типа master-master. Начиная с MariaDB 10.1 программное обеспечение Galera Server и MariaDB Server поставляются в одном пакете, так что вы получаете все необходимое программное обеспечение сразу. На данный момент MariaDB Galera может работать только с движками баз данных InnoDB и XtraDB. Из преимуществ использования репликации можно отметить добавление избыточности для базы данных сайта. Если одна из баз данных, даст сбой, то вы сразу же сможете переключиться на другой. Все сервера поддерживают синхронизированное состояние между собой и гарантируют отсутствие потерянных транзакций. Основные возможности MariaDB Galera:
НАСТРОЙКА РЕПЛИКАЦИИ MYSQLВ этой инструкции мы будем использовать для примера Ubuntu 16.04 и MariaDB версии 10.1. Перед тем, как начать полностью обновите систему: sudo apt-get update -y Поскольку мы будем развертывать нашу конфигурацию на нескольких узлах, нужно выполнить операции обновления на всех них. Если сервер баз данных MariaDB еще не установлен, его нужно установить. Сначала добавьте репозиторий и его ключ: sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8 sudo add-apt-repository "deb http://ftp.utexas.edu/mariadb/repo/10.1/ubuntu xenial main" sudo apt-get update -y Когда обновление списка пакетов завершено, установите MariaDB командой: sudo apt install mariadb-server rsync -y Пакет rsync нам понадобится для выполнения непосредственно синхронизации. Когда установка будет завершена, вам необходимо защитить базу данных с помощью скрипта mysql_secure_installation: sudo mysql_secure_installation По умолчанию разрешен гостевой вход, есть тестовая база данных, а для пользователя root не задан пароль. Все это надо исправить. Читайте подробнее в статье . Если кратко, то вам нужно будет ответить на несколько вопросов: Enter current password for root (enter for none): Когда все будет готово, можно переходить к настройке нод, между которыми будет выполняться репликация баз данных mysql. Сначала рассмотрим настройку первой ноды. Можно поместить все настройки в my.cnf, но лучше будет создать отдельный файл для этих целей в папке /etc/mysql/conf.d/. Добавьте такие строки:
Здесь адрес 192.168.56.101 - это адрес текущей ноды. Дальше перейдите на другой сервер и создайте там такой же файл: sudo vi /etc/mysql/conf.d/galera.cnf
Аналогично тут адрес ноды - 192.168.0.103. Остановимся на примере с двумя серверами, так как этого достаточно чтобы продемонстрировать работу системы, а добавить еще один сервер вы можете, прописав дополнительный IP адрес в поле wsrep_cluster_address. Теперь рассмотрим что означают значения основных параметров и перейдем к запуску:
Настройка репликации MySQL почти завершена. Остался последний штрих перед запуском - это настройка брандмауэра. Сначала включите инструмент управления правилами iptables в Ubuntu - UFW: Затем откройте такие порты: sudo ufw allow 3306/tcp ЗАПУСК MARIADB GALERAПосле успешной настройки всех нод нам останется только запустить кластер Galera на первой ноде. Перед тем как мы сможем запустить кластер, вам нужно убедиться, что сервис MariaDB остановлен на всех серверах: sudo galera_new_cluster Проверить запущен ли кластер и сколько к нему подключено машин можно командой: Сейчас там только одна машина, теперь перейдите на другой сервер и запустите ноду там: sudo systemctl start mysql Вы можете проверить прошел ли запуск успешно и были ли какие-либо ошибки командой: sudo systemctl status mysql Затем, выполнив ту же команду, вы убедитесь, что новая нода была автоматически добавлена к кластеру: mysql -u root -p -e "show status like "wsrep_cluster_size"" Чтобы проверить как работает репликация просто создайте базу данных на первой ноде и посмотрите действительно ли она была добавлена на всех других: mysql -u root -p MariaDB [(none)]> create database test_db; mysql -u root -p MariaDB [(none)]> show databases; Как видите, действительно база данных автоматически появляется на другой машине. Репликация данных mysql работает. |
Читайте: |
---|
Популярное:
Picmonkey — быстрый онлайн фоторедактор Frames![]() |
Новое
- Телефон службы поддержки киевстар или как позвонить оператору Дополнительная информация по обращению в справочную службу
- Левитирующая колонка красная Будущее, в котором возможны такие технические новинки, уже наступило
- Что такое майнинг криптовалюты простым языком
- Детализация звонков МТС: все способы получения распечатки звонков
- Интеграция виртуальной АТС Zadarma и Zoho CRM
- Цветомузыка на arduino Цветомузыка на микроконтроллере avr
- Настройка VPN-подключения средствами ОС Windows
- Что делать, если Mac греется на Windows Охлаждаем MacBook на Windows
- Ваш Mac начнёт дико тормозить, но это можно избежать
- Какие особенности игры на европейском сервере Archeage