38
За гранью NoSQL: NewSQL на Cassandra Олег Анастасьев Ведущий разработчик Одноклассники, ok.ru

За гранью NoSQL: NewSQL на Cassandra

Embed Size (px)

DESCRIPTION

До недавнего времени в Одноклассниках около 50 ТБ данных, обрабатываемых в реальном времени, хранилось в Microsoft SQL Server. Многие знают, что для такого объема обеспечить быстрый и надежный, да еще и устойчивый к отказу ЦОД доступ, используя SQL СУБД, практически невозможно. Обычно в таких случаях используют одно из NoSQL хранилищ, но не всё можно перенести в NoSQL: некоторые сущности требуют гарантий ACID-транзакций. Это ограничение подвело нас к необходимости использования NewSQL хранилища, то есть СУБД, предоставляющей отказоустойчивость, масштабируемость и быстродействие NoSQL-систем, но при этом сохраняющей привычные для классических систем ACID-гарантии. Работающих промышленных систем этого нового класса немного (сразу приходит на ум только Google Spanner), а доступных — и вовсе нет. Поэтому мы реализовали такую систему сами на любимой нами Java и запустили ее в промышленную эксплуатацию несколько месяцев назад. Доклад про то, как устроено это хранилище будет интересен всем, кто следит за развитием технологий управления базами данных и имеет опыт работы с (No)SQL.

Citation preview

Page 1: За гранью NoSQL: NewSQL на Cassandra

За гранью NoSQL: NewSQL на Cassandra

Олег Анастасьев Ведущий разработчик Одноклассники, ok.ru

Page 2: За гранью NoSQL: NewSQL на Cassandra

*Используем с 2010 года-0.6, 1.2, 2.0

*Сейчас-27 кластеров-500 нод-300 TB данных

*Самый быстрый: 1M оп/сек (48 нод)*Самый большой: 130TB (96 нод)

Cassandra @

Page 3: За гранью NoSQL: NewSQL на Cassandra

SQL Server 2005*Используем с начала времен*200 серверов, 50 TB данных*Шардинг

• F(Entity_Id) -> Token -> Node • F(Master_Id) === F(Detail_Id) • Группировка таблиц по функциональной близости

Группа Локальной Транзакции

Page 4: За гранью NoSQL: NewSQL на Cassandra

Fast SQL Server 2005*DB JOIN* Foreign key constraints* Stored Procs, Triggers*Read uncommitted (noTx)*Короткие транзакции <100ms*Нет массовых UPDATE, DELETE* Запросы только по индексам

Page 5: За гранью NoSQL: NewSQL на Cassandra

Проблемы c SQL* Ручное масштабирование*Downtime при работах c БД, ДЦ*Скорость на запись*BSoD*Плохая отказоустойчивость

1 БД сервер = раз в 3 года64 сервера = раз в 3 недели

200 серверов > раза в неделю

Page 6: За гранью NoSQL: NewSQL на Cassandra

Отказоустойчивость

http://en.wikipedia.org/wiki/High-availability_cluster

Page 7: За гранью NoSQL: NewSQL на Cassandra

Отказоустойчивость

ЦОД-1

Page 8: За гранью NoSQL: NewSQL на Cassandra

Отказоустойчивость

ЦОД-1

Page 9: За гранью NoSQL: NewSQL на Cassandra

Отказоустойчивость

ЦОД-1ЦОД-2

ЦОД-3 ЦОД-4

Page 10: За гранью NoSQL: NewSQL на Cassandra

Отказоустойчивость SQL*Дорогое оборудование

-x10 стоимости 1U сервера

* Глючно и сложно-Штормит при failover-10 % переключений неудаются

* Её нет-при отказе ЦОД

Нужно новое хранилище

Page 11: За гранью NoSQL: NewSQL на Cassandra

Простая транзакцияTX.start(“Albums”, id);Album album = albums.lock(id);Photo photo = photos.create(…);

