在Percona XtraDB集群中,有一个GCache和Record-Set缓存(也可称为事务写集缓存)的概念。如果您正在运行长事务,那么使用这两个缓存通常会造成混淆,因为它们都会导致创建磁盘级文件。本手册介绍了它们的主要区别。
一、记录集缓存(Record-Set Cache)
当您在任何特定节点上运行长时间运行的事务时,它将尝试为其尝试修改的每一行附加一个密钥(密钥是该行的唯一标识符{db,table,pk.columns})。这些信息被缓存在out-write-set中,然后发送给组进行认证。
密钥被缓存在HeapStore中(有page-size=64K和total-size=4MB)。如果事务数据大小超过此限制,则存储将从堆切换到页(其具有page-size=64MB和total-limit=free-space-on-disk)。
所有这些限制都是不可配置的,但每次事务的内存页大小大于4MB可能会由于内存压力而导致事件停止,因此此限制是合理的。当Galera支持大型事务时,这是另一个限制。
同样长时间运行的事务也会生成binlog数据,这些数据也会附加到commit(HeapStore-> FileStore)上的out-write-set。 这些数据可能很重要,因为它是由事务插入/更新/删除的行的二进制日志映像。 wsrep_max_ws_size变量控制这部分写入集的大小。 该阈值不考虑为缓存键和标题分配的大小。
如果FileStore被使用,它将在磁盘上创建一个文件(名称如xxxx_keys和xxxx_data)以存储缓存数据。这些文件一直保存到提交事务,因此事务的生命周期被链接。
当节点完成事务并即将提交时,它将使用这两个文件(如果数据大小足够长以便使用FileStore)生成最终写入集HEADER,并将其发布为集群认证。
执行事务的本地节点也将充当订阅节点,并将通过群集发布机制接收其自己的写入集。这一次,本地节点将尝试将写入集缓存到其GCache中。GCache配置控制GCache保留多少数据。
二、GCache
GCache保存在群集上发布的写入集以进行复制。在GCache中写入集的生命周期不是事务链接的。
当一个JOINER节点需要一个IST时,它将通过这个GCache进行服务(如果可能的话)。
GCache也将创建文件到磁盘。
在任何给定的时间点,本地节点都有两个写入集副本:一个在GCache中,另一个在记录集缓存中(Record-Set Cache)。
例如,让我们INSERT/UPDATE在一个表格中说出200万行,并使用以下模式。
(int , char (100 ), char (100 ) 与 pk (int , char (100 ))
它将在后台创建写入键/数据文件,类似于以下内容:
-rw ------- 1 XXX XXX 67108864年04月11 12:26 0x00000707_data.000000
-rw ------- 1 XXX XXX 67108864年04月11 12:26 0x00000707_data.000001
-rw ------- 1 XXX XXX 67108864年04月11 12:26 0x00000707_data.000002
-rw ------- 1 XXX XXX 67108864年04月11 12:26 0x00000707_keys.000000