SlideShare uma empresa Scribd logo
1 de 44
Baixar para ler offline
Класс!ная Cassandra

Олег Анастасьев

ведущий разработчик,
Одноклассники.ру
> 6 M онлайн

  290 000 страниц/сек,
   20 ms на страницу
     >240 Гбит/сек


> 5 000 серверов в 4 ЦОД
       99.9% java
Cassandra @
    Оценки фото

    Класс!

    Архив сообщений

    ... и много других
Введение в Cassandra
     ( сильно упрощенное )
Cassandra
- Кластер, gossip                                                         - Масштабирование,
- Партиционирование по ключу                     0                            восстановление на ходу
- Высокая доступность
- Поддержка нескольких ЦОД                                                - Не нужны бакапы

                               Строки токен(к)         Строки токен(к)

                                   192-...                     0-63
                                                                                R1
                         192                                             64
                    R3
                               Строки токен(к)         Строки токен(к)

                                  128-191                  64-127


                                                 128
                                                          R2
Запись в кластер
                               0
     THRIFT


                   Изменение


          192                      64


  Hint
Storage



                           128
Запись в кластер
                               0
     THRIFT


                   Изменение


          192                      64


  Hint
Storage



                           128
Чтение из кластера
                                    0

                   Данные
resolved
 result

                              Хэш

           192                               64


                          Неправильный хэш


            Read Repair

                                  128
Column Family
                 Порядок
Таблица “Х”
  Ключ           name0:byte[]            ...   nameN:byte[]
  byte[]         value0:byte[]                 valueN:byte[]
                 timestamp0:long               timestampN:long


Таблица “Х”
  Ключ           name0:byte[]            ...   nameK:byte[]
       Порядок




                                   ...
Запись изнутри
  Write (Key, Column)              name        value      ts
                                                                                Commit Log

                                                  Memtable

      Flusher Thread
                                                       записывает

                               SSTable 1         SSTable 2          SSTable 3   SSTable 4


    Compaction Thread                      Сортировка слиянием


                                                   SSTable 5

Запись на диск всегда последовательная!
Чтение изнутри
                                                     name     value     ts

                             часть данных 1
resolve

                                                             Memtable
                                       часть 2


               часть 3



          SSTable 1          SSTable 4           SSTable 5



               -   get( Key, columnNames ... )
               -   slice( Key, from, to, count, direction )
               -   key_range( fromKey, toKey, count, slice(...) )
Анатомия SSTable
   SSTable-5-Filter.db                   SSTable-5-Index.db                  SSTable-5-Data.db

                                                                                  Данные

     Блум - фильтр                      Ключ => Смещение                    Строки и Колонки

“Строка, возможно, есть”
                                                                              По-строчные
     Всегда в ОЗУ                                                            блум фильтры и
                                                                                индексы
                                                                                   для
                                                                             длинных строк


     Что дает:             - НОЛЬ чтений с диска, если строки нет и вам повезло
                           - 1 чтение, если строки нет и не повезло
                           - 2 чтения с диска для маленьких строк
                           - 3 чтения - для больших
Разрешение конфликтов
SSTable “AccountStatements-3456”              Memtable “AccountStatements”
RowKey = “Oleg_Anastasyev”                    RowKey = “Oleg_Anastasyev”

Column=”LV05HABA95142357516”                  Column=”LV05HABA95142357516”
                                         vs
Value= $1,000,000                             Value= $10




                               Какое состояние верно ?
Разрешение конфликтов
SSTable “AccStatements-3456”               Memtable
RowKey = “Oleg_Anastasyev”                 RowKey = “Oleg_Anastasyev”

Column=”LV05HABA95142357516”               Column=”LV05HABA95142357516”
                                      vs
Value= $1,000,000                          Value= $10

Timestamp = 13:00:05                       Timestamp = 13:00:01


                       С более свежим timestamp
                                   .
Потерянная модификация
                                         $10


1. Читаем AccountStatement Key=”Oleg”
                                               1. Читаем AccountStatement Key=”Oleg”
           (получили $10, TS=12:00:00)
                                                     (получили $10, TS=12:00:00)
                   2. Взнос $1,000,000

            3. Сохраняем Key=”Oleg”,           2. Снимаем $1
                    Value=$1,000,010
                     TS=12:00:01.000           3. Сохраняем Key=”Oleg”,
                                                            Value=$9
                                                            TS=12:00:01.005


                                          $9
Итог таков
Преимущества:                                  Недостатки:

• Высокая и стабильная скорость записи         • Нет ACID, нет откатов
                                               • Нет детектора конфликтов
• Очень быстрое чтение отсутсвующего ключа     • NoSQL => нет JOIN
• Скорость чтения не зависит от объема                 О запросах думать зараннее
• Сортированные данные на диске                        Денормализация данных

• Нет 1 точки отказа
• Высокая доступность
• Масштабирование и восстановление данных на
  ходу
• Резервное копирование не нужно
• Эффективная эксплуатация в нескольких ЦОД
Устали от теории ?
Классная задачка
Класс! 4256
Классная задачка
Класс! 4256   Вы и 4256
Классная задачка
Класс! 4256   Вы и 4256
Классная задачка
  таблица
 RefId:long                RefType:byte     UserId:long    Created

 9999999999                STATUS(2)        11111111111    11:00



  запросы
– COUNT ( RefId,RefType=? ): 80% => 0                      Вы и 4256
– EXISTS( RefId,RefType,UserId=? ): 98% => Нет
– RefId,RefType=? ORDER BY Created DESC -- кто классил ?
Классная задачка
  таблица
 RefId:long                RefType:byte           UserId:long   Created

 9999999999                STATUS(2)              11111111111   11:00



  запросы
