
لعقود من الزمن، انقسم عالم قواعد البيانات بين معسكرين: **قواعد البيانات العلائقية** (PostgreSQL وMySQL) ذات الاتساق القوي ولكن قابلية التوسع محدودة، و**قواعد بيانات NoSQL** (MongoDB وCassandra) ذات قابلية التوسع الأفقي ولكن اتساق أضعف وقدرات استعلام محدودة.
لعقود من الزمن، انقسم عالم قواعد البيانات بين معسكرين: قواعد البيانات العلائقية (PostgreSQL وMySQL) ذات الاتساق القوي ولكن قابلية التوسع محدودة، وقواعد بيانات NoSQL (MongoDB وCassandra) ذات قابلية التوسع الأفقي ولكن اتساق أضعف وقدرات استعلام محدودة.
** SQL الموزعة ** (وتسمى أيضًا NewSQL) تعمل على سد هذه الفجوة. فهو يوفر القوة الكاملة لـ SQL - معاملات ACID، والانضمامات، والمفاتيح الخارجية، والأدوات المألوفة - على بنية موزعة وقابلة للتطوير أفقيًا. النتيجة: قوة الاتساق والاستعلام لقاعدة البيانات العلائقية مع قابلية التوسع في NoSQL.
Strong Consistency
▲
│ ┌───────────────────────┐
│ │ Distributed SQL │
│ │ (CockroachDB, │
│ │ YugabyteDB, │
│ │ Google Spanner) │
│ └───────────────────────┘
│
│ ┌──────────────┐ ┌──────────────────┐
│ │ Traditional │ │ Traditional │
│ │ SQL │ │ NewSQL │
│ │ (PostgreSQL,│ │ (Vitess, TiDB) │
│ │ MySQL) │ │ │
│ └──────────────┘ └──────────────────┘
│
│ ┌──────────────────┐
│ │ NoSQL │
│ │ (Cassandra, │
│ │ DynamoDB, │
│ │ CosmosDB) │
│ └──────────────────┘
└────────────────────────────────────────────────────
Horizontal Scalability ──────►
| ميزة | الوصف |
|---|---|
| واجهة SQL | دعم SQL الكامل: الصلات والاستعلامات الفرعية والتجمعات ووظائف النافذة |
| معاملات ACID | قابل للتسلسل أو عزل اللقطة عبر العقد |
| التحجيم الأفقي | أضف العقد دون توقف، وستتم إعادة توازن البيانات تلقائيًا |
| ** المشاركة التلقائية ** | يتم توزيع البيانات تلقائيًا عبر العقد |
| ** النسخ ** | النسخ المتماثل المتزامن من أجل المتانة (RPO=0) |
| توفر عالي | تجاوز الفشل تلقائيًا، بدون تدخل يدوي |
| ** التوزيع الجغرافي ** | يمكن أن تمتد البيانات إلى مناطق متعددة بزمن وصول أقل من 50 مللي ثانية |
┌──────────────────────────────────────────┐
│ Spanner Global Architecture │
├──────────────────────────────────────────┤
│ Zone 1 (us-east1) Zone 2 (europe-west)│
│ ┌──────────────┐ ┌──────────────┐ │
│ │ Leader Node │ │ Follower Node│ │
│ │ ┌────────┐ │ │ │ │
│ │ │ Spanner│ │ │ │ │
│ │ │ Server │ │ │ │ │
│ │ └────────┘ │ │ │ │
│ └──────────────┘ └──────────────┘ │
├──────────────────────────────────────────┤
│ TrueTime API (GPS + Atomic) │
│ Clock synchronization < 7ms │
└──────────────────────────────────────────┘
الابتكار الرئيسي: TrueTime API — مزامنة نظام تحديد المواقع العالمي (GPS) والساعة الذرية مما يوفر عدم اليقين على مدار الساعة. وهذا يتيح الاتساق الخارجي (قابلية الخطية) عبر العقد الموزعة عالميًا.
┌─────────────────────────┐
│ SQL Gateway │
│ (Any node can serve) │
└──────────┬──────────────┘
│
┌──────────────────────┼──────────────────────┐
│ │ │
┌─────▼─────┐ ┌─────▼─────┐ ┌─────▼─────┐
│ Node 1 │ │ Node 2 │ │ Node 3 │
│ ┌───────┐ │ │ ┌───────┐ │ │ ┌───────┐ │
│ │ Range A│ │ │ │ Range A│ │ │ │ Range A│ │
│ │ (LEADER)│ │ │(FOLLOWER│ │ │(FOLLOWER│ │
│ └───────┘ │ │ └───────┘ │ │ └───────┘ │
│ ┌───────┐ │ │ ┌───────┐ │ │ ┌───────┐ │
│ │ Range B│ │ │ │ Range B│ │ │ │ Range B│ │
│ │(FOLLOWER│ │ │ (LEADER)│ │ │(FOLLOWER│ │
│ └───────┘ │ │ └───────┘ │ │ └───────┘ │
└───────────┘ └───────────┘ └───────────┘
كيف يعمل CockroachDB:
تم تصميم YugabyteDB للتوافق مع PostgreSQL على مستوى البروتوكول السلكي:
-- This is standard PostgreSQL syntax — it just works
CREATE TABLE orders (
id UUID DEFAULT gen_random_uuid(),
customer_id UUID NOT NULL,
total NUMERIC(10,2) NOT NULL,
status TEXT NOT NULL DEFAULT 'pending',
created_at TIMESTAMPTZ DEFAULT NOW(),
PRIMARY KEY (id)
);
-- Distributed ACID transaction across nodes
BEGIN;
INSERT INTO orders (customer_id, total, status)
VALUES ($1, $2, 'pending');
UPDATE inventory SET quantity = quantity - 1
WHERE product_id = $3 AND quantity > 0;
COMMIT;
-- Full PostgreSQL ecosystem compatibility
-- Supports: pgAdmin, Prisma, DBeaver, all standard drivers
| ميزة | صرصورDB | يوغا بايت دي بي | تي دي بي | جوجل المفك |
|---|---|---|---|---|
| التوافق | بوستجري إس كيو إل (85%) | بوستجري إس كيو إل (95%+) | ماي إس كيو إل | الملكية |
| ** الاتساق ** | قابل للتسلسل | قابل للتسلسل | لقطة العزلة | الاتساق الخارجي |
| ** النسخ ** | طوف | طوف | طوف | باكسوس |
| ** التوزيع الجغرافي ** | نعم | نعم | نعم | نعم |
| ** المشاركة التلقائية ** | نعم (حسب النطاق) | نعم (حسب التجزئة/النطاق) | نعم (حسب النطاق) | نعم (بالتقسيم) |
| ** الفهارس الثانوية ** | عالمي (موزع) | العالمية + المحلية | العالمية + المحلية | عالمي |
| ** المفاتيح الخارجية ** | نعم | نعم | نعم | نعم |
| ** مركز السيطرة على الأمراض ** | نعم (حوض كافكا) | نعم (كافكا، مطاطا) | نعم (تيكدك) | نعم (حانة/فرعية) |
| الترخيص | BSL (المصدر متاح) | أباتشي 2.0 | أباتشي 2.0 | الملكية |
| إدارة السحابة | صرصورDB سحابة | إدارة YugabyteDB | سحابة تي دي بي | مفتاح السحابة |
| ** المضيف الذاتي ** | نعم | نعم | نعم | لا |
| حالة الاستخدام | لماذا SQL الموزعة | مثال |
|---|---|---|
| ** تطبيقات SaaS العالمية ** | يحتاج المستخدمون في جميع أنحاء العالم إلى زمن وصول منخفض واتساق قوي | حسابات مستخدمين متعددة المناطق |
| الأنظمة المالية | معاملات ACID عبر الأجزاء، دون فقدان البيانات | معالجة الدفع، دفتر الأستاذ |
| ** منصات التجارة الإلكترونية ** | المخزون، والأوامر، والعربات - كلها تحتاج إلى الاتساق | ارتفاع حركة المرور الجمعة السوداء |
| الألعاب | حالة اللاعب، ولوحات المتصدرين، والمعاملات | متعددة اللاعبين عبر المنطقة |
| السلسلة الزمنية لإنترنت الأشياء + البيانات الوصفية | SQL للتحليلات على البيانات الموزعة | القياس عن بعد للأسطول مع الصلات |
| السيناريو | لماذا | بديل أفضل |
|---|---|---|
| عمليات بحث بسيطة عن القيمة الرئيسية | النفقات العامة للمعاملات الموزعة غير مبررة | ريديس، دينامو دي بي |
| ** منطقة واحدة، بيانات صغيرة ** | التعقيد غير مطلوب | PostgreSQL |
| ** البحث عن النص الكامل ** | غير مصممة لفهرسة النص | بحث مرن |
| ** اجتياز الرسم البياني ** | الانضمام إلى العلاقات العميقة بطيء | Neo4j |
| ** إنتاجية كتابة عالية جدًا ** (> 100 ألف كتابة/ثانية/عقدة) | قد تكون النفقات العامة للإجماع مرتفعة للغاية | كاساندرا، سيلا دي بي |
-- Data is split by primary key ranges
Table: orders
Range 1: PK '00000000' to '3fffffff' → Node 1 (LEADER) + Node 2, Node 3
Range 2: PK '40000000' to '7fffffff' → Node 2 (LEADER) + Node 1, Node 3
Range 3: PK '80000000' to 'bfffffff' → Node 3 (LEADER) + Node 1, Node 2
Range 4: PK 'c0000000' to 'ffffffff' → Node 1 (LEADER) + Node 2, Node 3
الإيجابيات: عمليات مسح فعالة للنطاق، جيدة للمفاتيح التسلسلية. السلبيات: اكتب النقاط الفعالة في حالة إدراج مفاتيح تسلسلية (يتم حلها بواسطة فهارس التجزئة).
-- Hash-sharded primary key
CREATE TABLE orders (
id UUID DEFAULT gen_random_uuid(),
customer_id UUID,
total NUMERIC,
PRIMARY KEY (id HASH)
);
-- Data distribution by hash
Hash('00000000-...') = 0.23 → Tablet 1 → Node 1
Hash('11111111-...') = 0.67 → Tablet 2 → Node 2
Hash('22222222-...') = 0.12 → Tablet 3 → Node 3
الإيجابيات: توزيع متساوي للبيانات، ولا توجد نقاط ساخنة. السلبيات: عمليات فحص النطاق عبر الجدول بأكمله غير فعالة.
-- This transaction spans multiple nodes
BEGIN;
UPDATE account_a SET balance = balance - 100 WHERE id = 'A';
UPDATE account_b SET balance = balance + 100 WHERE id = 'B'; -- Different node
COMMIT;
-- Under the hood:
-- 1. Transaction coordinator (any node) acquires locks
-- 2. Prepares both participants
-- 3. Raft commits the transaction record
-- 4. COMMIT acknowledged to client
-- All-or-nothing — guaranteed ACID
يتم توزيع الفهارس نفسها عبر العقد:
CREATE INDEX idx_orders_customer ON orders (customer_id);
-- Query that uses the distributed index:
SELECT * FROM orders WHERE customer_id = $1;
-- 1. Routes to any node
-- 2. Node looks up customer_id in distributed index
-- 3. Index returns primary keys → fetch from correct ranges
-- 4. Returns results
يدعم SQL الموزع تغييرات المخطط دون توقف:
-- Add a column — non-blocking
ALTER TABLE orders ADD COLUMN discount NUMERIC(5,2) DEFAULT 0.00;
-- Create index — non-blocking (background build)
CREATE INDEX CONCURRENTLY idx_orders_date ON orders (created_at);
دفق تغييرات قاعدة البيانات إلى الأنظمة النهائية:
-- CockroachDB CDC
CREATE CHANGEFEED FOR TABLE orders, payments
INTO 'kafka://kafka-cluster:9092'
WITH updated, resolved, min_checkpoint_frequency = '5s';
-- YugabyteDB CDC connector
# Deploy to Kafka Connect
{
"name": "yb-cdc-connector",
"config": {
"connector.class": "io.yugabyte.cdc.YBChangeDataCaptureConnector",
"database.hostname": "yb-1.example.com",
"database.port": "5433",
"table.include.list": "public.orders"
}
}
منطقة واحدة (3 عقد):
replication:
factor: 3
constraints:
- "+region=us-east-1: 3"
# All data in one region, 3 copies, survives 2 node failures
منطقة متعددة (فشل منطقة البقاء على قيد الحياة):
replication:
factor: 3
constraints:
- "+region=us-east-1: 1"
- "+region=us-west-1: 1"
- "+region=eu-west-1: 1"
# One copy in each region, survives any single region failure
# Write latency: round-trip to the farthest region
مناطق متعددة ذات نصاب قريب (للكتابة ذات زمن الوصول المنخفض):
replication:
factor: 5
constraints:
- "+region=us-east-1: 3" # 3 copies here
- "+region=us-west-1: 1" # 1 copy for DR
- "+region=eu-west-1: 1" # 1 copy for DR
# Write quorum = 3, achievable within us-east-1
# Write latency = intra-region
| طوبولوجيا | زمن الاستجابة للكتابة (ص50) | قراءة الكمون (ص50) |
|---|---|---|
| عقدة واحدة | 1-5 مللي ثانية | 0.5-2 مللي ثانية |
| 3 عقد، نفس المنطقة | 5-15 مللي ثانية | 1-5 مللي ثانية |
| 3 عقد، 3 مناطق (الولايات المتحدة والاتحاد الأوروبي وآسيا والمحيط الهادئ) | 100-300 مللي ثانية | 5-50 مللي ثانية (الأقرب) |
| 5 عقد، منطقتان (النصاب القانوني قريب) | 5-15 مللي ثانية | 1-5 مللي ثانية |
Phase 1: Evaluate
- Identify tables that need horizontal scaling
- Assess which queries cross shards
- Plan sharding key
Phase 2: Migrate schema
- Convert CREATE TABLE statements
- Choose primary key strategy (hash vs. range)
- Handle sequences (use UUIDs instead of SERIAL)
Phase 3: Migrate data
- Use CDC or batch export/import
- Verify consistency
- Set up replication from old DB
Phase 4: Cut over
- Point application to new DB
- Monitor performance
- Keep old DB as rollback target for 1 week
-- PostgreSQL → CockroachDB
-- ❌ Sequences (not distributed)
SERIAL PRIMARY KEY → UUID DEFAULT gen_random_uuid()
-- ❌ Array functions not supported
array_agg(DISTINCT x) → json_agg(DISTINCT x) -- workaround
-- ❌ Long-running queries
-- Solution: add index or query hint
-- ❌ Cross-database queries (CockroachDB)
-- Each cluster = one database, no cross-DB queries
تمثل SQL الموزعة تقارب عقدين من تطور قاعدة البيانات - حيث تجمع بين موثوقية SQL وتعبيرها مع مرونة ومرونة الأنظمة الموزعة.
Q: Do you need horizontal write scaling?
├─ Yes
│ Q: Do you need ACID across all data?
│ ├─ Yes → Distributed SQL (CockroachDB, Spanner)
│ └─ No → NoSQL (Cassandra, DynamoDB)
└─ No
Q: Do you need SQL features (joins, aggregations)?
├─ Yes → PostgreSQL
└─ No → Key-value or document store
SQL الموزعة هي بنية قاعدة البيانات للعصر العالمي السحابي الأصلي - التطبيقات التي يجب أن تعمل في كل مكان، بتناسق قوي، دون أي تنازلات.
لا توجد تعليقات معتمدة بعد. قد تنتظر الردود الجديدة المراجعة.