"Formal verification of C code" Efremov D.V.
The talk covers the issue of developing correct software applying one of the types of static code analysis. The speaker will also address the matters of using such methods, their weaknesses and limitations, as well as the results they can guarantee.
PHDays VII, PDUG section, Moscow, May 24 2017.
"Формальная верификация кода на языке Си" Ефремов Д.В.
Доклад посвящен разработке корректного программного обеспечения с применением одного из видов статического анализа кода. Будут освещены вопросы применения подобных методов, их слабые стороны и ограничения, а также рассмотрены результаты, которые они могут дать. На конкретных примерах будет продемонстрировано, как выглядят разработка спецификаций для кода на языке Си и доказательство соответствия кода спецификациям.
Доклад представлен на конференции PHDays VII (2017) 24 мая в секции PDUG.
Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лук...Ontico
Индексы
- типы индексов;
- типы доступа к таблице;
- составные индексы (когда они работают);
- получение информации об индексе (show index; - описание формата);
- примеры с поиском по нескольким полям и сортировкой: какие индексы будут использоваться, а какие нет;
- что делать в случае нескольких условий по диапазону;
- как сервер выбирает индекс, который будет использован;
- директивы use/force/ignore index.
EXPLAIN
- как работает оптимизатор запросов;
- недостатки explain;
- explain extended;
- получение sql запроса, восстановленного из плана;
- формат выводимой explain информации:
-- что означает каждый столбец;
-- какие значения принимает (для extra только самые часто встречающиеся);
-- на что обратить внимание с точки зрения производительности;
-- как правильно читать план-разбор сложного примера с join-ами, подзапросами (обычными и from) и union-ами;
- новые возможности explain в последних версиях.
Практические примеры (исходный запрос, план, оптимизация, итоговый план) для разных случаев оптимизации:
1. добавление индексов;
2. эквивалентное изменение запроса: or --> union, подзапрос --> join;
3. разбиение запроса на несколько с сохранением промежуточных данных во временной таблице;
4. изменение структуры данных;
5. использование пользовательских переменных.
"Formal verification of C code" Efremov D.V.
The talk covers the issue of developing correct software applying one of the types of static code analysis. The speaker will also address the matters of using such methods, their weaknesses and limitations, as well as the results they can guarantee.
PHDays VII, PDUG section, Moscow, May 24 2017.
"Формальная верификация кода на языке Си" Ефремов Д.В.
Доклад посвящен разработке корректного программного обеспечения с применением одного из видов статического анализа кода. Будут освещены вопросы применения подобных методов, их слабые стороны и ограничения, а также рассмотрены результаты, которые они могут дать. На конкретных примерах будет продемонстрировано, как выглядят разработка спецификаций для кода на языке Си и доказательство соответствия кода спецификациям.
Доклад представлен на конференции PHDays VII (2017) 24 мая в секции PDUG.
Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лук...Ontico
Индексы
- типы индексов;
- типы доступа к таблице;
- составные индексы (когда они работают);
- получение информации об индексе (show index; - описание формата);
- примеры с поиском по нескольким полям и сортировкой: какие индексы будут использоваться, а какие нет;
- что делать в случае нескольких условий по диапазону;
- как сервер выбирает индекс, который будет использован;
- директивы use/force/ignore index.
EXPLAIN
- как работает оптимизатор запросов;
- недостатки explain;
- explain extended;
- получение sql запроса, восстановленного из плана;
- формат выводимой explain информации:
-- что означает каждый столбец;
-- какие значения принимает (для extra только самые часто встречающиеся);
-- на что обратить внимание с точки зрения производительности;
-- как правильно читать план-разбор сложного примера с join-ами, подзапросами (обычными и from) и union-ами;
- новые возможности explain в последних версиях.
Практические примеры (исходный запрос, план, оптимизация, итоговый план) для разных случаев оптимизации:
1. добавление индексов;
2. эквивалентное изменение запроса: or --> union, подзапрос --> join;
3. разбиение запроса на несколько с сохранением промежуточных данных во временной таблице;
4. изменение структуры данных;
5. использование пользовательских переменных.
Занимаясь разработкой интерфейсов, мы постоянно разбираемся как и что устроено. Вы задумывались, сколько времени у вас уходит на то, чтобы найти нужный фрагмент кода, который отвечает за компонент на странице? В своем докладе я покажу как это можно сделать за один клик, а так же раскрою технические детали.
В докладе пойдёт речь о практическом применении lock-free структур и алгоритмов, которые используются в RealTime-Поиске в Яндексе. Из-за сложности теоретических исследований по lock-free и оторванности от практики часто создаётся впечатление, что это просто развлечение для знатоков computer science и не может быть использовано в реальном проекте. Будут рассмотрены проблемы традиционного подхода к lock-free и показано, как взглянув по новому на всю идею lock-free, добиться максимальной производительности, невозможной при использовании блокировок.
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4 Dima Dzuba
Описываются возможности C++ по работе с наследованием (virtual, override, final). Описываются механизмы работы с константными переменными и методами (const, mutable, constexpr). Описываются возможности по перегрузке операторов (operator).
Фреймворк Akka и его использование в ЯндексеVadim Tsesko
Доклад с JPoint 2014 (http://javapoint.ru).
Краткое содержание:
* Actor Model на примере Akka
* Происхождение
* Концепции и API
* Примеры кода
* Примеры систем в Яндекс
* Конвейерная обработка данных
* Реактивные иерархические системы
* Опыт разработки и эксплуатации
* Подводные камни
* Проблемы и некоторые решения
* Дополнительные тулы
Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".Badoo Development
Мы уже около 3-х лет используем HandlerSocket в нашей инфраструктуре сайта badoo.com. За это время мы накопили опыт решения характерных для Handlersocket проблем, появляющихся при использовании.
Несколько команд внутри Баду активно используют HS для решения разноплановых задач мобильных и настольных приложений Баду. Где-то мы используем HS как замену Memcached, где-то как простой поисковый механизм, где-то как хранилище типа ключ-значение. Наш HS-кластер содержит более 30 серверов, обрабатывая порядка 8000 запросов/сек.
Спикер также предоставляет написанный им код библиотеки-клиента для Handlersocket на PHP.
Про что доклад:
• что это вообще такое;
• чем является HS и чем не является;
• внутреннее устройство и работа HS;
• протокол;
• примеры использования в Баду, с цифрами и графиками;
• особенности: шардирование, Percona Server, постоянные соединения (бенефиты, проблемы и их решения), tips & tricks;
• полезные сслыки, ответы на FAQ.
Доклад рассчитан на highload-разработчиков, работающих с реляционными БД.
Занимаясь разработкой интерфейсов, мы постоянно разбираемся как и что устроено. Вы задумывались, сколько времени у вас уходит на то, чтобы найти нужный фрагмент кода, который отвечает за компонент на странице? В своем докладе я покажу как это можно сделать за один клик, а так же раскрою технические детали.
В докладе пойдёт речь о практическом применении lock-free структур и алгоритмов, которые используются в RealTime-Поиске в Яндексе. Из-за сложности теоретических исследований по lock-free и оторванности от практики часто создаётся впечатление, что это просто развлечение для знатоков computer science и не может быть использовано в реальном проекте. Будут рассмотрены проблемы традиционного подхода к lock-free и показано, как взглянув по новому на всю идею lock-free, добиться максимальной производительности, невозможной при использовании блокировок.
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4 Dima Dzuba
Описываются возможности C++ по работе с наследованием (virtual, override, final). Описываются механизмы работы с константными переменными и методами (const, mutable, constexpr). Описываются возможности по перегрузке операторов (operator).
Фреймворк Akka и его использование в ЯндексеVadim Tsesko
Доклад с JPoint 2014 (http://javapoint.ru).
Краткое содержание:
* Actor Model на примере Akka
* Происхождение
* Концепции и API
* Примеры кода
* Примеры систем в Яндекс
* Конвейерная обработка данных
* Реактивные иерархические системы
* Опыт разработки и эксплуатации
* Подводные камни
* Проблемы и некоторые решения
* Дополнительные тулы
Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".Badoo Development
Мы уже около 3-х лет используем HandlerSocket в нашей инфраструктуре сайта badoo.com. За это время мы накопили опыт решения характерных для Handlersocket проблем, появляющихся при использовании.
Несколько команд внутри Баду активно используют HS для решения разноплановых задач мобильных и настольных приложений Баду. Где-то мы используем HS как замену Memcached, где-то как простой поисковый механизм, где-то как хранилище типа ключ-значение. Наш HS-кластер содержит более 30 серверов, обрабатывая порядка 8000 запросов/сек.
Спикер также предоставляет написанный им код библиотеки-клиента для Handlersocket на PHP.
Про что доклад:
• что это вообще такое;
• чем является HS и чем не является;
• внутреннее устройство и работа HS;
• протокол;
• примеры использования в Баду, с цифрами и графиками;
• особенности: шардирование, Percona Server, постоянные соединения (бенефиты, проблемы и их решения), tips & tricks;
• полезные сслыки, ответы на FAQ.
Доклад рассчитан на highload-разработчиков, работающих с реляционными БД.
Иван Бурмистров "Строго ориентированная последовательность временных событий"...it-people
Ivan Burmistrov presents an algorithm for using Cassandra as an event logger. The algorithm aims to minimize time lag between writes and reads while ensuring write safety. Events are initially written in a "bad" state and only transition to "good" once no conflicting events exist. This allows reads to utilize caching while avoiding reading unstable data. The algorithm provides advantages like small time lags, cacheability and independence from synchronization, though writes are slower. Potential improvements and applications are also discussed.
CQL3 and Data Modeling 101 with Apache CassandraChris McEniry
This document provides an overview of Cassandra data modeling concepts using CQL. It discusses Cassandra properties like being column-oriented and distributed. It explains key Cassandra containers like keyspaces, column families, rows and columns. Examples are given of modeling user, handle and event data using tables with composite keys and columns. The document emphasizes designing data models for idempotency and reading performance.
Евгений Курпилянский "Индексирование поверх Cassandra". Выступление на Cassan...it-people
The document discusses indexing Cassandra data in SQL storage. It proposes running an IndexService application that synchronizes data between Cassandra and a SQL database in the background. The IndexService would maintain SQL tables with indexes to allow for efficient searching. It would periodically read a Cassandra event log of data changes and update the SQL tables accordingly. This would allow queries to leverage both recent changes in the event log and indexed data from the SQL tables.
Александр Соловьев "Cassandra in-e commerce". Выступление на Cassandra conf 2013it-people
This document discusses migrating an e-commerce platform's online product catalog from Oracle Coherence to Cassandra. The goals of the migration were to minimize system restart time, have at least two copies of data in different data centers, and enable quick simple backups. Performance testing showed Cassandra was able to meet the requirements of thousands of transactions per second and handle a full data reload daily with millions of products and entities stored. Configurations like disk optimization, caching, and query routing improved Cassandra's performance and stability for this use case.
Ольга Соболева и Кирилл Иванов "Обработка транзакций на примере телекоммуника...it-people
The document discusses transaction processing for a customer's telecommunications account. It describes how a customer can top up their account, make calls, send texts or use data. Transactions are processed asynchronously and stored in a database with details like the transaction ID, date, sender/recipient and resource/amount. The current balance is calculated by aggregating all charges for a customer. Customers can also buy packages of services or flat rates for calls/texts.
Jonathan Ellis "Apache Cassandra 2.0 and 2.1". Выступление на Cassandra conf ...it-people
Modern Apache Cassandra provides a highly scalable and available database. Some key points covered in the document include:
- Cassandra has been under active development since 2008 and is now at version 2.0, with 2.1 upcoming.
- It is used by many companies for applications such as social media features, logging, notifications, and more due to its abilities around scalability, high availability, and tunable consistency.
- Cassandra uses a decentralized architecture with no single point of failure and dynamic partitioning of data across nodes using a token ring approach for high availability without a single point of failure.
- It provides tunable consistency levels, lightweight transactions, and other features for flexibility while maintaining high
Cassandra is a NoSQL Column Family oriented database with a built in scalability. More and more companies are faced with the scale challenge every day and Cassandra is often picked as a weapon of choice. Cassandra being NoSQL does not mean that data modeling does not matter, in reality it is crucial to any successful use out there. Lately more and more developers are asking me to tell more about the data modeling (compared with the relational perspective). That’s what this talks is all about.
C*ollege Credit: Data Modeling for Apache CassandraDataStax
Cassandra stores data differently than traditional RDBMS’s. It is these differences that allow for improvements in performance, availability and scalability. Aaron Morton, DataStax MVP for Apache Cassandra will present the basics of the data model and outline the differences clearly. This webinar is 101 level and is suitable for people who are coming from a relational background and just starting to get into Apache Cassandra.
The document discusses key aspects of how the Java Virtual Machine (JVM) executes Java programs. It describes the launcher, class loading process, bytecode verification, class initialization, just-in-time compilation, threads, synchronization, memory management including garbage collection, and how exceptions and native methods are handled. Troubleshooting techniques like hs_err logs are also mentioned. The JVM performs complex optimizations to efficiently run Java programs.
Платформа для видео сроком в квартал. Александр Тоболь.odnoklassniki.ru
A talk from jokerconf.com conference. "Video Platform in 3 months. Delivered." by Alexander Tobol.
Доклад не затронет какую-то особенную технологию или волшебный алгоритм. Речь пойдет о том, как чуть больше чем за квартал совсем небольшая команда перезапустила работающий в режиме 24/7 совсем немаленький видео-сервис на Одноклассниках на написанной с нуля платформе, развернутой на парке из свыше 200 серверов, распределенных между несколькими центрами обмена данными.
Я бы хотел поделиться успехами и неудачами в ходе решения задачи по обеспечению бесперебойных загрузки, трансформации, хранения, раздачи видео и мониторинга, а также остановиться на особенностях, связанных с нагрузкой в 1000 просмотров в секунду, размером ежедневной аудитории в 8 миллионов географически распределенных в и за пределами РФ. Я также остановлюсь на некоторых использованных нами технологиях.
Apache Cassandra, part 2 – data model example, machineryAndrey Lomakin
Aim of this presentation to provide enough information for enterprise architect to choose whether Cassandra will be project data store. Presentation describes each nuance of Cassandra architecture and ways to design data and work with them.
В этой презентации мы расскажем о своем опыте применения этого хранилища на примере одной из самых высоконагруженных подсистем — хранилища Класс!ов. В данный момент в системе хранится около 50 миллиардов записей о Класс!, что занимает в сумме около 8 Тб. Для того чтобы реализовать такое хранилище пришлось отойти от классического способа работы с Cassandra. Мы расскажем об этом, а также о том, как Cassandra устроена под капотом, её сильные и слабые стороны, какие решения мы принимали и что мы изменили в Cassandra, чтобы сделать наше хранилище более высокопроизводительным и надежным.
Франкенштейнизация Voldemort или key-value данные в Одноклассниках. Роман Ан...odnoklassniki.ru
A talk from jokerconf.com conference.
"Frankenstaining of Voldemort" or "key-value storage evolution at Odnoklassniki"
В докладе освещены Java-технологии хранения данных, обслуживающие десятки миллионов пользователей и работающие на сотнях серверов.
На примере социальной сети "Одноклассники" мы рассмотрим эволюцию хранилищ данных с высоким уровнем конкурентного доступа и с соблюдением требования постоянной доступности.
Мы разберём сильные и слабые стороны каждого из решений, начиная от технологии master-slave репликации на основе Berkeley DB и заканчивая симбиозом распределенных хранилищ Voldemort и Cassandra.
До недавнего времени в Одноклассниках около 50 ТБ данных, обрабатываемых в реальном времени, хранилось в Microsoft SQL Server. Многие знают, что для такого объема обеспечить быстрый и надежный, да еще и устойчивый к отказу ЦОД доступ, используя SQL СУБД, практически невозможно. Обычно в таких случаях используют одно из NoSQL хранилищ, но не всё можно перенести в NoSQL: некоторые сущности требуют гарантий ACID-транзакций.
Это ограничение подвело нас к необходимости использования NewSQL хранилища, то есть СУБД, предоставляющей отказоустойчивость, масштабируемость и быстродействие NoSQL-систем, но при этом сохраняющей привычные для классических систем ACID-гарантии. Работающих промышленных систем этого нового класса немного (сразу приходит на ум только Google Spanner), а доступных — и вовсе нет. Поэтому мы реализовали такую систему сами на любимой нами Java и запустили ее в промышленную эксплуатацию несколько месяцев назад.
Доклад про то, как устроено это хранилище будет интересен всем, кто следит за развитием технологий управления базами данных и имеет опыт работы с (No)SQL.
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...Yandex
Рассказ об основных принципах, которых придерживается Viber в длительной разработке приложения с большой кодовой базой — если разработкой занимается распределённая команда. Мы обсудим используемые технологии, библиотеки, работу с кодом и многое другое.
Formal verification of operating system kernelsDenis Efremov
The speaker will share his experience of participating in projects on formal verification and analysis of access control modules for Astra Linux SE and Elbrus kernels, as well as verification of the Contiki code (OS for IoT) within the European VESSEDIA program. The speaker will disclose details about the development of formal access control models (Rodin/Event-B) and code specifications (Frama-C/ACSL), the use of static and dynamic analyzers, and the inclusion of formal analysis in the continuous integration cycle (continuous verification). Other types of work that help meet the certification requirements will also be considered.
https://standoff365.com/phdays10/schedule/development/formal-verification-of-operating-system-kernels
Сергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглитьTanya Denisyuk
После этого доклада вы будете знать, что такое Handlersocket, нужен ли он вам и «как его готовить».
Все как обычно — грабли, шишки, слезы из реальной жизни, направления «куда копать», примеры из практики. Вместе с докладом Сергей выложит код самописного php-клиента для HS, который мы используем в Badoo.
Статический анализ кода: борьба с удорожанием ошибокAndrey Karpov
Нет смысла говорить, что "надо писать код без ошибок". Ошибки были, есть и будут. Все хорошо понимают, что ошибки следует исправлять. Люди забывают, что ошибка должна быть исправлена с минимальными временными и денежными затратами!
Доклад посвящен разработке корректного программного обеспечения с применением одного из видов статического анализа кода. Будут освещены вопросы применения подобных методов, их слабые стороны и ограничения, а также рассмотрены результаты, которые они могут дать. На конкретных примерах будет продемонстрировано, как выглядят разработка спецификаций для кода на языке Си и доказательство соответствия кода спецификациям.
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...Mail.ru Group
Анализ кода — один из эффективных подходов к выявлению дефектов на этапе разработки программного обеспечения. Это позволяет избежать тривиальных и не очень ошибок, которые могут приводить к появлению уязвимостей. Существует ряд подходов, применяемых в анализаторах, на основании которых производится анализ, позволяющий снижать риски. Однако возникает ряд предубеждений, ведь не всегда предупреждение анализатора является реальным дефектом, тем более, что не всякий дефект является уязвимостью.
В презентации рассказывается о структурах памяти в JVM: Heap, Non-Heap, Stack, об атомарности операций и о garbage collector. Рассмотрен пример, как работает стек. Также, приведены примеры, как использовать jVisualVM и что она может показать.
Большинство считает CSS чем-то простым и не заслуживающим внимания. Но за мнимой простотой кроется большая сложность и огромный пласт проблем, не имеющих пока решения. Современный CSS с его объёмами, новыми фичами, разной поддержкой и багами браузеров, уже почти не поддается анализу человеком. Для этого появляются программы, которые разбирают CSS на атомы, анализируют и помогают сделать его лучше. Как к этому прийти, где мы сейчас и что ещё предстоит сделать.
Антон Потапов — С++ контейнеры и многопоточность: вместе или врозь?Yandex
Антон Потапов, Intel
Стандартная библиотека С++ содержит набор наиболее распространённых контейнеров для организации данных. С++11 предоставляет минимальные гарантии безопасности работы с контейнерами в многопоточной среде, но зачастую этого недостаточно для эффективного их использования в параллельных программах. В докладе речь пойдёт о современных подходах к реализации эффективных «конкурентных» контейнеров, а также основных возникающих при этом проблемах и способах их решения.
«Scrapy internals» Александр Сибиряков, Scrapinghubit-people
- Scrapy is a framework for web scraping that allows for extraction of structured data from HTML/XML through selectors like CSS and XPath. It provides features like an interactive shell, feed exports, encoding support, and more.
- Scrapy is built on top of the Twisted asynchronous networking framework, which provides an event loop and deferreds. It handles protocols and transports like TCP, HTTP, and more across platforms.
- Scrapy architecture includes components like the downloader, scraper, and item pipelines that communicate internally. Flow control is needed between these to limit memory usage and scheduling through techniques like concurrent item limits, memory limits, and delays between calls.
«Отладка в Python 3.6: Быстрее, Выше, Сильнее» Елизавета Шашкова, JetBrainsit-people
The document discusses debugging in Python 3.6. It describes tracing and frame evaluation debuggers. Tracing debuggers slow code execution significantly by calling the tracing function on every line. Python 3.6 introduced a new frame evaluation API that allows evaluating frames directly, avoiding the performance issues of tracing. The document demonstrates how to build a debugger using this approach, including setting breakpoints and stepping through code by inserting temporary breakpoints on each line. Frame evaluation allows building a debugger that is faster than tracing debuggers without significant performance penalties.
«Gevent — быть или не быть?» Александр Мокров, Positive Technologiesit-people
Gevent is a concurrency library for Python that uses greenlets, or lightweight coroutines, to provide asynchronous operations and non-blocking I/O. It allows developing highly concurrent applications using a simple and familiar synchronous style. The document compares gevent to other concurrency options like asyncio and discusses how it provides features like asynchronous task execution, event loops, and inter-greenlet communication using queues and callbacks.
«Что такое serverless-архитектура и как с ней жить?» Николай Марков, Aligned ...it-people
The document discusses what serverless computing is and how it can be used for building applications. Serverless applications rely on third party services to manage server infrastructure and are event-triggered. Popular serverless frameworks like AWS Lambda, Google Cloud Functions, Microsoft Azure Functions, and Zappa allow developers to write code that runs in a serverless environment and handle events and triggers without having to manage servers.
«Python на острие бритвы: PyPy project» Александр Кошкин, Positive Technologiesit-people
The document describes a talk on optimizing Python performance through just-in-time compilation. It discusses how the CPython interpreter works by evaluating bytecode through an evaluation loop. It then talks about how PyPy achieves faster performance through jit compilation of hot loops detected via tracing. The talk dives into the RPython language used to implement PyPy and shows an example of compiling a small Python program to C with RPython. It also discusses using partial evaluation to specialize an interpreter for constant inputs.
«PyWat. А хорошо ли вы знаете Python?» Александр Швец, Marilyn Systemit-people
The document appears to be a transcript of Python code being executed in an interactive Python shell. It contains examples testing the behavior of built-in functions and operators like sorted(), reversed(), isinstance(), sum(), float("nan"), is, min(), and comparisons like ==, <, on various data types including lists, tuples, and dictionaries.
«(Без)опасный Python», Иван Цыганов, Positive Technologiesit-people
The document discusses various security vulnerabilities in Python web applications. It begins with an overview of the OWASP Top 10 security risks, with sections focusing on risks related to using components with known vulnerabilities (A9) and insufficient attack protection (A7). For A9, it provides examples of vulnerabilities in popular Python packages and recommends checking changelogs and vulnerability databases. For A7, it recommends implementing attack protections like login attempts logging, rate limiting, and use of a web application firewall. The document also covers security misconfiguration (A5), giving examples like using default settings in production and exposing tracebacks.
«Как сделать так, чтобы тесты на Swift не причиняли боль» Сычев Александр, Ra...it-people
The document discusses best practices for writing tests in Swift, including recommendations to:
- Write clean, readable tests that focus on asserting a single truth
- Use a domain-specific language in tests for clarity
- Structure tests with "given-when-then"
- Mock dependencies through protocols to enable test isolation
- Favor partial mocks over fully mocking to limit complexity
«Кошелек или деньги: сложный выбор между памятью и процессором» Алексеенко Иг...
Aleksey Yeschenko "Моделирование данных с помощью CQL3". Выступление на Cassandra Conf 2013
1. Моделирование данных с CQL3:
типичные паттерны и анти-паттерны
Aleksey Yeschenko
Apache Cassandra Committer, Engineer @DataStax
@AYeschenko
2. Кто я такой
• Backend Ruby web-dev (давно и неправда)
• Telecom Erlang dev (недавно и правда)
• Принуждают использовать Java+Python (cqlsh) в DataStax с июля
2012
• Apache Cassandra committer с ноября 2012
• @AYeschenko
3. Когда использовать C*
• Необходима Active-Active репликация между несколькими датацентрами
• Необходим (около) 100% аптайм
• Данные больше не умещаются в PostgreSQL/MySQL/etc.
• PostgreSQL/MySQL/etc. больше не справляются с объёмом записи
• Модель Cassandra изначально идеально подходит для
приложения
• Нет необходимости в ad-hoc запросах
• Любое другое решение стоит $$$$$
* 1 и более пунктов из списка == true
7. Как хранятся данные + терминология
• Partition ключ и множество ячеек (до 2 миллиардов)
• Хэш partition ключа определяет ноды, к которым принадлежит
partition
• Быстрое чтение по partition ключу
• На диске и в памяти, ячейки всегда отсортированы по имени
• Компаратор для сортировки задаётся пользователем
1
Имя ячейки
2 Миллиарда
...
Имя ячейки
Значение ячейки
Значение ячейки
Timestamp
Timestamp
TTL
TTL
Partition ключ
8. Идеальная нагрузка
• Запись доминирует
• Перезапись/удаление ячеек отсутствуют или не очень часты
• Чтение по ключу + (имени ячейки или небольшим отрезкам
ячеек в порядке компаратора)
9. Идеальная нагрузка
• Логи
• Данные с сенсоров
• Финансовые данные (ticks)
• Ads - клики и отображения, аналитика
• Необязательно именно временные ряды (в порядке timestamp);
любые данные, естественно упорядоченные по
последовательному значению
• Нужны последние N значений
11. Паттерн #1: временной ряд
CREATE TABLE temperature (
weatherstation_id text,
partition ключ
event_time timestamp,
кластеринговая колонка
temp int,
PRIMARY KEY (weatherstation_id, event_time)
) WITH CLUSTERING ORDER BY (event_time DESC);
составной ключ
обратный порядок
сортировки ячеек
• Каждая станция регулярно собирает показания
• Один partition == одна станция
• Одно показание == одна ячейка (здесь две, технически)
• Потенциально очень широкий partition
12. Паттерн #1: временной ряд
CREATE TABLE temperature (
weatherstation_id text,
partition ключ
event_time timestamp,
кластеринговая колонка
temp int,
PRIMARY KEY (weatherstation_id, event_time)
составной ключ
обратный порядок
сортировки ячеек
) WITH CLUSTERING ORDER BY (event_time DESC);
SVO
weatherstation_id
1386475781 1386475781:temp 1386475780 1386475780:temp 1386475779 1386475779:temp …
*
-6
*
event_time
-6
*
temp
-5
…
* маркеры CQL3 ряда
13. Паттерн #1: временной ряд
CREATE TABLE temperature (
weatherstation_id text,
date text,
составной partition ключ
event_time timestamp,
temp int,
PRIMARY KEY ((weatherstation_id, date), event_time)
) WITH COMPACT STORAGE AND CLUSTERING ORDER BY (event_time DESC);
• Один partition для пары {weatherstation_id, date}
• Отсутствие оверхеда маркера ряда и имени колонки
14. Паттерн #1: временной ряд
CREATE TABLE temperature (
weatherstation_id text,
date text,
составной partition ключ
event_time timestamp,
temp int,
PRIMARY KEY ((weatherstation_id, date), event_time)
) WITH COMPACT STORAGE AND CLUSTERING ORDER BY (event_time DESC);
SVO:2013-12-09
1386475781
1386475780
1386475779
…
-6
-6
-5
…
date
weatherstation_id
timestamp
temp
15. Анти-паттерн #1: неуместное использование
встроенных индексов
• RDBMS опыт с индексацией НЕ переносится в C*
16. Анти-паттерн #1: неуместное использование
встроенных индексов
• RDBMS опыт с индексацией НЕ переносится в C*
• Встроенные индексы в C* != RDBMS индексы
17. Анти-паттерн #1: неуместное использование
встроенных индексов
• RDBMS опыт с индексацией НЕ переносится в C*
• Встроенные индексы в C* != RDBMS индексы
• Встроенные индексы в C* != RDBMS индексы
18. Анти-паттерн #1: неуместное использование
встроенных индексов
• RDBMS опыт с индексацией НЕ переносится в C*
• Встроенные индексы в C* != RDBMS индексы
• Встроенные индексы в C* != RDBMS индексы
• Встроенные индексы в C* != RDBMS индексы
19. Анти-паттерн #1: неуместное использование
встроенных индексов
• RDBMS опыт с индексацией НЕ переносится в C*
• Встроенные индексы в C* != RDBMS индексы
• Встроенные индексы в C* != RDBMS индексы
• Встроенные индексы в C* != RDBMS индексы
• Для удобства, не для улучшения производительности
• Достаточно ограничены в плане удобства
• Следует избегать, по большей части
20. Анти-паттерн #1: неуместное использование
встроенных индексов
cqlsh:nope> CREATE TABLE users (
... username varchar,
... email varchar,
... fullname varchar,
... last_login timestamp,
... PRIMARY KEY (username)
... );
!
cqlsh:nope> INSERT INTO users (username, email, fullname) VALUES ('ay',
'aleksey@datastax.com', 'Aleksey Yeschenko');
!
cqlsh:nope> SELECT * FROM users WHERE email = 'aleksey@datastax.com';
Bad Request: No indexed columns present in by-columns clause with Equal operator
22. Анти-паттерн #1: неуместное использование
встроенных индексов
cqlsh:nope> CREATE INDEX ON users (email);
!
cqlsh:nope> SELECT * FROM users WHERE email = 'aleksey@datastax.com';
username | email
| fullname
| last_login
----------+----------------------+-------------------+------------
ay | aleksey@datastax.com | Aleksey Yeschenko |
!
(1 rows)
null
23. Анти-паттерн #1: неуместное использование
встроенных индексов
• При высокой и средней кардинальности колонки решается
‘ручным’ вторичным индексом
• Отдельная таблица для обратного лукапа
25. Анти-паттерн #1: неуместное использование
встроенных индексов
cqlsh:yep> BEGIN BATCH
... INSERT INTO users (username, email, fullname) VALUES ('ay', 'aleksey@datastax.com', 'Aleksey
Yeschenko');
... INSERT INTO users_by_email_idx (email, username) VALUES ('aleksey@datastax.com', 'ay');
... APPLY BATCH;
!
cqlsh:yep> SELECT username FROM users_by_email_idx WHERE email = 'aleksey@datastax.com';
username
----------
ay
!
cqlsh:yep> SELECT * FROM users WHERE username = 'ay';
username | email
| fullname
| last_login
----------+----------------------+-------------------+------------
ay | aleksey@datastax.com | Aleksey Yeschenko |
null
26. Анти-паттерн #1: неуместное использование
встроенных индексов
• При средней/низкой кардинальности свой, отдельный набор
проблем
• Главная - большое количество random i/o
• Решается правильной моделью/денормализацией вместо
использования встроенных индексов
27. Анти-паттерн #1: неуместное использование
встроенных индексов
• Q: Когда вообще следует использовать встроенные индексы?
• A: Для поиска рядов с 1+ кластеринговыми колонками внутри
определённого partition (зная partition ключ)
28. Анти-паттерн #1: неуместное использование
встроенных индексов
CREATE TABLE example (
partition_key varchar,
clustering_col0 varchar,
clustering_col1 varchar,
val varchar
);
!
CREATE INDEX ON example (val);
!
SELECT * FROM example WHERE partition_key = ‘some_pk’ AND val = ‘some_val’;
29. Анти-паттерн #1: неуместное использование
встроенных индексов
• Всё вышесказанное распространяется на индексы коллекций в
2.1
• Обращайтесь со встроенными индексами как с expert-level
feature
30. Паттерн #2: денормализация
• Отношения без реляционности
• Без использования foreign key
CREATE TABLE users (!
username varchar,!
firstname varchar,!
lastname varchar,!
email varchar, !
PRIMARY KEY(username)!
);
• Users 1-M Videos
Users
username firstname
lastname email
tcodd
rboyce
Edgar
Raymond
Codd
Boyce
videoid
99051fe9
videoname
My funny cat
b3a76c6b Math
Videos
tcodd@relational.com
rboyce@relational.com
username description
tcodd
My cat plays
the pianodog
Now my
tcodd
plays
tags
cats,piano,lol
dogs,piano,lol
CREATE TABLE videos (!
videoid uuid,!
videoname varchar,!
username varchar,!
description varchar, !
tags varchar,!
upload_date timestamp,!
PRIMARY KEY(videoid)!
);
31. Паттерн #2: денормализация
• Лукап видео по username
• Запись в две таблицы сразу
• Без встроенных индексов
CREATE TABLE username_video_index (!
username varchar,!
videoid uuid,!
upload_date timestamp,!
video_name varchar,!
PRIMARY KEY (username, videoid)!
);
SELECT video_name!
FROM username_video_index!
WHERE username = ‘ctodd’!
AND videoid = ‘99051fe9’
32. Паттерн #2: денормализация
• Users 1-M Comments
• Videos 1-M Comments
• Без встроенных индексов
Users
username firstname
lastname email
tcodd
rboyce
Codd
Boyce
videoid
99051fe9
Edgar
Raymond
videoname
My funny cat
b3a76c6b Math
Videos
tcodd@relational.com
rboyce@relational.com
username description
tcodd
My cat plays
the pianodog
Now my
tcodd
plays
tags
cats,piano,lol
dogs,piano,lol
Comments
username
tcodd
videoid
99051fe9
comment
Sweet!
rboyce
b3a76c6b
Boring :(
33. Паттерн #2: денормализация
• Две таблицы для выборки по видео и по пользователям
• Запись в три таблицы сразу (comments, comments_by_video,
comments_by_user)
• Не жалеть запись
CREATE TABLE comments_by_video (!
videoid uuid,!
username varchar,!
comment_ts timestamp,!
comment varchar,!
PRIMARY KEY (videoid,username)!
);
CREATE TABLE comments_by_user (!
username varchar,!
videoid uuid,!
comment_ts timestamp,!
comment varchar,!
PRIMARY KEY (username,videoid)!
);
35. Анти-паттерн #2: очереди и очередеподобные нагрузки
• Cassandra не лучшее решение для очередей
• Можно, но требует гимнастики
• Лучше использовать что-нибудь вроде Kafka/RabbitMQ
• Любой паттерн, где в partition удаляются ячейки и выполняются
slice сканы, включающие удалённые ячейки
• Пример - нарочно упрощён, ради иллюстрации
36. Анти-паттерн #2: очереди и очередеподобные нагрузки
—— naive путь
CREATE TABLE queues (
name text,
enqueued_at timeuuid,
payload blob,
PRIMARY KEY (name, enqueued_at) —— ячейки упорядочены по времени вставки, ASC
) WITH COMPACT STORAGE;
37. Анти-паттерн #2: очереди и очередеподобные нагрузки
—— 1000x добавить в очередь:
INSERT INTO queues (name, enqueued_at, payload) VALUES (‘queue-1’, now(), 0x…);
!
—— 999x убрать из очереди, индивидуально:
DELETE FROM queues WHERE name = ‘queue-1’ AND enqueued_at = ?;
!
—— достать последний элемент из очереди:
SELECT enqueued_at, payload
FROM queues
WHERE name = 'queue-1'
LIMIT 1;
38. Анти-паттерн #2: очереди и очередеподобные нагрузки
queue-1
51c220e0-60…
58940a00-60..
61163b30-60..
995 x …
X
X
X
X
6e1ac030-60… ab36fa10-60..
X
<some blob>
39. Анти-паттерн #2: очереди и очередеподобные нагрузки
activity
| source
| elapsed
-------------------------------------------+-----------+--------
execute_cql3_query | 127.0.0.3 |
0
Message received from /127.0.0.3 | 127.0.0.1 |
42
Sending message to /127.0.0.1 | 127.0.0.3 |
718
Executing single-partition query on queues | 127.0.0.1 |
145
Acquiring sstable references | 127.0.0.1 |
158
Merging memtable contents | 127.0.0.1 |
189
Merging data from memtables and 0 sstables | 127.0.0.1 |
235
Read 1 live and 9999 tombstoned cells | 127.0.0.1 |
251102
Enqueuing response to /127.0.0.3 | 127.0.0.1 |
252976
Sending message to /127.0.0.3 | 127.0.0.1 |
253052
Message received from /127.0.0.1 | 127.0.0.3 |
324314
Processing response from /127.0.0.1 | 127.0.0.3 |
324535
Request complete | 127.0.0.3 |
324812
40. Анти-паттерн #2: очереди и очередеподобные нагрузки
• partition сканируется до тех пор пока LIMIT неудалённых ячеек
не будет собран, или
• пока не закончились ячейки в partition, или
• пока не встретится ячейка вне заданных границ (если указано в
where)
41. Анти-паттерн #2: очереди и очередеподобные нагрузки
—— зная последний удалённый элемент
SELECT enqueued_at, payload
FROM queues
WHERE name = 'queue-1'
AND enqueued_at > 6e1ac030-60b9-11e3-949a-0800200c9a66
LIMIT 1;
42. Анти-паттерн #2: очереди и очередеподобные нагрузки
queue-1
51c220e0-60…
58940a00-60..
61163b30-60..
995 x …
X
X
X
X
6e1ac030-60… ab36fa10-60..
X
<some blob>
43. Анти-паттерн #2: очереди и очередеподобные нагрузки
activity
| source
| elapsed
-------------------------------------------+-----------+--------
execute_cql3_query | 127.0.0.3 |
0
Sending message to /127.0.0.1 | 127.0.0.3 |
965
Message received from /127.0.0.3 | 127.0.0.1 |
34
Executing single-partition query on queues | 127.0.0.1 |
339
Acquiring sstable references | 127.0.0.1 |
355
Merging memtable contents | 127.0.0.1 |
461
Partition index lookup over for sstable 3 | 127.0.0.1 |
1122
Merging data from memtables and 1 sstables | 127.0.0.1 |
2268
Read 1 live and 0 tombstoned cells | 127.0.0.1 |
4404
Message received from /127.0.0.1 | 127.0.0.3 |
6109
Enqueuing response to /127.0.0.3 | 127.0.0.1 |
4492
Sending message to /127.0.0.3 | 127.0.0.1 |
4606
Processing response from /127.0.0.1 | 127.0.0.3 |
6608
Request complete | 127.0.0.3 |
6901
44. Анти-паттерн #2: очереди и очередеподобные нагрузки
• partitioning по дате
• хинты для чтения
• то же относится к TTL
• худший сценарий - death by OOM
• https://issues.apache.org/jira/browse/CASSANDRA-6117 (Avoid
death-by-tombstone by default) 10k warning, 50k error
• http://www.datastax.com/dev/blog/cassandra-anti-patternsqueues-and-queue-like-datasets
45. Что дальше - вебинары по моделированию
• http://youtu.be/px6U2n74q3g - The Data Model is Dead, Long Live
the Data Model
• http://youtu.be/qphhxujn5Es - Become a Super Modeler
• http://youtu.be/T_WRC_GjRd0 - The World's Next Top Data Model
• http://youtu.be/UP74jC1kM3w - Understanding How CQL3 Maps to
Cassandra's Internal Data Structure