SlideShare a Scribd company logo
1 of 21
Download to read offline
Шардинг - что это и как
правильно его готовить.
автор: Дмитрий Фурзенко, Sandstorm NV
О себе:
●
●
●
●
●

в сети известен под ником - Dimonji
python developer over 3+ year expirience
pythonic way в разработке
highload системы
Мои инструменты:
○ Pycharm or Emacs
○ Python
○ Brain
○ И очень много разных python библиотек :)
Где работал/работаю:
c 08.2011 по текущее время - Sandstorm NV
с 05.2009 по 08.2011 ООО Любимое такси, разработчик
программного обеспечения, системный администратор
О чем будет доклад:
● Теория построения шардинга
● SQLAlchemy
● gevent
Ингредиенты для шардинга:
● python 2.7
● SQLAlchemy >= 0.7.9
● MySQL or PostgreSQL
● четкое понимание архитектуры приложения
● немного магии
Зачем нужен шардинг:
● практически бесконечное горизонтальное
масштабирование production платформы
● отказоустойчивость
● более дешевый production
Плюсы:
● горизонтальное масштабирование
● балансировка нагрузки на БД
● более высокая отказоустойчивость
● более низкий downtime
Минусы:
● выборка и обработка всех данных становиться
самым узким местом
● требуется более тщательное проектирование
приложения
● в некоторых моментах приходится пренебрегать т.н
нормальной формой БД
Обобщенные принципы построения:
● все данные которые будут расшардены должны
иметь общий ключ т.н сегмент
● отдельная структура которая будет знать какой
сегмент какому шарду принадлежит
● единый алгоритм распределения сегментов по
шардам
SQLAlchemy
● мощная орм, которая при минимуме усилий
позволяет абстрагировать разработчика от БД и
работать на уровне объектов
● если алхимию неправильно использовать она может
принести много головной боли разработчику
Установка соединения с БД и pool соединений:
● umysqldb
● sqlalchemy.create_engine
● sqlalchemy.orm.sessionmaker
Пример организации соединения с одной
БД
import umysqldb
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

umysqldb.install_as_MySQLdb()
SHARD_ENGINE = { 'engine': 'mysql', 'host': 'localhost', 'name': 'kranonit_shards', 'login': 'root', 'password': ''}
_DSN = '%(engine)s://%(login)s:%(password)s@%(host)s/%(name)s?charset=utf8'

SHARD_CONNECTION = create_engine(
_DSN % SHARD_ENGINE, echo=False, pool_recycle=3600, pool_size=5, max_overflow=0, isolation_level="READ COMMITTED")

