沙龙晃荡 | 3月31日 京东、微博、华为拭魅战专家与你合营商量容器技巧实践!
比来出现多次因为上层组件异常导致DB雪崩的情况,笔者将部分监控DB启用了线程池功能,在应用线程池的过程中赓续深刻进修的同时,也碰到了不少问题。
本文就来具体讲述一下MySQL线程池相干的常识,以赞助广大年夜DBA快速懂得MySQL的线程池机制,快速设备MySQL的线程池以及琅绫擎存在的一些坑。 其实我想说,懂得和应用MySQL线程池,看这篇文┞仿就够了。
一、为何要应用MySQL线程池
在介绍为什么要应用线程池之前,我们都知道跟着DB拜访量越来越大年夜,DB的响应时光也会随之越来越大年夜,如下图:
而DB的拜访大年夜到必定水日常平凡,DB的吞吐量也会出现降低,并且会越来越差,如下图所示:
那么是否有什么方法,能实现跟着DB的拜访量越来越大年夜,DB始终表示出最佳的机能呢?类似下图的表示:
答檀卷是今天要重点介绍的线程池功能。总结一下,应用线程池的来由有两个:
1、削减线程反复创建与烧毁部分的开销,进步机能
线程池技巧经由过程预先创建必定命量的线程,在监听到有新的请求时,线程池直接大年夜现有的线程平分派一个线程来供给办事,办事停止后这个线程不会直接烧毁,而是又去处理其他的请求。如许就避免了线程和内存对象频繁创建和烧毁,削减了高低文切换,进步了资本应用率,大年夜而在必定程度上进步了体系的机能和稳定性。
2、对体系起到保护感化
线程池技巧限制了并发线程数,相当于限制了MySQL的runing线程数,无论体系今朝有若干连接或者请求,跨越最大年夜设置的线程数的都须要列队,让体系保持高机能程度,大年夜而防止DB出现雪崩,对调层DB起到保护感化。
可能有人会问,应用连接池可否也达到类似的效不雅?
也许有的DBA会把线程池和连接池混淆,但其实两者是有很大年夜区其余:连接池一般在客户端设置,而线程池是在DB办事器上设备;别的连接池可以起到避免了连接频繁创建和烧毁,然则无法控制MySQL晃荡线程数的目标,在高并发场景下,无法起到保护DB的感化。比较好的方法是将连接池和线程池结合起来应用。
二、MySQL线程池介绍
MySQL线程池简介
为懂得决one-thread-per-connection(每个连接一个线程)存在的频繁创建和烧毁大年夜量线程以及高并发情况下DB雪崩的问题,实现DB在高并发情况依然能保持较高的机能。
Oracle和MariaDB都推出了ThreadPool筹划,今朝Oracle的Thread pool实现为Plugin方法,并且只添加到在Enterprise版本中,Percona移植了MariaDB的Thread pool功能,并做了进一步的优化。本文的情况就基于Percona MySQL 5.7版本。
MySQL线程池架构
MySQL的Thread pool(线程池)被划分为多个group(组),每个组又有对应的工作线程,整体的工作逻辑照样比较复杂,下面我试图经由过程简单的方法来介绍MySQL线程池的工作道理。
1、架构图
起首来看看Thread Pool的架构图。
大年夜架构图中可以看到Thread Pool由一个Timer线程和多个Thread Group构成,而每个Thread Group又由两个队列、一个listener线程和多个worker线程构成。下面分别来介绍各个部分的感化:
- 队列(高优先级队列和低优先级队列)
用来存放待履行的IO义务,分为高优先级队列和低优先级队列,高优先级队列的义务会优先被处理。
什么义务会放在高优先级队列呢?
事务中的语句会放到高优先级队列中,比如一个事务中有两个update的SQL,有1个已经履行,那么别的一个update的义务就会放在高优先级中。这里须要留意,如不雅长短事务引擎,或者开启了Autocommit的事务引擎,都邑放到低优先级队列中。
还有一种情况会将义务放到高优先级队列中,如不雅语句在低优先级队列逗留太久,该语句也会移到高优先级队列中,防止饿逝世。
- listener线程
listener线程监听该线程group的语句,并肯定当本身改变成worker线程,是急速履行对应的语灸┞氛样放到队列中,断定的标准是看队列中是否有待履行的语句。
如不雅队列中待履行的语句数量为0,而listener线程转换成worker线程,并急速履行对应的语句。如不雅队列中待履行的语句数量不为0,则认为义务比较多,将语句放入队列中,让其他的线程来处理。这里的机制是为了削减线程的创建,因为一般SQL履行都异常快。
- worker线程
worker线程是真正干活的线程。
- Timer线程
Timer线程是用来周期性检查group是否处于处于壅塞状况,当出现壅塞的时刻,会经由过程唤醒线程或者新建线程来解决。
每次worker线程检查队列中义务的时刻,queue_event_count会+1,每次Timer检查完group是否壅塞的时刻会将queue_event_count清0,如不雅检查的时刻义务队列不为空,而queue_event_count为0,则解释义务队列没有被正常处理,此时该group出现了壅塞,Timer线程会唤醒worker线程或者新建一个wokrer线程来处理队列中的义务,防止group长时光被壅塞。
3、Thread Pool的是若何运作的?
推荐阅读 沙龙晃荡 | 3月31日 京东、微博、华为拭魅战专家与你合营商量容器技巧实践! 亚马逊:明星产品Alexa下的难堪时刻根据大年夜邀请函显示的信息猜测,此次重要针对师生和教导方面,没有惊艳的新>>>详细阅读 本文标题:关于MySQL线程池,这也许是目前最全面的实用帖! 地址:http://www.17bianji.com/lsqh/40924.html 1/2 1