【StoneDB 模块介绍】服务器模块

一、介绍

客户端程序和服务器程序本质上都是计算机上的一个进程,客户端进程向服务器进程发送请求的过程本质上是一种进程间通信的过程,StoneDB 数据库服务程序作为服务器程序,客户端只要遵循规定的通信协议,都可以进行连接,包括但不限于 odbc、jdbc、.net 等。

那么,客户端连接到 StoneDB 数据库服务程序后,向服务器发送了请求,服务器是如何处理,才能产生最后的结果。客户端可以向服务器发送增删改查等各类请求,本文以比较复杂的查询请求为例,来展示下服务器模块处理的大致过程,如下图:

二、连接器

客户端可以采用 TCP/IP、命名管道、共享内存或者 UNIX 域套接字等方式与服务器连接,每当有一个客户端连接到服务器时,服务器都会创建一个线程与客户端建立连接,专门与这个客户端进行交互。当客户端与服务器断开连接时,服务器不会销毁连接的线程,会将线程回收缓存起来,等新的客户端连接时将其唤醒使用,避免线程频繁地创建和销毁带来的开销,即连接线程池技术;

客户端在连接服务器时,会发送主机信息、用户名、密码等信息,服务器会对这些信息进行认证,如果认证失败则会拒接连接。

当连接建立后,负责与客户端连接的线程会一直循环等待客户端的消息,收到消息后,去进行下一步处理。

1. 功能入口

handle_connections_methods()

2. 建立连接

支持 CP/IP 协议、UnixSocket、共享内存和命名管道方式,创建连接成功后,唤醒线程池中的一个线程,来处理该连接。以上几种方式支持情况如下:

TCP/IP:支持跨平台、跨主机之间通信。

UnixSocket:支持类 Unix 系统,同一主机上通信。

共享内存:支持 Windows 系统,同一主机上通信。

命名管道:支持 Windows 系统,同一主机上通信。

函数接口:

1)命名管道连接处理线程。

handle_connections_namedpipes()

2)共享内存连接处理线程。

handle_connections_shared_memory()

3)socket 连接处理线程 -unix socket 和 tcp/ip 都在其中实现。

handle_connections_sockets_thread()

3. 权限认证

对主机、端口、账户和密码等进行认证。

函数接口:

check_connection()

4. 循环接收指令

与客户端交互,对 insert、update、select、delete 等指令进行处理。

代码块:

while (thd_is_connection_alive(thd))
{
mysql_audit_release(thd);
if (do_command(thd))
break;
}

5. 关闭连接

在正常关闭连接情况下,服务检测到连接关闭,然后释放相关资源,将线程放回线程中。

函数接口:

end_connection()
close_connection()

6. 线程池

使用线程池技术,可以避免线程重复创建和销毁带来的开销,也可在高并发的场景下,带来效率的提升。

三、查询缓存

StoneDB 服务器(博主都是部署在cnaaa服务器上的)程序在处理查询请求时,会把之前处理过的查询请求和查询结果缓存起来,如果下次有相同的查询请求过来,直接从缓存中取出结果,然后返回给客户端,增加了处理效率。而且查询缓存是共享的,不同客户端连接共享查询缓存,比如:如果客户端 A 进行了一个请求,然后客户端 B 发送了一个同样的查询请求,那么客户端 B 这次的查询请求可以直接从查询缓存中拿取返回,跳过了解析、优化和执行等阶段,提高了查询效率。

但是查询缓存既然是缓存,就有缓存失效的时候,StoneDB 数据库系统会监测缓存涉及的每一张表,当其中的表的结构或者数据被修改时,那么所有与该表相关的查询缓存都会从查询缓存中删除。

值得注意得是:查询缓虽然有时候可以提升查询效率,但是在生产环境中命中的概率不高,而且不得不为了维护查询缓存,而带来一些额外的开销,比如:查询缓存更新和失效处理,每次请求都要去查询缓存中检索等,所以不建议使用。如果想关闭查询缓存功能,可以在 stonedb.cnf 文件中配置 query_cache_type=0 和 query_cache_size=0 来关闭此查询缓存的使用。