SESSION = sessionmaker(bind=SHARD_CONNECTION, autocommit=True)
S_SESSION = SESSION()
Организация соединения с БД для шардовых БД:
● pool соединений к шардовым базам
● shard class
○ shard_chooser
○ query_chooser
○ id_chooser
Пример организации соединения с
шардовыми БД
CONNECTIONS = list()
_DSN = '%(engine)s://%(login)s:%(password)s@%(host)s/%(name)s?charset=utf8'
for shard in S_SESSION.query(Shard).all():
engine = create_engine(
_DSN % {'engine': shard.engine, 'host': shard.host, 'name': shard.name, 'login': shard.login, 'password': shard.password},
echo=False, pool_recycle=3600, pool_size=shard.pool_size, max_overflow=shard.max_overflow, isolation_level=shard.
isolation_level)
CONNECTION[shard.id] = engine
createfunc = sessionmaker(class_=DeepShardedSession, autoflush=False)
scoped = scoped_session(createfunc, scopefunc=getcurrent)
scoped.configure(shards=CONNECTIONS)
session = scoped()
Логика распределения shard
● uuid
● балансировка
● выбор емкости сегментов
○ 1 разряд uuid дает 16 записей на сегмент
○ минимальный ключ для сегмента два разряда
uuid
○ максимальноя количество записей в сегменте
Пример модели для шард
class Shard(SEBase):
__tablename__ = 'shards'
id = Column(Integer, primary_key=True)
engine = Column(String(50), default='mysql')
host = Column(String(255))
login = Column(String(100))
password = Column(String(100))
name = Column(String(100))
pool_size = Column(Integer(3), default=-1)
max_overflow = Column(Integer(3), default=-1)
isolation_level = Column(String(100), default='READ COMMITED')
desc = Column(Text(255))
is_default = Column(Boolean, default=False)
__table_args__ = (
UniqueConstraint('host', 'name', name='_shard_host_name_uc'),
{'mysql_engine': 'InnoDB', 'extend_existing': True, },
)
Пример модели сегментов
class Segment(SEBase):
__tablename__ = 'segments'
id = Column(String(5), primary_key=True)
shard_id = Column(Integer, ForeignKey("shards.id"))
shard = relationship(
Shard, primaryjoin='Shard.id==Segment.shard_id', lazy='joined')
__table_args__ = ({
'mysql_engine': 'InnoDB',
'extend_existing': True,
})
DeepShardedSession пример
class DeepShardedSession(ShardedSession):
def __init__(self, query_cls=DeepShardedQuery, *args, **kwargs):
self.__binds = {}
super(DeepShardedSession, self).__init__(
shard_chooser=self.shard_chooser,
query_chooser=self.query_chooser,
id_chooser=self.id_chooser,
query_cls=query_cls,
*args, **kwargs)
def shard_chooser(self, mapper, instance, clause=None, *args, **kwargs):
“””Здесь описываем по каким критериям мы выбираем необходимый шард”””
pass
def query_chooser(self, query, ident=None):
"""Здесь опираясь на условия запроса определяем на каких шардах его выполнять”””
pass
Почему одна БД плохо

Поток данных

Наша одна
БД
Почему шардинг хорошо
БД 1
БД 2
БД 3

Поток данных

БД 4
БД 5

БД n
Немножко про gevent
Gevent - green event, микропотоки в python
Плюсы
●
●
●

Псевдо многопоточность
Забываем про ужасы callback и deffered из Twisted
пишем код в обычном стиле и двумя строчками делаем его асинхронным

Минусы
●
●
●

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

Применение
●

Практически везде где уместна работа с сетью, потоками и очередями

More Related Content

What's hot

Web осень 2013 лекция 4
Web осень 2013 лекция 4Web осень 2013 лекция 4
Web осень 2013 лекция 4
Technopark
 
TARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИС
TARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИСTARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИС
TARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИС
2ГИС Технологии
 
Knockoutjs на примере 2ГИС-Онлайн
Knockoutjs на примере 2ГИС-ОнлайнKnockoutjs на примере 2ГИС-Онлайн
Knockoutjs на примере 2ГИС-Онлайн
2ГИС Технологии
 
Внутреннее устройство и оптимизация бандла webpack
Внутреннее устройство и оптимизация бандла webpackВнутреннее устройство и оптимизация бандла webpack
Внутреннее устройство и оптимизация бандла webpack
Alexey Ivanov
 
Web осень 2013 лекция 8
Web осень 2013 лекция 8Web осень 2013 лекция 8
Web осень 2013 лекция 8
Technopark
 

What's hot (20)

Basis.js – «под капотом»
Basis.js – «под капотом»Basis.js – «под капотом»
Basis.js – «под капотом»
 
Инструменты разные нужны, инструменты разные важны
Инструменты разные нужны, инструменты разные важныИнструменты разные нужны, инструменты разные важны
Инструменты разные нужны, инструменты разные важны
 
Лекция #6. Введение в Django web-framework
Лекция #6. Введение в Django web-frameworkЛекция #6. Введение в Django web-framework
Лекция #6. Введение в Django web-framework
 
DOM-шаблонизаторы – не только "быстро"
DOM-шаблонизаторы – не только "быстро"DOM-шаблонизаторы – не только "быстро"
DOM-шаблонизаторы – не только "быстро"
 
Баба Яга против!
Баба Яга против!Баба Яга против!
Баба Яга против!
 
Js fuckworks
Js fuckworksJs fuckworks
Js fuckworks
 
Алексей Андросов - Debugger: Отладка кода
Алексей Андросов - Debugger: Отладка кодаАлексей Андросов - Debugger: Отладка кода
Алексей Андросов - Debugger: Отладка кода
 
Web осень 2013 лекция 4
Web осень 2013 лекция 4Web осень 2013 лекция 4
Web осень 2013 лекция 4
 
Не бойся, это всего лишь данные... просто их много
Не бойся, это всего лишь данные... просто их многоНе бойся, это всего лишь данные... просто их много
Не бойся, это всего лишь данные... просто их много
 
JavaScript Базовый. Занятие 07.
JavaScript Базовый. Занятие 07.JavaScript Базовый. Занятие 07.
JavaScript Базовый. Занятие 07.
 
JavaScript Базовый. Занятие 02.
JavaScript Базовый. Занятие 02.JavaScript Базовый. Занятие 02.
JavaScript Базовый. Занятие 02.
 
TARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИС
TARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИСTARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИС
TARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИС
 
Почему Mojolicious?
Почему Mojolicious?Почему Mojolicious?
Почему Mojolicious?
 
Жизнь в изоляции
Жизнь в изоляцииЖизнь в изоляции
Жизнь в изоляции
 
Knockoutjs на примере 2ГИС-Онлайн
Knockoutjs на примере 2ГИС-ОнлайнKnockoutjs на примере 2ГИС-Онлайн
Knockoutjs на примере 2ГИС-Онлайн
 
Ruby - или зачем мне еще один язык программирования?
Ruby - или зачем мне еще один язык программирования?Ruby - или зачем мне еще один язык программирования?
Ruby - или зачем мне еще один язык программирования?
 
Суперсилы Chrome developer tools
Суперсилы Chrome developer toolsСуперсилы Chrome developer tools
Суперсилы Chrome developer tools
 
Внутреннее устройство и оптимизация бандла webpack
Внутреннее устройство и оптимизация бандла webpackВнутреннее устройство и оптимизация бандла webpack
Внутреннее устройство и оптимизация бандла webpack
 
JavaScript Базовый. Занятие 08.
JavaScript Базовый. Занятие 08.JavaScript Базовый. Занятие 08.
JavaScript Базовый. Занятие 08.
 
Web осень 2013 лекция 8
Web осень 2013 лекция 8Web осень 2013 лекция 8
Web осень 2013 лекция 8
 

Similar to Kranonit s16 (python). dmitry furzenko

Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6
Technopark
 
Практика применения Pinba в Badoo / Денис Карасик (Badoo)
Практика применения Pinba в Badoo / Денис Карасик (Badoo)Практика применения Pinba в Badoo / Денис Карасик (Badoo)
Практика применения Pinba в Badoo / Денис Карасик (Badoo)
Ontico
 
GAE - плюсы/минусы/подводные камни
GAE - плюсы/минусы/подводные камниGAE - плюсы/минусы/подводные камни
GAE - плюсы/минусы/подводные камни
Yehor Nazarkin
 
20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov
Computer Science Club
 
Е. Фиделин Безопасность Drupal сайтов
Е. Фиделин Безопасность Drupal сайтовЕ. Фиделин Безопасность Drupal сайтов
Е. Фиделин Безопасность Drupal сайтов
Albina Tiupa
 
08.11 SEMPRO Club - Влад Моргун - Цвет настроения серый
08.11 SEMPRO Club - Влад Моргун - Цвет настроения серый08.11 SEMPRO Club - Влад Моргун - Цвет настроения серый
08.11 SEMPRO Club - Влад Моргун - Цвет настроения серый
Vladislav Morgun
 
Компиляция скриптов PHP. Алексей Романенко
Компиляция скриптов PHP. Алексей РоманенкоКомпиляция скриптов PHP. Алексей Романенко
Компиляция скриптов PHP. Алексей Романенко
Fuenteovejuna
 

Similar to Kranonit s16 (python). dmitry furzenko (20)

Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6
 
php frameworks
php frameworksphp frameworks
php frameworks
 
Практика применения Pinba в Badoo / Денис Карасик (Badoo)
Практика применения Pinba в Badoo / Денис Карасик (Badoo)Практика применения Pinba в Badoo / Денис Карасик (Badoo)
Практика применения Pinba в Badoo / Денис Карасик (Badoo)
 
От Make к Ansible
От Make к AnsibleОт Make к Ansible
От Make к Ansible
 
Безопасность Drupal сайтов
Безопасность Drupal сайтовБезопасность Drupal сайтов
Безопасность Drupal сайтов
 
Mojolicious
MojoliciousMojolicious
Mojolicious
 
Веб-разработка без наркотиков с помощью PostgreSQL, Nginx и c2h5oh / Миша Кир...
Веб-разработка без наркотиков с помощью PostgreSQL, Nginx и c2h5oh / Миша Кир...Веб-разработка без наркотиков с помощью PostgreSQL, Nginx и c2h5oh / Миша Кир...
Веб-разработка без наркотиков с помощью PostgreSQL, Nginx и c2h5oh / Миша Кир...
 
Как мы делаем модули PHP в Badoo – Антон Довгаль
Как мы делаем модули PHP в Badoo – Антон ДовгальКак мы делаем модули PHP в Badoo – Антон Довгаль
Как мы делаем модули PHP в Badoo – Антон Довгаль
 
GAE - плюсы/минусы/подводные камни
GAE - плюсы/минусы/подводные камниGAE - плюсы/минусы/подводные камни
GAE - плюсы/минусы/подводные камни
 
Филипп Торчинский «Анализ производительности и отладка приложений с помощью D...
Филипп Торчинский «Анализ производительности и отладка приложений с помощью D...Филипп Торчинский «Анализ производительности и отладка приложений с помощью D...
Филипп Торчинский «Анализ производительности и отладка приложений с помощью D...
 
20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov
 
Цена ошибки
Цена ошибкиЦена ошибки
Цена ошибки
 
Цена ошибки
Цена ошибкиЦена ошибки
Цена ошибки
 
FrontTalks: Алексей Андросов (Яндекс), «Ошибки, которые мы любим»
FrontTalks: Алексей Андросов (Яндекс), «Ошибки, которые мы любим»FrontTalks: Алексей Андросов (Яндекс), «Ошибки, которые мы любим»
FrontTalks: Алексей Андросов (Яндекс), «Ошибки, которые мы любим»
 
Спецификация WSGI (PEP-333)
Спецификация WSGI (PEP-333)Спецификация WSGI (PEP-333)
Спецификация WSGI (PEP-333)
 
Павел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладкаПавел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладка
 
Е. Фиделин Безопасность Drupal сайтов
Е. Фиделин Безопасность Drupal сайтовЕ. Фиделин Безопасность Drupal сайтов
Е. Фиделин Безопасность Drupal сайтов
 
08.11 SEMPRO Club - Влад Моргун - Цвет настроения серый
08.11 SEMPRO Club - Влад Моргун - Цвет настроения серый08.11 SEMPRO Club - Влад Моргун - Цвет настроения серый
08.11 SEMPRO Club - Влад Моргун - Цвет настроения серый
 
Jbreak 2016: Твой личный Spring Boot Starter
Jbreak 2016: Твой личный Spring Boot StarterJbreak 2016: Твой личный Spring Boot Starter
Jbreak 2016: Твой личный Spring Boot Starter
 
Компиляция скриптов PHP. Алексей Романенко
Компиляция скриптов PHP. Алексей РоманенкоКомпиляция скриптов PHP. Алексей Романенко
Компиляция скриптов PHP. Алексей Романенко
 

More from Krivoy Rog IT Community

Kranonit S18 Chernomorov Vasiliy "Как создать игру и не сойти с ума "
Kranonit S18 Chernomorov Vasiliy "Как создать игру и не сойти с ума "Kranonit S18 Chernomorov Vasiliy "Как создать игру и не сойти с ума "
Kranonit S18 Chernomorov Vasiliy "Как создать игру и не сойти с ума "
Krivoy Rog IT Community
 
kranonit S12E02 Артур Титов: Юзабилити форм
kranonit S12E02 Артур Титов: Юзабилити формkranonit S12E02 Артур Титов: Юзабилити форм
kranonit S12E02 Артур Титов: Юзабилити форм
Krivoy Rog IT Community
 
kranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Java
kranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Javakranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Java
kranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Java
Krivoy Rog IT Community
 
kranonit S10E01 Андрей Бабак- Запускаем стартап
kranonit S10E01 Андрей Бабак- Запускаем стартапkranonit S10E01 Андрей Бабак- Запускаем стартап
kranonit S10E01 Андрей Бабак- Запускаем стартап
Krivoy Rog IT Community
 
kranonit S07E01 Евгений Василенко: Методы криптографической защиты информации
kranonit S07E01 Евгений Василенко: Методы криптографической защиты информацииkranonit S07E01 Евгений Василенко: Методы криптографической защиты информации
kranonit S07E01 Евгений Василенко: Методы криптографической защиты информации
Krivoy Rog IT Community
 
kranonit S06E02 Артём Юрков: Как все успеть и не слететь с катушек
kranonit S06E02 Артём Юрков: Как все успеть и не слететь с катушекkranonit S06E02 Артём Юрков: Как все успеть и не слететь с катушек
kranonit S06E02 Артём Юрков: Как все успеть и не слететь с катушек
Krivoy Rog IT Community
 
kranonit S06E01 Игорь Цинько: High load
kranonit S06E01 Игорь Цинько: High loadkranonit S06E01 Игорь Цинько: High load
kranonit S06E01 Игорь Цинько: High load
Krivoy Rog IT Community
 
kranonit S05E01 Sergey Burma: Welcome to cloud!
kranonit S05E01 Sergey Burma: Welcome to cloud!kranonit S05E01 Sergey Burma: Welcome to cloud!
kranonit S05E01 Sergey Burma: Welcome to cloud!
Krivoy Rog IT Community
 
kranonit S04E02 Кирил Jstor: Hacking .NET applications
kranonit S04E02 Кирил Jstor: Hacking .NET applicationskranonit S04E02 Кирил Jstor: Hacking .NET applications
kranonit S04E02 Кирил Jstor: Hacking .NET applications
Krivoy Rog IT Community
 
kranonit S04E01 Антон: Защита от Master Boot Record Locker
kranonit S04E01 Антон: Защита от Master Boot Record Lockerkranonit S04E01 Антон: Защита от Master Boot Record Locker
kranonit S04E01 Антон: Защита от Master Boot Record Locker
Krivoy Rog IT Community
 
kranonit S03E01 Эдуард Лобас: Freelance
kranonit S03E01 Эдуард Лобас: Freelancekranonit S03E01 Эдуард Лобас: Freelance
kranonit S03E01 Эдуард Лобас: Freelance
Krivoy Rog IT Community
 
kranonit S07E02 nixoid: Будущее электронных денег
kranonit S07E02 nixoid: Будущее электронных денегkranonit S07E02 nixoid: Будущее электронных денег
kranonit S07E02 nixoid: Будущее электронных денег
Krivoy Rog IT Community
 
kranonit S02E02 Стас Чирва: Unity3D Разработка казуальных и социальных игр
kranonit S02E02 Стас Чирва: Unity3D Разработка казуальных и социальных игрkranonit S02E02 Стас Чирва: Unity3D Разработка казуальных и социальных игр
kranonit S02E02 Стас Чирва: Unity3D Разработка казуальных и социальных игр
Krivoy Rog IT Community
 
kranonit S02E01 Дмитрий Свириденко- HTML5: Поздравляю, ты в новой реальности
kranonit S02E01 Дмитрий Свириденко- HTML5: Поздравляю, ты в новой реальностиkranonit S02E01 Дмитрий Свириденко- HTML5: Поздравляю, ты в новой реальности
kranonit S02E01 Дмитрий Свириденко- HTML5: Поздравляю, ты в новой реальности
Krivoy Rog IT Community
 

More from Krivoy Rog IT Community (20)

Kranonit S18 Pavlov Evgeniy
Kranonit S18 Pavlov Evgeniy Kranonit S18 Pavlov Evgeniy
Kranonit S18 Pavlov Evgeniy
 
Kranonit S18 Chernomorov Vasiliy "Как создать игру и не сойти с ума "
Kranonit S18 Chernomorov Vasiliy "Как создать игру и не сойти с ума "Kranonit S18 Chernomorov Vasiliy "Как создать игру и не сойти с ума "
Kranonit S18 Chernomorov Vasiliy "Как создать игру и не сойти с ума "
 
Kranonit S18 Lobova Elena
Kranonit S18 Lobova ElenaKranonit S18 Lobova Elena
Kranonit S18 Lobova Elena
 
Kranonit s16 (python). sergey burma
Kranonit s16 (python). sergey burmaKranonit s16 (python). sergey burma
Kranonit s16 (python). sergey burma
 
Kranonit sponsorskoe predlozhenie
Kranonit sponsorskoe predlozhenieKranonit sponsorskoe predlozhenie
Kranonit sponsorskoe predlozhenie
 
kranonit S14E02 Серёжа Пономарёв: kranonit’у уже год. Полёт нормальный?
kranonit S14E02 Серёжа Пономарёв: kranonit’у уже год. Полёт нормальный?kranonit S14E02 Серёжа Пономарёв: kranonit’у уже год. Полёт нормальный?
kranonit S14E02 Серёжа Пономарёв: kranonit’у уже год. Полёт нормальный?
 
kranonit S14E01 Эдуард Лобас Management & IT Industry
kranonit S14E01 Эдуард Лобас Management & IT Industrykranonit S14E01 Эдуард Лобас Management & IT Industry
kranonit S14E01 Эдуард Лобас Management & IT Industry
 
kranonit S12E02 Артур Титов: Юзабилити форм
kranonit S12E02 Артур Титов: Юзабилити формkranonit S12E02 Артур Титов: Юзабилити форм
kranonit S12E02 Артур Титов: Юзабилити форм
 
kranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Java
kranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Javakranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Java
kranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Java
 
kranonit S10E01 Андрей Бабак- Запускаем стартап
kranonit S10E01 Андрей Бабак- Запускаем стартапkranonit S10E01 Андрей Бабак- Запускаем стартап
kranonit S10E01 Андрей Бабак- Запускаем стартап
 
kranonit S07E01 Евгений Василенко: Методы криптографической защиты информации
kranonit S07E01 Евгений Василенко: Методы криптографической защиты информацииkranonit S07E01 Евгений Василенко: Методы криптографической защиты информации
kranonit S07E01 Евгений Василенко: Методы криптографической защиты информации
 
kranonit S06E02 Артём Юрков: Как все успеть и не слететь с катушек
kranonit S06E02 Артём Юрков: Как все успеть и не слететь с катушекkranonit S06E02 Артём Юрков: Как все успеть и не слететь с катушек
kranonit S06E02 Артём Юрков: Как все успеть и не слететь с катушек
 
kranonit S06E01 Игорь Цинько: High load
kranonit S06E01 Игорь Цинько: High loadkranonit S06E01 Игорь Цинько: High load
kranonit S06E01 Игорь Цинько: High load
 
kranonit S05E01 Sergey Burma: Welcome to cloud!
kranonit S05E01 Sergey Burma: Welcome to cloud!kranonit S05E01 Sergey Burma: Welcome to cloud!
kranonit S05E01 Sergey Burma: Welcome to cloud!
 
kranonit S04E02 Кирил Jstor: Hacking .NET applications
kranonit S04E02 Кирил Jstor: Hacking .NET applicationskranonit S04E02 Кирил Jstor: Hacking .NET applications
kranonit S04E02 Кирил Jstor: Hacking .NET applications
 
kranonit S04E01 Антон: Защита от Master Boot Record Locker
kranonit S04E01 Антон: Защита от Master Boot Record Lockerkranonit S04E01 Антон: Защита от Master Boot Record Locker
kranonit S04E01 Антон: Защита от Master Boot Record Locker
 
kranonit S03E01 Эдуард Лобас: Freelance
kranonit S03E01 Эдуард Лобас: Freelancekranonit S03E01 Эдуард Лобас: Freelance
kranonit S03E01 Эдуард Лобас: Freelance
 
kranonit S07E02 nixoid: Будущее электронных денег
kranonit S07E02 nixoid: Будущее электронных денегkranonit S07E02 nixoid: Будущее электронных денег
kranonit S07E02 nixoid: Будущее электронных денег
 
kranonit S02E02 Стас Чирва: Unity3D Разработка казуальных и социальных игр
kranonit S02E02 Стас Чирва: Unity3D Разработка казуальных и социальных игрkranonit S02E02 Стас Чирва: Unity3D Разработка казуальных и социальных игр
kranonit S02E02 Стас Чирва: Unity3D Разработка казуальных и социальных игр
 
kranonit S02E01 Дмитрий Свириденко- HTML5: Поздравляю, ты в новой реальности
kranonit S02E01 Дмитрий Свириденко- HTML5: Поздравляю, ты в новой реальностиkranonit S02E01 Дмитрий Свириденко- HTML5: Поздравляю, ты в новой реальности
kranonit S02E01 Дмитрий Свириденко- HTML5: Поздравляю, ты в новой реальности
 

Kranonit s16 (python). dmitry furzenko

  • 1. Шардинг - что это и как правильно его готовить. автор: Дмитрий Фурзенко, Sandstorm NV
  • 2. О себе: ● ● ● ● ● в сети известен под ником - Dimonji python developer over 3+ year expirience pythonic way в разработке highload системы Мои инструменты: ○ Pycharm or Emacs ○ Python ○ Brain ○ И очень много разных python библиотек :)
  • 3. Где работал/работаю: c 08.2011 по текущее время - Sandstorm NV с 05.2009 по 08.2011 ООО Любимое такси, разработчик программного обеспечения, системный администратор
  • 4. О чем будет доклад: ● Теория построения шардинга ● SQLAlchemy ● gevent
  • 5. Ингредиенты для шардинга: ● python 2.7 ● SQLAlchemy >= 0.7.9 ● MySQL or PostgreSQL ● четкое понимание архитектуры приложения ● немного магии
  • 6. Зачем нужен шардинг: ● практически бесконечное горизонтальное масштабирование production платформы ● отказоустойчивость ● более дешевый production
  • 7. Плюсы: ● горизонтальное масштабирование ● балансировка нагрузки на БД ● более высокая отказоустойчивость ● более низкий downtime
  • 8. Минусы: ● выборка и обработка всех данных становиться самым узким местом ● требуется более тщательное проектирование приложения ● в некоторых моментах приходится пренебрегать т.н нормальной формой БД
  • 9. Обобщенные принципы построения: ● все данные которые будут расшардены должны иметь общий ключ т.н сегмент ● отдельная структура которая будет знать какой сегмент какому шарду принадлежит ● единый алгоритм распределения сегментов по шардам
  • 10. SQLAlchemy ● мощная орм, которая при минимуме усилий позволяет абстрагировать разработчика от БД и работать на уровне объектов ● если алхимию неправильно использовать она может принести много головной боли разработчику
  • 11. Установка соединения с БД и pool соединений: ● umysqldb ● sqlalchemy.create_engine ● sqlalchemy.orm.sessionmaker
  • 12. Пример организации соединения с одной БД import umysqldb from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker umysqldb.install_as_MySQLdb() SHARD_ENGINE = { 'engine': 'mysql', 'host': 'localhost', 'name': 'kranonit_shards', 'login': 'root', 'password': ''} _DSN = '%(engine)s://%(login)s:%(password)s@%(host)s/%(name)s?charset=utf8' SHARD_CONNECTION = create_engine( _DSN % SHARD_ENGINE, echo=False, pool_recycle=3600, pool_size=5, max_overflow=0, isolation_level="READ COMMITTED") SESSION = sessionmaker(bind=SHARD_CONNECTION, autocommit=True) S_SESSION = SESSION()
  • 13. Организация соединения с БД для шардовых БД: ● pool соединений к шардовым базам ● shard class ○ shard_chooser ○ query_chooser ○ id_chooser
  • 14. Пример организации соединения с шардовыми БД CONNECTIONS = list() _DSN = '%(engine)s://%(login)s:%(password)s@%(host)s/%(name)s?charset=utf8' for shard in S_SESSION.query(Shard).all(): engine = create_engine( _DSN % {'engine': shard.engine, 'host': shard.host, 'name': shard.name, 'login': shard.login, 'password': shard.password}, echo=False, pool_recycle=3600, pool_size=shard.pool_size, max_overflow=shard.max_overflow, isolation_level=shard. isolation_level) CONNECTION[shard.id] = engine createfunc = sessionmaker(class_=DeepShardedSession, autoflush=False) scoped = scoped_session(createfunc, scopefunc=getcurrent) scoped.configure(shards=CONNECTIONS) session = scoped()
  • 15. Логика распределения shard ● uuid ● балансировка ● выбор емкости сегментов ○ 1 разряд uuid дает 16 записей на сегмент ○ минимальный ключ для сегмента два разряда uuid ○ максимальноя количество записей в сегменте
  • 16. Пример модели для шард class Shard(SEBase): __tablename__ = 'shards' id = Column(Integer, primary_key=True) engine = Column(String(50), default='mysql') host = Column(String(255)) login = Column(String(100)) password = Column(String(100)) name = Column(String(100)) pool_size = Column(Integer(3), default=-1) max_overflow = Column(Integer(3), default=-1) isolation_level = Column(String(100), default='READ COMMITED') desc = Column(Text(255)) is_default = Column(Boolean, default=False) __table_args__ = ( UniqueConstraint('host', 'name', name='_shard_host_name_uc'), {'mysql_engine': 'InnoDB', 'extend_existing': True, }, )
  • 17. Пример модели сегментов class Segment(SEBase): __tablename__ = 'segments' id = Column(String(5), primary_key=True) shard_id = Column(Integer, ForeignKey("shards.id")) shard = relationship( Shard, primaryjoin='Shard.id==Segment.shard_id', lazy='joined') __table_args__ = ({ 'mysql_engine': 'InnoDB', 'extend_existing': True, })
  • 18. DeepShardedSession пример class DeepShardedSession(ShardedSession): def __init__(self, query_cls=DeepShardedQuery, *args, **kwargs): self.__binds = {} super(DeepShardedSession, self).__init__( shard_chooser=self.shard_chooser, query_chooser=self.query_chooser, id_chooser=self.id_chooser, query_cls=query_cls, *args, **kwargs) def shard_chooser(self, mapper, instance, clause=None, *args, **kwargs): “””Здесь описываем по каким критериям мы выбираем необходимый шард””” pass def query_chooser(self, query, ident=None): """Здесь опираясь на условия запроса определяем на каких шардах его выполнять””” pass
  • 19. Почему одна БД плохо Поток данных Наша одна БД
  • 20. Почему шардинг хорошо БД 1 БД 2 БД 3 Поток данных БД 4 БД 5 БД n
  • 21. Немножко про gevent Gevent - green event, микропотоки в python Плюсы ● ● ● Псевдо многопоточность Забываем про ужасы callback и deffered из Twisted пишем код в обычном стиле и двумя строчками делаем его асинхронным Минусы ● ● ● сложно профилировать не все библиотеки можно им пропатчить требует определенных навыков в использовании Применение ● Практически везде где уместна работа с сетью, потоками и очередями