自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(90)
  • 收藏
  • 关注

原创 teamtalk原理

再贴一遍架构图从图中可以看出,对外使用的是http连接,内部使用的是tcp长连接。类的命名规则:xxxServConn是模块连别的模块,xxxConn是别的模块连它。协议设计teamtalk采用protobuf进行序列化typedef struct { uint32_t length; // the whole pdu length uint16_t version; // pdu version number uint16_t flag; // no

2022-09-30 15:40:12 1611 1

原创 teamtalk实现即时通讯

即时通讯技术应用非常广泛,涉及教育、电商、金融、泛娱乐、生活服务、医疗健康、政企服务、游戏聊天、在线客服等等行业,不是大家认为仅仅是qq、微信那样。即时通讯架构先给张图客户端与服务器端进行网络通信、收发消息连接层为客户端收发消息提供出入口。主要的任务:保持海量用户连接;解析协议,对传输内容进行编码;维护session;推送消息。核心业务层负责IM系统各项功能的核心逻辑实现。数据层负责IM系统相关数据的持久化存储,包括消息内容、账号信息等。分层架构接入层的作用:连接整流、通信安全、报文解压缩

2022-09-29 17:37:52 2321

原创 vpp安装与使用

VPP平台是一个可扩展的框架,可提供开箱即用的生产质量交换机/路由器功能,对数据进行一些处理。下载与安装从git上拉取,这里选择1801的版本git clone -b stable/1801 https://github.com/FDio/vpp.git下载完成后,进行编译./extras/vagrant/build.sh && make 编译完成后,会在build-root目录下,生成一些deb文件执行以下命令进行安装dpkg –i vpp-lib_18.01.2-1~

2022-09-13 17:10:35 1943 1

原创 k8s简介

Kuberentes 是基于容器的集群管理平台,它的简称,是K8S。K8s是Go语言开发,是Docker的上层架构,就好像Java与J2EE的关系一样。K8s是一个开放的开发平台,不局限于任何语言。其主要功能:k8s能方便地管理跨机器运行容器化的应用提供应用部署、维护、扩展机制集群管理、安全防护、准入机制、多应用支撑、服务注册、服务发现、智能负载均衡、故障发现、自我修复、服务滚动升级、在线扩容、资源配额管理使用Docker对应用程序包装、实例化、运行以集群的方式运行、管理跨机器的容器解决Do

2022-09-11 16:40:03 10198

原创 多队列网卡与虚拟化

多队列网卡之前简单介绍过多队列网卡,这里稍微展开一点。之前介绍过,一个数据包,由某个队列处理,触发指定中断。当收到报文时,通过 hash 包头的(sip, sport, dip, dport)四元组,将一条流总是收到相同队列,同时触发与该队列绑定的中断。ls /sys/class/net/eth0/queue结果内核对多队列网卡的支持Linux 内核中,RPS(Receive Packet Steering)在接收端提供了这样的机制。RPS 主要是把软中断的负载均衡到 CPU 的各个 c

2022-09-10 15:32:15 1063

原创 dpdk实现dns

之前,我们实现了用dpdk处理udp协议数据。这里,我们在udp基础上实现dns,其实是借用了开源框架,懒得自己去实现解析了。再谈arp这里我们没有使用自己实现的arp,而是把arp包交给kni处理。为什么辛辛苦苦实现arp,最后却不用呢?因为我们没有实现记录arp的功能,网卡在接收到arp包后,给发送方回了arp包,但是自己却没有处理这个包。arp表上没有相应ip与mac的映射,那就发送不了数据,kni会帮我们添加arp表项。使用kni,又会有一个问题,kni默认是不进行回环的,也就是说,接受到了数

2022-09-06 10:17:50 1512

原创 docker简介

Docker 是一个应用打包、分发、部署的工具。打包就是把软件运行所需的依赖、第三方库、软件打包到一起,变成一个安装包;分发可以把打包好的“安装包”上传到一个镜像仓库,其他人可以非常方便的获取和安装;部署:拿着“安装包”就可以一个命令运行起来你的应用,自动模拟出一摸一样的运行环境,不管是在 Windows/Mac/Linux。docker设计思想来源于港口码头工人搬运货物你也可以把它理解为一个轻量的虚拟机,它只虚拟你软件需要的运行环境,多余的一点都不要,而普通虚拟机则是一个完整而庞大的系统,包含各种不

2022-09-05 14:54:50 1062

原创 dpdk实现arp和kni

接着之前的代码,继续添加功能。数据发送之前介绍了接收的流程,这里介绍发送的流程。其实是类似的,是组包的过程,贴代码static void create_eth_ip_udp_pkt(uint8_t *msg, size_t total_len, uint8_t *dst_mac, uint32_t src_ip, uint32_t dst_ip, uint16_t udp_src_port, uint16_t udp_dst_port, uint8_t *data, int len

2022-09-02 17:26:30 990

原创 dpdk简单实现

DPDK是INTEL公司开发的一款高性能的网络驱动组件,旨在为数据面应用程序提供一个简单方便的,完整的,快速的数据包处理解决方案,主要技术有用户态、轮询取代中断、零拷贝、网卡RSS、访存DirectIO等。应用场景也是简单介绍,随着对dpdk认识的深入,对应用的理解也会深入。高性能网关:可以使数据通过dpdk而不经过内核的协议栈直达应用层,用以提升网关性能。dns可以这么做。虚拟交换机:利用dpdk优秀的性能,跑一个虚拟的交换机或是路由器,以提升性能。防火墙:对数据的出入口做一些限制。先简单

2022-09-01 11:29:56 2228

原创 tars架构

这里只是简单介绍一下,引个路,具体介绍可以看官方文档。先抄一段官方文档。TARS 是 Linux 基金会的开源项目,它是基于名字服务使用 TARS 协议的高性能 RPC 开发框架,配套一体化的运营管理平台,并通过伸缩调度,实现运维半托管服务。该框架为用户提供了涉及到开发、运维、以及测试的一整套解决方案,帮助一个产品或者服务快速开发、部署、测试、上线。 它集可扩展协议编解码、高性能 RPC 通信框架、名字路由与发现、发布监控、日志统计、配置管理等于一体,通过它可以快速用微服务的方式构建自己的稳定可靠的分布

2022-08-30 17:50:10 1974

原创 etcd简介

etcd是基于go语言实现,主要用于共享配置和服务发现的组件,最初用于解决集群管理系统中 os 升级时的分布式并发控制、配置文件的存储与分发等问题。因此,etcd是在分布式系统中提供强一致性、高可用性的组件,用来存储少量重要的数据。安装就不说了,需要从github上clone代码,具体操作较为复杂,如果编译过程中保存,根据具体问题来处理即可。主要有两种应用场景注册发现负载均衡etcd v2与v3版本这里对比一下两个版本的一些区别,也可以看出v3版本做出了哪些优化:v3版本使用 gRPC

2022-08-28 11:21:38 19512 1

原创 火焰图简介

火焰图可以更直观地分析每一个函数的调用栈,哪些函数比较耗时,以此来分析性能的瓶颈。⽕焰图仅⽤⼀张⼩图,就可以定量展示所有的性能瓶颈的全景图,⽽不论⽬标软件有多么复杂。传统的性能分析⼯具通常会给⽤户展示⼤量的细节信息和数据, ⽽⽤户很难看到全貌,反⽽容易去优化那些并不重要的地⽅,经常浪费⼤量时间和精⼒却看不到明显效果。传统分析器的另⼀个缺点是,它们通常会孤⽴地显示每个函数调⽤的延时,但很难看出各个函数调⽤的上下⽂,⽽且⽤户还须刻意区分当前函数本身运⾏的时间(exclusive time)和包括了其调⽤其

2022-08-26 10:58:33 5110

原创 googletest简介

googletest是由谷歌的测试技术团队开发的测试框架,使用c++实现,具有跨平台等特性。好的测试框架引用谷歌给出的文档,好的测试应当具备以下特征:测试应该是独立的和可重复的。调试一个由于其他测试而成功或失败的测试是一件痛苦的事情。googletest通过在不同的对象上运行测试来隔离测试。当测试失败时,googletest允许您单独运行它以快速调试。测试应该很好地“组织”,并反映出测试代码的结构。googletest将相关测试分组到可以共享数据和子例程的测试套件中。这种通用模式很容易识别,并使测

2022-08-25 16:32:35 6731

原创 死锁检测组件

简单粗暴,不介绍什么是死锁。要不是死锁检测需要提及产生条件,产生条件也不会写出来。死锁产生条件产生死锁必须同时满足以下四个条件,只要其中任意一个条件不成立,死锁就不会发生。互斥条件:只有对必须互斥使用的资源争夺才会造成死锁(例如哲学家问题,打印机设备)象内存、扬声器这样可以同时让多个进程使用的资源时不会导致死锁的(因为进程不用阻塞等待这种资源)。不剥夺条件:进程获得的资源在未使用的时候不能被其他进程抢走,只能自己主动释放。请求和保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资

2022-08-24 15:16:03 232

原创 虚拟网络适配器的实现

网络适配器是通过软件实现的,能够适配大多数网卡的组件。可以这么理解,网络适配器之于网卡,就相当于类之于实例。而虚拟网络适配器,则是并不对应一个物理网卡,叫做虚拟网络适配器,不与pci上的地址绑定。直接看实现。模块实现还是和之前一样,需要insmod插入自己定义的模块。//__init宏表示把函数代码放到内核中的代码段init.text中。注意与用户空间的代码段不同static int __init nic_init(void) { int ret = 0; struct nic_priv *

2022-08-23 15:44:18 860

原创 块设备和总线

资源管理数据结构Linux 提供了一个通用构架,用于在内存中构建数据结构。这些结构描述了系统中可用的资源,使得内核代码能够管理和分配资源。注意,其中关键的数据结构是struct resource。linux采用struct resource结构体来描述一个挂接在cpu总线上的设备实体(32位cpu的总线地址范围是0~4G)。/* * Resources are tree-like, allowing * nesting etc.. */struct resource { //设备实体

2022-08-20 19:00:22 295

原创 字符设备模块实现进程间通信组件

进程间通信组件,大家应该见得多了。shm、mmap、pipe、fifo……这些就不介绍了。今天介绍一种新的方式。原理在内核上添加一个设备文件,一个进程向这个文件里写数据,另一个进程从这个文件读数据,这就是原理。(好水……)为什么要用设备文件而不是普通文件呢?因为普通文件无法在文件有数据时立即通知读进程,只能靠轮询,也就是说,实时性会差一些。当然,内核模块里还有块设备文件模块、网卡设备模块,今天选择字符设备模块。代码这里一点一点贴代码。代码整体流程不难,主要是有很多涉及内核编程相关的代码需要解释。

2022-08-19 11:47:27 304

原创 ext文件系统

Linux 以文件的形式对计算机中的数据和硬件资源进行管理,也就是彻底的一切皆文件,反映在 Linux 的文件类型上就是:普通文件、目录文件(也就是文件夹)、设备文件、链接文件、管道文件、套接字文件(数据通信的接口)等等。Linux 上的文件系统一般来说就是 EXT2/3/4。EXT 是 延 伸 文 件 系 统 ( 英 语 : Extended file system,缩写为 ext 或 ext1),也译为扩展文件系统,一种文件系统,于 1992 年 4 月发表,是为 linux 核心所做的第一个文件系统

2022-08-16 16:03:23 2457 1

原创 linux伪文件系统proc

这次的篇幅稍短一些。伪文件系统存在于内存中,通常不占用硬盘空间,它以文件的形式,向用户提供了访问系统内核数据的接口。用户和应用程序可以通过访问这些数据接口,得到系统的信息,而且内核允许用户修改内核的某些参数。由于这些文件系统没有写盘,也叫作无持久存储文件系统。这里介绍一个常见的伪文件系统proc。proc文件系统(process filesystem),它使得内核可以生成与系统状态和配置有关的信息,该信息可以由用户和系统程序从普通文件读取,而无需专门的工具与内核通信。在某些情况下,一个简单的cat命令

2022-08-14 11:39:56 428

原创 linux虚拟文件系统

小前言开写之前,插个题外话。内核相关内容写了几篇文章了,每篇文章篇幅都不少,特别是贴了不少代码,因为要看内核的具体实现,源码是必不可少的。为了方便阅读源码,添加了部分中文注释,也保留了原来的的英文注释,所以篇幅比较长。写这一段话,希望保持住啃内核的热情,不要轻易放弃。进入正题。在linux操作系统当中,一切皆是文件,除了通所说狭义的文件(文本文件和二进制文件)以外,目录、套接字、设备及管道等都是文件。为了处理与文件系统相关的所有调用,表现为能够给各种文件系统提供一个通用的接口,使上层的应用程序能够使用通

2022-08-12 11:40:22 1738

原创 内存映射与物理内存结构

内存映射内存映射是在进程的虚拟地址空间中创建一个映射,可为分两种:文件映射:文件支持的内存映射,把文件的一个区间映射到进程的虚拟地址空间,数据源是存储设备上的文件。匿名映射:没有文件支持的内存映射,把物理内存映射到进程的虚拟地址空间,没有数据源。通常把文件映射的物理页称为文件页,把匿名映射的物理页称为匿名页。原理创建内存映射的时候,在进程的用户虚拟地址空间中分配一个虚拟内存区域。Linux内核采用延迟分配物理内存的策略,在进程第一次访问虚拟页的时候,产生缺页异常。如果是文件映射,那么分配物理

2022-08-11 10:01:14 703

原创 fuse简介

fuse是用户态文件系统。在介绍fuse之前,先笼统地介绍一下文件系统。文件系统文件系统是操作系统用于明确存储设备或者分区上的文件的方法和数据结构。用户态文件系统是操作系统提供了一层文件存储的接口,方便用户对文件操作的接口。文件系统的主要功能,一是对文件的操作(打开、关闭、增删改查),二是文件数据的存储。文件系统分为分布式文件系统和基于操作系统本身的文件系统。分布式文件系统由两部分组成:一是对文件本身做索引,二是包含一个网络服务器,对外提供服务。例子有fastdfs、ceph等。基于操作系统本身的文件

2022-08-09 18:06:56 4043 1

原创 linux内存分配器

介绍一下几个linux的内存分配器。伙伴分配器内核初始化完毕后,使用页分配器管理物理页,当前使用的页分配器就是伙伴分配器,伙伴分配器的特点是管理算法简单且高效。基本伙伴分配器连续的物理页称为页块(page block),阶(order)是页的数量单位,2的n次方个连续页称为n阶页块,满足如下条件的两个n阶页块称为伙伴(buddy)。两个页块是相邻的,即物理地址是连续的;页块的第一页的物理面页号必须是2的n次方的整数倍;如果合并(n+1)阶页块,第一页的物理页号必须是2的括号(n+1)次方的整

2022-08-08 19:34:40 884

原创 linux内存原理简介

这里简单介绍一下linux中内存模型和基本源码实现。内存模型共享存储型多处理机有两种模型:一致性内存访问(Uniform-Memory-Access,简称UMA)模型和非一致性内存访问(Nonuniform-Memory-Access,简称NUMA)模型。UMA模型每个cpu访问内存中的任何地址所需要的时间是相等的。此类结构也叫作对称多处理器架构(SMP),多个cpu对称工作,无主次或从属关系。各个cpu共享相同的物理内存,每个cpu访问任意内存时间相同,因此这个结构也是一致性内存访问。扩展UMA

2022-08-05 07:41:09 254

原创 ceph简介

ceph是⼀种分布式存储系统,可以将多台服务器组成⼀个超⼤集群,把这些机器中的磁盘资源整合到⼀块⼉,形成⼀个⼤的资源池(⽀持PB级别,大厂用得多),然后按需分配给客户端应⽤使⽤。由于ceph源码代码量较大,这里只做简单介绍。ceph特点⽀持三种存储接口: 对象存储、块存储、⽂件存储,称之为统⼀存储采⽤CRUSH算法,数据分布均衡,并⾏度⾼,不需要维护固定的元数据结构。CRUSH需要集群的映射,并使⽤CRUSH映射在OSDs中伪随机存储和检索数据,数据在集群中均匀分布数据具有强⼀致性,确保所有副本写

2022-08-02 20:03:07 15829

原创 linux锁与进程间通信

这一部分介绍linux中常见的各种锁的机制和进程间通信机制。进程间通信只介绍消息队列和共享内存,其他的不复杂,如果有兴趣的话可以研究一下源码,会操作使用就可以了。锁内核可以不受限制地访问整个地址空间。在多处理器系统上,这会引起一些问题。如果几个处理器同时处于内核态,则理论上它们可以同时访问同一个数据结构。在第一个提供了SMP功能的内核版本中,该问题的解决方案非常简单,即每次只允许一个处理器处于核心态。因此,对数据未经协调的并行访问被自动排除了。令人遗憾的是,该方法因为效率不高,很快被废弃了。现在内核使用

2022-08-01 20:39:30 352

原创 linux进程的调度

进程状态进程主要有7种状态:就绪状态、运行状态、轻度睡眠、中度睡眠、深度睡眠、僵尸状态、死亡状态。它们之间状态变迁如下:进程描述符task_struct结构体中有个成员state专门用来描述进程的状态。就绪状态:state为TASK_RUNNING,正在运行队列中等待调度器调度。运行状态:state为TASK_RUNNING,被调度器命中,正在处理器中运行。轻度睡眠:称为可打断的睡眠状态。state为TASK_INTERRUPTIBLE,可以被信号打断。中度睡眠:state为TASK_KIL

2022-07-31 09:50:18 4319

原创 进程的创建

Linux内核把进程称为任务(task)。在介绍进程之前,介绍一下linux源码的结构。源码结构注意带“/”的都是目录,其他的是文件。arch/ :不同架构、平台体系相关代码,如s390、x86block/ :块设备驱动certs/ :与认证签名相关的代码cryto/ :内核常用的加密和压缩算法等代码Documentation/ :描述模块功能和协议规范的代码drivers/ :驱动程序,如usb总线、pci总线、显卡驱动firmware/ :主要是一些二进制固件的代码fs/ :虚拟文

2022-07-28 16:54:38 601

原创 kafka简介

Kafka 本质上是⼀个消息队列。与zeromq不同的是,Kafka是一个独立的框架而不是一个库。这里主要介绍其原理,至于具体的安装等操作不做介绍,只是提示一下,第一次运行时,先设置前台运行,看会不会报错。架构注意下图没有画上zookeeper,请自行脑补。kafka需要连接到zookeeper,来完成注册发现等集群操作。broker都是由zookeeper管理。先给出 Kafka ⼀些重要概念,让⼤家对 Kafka 有个整体的认识和感知,后⾯还会详细的解析每⼀个概念的作⽤以及更深⼊的原理:Pr

2022-07-25 11:28:33 61235 1

原创 zeromq浅析

zeromq对传统的⽹络接⼝进⾏再次封装,提供了⼀个跨语⾔的库,⽀持任意语⾔使⽤统⼀的接⼝。ZMQ不是单独的服务,⽽是⼀个嵌⼊式库,它封装了⽹络通信、消息队列、线程调度等功能,向上层提供简洁的API,应⽤程序通过加载库⽂件,调⽤API函数来实现⾼性能⽹络通信。简单来说,zeromq就是实现了消息队列的一个库。这里只简单介绍一下zeromq线程间的交互与四个模型的实现。主线程与IO线程ZMQ根据⽤户调⽤zmq_init函数时传⼊的参数,创建对应数量的I/O线程。每个I/O线程都有与之绑定的Poller,P

2022-07-23 16:02:31 1539

原创 消息队列简介

消息队列的本质是就是个队列,FIFO先入先出,只不过队列中存放的内容是message,从而叫消息队列。主要用于不同服务server、进程process、线程thread之间通信。应用为什么要使用消息队列呢,具体来说主要有三个应用。异步处理通过消息队列,将同步操作改为异步操作,更快速返回结果,减少等待,实现并发处理,提升系统总体性能。流量削峰使用消息队列隔离网关和后端服务,以达到流量控制和保护后端服务的目的,防止短时间内后端服务涌入大量流量。服务解耦使用消息队列实现系统的解耦。基本概念

2022-07-19 14:56:17 1179

原创 skynet中网络架构

先插一句题外话,skynet中核心架构使用c语言,除此之外还大量使用了lua语言。这里不介绍lua。skynet在c中嵌入一层lua,主要是为了利用lua的协程,同步的方式实现异步的性能。关于协程,之前有过介绍。skynet中,io操作是由c完成的,lua是做业务层面的组装工作。之前有过介绍,skynet中,有网络消息,这里介绍网络框架和网络消息的处理。网络模型skynet 采用 reactor 网络编程模型。之前介绍过reactor ,就是单条连接通过 io 函数去检测网络事件再操作 io,转化为

2022-07-18 08:13:40 578

原创 skynet中actor模型

skynet是一个轻量级游戏服务器框架,但是不仅仅用于游戏,其他领域也可以使用这个框架。它的轻量级体现在:仅实现 actor 模型,以及相关的脚手架。sknynet目录下lualib和lualib-src都是脚手架。实现了服务器框架的基础组件。实现了 reactor 并发网络库,并提供了大量连接的接入方案;基于自身网络库,实现了常用的数据库驱动(异步连接方案),并融合了 lua 数据结构。编译安装先安装相应依赖。apt-get install git build-essential readl

2022-07-07 15:35:10 867 1

原创 mongodb集群

复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性, 并保证数据的安全性。主从复制集群主从复制只有 1 个主节点,至少有 1 个从节点,可以有多个从节点。它们的身份是在启 MongoDB数据库服务时就需要指定的。所有的从节点都会自动地去主节点获取最新数据,做到主从节点数据保持一致。注意主节点是不会去从节点上读取数据的,只会输出数据到从节点。理论上 1 个集群中可以有无数个从节点,但是这么多的从节点对主节点进行访问,主节点会受不了。《MongoDB 权威指南》中有说不超过 12 个

2022-06-23 17:31:45 7751

原创 mongodb基本操作

mongodb是一种非关系型数据库。所谓 NoSQL ,并不是指没有 SQL ,而是指“Not Only SQL ”,即非传统关系型数据库。这类数库的主要特点包括非关系型、水平可扩展、分布式与开源。另外它还具有模式自由、最终一致性。mongodb特点1、数据文件存储格式为 BSON (JSON 的扩展)。{“name”:“joe”}这是 BSON 的例子,其中"name"是键,"joe"是值。键值对组成了 BSON 格式。2、面向集合存储,易于存储对象类型和 JSON 形式的数据。所谓集合(colle

2022-06-19 09:06:14 4609

原创 nginx的filter模块

过滤(filter)模块是过滤响应头和内容的模块,可以对回复的头和内容进行处理。它的处理时间是在获取回复服务端内容之后,向用户发送响应之前。它的处理过程分为两个阶段,过滤 http回复的头部和主体,在这两个阶段可以分别对头部和主体进行修改,可以放在server或location模块。nginx代码中的函数ngx_http_top_header_filter(r);ngx_http_top_body_filter(r, in);就是分别对头部和主体进行过滤的函数。所有模块的响应内容要返回给客户端,都必

2022-06-14 15:16:10 702

原创 nginx的handler模块

先介绍一下nginx模块的概念。模块nginx 将各功能模块组织成一条链,当有请求到达的时候,请求依次经过这条链上的部分或者全部模块进行处理。每个模块实现特定的功能,例如,实现对请求解压缩的模块,实现SSI 的模块,实现与上游服务器进行通讯的模块,实现与 FastCGI 服务进行通讯的模块。有两个模块比较特殊,他们居于 nginx core 和各功能模块的中间。这两个模块就是 http 模块和 mail 模块。这 2 个模块在 nginx core 之上实现了另外一层抽象,处理与 HTTP 协议和 em

2022-06-11 16:45:45 611

原创 nginx部分数据结构

阅读nginx源码,先从基础组件着手,这里从最基本的,数据结构入手。ngx_int_t使用的是intptr_t,在32位系统中是4B,在64位系统中是8B,做到了支持跨平台。ngx_str_t这是nginx中字符串的数据结构。typedef struct { size_t len; u_char *data;} ngx_str_t;使用char *,主要有两个缺点,一是不带len字段,容易溢出;二是内存分配的问题,操作之前需要先malloc。改进的方法,是加

2022-06-07 06:38:44 330

原创 nginx配置

nginx是一款代理服务器,主要用于反向代理,也可以用于提供静态资源。反向代理反向代理代理的是服务器,将客户端的请求分发到不同的服务器中。主要有两个应用,一是代理服务,二是在服务器组的IP地址不够时使用。当子网的机器不需对外访问时,只用一台能够对外访问的代理服务器拥有公网IP,这台代理服务器就能将所有数据进行转发。代理服务器和其他服务器的拓扑图如下这里可以看出,代理服务器也是和其他节点一样,是在网关下的一台机器。网关先通过NAT把数据发送到这台代理服务器,代理服务器再进行转发。这里区分一下网关和网

2022-06-01 15:42:31 382

原创 redis持久化与集群

redis持久化redis的数据全部在内存中,如果突然宕机,数据就会全部丢失,因此需要持久化来保证redis 的数据不会因为故障而丢失,redis 重启的时候可以重新加载持久化文件来恢复数据,基本上,就是数据写入磁盘的形式。为了有个整体的认识,先贴出配置文件redis.conf中有关持久化的部分。###### aof ######appendonly noappendfilename "appendonly.aof"# appendfsync alwaysappendfsync everyse

2022-05-30 11:07:15 797

空空如也

空空如也

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

TA关注的人

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