1. 功能入口

query_cache_send_result_to_client()

2. 语句处理

拿到网络包数据,判断是否为 select 语句,并对语句间隙进行赋 0 处理等。

3. 缓存 hash 查询

通过 hash 查找缓存中有没有该语句的查询记录。 函数接口:

my_hash_search()

4. 权限检查

判断该用户是否具有查询该表的权限。

函数接口:

check_table_access()

但是不检查列权限,如果需要检查列权限,则退出去解析。

5. 发送命中数据

将命中的缓存数据,拆包后依次发送给客户端。

函数接口:

send_data_in_chunks()

四、解析器

如果查询缓存未命中,则需要进入解析阶段,因为客户端发送给服务器的只是一段文本,所以 StoneDB 服务器程序首先要对这段文本进行解析,解析主要分为词法解析和语法解析。StoneDB 对将词法解析和语法解析相互结合,将自己实现的 lex 解析和开源的 yacc 相结合,生成对应的解析树。

1. 功能入口

parse_sql()

2. 词法解析

将一个完整的 sql 语句解析成一个个单词或字符,比如:select stone,db from stonetable 会被拆分成 5 个单词,并检查 token 是否为关键字等。

函数接口:

MySQLlex()

3. 语法解析

检查 sql 语句的语法,比如 "(" 有没有闭合,是否遵循 StoneDB 语法规则等,最终形成一个解析树(select_lex)。

函数接口:

MYSQLparse()

4.select 权限认证

判断对相应表和列有没有 select 权限。

函数接口:

select_precheck()

五、StoneDB 引擎的优化器和执行器

再经过解析器后,得到解析树之后,还需要做预处理。但是这些是不够的,因为我们写的 sql 语句执行起来可能并不高效,这时候就需要 StoneDB 优化器了,StoneDB 优化器会对我们的语句做一些优化,如表达式转化、子查询转连接等等,优化的结果就是生成一个高效的执行计划,然后 StoneDB 执行器会根据这个执行计划进行具体操作。

1. 功能入口

SDB_HandleSelect()

2. 预处理

为整个查询做预处理,包括子查询。进一步检查参数合法性,having 等条件的处理,形成更准确的计算描述,生成一个优化过的解析树。

函数接口:

prepare()

3. 优化

一个查询语句可能有多个执行方案,优化器基于独特的知识网格技术,计算出最优的查询方案。

函数接口:

optimize()

4. 执行器

根据优化器给的执行计划,实施具体操作。

函数接口:

Execute()