if (photo.status == PUBLIC ) {album.incPublicPhotosCount();

}

TX.commit();

*Чтение - модификация - изменение* Разные сущности, несколько таблиц*Возможна конкурентная модификация

Page 12: За гранью NoSQL: NewSQL на Cassandra

Новое хранилище*Программистам:

-ACID-SQL

*Админам:-Чтение и запись при отказе ЦОД-Масштабируемость на ходу-Дешевые сервера

*Фиксабельный код (OpenSource,Java)

Page 13: За гранью NoSQL: NewSQL на Cassandra

SQL ?*Масштабируемость*Отказоустойчивость

- Кластер- Конфликты- SQL

*ACID

* SQL

*Cassandra 2 CQL

NoSQL ?

Page 14: За гранью NoSQL: NewSQL на Cassandra

Cassandra 2.0CREATE TABLE photos

(id bigint KEY, owner bigint,…)SELECT * FROM photos WHERE id=?UPDATE photos SET … WHERE id=?

*Что еще есть:-Масштабируемость-Скорость https://github.com/jbellis/YCSB

-Кворумы, speculative retry-Batchlog-“Lightweight” transactions ?

Page 15: За гранью NoSQL: NewSQL на Cassandra

Cassandra 2.0*Что дописать:

-ACID транзакции-OLTP индексы-Генератор монотонных ид

CREATE TABLE photos (id bigint KEY, owner bigint,…)

// OLAP indexSELECT * FROM photos WHERE geomark=‘SPB’;// OLTP indexSELECT * FROM photos WHERE owner=? AND status=?;

Page 16: За гранью NoSQL: NewSQL на Cassandra

CassandraGossip & Messaging

clients C* Storage nodes

C*OneUpdate services

Схема данных

Схема партиционирования

“Heartbeat”

Топология кластера

C*One

Page 17: За гранью NoSQL: NewSQL на Cassandra

clients

Клиенты

*Fat client протокол*Координатор = клиент*Надежнее, быстрее

Page 18: За гранью NoSQL: NewSQL на Cassandra

clients

Клиенты

NoTx

C*OneUpdate services

In Tx

Page 19: За гранью NoSQL: NewSQL на Cassandra

C*One Update Srvs

*Управляет блокировками*Выдает монотонный timestamp

*Управляет транзакциями*… и изменением данных в них

Lamport Timestamp https://ru.wikipedia.org/wiki/Часы_Лэмпорта

Page 20: За гранью NoSQL: NewSQL на Cassandra

C*OneUpdate services

Блокировки

00

10

20

30

40

50

*Мастера групп транзакций* Простые блокировки в памяти

Page 21: За гранью NoSQL: NewSQL на Cassandra

00

10

20

30

50

40

Отказы

* 50ms тик* G1 GC* 200ms до обнаружения отказа

ЦОД-1 ЦОД-2 ЦОД-3

Heartbeat Quorum

Page 22: За гранью NoSQL: NewSQL на Cassandra

50

Резервирования

* Протокол выбора мастера* Спекулятивный старт транзакции

50’

50”

clients > 800

start Tx

Page 23: За гранью NoSQL: NewSQL на Cassandra

Нерожденные транзакции* Запросы на открытие в очередь

-(в памяти резервных)-Удаляются через таймаут

* Если происходит отказ мастера -отрабатываем их из очереди-посылаем ответ клиенту

(отказывается, если уже открыл)

Page 24: За гранью NoSQL: NewSQL на Cassandra

Tx start

clients

Таблица блокировок

1. StartTx

id=1, a=1, b=1

2. Lock

3. Read

4. Cache

Состояние транзакции

RAM

Page 25: За гранью NoSQL: NewSQL на Cassandra

Tx write

clients

Состояние транзакции

Таблица блокировок

1. UPDATE

id=1, a=1, b=1

2. File

id=1, a=2, b=2

RAM

