自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Aaron.无剑

Nobody can casually succeed.(博客转载,如有版权问题请联系) (微信号:13544169570)

  • 博客(116)
  • 收藏
  • 关注

原创 用户态协议栈tcp/ip设计

对于服务器而言,正常的接受一帧Data的过程,客户端先通过网络发送一帧数据到网卡,再经过协议栈,最后通过系统调用叨叨应用程序。具体的流程图如下:针对上面的两个流程,涉及到两次拷贝(网卡拷贝到协议栈,协议栈拷贝到应用程序),所以就产生了用户态协议栈,将协议栈网络解析作为应用程序的一部分。

2022-11-30 21:14:34 770 1

原创 kubeadm搭建单Master多Node集群

环境:podSubnet(pod 网段) 10.244.0.0/16serviceSubnet(service 网段): 10.10.0.0/16实验环境规划:操作系统:centos7.6 阿里云ECS配置: 8Gib 内存4vCPU/40G 硬盘。

2022-08-13 17:58:53 381

原创 namespace命令空间

K8s支持多个虚拟集群,就是将一个物理集群虚拟成很多个虚拟集群。这些虚拟集群被称为命名空间。namespace是k8s集群级别的资源,可以给不同的用户,租户,环境或者项目创建对应的命名空间。例如,可以为test,devlopment,production环境分别创建格子的命名空间。在k8s中,大部分资源都可以打标签。类似别名,方便记忆。...

2022-08-12 22:20:45 890

原创 Pod入门与实战

a 定义Pod是K8s运行的基本单位。Pod与容器关系:Pod ===虚拟机容器 === 进程关系也是一对多的关系。2 Pod与容器关系两种用法:1 一个Pod一个容器;2 一个Pod多个容器(高级用法)一些Pod有init容器和应用容器。在应用程序容器启动前,运行初始化容器。主要介绍pod定义,容器的关系;pod相关的网络,存储,亲和性资源相关;pod常见的工作方式;yaml的工作方式;pod创建原理与流程;一个简单的资源清单编写。......

2022-08-12 00:38:51 757

原创 K8S集群kubeadm搭建(多master单node)

架构图:k8s环境规划:podSubnet(pod网段) 10.244.0.0/16serviceSubnet(serivce网段) 10.10.0.0/16实验环境规划:操作系统: Centos7.9配置: 2G内存/4vCPU/40G磁盘网络:NAT模式开启虚拟机的虚拟化集群ip以及常见的需要安装的组件 常见的两种安装方式:kubeadm以及二进制安装目前是按照kubeadm安装#修改/etc/sysconfig/network-scrips/ifcfg-ens33文件

2022-06-24 12:16:22 2216

原创 K8S架构常用组件核心资源

k8s的物理架构师master/node模式。集群至少需要一个master结点和多个工作结点,Master节点是集群的控制节点,负责整个集群的管理和控制,主要用于暴露API、调度部署和对节点进行管理。工作节点主要是运行容器的。常见的几种架构:单master多worker;多master单worker;多master多woker1 单master多woker 2 多master 1 master常用组件:kubectl:管理k8s命令行工具etcd:高可用的键值数据库,存储k8s资源状态信息和网

2022-06-21 22:22:57 11461 1

原创 Docker数据持久化

容器的数据持久化主要是指宿主机与容器,以及容器与容器之间进行数据交互;当数据文件一般默认是属于容器的,但是当删除容器的时候会一起将数据一起删除;所以就需要有单独的位置存储数据。 什么是数据卷?数据卷是经过特殊设计的目录,可以绕过联合文件系统(UFS),为一个或者多个容器提供访问,数据卷设计的目的,在于数据的永久存储,它完全独立于容器的生存周期,因此,docker 不会在容器删除时删除其挂载的数据卷,也不会存在类似的垃圾收集机制,对容器引用的数据卷进行处理,同一个数据卷可以只支持多个容器的访问。数据

2022-06-12 16:05:06 2441

原创 Dockerfile语法详解

对于docker编排类似我们在编程过程中的Makefile。Dockerfile是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。#构建一个简单的nginx镜像的dockerfile:dockerfile:#创建index.html#dockerfile构建过程从基础镜像运行一个容器;执行一条指令,对容器做出修改;执行类似docker commit的操作,提交一个新的镜像层;再基于刚提交的镜像运行一个新的容器;执行dockerfile中的下一条指令,直至所有指

2022-06-12 12:17:29 630

原创 Docker容器运行

