XtraDB存儲引擎

XtraDB是由Percona開發的一款MySQL數據庫的高性能存儲引擎,其目的是用來代替InnoDB存儲引擎,可用於需要更高性能的環境。XtraDB可以看作是InnoDB存儲引擎的增強版本,它在InnoDB上進行了大量的修改和patched,它完全兼容InnoDB,且提供了很多InnoDB不具備的有用的功能。

例如:在多核CPU上面的性能和伸縮性要更好;對於內存的分配和使用也要更好;也解除了InnoDB的很多限制;提供了比InnoDB更多的配置和性能監控參數。

Percona自己對新引擎的描述:“Percona XtraDB includes all of InnoDB's robust, reliable ACID-compliant design and advanced MVCC architecture, and builds on that solid foundation with more features, more tunability, more metrics, and more scalability. In particular, it is designed to scale better on many cores, to use memory more efficiently, and to be more convenient and useful. The new features are especially designed to alleviate some of InnoDB's limitations.

對於高負載的MySQL應用來說,如果不需要MySQL官方技術支持的話,完全可以使用XtraDB來代替InnoDB存儲引擎。此外,Percona還提供了打了補丁的MySQL版本,這些補丁對MySQL很多方面進行了改進,性能提高,增加更多監控參數等等。據說JavaEye的數據庫就是使用了Percona的版本。

當前XtraDB的最新版本是1.0.4-8(release-8)2009.10.13發佈:

   release基於InnoDB plugin 1.0.4版本

   MySQL 5.1.39作爲base release

修復以下bug

   Bugs#413858: Crash from failed assertion in dict0dict.c

   Bug#417751: XtraDB crashes on startup on windows

   fix-import-extern-pages

   Number of mysql-tests are fixed

XtraDB的插件:

mysql>show plugins;

+--------------------------------+--------+--------------------+---------+---------+

| Name                           | Status | Type               | Library | License |

+--------------------------------+--------+--------------------+---------+---------+

| binlog                         | ACTIVE | STORAGE ENGINE     | NULL    | GPL     |

| CSV                            | ACTIVE | STORAGE ENGINE     | NULL    | GPL     |

| MEMORY                         | ACTIVE | STORAGE ENGINE     | NULL    | GPL     |

| InnoDB                         | ACTIVE | STORAGE ENGINE     | NULL    | GPL     |

| INNODB_RSEG                    | ACTIVE | INFORMATION SCHEMA | NULL    | GPL     |

| INNODB_BUFFER_POOL_PAGES       | ACTIVE | INFORMATION SCHEMA | NULL    | GPL     |

| INNODB_BUFFER_POOL_PAGES_INDEX | ACTIVE | INFORMATION SCHEMA | NULL    | GPL     |

| INNODB_BUFFER_POOL_PAGES_BLOB  | ACTIVE | INFORMATION SCHEMA | NULL    | GPL     |

| INNODB_TRX                     | ACTIVE | INFORMATION SCHEMA | NULL    | GPL     |

| INNODB_LOCKS                   | ACTIVE | INFORMATION SCHEMA | NULL    | GPL     |

| INNODB_LOCK_WAITS              | ACTIVE | INFORMATION SCHEMA | NULL    | GPL     |

| INNODB_CMP                     | ACTIVE | INFORMATION SCHEMA | NULL    | GPL     |

| INNODB_CMP_RESET               | ACTIVE | INFORMATION SCHEMA | NULL    | GPL     |

| INNODB_CMPMEM                  | ACTIVE | INFORMATION SCHEMA | NULL    | GPL     |

| INNODB_CMPMEM_RESET            | ACTIVE | INFORMATION SCHEMA | NULL    | GPL     |

| INNODB_TABLE_STATS             | ACTIVE | INFORMATION SCHEMA | NULL    | GPL     |

| INNODB_INDEX_STATS             | ACTIVE | INFORMATION SCHEMA | NULL    | GPL     |

| XTRADB_ENHANCEMENTS            | ACTIVE | INFORMATION SCHEMA | NULL    | GPL     |

| MyISAM                         | ACTIVE | STORAGE ENGINE     | NULL    | GPL     |

| MRG_MYISAM                     | ACTIVE | STORAGE ENGINE     | NULL    | GPL     |

+--------------------------------+--------+--------------------+---------+---------+

20 rows in set (0.00 sec)

XtraDB的變量:

mysql> show global variables like '%innodb%';

+---------------------------------------+-----------------------------------+

| Variable_name                         | Value                             |