Page 26: За гранью NoSQL: NewSQL на Cassandra

Tx read

clients

Состояние транзакции

Таблица блокировок

1. Read

id=1, a=1, b=1id=1, a=2, b=2

2. Read ?

3. resolve()

RAM

Page 27: За гранью NoSQL: NewSQL на Cassandra

Tx commit

clients

Состояние транзакции

Таблица блокировок

1. Commit

id=1, a=2, b=2

RAM

LOGGED BATCH

2

3

4. Ack

Page 28: За гранью NoSQL: NewSQL на Cassandra

Tx rollback

clients

1. Rollback

RAM

Состояние транзакции

Таблица блокировок

id=1, a=2, b=2

Page 29: За гранью NoSQL: NewSQL на Cassandra

ACID*Atomicity

- logged batch или ничего*Consistency

- приложение* Isolation

- Блокировки- Read Committed

*Durability - кворумные чтения и запись в Cassandra

Page 30: За гранью NoSQL: NewSQL на Cassandra

Индексы в Cassandra 2

*CREATE INDEX (owner, modified ) ?-Нет составных индексов

*CREATE INDEX (owner), filter in RAM ?-high cardinality-Не скалируется, очень медленно читать-100K удалений макс

CREATE TABLE photos ( id bigint primary key, owner bigint, modified timestamp

SELECT * WHERE owner=? AND modified>?

Page 31: За гранью NoSQL: NewSQL на Cassandra

Primary Key

id owner modified caption access …1 111 9.10.2014 “kitty miau” PUB …

INDEX i1 ON photos (owner, modified) VALUES (caption,access,…);

Primary Key

Partition Key Clustering Key

owner modified id caption access …111 9.10.2014 1 “kitty miau” PUB …

Индексы в C*One

SELECT * WHERE owner=? AND modified>?

SELECT * FROM i1_testWHERE owner=? AND modified>?

Page 32: За гранью NoSQL: NewSQL на Cassandra

Index update

clients

UPDATE

RAM

Состояние транзакции

id=1, a=1, b=1id=1, a=2, b=2

Schema2. idxwrites()

idx: a=2, b=2, id=1

Page 33: За гранью NoSQL: NewSQL на Cassandra

*Индексы “как в SQL”-Консистентные-По нескольким полям-Скалируемые и быстродействующие-Встроенные в язык-Без написания прикладного кода-Не влияющие на скорость записи

* Генератор монотонных ид-Без дубликатов-SELECT nextval FROM seqName;

ACID

Page 34: За гранью NoSQL: NewSQL на Cassandra

Фотки*11 миллиардов записей*80k reads/sec, 2k-8k tx/sec* SQL

-RF=1 (RAID 10)-32 MS SQL + 16 standby + 10 backup = 58-загружена на 100%

*После-RF=3 ( в разных ЦОД )-63 C* + 6 upd = 69, 1/3 по цене-загружена на 30%

Page 35: За гранью NoSQL: NewSQL на Cassandra

Скорость

Page 36: За гранью NoSQL: NewSQL на Cassandra

*Ошибки: 8500 в день

*Длительность транзакции: <40ms

*Commit latency avg: <2ms

*Read, write, avg <2ms, 99% ~ 3ms

Фотки: результаты

1/100

Page 37: За гранью NoSQL: NewSQL на Cassandra

Что сделано в C**21 патч в issues.apache.org

-mainly range thombstone and queries fixes

*более быстрый batchlog manager (CASSANDRA-6134)

*более надежный always retry policy (CASSANDRA-6866)

*Night of the Living Dead (CASSANDRA-7872)

*Read repair of range tombstones(CASSANDRA-6863,CASSANDRA-8013)

Page 38: За гранью NoSQL: NewSQL на Cassandra

СПАСИБО !

Олег Анастасьев [email protected]/oa@m0nstermind

slideshare.net/m0nstermind

http://v.ok.ru