SlideShare ist ein Scribd-Unternehmen logo
1 von 45
Downloaden Sie, um offline zu lesen
Класс!ная Cassandra




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

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


> 5 000 серверов в 4 ЦОД
       99.9% java
=
           NoSQL
      Высокодоступная
       Распределенная
Система Управления Данными
     с Открытым Кодом
Cassandra @

      Оценки фото

      Класс!

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

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

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

                                    192-...                    0-63

                          192                                             64
                     R3                                                        R1
                                Строки токен(к)         Строки токен(к)

                                   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
- Сортированные данные на диске                         О запросах думать зараннее
                                                        Денормализация данных
- Высокая доступность
- Масштабирование и восстановление данных на
    ходу
-   Резервное копирование не нужно
-   Эффективная эксплуатация в нескольких ЦОД
Устали от теории ?
Классная задачка
Класс! 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 -- кто классил ?




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




Больше в 8 раз!
Классная проблема
 таблица
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 или пострадает консистентность
и еще плохо


                            application server               1. COUNT()




                                                 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




                           m
                  64




                       - при изменении
                       - на втором чтении
     128               - повторить раз в 8 ч
профит
– 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/one-nio                             github.com/odnoklassniki/apache-cassandra
                                                             cassandra.apache.org


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

Weitere ähnliche Inhalte

Was ist angesagt?

