对mysql的高并发优化配置的一些思考

对mysql的高并发优化配置的一些思考java

mysql的高并发优化配置方案不少,可是适应你本身的就变得不多了,咱们对数据库的优化,无非就是为了应对mysql的高并发状况罢了。随着大数据的时代的到来和网络用户的增多,不少企业中,可能天天应对的数量达百万,千万,甚至上亿的pv量,这样的量已是超过普通配置的mysql所承受的量,因此应对日益增加的pv量,咱们须要对mysql作出相应的对策,进一步优化mysql,达到咱们所预期的效果,预防由于高并发所引发的mysql宕机,经过调试优化mysql,咱们即可以有效的应对这一些状况。mysql

下面咱们来谈谈关于mysql的一些优化方案,方案仅仅的参考,可能每一个人的实际状况多是有的不一样,可是大致上能够尝试这样的优化。redis

一、基于redis作mysql读写分离。sql

对于基于redis的作缓存处理优化,也不是很复杂,对于运维人员来讲,你只要安装redis和调试一下就能够了,关于redis如何调用mysql(好像是须要java写个脚本),那是开发的事了。基于redis读写分离优化并非很好讲,在这里我先贴个图,而后再讲讲。如图1-1所示:数据库

绘图1.png缓存

图1-1 基于redis实现mysql读写分离安全

由上图所示,咱们能够发现其实redis调用就是那么回事,首先它是由用户发送请求信息(读或者写),然而在有redis的状况下;根据图的解析能够有如下。服务器

1.一、redis响应请求过程。网络

读:读的过程可能复杂一点,用户会直接先读取redis数据库,而后把请求结果返回到client;若是用户在redis没有读取到想要请求结果,他会直接逃过redis直接读取到mysql,而后redis会把数据复制一份到本地。mysql优化

写:写的过程稍微简单一点了,用户会直接向redis写入,而后redis在缓存到mysql上。可能你会发现,整个过程都基本是redis在工做,mysql好像没它的事了,对的,咱们就是要的是这种效果,任何请求都交给redis处理后,那你还怕mysql响应不过来了吗。

1.二、redis配置优化

Redis配置,主要的是作持久化配置,主从复制,还有一些安全的配置,大概就是这样,上图我是有画的,至于过程配置我就不写了,咱们大概有个思路就行了。

1.三、mysql优化配置(主从复制)

Mysql作主从复制,怎么么说呢,主要是为了安全,通常来讲,在master有两台slave就能够了,已经足够应对不少的意外状况了。作主从复制和备份,要注意得是,主从两台mysql配置同样,对于备份的数据,不要放在mysql目录下,要另起路径,并给与mysql权限。配置可参考mysql主从复制配置

1.四、mysql监控系统

对于Mysql作监控,我的认为是颇有必要的,首先咱们能够在无人值守的状况之下,咱们能够对mysql的状态进行监控;经过监控,咱们不但能够对mysql的负载状况进行告警,并且能够对mysql自己性能的一些优化处理,因此我在应用对mysql的监控中,使用了zabbix对负载状况作告警处理,并结合pmm-server对mysql系统的优化。对于pmm-sercer在这里先贴个图,如图1.二、1.3所示

1.png

图1.2 mysql资源数据图

2.png

图1.3 mysql资源数据图

由以上图能够发现,咱们能够大致的能够看到mysql的资源配置状况,根据数值咱们能够适当的优化,并调整一些mysql的自身的参数,这就是pmm-sever的监控的好处了。

对于zabbix,我如今就是拿来作告警处理,在对mysql的监控中,zabbix自己自带的模板和结合percona插件,基本实现对整个mysql的监控(配合可参考percona监控mysql数据),由于两个结合基本比较全面的实现对mysql的监控了,如图1.4所示,可看到模板所提供的监控项。

3.png

图1.4 zabbix的mysql模板监控项

总结以上,咱们能够发现,一个良好的mysql优化架构,须要作的包括redis作读写分离,mysql主从,监控系统完善等等。若是你还有跟好的方案,也记得分享一下;接下来,咱们是针对mysql自己性能的优化,×××能的容错率,在基础上进一步提高mysql的性能。

2.、mysql自身的优化

