(三)多租户场景的应用(企业版特性)
本节内容所使用的特性仅在Citus企业版中可用。
资源的扩展
多租户数据库的设计需要适应业务增长,以便存储未来规模下更多的数据。Citus可以通过添加新机器获得轻松扩展,并且无需进行任何更改或停用应用程序。
1. 扩充新的节点
通过重新平衡Citus集群中的数据,可以增加数据大小或客户数量,并根据需要提高性能。添加新机器允许您将数据保存在内存中,即使这些数据远远大于一台机器所能存储的数据。
如果只有少数大型承租者的数据增加,那么可以将这些特定的承租者隔离为独立的节点,以获得更好的性能。
要扩展Citus集群,首先向其添加一个新的工作节点,可以使用第一节中提到的master_add_node函数手动添加节点:
SELECT * from master_add_node('192.168.1.103', 5432);
2. 平衡节点数据
添加了节点,它立即在系统中可用。由于它上没有存储租户,因此Citus还不会在那里运行任何查询。要移动现有数据到新增节点上,可以要求Citus重新平衡数据。在活动节点之间移动数据,用来均衡每个节点上的数据量:
SELECT rebalance_table_shards('companies');
重新平衡提供了协同定位的能力,帮助Citus重新平衡由company_id分布的其他表。此外,应用程序在数据重新平衡期间不需要停机,读请求可以无缝地继续,而写请求只有在影响当前正在运行的分片时才会被锁定。
大租户的处理
我们知道了如何随着租户数量的增加而扩展集群,但很多时候用户通常会遇到两个问题:第一个问题,随着时间推移,它们最大的租户变得太大;第二个问题,在单个数据节点上同时了承载大型租户和小型租户,那么此时,对性能是否构成了影响,我们需要怎么去处理这些问题。
1. ZIPF分布
关于第一个问题,通过调查来自大型SaaS站点的数据可以发现,随着租户数量的增加,租户数据的大小通常会遵循Zipfian分布。
例如,在一个包含100个租户的数据库中,最大的租户预计将占数据的20%左右。在一个大型SaaS公司的更现实的例子中,如果有一万个租户,最大的租户将占数据总量的2%左右。即使是10TB的数据,最大的租户也需要200GB,这个数据量级单个节点即可满足。
2. 混合大小型租户
关于大租户和小租户位于同一节点时的性能问题,通过标准的分片再平衡可能会改善大租户和小租户混合的整体性能,但Rebalancer只是简单地分配分片数据以均衡节点上的存储使用,而不检查每个分片上分配了哪些承租者。
为了改善资源分配,保证租户的QoS(Quality of Service,服务质量),有必要将大型租户移动到专用节点。Citus提供了实现这一点的工具,可以通过以下两个步骤来隔离这个租户的数据:
首先,将租户的数据隔离到适合移动的专用切分。CASCADE:将此更改应用到由company_id分片的其他表中。
SELECT isolate_tenant_to_new_shard(
'companies', 5, 'CASCADE'
);
我们将得到专为保存company_id=5的分片id。
其次,我们需要将数据移动到一个新的专用节点,按照之前的介绍,创建一个新节点。使用master_move_shard_placement函数需要设置wal_level为logical。
-- find the node currently holding the new shard
SELECT nodename, nodeport
FROM pg_dist_placement AS placement,
pg_dist_node AS node
WHERE placement.groupid = node.groupid
AND node.noderole = 'primary'
AND shardid = 102240;
-- move the shard to your choice of worker, it will also move the other shards created with the CASCADE option.
SELECT master_move_shard_placement(
102240,
'source_host', source_port,
'dest_host', dest_port);
查询pg_dist_placement,即可确认分片的移动情况。