AliSQL 的性能优化实战问答

Q1:主从复制 和MGR 复制,主从切换后,应用如何感知,谢谢?
A1:最早期技术方案会选择DNS,但是DNS存在cache不及时的问题。第二种方法通过IP直接切主库,这种方式相比DNS很快。第三种方法前面加proxy,由proxy来实时感知后端的状态。还有在应用里自主判断,rds的HA也可以实时切换IP进行链路连接,rds如果用了proxy链路会主动感知后端的切换状态,快速识别后端的主库。

Q2:老师好,请问分库分表怎么确保主键的唯一,保证事务的完整性?
A2:mysql另外部署一个序列的生成器,在alisql有sequence,可以用来在分布式情况下自动生成主键;另外业务有自己明确的编号,可以后端不生成另外的主键。在分库分表又在不同实例的情况下,就要用分布式事务来保证,但是分布式事务太多会影响效率。

Q3:alisql 线程池 跟percona 线程池有什么区别?
A3:最早是一样的,percona 线程池不能在任何情形下都开启,alisql进行了创新,对不同线程进行隔离,把读请求和写请求分离,比如再对不同的读请求进行语法梳理进行拆分归类成复杂和简单队列,来解决线程池中相对的公平。原则上是将不同的请求归类再分配到不同的线程队列中执行,让快的快,让线程池适应不同的场景。

Q4:低并发场景下,比如64并发,不开启线程池比开启线程池性能好的原因是什么呢?望解答,谢谢
A4:这是一个相对的值还要看资源。当CPU足够时,不开线程池请求会直接到工作线程,但是开了线程池会有工作线程入队列和出队列的操作,在64并发时会有点影响,当资源足够时这时入队出队会变成负担。如果资源不够的情况下,线程池虽然有IO队列的成本,但对CPU线程执行会有提升。要理解课程里讲的线程池的收益。

Q5:RDS的flashbak、sql outline功能会开源吗?
A5:这两个功能很好,但是需要跟着开源计划去规划,目前不确定。

Q6:mysql 5.7 查询缓存表更新失效问题,alisql 有这个问题么?
A6: alisql没有这个问题,完全重写了。Alisql给每个对象维护了一个版本号,更新时只更新版本号,查询的时候只查询对应的版本号,相当于颗粒度更细。

Q7:MySQL 逻辑时钟执行原理是怎么样的呢?
A7:我理解这是logical_clock的执行原理,它主要是用来标识主库的哪些信息在从库是可以并行执行的。

Q8:老师,可以从oracle , mysql 5.7/ 8.0 迁移数据到 alisql
么?迁移方便么?
A8:有上云服务,通过备份来进行物理迁移等等。

Q9:oracle 的存储过程支持么
A9:mysql支持存储过程,两个语法上会不同。

Q10:经常有开发要建立一个5字段的唯一索引,有什么好的建议?
A10:要从业务角度需要重新思考这样的业务模型,比如我们的交易号里包含交易日期,交易号等等把很多信息集成到一个主键。

Q11:主从复制逻辑时钟的工作原理是怎么样的?
A11:同Q7。

Q12:alisql 支持全局事务么? alisql 百亿大表查询快么?
A12:alisql大表查询性能会更好一些,已经有很多的优化。全局事务参考这个文档https://help.aliyun.com/document_detail/197571.html?spm=a2c4g.11186623.6.607.5f144dbeVC9ezv

Q13:功能 binlog in redo 的初衷是什么??
A13:commit的时间存在两次IO的刷盘,希望通过减少一次IO又能提升性能,保证binlog事务的完整一致性。

Q14:innnodb_buffer_pool_instance参数的配置,通常需要考虑哪些信息,配置成 1 和 4 ,最主要的区别在哪里?
A14:Mysql buffer查询块需要锁页,当并发高时,锁会非常集中。如果bp比较大,可以考虑增加buffer pool instance,比如4G以下设置成1,8G设置成2,16G设置成4,关键在于增大操作不同实例的并行度,虽然有助于降低机器CPU,不算是优化的关键点。参考文档https://developer.aliyun.com/article/174241

Q15:老师好,我现在遇到个生产问题,云下centos7上单实例mysql5.7在3个月内存使用缓慢上升,目前90%以上(32G内存),KILL应用连接没有用,除了重启实例,该如何释放内存,并有效限制MySQL对内存的使用?
A15:centos 7的内存分成了多个buffer,这个多buffer机制会造成内存偏高,可以使用jemalloc,但jemalloc也得挑好版本才行;第二个是不是打开了performance schema,如果你的SQL是动态生成的,可能会占用很多内存;第三个看一下后续版本有没有相关的memory bug fix。还有一些原因,要具体情况具体分析。