– COUNT ( RefId,RefType=? ): 80% => 0                           Вы и 4256
– EXISTS( RefId,RefType,UserId=? ): 98% => Нет
– RefId,RefType=? ORDER BY Created DESC -- кто классил ?




                                          как то скучно ...
Классная задача
Классная задача
Классная задача




x8
Классная проблема
 таблица
RefId:long              RefType:byte     UserId:long     Created
9999999999              STATUS(2)        11111111111     11:00


 нагрузка 8х
   – 16 миллиардов показов в день (~ 300 000/сек)
   – 100 M класс!ов в день ( ~ 2500/сек )
   – 2TB данных
новый запрос
   – RefId,RefType=? ORDER BY ДрузьяСверху
длинный хвост
   – 40% EXISTS(RefId,UserId) не кешируются в принципе
Классная проблема
уже есть:
            – 8 SQL кластеров (без учета резерва)
            – 12 кешей (увеличение количества большого эффекта не дает)
            – И они близки к пределу по CPU, дисковым операциям


                        А мы хотим в 8 раз больше
Простые решения ?
• Добавить больше SQL
 – Уже есть 8, доставляем до 32
 – Дорого ( железо + лицензии MS)
 – Добавление SQL - ручная офлайн работа
 – Повторяем раз в полгода ( 64 => 128 =>256 )
 – Ненадежно



• Добавить кешей
 – Много NOT EXISTS + длинный хвост => LRU кеш не работает
 – Значит нужно кешировать 100% Классов!
   – 2TB ОЗУ не дешево
   – ( и надо умножить на 2 или 3 для надежности )
Cassandra !
• Упираем на хорошее
 – Дешевый NOT EXISTS ( отсекается Блум-фильтром )
 – Простая структура
 – Хвост хранится на дисках
 – Удобное масштабирование
 – Высокая доступность


• Не попадая в плохое
 – Нет требований ACID
 – Eventual Consistency приемлемо
 – Класс!ы никогда не меняются
 – У нас есть время для compaction
Класс!ная модель данных
  LikeByRef   Все класс!ы по сущности


 LikeCount    Счетчики отдельно



 LikeByUser   Мои класс!ы
Класс!ная модель данных
LikeByRef

 Key                   Column              Column Value              Timestamp
 Type+RefId            userId:byte[8]      <null>                    Created




            – EXISTS ( Type,RefId=?, UserId=?) 98% calls => “NOT EXISTS”
            – WHERE Type,RefId=? ORDER BY ДрузьяСверху LIMIT XX



                 Мы не хотим читать диск на этих запросах
               ...но Cassandra использует блум-фильтр только для отсечки строк
Колоночный блум-фильтр
• что делает
– Хранит пары (Key, Column name) прямо в SSTable *-Filter.db


• хорошо
– Полностью убрали чтения с диска на NOT EXISTS
– ... то есть 98% запросов идут только в память
– больше фильтр => меньше false positives

• плохо
– блум фильтры стали большими - сотни мегабайт
– .. GC Promotion Failures (так как были в одном long[])
– исправили (CASSANDRA-2466) в cassandra 1.0
Классная модель
LikeCount
Key                   Column                     Column Value                Timestamp
Type+RefId            nodeIp:byte[4]             nodeCounter:int             Created




                – COUNT ( RefType,RefId=?) 80% calls => “NOT EXISTS”



             Мы не хотим делать сетевые запросы если классов нет
             ...но Cassandra всегда это делает для RR или пострадает консистентность
и еще плохо


                                                        1. COUNT()
                             application server




                                            2. EXISTS

                                                                     cassandra
- DTO <-> hector <-> THRIFT <-> cassandra
- THRIFT медленный и неудобный
- Несконсистентные транзакции
- Дополнительная коммуникация из-за RR
- Кеш только LRU, некомпактный
классное решение


                          application server   one-nio



                                                         odnoklassniki-like


                                                                cassandra
- Бакенд и Cassandra в той же JVM
- Бакенд в том же ринге
- Работает через one-nio транспорт
классное решение
• локальный доступ
– запросы COUNT(RefId), EXISTS(RefId,UserId)
  проверяются по блум - фильтрам в памяти локальной ноды



• спец кеш счетчиков
– более компактный, off heap
– ... 40M элементов -> 1G RAM
– сохраняется на диск для быстрого старта

– учитывает длинный хвост
Кеш счетчиков
     0




                     m
                64




     128
Кеш счетчиков
     0




                     m
                64




     128
Кеш счетчиков
     0




                     m
                64




     128
Кеш счетчиков
     0
           m * 50




                         m
                    64




           m * 50
     128
Кеш счетчиков
           Фейковые
     0     изменения
           TS = TS
                       - при изменении
                       - на втором чтении
                       - повторить раз в 8 ч

                           m
                  64




     128
профит
– 12 cassandra nodes ( вместо 8 SQLs + резерв + 12 кешей )
– более надежная: RF = 3, в каждом ЦОД по реплике
– более производительная ( 1M бизнес запросов/сек )
– более быстрая ( более чем в 10 раз, менее 1.5 мс в среднем )
– расширяемая (12 -> 24 -> 48 )
– быстрорастущая 8 TB, + 15 G в день
Интересно?
                                     Можно узнать больше !


Odnoklassniki.ru
                                                              Интеграция с Odnoklassniki.ru
http://v.ok.ru
                                                              http://connect.ok.ru


one-nio
                                                              Cassandra
slideshare.net/m0nstermind/presentations
                                                              github.com/odnoklassniki/apache-cassandra
