MySql中的表级锁-DML

MDL不需要显式使用,在访问一个表的时候会被自动加上。MDL的作用是,保证读写的正确性。你可以想象一下,如果一个查询正在遍历一个表中的数据,而执行期间另一个线程对这个表结构做变更,删了一列,那么查询线程拿到的结果跟表结构对不上,肯定是不行的。

因此,在MySQL 5.5版本中引入了MDL,当对一个表做增删改查操作的时候,加MDL读锁;当要对表做结构变更操作的时候,加MDL写锁。

  • 读锁之间不互斥,因此你可以有多个线程同时对一张表增删改查。

查看更多

mysql一条更新命令的执行流程

流程

执行语句前要先连接数据库,这是连接器的工作。

前面我们说过,在一个表上有更新的时候,跟这个表有关的查询缓存会失效,所以这条语句就会把表T上所有缓存结果都清空。这也就是我们一般不建议使用查询缓存的原因。

接下来,分析器会通过词法和语法解析知道这是一条更新语句。优化器决定要使用ID这个索引。然后,执行器负责具体执行,找到这一行,然后更新。

与查询流程不一样的是,更新流程还涉及两个重要的日志模块,它们正是我们今天要讨论的主角:redo log(重做日志)和 binlog(归档日志)。

查看更多

mysql查询命令的执行流程

大体来说,MySQL可以分为Server层和存储引擎层两部分。

Server层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖MySQL的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。

而存储引擎层负责数据的存储和提取。其架构模式是插件式的,支持InnoDB、MyISAM、Memory等多个存储引擎。现在最常用的存储引擎是InnoDB,它从MySQL 5.5.5版本开始成为了默认存储引擎。

一、Server层执行流程

步骤1 连接器

查看更多

nginx代理docker容器中运行的服务

云服务器上运行了很多的docker服务,大多数服务都是没有验证的,可以通过nginx做集中的代理,并在nginx上配置用户名密码验证,避免非授权访问。

遇到的问题如下:
Q1 容器的IP是不固定的,如何配置nginx的代理?
A1 通过创建docker网络,使nginx容器与业务容器在同一个网络中,这样就可以通过容器名称进行代理,不需要关注容器的IP地址

Q2 新上线的业务容器/修改了业务容器端口,要修改nginx代理文件,又要重新加载nginx配置,有没有便捷的方式?

查看更多

在Prometheus的rule文件中使用判断语句和变量

话不多说,直接给出示例,相信一眼就能看到怎么用了

1
2
3
4
5
6
7
8
9
10
- name: hostStatsAlert300s
interval: 5m
rules:
- alert: 磁盘使用率超过阈值告警
expr: ((node_filesystem_size_bytes - node_filesystem_avail_bytes) / node_filesystem_size_bytes) * on(instance) group_left(nodename) (node_uname_info) > 0.7
labels:
severity: "{{ if gt $value 0.9 }} 紧急告警 {{ else if gt $value 0.8 }} 重要告警 {{ else if gt $value 0.7 }} 次要告警 {{ end }}"
annotations:
summary: "主机 {{ $labels.nodename }} 目录 {{ $labels.mountpoint }} 磁盘使用率过高"
description: "主机{{ $labels.nodename }} 磁盘使用率过高,告警阈值:{{ if gt $value 0.9 }}90%{{ else if gt $value 0.8 }}80%{{ else if gt $value 0.7 }}70%{{ end }},当前使用率:{{ $value | humanizePercentage }},目录:{{ $labels.mountpoint }}"

查看更多

Prometheus告警中如何携带主机名

主机名(nodename)在指标node_uname_info中,且node_uname_info的值恰巧为1,所以我们可以在PromQL中通过node_uname_info提取,只需要在原有PromQL后添加

1
* on(instance) group_left(nodename) (node_uname_info)

这样,在prometheus告警的labels中,就可以通过nodename获取主机名了

比如原先的expr为

1
node_filesystem_size_bytes - node_filesystem_avail_bytes) / node_filesystem_size_bytes > 0.7

查看更多