Использование ScyllaDB в Python: Полное руководство

Использование ScyllaDB в Python: Полное руководство


Использование ScyllaDB в Python: Полное руководство

ScyllaDB — высокопроизводительная NoSQL СУБД, совместимая с Apache Cassandra, но написанная на C++ для максимальной скорости. Она обрабатывает миллионы операций в секунду с задержкой менее 1 мс, идеальна для real-time приложений. В этой статье разберем интеграцию ScyllaDB с Python.


1. Установка и настройка

Требования:

  • Кластер ScyllaDB (локальный или облачный, например ScyllaDB Cloud).
  • Python ≥ 3.7.

Установка драйвера:
Используйте официальный драйвер Cassandra для Python (совместимый с ScyllaDB):

pip install cassandra-driver

Настройка кластера:
Запустите ScyllaDB через Docker:

docker run --name scylla -d scylladb/scylla

2. Подключение к кластеру

from cassandra.cluster import Cluster
from cassandra.auth import PlainTextAuthProvider
from cassandra.policies import TokenAwarePolicy, DCAwareRoundRobinPolicy

auth_provider = PlainTextAuthProvider(username='username', password='password')
cluster = Cluster(
    contact_points=['127.0.0.1'],
    auth_provider=auth_provider,
    load_balancing_policy=TokenAwarePolicy(DCAwareRoundRobinPolicy()),
    port=9042
)
session = cluster.connect()

3. Создание keyspace и таблицы

session.execute("""
    CREATE KEYSPACE IF NOT EXISTS shop 
    WITH replication = {
        'class': 'SimpleStrategy', 
        'replication_factor': 3
    }
""")

session.execute("""
    CREATE TABLE IF NOT EXISTS shop.products (
        product_id UUID PRIMARY KEY,
        name TEXT,
        price DECIMAL,
        category TEXT
    )
""")

4. CRUD-операции

Вставка данных:

from cassandra.util import uuid_from_time
from datetime import datetime

product_id = uuid_from_time(datetime.now())
session.execute(
    "INSERT INTO shop.products (product_id, name, price, category) VALUES (%s, %s, %s, %s)",
    (product_id, 'Laptop', 1200.99, 'electronics')
)

Чтение данных:

rows = session.execute("SELECT * FROM shop.products WHERE category = %s", ['electronics'])
for row in rows:
    print(row.name, row.price)

Обновление и удаление:

# Обновление
session.execute(
    "UPDATE shop.products SET price = %s WHERE product_id = %s",
    (1100.00, product_id)
)

# Удаление
session.execute(
    "DELETE FROM shop.products WHERE product_id = %s",
    [product_id]
)

5. Асинхронные запросы

Используйте cassandra.io.asyncioreactor для асинхронности:

from cassandra.cluster import Cluster
from cassandra.query import tuple_factory

async def fetch_data():
    cluster = Cluster(reactor_twisted=True)
    session = cluster.connect('shop')
    session.row_factory = tuple_factory

    future = session.execute_async("SELECT * FROM products")
    result = await future
    for row in result:
        print(row)

6. Оптимизация производительности

  • Пакетные запросы:

    from cassandra.query import BatchStatement
    batch = BatchStatement()
    batch.add("INSERT INTO products (product_id, name) VALUES (%s, %s)", (uuid1, 'Phone'))
    batch.add("UPDATE products SET price = %s WHERE product_id = %s", (999.99, uuid2))
    session.execute(batch)
  • Тюнинг драйвера:
    Настройка пула соединений:

    cluster = Cluster(
        max_connections_per_host=100,
        max_requests_per_connection=32768
    )
  • Использование Prepared Statements:

    query = session.prepare("SELECT * FROM products WHERE category = ?")
    rows = session.execute(query, ['electronics'])

7. Обработка ошибок

from cassandra import Unavailable, OperationTimedOut

try:
    session.execute(query)
except Unavailable:
    print("Недостаточно реплик для записи")
except OperationTimedOut:
    print("Таймаут операции")

8. Пример: Аналитика в реальном времени

Сценарий: сбор метрик IoT-устройств.

# Создание таблицы
session.execute("""
    CREATE TABLE iot_metrics (
        device_id UUID,
        timestamp TIMESTAMP,
        temperature FLOAT,
        PRIMARY KEY (device_id, timestamp)
    ) WITH CLUSTERING ORDER BY (timestamp DESC)
""")

# Вставка данных с TTL (автоудаление через 1 час)
session.execute(
    "INSERT INTO iot_metrics (device_id, timestamp, temperature) VALUES (%s, %s, %s) USING TTL 3600",
    (device_uuid, datetime.now(), 23.5)
)

# Запрос последних 10 показаний устройства
rows = session.execute(
    "SELECT * FROM iot_metrics WHERE device_id = %s LIMIT 10",
    [device_uuid]
)

9. Преимущества ScyllaDB перед Cassandra

  • Производительность: До 10× выше пропускной способности.
  • Низкие задержки: Оптимизированный C++ движок.
  • ScyllaDB Shard-Per-Core: Каждое ядро CPU обрабатывает свой шард данных.
  • Полная совместимость: Работает с Cassandra Query Language (CQL).

10. Ограничения

  • Требует глубокого понимания data-модели Cassandra.
  • Сложности с агрегацией данных (используйте Spark или ScyllaDB Spark Connector).

Заключение
ScyllaDB в Python — мощное решение для high-load проектов. Благодаря драйверу cassandra-driver, разработка становится простой, а производительность сравнима с нативными приложениями. Для старта:

  1. Разверните кластер (локально или в облаке).
  2. Используйте Prepared Statements и асинхронные запросы.
  3. Следуйте шаблонам data modeling Cassandra.

Официальная документация — лучший ресурс для углубленного изучения.