github.com/odnoklassniki/one-nio
                                                              cassandra.apache.org


                                            Олег Анастасьев
                                            oa@odnoklassniki.ru
                                            odnoklassniki.ru/oa
Интересно?
connect.ok.ru
                Можно узнать больше !

Mais conteúdo relacionado

Destaque

Максим Сычев и Александр Коковин "Как мы переезжали на Cassandra". Выступлени...
Максим Сычев и Александр Коковин "Как мы переезжали на Cassandra". Выступлени...Максим Сычев и Александр Коковин "Как мы переезжали на Cassandra". Выступлени...
Максим Сычев и Александр Коковин "Как мы переезжали на Cassandra". Выступлени...it-people
 
Иван Бурмистров "Строго ориентированная последовательность временных событий"...
Иван Бурмистров "Строго ориентированная последовательность временных событий"...Иван Бурмистров "Строго ориентированная последовательность временных событий"...
Иван Бурмистров "Строго ориентированная последовательность временных событий"...it-people
 
Олег Анастасьев "Ближе к Cassandra". Выступление на Cassandra Conf 2013
Олег Анастасьев "Ближе к Cassandra". Выступление на Cassandra Conf 2013Олег Анастасьев "Ближе к Cassandra". Выступление на Cassandra Conf 2013
Олег Анастасьев "Ближе к Cassandra". Выступление на Cassandra Conf 2013it-people
 
Платформа для видео сроком в квартал. Александр Тоболь.
Платформа для видео сроком в квартал. Александр Тоболь.Платформа для видео сроком в квартал. Александр Тоболь.
Платформа для видео сроком в квартал. Александр Тоболь.odnoklassniki.ru
 
Apache Cassandra, part 2 – data model example, machinery
Apache Cassandra, part 2 – data model example, machineryApache Cassandra, part 2 – data model example, machinery
Apache Cassandra, part 2 – data model example, machineryAndrey Lomakin
 
Александр Сабинин "Организация динамической циклической очереди задач для ска...
Александр Сабинин "Организация динамической циклической очереди задач для ска...Александр Сабинин "Организация динамической циклической очереди задач для ска...
Александр Сабинин "Организация динамической циклической очереди задач для ска...it-people
 
Класс!ная Cassandra
Класс!ная CassandraКласс!ная Cassandra
Класс!ная Cassandraodnoklassniki.ru
 
Java Runtime: повседневные обязанности JVM
Java Runtime: повседневные обязанности JVMJava Runtime: повседневные обязанности JVM
Java Runtime: повседневные обязанности JVModnoklassniki.ru
 
C*ollege Credit: Data Modeling for Apache Cassandra
C*ollege Credit: Data Modeling for Apache CassandraC*ollege Credit: Data Modeling for Apache Cassandra
C*ollege Credit: Data Modeling for Apache CassandraDataStax
 
Introduction in CUDA (1-3)
Introduction in CUDA (1-3)Introduction in CUDA (1-3)
Introduction in CUDA (1-3)Alexander Mezhov
 
Франкенштейнизация Voldemort или key-value данные в Одноклассниках. Роман Ан...
Франкенштейнизация Voldemort или key-value данные в Одноклассниках. Роман Ан...Франкенштейнизация Voldemort или key-value данные в Одноклассниках. Роман Ан...
Франкенштейнизация Voldemort или key-value данные в Одноклассниках. Роман Ан...odnoklassniki.ru
 
За гранью NoSQL: NewSQL на Cassandra
За гранью NoSQL: NewSQL на CassandraЗа гранью NoSQL: NewSQL на Cassandra
За гранью NoSQL: NewSQL на Cassandraodnoklassniki.ru
 
Алексей Чумаков. Apache Cassandra на реальном проекте
Алексей Чумаков. Apache Cassandra на реальном проектеАлексей Чумаков. Apache Cassandra на реальном проекте
Алексей Чумаков. Apache Cassandra на реальном проектеVolha Banadyseva
 
Apache Cassandra. Ещё одно NoSQL хранилище (Владимир Климонтович)
Apache Cassandra. Ещё одно NoSQL хранилище (Владимир Климонтович)Apache Cassandra. Ещё одно NoSQL хранилище (Владимир Климонтович)
Apache Cassandra. Ещё одно NoSQL хранилище (Владимир Климонтович)Ontico
 
Введение в Apache Cassandra
Введение в Apache CassandraВведение в Apache Cassandra
Введение в Apache CassandraAlexander Tivelkov
 
Apache Cassandra, part 1 – principles, data model
Apache Cassandra, part 1 – principles, data modelApache Cassandra, part 1 – principles, data model
Apache Cassandra, part 1 – principles, data modelAndrey Lomakin
 
Cassandra: быстрая запись данных в высоконагруженных системах
Cassandra: быстрая запись данных в высоконагруженных системахCassandra: быстрая запись данных в высоконагруженных системах
Cassandra: быстрая запись данных в высоконагруженных системахAlexander Mezhov
 
Signal Digital: The Skinny on Wide Rows
Signal Digital: The Skinny on Wide RowsSignal Digital: The Skinny on Wide Rows
Signal Digital: The Skinny on Wide RowsDataStax Academy
 

Destaque (20)

Максим Сычев и Александр Коковин "Как мы переезжали на Cassandra". Выступлени...
Максим Сычев и Александр Коковин "Как мы переезжали на Cassandra". Выступлени...Максим Сычев и Александр Коковин "Как мы переезжали на Cassandra". Выступлени...
Максим Сычев и Александр Коковин "Как мы переезжали на Cassandra". Выступлени...
 
