O slideshow foi denunciado.
Utilizamos seu perfil e dados de atividades no LinkedIn para personalizar e exibir anúncios mais relevantes. Altere suas preferências de anúncios quando desejar.
MySQL репликация
Serge Tyatin Full-stack web developer
Что такое репликация и
зачем она нужна
Репликация
Как могла бы быть устроена ?
Устройство Mysql репликации
Master -> Slave
• MASTER запиcывает изменения в “binary-log” 

• SLAVE подключается к MASTER к...
MASTER запиcывает изменения в
“binary-log”
http://mysql.2rba.com:1715
> show master statusG
binlog_format
• STATEMENT
• ROW
• MIXED
Prior to MySQL 5.7.7, statement-based
logging format was the default. In
MySQL 5.7...
mysqlbinlog
$ cd /var/log/mysql
$ mysqlbinlog mysql-bin.000004
Настройка Репликации
CHANGE MASTER TO MASTER_HOST='localhost',
MASTER_USER='root', MASTER_PASSWORD='q12345'
MASTER my.cnf
...
show slave statusG
SLAVE START;
SLAVE подключается к MASTER как
клиент
master> show processlist;
slave> show processlist;
Проблемы
• Два лога транзакций на мастере
• Остановка репликации
• проблема в логе
• проблема в отличии структур или данных
Как починить SLAVE
Исправить данные на SLAVE и
запустить SLAVE
slave start;
SET GLOBAL
sql_slave_skip_counter = 1;
Особенности
• Настройка баз/таблиц для записи в binary_log
• Настройка баз/таблиц для чтения из replication_log
• Ключи/фо...
Пример настройки
репликации
Таблица
Пример настройки
репликации
Таблица Облегченная Таблица
Пример настройки репликации
CREATE TRIGGER `table_insert` AFTER INSERT ON table
FOR EACH ROW BEGIN
if (‘active’=NEW.status...
Использование истории транзакций
• backup
• audit
• troubleshooting
Поиск ошибки
В базе появилась ошибка
Необходимо выяснить как была создана запись
в таблице payments с id=92346
bin-log фай...
Source
class Promo < ActiveRecord::Base

belongs_to :payment



def self.redeem(code)

transaction do

promo = where(code:...
class Promo < ActiveRecord::Base

belongs_to :payment



def self.redeem(code)

transaction do

promo = where(code: code, ...
Решение
• Optimistic Locking
• field lock_version
• Pessimistic Locking
promo = where(code: code, is_used: false).lock(true...
Спасибо
Serge Tyatin
700@2rba.com
skype: tyatin
Próximos SlideShares
Carregando em…5
×

Mysql replication

264 visualizações

Publicada em

mysql replication
how to

Publicada em: Dados e análise
  • Login to see the comments

Mysql replication

  1. 1. MySQL репликация Serge Tyatin Full-stack web developer
  2. 2. Что такое репликация и зачем она нужна
  3. 3. Репликация Как могла бы быть устроена ?
  4. 4. Устройство Mysql репликации Master -> Slave • MASTER запиcывает изменения в “binary-log” 
 • SLAVE подключается к MASTER как клиент 
 • SLAVE скачивает “binary-log” в “replication-log” 
 • SLAVE последовательно выполняет изменения из “replication-log”
  5. 5. MASTER запиcывает изменения в “binary-log” http://mysql.2rba.com:1715
  6. 6. > show master statusG
  7. 7. binlog_format • STATEMENT • ROW • MIXED Prior 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.
  8. 8. mysqlbinlog $ cd /var/log/mysql $ mysqlbinlog mysql-bin.000004
  9. 9. Настройка Репликации CHANGE MASTER TO MASTER_HOST='localhost', MASTER_USER='root', MASTER_PASSWORD='q12345' MASTER my.cnf server_id = 1 SLAVE my.cnf server_id = 2 log_bin = /var/log/mysql/mysql-bin.log
  10. 10. show slave statusG
  11. 11. SLAVE START;
  12. 12. SLAVE подключается к MASTER как клиент master> show processlist; slave> show processlist;
  13. 13. Проблемы • Два лога транзакций на мастере • Остановка репликации • проблема в логе • проблема в отличии структур или данных
  14. 14. Как починить SLAVE Исправить данные на SLAVE и запустить SLAVE slave start;
  15. 15. SET GLOBAL sql_slave_skip_counter = 1;
  16. 16. Особенности • Настройка баз/таблиц для записи в binary_log • Настройка баз/таблиц для чтения из replication_log • Ключи/формат/тип могут не совпадать
  17. 17. Пример настройки репликации Таблица
  18. 18. Пример настройки репликации Таблица Облегченная Таблица
  19. 19. Пример настройки репликации 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;
  20. 20. Использование истории транзакций • backup • audit • troubleshooting
  21. 21. Поиск ошибки В базе появилась ошибка Необходимо выяснить как была создана запись в таблице payments с id=92346 bin-log файлы находятся в /log
  22. 22. 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
 end
 end

  23. 23. 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
 end
 end 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
  24. 24. Решение • Optimistic Locking • field lock_version • Pessimistic Locking promo = where(code: code, is_used: false).lock(true).first promo.lock!
 if promo && !promo.is_used
  25. 25. Спасибо Serge Tyatin 700@2rba.com skype: tyatin

×