总的来讲仍是自身因素影响的比较多,咱们能够经过修改my.cnf配置文件来对mysql进行进一步的优化。咱们能够经过修改mysql的参数使得mysql拥有更可靠的性能。下面是个人数据库配置,本身经过百度谷歌,找不少配置选项的解析(配置适合mysql5.5以上的版本),而后总结。但愿对你有帮助。(注意一下优化配置均在【mysqld】选项下配置,不要搞错成【mysql】)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
[mysqld]
back_log = 300
binlog_format = MIXED
character-set-server=utf8mb4
long_query_time = 1
log-bin=/databack/data_logbin/mysql_binlog
innodb_log_file_size=2G
innodb_log_buffer_size=4M
innodb_buffer_pool_size=4G
#innodb_file_per_table = ON
innodb_thread_concurrency=8
innodb_flush_logs_at_trx_commit=2
#innodb_additional_mem_pool_size=4M
join_buffer_size = 8M
key_buffer_size=256M
max_connections = 1000
max_allowed_packet = 4M
max_connect_errors = 10000
myisam_sort_buffer_size = 64M
port = 3306
query_cache_type=1
query_cache_size = 64M
read_buffer_size=4M
read_rnd_buffer_size=4M
server-id = 1
skip-external-locking
slow_query_log = 1
#skip-name-resolve
#skip-networking
sort_buffer_size = 8M
socket = /tmp/mysql.sock
table_open_cache=1024
thread_cache_size = 64
thread_stack = 256K
tmp_table_size=64M
wait_timeout = 10

下面是对上面配置的解析:

back_log = 300:该参数的值表示在MySql的链接数据达到#max_connections 时,在它暂时中止响应新请求以前的短期内有300个请求能够被存在堆栈中,即新来的请求将会被存在堆栈中,以等待某一链接释放资源,该堆栈的数量即back_log,等 mysql处理完其余请求以后会对其做出响应,若是等待链接的数量超过#back_log,将不被授予链接资源。你能够合理的设置你的back_log,可是该值不要高于操做系统的限制的值。系统的默认值为50。Linux系统通常设置小于512的整数。

binlog_format = MIXED:配置主从模式下,选取同步的模式,Mysql主从的复制能够有三种复制类型,分别是:语句的复制STATEMEN,行的复制ROW和混合类型的复制MIXED,语句的复制顾名思义就是在主服务器上执行的SQL语句,在从服务器上执行一样的语句,行的复制就是把改变的内容复制过去,而不是把命令在从服务器上执行一遍。默认采用基于语句的复制,一旦发现基于语句的没法精确的复制时,就会采用基于行的复制,配置,复制类型能够经过binlog_format =在配置文件上配置

character-set-server=utf8mb4 :utf-8编码可能2个字节、3个字节、4个字节的字符,可是MySQL的utf8编码只支持3字节的数据,而移动端的表情数据是4个字节的字符。若是直接往采用utf-8编码的数据库中插入表情数据,Java程序中将报SQL异常utf8mb4编码是utf8编码的超集,兼容utf8,而且能存储4字节的表情字符。 采用utf8mb4编码的好处是,存储与获取数据的时候,不用再考虑表情字符的编码与解码问题。

long_query_time = 1:设置慢查询响应的时间,记录超过1秒的SQL执行语句。

log-bin=/databack/data_logbin/mysql_binlog :设置二进制日志的存放路径,若是不设置系统会默认存放到mysql的目录下,建议建立新的目录来存放二进制日志,且该目录不要同数据库同个目录,存放目录拥有者为mysql。

innodb_log_file_size=2G :在高写入负载尤为是大数据集的状况下很重要。这个值越大则性能相对越高,跟据服务器大小而异。这是redo日志的大小。redo日志被用于确保写操做快速而可靠而且在崩溃时恢复。在MySQL 5.5,redo日志的总尺寸被限定在4GB(默承认以有2个log文件)。而MySQL 5.6里能够设置容许大于4G。你能够一开始就把它设置成4G。这个值的设置实际上是能够计算的 你能够经过命令SHOW GLOBAL STATUS的输出看Innodb_os_log_written的值,把该值除以1024*1024 获得的结果是每分钟处理的redo日志大小,而后再乘以60获得每小时处理的日志大小,由于在5.5以上版本都是默认有两个日志重作日志文件ib_logfile0和ib_logfile1,所获得结果再除以2,再取整就是你的redo该设置大小了。