主要介绍容器的简单基本相关操作。以及简单的部署nginx网站docker run --name=hello -it centos /bin/bash输入exit,就退出容器,退出之后容器也就停止了,不会在前台运行了#docker run运行并创建容器–name 容器的名字-i 交互式-t 分配伪终端centos:启动docker需要的镜像/bin/bash说明你的shell类型为bash,bash shell是最常用的一种shell, 是大多数Linux发行版默认的shell。此外还有C s

2022-06-11 15:37:22 16687

原创 Docker容器基础

Docker官网:https://docs.docker.com/Docker的github地址:https://github.com/moby/mobyDockerhub官网: https://registry.hub.docker.comDocker官方registry镜像加速:https://dashboard.daocloud.io/mirrorDocker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,

2022-06-11 12:17:36 2641

原创 内存管理--虚拟地址空间布局架构

1 介绍内存管理是内核中非常重要的一个子系统,它主要分为三个层面用户空间,内核空间,硬件 1 用户空间: 主要是针对malloc/free,new/delete 2 内核空间: 内核中的sbrk/brk等系统调用 3 硬件:处理器包含一个内存管理单元MMU的部件2 内存管理布局架构 1 内存管理架构现代操作系统标准组成:cpu,memory(内存和外存),输入输出(IO),网络设备和外围设备,具体如下:内存管理布局架构图:1 应用空间:相当于使用malloc/free,c++中使用

2022-04-23 22:16:39 2656

原创 内核调度器原理与分析

介绍内核中针对task_struct进程描述符专门安排有序执行的模块叫调度器调度器作用:1 cpu中央处理器专门管理时间2 通过进程优先级为依据专门分配时间当在运行的过程中,某个进程的时间片到了或者缺少某个条件就会发生上下文切换,cpu重新切换一个进程。调度类1 调度类结构体sched_class:内核中提供了一个专门用来调度的进程的类接口sched_class在内核中,系统中有多个调度类,按调度优先级连接成链表。kernel/sched/sched.h文件中struct sched_

2022-04-22 22:00:46 678

原创 进程原理基本概念

概念介绍程序:指指令,数据以及组织形式描述进程:不是运行单位,计算机已经运行程序,而是线程的容器。进程的四要素:1 有一段程序供其执行2 有进程专用的系统堆栈空间3 在内核有task_struct描述4 进程有独立的存储空间,拥有专有的用户空间有1,2,3缺少4,称为线程;若完全没有用户空间,称为内核线程;若共享用户空间,称为用户线程生命周期task_struct优先级系统调用...

2022-04-20 22:43:26 1058

原创 Linux内核编译与升级

linux 内核编译与升级

2022-04-04 22:22:52 2306

原创 RPC基础

1 解决什么问题现代软件系统,越来越讲究海量用户,传统的服务器体系在单个进程里面开多线程无法满足了;于是产生了分布式系统,将业务拆分成很多小的服务,也就是所谓的微服务:而它的基石就是RPC框架。RPC:远程过程调用。传统的socket编程与采用rpc的比较,如下图:2 RPC分类目前主流的rpc框架grpc: google的 基于protobuf http2.x 支持多语言thrift: facebook 支持多语言Dubbo: 阿里的 Java实现brpc: 百度 C++实现

2022-01-12 22:51:57 384

原创 lambda表达式与匿名函数

