从 MySQL 5.1 开始,数据不再需要完全在内存中。
我读过索引列(我认为整个索引结构)必须仍然在内存中(MySQL High Availability,2010,第 533 页,“MySQL Cluster 将所有索引列保留在主内存中”)。
有鉴于此,如果没有足够的内存(例如,一个巨大的数据库(> 100GB 或 1TB),运行在具有低内存配置的服务器上(例如,2 个数据节点,每个具有 1GB 的 RAM))会发生什么?
从 MySQL 5.1 开始,数据不再需要完全在内存中。
我读过索引列(我认为整个索引结构)必须仍然在内存中(MySQL High Availability,2010,第 533 页,“MySQL Cluster 将所有索引列保留在主内存中”)。
有鉴于此,如果没有足够的内存(例如,一个巨大的数据库(> 100GB 或 1TB),运行在具有低内存配置的服务器上(例如,2 个数据节点,每个具有 1GB 的 RAM))会发生什么?
MySQL 集群是围绕一个为内存匹配而优化的索引结构构建的;一个 T 树。这与 MySQL 中使用B-tree或B+tree结构的常规存储引擎不同,假设您有一些热点/非统一访问(这通常是一个安全的假设) )。
如果您想构建某种概念验证,没有什么可以阻止您使用大量交换来弥补您的内存不足。请注意,这不会很好地执行,并且您正在将产品用于它不适合的用例。
MySQL Cluster 支持将非索引列存储在仅磁盘上,并使用 LRU 缓存最近访问的数据。但是,索引列始终保存在内存中。
MySQL Cluster 根据 DataMemory 和 IndexMemory 参数预先分配所有内存。它不会动态地向底层操作系统请求更多内存。
这意味着您需要在集群中配置足够的内存以将所有索引列保存在内存中。如果您的数据集足够大以至于索引列大于可用的集群内存,那么您无法将该数据集加载到集群中。在某些时候,您将用完空间,并且您的插入事务将被中止。
在配置 DataMemory 和 IndexMemory 时,最好将自己限制在略小于每个系统中的物理内存的范围内。应该为操作系统和其他进程保留一些物理内存。
从理论上讲,MySQL Cluster 可以配置为通过交换设备使用虚拟内存(例如,多于物理内存),但正如其他答案所述,这不是专为用例而设计的。将内存中的结构交换到磁盘通常不是最佳选择,因为内存中的随机访问模式会导致对磁盘的随机访问,从而导致整个系统的交换抖动和减速。使用 MySQL Cluster,最可能的结果是由于交换数据节点对信号的响应速度不够快而导致的心跳故障和集群故障。
为了有效地支持大于聚合内存的索引,MySQL Cluster 需要支持磁盘索引格式(可能是 B 树等),其缓存和访问模式与磁盘访问属性一致。
如果没有足够的内存,这可能是您所期望的。文件将在您的驱动器上制作,您将在驱动器允许的范围内以最快的速度运行。
请务必正确限制 MySQL,使其不会消耗其他系统进程所需的所有内存。
基本上,一条链条的强度取决于其最薄弱的环节。
当设置私有虚拟服务器(使用 VMWare 设置 ESX 集群)时,集群中的所有裸机服务器都应该具有相同数量的 RAM。
MySQL 集群应该以同样的方式对待。如果任何服务器(即使只有 1 个)的内存比集群中的其他服务器少,那将是一个限制因素。如果具有 2GB RAM 的服务器导致 MySQL 集群中的其他服务器(即使这些其他服务器每个都有 8GB RAM)表现得就像它们最多只有 2GB 一样,我也不会感到惊讶。
至少,你应该
作为旁注,请记住 MySQL Cluster 还具有将数据存储在磁盘上的能力,每个服务器作为存储节点运行