重温 – MySQL 5.1 vs 5.5

几个月前,虽然MySql 5.5还处于testing阶段,但是之前曾经提到过这个问题。 现在它已经发布了,还有一些维护更新,你们都觉得怎么样?

ISSUE#1)半同步复制

具有多个从站的主站并不是那么好,因为只有第一个从站才能快速复制,并且所有后续的从站有时会根据查询运行多长时间切换到asynchronous模式。 就第一个奴隶而言,这是devise。 我想没有保证后续的奴隶及时运行。

另一方面,简单的主从,圆形代表和multimaster代表炸药快速恕我直言。

问题#2)多个InnoDB缓冲池

我有一个3 DB服务器客户端configuration如下:
双HexaCore(12个CPU)
192GB内存
2 TB SAS RAID10

客户端拥有780个数据库的480GB数据。
循环复制在三个数据库服务器之间运行。

绝对是我为InnoDB激活的最强大的function之一是:

innodb_read_io_threads = 64
innodb_write_io_threads = 64
innodb_io_capacity = 65536
innodb_buffer_pool_instances = 1
(默认)innodb_bufer_pool_size = 162G

MySQL 5.5对于这个客户端来说就像是一个梦想。 所有客户的客户数据都被虚拟地caching在内存中。 由于InnoDB的繁重活动,所有12个CPU都完全投入使用。 一切炸药都很快。 因为缓冲池的InnoDB Dirty Pages太低,页面太快了。

我曾尝试这样设置缓冲池(160GB)

innodb_buffer_pool_instances = 64(最大值)
innodb_buffer_pool_size = 2560M(2.5 GB)

这创造了很multithreadinglocking。 我怀疑这是由于有相关的数据caching在不同的缓冲池。 试图访问这些数据段导致了缓冲池之间的某种混杂。 我工作的同事(谁是Oracleauthentication大师)告诉我,甲骨文有一个类似的基础设施,你可以使用和线程locking也是一个问题,所以他们不推销其使用。

当我设置以下内容时,所有客户端的线程locking问题完全消失:

innodb_buffer_pool_instances = 1
(默认)innodb_bufer_pool_size = 162G

关于多个InnoDB缓冲池的结论

我期待着使用这个function,但是失望了。 拥有多个缓冲池的人如果拥有相关的大数据集但是遍布缓冲池,则不会为您购买大量的数据,从而导致线程locking增加。 我希望你可以分配数据到特定的缓冲池就像你可以预先加载MyISAM密钥caching。 只有这样,多个缓冲池才会非常方便。

如果你有非常小的租户数据库,但他们很多,多个缓冲池是好的。 仍然会有线程locking问题,但不是那么严重。

恕我直言,我会回避大型安装的多个缓冲池。 有很multithreading的巨大缓冲池可以更有效地工作。 我肯定会专注于使用更多的innodb线程和更多的CPU,这是MySQL 5.0 / 5.1的明显优势。

Re:与innodb_buffer_pool_size和innodb_buffer_pool_instances有关的问题:

我认为这些variables是如何相关的。 innodb_buffer_pool_size是可用的缓冲池。 然后在innodb_buffer_pool_instances中引用的线程之间进行划分。

在上面这个performance不佳的例子中,2.5GB被划分为64个实例,每个实例剩下40MB。 推荐的最小值(如果您使用这些选项)是每个实例1GB。 我完全可以看到每个实例有40MB会导致性能下降。

在我们的生产环境中,我们正在运行具有3个实例的服务器,3GB池,每个实例1GB,没有过多的分页。 我们也运行4个实例,10GB池,也没有过多的分页(新硬件,为什么不利用这个内存)。

希望有所帮助。