Использование 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, разработка становится простой, а производительность сравнима с нативными приложениями. Для старта:
- Разверните кластер (локально или в облаке).
- Используйте Prepared Statements и асинхронные запросы.
- Следуйте шаблонам data modeling Cassandra.
Официальная документация — лучший ресурс для углубленного изучения.