Aurora Limitless – سازگاری جهانی (ACID)

Summarize this content to 400 words in Persian Lang
ویژگیهایی که در پستهای قبلی این مجموعه مورد بحث قرار گرفت، با دیگر راهحلهای اشتراکگذاری پایگاه داده برای PostgreSQL، مانند Citus، قابل مقایسه است. ما محدودیت های مشابهی را در مورد عملکرد و ویژگی های متقاطع شارد ذکر کرده ایم. با این حال، یک تفاوت مهم وجود دارد: در Citus، قرائت های متقاطع یکپارچگی نهایی را فراهم می کنند (به مثالی در چگونه ACID Citus است؟ مراجعه کنید). در مقابل، قرائت های متقاطع در Aurora Limitless به شدت سازگار است.
بیایید با جداول PgBench ایجاد شده در پست قبلی، همان چیزی را که در How ACID is Citus؟
من موجودی همه حساب ها را صفر می کنم:
postgres_limitless=> update pgbench_accounts set abalance=0;
UPDATE 100000
postgres_limitless=> select count(*),min(abalance),max(abalance),sum(abalance)
from pgbench_accounts;
count | min | max | sum
——–+—–+—–+—–
100000 | 0 | 0 | 0
(1 row)
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
من اسکریپت زیر را اجرا می کنم که پول را از یک حساب به حساب دیگر منتقل می کند تا مجموع موجودی ها تغییر نکند:
cat > /tmp/pgbench-acid.sql <<‘SQL’
\set aid1 random(1, 100000 * :scale)
\set aid2 random(1, 100000 * :scale)
\set delta random(-5000, 5000)
BEGIN;
UPDATE pgbench_accounts SET abalance = abalance + :delta WHERE aid = :aid1;
UPDATE pgbench_accounts SET abalance = abalance – :delta WHERE aid = :aid2;
END;
SQL
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
من ابتدا اسکریپت را قبل از بهروزرسانی موجودی اجرا کردم، اما با یک خطای قفل توزیع شده مواجه شدم:
\! pgbench -f /tmp/pgbench-acid.sql -T 300 -c 10 &
postgres_limitless=> update pgbench_accounts set abalance=0`
;
ERROR: aborting transaction participating in a distributed deadlock
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
این متفاوت از PostgreSQL است که در جداسازی Read Committed انتظار چنین خطای قابل امتحان مجددی را ندارید.برای حل این مشکل، من جدول را قبل از به روز رسانی قفل کردم:
begin transaction;
lock table pgbench_accounts in share mode;
update pgbench_accounts set abalance=0;
commit;
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
پس از بازنشانی موجودی، و اجرای تراکنش انتقال در پسزمینه، کل موجودی را پرس و جو میکنم:
select count(*),min(abalance),max(abalance),sum(abalance)
from pgbench_accounts;
\watch 0.1
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
مجموع همیشه ثابت می ماند، که گواه این است که یک عکس فوری ثابت می خواند:
Aurora Limitless از ساعت دیواری برای مقایسه زمانهای خواندن با زمانهای ارتکاب استفاده میکند و از خواندن عکسهای فوری از چندین قطعه مطمئن میشود. از آنجایی که ساعتهای هر قطعه میتوانند تغییر کنند، برای تضمین ثبات، انحراف ساعت را محاسبه میکند. این رویکرد مشابه روشی است که توسط YugabyteDB استفاده می شود. اجرای بر روی AWS به لطف Time Sync که می تواند زمان محدودی را برای ساعت فراهم کند، امکان همگام سازی دقیق زمان را فراهم می کند. من این را در دستیابی به همگام سازی دقیق ساعت در AWS توضیح داده ام.
با این کار، Aurora Limitless همان معنای تراکنش را به عنوان PostgreSQL برای Read Committed و Repeatable Read ارائه می کند. Serializable پشتیبانی نمی شود زیرا به یک مدیر قفل توزیع شده برای قفل های محمول نیاز دارد. خواندن از روتر یک عکس فوری ثابت از همه خرده ها دریافت می کند. رایت ها از یک commit دو فازی (2PC) با بازیابی خودکار تراکنش های معلق در صورت شکست استفاده می کنند.
ویژگیهایی که در پستهای قبلی این مجموعه مورد بحث قرار گرفت، با دیگر راهحلهای اشتراکگذاری پایگاه داده برای PostgreSQL، مانند Citus، قابل مقایسه است. ما محدودیت های مشابهی را در مورد عملکرد و ویژگی های متقاطع شارد ذکر کرده ایم. با این حال، یک تفاوت مهم وجود دارد: در Citus، قرائت های متقاطع یکپارچگی نهایی را فراهم می کنند (به مثالی در چگونه ACID Citus است؟ مراجعه کنید). در مقابل، قرائت های متقاطع در Aurora Limitless به شدت سازگار است.
بیایید با جداول PgBench ایجاد شده در پست قبلی، همان چیزی را که در How ACID is Citus؟
من موجودی همه حساب ها را صفر می کنم:
postgres_limitless=> update pgbench_accounts set abalance=0;
UPDATE 100000
postgres_limitless=> select count(*),min(abalance),max(abalance),sum(abalance)
from pgbench_accounts;
count | min | max | sum
--------+-----+-----+-----
100000 | 0 | 0 | 0
(1 row)
من اسکریپت زیر را اجرا می کنم که پول را از یک حساب به حساب دیگر منتقل می کند تا مجموع موجودی ها تغییر نکند:
cat > /tmp/pgbench-acid.sql <<'SQL'
\set aid1 random(1, 100000 * :scale)
\set aid2 random(1, 100000 * :scale)
\set delta random(-5000, 5000)
BEGIN;
UPDATE pgbench_accounts SET abalance = abalance + :delta WHERE aid = :aid1;
UPDATE pgbench_accounts SET abalance = abalance - :delta WHERE aid = :aid2;
END;
SQL
من ابتدا اسکریپت را قبل از بهروزرسانی موجودی اجرا کردم، اما با یک خطای قفل توزیع شده مواجه شدم:
\! pgbench -f /tmp/pgbench-acid.sql -T 300 -c 10 &
postgres_limitless=> update pgbench_accounts set abalance=0`
;
ERROR: aborting transaction participating in a distributed deadlock
این متفاوت از PostgreSQL است که در جداسازی Read Committed انتظار چنین خطای قابل امتحان مجددی را ندارید.
برای حل این مشکل، من جدول را قبل از به روز رسانی قفل کردم:
begin transaction;
lock table pgbench_accounts in share mode;
update pgbench_accounts set abalance=0;
commit;
پس از بازنشانی موجودی، و اجرای تراکنش انتقال در پسزمینه، کل موجودی را پرس و جو میکنم:
select count(*),min(abalance),max(abalance),sum(abalance)
from pgbench_accounts;
\watch 0.1
مجموع همیشه ثابت می ماند، که گواه این است که یک عکس فوری ثابت می خواند:
Aurora Limitless از ساعت دیواری برای مقایسه زمانهای خواندن با زمانهای ارتکاب استفاده میکند و از خواندن عکسهای فوری از چندین قطعه مطمئن میشود. از آنجایی که ساعتهای هر قطعه میتوانند تغییر کنند، برای تضمین ثبات، انحراف ساعت را محاسبه میکند. این رویکرد مشابه روشی است که توسط YugabyteDB استفاده می شود. اجرای بر روی AWS به لطف Time Sync که می تواند زمان محدودی را برای ساعت فراهم کند، امکان همگام سازی دقیق زمان را فراهم می کند. من این را در دستیابی به همگام سازی دقیق ساعت در AWS توضیح داده ام.
با این کار، Aurora Limitless همان معنای تراکنش را به عنوان PostgreSQL برای Read Committed و Repeatable Read ارائه می کند. Serializable پشتیبانی نمی شود زیرا به یک مدیر قفل توزیع شده برای قفل های محمول نیاز دارد. خواندن از روتر یک عکس فوری ثابت از همه خرده ها دریافت می کند. رایت ها از یک commit دو فازی (2PC) با بازیابی خودکار تراکنش های معلق در صورت شکست استفاده می کنند.