解决什么问题对于c++中的lambda表达式,在其它的高级语言中可能没有这个概念,而是用的匿名函数,其实本质上是一个东西。常用于编写函数,而只调用一次的情况;例如一个按钮点击触发一个函数,只有这一个地方调用;不写又不行,写又很浪费;故引入了匿名函数。用法格式1 基本用法[函数对象参数] (操作符重载函数参数) mutable 或 exception 声明 -> 返回值类型 {函数体}例如:int c = [] (int a, int b) -> int { return a+b;

2021-11-02 03:30:03 1076

原创 类型转换const_cast/static_cast/dynamic_cast/reinterpret_cast

解决问题主要是针对C语言中的类型隐形转换以及手动转换,C++提供了四种机制全部用来手动转换添加了4个关键字,解决C中的强转的风险,提高代码的安全性和健壮性const_cast取消类型的const或volatile属性将const转成非const。主要针对的是指针,引用,this指针;普通的变量无法使用. const int n = 10; //int k = const_cast<int>(n); //编译不通过 int* j = con

2021-11-02 00:01:16 864

原创 进程管理与运行分析

1 介绍每个程序员对于阅读内核,以及往内核中打补丁patch作为一种荣耀。Linux内核大体的模块主要包括四大部分: 进程管理(调度,创建,内核线程等);内存管理(物理内存和虚拟内存);文件系统(虚拟文件系统VFS,真实的实时文件系统ext3/ext4)内核协议栈:可参考网上的ntytcp2 内核源码目录如下是内核Linux4.4.4版本的内核文件内容内核版本号含义:V4.12.24: 4:主版本号 12:次版本号(奇数为测试版,偶数稳定版) 24:当前版本修复上个版本的补丁

2021-10-09 23:54:53 756

原创 nginx基础

1 介绍对于nginx在互联网中运用非常广泛,常见的web产品有IIS,apache,tomcat,lihttpd等。已经有这么多web产品了为何还要有nginx产品呢。主要是因为tomcat等动态接口,从db库中拉去资源。nginx主要被用于代理。代理分为正向代理和反向代理反向代理代理的是服务器,而正向代理代理的是客户端(常见的产品有VPN反向代理服务器与路由器和网关的关系:网关服务器:主要是指应用层的,代理服务器也叫网关服务器;网关:指网络层以下,也叫网关(路由器,交换机的数据出入口)2

2021-09-13 02:06:35 367

原创 mysql集群方案

1 介绍对于一个互联网项目而言,在mysql这块,主要是分为两种职业:oltp和dba;开发人员和数据库运维人员我们常常将一个项目分为三个阶段:初期,发展,爆发1 项目初期:此阶段主要是但结点,需要解决可靠性,单点故障的问题(一般情况下采用主从复制就好了),但是目前我遇到的项目基本上没有,直接单台mysql2 发展阶段:常见的问题宕机,读写性能问题;主要解决的可用性(合理的时间内提供合理的回复,专业一点说法:多少时间内完成切换),采用什么样的集群方案实现了多长时间的切换。解决方案:读写分离;缓存方式

2021-09-11 13:48:02 727

原创 mysql缓存方案

1 解决问题对于mysql而言,在体系结构中是有一个缓存的,但是在实际的项目中,读一般远远大于写,大概有10倍的样子,自己的公司项目是在17倍的样子,默认的mysql内部实现的缓冲不够用,无法满足高并发的需求;所以就产生了一些缓存中间件,主流的缓存中间件redis,memcached等2 mysql主从复制原理图:具体流程:1 主库更新事件(update,insert,delete)通过io-thread写入binlog2 从库请求读取binlog,通过io-thread写入(write)从

2021-09-01 23:15:08 1469 2

原创 事务原理与锁机制

1 解决什么问题对于mysql而言,事务是非常重要的概念。在mysql体系结构中知道mysql内部实现了连接池,里面管理这连接,一个连接对应的是一个线程;对于多个连接而言操作sql命令是并发的。并发就存在数据紊乱的问题了。而事务正是将一组sql语句或一个sql语句组成一个原子操作,要么成功,要不就失败的操作。2 事务介绍1 目的事务是将DB从一个状态转换到另外一个状态2 组成可由一条sql组成,也可由一组复杂的sql组成3 特征提交时,要么成功,要么失败,访问并更新db各种数据项的一个程序执行单元

2021-09-01 21:17:29 1086

原创 索引原理与优化

1 索引介绍mysql两大块重要内容索引和事务,索引是一般用于查询,事务一般用于插入修改操作。对于磁盘存储一般采用B树和B+树。B树----》mongodb;B+树----》mysql1 树演变过程:树–》二叉树–》二叉排序树(二叉搜索树)–》平衡二叉树(AVL/红黑树)—>多路平衡搜索树如下图: 2 B树、B+树 B树性质M阶B树:性质1 每结点至少拥有M颗树2 根结点至少有两颗子树3 非根结点其余分支结点至少拥有M/24 叶子结点都在同一层5 关键字k,则字树K+1,关键

2021-09-01 18:59:37 202 2

原创 用户态协议栈之epoll实现

1 epoll编程问题对于数据传输send/recv这些接口的而言;如何判断send数据,对方有没有接收成功?采用send返回值无意义。,send发送数据只是将数据拷贝到协议栈,而数据的发送是协议栈自动处理的(何时发送也是由自己组装的).2 粘包分包问题产生原因:应用程序多次调用send后,只是将数据从用户空间拷贝到内核协议栈。而对于协议栈很容将两次的send包一起发送。解决方案:a): tcp应用层协议添加长度域b)每个包加上分割符c)定长包(比较low,不推荐使用)3 多个线程,并发的给

