整体而言,推荐使用默认配置,除非明确知道默认配置是有问题的。
一、Mysql配置简介
Mysql可以通过命令行参数、配置文件mysql/my.cnf进行配置;对于配置文件,mysql读取文件内容,删除注释、换行,然后和命令行选项一起处理。推荐把长期使用的配置写入配置文件,写好注释,放在vcs系统中管理起来。配置文件包含多个分段,分段开头是[分段名称],服务器通常读取[mysqld]这个分段。配置时需要明确配置项的单位,因为配置文件中只包含数字。通过showGlobalVaraibles查看当前使用的配置。
配置分为全局和会话/连接两个级别,且存在继承关系,会话配置通过@@标记。建议不要在全局级别增大size的配置,而是在需要时在连接级别增大配置,不再需要后通过set default恢复。Mysql支持预配置和运行时通过set动态配置;动态配置有副作用,如修改QueryCacheSize后,Mysql会清空缓存并重新为缓存分配内存,并且这段时间内无法提供缓存服务。
配置项包括:1)通用配置包括datadir、socket、pidFile、user=mysql、port=3306和default storage engine=InnoDB;2)innoDB的配置;3)日志配置包括logError=mysql/mysql-error.log、slowQueryLog=mysql/mysql-slow.log;4)其他配置如openFilesLimit,通常设置为较大数值,现代操作系统打开文件句柄的成本小,参数不够大容易引起too many open files错误。5)client配置包括socket、port=3306
二、内存配置
1)Mysql可以使用内存上限:考虑硬件和操作系统32/64位(代表不同寻址能力),Mysql进程作为单个进程可分配内存有限制;同时需要考虑操作系统需要的内存,以及同一台机器上运行的其他程序和定时任务,通常没有虚拟内存正在交换paging到磁盘,就是操作系统有足够内存的表现。Mysql内存=每个连接需要的内存*预估连接数+Mysql缓存内存
2)每个连接需要的内存:如排序缓存和临时表tmpTableSize
3)Mysql缓存所需内存,包括InnoDB缓冲池、线程缓存、查询缓存、InnoDB日志文件缓存、二进制日志和表缓存等。
InnoDB缓冲池(bufferPoolSize)对InnoDB非常重要,存储着缓存索引、缓存行数据、自适应哈希索引、插入缓冲和锁等;还用于实现延迟写入,即合并多个写入操作一起顺序写入。Mysql服务器重启后缓冲池为空,可以手动预热把磁盘中的数据载入缓冲池。
表缓存(tableCache)分为已打开数据表缓存和表定义缓存;前者属于某个连接,后者被所有连接共享。表缓存保存数据表信息及frm文件的解析结果,避免重新打开表或重新解析表。InnoDB的表缓存又成为数据字典,InnoDB把打开的表存储到数据字典,用于计算统计信息;文件名为<表名.ibd>。
三、IO配置
3.1 配置InnoDB执行IO的方式
1)fdatasync:Unix系统的默认值;不经过操作系统缓存,支持预读,当连续请求几个顺序的块,会通知磁盘预读下一个块。
2)o_direct: 用于数据文件,不经过操作系统缓存,不支持预读;适用于有电池保护的RAID的写缓存。
3)all_o_direct:把o_direct同时应用于数据和日志文件。
4)o_sync: 用于日志文件,采用同步方式,写入磁盘完成后写操作才返回。写数据首先进入操作系统缓存,然后再到磁盘。
5)async_unbuffered、unbuffered、normal:async是windows下默认值,数据读写采用操作系统原生异步IO。
3.2 InnoDB表空间
InnoDB表空间是磁盘上用于保存数据,由多个文件组成的虚拟文件系统。保存内容包括数据表和索引,回滚日志,写入缓冲,双写缓冲。通常设置单个文件为固定大小(数据页的大小16K),通过新建文件来扩展。
建议配置InnoDB filePerTable和共享表空间大小;filePerTable让innoDB为每张表使用一个文件,即数据字典;优点是删除表时容易回收空间,并且表可以分散到不同磁盘;缺点是会导致碎片和空间浪费,每个表文件的有固定大小16K,如果表仅有1K数据,仍需16K空间;另外drop table操作需要删除文件,因此会变慢。共享表空间用于存放回滚日志等文件。
回滚日志中存储数据行的旧版本,Mysql的默认隔离级别是可重复读,没提交的事务仍需看到数据修改前的样子,因此需要用回滚日志保存数据行的旧版本。
3.3 二进制日志
二进制日志sync_binlog用于数据备份和复制,复制指的是把数据在主库和备库之间复制;写二进制日志操作比事务日志更加昂贵。ExpireLogsDays用于指定在若干天后清理旧的二进制日志,建议留下7-14天的二进制日志。
四、并发配置
InnoDB的线程调度器控制线程如何进入内核访问数据,在内核中一次可以做哪些事情。
threadConcurrency配置一次有多少线程进入内核,理论上并发量=cpu数量*磁盘数量*2;如果已经进入内核线程数据达到上线,则新线程无法进入,休眠若干秒后重试,休眠时间通过threadSleepDelay配置,默认10毫秒;如果休眠后仍无法进入内核,则进入等待队列,由操作系统处理。进入内核的线程会分配若干ticket,可以让它跳过并发检查直接返回内核,concurrencyTickets配置ticket信息,一个ticket可用于一次查询为单位,并非一个事务,连接断开后,没用完的ticket被销毁。commitConcurrency控制有多少线程可以同时提交。
五、安全与稳定性配置
1)MaxConnections:默认值100,保证服务器不会因为应用发起太多连接而不堪重负。‘too many connections’是一种快速而代价小的失败方式。
2)maxConnectErrors:限制尝试连接的次数,避免暴力攻击。
六、高级InnoDB配置
1)autoincLockMode:控制自增主键生成,用于解决高并发下,自增主键的瓶颈问题,可能有多个事务等待自增锁。
2)BufferPoolInstances:把缓冲池分为多个,用于在多核机器上提高可扩展性,降低全局互斥锁的竞争。
3)read/writeIOThreads:默认为4个读线程和4个写线程
4)OldBlocksTime:InnoDB有一个两段缓冲池LRU链表,称为最近最少使用链表,分为年轻子链表和年老子链表,经过多次访问的页会放到年老子链表。
网友评论