文章目录

 

TDH_SOCKET

HandlerSocket

SQL

IO策略

Dynamic IOStrategy

Same-thread IOStrategy

one-thread-per-connection

优点 worker线程只处理与DB相关的逻辑   最大化DB的操作吞吐量 上下文切换真心很少 资源分离 不太会相互干扰
缺点 上下文切换一般,测试时最高在10w,但可以接受 IO逻辑对DB逻辑影响较大   一旦io处理的慢了,会导致QPS下降很多(比如说较多的连接数并发请求导致io处理变慢也会是整体QPS下降) 线程资源浪费严重,太多的线程会导致高并发是上下文切换多,从而影响性能,测试时最高60w
读策略
  1. 无需SQL解析
  2. 可在THD上cache open过的table(可配置关闭)
  3. 一次轮询只lock一次table
  4. 请求按table的hash值平均分配到可活动的线程上
  5. 如果有table被过多访问,那么此table的请求可被分配到多个线程上
  6. 在带io请求少时,可以用较少的线程work.来减少锁征用导致的上下文切换
  7. 有一定量带io请求时,能调整worker线程数来充分利用io资源.
  8. 当带io请求巨多时,将区分带io的请求和不带io的请求.分别用两个线程池来执行,防止带io的请求堵住不带io的请求.
  9. 还可以设置流控带io的请求数来防止client的堵塞情况,能使DB继续输出较高的QPS
  10. 如果返回大批量数据可以以stream的方式返回,避免过多占用内存
  1. 无需SQL解析
  2. 可在THD上cache open过的table(不可配置关闭)
  3. 一次轮询只lock一次table
  4. worker线程数固定,且无法做请求数的平衡,只能做连接数的平衡
  1. 可global的做table的cache
  2. 每次请求都lock一次table
优点 多种策略配合能一直输出较高的QPS 在全缓存的请求下,输出的QPS很高 由于是一个连接一个请求,不会出现由带io的请求堵塞不带io的请求的情况出现
缺点 流控会丢失一部分请求,     预测请求带不带io不是非常准确 (如果使用row cache就能较精确的预测了) 一旦有带io的请求出现,就很容易堵塞住不带io的请求出现,所以缓存命中率下降后QPS下降的非常厉害     返回大批量数据会占用过多内存 有极限一般QPS最高输出到6-7w
写策略
  1. 一次轮询的请求一次commit
  2. 请求按table的hash值平均分配到写线程上,即同一个表肯定在一个写线程的被执行,不会有死锁的问题,也不会有同一条row的锁问题.
  3. 支持Batch方式的小事务,Batch内的请求保证同时成功,同时失败
  4. 可以在Client端通过指定hash的方式,来控制请求被指定的线程执行,来避免一些锁或死锁
  1. 一次轮询的请求一次commit
  2. 可配置多个写线程,但是有一个user_lock保证只有一个写线程在工作,来防止死锁
  1. 一次请求一次commit
优点 同一个表必然在同一个线程上执行,所以行锁的征用被降到最低,加上group commit就能提供很搞的TPS   可以多个写线程并发写,不会有死锁问题 支持batch小事务 Group commit可以减少fsync次数,提高写性能     支持大事务
缺点 写线程数有限,在有io堵塞请求下,性能会有下降 同一时刻只有一个写线程能被执行,很容易达到瓶颈,一旦有多表插入并发出现,很容易影响整体更新性能   生成binlog没有执行时间(bug) 多表insert会有自增id获取失败的问题(bug) 性能受限于IOPS
可维护性  
  1. DDL操作不会被hang住(因为可以主动close 被cache的table)
  2. 支持KILL 命令直接终止正在执行的操作
  3. 大部分参数都为在线可配置
  4. status数据监控完善

 

  1. DDL会被hang住,因为handlersocket只open table不管主动close table,只有在流量较小time out时才会close table

最高
易用性
  • client端不需要openIndex,直接请求即可(如:

client.query().use("test").select("id", "a", "b", "c").from("t")

.where().fields("a").in(["1", "1"], ["2"], ["1"]).get())

  • server端只需要一个port 就能做读写分离
  • 可支持一些MySQL的内置函数
    • 现在支持Update/Insert的时候可以插入now()
  • 基于辅助索引的联合主键可以支持简单的order by
    • 只能支持=的order by
  • Java客户端支持JDBC

  1. 读写分离需要在server端配置两个port是实现
  2. client请求前需要先openIndex
最高
文章目录