2021-08-25 14:41:59 405

原创 用户态协议栈之滑动窗口与定时器

1 tcp帧头source prot:源端口 16位Destination port:目的端口 16位sequence Number:序列号 32位ack number:应答序号 32位header length:头长度 4bitsresv:4位CWR:1位ECE:1位URG:1位ACK:1位PSH:1位RST:1位SYN:1位FIN:1位Windows size:窗口大小 16bitstcp checksum:校验和Ugrent pointer:options:选项

2021-08-24 00:42:11 248 1

原创 用户态协议栈之tcp/ip设计

1 解决问题对于服务器而言,正常的接受一帧Data的过程,客户端先通过网络发送一帧数据到网卡,再经过协议栈,最后通过系统调用叨叨应用程序。具体的流程图如下:针对上面的两个流程,涉及到两次拷贝(网卡拷贝到协议栈,协议栈拷贝到应用程序),所以就产生了用户态协议栈,将协议栈网络解析作为应用程序的一部分。2 用户态协议栈原理1 定义组成图用户态协议栈主要是用来减少拷贝。采用通过网卡的nmap,DMA方式,将网卡映射到内存中,底层采用DMA直接通道。应用程序直接去内存中取。DMA无copy,copy赋值

2021-08-22 15:45:47 1113 2

原创 协程设计与原理(二)

用户态协议栈之tcp/ip设计

2021-08-22 00:13:29 386 1

原创 协程的设计原理(一)

1 解决问题目前主流的协程库libgo(golang提供);libco(腾讯开源),libgo使用起来方便,自己的工程也是采用libgo实现的全球同服的服务器框架。解决了采用同步的方式实现异步的性能。2 同步/异步/协程关系1 同步与异步区别对于同步来说是,业务服务器发送一个请求后,等待第三方服务器返回后继续执行其它操作;异步是不需要等待返回,直接执行其它操作,当第三方服务器返回时候,在通过回调方式来通知业务服务器对应响应的处理。异步的实现方式可以看前面的博客(异步请求池实现)四元组.2 具体

2021-08-16 01:02:40 309 1

原创 消息队列与无锁队列实现

消息队列与无锁队列实现

2021-08-15 12:59:00 1290 1

原创 锁与原子操作CAS底层实现(二)

1 解决问题前一篇博客已经提出了用锁的方式解决多线程操作同一临界区资源的问题。还有其它的解决方案:原子操作2 volatile关键字volatile变量:易变的,最早由于高低电平捕获在变,不是通过内存计算而得到的。通过串口,网线来改变,变主要是外界资源变化引起的。volatile修饰:去优化,就是告诉编译器怎么翻译用这个伪指令修饰的变量举个例子:volatile a = 1;while(a == 10)第一次把a从内存放到cpu寄存器eax,然后cpu计算比较;下次再比较的时候自然用eax

2021-08-03 23:16:06 301 1

原创 锁与原子操作CAS底层实现(一)

1 解决问题对于服务器而言,锁发生的场景主要是在多线程或多进程,多任务的操作系统中,避免不了会共享一些资源,就会出现线程a,线程b或者进程a,进程b同时操作同一资源(临界区)的问题会产生无法预料的现象,副作用。所以需要加锁。2 锁的分类按照自己的理解主要分为两大类:posix api锁和分布式锁posix api锁:互斥锁,自旋锁,读写锁分布式锁:乐观锁,悲观锁等,目前不总结,等后面再分布式技术中总结吧 原子操作:当然除了上面的锁能解决这种问题,原子操作也能解决,注意是无锁的...

2021-08-03 00:41:37 358 1

原创 定时器设计与实现

