从MySQL 5.1中,数据不再需要完全存储在内存中。
我读过索引列(我认为整个索引结构)必须仍然在内存中(MySQL高可用性,2010年,pg。533,"MySQL群集将所有索引列保存在主内存中“)。
有鉴于此,如果没有足够的内存(即在内存不足的服务器上运行的大型数据库(> 100 1GB或1TB) (例如,2个数据节点,每个节点有1GB的RAM ),会发生什么?
发布于 2012-01-10 17:53:32
MySQL群集支持使用最近访问的数据的LRU缓存在磁盘上存储非索引列。但是,索引列总是保存在内存中。
MySQL集群根据DataMemory和IndexMemory参数分配所有内存。它不会动态地要求底层操作系统提供更多内存。
这意味着您需要在集群中配置足够的内存,以保存内存中的所有索引列。如果数据集足够大,以致索引列大于可用群集内存,则无法将该数据集加载到群集中。在某个时候,您将耗尽空间,插入事务将被中止。
在配置DataMemory和IndexMemory时,最好将自己限制在略小于每个系统中物理内存的范围内。应该为操作系统和其他进程保留一些物理内存。
理论上,MySQL集群可以配置为通过交换设备(例如,比物理内存更多)使用虚拟内存,但在其他答案状态下,这不是为用例设计的。将内存中的结构交换到磁盘通常是次优的,因为内存中的随机访问模式会导致对磁盘的随机访问,从而导致整个系统的交换冲击和减速。对于MySQL集群,最有可能的结果是心跳失败和集群失败,原因是交换数据节点对信号的响应不够快。
为了有效地支持大于聚合内存的索引,MySQL集群需要支持磁盘上的索引格式(可能是B树等),并使用与磁盘访问属性相一致的缓存和访问模式。
发布于 2012-01-10 16:26:04
发布于 2011-12-19 18:02:05
鉴于此,如果内存不足会发生什么?
如果没有足够的记忆,你可能会想到什么。文件将在您的驱动器上创建,并且您将以您的驱动器允许的速度运行。
一定要适当地限制MySQL,这样它就不会占用其他系统进程所需的所有内存。
https://dba.stackexchange.com/questions/9357
复制相似问题