ekbpy'2012 - Алексей Кирпичников - Я не люблю mongo
DESCRIPTION
TRANSCRIPT
ekb.py, Екатеринбург, 10 февраля 2012 года
Разработчик Яндекс.ТаксиАлексей Кирпичников
Я не люблю MongoDB
Новые технологии — это ужасно
2
Яндекс.Такси
3
— нужна доступность 24 / 7 / 365
— из 3 серверов гарантированно работают только 2
— мягкая деградация невозможна
Мастер-мастер в MySQL
Не бывает.
4
Мастер-мастер в MySQL
5
taxi_master taxi_slave
session_master1 session_master2
Мастер-мастер в MySQL
Чем сложнее структура базы, тем больше вероятность фатального сбоя репликации.
6
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
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
def choose_db(self, connections): available = filter(self.check_db, connections) if not available: raise SQLAlchemyError return available[ ? ]
Мастер-мастер в SQLAlchemy
Нельзя просто так выбирать из двух мастеров, иначе рано или поздно возникнет проблема с репликацией.
9
Мастер-мастер в SQLAlchemy
— подсказка должна быть связана с идентификатором записи
— подсказка должна быть одной и той же для каждого набора связанных данных
— подсказка не должна меняться во время транзакции
10
MySQL ➝ MongoDB
— админы согласны поддерживать
— язык запросов близок к SQL
— есть полноценная схема работы с мультимастером
11
MongoDB replica sets
12
hostA
hostB
hostC(primary)
клиент
MongoDB replica sets
13
hostA
hostB(primary)
hostC(dead)
клиент
Алексей КирпичниковЯндекс.Такси
Вопросы?