1 解决问题主对于服务器而言,定时器主要用于一些需要定时触发的任务;常用于比如心跳检测,游戏中的技能冷却,倒计时,超时检测等。2 定时器使用位置对于定时器一般在服务器中常见的用法有两种:a) 与epoll_wait搭配使用;b) 开启单独的线程处理a) epoll_wait搭配使用:网路事件和时间事件在同一个线程当中配合使用;例如nginx,redis对于服务器主要的事件有两个:网络事件和时间事件流程:while(!quit){ int now = get_now_time();/

2021-08-02 00:11:55 861

原创 池化组件之异步请求池

1 解决问题当服务器操作需求请求一些资源,例如mysql,redis,dns,http等时,如果不采用任何池化组件,就是基本上都是经过tcp三次握手,认证 ,然后再操作,关闭认证,tcp四次挥手。这就是一个耗时的事情,如果再加上业务服务器频繁操作就更加耗时。就引入了连接池(服务器启动后,提前创建好固定的连接,然后进行同步操作);当服务器业务处理增加量后,此时就可以在连接池中,加入连接的放缩来处理也是可以处理并发的。也还有另外一种方案:异步请求池2 同步和异步区别同步:服务器发送了请求必须要等待第三

2021-07-31 00:15:37 1146 1

原创 池化组件之内存池

1 解决问题对于服务器而言,当epoll_wait检查io事件是否就绪后,然后recv接收数据写入buffer,对于buffer如果采用在栈上处理;会出现如果耗时,一次性没有处理完或者想将buffer传给单独的线程或线程池处理。就无法实现,就需要在堆上处理。若无内存池,每次开辟都需要malloc系统调用;内存池就是程序中的只要是在堆上的空间全部统一管理。应用场景:主要用于数据频繁的需要分配的地方2 内存池原理1 进程与虚拟内存的关系每个进程都有一个对应的虚拟内存,和真实的物理内存一样大都是4G

2021-07-30 00:55:29 224 2

原创 nginx线程池原理

1 数据结构任务队列的描述:工作队列的描述:采用一个int整数来描述:ngx_uint_t threads; // 线程数 管理组件描述:2 单个线程池api接口创建,销毁,抛入任务创建:1 初始化任务列表 2创建互斥锁 3 创建条件变量 4 创建若干工作线程具体源码如下:// 每个工作线程的线程函数static void *ngx_thread_pool_cycle(void *data){ ngx_th

2021-07-29 12:18:17 314

原创 池化组件之线程池

1 线程池用途:对于服务器而言,一帧网络数据到达服务器,服务器会通过底层组件epoll,然后到上一层业务进行操作:recv()、parse(),send()parser:解析数据例如记录日志,crud操作等。对于这些操作可能耗时。上面主要是服务器单线程操作的流程,对于这些记录日志,crud操作等耗时操作较慢。故引入了消息队列、单个进程,单个线程处理将这些任务操作丢在消息队列然后再处理或者用一个单独的进程单独线程处理等。还可以引入 线程池 将记录日志,crud操作全部打成任务丢给线程池处理。应用场景

2021-07-29 01:07:51 152 1

原创 池化组件之连接池

池化组件:不停的执行某类任务。采用可以有效的提升性能。主要是用来解决资源复用的问题。常见的池化组件(连接池,请求池,线程池,内存池),下面主要介绍连接池。对于服务器而言,连接池主要用来连接第三方服务,自己用的比较多,比较常见的:mysql连接池和redis连接池1 数据库连接池程序启动时建立足够的数据库连接,并将这些连接组成一个连接池,由程序动态地对池中的连接进行申请,使用,释放。其实就是创建数据库连接是耗时,也容易对数据库造成安全隐患,所以集中创建连接,并把他们集中管理,供程序使用,可以保证安全可

2021-07-24 07:23:47 305

原创 udp可靠性传输

udp数据包传输快,但是相对于tcp来说不可靠;而tcp可靠,但是传输速度相比udp没有那么快。所以有些需求需要中和它们的优缺点来中和一下,就出现了一些中间件,比较有名的KCP和QUIC。1 kcp介绍    KCP是一个快速可靠协议,能以比TCP浪费10%-20%的带宽的代价,换取平均延迟降低30%-40%,且最大延迟降低三倍的传输效果。纯算法实现,并不负责底层协议(如UDP)的收发,需要使用者自己定义下层数据包的发送方式,以callback的方式提供给KCP。连时钟都需要外部传递进来,内部不会有任何

2021-07-18 12:19:07 2622 2

原创 udp分片与组包

udp分片与组包

2021-07-17 23:19:03 5633 4

原创 redis,memcached,nginx网络组件

网络编程主要关注3个半事件:连接建立(client连接/连接第三方服务);连接断开,消息达到,消息发送完毕。1 阻塞,非阻塞区别:1 阻塞io阻塞在哪? 阻塞在网络线程2 什么决定阻塞?fcntl函数设置阻塞3 具体内部差异: 网络io分为两个流程,数据准备阶段(网卡拷贝到内核空间),数据拷贝阶段(内核空间拷贝到用户空间),非阻塞是在数据准备阶段返回,但是在第二个阶段也还是阻塞的。2 epoll1 为何又多路复用?用一个线程检查多个io事件。水平触发:io即可是阻塞也可以是非阻塞边沿触发:只

2021-07-14 02:00:24 305

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除