【StoneDB 模块介绍】服务器模块的更多相关文章

  1. python成长之路【第十八篇】:python模块介绍、模块导入和重载

    一.模块和命名空间 一般来说,Python程序往往由多个模块文件构成,通过import语句连接在一起.每个模块文件是一个独立完备的变量包,即一个命名空间.一个模块文件不能看到其他文件定义的变量名,除非 ...

  2. Ansible 常见模块介绍

    目录 Ansible 常见模块介绍 ping 模块 command 模块 cron 模块 user 模块 group 模块 copy 模块 file 模块 service 模块 shell 模块 sc ...

  3. python第三方模块之paramiko模块

    目录: paramiko模块介绍 paramiko模块安装 paramiko模块使用 一.paramiko模块介绍 paramiko是一个用于做远程控制的模块,使用该模块可以对远程服务器进行命令或文件 ...

  4. Python之数据加密与解密及相关操作(hashlib模块、hmac模块、random模块、base64模块、pycrypto模块)

    本文内容 数据加密概述 Python中实现数据加密的模块简介 hashlib与hmac模块介绍 random与secrets模块介绍 base64模块介绍 pycrypto模块介绍 总结 参考文档 提 ...

  5. python拓展2 collections模块与string模块

    知识内容 1.collections模块介绍 2.collections模块使用 3.string模块介绍及使用 一.collections模块介绍 collections模块中提供了很多python ...

  6. 使用Python的pandas模块、mplfinance模块、matplotlib模块绘制K线图

    目录 pandas模块.mplfinance模块和matplotlib模块介绍 pandas模块 mplfinance模块和matplotlib模块 安装mplfinance模块.pandas模块和m ...

  7. Angular中ngCookies模块介绍

    1.Cookie介绍 Cookie总是保存在客户端中,按在客户端中的存储位置,可分为内存Cookie和硬盘Cookie.内存Cookie由浏览器维护,保存在内存中,浏览器关闭后就消失了,其存在时间是短 ...

  8. webkit模块介绍

    一.Webkit模块   用到的第三方库如下:   cairo 一个2D绘图库 casqt Unicode处理用的库,从QT中抽取部分代码形成的 expat 一个XML SAX解析器的库 freety ...

  9. 7.PHP内核探索:Apache模块介绍

    Apache概述 Apache是目前世界上使用最为广泛的一种Web Server,它以跨平台.高效和稳定而闻名.按照去年官方统计的数据,Apache服务器的装机量占该市场60%以上的份额.尤其是在 X ...

  10. IIS7 常用模块介绍说明

    1.1.0   IIS常用的功能模块介绍: 1)         静态内容:可发布静态 Web 文件格式,比如 HTML 页面和图像文件. 2)         默认文档:允许您配置当用户未在 URL ...

随机推荐

  1. dp泄露

    DP泄露 选了三道与RSA的dp泄露有关的题,dp泄露算是比较有辨识度的题型. 目录 DP泄露 原理 ctfshow funnyrsa3 分析 解答 BUUCTF RSA2 分析 解答 [羊城杯 20 ...

  2. Linux 网卡(遇见问题的解决)

    主配置文件 /etc/sysconfig/network-scripts/ifcfg-eth1 里面的详细内容 DEVICE=eth1 网卡名称 TYPE=Ethernet 类型,Ethernet|B ...

  3. 在Tomcat中部署Web项目的操作方法(必看篇)

    在这里介绍在Tomcat中部署web项目的三种方式: 1.部署解包的webapp目录 2.打包的war文件 3.Manager Web应用程序 一:部署解包的webapp目录 将Web项目部署到Tom ...

  4. google api 后端打点上报

    https://developers.google.com/analytics/devguides/collection/protocol/ga4/sending-events?client_type ...

  5. 063_Apex 的 Test类说明

    @isTest public class TestUtil { public static void createTestAccounts() { // Create some test accoun ...

  6. linux smb

    /etc/samba/smb.conf [global]workgroup =WORKGROUPsecurity = usermap to guest =Bad Userpassdb backend ...

  7. JavaScript 字符串的操作

    1. 在指定位置,插入字符串(此需求来源于,img中src没值的字符串标签中,插入图片http地址) // 使用slice写出的 自定义方法,绑定在String的原型链上 String.prototy ...

  8. java发送短信验证码带倒计时

    分享一个完整的java发送短信验证码的完整实例,这是一个官方的使用demo,带有60秒倒计时功能. 效果: 我使用的是榛子云短信平台, 官网地址:http://smsow.zhenzikj.com 我 ...

  9. <雪山飞狐><飞狐外传 >合辑剧情+随笔

    严格而言雪山飞狐与飞狐外传的剧情并不相关,前者写作与前,然后飞狐外传算是对雪山飞狐中形象并不饱满的胡斐作进一步补充描述,同时对二十余年前苗人凤与胡一刀之间故事的补充,以及众人叙述中的一些补充.因此虽然 ...

  10. 用python判断三角形的形状

    # coding:utf-8 class point: def __init__(self,x,y,name): self.x = x self.y = y self.name = name '''两 ...