+---------------------------------------+-----------------------------------+

| have_innodb                           | YES                               |

| ignore_builtin_innodb                 | OFF                               |

| innodb_adaptive_checkpoint            | none                              |

| innodb_adaptive_flushing              | ON                                |

| innodb_adaptive_hash_index            | ON                                |

| innodb_additional_mem_pool_size       | 20971520                          |

| innodb_autoextend_increment           | 8                                 |

| innodb_autoinc_lock_mode              | 1                                 |

| innodb_buffer_pool_size               | 3221225472                        |

| innodb_change_buffering               | inserts                           |

| innodb_checksums                      | ON                                |

| innodb_commit_concurrency             | 0                                 |

| innodb_concurrency_tickets            | 500                               |

| innodb_data_file_path                 | ibdata1:10M:autoextend            |

| innodb_data_home_dir                  |                                   |

| innodb_dict_size_limit                | 0                                 |

| innodb_doublewrite                    | ON                                |

| innodb_enable_unsafe_group_commit     | 0                                 |

| innodb_expand_import                  | 0                                 |

| innodb_extra_rsegments                | 0                                 |

| innodb_extra_undoslots                | OFF                               |

| innodb_fast_recovery                  | OFF                               |

| innodb_fast_shutdown                  | 1                                 |

| innodb_file_format                    | Antelope                          |

| innodb_file_format_check              | Antelope                          |

| innodb_file_io_threads                | 4                                 |

| innodb_file_per_table                 | ON                                |

| innodb_flush_log_at_trx_commit        | 2                                 |

| innodb_flush_method                   | O_DIRECT                          |

| innodb_flush_neighbor_pages           | 1                                 |

| innodb_force_recovery                 | 0                                 |

| innodb_ibuf_accel_rate                | 100                               |

| innodb_ibuf_active_contract           | 0                                 |

| innodb_ibuf_max_size                  | 1610596352                        |

| innodb_io_capacity                    | 200                               |

| innodb_lock_wait_timeout              | 120                               |

| innodb_locks_unsafe_for_binlog        | OFF                               |

| innodb_log_buffer_size                | 8388608                           |

| innodb_log_file_size                  | 268435456                         |

| innodb_log_files_in_group             | 3                                 |

| 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_overwrite_relay_log_info       | OFF                               |

| innodb_read_ahead                     | linear                            |

| innodb_read_ahead_threshold           | 56                                |

| innodb_read_io_threads                | 4                                 |

| innodb_replication_delay              | 0                                 |

| innodb_rollback_on_timeout            | OFF                               |

| innodb_show_locks_held                | 10                                |

| innodb_show_verbose_locks             | 0                                 |

| innodb_spin_wait_delay                | 6                                 |

| innodb_stats_auto_update              | 1                                 |

| innodb_stats_method                   | nulls_equal                       |

| innodb_stats_on_metadata              | ON                                |

| innodb_stats_sample_pages             | 8                                 |

| innodb_stats_update_need_lock         | 1                                 |

| innodb_strict_mode                    | OFF                               |

| innodb_support_xa                     | ON                                |

| innodb_sync_spin_loops                | 30                                |

| innodb_table_locks                    | ON                                |

| innodb_thread_concurrency             | 8                                 |

| innodb_thread_concurrency_timer_based | OFF                               |

| innodb_thread_sleep_delay             | 10000                             |

| innodb_use_purge_thread               | OFF                               |

| innodb_use_sys_malloc                 | ON                                |

| innodb_version                        | 1.0.4-7                           |

| innodb_write_io_threads               | 4                                 |

+---------------------------------------+-----------------------------------+

70 rows in set (0.00 sec)

InnoDB Plugin的變量:
mysql>show global variables like '%innodb%';

+————————————————-+————————————+

| Variable_name                   | Value                  |

+————————————————-+————————————+

| have_innodb                     | YES                    |

| ignore_builtin_innodb           | OFF                    |

| innodb_adaptive_flushing        | ON                     |

| innodb_adaptive_hash_index      | ON                     |

| innodb_additional_mem_pool_size | 8388608                |

| innodb_autoextend_increment     | 8                      |

| innodb_autoinc_lock_mode        | 1                      |

| innodb_buffer_pool_size         | 134217728              |

| innodb_change_buffering         | inserts                |

| 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_format              | Antelope               |

| innodb_file_format_check        | Antelope               |

| innodb_file_io_threads          | 4                      |

| innodb_file_per_table           | OFF                    |

| innodb_flush_log_at_trx_commit  | 1                      |

