Top Banner
MySQL репликация Serge Tyatin Full-stack web developer
25

Mysql replication

Apr 13, 2017

Download

Data & Analytics

Serge Tyatin
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Mysql replication

MySQL репликацияSerge Tyatin Full-stack web developer

Page 2: Mysql replication

Что такое репликация и зачем она нужна

Page 3: Mysql replication

РепликацияКак могла бы быть устроена ?

Page 4: Mysql replication

Устройство Mysql репликации Master -> Slave

• MASTER запиcывает изменения в “binary-log”

• SLAVE подключается к MASTER как клиент

• SLAVE скачивает “binary-log” в “replication-log”

• SLAVE последовательно выполняет изменения из “replication-log”

Page 5: Mysql replication

MASTER запиcывает изменения в “binary-log”

http://mysql.2rba.com:1715

Page 6: Mysql replication

> show master status\G

Page 7: Mysql replication

binlog_format

• STATEMENT

• ROW

• MIXEDPrior to MySQL 5.7.7, statement-based logging format was the default. In MySQL 5.7.7 and later, row-based logging format is the default.

Page 8: Mysql replication

mysqlbinlog

$ cd /var/log/mysql $ mysqlbinlog mysql-bin.000004

Page 9: Mysql replication

Настройка Репликации

CHANGE MASTER TO MASTER_HOST='localhost', MASTER_USER='root', MASTER_PASSWORD='q12345'

MASTER my.cnfserver_id = 1

SLAVE my.cnfserver_id = 2

log_bin = /var/log/mysql/mysql-bin.log

Page 10: Mysql replication

show slave status\G

Page 11: Mysql replication

SLAVE START;

Page 12: Mysql replication

SLAVE подключается к MASTER как клиент

master> show processlist;

slave> show processlist;

Page 13: Mysql replication

Проблемы• Два лога транзакций на мастере • Остановка репликации

• проблема в логе • проблема в отличии структур или данных

Page 14: Mysql replication

Как починить SLAVE

Исправить данные на SLAVE и запустить SLAVE

slave start;

Page 15: Mysql replication

SET GLOBAL sql_slave_skip_counter = 1;

Page 16: Mysql replication

Особенности

• Настройка баз/таблиц для записи в binary_log

• Настройка баз/таблиц для чтения из replication_log

• Ключи/формат/тип могут не совпадать

Page 17: Mysql replication

Пример настройки репликации

Таблица

Page 18: Mysql replication

Пример настройки репликации

Таблица Облегченная Таблица

Page 19: Mysql replication

Пример настройки репликации CREATE TRIGGER `table_insert` AFTER INSERT ON table FOR EACH ROW BEGIN if (‘active’=NEW.status) THEN INSERT INTO table Set id = NEW.id, …. END IF; END;

CREATE TRIGGER `table_delete` AFTER DELETE ON table FOR EACH ROW BEGIN DELETE FROM table where id=OLD.id; END;

CREATE TRIGGER `table_update` AFTER UPDATE ON table FOR EACH ROW BEGIN if (‘active’=NEW.status) THEN UPDATE table SET status=NEW.status, … WHERE id = NEW.id; ELSE DELETE FROM table where id=NEW.id; END IF; END;

Page 20: Mysql replication

Использование истории транзакций

• backup

• audit

• troubleshooting

Page 21: Mysql replication

Поиск ошибки

В базе появилась ошибка Необходимо выяснить как была создана запись в таблице payments с id=92346

bin-log файлы находятся в /log

Page 22: Mysql replication

Source

class Promo < ActiveRecord::Base belongs_to :payment def self.redeem(code) transaction do promo = where(code: code, is_used: false).first if promo promo.payment = Payment.create(amount: promo.amount) promo.is_used = true promo.save! end end endend

Page 23: Mysql replication

class Promo < ActiveRecord::Base belongs_to :payment def self.redeem(code) transaction do promo = where(code: code, is_used: false).first if promo promo.payment = Payment.create(amount: promo.amount) promo.is_used = true promo.save! end end endend

INSERT INTO `payments` (`amount`, `created_at`, `updated_at`) VALUES (12, '2016-02-11 21:12:56', '2016-02-11 21:12:56’) UPDATE `promos` SET `payment_id` = 92346, `is_used` = 1, `updated_at` = '2016-02-11 21:12:56' WHERE `promos`.`id` = 16460 INSERT INTO `payments` (`amount`, `created_at`, `updated_at`) VALUES (12, '2016-02-11 21:12:56', '2016-02-11 21:12:56’) UPDATE `promos` SET `payment_id` = 92347, `is_used` = 1, `updated_at` = '2016-02-11 21:12:56' WHERE `promos`.`id` = 16460

Page 24: Mysql replication

Решение

• Optimistic Locking • field lock_version

• Pessimistic Locking promo = where(code: code, is_used: false).lock(true).first

promo.lock!if promo && !promo.is_used

Page 25: Mysql replication

Спасибо

Serge Tyatin [email protected] skype: tyatin