Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

MySQL新技术探索与实践

6,719 views

Published on

Published in: Technology
  • Login to see the comments

MySQL新技术探索与实践

  1. 1. MySQL 新技术探索与实践 彭立勋 WWW.PengLiXun.COM Alibaba DBA Team
  2. 2. 新技术风起云涌 <ul><li>以 Percona/XtraDB 为代表的 MySQL 分支 ( MariaDB 、 Drizzle…… ) </li></ul><ul><li>以 HandlerSocket 为代表的新接口 ( Memcached Plugin…… ) </li></ul><ul><li>以 XFS/EXT4 为代表的高性能文件系统 ( Btrfs 、 ZFS…… ) </li></ul><ul><li>以 Flashcache 为代表的二级缓存架构 ( InnoDB Secondary Buffer Pool…… ) </li></ul><ul><li>以 Fusion-IO 为代表的 PCI-E SSD </li></ul><ul><li>以 Intel C Compiler 为代表的高性能编译器 </li></ul><ul><li>…… </li></ul>
  3. 3. Topics <ul><li>ICC </li></ul><ul><li>XFS </li></ul><ul><li>Percona </li></ul><ul><li>HandlerSocket </li></ul>
  4. 4. Why ICC <ul><li>为何自己编译 MySQL ? </li></ul><ul><li>官方无静态编译的 Innodb Plugin 版本 </li></ul><ul><li>可以加入第三方 Patch 或修改源码 </li></ul><ul><li>可以将第三方库静态编译到可执行文件( TCMalloc ) </li></ul><ul><li>为何使用 ICC 编译? </li></ul><ul><li>原生 Intel SSE2 指令集,浮点运算效率高 </li></ul><ul><li>内置 Intel Math Lib ,提升数学函数效率 </li></ul><ul><li>内置 Intel Thread Lib ,提升多线程稳定性和效率 </li></ul>
  5. 5. ICC vs GCC(1) 硬件环境 CPU : Intel Xoen 5410 内存: 24G 硬盘: 10*15k SAS RAID10
  6. 6. ICC vs GCC(2) 硬件环境 CPU : Intel Xoen 5520 内存: 24G 硬盘: 10*15k SAS RAID10 MySQL : 5.1.40 Enterprise
  7. 7. Why XFS <ul><li>为何不使用 EXT3 ? </li></ul><ul><li>对 SSD 设备不友好, SSD 是未来数据存储设备的趋势 </li></ul><ul><li>删除文件速度慢,导致数据库 Hang </li></ul><ul><li>对大文件读写性能不佳 </li></ul><ul><li>为何选择 XFS ? </li></ul><ul><li>SGI 已经在其大型机上应用多年 (From 1994) ,稳定可靠 </li></ul><ul><li>对 SSD 设备友好(延迟分配) </li></ul><ul><li>高并发下竞争少,性能好(分配组特性) </li></ul><ul><li>支持条带化分配,使得文件系统分配与 RAID 条带完全对齐,最大化吞吐量 </li></ul><ul><li>对大文件操作友好(基于 Extent 的分配方式) </li></ul>
  8. 8. Why NOT EXT4? <ul><li>EXT4 也是一款非常好的文件系统 </li></ul><ul><li>性能与 XFS 接近,甚至好一些 </li></ul><ul><li>并且可以从 EXT3 无缝升级 </li></ul><ul><li>But ...... </li></ul><ul><li>我们没有运维 EXT4 的经验 </li></ul>
  9. 9. XFS Tips <ul><li>分配组( Allocation Groups ) </li></ul><ul><li>延时分配( Delay Allocation ) </li></ul><ul><li>多线程 DirectIO </li></ul><ul><li>全 B+ Tree 管理空间 </li></ul>
  10. 10. EXT3 vs XFS(1) 硬件环境 CPU : Intel Xoen 5520 内存: 24G 硬盘: 10*15k SAS RAID10 MySQL : 5.1.40 Enterprise
  11. 11. EXT3 vs XFS(2) 硬件环境 CPU : Intel Xoen 5520 内存: 24G 硬盘: 10*15k SAS RAID10 MySQL : 5.1.40 Enterprise
  12. 12. Why Percona <ul><li>Percona 的优势 </li></ul><ul><li>对 SSD 设备有专门的优化 </li></ul><ul><li>对 Flashcache 有 SQL 层接口 </li></ul><ul><li>允许 XtraDB 静态编译 </li></ul><ul><li>支持多种页大小 </li></ul><ul><li>提供额外的监控参数 </li></ul><ul><li>有被生产环境考验过( SOHU ) </li></ul><ul><li>Percona 存在的问题 </li></ul><ul><li>引入第三方补丁较多,可能存在 Bug (可以接受) </li></ul>
  13. 13. New Future(1) <ul><li>文件格式 </li></ul><ul><li>Compressed 结构: CPU 换 IO </li></ul><ul><li>Dynamic 结构: ROW 中不存大字段前缀 </li></ul><ul><li>IO 参数 </li></ul><ul><li>IO 容量: innodb_io_capacity </li></ul><ul><li>IO 线程数: innodb_read_io_threads( 预读 ) 、 innodb_write_io_threads( 赃页回写 ) 、 innodb_use_purge_thread( 清理 UNDO) </li></ul><ul><li>赃页刷新方式 </li></ul><ul><li>innodb_adaptive_checkpoint (XtraDB) </li></ul><ul><li>innodb_adaptive_flushing (InnoDB Plugin) </li></ul>
  14. 14. New Future(2) <ul><li>扩展性 </li></ul><ul><li>增强多处理机性能( About 24 Cores ) </li></ul><ul><li>拆分 Buffer Pool Mutex ( buf_pool_mutex 、 LRU_list_mutex 、 flush_list_mutex 、 page_hash_latch 、 free_list_mutex 、 zip_free_mutex 、 zip_hash_mutex ) </li></ul><ul><li>功能 </li></ul><ul><li>可变页大小( innodb_page_size ) </li></ul><ul><li>可控的 Insert Buffering 和 Adaptive Hash Index </li></ul><ul><li>可配置多回滚段( innodb_extra_rsegments ) </li></ul><ul><li>快速 Warn Up ( innodb_buffer_pool_shm_key 、 XTRA_LRU_DUMP/XTRA_LRU_RESTORE ) </li></ul><ul><li>快速创建索引和索引快速重命名 </li></ul>
  15. 15. New Future(3) <ul><li>监控 </li></ul><ul><li>扩展 information_schema </li></ul><ul><ul><li>INDEX_STATISTICS </li></ul></ul><ul><ul><li>TABLE_STATISTICS </li></ul></ul><ul><ul><li>USER_STATISTICS </li></ul></ul><ul><li>扩展 InnoDB 统计 </li></ul><ul><ul><li>INNODB_TABLE_STATS </li></ul></ul><ul><ul><li>INNODB_INDEX_STATS </li></ul></ul><ul><li>For Example </li></ul><ul><ul><li>可以获取未使用过的索引 </li></ul></ul><ul><ul><li>可以获取索引被用于访问的行数 </li></ul></ul><ul><ul><li>可以获取当前锁定信息 </li></ul></ul><ul><ul><li>可以获取用户连接统计信息 </li></ul></ul><ul><ul><li>…… </li></ul></ul>
  16. 16. Percona Performance 每秒处理 50~75 万行读取 每秒处理 2.5K~5K Query 每秒网卡吞吐 400~750Mbps
  17. 17. Why Handler Socket <ul><li>SQL 执行的 Oprofile </li></ul><ul><li>samples % app name symbol name </li></ul><ul><li>259130 4.5199 mysqld MYSQLparse(void*) </li></ul><ul><li>196841 3.4334 mysqld my_pthread_fastmutex_lock </li></ul><ul><li>106439 1.8566 libc-2.5.so _int_malloc </li></ul><ul><li>…… </li></ul><ul><li>63435 1.1065 mysqld JOIN::optimize() </li></ul><ul><li>55825 0.9737 vmlinux wakeup_stack_begin </li></ul><ul><li>55054 0.9603 mysqld MYSQLlex(void*, void*) </li></ul><ul><li>50833 0.8867 libpthread-2.5.so pthread_mutex_trylock </li></ul><ul><li>49602 0.8652 ha_innodb_plugin.so.0.0.0 row_search_for_mysql </li></ul><ul><li>…… </li></ul><ul><li>46499 0.8111 libc-2.5.so malloc </li></ul>
  18. 18. Why Handler Socket <ul><li>HandlerSocket 执行的 Oprofile </li></ul><ul><li>samples % app name symbol name </li></ul><ul><li>984785 5.9118 bnx2 /bnx2 </li></ul><ul><li>847486 5.0876 ha_innodb_plugin.so.0.0.0 ut_delay </li></ul><ul><li>545303 3.2735 ha_innodb_plugin.so.0.0.0 btr_search_guess_on_hash </li></ul><ul><li>317570 1.9064 ha_innodb_plugin.so.0.0.0 row_search_for_mysql </li></ul><ul><li>…… </li></ul><ul><li>206057 1.2370 HandlerSocket.so dena::hstcpsvr_worker::run_one_ep() </li></ul><ul><li>183330 1.1006 ha_innodb_plugin.so.0.0.0 mutex_spin_wait </li></ul><ul><li>175738 1.0550 HandlerSocket.so dena::dbcontext:: cmd_find_internal(dena::dbcallback_i&, dena::prep_stmt const&, ha_rkey_function, dena::cmd_exec_args const&) </li></ul><ul><li>…… </li></ul><ul><li>149611 0.8981 ha_innodb_plugin.so.0.0.0 row_sel_store_mysql_rec </li></ul>
  19. 19. HS vs MC vs SQL 硬件环境 CPU : Intel Xoen 5520 内存: 24G 硬盘: 10*15k SAS RAID10 MySQL : 5.1.48
  20. 20. Our Solution(1)
  21. 21. Our Solution(2) <ul><li>RAID 卡 </li></ul><ul><li>关闭预读:预读效果不佳,直接读取磁盘 </li></ul><ul><li>关闭磁盘 Cache : RAID 卡缓存已经缓冲了写操作,磁盘 Cache 无电池 </li></ul><ul><li>条带:默认 64K ,调整为 1M </li></ul><ul><li>Linux </li></ul><ul><li>IO 调度: /sys/block/sdb/queue/scheduler ,默认 cfq ,调整为 deadline </li></ul><ul><li>减少预读: /sys/block/sdb/queue/read_ahead_kb ,默认 128 ,调整为 16 </li></ul><ul><li>增大队列: /sys/block/sdb/queue/nr_requests ,默认 128 ,调整为 512 </li></ul><ul><li>NUMA 策略: numactl --interleave=all 或 --cpunodebind=0 --localalloc </li></ul>
  22. 22. Our Solution(3) <ul><li>Flashcache </li></ul><ul><li>Block Size=4K :与 SSD 设备页对齐 </li></ul><ul><li>dirty_thresh_pct = 90 :一个 SET 内 90% 都是脏块则刷新 </li></ul><ul><li>write_merge = 1 :写入合并,提升写磁盘的性能 </li></ul><ul><li>fast_remove = 1 :解除绑定时无需将脏块写入磁盘 </li></ul><ul><li>Percona </li></ul><ul><li>页设置: innodb_page_size=4096 、 innodb_fast_checksum=1 </li></ul><ul><li>刷新策略: innodb_adaptive_checkpoint=3 、 innodb_flush_neighbor_pages=0 </li></ul><ul><li>IO 容量: innodb_io_capacity>10000 </li></ul><ul><li>IO 线程: innodb_read_io_threads = 1 、 innodb_write_io_threads = 16 </li></ul>
  23. 23. Our Solution(4) <ul><li>监控 </li></ul><ul><li>Fusion-IO ( fio-status ): </li></ul><ul><ul><li>Logical bytes written :逻辑写 </li></ul></ul><ul><ul><li>Logical bytes read :逻辑读 </li></ul></ul><ul><ul><li>Physical bytes written :物理写 </li></ul></ul><ul><ul><li>Physical bytes read :物理读 </li></ul></ul><ul><li>Flashcache ( dmsetup status ): </li></ul><ul><ul><li>read hit percent :读命中 </li></ul></ul><ul><ul><li>write hit percent :写命中 </li></ul></ul>
  24. 24. <ul><li>Q&A </li></ul><ul><li>E-Mail: PengLiXun@gmail.com </li></ul>

×