Иван Бурмистров "Строго ориентированная последовательность временных событий"...
Иван Бурмистров "Строго ориентированная последовательность временных событий"...Иван Бурмистров "Строго ориентированная последовательность временных событий"...
Иван Бурмистров "Строго ориентированная последовательность временных событий"...
 
Олег Анастасьев "Ближе к Cassandra". Выступление на Cassandra Conf 2013
Олег Анастасьев "Ближе к Cassandra". Выступление на Cassandra Conf 2013Олег Анастасьев "Ближе к Cassandra". Выступление на Cassandra Conf 2013
Олег Анастасьев "Ближе к Cassandra". Выступление на Cassandra Conf 2013
 
Javantura v2 - Data modeling with Apapche Cassandra - Marko Švaljek
Javantura v2 - Data modeling with Apapche Cassandra - Marko ŠvaljekJavantura v2 - Data modeling with Apapche Cassandra - Marko Švaljek
Javantura v2 - Data modeling with Apapche Cassandra - Marko Švaljek
 
Платформа для видео сроком в квартал. Александр Тоболь.
Платформа для видео сроком в квартал. Александр Тоболь.Платформа для видео сроком в квартал. Александр Тоболь.
Платформа для видео сроком в квартал. Александр Тоболь.
 
Apache Cassandra, part 2 – data model example, machinery
Apache Cassandra, part 2 – data model example, machineryApache Cassandra, part 2 – data model example, machinery
Apache Cassandra, part 2 – data model example, machinery
 
Александр Сабинин "Организация динамической циклической очереди задач для ска...
Александр Сабинин "Организация динамической циклической очереди задач для ска...Александр Сабинин "Организация динамической циклической очереди задач для ска...
Александр Сабинин "Организация динамической циклической очереди задач для ска...
 
Класс!ная Cassandra
Класс!ная CassandraКласс!ная Cassandra
Класс!ная Cassandra
 
Java Runtime: повседневные обязанности JVM
Java Runtime: повседневные обязанности JVMJava Runtime: повседневные обязанности JVM
Java Runtime: повседневные обязанности JVM
 
C*ollege Credit: Data Modeling for Apache Cassandra
C*ollege Credit: Data Modeling for Apache CassandraC*ollege Credit: Data Modeling for Apache Cassandra
C*ollege Credit: Data Modeling for Apache Cassandra
 
Introduction in CUDA (1-3)
Introduction in CUDA (1-3)Introduction in CUDA (1-3)
Introduction in CUDA (1-3)
 
Cassandra 101
Cassandra 101Cassandra 101
Cassandra 101
 
Франкенштейнизация Voldemort или key-value данные в Одноклассниках. Роман Ан...
Франкенштейнизация Voldemort или key-value данные в Одноклассниках. Роман Ан...Франкенштейнизация Voldemort или key-value данные в Одноклассниках. Роман Ан...
Франкенштейнизация Voldemort или key-value данные в Одноклассниках. Роман Ан...
 
За гранью NoSQL: NewSQL на Cassandra
За гранью NoSQL: NewSQL на CassandraЗа гранью NoSQL: NewSQL на Cassandra
За гранью NoSQL: NewSQL на Cassandra
 
Алексей Чумаков. Apache Cassandra на реальном проекте
Алексей Чумаков. Apache Cassandra на реальном проектеАлексей Чумаков. Apache Cassandra на реальном проекте
Алексей Чумаков. Apache Cassandra на реальном проекте
 
Apache Cassandra. Ещё одно NoSQL хранилище (Владимир Климонтович)
Apache Cassandra. Ещё одно NoSQL хранилище (Владимир Климонтович)Apache Cassandra. Ещё одно NoSQL хранилище (Владимир Климонтович)
Apache Cassandra. Ещё одно NoSQL хранилище (Владимир Климонтович)
 
Введение в Apache Cassandra
Введение в Apache CassandraВведение в Apache Cassandra
Введение в Apache Cassandra
 
Apache Cassandra, part 1 – principles, data model
Apache Cassandra, part 1 – principles, data modelApache Cassandra, part 1 – principles, data model
Apache Cassandra, part 1 – principles, data model
 
Cassandra: быстрая запись данных в высоконагруженных системах
Cassandra: быстрая запись данных в высоконагруженных системахCassandra: быстрая запись данных в высоконагруженных системах
Cassandra: быстрая запись данных в высоконагруженных системах
 
Signal Digital: The Skinny on Wide Rows
Signal Digital: The Skinny on Wide RowsSignal Digital: The Skinny on Wide Rows
Signal Digital: The Skinny on Wide Rows
 

Semelhante a CodeFest 2013. Анастасьев О. — Класс!ная Cassandra

ОПК № 3 – Машинное представление целых чисел, символов, строк
ОПК № 3 – Машинное представление целых чисел, символов, строкОПК № 3 – Машинное представление целых чисел, символов, строк
ОПК № 3 – Машинное представление целых чисел, символов, строкVladimir Parfinenko
 
MyRocks: табличный движок для MySQL на основе RocksDB
MyRocks: табличный движок для MySQL на основе RocksDBMyRocks: табличный движок для MySQL на основе RocksDB
MyRocks: табличный движок для MySQL на основе RocksDBSergey Petrunya
 
MyRocks Табличный Движок для MySQL / Алексей Майков (Facebook) / Сергей Петру...
MyRocks Табличный Движок для MySQL / Алексей Майков (Facebook) / Сергей Петру...MyRocks Табличный Движок для MySQL / Алексей Майков (Facebook) / Сергей Петру...
MyRocks Табличный Движок для MySQL / Алексей Майков (Facebook) / Сергей Петру...Ontico
 
