14
ekb.py, Екатеринбург , 10 февраля 2012 года Разработчик Яндекс.Такси Алексей Кирпичников Я не люблю MongoDB

ekbpy'2012 - Алексей Кирпичников - Я не люблю Mongo

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: ekbpy'2012 - Алексей Кирпичников - Я не люблю Mongo

ekb.py, Екатеринбург, 10 февраля 2012 года

Разработчик Яндекс.ТаксиАлексей Кирпичников

Я не люблю MongoDB

Page 2: ekbpy'2012 - Алексей Кирпичников - Я не люблю Mongo

Новые технологии — это ужасно

2

Page 3: ekbpy'2012 - Алексей Кирпичников - Я не люблю Mongo

Яндекс.Такси

3

— нужна доступность 24 / 7 / 365

— из 3 серверов гарантированно работают только 2

— мягкая деградация невозможна

Page 4: ekbpy'2012 - Алексей Кирпичников - Я не люблю Mongo

Мастер-мастер в MySQL

Не бывает.

4

Page 5: ekbpy'2012 - Алексей Кирпичников - Я не люблю Mongo

Мастер-мастер в MySQL

5

taxi_master taxi_slave

session_master1 session_master2

Page 6: ekbpy'2012 - Алексей Кирпичников - Я не люблю Mongo

Мастер-мастер в MySQL

Чем сложнее структура базы, тем больше вероятность фатального сбоя репликации.

6

Page 7: ekbpy'2012 - Алексей Кирпичников - Я не люблю Mongo

bind_layout = { ‘taxi’: { ‘read’: [connect(taxi_master), connect(taxi_slave)], ‘write’: [connect(taxi_master)] }, ‘session’: { ‘read’: [connect(session_m1), connect(session_m2)], ‘write’: [connect(session_m1), connect(session_m2)] }}

Мастер-мастер в SQLAlchemy

7

Page 8: ekbpy'2012 - Алексей Кирпичников - Я не люблю Mongo

def shard_chooser(self, mapper, clause): shard = mapper.class_.__shard__

if str(clause).lower().startswith('select'): op = 'read' else: op = 'write'

return self.choose_db(self.__bind_layout[shard][op])

Мастер-мастер в SQLAlchemy

8

— каждая модель заранее знает, где она хранится

— в read-only попадают только запросы select

Page 9: ekbpy'2012 - Алексей Кирпичников - Я не люблю Mongo

def choose_db(self, connections): available = filter(self.check_db, connections) if not available: raise SQLAlchemyError return available[ ? ]

Мастер-мастер в SQLAlchemy

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

9

Page 10: ekbpy'2012 - Алексей Кирпичников - Я не люблю Mongo

Мастер-мастер в SQLAlchemy

— подсказка должна быть связана с идентификатором записи

— подсказка должна быть одной и той же для каждого набора связанных данных

— подсказка не должна меняться во время транзакции

10

Page 11: ekbpy'2012 - Алексей Кирпичников - Я не люблю Mongo

MySQL ➝ MongoDB

— админы согласны поддерживать

— язык запросов близок к SQL

— есть полноценная схема работы с мультимастером

11

Page 12: ekbpy'2012 - Алексей Кирпичников - Я не люблю Mongo

MongoDB replica sets

12

hostA

hostB

hostC(primary)

клиент

Page 13: ekbpy'2012 - Алексей Кирпичников - Я не люблю Mongo

MongoDB replica sets

13

hostA

hostB(primary)

hostC(dead)

клиент

Page 14: ekbpy'2012 - Алексей Кирпичников - Я не люблю Mongo

Алексей КирпичниковЯндекс.Такси

Вопросы?