Эволюция программно-аппаратного обеспечения хранения фотографий в Badoo / Дми...
Эволюция программно-аппаратного обеспечения хранения фотографий в Badoo / Дми...Эволюция программно-аппаратного обеспечения хранения фотографий в Badoo / Дми...
Эволюция программно-аппаратного обеспечения хранения фотографий в Badoo / Дми...
Ontico
 
Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (C...
Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (C...Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (C...
Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (C...
Ontico
 
Механика DDoS (Александр Крижановский)
Механика DDoS (Александр Крижановский)Механика DDoS (Александр Крижановский)
Механика DDoS (Александр Крижановский)
Ontico
 
Кластеры баз данных делаем сложные вещи просто / Андрей Тихонов (Avito)
Кластеры баз данных делаем сложные вещи просто / Андрей Тихонов (Avito)Кластеры баз данных делаем сложные вещи просто / Андрей Тихонов (Avito)
Кластеры баз данных делаем сложные вещи просто / Андрей Тихонов (Avito)
Ontico
 
Разработка высокопроизводительных серверных приложений для Linux/Unix (Алекса...
Разработка высокопроизводительных серверных приложений для Linux/Unix (Алекса...Разработка высокопроизводительных серверных приложений для Linux/Unix (Алекса...
Разработка высокопроизводительных серверных приложений для Linux/Unix (Алекса...
Ontico
 
Защита данных и датацентров от катастроф. Подход Nutanix / Максим Шапошников ...
Защита данных и датацентров от катастроф. Подход Nutanix / Максим Шапошников ...Защита данных и датацентров от катастроф. Подход Nutanix / Максим Шапошников ...
Защита данных и датацентров от катастроф. Подход Nutanix / Максим Шапошников ...
Ontico
 
Cassandra: быстрая запись данных в высоконагруженных системах
Cassandra: быстрая запись данных в высоконагруженных системахCassandra: быстрая запись данных в высоконагруженных системах
Cassandra: быстрая запись данных в высоконагруженных системах
Alexander Mezhov
 
Чему мы научились разрабатывая микросервисы?
Чему мы научились разрабатывая микросервисы?Чему мы научились разрабатывая микросервисы?
Чему мы научились разрабатывая микросервисы?
Vadim Madison
 
Реализация восстановления после аварий / Сергей Бурладян (Avito)
Реализация восстановления после аварий / Сергей Бурладян (Avito)Реализация восстановления после аварий / Сергей Бурладян (Avito)
Реализация восстановления после аварий / Сергей Бурладян (Avito)
Ontico
 
Осваиваем Tarantool 1.6 / Евгений Шадрин (Sberbank Digital Ventures)
Осваиваем Tarantool 1.6 / Евгений Шадрин (Sberbank Digital Ventures)Осваиваем Tarantool 1.6 / Евгений Шадрин (Sberbank Digital Ventures)
Осваиваем Tarantool 1.6 / Евгений Шадрин (Sberbank Digital Ventures)
Ontico
 
Хранение данных на виниле / Константин Осипов (tarantool.org)
Хранение данных на виниле / Константин Осипов (tarantool.org)Хранение данных на виниле / Константин Осипов (tarantool.org)
Хранение данных на виниле / Константин Осипов (tarantool.org)
Ontico
 

Was ist angesagt? (20)

Эволюция программно-аппаратного обеспечения хранения фотографий в Badoo / Дми...
Эволюция программно-аппаратного обеспечения хранения фотографий в Badoo / Дми...Эволюция программно-аппаратного обеспечения хранения фотографий в Badoo / Дми...
Эволюция программно-аппаратного обеспечения хранения фотографий в Badoo / Дми...
 
nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)
nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)
nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)
 
Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (C...
Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (C...Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (C...
Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (C...
 
Принципы и приёмы обработки очередей / Константин Осипов (Mail.ru)
Принципы и приёмы обработки очередей / Константин Осипов (Mail.ru)Принципы и приёмы обработки очередей / Константин Осипов (Mail.ru)
Принципы и приёмы обработки очередей / Константин Осипов (Mail.ru)
 
Механика DDoS (Александр Крижановский)
Механика DDoS (Александр Крижановский)Механика DDoS (Александр Крижановский)
Механика DDoS (Александр Крижановский)
 
Современная операционная система: что надо знать разработчику / Александр Кри...
Современная операционная система: что надо знать разработчику / Александр Кри...Современная операционная система: что надо знать разработчику / Александр Кри...
Современная операционная система: что надо знать разработчику / Александр Кри...
 
Введение в Apache Cassandra
Введение в Apache CassandraВведение в Apache Cassandra
Введение в Apache Cassandra
 
Кластеры баз данных делаем сложные вещи просто / Андрей Тихонов (Avito)
Кластеры баз данных делаем сложные вещи просто / Андрей Тихонов (Avito)Кластеры баз данных делаем сложные вещи просто / Андрей Тихонов (Avito)
Кластеры баз данных делаем сложные вещи просто / Андрей Тихонов (Avito)
 
Разработка высокопроизводительных серверных приложений для Linux/Unix (Алекса...
Разработка высокопроизводительных серверных приложений для Linux/Unix (Алекса...Разработка высокопроизводительных серверных приложений для Linux/Unix (Алекса...
Разработка высокопроизводительных серверных приложений для Linux/Unix (Алекса...
 
Защита данных и датацентров от катастроф. Подход Nutanix / Максим Шапошников ...
Защита данных и датацентров от катастроф. Подход Nutanix / Максим Шапошников ...Защита данных и датацентров от катастроф. Подход Nutanix / Максим Шапошников ...
Защита данных и датацентров от катастроф. Подход Nutanix / Максим Шапошников ...
 
Cassandra: быстрая запись данных в высоконагруженных системах
Cassandra: быстрая запись данных в высоконагруженных системахCassandra: быстрая запись данных в высоконагруженных системах
Cassandra: быстрая запись данных в высоконагруженных системах
 
Чему мы научились разрабатывая микросервисы?
Чему мы научились разрабатывая микросервисы?Чему мы научились разрабатывая микросервисы?
Чему мы научились разрабатывая микросервисы?
 
Реализация восстановления после аварий / Сергей Бурладян (Avito)
Реализация восстановления после аварий / Сергей Бурладян (Avito)Реализация восстановления после аварий / Сергей Бурладян (Avito)
Реализация восстановления после аварий / Сергей Бурладян (Avito)
 
Осваиваем Tarantool 1.6 / Евгений Шадрин (Sberbank Digital Ventures)
Осваиваем Tarantool 1.6 / Евгений Шадрин (Sberbank Digital Ventures)Осваиваем Tarantool 1.6 / Евгений Шадрин (Sberbank Digital Ventures)
Осваиваем Tarantool 1.6 / Евгений Шадрин (Sberbank Digital Ventures)
 
Хранение данных на виниле / Константин Осипов (tarantool.org)
Хранение данных на виниле / Константин Осипов (tarantool.org)Хранение данных на виниле / Константин Осипов (tarantool.org)
Хранение данных на виниле / Константин Осипов (tarantool.org)
 
SECON.Посиделки #16: Cassandra (презентация)
SECON.Посиделки #16: Cassandra (презентация) SECON.Посиделки #16: Cassandra (презентация)
SECON.Посиделки #16: Cassandra (презентация)
 
Жизнь проекта на production советы по эксплуатации / Николай Сивко (okmeter.io)
Жизнь проекта на production советы по эксплуатации / Николай Сивко (okmeter.io)Жизнь проекта на production советы по эксплуатации / Николай Сивко (okmeter.io)
Жизнь проекта на production советы по эксплуатации / Николай Сивко (okmeter.io)
 
Mysql vs postgresql
Mysql vs postgresqlMysql vs postgresql
Mysql vs postgresql
 
История успеха Яндекс.Почты с PostgreSQL / Владимир Бородин (Яндекс)
История успеха Яндекс.Почты с PostgreSQL / Владимир Бородин (Яндекс)История успеха Яндекс.Почты с PostgreSQL / Владимир Бородин (Яндекс)
История успеха Яндекс.Почты с PostgreSQL / Владимир Бородин (Яндекс)
 
Игнат Корчагин "Как Cloudflare помогает справиться с крупнейшими атаками в Сети"
Игнат Корчагин "Как Cloudflare помогает справиться с крупнейшими атаками в Сети"Игнат Корчагин "Как Cloudflare помогает справиться с крупнейшими атаками в Сети"
Игнат Корчагин "Как Cloudflare помогает справиться с крупнейшими атаками в Сети"
 

Andere mochten auch

Опыт использования NoSQL-хранилищ (Андрей Новиков)
Опыт использования NoSQL-хранилищ (Андрей Новиков)Опыт использования NoSQL-хранилищ (Андрей Новиков)
Опыт использования NoSQL-хранилищ (Андрей Новиков)
Olga Lavrentieva
 
Олег Анастасьев "Ближе к Cassandra". Выступление на Cassandra Conf 2013
Олег Анастасьев "Ближе к Cassandra". Выступление на Cassandra Conf 2013Олег Анастасьев "Ближе к Cassandra". Выступление на Cassandra Conf 2013
Олег Анастасьев "Ближе к Cassandra". Выступление на Cassandra Conf 2013
it-people
 
Cоциальный граф "Одноклассников" в myTarget
Cоциальный граф "Одноклассников" в myTargetCоциальный граф "Одноклассников" в myTarget
Cоциальный граф "Одноклассников" в myTarget
Oleg Tsarev
 
"Кластеры баз данных: делаем сложные вещи просто" Андрей Тихонов (Avito)
"Кластеры баз данных: делаем сложные вещи просто" Андрей Тихонов (Avito)"Кластеры баз данных: делаем сложные вещи просто" Андрей Тихонов (Avito)
"Кластеры баз данных: делаем сложные вещи просто" Андрей Тихонов (Avito)
AvitoTech
 
Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?
Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?
Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?
tfmailru
 
Использование Tarantool в качестве платформы виртуализации данных / Константи...
Использование Tarantool в качестве платформы виртуализации данных / Константи...Использование Tarantool в качестве платформы виртуализации данных / Константи...
Использование Tarantool в качестве платформы виртуализации данных / Константи...
Ontico
 
Golang в avito
Golang в avitoGolang в avito
Golang в avito
AvitoTech
 

Andere mochten auch (20)

Распределенные системы в Одноклассниках
Распределенные системы в ОдноклассникахРаспределенные системы в Одноклассниках
Распределенные системы в Одноклассниках
 
Опыт использования NoSQL-хранилищ (Андрей Новиков)
Опыт использования NoSQL-хранилищ (Андрей Новиков)Опыт использования NoSQL-хранилищ (Андрей Новиков)
Опыт использования NoSQL-хранилищ (Андрей Новиков)
 
Add a bit of ACID to Cassandra. Cassandra Summit EU 2014
Add a bit of ACID to Cassandra. Cassandra Summit EU 2014Add a bit of ACID to Cassandra. Cassandra Summit EU 2014
Add a bit of ACID to Cassandra. Cassandra Summit EU 2014
 
Олег Анастасьев "Ближе к Cassandra". Выступление на Cassandra Conf 2013
Олег Анастасьев "Ближе к Cassandra". Выступление на Cassandra Conf 2013Олег Анастасьев "Ближе к Cassandra". Выступление на Cassandra Conf 2013
Олег Анастасьев "Ближе к Cassandra". Выступление на Cassandra Conf 2013
 
Cоциальный граф "Одноклассников" в myTarget
Cоциальный граф "Одноклассников" в myTargetCоциальный граф "Одноклассников" в myTarget
Cоциальный граф "Одноклассников" в myTarget
 
Distributed systems at ok.ru #rigadevday
Distributed systems at ok.ru #rigadevdayDistributed systems at ok.ru #rigadevday
Distributed systems at ok.ru #rigadevday
 
"Building data streams" Константин Евтеев (Avito)
"Building data streams" Константин Евтеев (Avito)"Building data streams" Константин Евтеев (Avito)
"Building data streams" Константин Евтеев (Avito)
 
Зачем в Avito Аналитика?
Зачем в Avito Аналитика?Зачем в Avito Аналитика?
Зачем в Avito Аналитика?
 
HBase on Dev{Highload}
HBase on Dev{Highload}HBase on Dev{Highload}
HBase on Dev{Highload}
 
My talk at Highload++ 2015
My talk at Highload++ 2015My talk at Highload++ 2015
My talk at Highload++ 2015
 
"Кластеры баз данных: делаем сложные вещи просто" Андрей Тихонов (Avito)
"Кластеры баз данных: делаем сложные вещи просто" Андрей Тихонов (Avito)"Кластеры баз данных: делаем сложные вещи просто" Андрей Тихонов (Avito)
"Кластеры баз данных: делаем сложные вещи просто" Андрей Тихонов (Avito)
 
Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?
Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?
Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?
 
Тюним память и сетевой стек в Linux: история перевода высоконагруженных серве...
Тюним память и сетевой стек в Linux: история перевода высоконагруженных серве...Тюним память и сетевой стек в Linux: история перевода высоконагруженных серве...
Тюним память и сетевой стек в Linux: история перевода высоконагруженных серве...
 
Строим сервисы на базе Nginx и Tarantool / Василий Сошников, Андрей Дроздов (...
Строим сервисы на базе Nginx и Tarantool / Василий Сошников, Андрей Дроздов (...Строим сервисы на базе Nginx и Tarantool / Василий Сошников, Андрей Дроздов (...
Строим сервисы на базе Nginx и Tarantool / Василий Сошников, Андрей Дроздов (...
 
Использование Tarantool в качестве платформы виртуализации данных / Константи...
Использование Tarantool в качестве платформы виртуализации данных / Константи...Использование Tarantool в качестве платформы виртуализации данных / Константи...
Использование Tarantool в качестве платформы виртуализации данных / Константи...
 
Основные кейсы использования in-memory СУБД на примере Тарантула и проектов M...
Основные кейсы использования in-memory СУБД на примере Тарантула и проектов M...Основные кейсы использования in-memory СУБД на примере Тарантула и проектов M...
Основные кейсы использования in-memory СУБД на примере Тарантула и проектов M...
 
Дмитрий Новиков - Tarantool в Badoo
Дмитрий Новиков - Tarantool в BadooДмитрий Новиков - Tarantool в Badoo
Дмитрий Новиков - Tarantool в Badoo
 
Golang в avito
Golang в avitoGolang в avito
Golang в avito
 
«Как 200 строк на Go помогли нам освободить 15 серверов» – Паша Мурзаков (Badoo)
«Как 200 строк на Go помогли нам освободить 15 серверов» – Паша Мурзаков (Badoo)«Как 200 строк на Go помогли нам освободить 15 серверов» – Паша Мурзаков (Badoo)
«Как 200 строк на Go помогли нам освободить 15 серверов» – Паша Мурзаков (Badoo)
 
Kubernetes в production - Павел Селиванов (Центр Недвижимости от Сбербанка)
Kubernetes в production - Павел Селиванов (Центр Недвижимости от Сбербанка)Kubernetes в production - Павел Селиванов (Центр Недвижимости от Сбербанка)
Kubernetes в production - Павел Селиванов (Центр Недвижимости от Сбербанка)
 

Ähnlich wie Класс!ная Cassandra

CodeFest 2013. Анастасьев О. — Класс!ная Cassandra
CodeFest 2013. Анастасьев О. — Класс!ная CassandraCodeFest 2013. Анастасьев О. — Класс!ная Cassandra
CodeFest 2013. Анастасьев О. — Класс!ная Cassandra
CodeFest
 
Опыт внедрения и использования распределенной системы хранения данных на осно...
Опыт внедрения и использования распределенной системы хранения данных на осно...Опыт внедрения и использования распределенной системы хранения данных на осно...
Опыт внедрения и использования распределенной системы хранения данных на осно...
tfmailru
 
MyRocks Табличный Движок для MySQL / Алексей Майков (Facebook) / Сергей Петру...
MyRocks Табличный Движок для MySQL / Алексей Майков (Facebook) / Сергей Петру...MyRocks Табличный Движок для MySQL / Алексей Майков (Facebook) / Сергей Петру...
MyRocks Табличный Движок для MySQL / Алексей Майков (Facebook) / Сергей Петру...
Ontico
 
Движок LMDB — особенный чемпион / Юрьев Леонид (Петер-Сервис R&D)
Движок LMDB — особенный чемпион / Юрьев Леонид (Петер-Сервис R&D)Движок LMDB — особенный чемпион / Юрьев Леонид (Петер-Сервис R&D)
Движок LMDB — особенный чемпион / Юрьев Леонид (Петер-Сервис R&D)
Ontico
 
Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".
Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".
Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".
Badoo Development
 
Эффективное использование x86-совместимых CPU (Алексей Тутубалин)
Эффективное использование x86-совместимых CPU (Алексей Тутубалин)Эффективное использование x86-совместимых CPU (Алексей Тутубалин)
Эффективное использование x86-совместимых CPU (Алексей Тутубалин)
Ontico
 
Доклад на Highload-2012
Доклад на Highload-2012Доклад на Highload-2012
Доклад на Highload-2012
Alex Tutubalin
 
Smirnov Memcached High Load 2008
Smirnov Memcached High Load 2008Smirnov Memcached High Load 2008
Smirnov Memcached High Load 2008
Ontico
 
Smirnov Memcached Highload 2008
Smirnov Memcached Highload 2008Smirnov Memcached Highload 2008
Smirnov Memcached Highload 2008
Ontico
 
как написать масштабируемую баннерокрутилку. денис бирюков, артем гавриченков...
как написать масштабируемую баннерокрутилку. денис бирюков, артем гавриченков...как написать масштабируемую баннерокрутилку. денис бирюков, артем гавриченков...
как написать масштабируемую баннерокрутилку. денис бирюков, артем гавриченков...
rit2011
 
Владимир Иванов - Криптография и шифрование
Владимир Иванов - Криптография и шифрованиеВладимир Иванов - Криптография и шифрование
Владимир Иванов - Криптография и шифрование
Yandex
 

Ähnlich wie Класс!ная Cassandra (20)

CodeFest 2013. Анастасьев О. — Класс!ная Cassandra
CodeFest 2013. Анастасьев О. — Класс!ная CassandraCodeFest 2013. Анастасьев О. — Класс!ная Cassandra
CodeFest 2013. Анастасьев О. — Класс!ная Cassandra
 
ОПК № 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)
 
Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".
Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".
Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".
 
Эффективное использование x86-совместимых CPU (Алексей Тутубалин)
Эффективное использование x86-совместимых CPU (Алексей Тутубалин)Эффективное использование x86-совместимых CPU (Алексей Тутубалин)
Эффективное использование x86-совместимых CPU (Алексей Тутубалин)
 
Доклад на Highload-2012
Доклад на Highload-2012Доклад на Highload-2012
Доклад на Highload-2012
 
Низкоуровневые оптимизации. Андрей Аксенов. Unigine Open Air 2013
Низкоуровневые оптимизации. Андрей Аксенов. Unigine Open Air 2013Низкоуровневые оптимизации. Андрей Аксенов. Unigine Open Air 2013
Низкоуровневые оптимизации. Андрей Аксенов. Unigine Open Air 2013
 
Smirnov Memcached High Load 2008
Smirnov Memcached High Load 2008Smirnov Memcached High Load 2008
Smirnov Memcached High Load 2008
 
Smirnov Memcached Highload 2008
Smirnov Memcached Highload 2008Smirnov Memcached Highload 2008
Smirnov Memcached Highload 2008
 
Антон Потапов — С++ контейнеры и многопоточность: вместе или врозь?
Антон Потапов — С++ контейнеры и многопоточность: вместе или врозь?Антон Потапов — С++ контейнеры и многопоточность: вместе или врозь?
Антон Потапов — С++ контейнеры и многопоточность: вместе или врозь?
 
Метаданные для кластера: гонка key-value-героев / Руслан Рагимов, Светлана Ла...
Метаданные для кластера: гонка key-value-героев / Руслан Рагимов, Светлана Ла...Метаданные для кластера: гонка key-value-героев / Руслан Рагимов, Светлана Ла...
Метаданные для кластера: гонка key-value-героев / Руслан Рагимов, Светлана Ла...
 
как написать масштабируемую баннерокрутилку. денис бирюков, артем гавриченков...
как написать масштабируемую баннерокрутилку. денис бирюков, артем гавриченков...как написать масштабируемую баннерокрутилку. денис бирюков, артем гавриченков...
как написать масштабируемую баннерокрутилку. денис бирюков, артем гавриченков...
 
Владимир Иванов - Криптография и шифрование
Владимир Иванов - Криптография и шифрованиеВладимир Иванов - Криптография и шифрование
Владимир Иванов - Криптография и шифрование
 
Cassandra:Курс молодого бойца
Cassandra:Курс молодого бойцаCassandra:Курс молодого бойца
Cassandra:Курс молодого бойца
 
C:\fakepath\кмсзи экз
C:\fakepath\кмсзи   экзC:\fakepath\кмсзи   экз
C:\fakepath\кмсзи экз
 
Поговорим про память
Поговорим про памятьПоговорим про память
Поговорим про память
 

Mehr von odnoklassniki.ru

Тестирование аварий. Андрей Губа. Highload++ 2015
Тестирование аварий. Андрей Губа. Highload++ 2015Тестирование аварий. Андрей Губа. Highload++ 2015
Тестирование аварий. Андрей Губа. Highload++ 2015
odnoklassniki.ru
 
Кадры решают все, или стриминг видео в «Одноклассниках». Александр Тоболь
Кадры решают все, или стриминг видео в «Одноклассниках». Александр ТобольКадры решают все, или стриминг видео в «Одноклассниках». Александр Тоболь
Кадры решают все, или стриминг видео в «Одноклассниках». Александр Тоболь
odnoklassniki.ru
 
Платформа для видео сроком в квартал. Александр Тоболь.
Платформа для видео сроком в квартал. Александр Тоболь.Платформа для видео сроком в квартал. Александр Тоболь.
Платформа для видео сроком в квартал. Александр Тоболь.
odnoklassniki.ru
 
Cистема внутренней статистики Odnoklassniki.ru
Cистема внутренней статистики Odnoklassniki.ruCистема внутренней статистики Odnoklassniki.ru
Cистема внутренней статистики Odnoklassniki.ru
odnoklassniki.ru
 
Как, используя Lucene, построить высоконагруженную систему поиска разнородных...
Как, используя Lucene, построить высоконагруженную систему поиска разнородных...Как, используя Lucene, построить высоконагруженную систему поиска разнородных...
Как, используя Lucene, построить высоконагруженную систему поиска разнородных...
odnoklassniki.ru
 

Mehr von odnoklassniki.ru (10)

Тестирование аварий. Андрей Губа. Highload++ 2015
Тестирование аварий. Андрей Губа. Highload++ 2015Тестирование аварий. Андрей Губа. Highload++ 2015
Тестирование аварий. Андрей Губа. Highload++ 2015
 
Кадры решают все, или стриминг видео в «Одноклассниках». Александр Тоболь
Кадры решают все, или стриминг видео в «Одноклассниках». Александр ТобольКадры решают все, или стриминг видео в «Одноклассниках». Александр Тоболь
Кадры решают все, или стриминг видео в «Одноклассниках». Александр Тоболь
 
Платформа для видео сроком в квартал. Александр Тоболь.
Платформа для видео сроком в квартал. Александр Тоболь.Платформа для видео сроком в квартал. Александр Тоболь.
Платформа для видео сроком в квартал. Александр Тоболь.
 
Аварийный дамп – чёрный ящик упавшей JVM. Андрей Паньгин
Аварийный дамп – чёрный ящик упавшей JVM. Андрей ПаньгинАварийный дамп – чёрный ящик упавшей JVM. Андрей Паньгин
Аварийный дамп – чёрный ящик упавшей JVM. Андрей Паньгин
 
Being closer to Cassandra by Oleg Anastasyev. Talk at Cassandra Summit EU 2013
Being closer to Cassandra by Oleg Anastasyev. Talk at Cassandra Summit EU 2013Being closer to Cassandra by Oleg Anastasyev. Talk at Cassandra Summit EU 2013
Being closer to Cassandra by Oleg Anastasyev. Talk at Cassandra Summit EU 2013
 
Управление тысячами серверов в Одноклассниках. Алексей Чудов.
Управление тысячами серверов в Одноклассниках. Алексей Чудов.Управление тысячами серверов в Одноклассниках. Алексей Чудов.
Управление тысячами серверов в Одноклассниках. Алексей Чудов.
 
Java Runtime: повседневные обязанности JVM
Java Runtime: повседневные обязанности JVMJava Runtime: повседневные обязанности JVM
Java Runtime: повседневные обязанности JVM
 
Незаурядная Java как инструмент разработки высоконагруженного сервера
Незаурядная Java как инструмент разработки высоконагруженного сервераНезаурядная Java как инструмент разработки высоконагруженного сервера
Незаурядная Java как инструмент разработки высоконагруженного сервера
 
Cистема внутренней статистики Odnoklassniki.ru
Cистема внутренней статистики Odnoklassniki.ruCистема внутренней статистики Odnoklassniki.ru
Cистема внутренней статистики Odnoklassniki.ru
 
Как, используя Lucene, построить высоконагруженную систему поиска разнородных...
Как, используя Lucene, построить высоконагруженную систему поиска разнородных...Как, используя Lucene, построить высоконагруженную систему поиска разнородных...
Как, используя Lucene, построить высоконагруженную систему поиска разнородных...
 

Класс!ная Cassandra

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