【MySQL】MySQL服务器架构之Connection layer(连接层)


hello大家好😊

MySQL Server 是什么 ❓

MySQL Server 是 MySQL 数据库系统的核心组件,也称为 MySQL 服务器或 mysqld
它是一个数据库服务器程序,负责处理客户端的连接请求,管理数据库,执行 SQL 查询,保护数据完整性,实现事务处理,执行存储过程等操作。
它支持多用户并发访问,允许多个客户端同时连接到数据库并执行查询;支持多个存储引擎;支持事务和非事务表;使用高速缓存和缓冲区来优化内存的使用

注意区分Server和Host。
Server(服务器) 是一个具有版本号和特性列表的软件程序(mysqld)
Host(主机) 是用来运行服务器程序的物理机器
多个服务器可以在一个主机上运行

mysqld的三个主要层次结构 📁

在这里插入图片描述

可以看见,连接层、SQL层、存储层这三个层次共同组成了 MySQL 的数据库服务器,负责处理客户端请求、管理数据库和执行查询操作。这种分层架构使得 MySQL 在处理大量并发连接和高负载的情况下具有高性能和可扩展性。每个层次都扮演着特定的角色,确保数据库系统的高效运行

我们来简单的看一下这三层各自的功能:

  • 连接层(Connection layer) 是 MySQL 的顶层,它负责处理客户端的连接请求和会话管理。当客户端发起连接请求时,连接管理层接受连接并创建一个新的会话。它还负责维护和管理会话状态,包括连接的建立和断开
  • SQL层(SQL layer) 处理从已连接的客户端应用传来的SQL请求。负责解析查询语句,检查其语法和语义,并生成相应的查询执行计划
  • 存储层(Storage layer) 负责将各种结构和格式的数据存储到各类物理介质中,比如磁盘、内存、网络

下面我们来具体看下连接层(Connection Layer)👇

mysqld里的连接层(Connection Layer)🔎

连接层为每个客户端连接维护一个线程,并且该线程负责处理该连接的所有查询和交互。并且,在连接可以开始发送SQL查询之前,将通过用户名、密码和客户端主机的验证对连接进行身份验证

由此,我们可以发现连接层有三大要素:

  • 通信协议(Communication protocols)
  • 线程(Threads)
  • 身份验证(Authentication)

我们逐个具体地了解一下👇

通信协议(Communication protocols)

MySQL支持多种通信协议以满足服务器与不同客户端之间的数据通信

以下是 mysqld 中连接层所支持的常见通信协议:

协议连接方式支持的操作系统
TCP/IP本地、远程所有
UNIX sockets(套接字)本地UNIX衍生操作系统,比如Linux 、BSD、Max OS X
Shared memory(共享内存)本地Windows
Named pipes(命名管道)本地Windows

这里我们再着重看下TCP/IP和Socket的区别:

  • TCP/IP 协议(Transmission Control Protocol/Internet Protocol):

    TCP/IP是用于连接互联网上主机的一套通信协议,可以在不同的主机之间建立连接。它使用SSL进行加密
    它用IP地址或者DNS主机名来识别主机;使用TCP端口号来识别每个主机上的特定服务。MySQL默认TCP端口号是 3306。

    我们在使用mysql命令进行连接的时候,一般这么写:mysql -uroot -p,这里只用到了两个选项:-u(指定要登录的mysql用户)和-p(输入密码)。
    但其实mysql命令还有别的选项,只不过很多选项都配置了默认值。比如:
    -h, --host=name:指定要连接的 MySQL 服务器主机名或 IP 地址。默认为本地主机(localhost)
    -P, --port=port_num:指定 MySQL 服务器的端口号。默认为 3306
    -S , --socket=path:指定用于连接的套接字文件的路径。默认在 Linux 上为 /var/run/mysqld/mysqld.sock
    比如使用指定的主机名和默认的端口号进行连接:mysql --host=mysqlhost1 -uroot -p
    比如使用IP地址和指定的端口号进行连接:mysql -h 192.168.1.8 -P 3309 -uroot -p

  • Unix 套接字(Socket):

    Unix 套接字是在同一台机器上进行进程间通信的一种方式,适用于本地主机上的客户端和服务器之间的通信。
    在使用 Unix 套接字时,客户端可以通过本地文件系统上的套接字文件(Socket file)连接到 MySQL 服务器。
    因为是在主机内部进行通信,所以Unix 套接字不加密。同时,相对于 TCP/IP 连接,Unix 套接字通信速度更快,因为在同一台计算机上进程间的通信,数据传输不需要经过网络设备和网络协议栈

    需要服务器在本地系统上创建一个带有--socket(-S)选项的套接字文件。然后客户端在连接时需要指定套接字文件。默认路径为 /var/run/mysqld/mysqld.sock
    比如指定使用 /var/lib/mysql/mysql.sock 套接字文件进行连接:mysql -S /var/lib/mysql/mysql.sock -uroot -p

    套接字是适合Linux的最佳连接类型✅

当没有使用–host指定主机,也就是连接本地主机时,默认使用UNIX套接字,否则使用TCP协议

在MySQL服务器中,默认禁用Shared memory(共享内存)和Named pipes(命名管道)

线程(Threads)

服务器对于每个客户端连接都会创建一个单独的服务器线程来处理该连接的所有请求,当客户端断开连接时,服务器会销毁该线程。

然而,这种线程模型可能导致线程数量过多,对系统资源产生较大压力

为了优化线程管理和减少线程数,MySQL 引入了 Thread Pool (线程池)插件。该插件将客户端连接与服务器线程分开管理,并通过线程组对语句进行分类和优先级设置。线程组可以允许多个长时间运行的语句,从而减少了服务器线程的数量,提高了系统的并发性能和稳定性

线程池还根据语句的事务成员身份划分为高优先级和低优先级。运行在事务中的语句被视为高优先级,这确保了事务的一致性和隔离性。同时,线程池通过限制每个线程组只允许一个短期运行的语句,防止了某些语句占用线程过长时间,导致其他请求等待的问题

身份验证(Authentication)

身份验证是确保客户端具有合法访问数据库的权限的过程。在连接层的身份验证阶段,服务器会验证客户端提供的用户名和密码,以确定其是否有权访问数据库

MySQL 支持多种身份验证插件来处理不同类型的用户凭证验证。比如自 MySQL 8.0 开始,默认推荐使用caching_sha2_password身份验证插件。它使用 SHA-256 算法进行密码验证,并支持 SSL 加密。这种插件提供了更高的安全性

感谢 💖

好啦,这次的分享就到这里,感谢大家看到这里🤞

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不怕娜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值