Опыт внедрения и использования распределенной системы хранения данных на осно...
Опыт внедрения и использования распределенной системы хранения данных на осно...Опыт внедрения и использования распределенной системы хранения данных на осно...
Опыт внедрения и использования распределенной системы хранения данных на осно...tfmailru
 
Движок LMDB — особенный чемпион / Юрьев Леонид (Петер-Сервис R&D)
Движок LMDB — особенный чемпион / Юрьев Леонид (Петер-Сервис R&D)Движок LMDB — особенный чемпион / Юрьев Леонид (Петер-Сервис R&D)
Движок LMDB — особенный чемпион / Юрьев Леонид (Петер-Сервис R&D)Ontico
 
Что особенного в СУБД для данных в оперативной памяти / Константин Осипов (Ta...
Что особенного в СУБД для данных в оперативной памяти / Константин Осипов (Ta...Что особенного в СУБД для данных в оперативной памяти / Константин Осипов (Ta...
Что особенного в СУБД для данных в оперативной памяти / Константин Осипов (Ta...Ontico
 
Эффективное использование x86-совместимых CPU (Алексей Тутубалин)
Эффективное использование x86-совместимых CPU (Алексей Тутубалин)Эффективное использование x86-совместимых CPU (Алексей Тутубалин)
Эффективное использование x86-совместимых CPU (Алексей Тутубалин)Ontico
 
Метаданные для кластера: гонка key-value-героев / Руслан Рагимов, Светлана Ла...
Метаданные для кластера: гонка key-value-героев / Руслан Рагимов, Светлана Ла...Метаданные для кластера: гонка key-value-героев / Руслан Рагимов, Светлана Ла...
Метаданные для кластера: гонка key-value-героев / Руслан Рагимов, Светлана Ла...Ontico
 
Доклад на Highload-2012
Доклад на Highload-2012Доклад на Highload-2012
Доклад на Highload-2012Alex Tutubalin
 
Низкоуровневые оптимизации. Андрей Аксенов. Unigine Open Air 2013
Низкоуровневые оптимизации. Андрей Аксенов. Unigine Open Air 2013Низкоуровневые оптимизации. Андрей Аксенов. Unigine Open Air 2013
Низкоуровневые оптимизации. Андрей Аксенов. Unigine Open Air 2013Unigine Corp.
 
Kalugin balashov
Kalugin balashovKalugin balashov
Kalugin balashovkuchinskaya
 
Задача о ближайшем кодовом слове. Коды Галлагера—Сипсера—Шпильмана
Задача о ближайшем кодовом слове. Коды Галлагера—Сипсера—ШпильманаЗадача о ближайшем кодовом слове. Коды Галлагера—Сипсера—Шпильмана
Задача о ближайшем кодовом слове. Коды Галлагера—Сипсера—ШпильманаAlex Dainiak
 
Лекция №2 Организация ЭВМ и систем
Лекция №2 Организация ЭВМ и системЛекция №2 Организация ЭВМ и систем
Лекция №2 Организация ЭВМ и системpianist2317
 
C:\fakepath\кмсзи экз
C:\fakepath\кмсзи   экзC:\fakepath\кмсзи   экз
C:\fakepath\кмсзи экзdarina andr
 
Антон Потапов — С++ контейнеры и многопоточность: вместе или врозь?
Антон Потапов — С++ контейнеры и многопоточность: вместе или врозь?Антон Потапов — С++ контейнеры и многопоточность: вместе или врозь?
Антон Потапов — С++ контейнеры и многопоточность: вместе или врозь?Yandex
 
Traditional relational databases architecture
Traditional relational databases architectureTraditional relational databases architecture
Traditional relational databases architectureDeutscheBank
 
Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".
Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".
Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".Badoo Development
 
ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...
ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...
ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...Alexey Paznikov
 

Semelhante a CodeFest 2013. Анастасьев О. — Класс!ная Cassandra (20)

ОПК № 3 – Машинное представление целых чисел, символов, строк
ОПК № 3 – Машинное представление целых чисел, символов, строкОПК № 3 – Машинное представление целых чисел, символов, строк
ОПК № 3 – Машинное представление целых чисел, символов, строк
 
MyRocks: табличный движок для MySQL на основе RocksDB
MyRocks: табличный движок для MySQL на основе RocksDBMyRocks: табличный движок для MySQL на основе RocksDB
MyRocks: табличный движок для MySQL на основе RocksDB
 
MyRocks Табличный Движок для MySQL / Алексей Майков (Facebook) / Сергей Петру...
MyRocks Табличный Движок для MySQL / Алексей Майков (Facebook) / Сергей Петру...MyRocks Табличный Движок для MySQL / Алексей Майков (Facebook) / Сергей Петру...
MyRocks Табличный Движок для MySQL / Алексей Майков (Facebook) / Сергей Петру...
 
Опыт внедрения и использования распределенной системы хранения данных на осно...
Опыт внедрения и использования распределенной системы хранения данных на осно...Опыт внедрения и использования распределенной системы хранения данных на осно...
Опыт внедрения и использования распределенной системы хранения данных на осно...
 
High Load
High LoadHigh Load
High Load
 
Движок LMDB — особенный чемпион / Юрьев Леонид (Петер-Сервис R&D)
Движок LMDB — особенный чемпион / Юрьев Леонид (Петер-Сервис R&D)Движок LMDB — особенный чемпион / Юрьев Леонид (Петер-Сервис R&D)
Движок LMDB — особенный чемпион / Юрьев Леонид (Петер-Сервис R&D)
 
Что особенного в СУБД для данных в оперативной памяти / Константин Осипов (Ta...
Что особенного в СУБД для данных в оперативной памяти / Константин Осипов (Ta...Что особенного в СУБД для данных в оперативной памяти / Константин Осипов (Ta...
Что особенного в СУБД для данных в оперативной памяти / Константин Осипов (Ta...
 
Эффективное использование x86-совместимых CPU (Алексей Тутубалин)
Эффективное использование x86-совместимых CPU (Алексей Тутубалин)Эффективное использование x86-совместимых CPU (Алексей Тутубалин)
Эффективное использование x86-совместимых CPU (Алексей Тутубалин)
 
Метаданные для кластера: гонка key-value-героев / Руслан Рагимов, Светлана Ла...
Метаданные для кластера: гонка key-value-героев / Руслан Рагимов, Светлана Ла...Метаданные для кластера: гонка key-value-героев / Руслан Рагимов, Светлана Ла...
Метаданные для кластера: гонка key-value-героев / Руслан Рагимов, Светлана Ла...
 
Доклад на Highload-2012
Доклад на Highload-2012Доклад на Highload-2012
Доклад на Highload-2012
 
Низкоуровневые оптимизации. Андрей Аксенов. Unigine Open Air 2013
Низкоуровневые оптимизации. Андрей Аксенов. Unigine Open Air 2013Низкоуровневые оптимизации. Андрей Аксенов. Unigine Open Air 2013
Низкоуровневые оптимизации. Андрей Аксенов. Unigine Open Air 2013
 
Kalugin balashov
Kalugin balashovKalugin balashov
Kalugin balashov
 
Задача о ближайшем кодовом слове. Коды Галлагера—Сипсера—Шпильмана
Задача о ближайшем кодовом слове. Коды Галлагера—Сипсера—ШпильманаЗадача о ближайшем кодовом слове. Коды Галлагера—Сипсера—Шпильмана
Задача о ближайшем кодовом слове. Коды Галлагера—Сипсера—Шпильмана
 
Лекция № 2 Организация ЭВМ и систем
Лекция № 2 Организация ЭВМ и системЛекция № 2 Организация ЭВМ и систем
Лекция № 2 Организация ЭВМ и систем
 
Лекция №2 Организация ЭВМ и систем
Лекция №2 Организация ЭВМ и системЛекция №2 Организация ЭВМ и систем
Лекция №2 Организация ЭВМ и систем
 
C:\fakepath\кмсзи экз
C:\fakepath\кмсзи   экзC:\fakepath\кмсзи   экз
C:\fakepath\кмсзи экз
 
Антон Потапов — С++ контейнеры и многопоточность: вместе или врозь?
Антон Потапов — С++ контейнеры и многопоточность: вместе или врозь?Антон Потапов — С++ контейнеры и многопоточность: вместе или врозь?
Антон Потапов — С++ контейнеры и многопоточность: вместе или врозь?
 
Traditional relational databases architecture
Traditional relational databases architectureTraditional relational databases architecture
Traditional relational databases architecture
 
Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".
Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".
Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".
 
ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...
ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...
ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...
 

Mais de CodeFest

Alexander Graebe
Alexander GraebeAlexander Graebe
Alexander GraebeCodeFest
 
Никита Прокопов
Никита ПрокоповНикита Прокопов
Никита ПрокоповCodeFest
 
Денис Баталов
Денис БаталовДенис Баталов
Денис БаталовCodeFest
 
Елена Гальцина
Елена ГальцинаЕлена Гальцина
Елена ГальцинаCodeFest
 
Александр Калашников
Александр КалашниковАлександр Калашников
Александр КалашниковCodeFest
 
Ирина Иванова
Ирина ИвановаИрина Иванова
Ирина ИвановаCodeFest
 
Marko Berković
Marko BerkovićMarko Berković
Marko BerkovićCodeFest
 
Денис Кортунов
Денис КортуновДенис Кортунов
Денис КортуновCodeFest
 
Александр Зимин
Александр ЗиминАлександр Зимин
Александр ЗиминCodeFest
 
Сергей Крапивенский
Сергей КрапивенскийСергей Крапивенский
Сергей КрапивенскийCodeFest
 
Сергей Игнатов
Сергей ИгнатовСергей Игнатов
Сергей ИгнатовCodeFest
 
Николай Крапивный
Николай КрапивныйНиколай Крапивный
Николай КрапивныйCodeFest
 
Alexander Graebe
Alexander GraebeAlexander Graebe
Alexander GraebeCodeFest
 
Вадим Смирнов
Вадим СмирновВадим Смирнов
Вадим СмирновCodeFest
 
Константин Осипов
Константин ОсиповКонстантин Осипов
Константин ОсиповCodeFest
 
Raffaele Rialdi
Raffaele RialdiRaffaele Rialdi
Raffaele RialdiCodeFest
 
Максим Пугачев
Максим ПугачевМаксим Пугачев
Максим ПугачевCodeFest
 
Rene Groeschke
Rene GroeschkeRene Groeschke
Rene GroeschkeCodeFest
 
Иван Бондаренко
Иван БондаренкоИван Бондаренко
Иван БондаренкоCodeFest
 
Mete Atamel
Mete AtamelMete Atamel
Mete AtamelCodeFest
 

Mais de CodeFest (20)

Alexander Graebe
Alexander GraebeAlexander Graebe
Alexander Graebe
 
Никита Прокопов
Никита ПрокоповНикита Прокопов
Никита Прокопов
 
Денис Баталов
Денис БаталовДенис Баталов
Денис Баталов
 
Елена Гальцина
Елена ГальцинаЕлена Гальцина
Елена Гальцина
 
Александр Калашников
Александр КалашниковАлександр Калашников
Александр Калашников
 
Ирина Иванова
Ирина ИвановаИрина Иванова
Ирина Иванова
 
Marko Berković
Marko BerkovićMarko Berković
Marko Berković
 
Денис Кортунов
Денис КортуновДенис Кортунов
Денис Кортунов
 
Александр Зимин
Александр ЗиминАлександр Зимин
Александр Зимин
 
Сергей Крапивенский
Сергей КрапивенскийСергей Крапивенский
Сергей Крапивенский
 
Сергей Игнатов
Сергей ИгнатовСергей Игнатов
Сергей Игнатов
 
Николай Крапивный
Николай КрапивныйНиколай Крапивный
Николай Крапивный
 
Alexander Graebe
Alexander GraebeAlexander Graebe
Alexander Graebe
 
Вадим Смирнов
Вадим СмирновВадим Смирнов
Вадим Смирнов
 
Константин Осипов
Константин ОсиповКонстантин Осипов
Константин Осипов
 
Raffaele Rialdi
Raffaele RialdiRaffaele Rialdi
Raffaele Rialdi
 
Максим Пугачев
Максим ПугачевМаксим Пугачев
Максим Пугачев
 
Rene Groeschke
Rene GroeschkeRene Groeschke
Rene Groeschke
 
Иван Бондаренко
Иван БондаренкоИван Бондаренко
Иван Бондаренко
 
Mete Atamel
Mete AtamelMete Atamel
Mete Atamel
 

CodeFest 2013. Анастасьев О. — Класс!ная Cassandra

  • 1. Класс!ная Cassandra Олег Анастасьев ведущий разработчик, Одноклассники.ру
  • 2. > 6 M онлайн 290 000 страниц/сек, 20 ms на страницу >240 Гбит/сек > 5 000 серверов в 4 ЦОД 99.9% java
  • 3. Cassandra @ Оценки фото Класс! Архив сообщений ... и много других
  • 4. Введение в Cassandra ( сильно упрощенное )
  • 5. Cassandra - Кластер, gossip - Масштабирование, - Партиционирование по ключу 0 восстановление на ходу - Высокая доступность - Поддержка нескольких ЦОД - Не нужны бакапы Строки токен(к) Строки токен(к) 192-... 0-63 R1 192 64 R3 Строки токен(к) Строки токен(к) 128-191 64-127 128 R2
  • 6. Запись в кластер 0 THRIFT Изменение 192 64 Hint Storage 128
  • 7. Запись в кластер 0 THRIFT Изменение 192 64 Hint Storage 128
  • 8. Чтение из кластера 0 Данные resolved result Хэш 192 64 Неправильный хэш Read Repair 128
  • 9. Column Family Порядок Таблица “Х” Ключ name0:byte[] ... nameN:byte[] byte[] value0:byte[] valueN:byte[] timestamp0:long timestampN:long Таблица “Х” Ключ name0:byte[] ... nameK:byte[] Порядок ...
  • 10. Запись изнутри Write (Key, Column) name value ts Commit Log Memtable Flusher Thread записывает SSTable 1 SSTable 2 SSTable 3 SSTable 4 Compaction Thread Сортировка слиянием SSTable 5 Запись на диск всегда последовательная!
  • 11. Чтение изнутри name value ts часть данных 1 resolve Memtable часть 2 часть 3 SSTable 1 SSTable 4 SSTable 5 - get( Key, columnNames ... ) - slice( Key, from, to, count, direction ) - key_range( fromKey, toKey, count, slice(...) )
  • 12. Анатомия SSTable SSTable-5-Filter.db SSTable-5-Index.db SSTable-5-Data.db Данные Блум - фильтр Ключ => Смещение Строки и Колонки “Строка, возможно, есть” По-строчные Всегда в ОЗУ блум фильтры и индексы для длинных строк Что дает: - НОЛЬ чтений с диска, если строки нет и вам повезло - 1 чтение, если строки нет и не повезло - 2 чтения с диска для маленьких строк - 3 чтения - для больших
  • 13. Разрешение конфликтов SSTable “AccountStatements-3456” Memtable “AccountStatements” RowKey = “Oleg_Anastasyev” RowKey = “Oleg_Anastasyev” Column=”LV05HABA95142357516” Column=”LV05HABA95142357516” vs Value= $1,000,000 Value= $10 Какое состояние верно ?
  • 14. Разрешение конфликтов SSTable “AccStatements-3456” Memtable RowKey = “Oleg_Anastasyev” RowKey = “Oleg_Anastasyev” Column=”LV05HABA95142357516” Column=”LV05HABA95142357516” vs Value= $1,000,000 Value= $10 Timestamp = 13:00:05 Timestamp = 13:00:01 С более свежим timestamp .
  • 15. Потерянная модификация $10 1. Читаем AccountStatement Key=”Oleg” 1. Читаем AccountStatement Key=”Oleg” (получили $10, TS=12:00:00) (получили $10, TS=12:00:00) 2. Взнос $1,000,000 3. Сохраняем Key=”Oleg”, 2. Снимаем $1 Value=$1,000,010 TS=12:00:01.000 3. Сохраняем Key=”Oleg”, Value=$9 TS=12:00:01.005 $9
  • 16. Итог таков Преимущества: Недостатки: • Высокая и стабильная скорость записи • Нет ACID, нет откатов • Нет детектора конфликтов • Очень быстрое чтение отсутсвующего ключа • NoSQL => нет JOIN • Скорость чтения не зависит от объема О запросах думать зараннее • Сортированные данные на диске Денормализация данных • Нет 1 точки отказа • Высокая доступность • Масштабирование и восстановление данных на ходу • Резервное копирование не нужно • Эффективная эксплуатация в нескольких ЦОД
  • 21. Классная задачка таблица RefId:long RefType:byte UserId:long Created 9999999999 STATUS(2) 11111111111 11:00 запросы – COUNT ( RefId,RefType=? ): 80% => 0 Вы и 4256 – EXISTS( RefId,RefType,UserId=? ): 98% => Нет – RefId,RefType=? ORDER BY Created DESC -- кто классил ?
  • 22. Классная задачка таблица RefId:long RefType:byte UserId:long Created 9999999999 STATUS(2) 11111111111 11:00 запросы – COUNT ( RefId,RefType=? ): 80% => 0 Вы и 4256 – EXISTS( RefId,RefType,UserId=? ): 98% => Нет – RefId,RefType=? ORDER BY Created DESC -- кто классил ? как то скучно ...
  • 26. Классная проблема таблица RefId:long RefType:byte UserId:long Created 9999999999 STATUS(2) 11111111111 11:00 нагрузка 8х – 16 миллиардов показов в день (~ 300 000/сек) – 100 M класс!ов в день ( ~ 2500/сек ) – 2TB данных новый запрос – RefId,RefType=? ORDER BY ДрузьяСверху длинный хвост – 40% EXISTS(RefId,UserId) не кешируются в принципе
  • 27. Классная проблема уже есть: – 8 SQL кластеров (без учета резерва) – 12 кешей (увеличение количества большого эффекта не дает) – И они близки к пределу по CPU, дисковым операциям А мы хотим в 8 раз больше
  • 28. Простые решения ? • Добавить больше SQL – Уже есть 8, доставляем до 32 – Дорого ( железо + лицензии MS) – Добавление SQL - ручная офлайн работа – Повторяем раз в полгода ( 64 => 128 =>256 ) – Ненадежно • Добавить кешей – Много NOT EXISTS + длинный хвост => LRU кеш не работает – Значит нужно кешировать 100% Классов! – 2TB ОЗУ не дешево – ( и надо умножить на 2 или 3 для надежности )
  • 29. Cassandra ! • Упираем на хорошее – Дешевый NOT EXISTS ( отсекается Блум-фильтром ) – Простая структура – Хвост хранится на дисках – Удобное масштабирование – Высокая доступность • Не попадая в плохое – Нет требований ACID – Eventual Consistency приемлемо – Класс!ы никогда не меняются – У нас есть время для compaction
  • 30. Класс!ная модель данных LikeByRef Все класс!ы по сущности LikeCount Счетчики отдельно LikeByUser Мои класс!ы
  • 31. Класс!ная модель данных LikeByRef Key Column Column Value Timestamp Type+RefId userId:byte[8] <null> Created – EXISTS ( Type,RefId=?, UserId=?) 98% calls => “NOT EXISTS” – WHERE Type,RefId=? ORDER BY ДрузьяСверху LIMIT XX Мы не хотим читать диск на этих запросах ...но Cassandra использует блум-фильтр только для отсечки строк
  • 32. Колоночный блум-фильтр • что делает – Хранит пары (Key, Column name) прямо в SSTable *-Filter.db • хорошо – Полностью убрали чтения с диска на NOT EXISTS – ... то есть 98% запросов идут только в память – больше фильтр => меньше false positives • плохо – блум фильтры стали большими - сотни мегабайт – .. GC Promotion Failures (так как были в одном long[]) – исправили (CASSANDRA-2466) в cassandra 1.0
  • 33. Классная модель LikeCount Key Column Column Value Timestamp Type+RefId nodeIp:byte[4] nodeCounter:int Created – COUNT ( RefType,RefId=?) 80% calls => “NOT EXISTS” Мы не хотим делать сетевые запросы если классов нет ...но Cassandra всегда это делает для RR или пострадает консистентность
  • 34. и еще плохо 1. COUNT() application server 2. EXISTS cassandra - DTO <-> hector <-> THRIFT <-> cassandra - THRIFT медленный и неудобный - Несконсистентные транзакции - Дополнительная коммуникация из-за RR - Кеш только LRU, некомпактный
  • 35. классное решение application server one-nio odnoklassniki-like cassandra - Бакенд и Cassandra в той же JVM - Бакенд в том же ринге - Работает через one-nio транспорт
  • 36. классное решение • локальный доступ – запросы COUNT(RefId), EXISTS(RefId,UserId) проверяются по блум - фильтрам в памяти локальной ноды • спец кеш счетчиков – более компактный, off heap – ... 40M элементов -> 1G RAM – сохраняется на диск для быстрого старта – учитывает длинный хвост
  • 40. Кеш счетчиков 0 m * 50 m 64 m * 50 128
  • 41. Кеш счетчиков Фейковые 0 изменения TS = TS - при изменении - на втором чтении - повторить раз в 8 ч m 64 128
  • 42. профит – 12 cassandra nodes ( вместо 8 SQLs + резерв + 12 кешей ) – более надежная: RF = 3, в каждом ЦОД по реплике – более производительная ( 1M бизнес запросов/сек ) – более быстрая ( более чем в 10 раз, менее 1.5 мс в среднем ) – расширяемая (12 -> 24 -> 48 ) – быстрорастущая 8 TB, + 15 G в день
  • 43. Интересно? Можно узнать больше ! Odnoklassniki.ru Интеграция с Odnoklassniki.ru http://v.ok.ru http://connect.ok.ru one-nio Cassandra slideshare.net/m0nstermind/presentations github.com/odnoklassniki/apache-cassandra github.com/odnoklassniki/one-nio cassandra.apache.org Олег Анастасьев oa@odnoklassniki.ru odnoklassniki.ru/oa
  • 44. Интересно? connect.ok.ru Можно узнать больше !