innodb_log_buffer_size=4M:默认为1M,在默认的设置在中等强度写入负载以及较短事务的状况下,服务器性能还能够。若是存在更新操做峰值或者负载较大,就应该考虑加大它的值了。在 InnoDB在事务提交前,并不将改变的日志写入到磁盘中,所以在大事务中,能够减轻磁盘I/O的压力。一般状况下,若是不是写入大量的超大二进制数据,4MB-8MB已经足够了。

innodb_buffer_pool_size=4G:这配置对Innodb表来讲很是重要。该参数主要做用是缓存innodb表的索引,数据,插入数据时的缓冲因为Innodb把数据和索引都缓存起来,所以在配置该参数时,能够设置它高达60-80% 的可用内存(官网是建议的也是系统内存的80%左右)。缓冲池是数据和索引缓存的地方这能保证你在大多数的读取操做时使用的是内存而不是硬盘。通常配置的值是5-6GB(8GB内存),19-25GB(32GB内存),38-50GB(64GB内存)仅供参考。

#innodb_file_per_table = ON:在5.6中,该选项属性默认值是ON,因为对新建的表有影响,因此在以前的版本中你须要把它设置成ON。这项设置告知InnoDB是否须要将全部表的数据单独放在一个.ibd文件,这样作的好处是使得每一个表都有自已独立的表空间。每一个表的数据和索引都会存在自已的表空间中。也实现单表在不一样的数据库中移动,且空间能够回收。

innodb_thread_concurrency=8:指服务器逻辑线程数能够设置成与系统同样数量,参数可配置成逻辑CPU数量的两倍。

系统CPU查看命令以下:

查看逻辑CPU个数:

1
#cat /proc/cpuinfo |grep "processor"|sort -u|wc –l

查看物理CPU个数:

1

cat /proc/cpuinfo | grep "physical id" |sort -u|wc -l

查看每一个物理CPU内核个数:

1

cat /proc/cpuinfo | grep "cpu cores" |uniq

innodb_flush_logs_at_trx_commit=2:系统默认值是 1,可是这样设置会使得提交更新事务都会刷新到磁盘中,会形成资源耗费。因此须要值设置为 2,这样就不用不把日志刷新到磁盘上,而只刷新到操做系统的缓存上。但然啦也能够设置为0, 这样设置是很快,但也形成了相对的不安全,会致使MySQL服务器崩溃时就会丢失一些事务。而设置为 2 恰好尼补了。

#innodb_additional_mem_pool_size=4M:该参数默认为1M适当调整该参数的大小以确保全部数据都能存放在内存中提升访问效率的,主要用来存放Innodb的内部目录,这个值不用分配太大,系统能够自动调。在mysql5.6.3能够忽略。

join_buffer_size = 8M:表示#联合查询操做所能使用的缓冲区大小。

key_buffer_size=256M:指定索引缓冲区的大小,它决定索引处理的速度,你能够设置成系统的物理内存的1/4,它主要针对的是MyISAM引擎,可是设置大少不要超过4G,否则会出现问题。

max_connections = 1000:设置置MySQL的最大链接,按你实际状况适当设置就好。若是你常常看到‘Too many connections'错误,是由于max_connections的值过低了,因此须要设置更高的连接数,若是max_connection值被设高以后的缺陷是当服务器运行超过设置阈值或更高的活动事务时会变的没有响应。

max_allowed_packet = 4M:这个参数mysql消息缓冲区的大小,若是这个太小可能会影响到部分操做,默认是1M,通常设置成4-16M就能够了。

max_connect_errors = 10000:表示若是有同一个主机访问的参数值超出该参数值个数的中断错误链接,则该主机将被禁止链接。如需对该主机进行解禁,执行:FLUSH HOST。

myisam_sort_buffer_size = 64M:这个参数默认是8M,表示MyISAM表发生变化时从新排序所需的缓冲,通常64M就已经足够了。

port = 3306:表示使用3306来作mysql启动端口

