Базы данных: введение, часть четвертая

Илья Тетерин
2011-10-12

(use arrow keys or PgUp/PgDown to move slides)

Новости мира баз данных

Oct 10, 2011 - Сбой в работе mail.ru

ИТАР ТАСС: В работе российского почтового интернет-сервиса "Мейл.ру" произошел сбой

МОСКВА, 10 октября. /ИТАР-ТАСС/. Пользователи крупнейшего российского почтового сервиса "Мейл.ру" ... испытывают трудности с доступом к своим почтовым ящикам. При попытке проверить почту или открыть письмо на экране появляются сообщения то об ошибке сервера, то о перегрузке базы данных.

Проблемы с доступом к почтовому сервису начались примерно в полдень, при этом остальные сервисы портала "Мейл.ру" работают нормально.

roem.ru 11.10.2011: В результате внедрения новой более оптимальной системы хранения данных произошел программно-аппаратный сбой. Наши специалисты устранили проблему в течении 2-х часов. Сбой состоял в недоступности почты для примерно 8-10% пользователей. Никаких потерь или утечей данных не было.

wikipedia:mail.ru ... почта (22,7 млн человек ежемесячно) ...

pulser: 22.7м в месяц ... 756k в день ... 30 000 человек в час ... 10% - это 3 000 человек в течение часа

это не много, не мало - это проблемы availability в кластере ... но они заметны на уровне ИТАР-ТАСС ...

SQL vs NoSQL

Relational Database Management System + SQL

Oracle / MySQL / PostgreSQL / HSQLDB

NoSQL (Not Only SQL) - nosql-database.org

Key Value - Memcached, Redis

Document Store - MongoDB, CouchDB

Graph DB - Neo4j, HyperGraphDB, FlockDB

... etc ...

wikipedia:NoSQL ( рус )

Flashback:

Почему долго работает мой запрос?

На примере: дайте седьмую запись

Мы точно знаем что мы хотим получить и хотим получить одну единственную запись.

Запрос

SQL Select:

-- ключевое слово - команда
select 
-- какие поля ( * )
  fio, phone 
-- ключевое слово - разделитель
from 
-- имя коллекции
  phones 
-- ключевое слово - ограничения
where 
-- ограничения через AND / OR 
  id = 7

Сценарий исполнения запроса

формирует запрос

соединяется с базой

Class.forName("com.mysql.jdbc.Driver");
String myDatabaseURL = "jdbc:mysql://mydomain.com/database?user=" 
    + myUsername + "&password=" + myPassword;
java.sql.Connection con = DriverManager.getConnection(myDatabaseURL);

передаем запрос

сервер парсит запрос

Пример кода

public interface Command {
  void process(Processor p, String cmd) throws IOException;
  boolean isApplicable(String cmd); }

public abstract class AbstractDump implements Command {
  public boolean isApplicable(String cmd) {
    return "/dump".equals(cmd) || "Dump".equals(cmd); }}

public class MasterDump extends AbstractDump {
  public void process(Processor p, String cmd) throws IOException {
    boolean result = PhoneBook.getPhoneBook().dump();
    p.writeResponse(result ? "OK" : "ERROR"); }}

COMMANDS = new ArrayList();
COMMANDS.add(new MasterCommit());
COMMANDS.add(new MasterDump());

for (MasterCommand cmd : COMMANDS) {
  if (cmd.isApplicable(string)) {
    cmd.process(this, string);
    break; }} 
by Ксения Мамич
Generated in IntelliJ IDEA by yFiles

находит хранилище / коллекцию

получает данные из коллекции

преобразует в данные для ответа

отправляет по сети

восстановление на клиенте

закрытие соединения

Оптимизации

Что можно сделать, дабы было быстрее

Клиент и соединения

All you ever wanted to know about writing bloom filters
Bloom Filters - the math
m - колво битов, k - колво hash функций, n - колво ключей ... интересно при k > 2 и m/n > 10 ...

Сервер и соединения

Словарь базы

Получение данных

Получение данных - индексы

Преобразование формата data file - response

Форматы сериализации

JVM-serializers - бенчмарки

Protocol Buffers, Etch, Hadoop and Thrift Comparison

Protocol buffers

http://code.google.com/apis/protocolbuffers/docs/overview.html

Why not just use XML?

Protocol buffers:

Вопросы?