EC2 大型实例上 MySQL 的良好/更好配置

EC2 大型实例上 MySQL 的良好/更好配置

我有一个专用于 MySQL 的 EC2 大型实例。

它将提供 Joomla/Magento 组合,因此它混合了 InnoDB 和 MyISAM 表。我过去只使用过 MyISAM,因此不熟悉 InnoDB 使用的设置。到目前为止,实验成果不多,因为我一直导致 InnoDB 引擎被禁用。

我的实例运行的是 Ubuntu 10.04 64 位服务器版本,内存约为 7.5G。MySQL 目前使用了其中的约 0.6%,性能略差。我想将其配置为合理地使用尽可能多的系统内存。

测试一些设置后我了解到 InnoDB 日志不能集体大于 4G。

有人可以提供一些基本的 InnoDB 和 MyISAM 设置来帮助我入门吗?

谢谢你蒂姆

答案1

我在 EC2 上运行着相同类型的 Mysql 服务器。不要触碰 /etc/mysql/my.cnf,而是将配置文件放入 /etc/mysql/conf.d/。这样,您就可以管理特定引擎的更改,并在您之后为管理员提供有关配置方式的更多线索。此外,它还可以轻松备份您所做的任何更改并跟踪它们。

/etc/mysql/conf.d/innodb_mysql.cnf

[mysqld]    
# innodb settings 
innodb_additional_mem_pool_size = 12M
innodb_buffer_pool_size         = 2G
innodb_file_per_table           = 1
innodb_flush_log_at_trx_commit  = 2
innodb_lock_wait_timeout        = 180
innodb_log_buffer_size          = 16M
innodb_open_files               = 512
innodb_thread_concurrency       = 0

这些设置大部分都是非常标准的,你一定要看看Percona 的建议。您的系统可以达到 6G,但我会从小处着手。对于 myisam 表,我可能停止在 4G。我不会改变 innodb 日志文件大小,因为这样做几乎没有什么好处。增加 log_buffer_size 和 addition_mem_pool 在初始增加后也几乎没有什么好处。

此外,上述设置是为了提高性能,而不是为了交易一致性。假设您只运行 Web 应用程序,上述设置没问题,但不适用于银行系统。

/etc/mysql/conf.d/general_mysql.cnf

[mysqld]
# general settings
key_buffer = 384M

key_buffer 对 myisam 和 Mysql 来说最有用,默认值只有 16M,在 8GB 的​​机器上非常小。再次,我会从好的开始,看看你是否能有所进步。请记住,myisam 缓冲区和 innodb 缓冲区不是共享,因此它们的总和必须小于您拥有的 RAM 量。稍后您可能还会查看排序和读取缓冲区。

答案2

我觉得你需要尝试一些不同的(有据可查的)选项并收集一些统计数据,这样你就可以进行前后比较,否则你可能会觉得你正在提供帮助,但可能会造成伤害。

  1. 最简单的统计数据直接从 phpmyadmin 中获取,进入 phpmyadmin 并从右侧框架顶部的按钮中选择状态。

  2. 另一个不错的工具是https://github.com/rackerhacker/MySQLTuner-perl/blob/master/mysqltuner.pl #(v1.2.0)

  3. 最后启用您的慢查询日志。

我认为在做出改变之前,获得良好的指标至关重要,否则你将无法确定它是否有帮助。

我认为对经常读取但很少更新/插入/添加的所有内容添加索引是很好的。

我每天晚上进行 mysqldump 后都会对所有的内容做一个优化表。

您的 innodb 特定选项是:

spended #  
[ 14:31. diane@ltk-prod-1 ~]% mysqladmin -u USER -pPASSWD variables | grep -i inno |sed -e 's/                                  //g'|less

Mine are:


| innodb_autoinc_lock_mode | 1::                     |
| innodb_buffer_pool_size  | 8388608::               |
| innodb_checksums         | ON::                    |
| innodb_commit_concurrency| 0::                     |
| innodb_concurrency_tickets              | 500::    |
| innodb_data_file_path    | ibdata1:10M:autoextend::|
| innodb_data_home_dir     |::                       |
| innodb_doublewrite       | ON::                    |
| innodb_fast_shutdown     | 1::                     |
| innodb_file_io_threads   | 4::                     |
| innodb_file_per_table    | ON::                    |
| innodb_flush_log_at_trx_commit          | 1::      |
| innodb_flush_method      |::                       |
| innodb_force_recovery    | 0::                     |
| innodb_lock_wait_timeout | 50::                    |
| innodb_locks_unsafe_for_binlog          | OFF::    |
| innodb_log_buffer_size   | 1048576::               |
| innodb_log_file_size     | 5242880::               |
| innodb_log_files_in_group| 2::                     |
| innodb_log_group_home_dir| ./::                    |
| innodb_max_dirty_pages_pct              | 90::     |
| innodb_max_purge_lag     | 0::                     |
| innodb_mirrored_log_groups              | 1::      |
| innodb_open_files        | 300::                   |
| innodb_rollback_on_timeout              | OFF::    |
| innodb_stats_on_metadata | ON::                    |
| innodb_support_xa        | ON::                    |
| innodb_sync_spin_loops   | 20::                    |
| innodb_table_locks       | ON::                    |
| innodb_thread_concurrency| 8::                     |
| innodb_thread_sleep_delay| 10000::                 |
| innodb_use_legacy_cardinality_algorithm | ON::     |

    enter code here

我建议每次增加 2 倍缓冲区,然后尝试测试查询,

但是,对于某些机器,我用完了 /dev/shm(ramdisk)(16gb ram 有帮助)

然后每天只需执行 mysqldump 3 或 4 次。

对我来说,mysqltuner 说我的物理 RAM 严重超载,但我好像总是有半 GB 的可用空间。

相关内容