query_cache_type=1:表示控制缓存的类型,有三个参数可选(0、一、2)设置为0,表示缓存没有应用,也就至关于禁用了,设置为1,表示缓存全部的结果,设置为2表示只缓存在select语句中经过SQL_CACHE指定须要缓存的查询。

query_cache_size=32M:参数表示mysql查询结果的缓冲区大小,通常不建议设置太大,由于设置太大会增长开销,通常设置成32M-256M左右便可,设置参数通常为2的倍数。

read_buffer_size=4M:表示按顺序查询操做包括读、查询等操做所能使用的缓冲区大小,和sort_buffer_size同样,该参数对应的分配内存也是每链接独享,通常不建议太大,对于4G到16G内存的服务器2M-8M就能够了。

read_rnd_buffer_size=4M:表示是MySQL的随机读缓冲区大小。当任意顺序读取行时将分配一个随机读取缓冲区,进行排序查询时,便分配随机缓冲做为该操做的缓冲区大小,一样的对于4G到16G内存的服务器2M-8M就能够了。

server-id = 1:表示作主从同步所定义的serverid,做为master的server_id必须必slave端的要小,越小表示优先级越高,可是在同个网段内的mysql服务,不容许设置一样的sever_id。参数可设参考范围(1-200)。

skip-external-locking:开启该选项表示避免MySQL的外部锁定,减小出错概率加强稳定性,适用于单服务器环境。

slow_query_log = 1:开启慢查询日志,做用于慢查询日志,顾名思义,就是查询慢的日志。

skip-name-resolve:禁止MySQL对外部链接进行DNS解析,使用这一选项能够消除MySQL进行DNS解析的时间。但须要注意,若是开启该选项,则全部远程主机链接受权都要使用IP地址方式,不然MySQL将没法正常处理链接请求。

skip-networking:开启该选项能够完全关闭MySQL的TCP/IP链接方式,若是WEB服务器是以远程链接的方式访问MySQL数据库服务器则不要开启该选项,不然将没法正常链接。

sort_buffer_size = 8M:表示查询排序时所能使用的缓冲区大小。它直接与实时链接的个数 有关,实时链接的个数乘以sort_buffer_size的大小就是实际分配的总共排序缓冲区大小。因此,对于内存在4GB-8G左右的服务器能够设置为6-16M。

socket = /tmp/mysql.sock:mysql.sock 文件做用主要是server和client在同一台服务器,当使用本地链接时,就会使用socket进行链接,该文件通常是放在/var/lib/mysql/mysql.sock下,也经常使用ln –s 在/tmp目录下作软链接。

table_open_cache=1024:table_cache主要用于设置table高速缓存的数量。因为每一个客户端链接都会至少访问一个表,所以此参数的值与max_connections有关。你能够经过命令show variables like '%open%'; 查看open_files_limit参数,大量使用MyISAM的环境里,应该保证open_files_limit表类型至少是table_cache的二到三倍,调到512-1024最佳。

thread_cache_size = 64 :这个变量值表示的是能够从新利用保存在缓存中线程的数量,当断开链接时若是缓存中还有空间,那么客户端的线程将被放到缓存中,若是线程从新被请求,那么请求将从缓存中读取,若是缓存中是空的或者是新的请求,那么这个线程将被从新建立,若是有不少新的线程,增长这个值能够改善系统性能.经过比较 Connections 和 Threads_created 状态的变量,能够看到这个变量的做用 根据物理内存设置规则能够作如下配置2G-4G能够设置为16-64左右,固然大于4G的服务器,设置64也已经足够了。

thread_stack = 256K:表示每一个链接线程被建立时,MySQL给它分配的内存大小,对于8-16G的服务器设置成256K就能够了,再大一点的,能够适当增长呢。

tmp_table_size=64M:表示定义一个临时表的大小,该值默认为16M,可调到64-256最佳,线程独占,太大可能内存不够形成I/O堵塞,若是动态页面能够适当调大点。

wait_timeout = 10:表示指定一个请求的最大链接时间,对于4G-8G左右内存的服务器能够设置为5-10。

三、总结

预防Mysql病发的状况,是每一个企业所要面对的事情,大数据的到来,更加使得mysql的性能要求更高,因此对mysql的优化升级,也是迫在眉睫。以上是本人总结,仅仅提供参考,但愿能帮到你。
相关文章
相关标签/搜索