| innodb_flush_method             |                        |

| innodb_force_recovery           | 0                      |

| innodb_io_capacity              | 200                    |

| innodb_lock_wait_timeout        | 50                     |

| innodb_locks_unsafe_for_binlog  | OFF                    |

| innodb_log_buffer_size          | 8388608                |

| innodb_log_file_size            | 5242880                |

| innodb_log_files_in_group       | 2                      |

| innodb_log_group_home_dir       | ./                     |

| innodb_max_dirty_pages_pct      | 75                     |

| innodb_max_purge_lag            | 0                      |

| innodb_mirrored_log_groups      | 1                      |

| innodb_open_files               | 300                    |

| innodb_read_ahead_threshold     | 56                     |

| innodb_read_io_threads          | 4                      |

| innodb_replication_delay        | 0                      |

| innodb_rollback_on_timeout      | OFF                    |

| innodb_spin_wait_delay          | 6                      |

| innodb_stats_on_metadata        | ON                     |

| innodb_stats_sample_pages       | 8                      |

| innodb_strict_mode              | OFF                    |

| innodb_support_xa               | ON                     |

| innodb_sync_spin_loops          | 30                     |

| innodb_table_locks              | ON                     |

| innodb_thread_concurrency       | 0                      |

| innodb_thread_sleep_delay       | 10000                  |

| innodb_use_sys_malloc           | ON                     |

| innodb_version                  | 1.0.4                  |

| innodb_write_io_threads         | 4                      |

+————————————————-+————————————+

50 rows in set (0.00 sec)

InnoDB的變量:

mysql> show global variables like '%innodb%';

+-----------------------------------------+------------------------+

| Variable_name                           | Value                  |

+-----------------------------------------+------------------------+

| have_innodb                             | YES                    |

| ignore_builtin_innodb                   | OFF                    |

| innodb_adaptive_hash_index              | ON                     |

| innodb_additional_mem_pool_size         | 1048576                |

| innodb_autoextend_increment             | 8                      |

| 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                   | OFF                    |

| 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                     |

+-----------------------------------------+------------------------+

37 rows in set (0.00 sec)

對比一下,是不是發現多出了不少選項。

參考:

https://launchpad.net/percona-xtradb

http://www.percona.com/docs/wiki/percona-xtradb:start

 

附:InnoDB Plugin 1.0.4的新特性(適用於5.1.24-5.1.37的源碼編譯)

引自http://www.lovebsd.com/index.php/archives/174

InnoDB Plugin 1.0.4 這次加入了不少第三方的代碼,個人比較在意的是 Google  Percona 提供的部分。Innodb從而實現了性能上很大的提升,不想以前在併發稍大(比如>8),吞吐量升值會下將,現在卻又很大的提升。

個人關注的改進部分有:

1 Multiple Background Threads

最初由Google提供的補丁(本人注:根據官方說明應該是Percona的補丁),參數innodb_file_io_threads 可以設置io threads的數量,之前是假的

2Master Thread I/O Capacity Tuning

之前innodb在代碼裏面寫死了 innodb_io_capacity 100,但是現在db服務器很多都是用多塊硬盤做raid10IOPS 一般都遠不止100,因此這次改進之後  innodb_io_capacity 變成可以動態調整的參數,用於DBA選擇一個合適的值。(本人注:基於Google的補丁實現並做了一些改動)

3Group Commit

這個據說以前4.x之前就支持的,現在又回來了,支持多個事務同時提交(主要是redo log,之前是因爲binlog2-phase commit protocal的原因中止的),從而提高吞吐量。

4Adaptive Flushing

這個非常有用,大家知道在髒數據到達設置的閥值比例之後,會開始主動做checkpoint,當checkpoint無可避免的時候,這時候會堵塞用戶線程,從而出現性能的突然下降。現在這個問題得到巧妙的解決,會根據算法動態的調整checkpoint的速率,避免出現性能的突然降低。

本人注:它使用一種啓發式的方法,基於buffer cache dirty pages 的數量和redo產生的速度。根據這種啓發式的方法,master thread會確定每秒buffer cache刷新的dirty pages,這就是所謂的adaptive flushing,可以應付工作負載的突變並提供平滑的I/O速率和事務吞吐量。

REFERENCE:

http://www.innodb.com/wp/2009/08/11/innodb-plugin-104-released/

http://www.innodb.com/wp/products/innodb_plugin/license/third-party-contributions-in-innodb-plugin-1-0-4/

 

發佈了23 篇原創文章 · 獲贊 0 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章