在整体数据库上碎片之间有什么区别,例如postgresql的CitusDB扩展,分布式SQL ?两者都在分发表行和索引条目,但分布 sql 意味着更重要的是:分发 sql Transactions 并保持其酸性属性。
- 碎片整体数据库将使用本地交易,其上方是使用两相提交来提交所有碎片的协调员,并检测是否存在意见交易
- 分布式SQL数据库运行全局交易,以便应用程序可以将其视为一个逻辑数据库,以向OLTP应用程序提供水平可扩展性。
最明显的差异是与酸性特性。交易必须是 aromic (a),将数据库从一个状态转移到另一个状态,隔离之后。
一个典型的例子是银行帐户转移。如果将100美元从帐户a转移到帐户b,则执行传输的数据库交易一个接一个地将两个帐户额外添加到b at撤回100 $的100 $。 100 $当通过进行转移的交易查询时,但所有其他交易都不应看到此中间状态。
PGBENCH帐户转移
举一个例子,我将在yugabytedb上使用pgbench
。我只是初始化默认表,其中包括pgbench_accounts
表:
pgbench -i
这将创建余额为零的100000个帐户:
select count(*),min(abalance),max(abalance),sum(abalance)
from pgbench_accounts;
我创建一个自定义脚本,以在两个随机帐户之间进行简单的传输:
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
Yugabytedb分布式SQL
我在10个连接的背景中运行5分钟:
pgbench -f /tmp/pgbench-acid.sql -T 300 -c 10 &
现在来自psql
i查询总帐户余额每100毫秒:
select count(*),min(abalance),max(abalance),sum(abalance)
from pgbench_accounts;
\watch 0.1
由于所有交易都是酸的,总数量永远不会改变,因为所有转移都从一个帐户到另一个帐户:
这些是分布式交易,并在所有节点上进行读取和写入:
带有citusdb的postgresql
让我们在CitusDB上运行相同的操作。我开始一个3个节点群:
git clone https://github.com/citusdata/docker.git citusdata-docker
cd citusdata-docker
docker-compose up -d --scale worker=3
i初始化pgbench
表:
pgbench -i
我分发pgbench_accounts
表:
docker exec -it citusdata-docker_master psql -c '
select create_distributed_table('pgbench_accounts', 'aid');
'
我在背景中运行相同的脚本:
pgbench -f /tmp/pgbench-acid.sql -T 300 -c 10 &
和查询总金额每100毫秒:
select count(*),min(abalance),max(abalance),sum(abalance)
from pgbench_accounts;
\watch 0.1
总数有时为负,有时是正面的,因为持续的交易正在转移随机数量。分布式查询查看一些中间状态。
这不是酸,而是最终的一致性。在某个时候,如果不再进行交易,则碎片将被同步。
请注意,此示例仅与 a Tomicity和 i 酸的求解有关。 c 弱势阶段是关于完整性约束的,CitusDB不允许交叉脱落外键甚至全球索引。这是与分布式SQL的另一个区别(请参阅以前的post关于它)。 d 可关节性与持久性有关。该citusDB不受保护。您应该将多个备用数据库和同步提交添加,以保护每个碎片以保护它。这增加了不仅仅少数碎片的复杂性(Patroni模板可以有助于正确设计这种复杂性)。上面的yugabybyb群集具有与分布一起内置的复制,并且是一个复制因子3群集,可以透明地扩展到更大的节点,因为表实际分布到可以在线移动的较小碎片。
。CitusDB用例
的行为最终是预期多碎片查询的的一致性读取是可以接受的,对于它是为其设计的CitusDB用例(请参见When to Use Citus):
- 实时分析:表通常会按时碎片,数据摄入到一个碎片上。然后,查询将是一致的。
- 多租户申请:对于一些预定义的租户,桌子是每个租户的碎片,交易将在一个租户之内,并且将保持一致。
Yugabytedb用例
分布式SQL 数据库(Google Spanner,CockroactDB,TIDB,Yugabytedb)保证交叉交易的酸性特性,然后对于所有OLTP应用程序是一致的碎片交易,并在扩展时允许自动重新碎片。
中,唯一的是 postgresql兼容在交易方面是yugabytedb,因为其他人没有相同的特征和行为。对于所有分布式交易,YugabytedB支持所有具有相同行为的后Ql隔离水平。