More issues

MySQL 执行链路

前言 当客户端SQL语句提交给 MySQL 服务器时首先需要建立连接,连接器会与客户端进行连接,并校验用户身份信息,权限信息,如果权限通过,则通过SQL分析器对SQL语句进行语义分析(检查SQL语句是否合法,能否解析通过),分析完成后将会对SQL的执行过程进行优化,例如剔除不必要的查询条件 1=1 ,以及选择最优的索引与Where条件的字段排序。 然后交给执行器执行此SQL语句,执行器将会根据数据库所使用的存储引擎执行SQL。MySQL在设计时是分为了两层,即Server层和存储引擎层。这样做的好处就是解藕,可以根据不同的数据库去选择合适的存储引擎。 常用的InnoDB存储引擎是以页(16KB)为单位来管理存储空间的,任何的增删改差操作最终都会操作完整的一个页,会将整个页加载到 BufferPool 中并且所有的数据操作都是在 BufferPool 中完成,BufferPool 通常设置为服务器70%-80%左右的内存占用,这样数据的操作直接在内存中执行,从而提高数据操作的效率(如果每一条DML语句都要进行 IO 操作那么数据库的磁盘很容易变成瓶颈,改一条数据需要先从磁盘中读取,
11 min read

JVM 线程池扩容机制

在 HotSpot VM 的线程模型中,Java 线程与操作系统线程是一对一映射关系(JDK19 之后虽然引入了虚拟线程,但传统线程仍然是这种模型)。 也就是说,一个 Java 线程会对应一个操作系统内核线程(KLT / LWP)。 当 Java 创建线程时,需要调用操作系统内核 API 创建对应的内核线程,操作系统需要为其分配栈空间、调度信息等资源;当 Java 线程结束时,对应的内核线程也会被回收。 因此: * 线程创建和销毁成本较高 * 线程数量不能无限增加 当线程数量过多时: 1. 线程创建会带来较高的系统开销 2. CPU 在多个线程之间频繁进行 上下文切换(Context Switch) 3. 大量线程可能导致 系统性能下降甚至 OOM 因此,在实际开发中通常使用 线程池(ThreadPoolExecutor) 来统一管理线程生命周期。 ThreadPoolExecutor 核心参数
3 min read

HTTP 协议发展史

HTTP 是浏览器与服务端之间最主要的通信协议,HTTP 是应用层协议(7层),应用层产生的数据会通过传输层协议作为载体来传输到互联网上的其他主机中,而其中的载体就是 TCP 协议(3.0使用UDP),基于 TCP 协议进行连接,然后传输对应内容信息。 20 世纪 60 年代,美国国防部高等研究计划署(ARPA)建立了 ARPA 网,这被认为是互联网的起源。70 年代,研究人员基于对 ARPA 网的实践和思考,发明出了著名的 TCP/IP 协议。该协议具有良好的分层结构和稳定的性能,并在 80 年代中期进入了 UNIX 系统内核,促使更多的计算机接入了网络。 1989 年,蒂姆伯纳斯-李博士发表了一篇论文,提出了在互联网上构建超链接文档系统的构想。在篇文章中他确立了三项关键技术:URI、HTML、HTTP。 基于这三项技术,
14 min read

布隆过滤器详解

背景介绍 布隆过滤器(Bloom Filter)是1970年由布隆提出的,它实际上是由一个很长的二进制向量和一系列随意映射函数组成。布隆过滤器使用场景一般是防止redis缓存穿透,使用布隆过滤器可以更好的节省空间,并且快速定位元素是否存在。 布隆过滤器通过 hash key 来定位 位图(Bitmap,其实就是bit数组)中对应的下标,并且在这个数组中每一个位置只有0和1两种状态,每个位置只占用1个字节,其中0表示没有元素存在,1表示有元素存在。 注意:两个不同的key哈希出来所对应的下标位可能存在部分重复,这样可以减少内存的占用,但也有概率会出现哈希碰撞,原本不存在的key哈希之后位图中都为1的情况。 所以通过上面的现象,我们从布隆过滤器的角度可以得出布隆过滤器主要有2大特点: 1、如果布隆过滤器判断一个元素存在,那么这个元素可能存在。 2、如果布隆过滤器判断一个元素不存在,那么这个元素一定不存在。 因为布隆过滤器中总是会存在误判率,因为哈希碰撞是不可能百分百避免的。布隆过滤器对这种误判率称之为假阳性概率,即:False Positive Probability,简称为
3 min read

隐藏性能杀手之 '伪共享'

随着CPU工艺的发展,目前的高端CPU已经存在几十核心百多个线程,并为CPU设计出了一二三级缓存。CPU的核心有了这些缓存就可以加快数据的处理,从而减少访问内存的频率,这样CPU的计算性能可以进一步得到提高。 CPU的缓存结构以及内存硬盘: 众所周知CPU去访问一次内存所需要的开销是非常之大的,想要获取一次磁盘上的数据更是需要等待较长的时间,虽然目前已经有很多解决方案如 mmap 技术来缓解这样的情况,但总体来说CPU的计算性能是整个计算机结构中的天花板,其他硬件从数据传输速度层面对比起来就显得拖后腿,那么我们来看一下具体CPU访问每个硬件的延迟: 存储器 存储介质 介质成本(美元) 随机访问延迟 L1 cache SRAM 7 1ns L2 cache SRAM 7 4ns Memory DRAM 0.015 100ns Disk SSD(NAND) 0.0004 150us Disk HHD 0.00004 10ms 可以得出外部存储设备容量越大成本越小,存储数据更多,但访问速度更慢,访问速度越快的设备造价更高,
6 min read

安全容器运行时 Kata

前言 传统的轻量级容器是基于Linux namespace和cgroup进行容器隔离,在带来轻量,简洁,高效的同时,也带来了安全的隐患。 事实上容器虽然提供一个与系统中的其它进程资源相隔离的执行环境,但是与宿主机系统是共享内核的,如果其中某一个容器被攻击,从而导致把宿主机的内核给攻掉了,那么其他的容器势必都会崩溃。后果不堪设想。 那么有没有什么容器技术及安全又比较高效率的呢?于是便出现了 Kata 容器技术。 Kata Containers - Open Source Container Runtime SoftwareKata Containers is an open source container runtime, building lightweight virtual machines that seamlessly plug into the containers ecosystem.An OpenInfra Project Kata 实际上是通过创建轻量级虚拟机实现容器之间的资源隔离,再在虚拟机中运行容器运行时,这样就使容器在专用内核中运行,
4 min read

Istio 之流量镜像

通过在k8s集群中部署Istio作为Service Mesh架构,利用它本身的Envoy代理转发流量的特性,轻松的支持了流量镜像的功能,只需要在配置文件中简单加上几个配置即可完成流量镜像,此功能非常强大,如用得当可以更好的服务生产环境的业务需求。流量镜像也被称作影子流量,把客户端打入的请求进行复制并转发到其他容器进行处理,但镜像的流量不会响应数据给客户端,如此一来流量镜像的价值就变得非常清晰,我们可以用流量镜像做数据记录,风控分析,线上异常操作跟踪,并且对于原来的业务代码是完全透明的,毕竟在流量进入容器前已经进行了流量的镜像,并通过部署其他容器服务进行处理。极大的增强了业务的横向扩展能力。 镜像此任务演示了 Istio 的流量镜像/影子功能。Istio阅读大约需要 3 分钟 页面测试 针对流量镜像的典型的使用场景: 1、测试环境:测试版本的容器服务可以使用生产实例的真实流量,不会影响正常生产的关键路径。例如预发布环境就可以更好的进行实时测试校验,减少发布后出现的各种异常情况,给开发团队更好的上线信心 😂,上线几乎可以做到清晰明了,不用熬夜加班发版。 2、数据采集:同步收集请求
2 min read

分布式事务之 Seata

前言   在企业应用程序开发中,随着分布式框架发展,我们生产环境会有会很多数据库的实例,特别是在微服务领域中,我们会设计每个业务Service模块都会对应一个自身业务模块的DB存储节点。然后再对这个DB存储节点做高可用部署。 事务问题   那么我们在编写Service中的业务逻辑时,肯定会遇到一个业务操作会远程调用到其他不同的业务模块,那么对应的产生数据就会落盘到不同的存储节点中,为了保障多个数据库实例之间的事物ACID特性,就遇到了分布式事务的问题。 分布式事务 1、如果整个业务调用链路均成功,那么整个调用链路对应的数据库做事物提交。 2、如果调用链路中抛出了异常,那么整个调用链路对应的数据库做回滚操作。 Seata 在Seata分布式事务解决方案中,一般有以下这些角色: RM (Resource Manager) 管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。 TC (Transaction Coordinator) - 事务协调者 TM (Transaction Manager) - 事务管理器,AP上
7 min read

Helm 包管理工具

众所周知,k8s可以在多个node节点上管理容器资源,但每个容器需要对应的pod-yaml文件来进行管理。 我们先说问题:如果在一个namespace中有几十个pod需要进行配合部署,例如 mysql 集群,kafka集群,但部署kafka集群又需要先部署 zookeeper集群,应用程序又需要Redis 集群,以及一些MQ队列集群,还有应用程序自身的部署,微服务可能多达50-100个甚至更多的应用。 这样的场景让你来写 yaml 配置文件 我想你可能是拒绝的,就算你部署了一次,好不容易部署完成了,但异地机房集群还要再次部署怎么办? 更何况怎么做到多个不同机房中集群的配置信息完全一致? 所以这里的问题很明显了,我们需要一个可以集中管理所有 yaml 配置文件并且可以复用的工具。 于是 Helm 就诞生了,他的定位类似于 CentOS 中的 Yum 包管理工具,又或者是 Debian中的 apt 包管理工具,只不过这次的包管理是基于 k8s 环境。 Heml 中的每个包都称为一个Chart,一个Chart是一个目录。 应用发布者可以通过Helm打包应用,管理应用依赖关系,管理
2 min read

Kubernetes Pod Yaml文件解析

此文件相关配置查询(此文件只做参考,以查询为准) kubectl explain 为文档查询命令如:kubectl explain pod.spec.volumes apiVersion: v1 //版本 kind: pod //类型,pod metadata: //元数据 name: String //元数据,pod的名字 namespace: String //元数据,pod的命名空间 labels: //元数据,标签列表 - name: String //元数据,标签的名字 annotations: //元数据,自定义注解列表 - name: String //元数据,自定义注解名字 spec: //pod中容器的详细定义 containers: //pod中的容器列表,可以有多个
5 min read

Redis 常用UI工具

Redis虽然可以通过客户端执行命令查看数据信息,但并没有图形化界面来的高效,故此记录几款常用的Redis UI工具。 Redis Desktop Manager 收费,可以试用半个月,也可以在网上找到破解版,只是版本可能并不是最新版本。 RESP.app (formerly Redis Desktop Manager) - GUI for Redis ® available on Windows, macOS, iPad and Linux.Cross-platform GUI for Redis ® : download for macOS, iPad, Windows and Linux.RESP.appIgor Malinovskiy AnotherRedisDesktopManager 开源免费,好用,UI简洁好看。 GitHub - qishibo/AnotherRedisDesktopManager:
2 min read

Fiddler 安装并抓取HTTPS请求

众所周知 Fiddler 是一个非常实用的抓包工具(主要是对于Http请求)而且有很多的扩展功能可以去官网下载,我们在开发中,难免需要抓包工具来查看接口数据 或者 测试接口的安全性, 如未签名而进行值的修改,下面将介绍它的安装以及配置 证书 来抓取Https加密信息。 Fiddler 官方网址: Fiddler | Web Debugging Proxy and Troubleshooting SolutionsExplore the Fiddler family of web debugging proxy tools and troubleshooting solutions. Easily debug, mock, capture, and modify web and network traffic.Telerik.com [https://www.telerik.com/fiddler]
3 min read

IDEA 常用插件以及开发工具

1、静态代码质量管理工具部署平台 Code Quality and Code Security | SonarQube [https://www.sonarqube.org/] 2、代码质量检查插件 FindBugs 可以直接以插件安装在IDEA IDE中 FindBugs™ - Find Bugs in Java Programs (sourceforge.net) [https://findbugs.sourceforge.net/] 3、翻译插件(英语不好者必备) Translation 可以在代码开发试图中直接翻译 4、代码编码格式约束插件 CheckStyle-IDEA 通过检查对代码编码格式,命名约定,Javadoc,类设计等方面进行代码规范和风格的检查,从而有效约束开发人员更好地遵循代码编写规范 5、Java Meven 包冲突检测工具 Maven Helper 可以检测整个项目pom.
2 min read

StarVCenter 私有云部署

一套国产超融合云平台IaaS软件,StarVCenter还提供了超融合技术,将计算、存储和网络等资源整合到一个硬件节点中,形成一个完整的虚拟化基础设施。这种超融合架构可以提高资源利用率,减少部署和维护成本,同时还可以提供更高的性能和可靠性。 官网文档:StarVCenter帮助文档 · StarVCenter帮助文档 (starvcs.com) StarVCenter的超融合技术包括以下特点: 1. 硬件节点整合:将计算、存储和网络等资源整合到一个硬件节点中,形成一个完整的虚拟化基础设施。 2. 简化部署:通过自动化部署和配置,简化了整个虚拟化环境的部署和维护。 3. 高性能和可靠性:通过整合计算、存储和网络等资源,提高了系统的性能和可靠性。 4. 灵活扩展:支持在线扩容和缩容,可以根据业务需要灵活调整资源。 总之,StarVCenter的超融合技术可以帮助用户实现高效的虚拟化基础设施部署和管理,提高资源利用率和降低成本。 StarVCenter追求极致好用,社区免费使用(不超过20台物理服务器)、社区免费技术支持、永久免费升级。 除了基本的虚拟化管理功能,Star
2 min read

7层网络协议

1、物理层: 解决两个硬件之间怎么通信的问题,常见的物理媒介有光纤、电缆、中继器等。它主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。 它的主要作用是传输比特流(就是由1、0转化为电流强弱来进行传输,到达目的地后在转化为1、0,也就是我们常说的数模转换与模数转换)。这一层的数据叫做比特。 2、数据链路层: 在计算机网络中由于各种干扰的存在,物理链路是不可靠的。该层的主要功能就是:通过各种控制协议,将有差错的物理信道变为无差错的、能可靠传输数据帧的数据链路。 它的具体工作是接收来自物理层的位流形式的数据,并封装成帧,传送到上一层;同样,也将来自上层的数据帧,拆装为位流形式的数据转发到物理层。这一层的数据叫做帧。 3、网络层: 计算机网络中如果有多台计算机,怎么找到要发的那台?如果中间有多个节点,怎么选择路径?这就是路由要做的事。 该层的主要任务就是:通过路由选择算法,为报文(该层的数据单位,由上一层数据打包而来)通过通信子网选择最适当的路径。这一层定义的是IP地址,通过IP地址寻址,所以产生了IP协议。 4、传输层:
3 min read

JVM GC 知识点

JVM 中常见的垃圾收集器主要包括 Serial、Parallel、ParNew、CMS、G1 以及 ZGC 等。不同收集器在 并发能力、停顿时间、吞吐量以及适用场景 上各不相同。下面对常见的几种垃圾收集器进行整理说明 Serial 收集器 (-XX:+UseSerialGC -XX:+UseSerialOldGC) Serial 收集器是 JVM 中最基础、历史最悠久的垃圾收集器,它采用 单线程方式执行垃圾回收。在进行垃圾回收时,JVM 会触发 STW(Stop The World),即暂停所有用户线程,直到垃圾回收完成后才恢复业务线程运行。 在算法实现上,Serial 收集器在 新生代使用标记-复制算法(Copying),而在 老年代使用标记-整理算法(Mark-Compact)。由于整个回收过程只有一个 GC 线程,因此实现简单且稳定,
9 min read

Zookeeper 可视化UI工具

推荐几款常用的 Zookeeper UI 工具,以帮助我们提高工作效率。 1、Zookeeper Assistant (收费) ZooKeeper Assistant - ZooKeeper可视化管理与监控工具适用于Windows的ZooKeeper管理GUIZooKeeper Assistant1402752916qq.com [http://www.redisant.cn/za] 对于收费来说,个人感觉是没必要的,ZK的功能并不复杂,主要就是Znode节点信息的CRUD,不过看得出来他们的UI界面是用心做了的,对于这点就值得点赞。 2、PrettyZoo (开源免费) 这款本人也在使用,免费,UI又比较耐看。 github地址:vran-dev/PrettyZoo: 😉 Pretty nice Zookeeper GUI, Support Win / Mac / Linux Platform (github.com) [https://github.com/vran-dev/
2 min read

Debian 安装 Containerd

Containerd 官方网址 :containerd – An industry-standard container runtime with an emphasis on simplicity, robustness and portability [https://containerd.io/] 官方安装教程:集装箱/started.md 在主要 ·集装箱/集装箱 (github.com) [https://github.com/containerd/containerd/blob/main/docs/getting-started.md] 安装环境: Debian 11.5.0 版本 安装流程: 1、从github仓库下载 Containerd 最新发行版到服务器上 下载地址 : https:
3 min read

Zookeeper 集群搭建

部署环境 操作系统 Debian 11.5.0 运行环境 OpenJDK-1.8.0_332 64-Bit Server VM Zookeeper版本:3.8.0 官方介绍 Zookeeper官方文档地址(下载的zip压缩包中\docs目录也自带文档):ZooKeeper: Because Coordinating Distributed Systems is a Zoo (apache.org) ZooKeeper 是一种用于分布式应用程序的分布式开源协调服务。它公开了一组简单的基元,分布式应用程序可以基于这些基元来实现更高级别的同步、配置维护以及组和命名服务。它被设计为易于编程,并使用根据文件系统熟悉的目录树结构设置样式的数据模型。它以 Java 运行,并具有 Java 和 C 的绑定。 ZooKeeper 的实施非常重视高性能、高可用性、
11 min read

随心笔记

技术无止境 创新不停驻