自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 geth搭建私链

geth

2023-03-03 16:19:06 388

原创 ubuntu 20使用kubeadm安装k8s 1.26

ubuntu kubeadm 1.26

2023-02-14 17:56:35 1274

原创 K8S:Pod

POD

2022-07-04 17:27:13 305

原创 K8S:Volume

Volume

2022-07-04 16:48:25 698

原创 K8S:使用kubeadm一键部署

kubeadm

2022-06-30 20:18:53 405

原创 K8S:本质

本质

2022-06-30 17:40:27 229

原创 K8S:容器实践

容器实践

2022-06-29 19:36:03 194

原创 K8S:容器的文件系统

容器文件系统

2022-06-29 16:09:00 708

原创 K8S:容器隔离

容器隔离

2022-06-28 15:14:17 652

原创 K8S:容器边界

容器边界

2022-06-28 14:40:04 275

原创 完全二叉树节点个数

func countNodes(root *TreeNode) int { if root == nil { return 0 } // var l,r int // ln := root.Left // rn := root.Right // for ln != nil{ // ln = ln.Left // l ++ // } // for rn != nil { // r

2021-12-29 10:02:16 177

原创 二叉树的前中后序遍历(统一迭代和递归)

迭代前序遍历func preorderTraversal(root *TreeNode) []int { var ret []int if root == nil { return ret } dequeue := []*TreeNode{root} for len(dequeue) != 0 { n := len(dequeue) node := dequeue[n-1] if node != nil { dequeue = dequeue[:n-1] if

2021-12-27 19:33:54 260

原创 硬件同步原语

硬件同步原语CAS先比较,再交换。比较一下变量p当前的值是不是等于old,如果等于,就把变量p赋值为new,并返回true,否则就不改变变量p,并返回false。<< atomic >>function cas(p : pointer to int, old : int, new : int) returns bool { if *p ≠ old { return false } *p ← new return true}

2021-12-27 10:38:17 273

原创 Kafka如何实现高性能IO

使用批量消息提升服务端处理能力生产者这端,kafka不会将生产的消息立马发出去,而是会先放在内存中缓存起来,选择合适的时机(或许到达某个时间,或许攒够一定数量)把缓存中的所有消息组成一批,一次性发给Broker。在Kafka的服务端,也就是Broker这一端,不会把一批消息还原成多条消息,再一条条处理。而是直接把一批消息当做一个批消息,发到消费端。到了消费端,消费者把批消息解开,再一条条交给业务代码处理。构建批消息和解开批消息分别在发送端和消费端的客户端完成,不仅减轻了 Broker 的压力,最重

2021-11-09 20:14:43 207

原创 消息队列:丢失、重复和积压

消息丢失检测消息丢失的方法可以在生产端增加一个连续递增的序号,在消费端检查序号的连续性。大多数消息队列的客户端都支持拦截器,可以在生产者发消息前的拦截器中将序号注入到消息,在消费者收到消息的拦截器中检测序号。由于RocketMQ和Kafka在Topic不保证严格有序,仅在队列或分区中有序,所以序号中要带有分区信息,每个分区单独检测消息序号连续性。如果有多个生产者,则消息序号中还需要带上生产者的的标识。可能丢消息的地方生产阶段,发消息时正确处理broker返回值或者捕获异常,就可以保证消

2021-10-14 16:58:40 852

原创 消息队列:事务消息

在多个系统间实现事务。消息队列中的“事务”,主要解决的是消息生产者和消息消费者的数据一致性问题。比如下单后清空购物车这个操作:要么下单成功,清理购物车成功;要么下单失败,不清理购物车。问题的关键点集中在订单系统,创建订单和发送消息这两个步骤要么都操作成功,要么都操作失败,不允许一个成功而另一个失败的情况出现。消息队列实现分布式事务RocketMQ和Kafka都支持事务消息。首先订单系统开启事务,然后发送半消息,在提交之前,半消息对于消费者是不可见的。半消息发送成功后,执行本地事务。本.

2021-10-09 16:48:33 1117

原创 消息队列:业务模型

队列模型先进先出。如果需要将消息发给多个消费者,要求每个消费者都能收到全量消息。则需要未每个消费者单独创建队列,这种做法很蠢,且违背了消息队列解耦的原则。发布订阅模型发布者将消息发送到主题,订阅者在接收消息前需要订阅主题。订阅在这里既是一个动作,同时还可以认为是主题在消费时的一个逻辑副本,每份订阅中,订阅者都可以接收到主题的所有消息。Rabbit的消息模型Exchange模块位于生产者和队列之间,生产者将消息发给Exchange,由Exchange上配置的策略来决定将消息投递到哪些队

2021-10-09 16:27:09 114

原创 消息队列:RabbitMQ、RocketMQ和Kafka

三个作用:解耦、异步化、削峰填谷异步化的好处:更快返回结果、减少等待,自然实现了步骤间的并发,提升系统总体性能。解耦说明:生产者不用再一个个通知消费者,而是将消息写入一个主题就行了。以后再增加消费者,生产者也不需要关心。消息队列可以配合令牌桶算法使用,达到控制流量的目的。选择消息队列产品的基本标准必须开源、必须是比较流行且有一定社区活跃度。必须具备以下几个特性:消息的可靠性:确保不丢消息。Cluster:支持集群,确保不会因为某个节点宕机而导致服务不可用性能:具备足够好的性能,能满足.

2021-10-08 15:18:10 124

原创 高并发系统设计:服务端监控

监控指标谷歌针对分布式系统监控的经验总结,四个黄金信号:延迟、通信量、错误和饱和度延迟指的是请求的响应时间,包括接口、访问数据库和缓存。通信量可以理解为吞吐量,也就是单位时间内请求量的大小。比如访问第三方服务的请求量、访问消息队列的请求量。错误表示当前系统发生的错误数量,包括http状态码不正确,或者业务错误。饱和度指的是服务或者资源达到上限的程度,也叫资源的利用率,比如CPU的使用率、内存使用率、磁盘使用率、缓存数据库的连接数等等。其他一些组件特有的指标,比如数据库主从延迟、消息队列的数据积

2021-09-09 10:00:38 102

原创 高并发系统设计:流量控制

定义通过限制到达系统的并发请求数量,保证系统能够正常响应部分用户请求,而对于超过限制的流量,则只能通过拒绝服务的方式保证整体系统的可用性。限流策略一般部署在服务的入口层,比如 API 网关中,这样可以对系统整体流量做塑形。而在微服务架构中,可以在 RPC 客户端中引入限流的策略,来保证单个服务不会被过大的流量压垮。可以在多个维度上对到达系统的流量做控制,比如:可以对系统每分钟处理多少请求做出限制;可以针对单个接口设置每分钟请求流量的限制;可以限制单个 IP、用户 ID 或者设备 ID 在一段

2021-09-03 10:48:27 615

原创 高并发系统设计:降级熔断

短暂的服务不可用,一般有以下两个原因:依赖的资源或者服务不可用,最终导致整体服务宕机。乐观预估了可能到来的流量,当有超过系统承载能力的流量到来,系统不堪重负,从而出现拒绝服务的情况。雪崩是如何发生的局部故障最终导致全局故障,系统在运行时需要消耗一些资源,例如CPU、内存等,也包括执行业务逻辑时需要的线程资源。当这些线程资源被耗尽,服务无法处理新的请求,服务提供方就会产生宕机。比如ABCD四个服务,ABD是核心服务,C为非核心服务。在流量增加时,可能会考虑把ABD扩容,忽略C。那么C就有可.

2021-09-01 19:43:57 642

原创 高并发系统设计:如何降低消息延迟

如何监控延迟第一种方式,使用消息队列提供的工具。比如kafka-consumer-groups.sh和JMX第二种方式,通过生成监控消息的方式,定义一种特殊的消息,启动监控程序将这个消息定时循环写入到消息队列中,消息内容为生成的时间戳。业务处理程序在消费到这个消息时可以直接丢弃,而监控程序在消费到这个消息时可以计算时间差,如果时间差超过阈值,可以报警。如何减少延迟要减少消息处理的延迟,我们需要在消费端和消息队列两个层面完成。消费端消费端的目标是提升消息处理能力,能做的是:1、优化消费逻

2021-08-30 20:54:32 711

原创 高并发系统设计:如何保证消息仅仅被消费一次

消息丢失丢失场景主要包含三个:从生产者写入消息队列的过程;消息在消息队列中的存储场景;消息被消费者消费的过程。在消息生产的过程中丢失消息:可能是生产者推送消息时发生了网络抖动,这种情况重试2-3次即可;也可能是消息到达了消息队列,暂存在缓冲区中,然后机器宕机,但是消息队列还没来得及刷盘(一般刷盘策略是达到一定时间或积累了一定消息数量)。更改刷盘策略可能会造成较大性能影响,而且宕机概率不高,有点得不偿失。可以考虑以集群方式部署消息队列,通过多个副本备份数据。以kafka为例:在消费的过程中存在

2021-08-27 10:33:25 154

原创 高并发系统设计:消息队列应用

秒杀场景消息队列可以看作暂时存储数据的一个容器,一个平衡低速系统和高速系统处理任务时间差的工具。秒杀场景下短时间之内数据库的写流量会很高,如果去改造数据库,比如分库分表,比如做水平扩容等,都涉及到数据迁移,成本太高。而秒杀场景也就持续几十秒,得不偿失。消息队列在秒杀场景最主要的作用就是:削峰填谷。可以将请求暂存在消息队列,先返回给用户『结果计算中』,然后后台起几个消费程序去消费消息队列中的消息,再执行校验库存、下单等逻辑。当库存被消耗完之后,消息队列中堆积的请求就可以被丢弃了。虽然会

2021-08-24 10:24:25 186

原创 高并发系统设计:缓存穿透

缓存穿透是指从缓存中没有查到数据,而不得不从后端系统(比如数据库)中查询的情况。少量的缓存穿透不可避免,对系统也是没有损害的,主要有几点原因:缓存系统在容量上是有限的,不可能存储系统所有的数据;80%是非热点数据,不会被经常访问,可以放弃缓存。大量的穿透请求超过了后端系统的承受范围造成了后端系统的崩溃,这种情况就是我们应该避免的了。解决方案回种空值例如:读取一个用户表中未注册的用户,采用 Cache Aside 策略,会先读缓存再穿透读数据库。由于用户并不存在,所以缓存和数据库中都没有查询.

2021-08-12 10:55:52 232

原创 高并发系统设计:分布式缓存的高可用方案

分类客户端方案就是在客户端配置多个缓存的节点,通过缓存写入和读取算法策略来实现分布式,从而提高缓存的可用性。中间代理层方案是在应用代码和缓存节点之间增加代理层,客户端所有的写入和读取的请求都通过代理层,而代理层中会内置高可用策略,帮助提升缓存系统的高可用。服务端方案就是 Redis 2.4 版本后提出的 Redis Sentinel 方案。客户端方案写入数据时,需要把被写入缓存的数据分散到多个节点中,即进行数据分片。读数据时,可以利用多组的缓存来做容错,提升缓存系统的可用性。关于读数据,这

2021-08-04 10:08:16 303

原创 高并发系统设计:缓存的读写策略

缓存分类静态缓存、分布式缓存、热点本地缓存。静态缓存通过生成 Velocity 模板或者静态 HTML 文件来实现。部署在Nginx,可以减少对于应用服务器的压力。分布式缓存典型的就是我们平常用来存储动态数据的redis。热点本地缓存指的是一些极端热点的数据,比如某凡的瓜,主要部署在代码层面,阻挡热点查询对于分布式缓存节点和数据库节点的压力。由于本地缓存是部署在应用服务器中,而应用服务器通常会部署多台,当数据更新时,不能确定哪台服务器本地中了缓存,更新或者删除所有服务器的缓存不是一个好的选择,所

2021-07-22 10:30:17 326 1

原创 CDN:静态资源加速

静态资源对于移动 APP 来说,这些静态资源主要是图片、视频和流媒体信息;对于 Web 网站来说,则包括了 JavaScript 文件、CSS 文件、静态 HTML 文件等等。读请求量极大并且对访问速度的要求很高还占据了很高的带宽,这时会出现访问速度慢带宽被占满影响动态请求的问题。如果使用服务端分布式缓存,会存在跨地域请求的情况,影响用户体验。静态资源访问的关键点是就近访问。技术要点业务服务器的上层增加一层特殊的缓存,用来承担绝大部分对于静态资源的访问,这一层特殊缓存的节点需要遍布在全国

2021-07-16 10:12:59 1229

原创 高并发:池化技术

# 连接流程- 频繁创建数据库链接响应时间慢:首先要TCP三次握手,然后Mysql服务器要校验账户密码。- 连接池有两个重要配置`最小连接数`和`最大连接数`- 当前连接数小于最小连接数,则创建新的连接处理数据库请求。- 如果连接池中有空闲连接,则复用空闲连接;- 如果连接池中没有空闲连接,并且当前连接数小于最大连接数,则创建新的连接处理请求。- 如果当前连接数已经大于等于最大连接数,则按照配置中设定时间,等待旧连接可用。- 等待时间超过超时时间,则抛出错误。# 连接维护

2021-07-08 14:51:23 104

原创 如何使用ELK管理日志

简介“ELK”是三个开源项目的首字母缩写,这三个项目分别是:Elasticsearch、Logstash 和 Kibana。Elasticsearch 是一个搜索和分析引擎。Logstash 是服务器端数据处理管道,能够同时从多个来源采集数据,转换数据,然后将数据发送到诸如 Elasticsearch 等“存储库”中。Kibana 则可以让用户在 Elasticsearch 中使用图形和图表对数据进行可视化(摘自elastic官网)。开始搭建首先,让我们从elastic官网下载三个项目,请

2021-06-15 19:30:28 589 2

原创 使用Cerebro管理ES集群

首先从github上下载 :https://github.com/lmenezes/cerebro/releases我下载的是cerebro-0.9.4版本,执行启动命令,可以看到服务启动了。litianyu@395093 Downloads % cd cerebro-0.9.4litianyu@395093 cerebro-0.9.4 % ./bin/cerebro[info] play.api.Play - Application started (Prod) (no global stat.

2021-06-04 10:45:07 674

原创 Logstash:grok插件

语法:http://doc.yonyoucloud.com/doc/logstash-best-practice-cn/filter/grok.html文本: NOTICE: 2021-04-28 12:44:44 /root/gopath/pkg/mod/icode.baidu.com/baidu/gdp/gdp@v1.1.1-0.20190530102336-689961a086a1/weblogware.go:43 logid[4290488817] err[0] api[game_page..

2021-05-28 16:28:12 178

原创 Beats:数据收集

Metricbeat用来收集操作系统,软件的指标数据。指标数据存储在Es中,可以进行实时分析。Module:搜集的指标对象,例如不同的操作系统、不同的数据库、不同的应用系统。Metricbeat提供了大量开箱即用的Module。可以使用./metricbeat modules list查看。可以使用Metricbeat module enable xxx开启。对应module的配置文件在modules.d中。如modules.d/mysql.yml。使用./metricbeat s

2021-05-21 10:51:06 254

原创 Logstash:架构介绍

logstash的pipeline包含三个阶段:input -> filter -> output。logstash event是数据在内部流转时的具体表现形式。数据在input阶段被转换为Event,在output被转换成目标格式数据;Codec(Code/Decode):将原始数据Decode成Event,将Event encode成目标数据...

2021-05-13 10:35:48 232

原创 Elasticsearch:分片和集群设计

分片分片数量7.0开始,新建索引时,默认只有一个主分片。优点在于:单个分片,查询算分和聚合不准的问题都可以得到避免;缺点在于:即便增加新的节点,也无法实现水平扩展。如果有两个主分片,当集群增加节点后,es会自动进行分片移动(Shard Rebalancing),将本分布在一个节点的两个分片平衡为两个节点,每个节点一个分片。当分片数>节点数时:一旦集群中有新的数据节点加入,分片就可以自动分配;分片在重新分配时,系统也可以正常工作。多分片的好处:一个索引如果分布在多个节点,查询可以并行,写入可

2021-04-29 10:25:54 530

原创 Elasticsearch:分布式搜索

Query Then FetchQuery阶段:请求发送到Coordinating节点,该节点会从6个分片中取三个,可能是(P0 R1 R2这样子),被选中的分片执行查询,进行排序。然后每个分片都会返回From + Size个排序后的文档ID给Coordinating节点Fetch阶段:Coordinating节点将Query阶段从每个分片获取的排序后的文档ID列表,重新进行排序。选取From到From + Size个文档的ID,然后以Multi Get的方式到相应分片获取详细文档数据。性能问题

2021-04-15 10:24:47 88

原创 Elasticsearch:分布式特性

分布式架构存储的水平扩容,支持PB级数据。提高系统的可用性,部分节点停止服务,整个集群服务不受影响。不同的集群通过不同的名字来区分(cluster.name)。节点节点是一个ES实例,本质就是一个java进程。每一个节点都有一个名字(node.name),启动之后会分配一个UID,保存在data目录下。处理请求的节点,叫Coordinating Node,负责将请求分配给负责的节点;所有节点默认都是Coordinating Node可以保存数据的节点,叫Data Node;所有节点默认

2021-04-09 11:08:14 89

原创 HTTPS原理

既然是加密,那肯定是不希望别人知道我的消息,所以只有我才能解密,所以可得出公钥负责加密,私钥负责解密;同理,既然是签名,那肯定是不希望有人冒充我发消息,只有我才能发布这个签名,所以可得出私钥负责签名,公钥负责验证加密算法:1、对称加密有流式、分组两种,加密和解密都是使用的同一个密钥。例如:DES、AES-GCM、ChaCha20-Poly1305等2、非对称加密加密使用的密钥和解密使用的密钥是不相同的,分别称为:公钥、私钥,公钥和算法都是公开的,私钥是保密的。非对称加密算法性能较低,但是.

2021-04-06 17:39:52 68

原创 Elasticsearch:搜索

基于Term的查询Term是表达语义的最小单位,搜索和自然语言处理等都需要处理Term。在es中,Term查询包括范围查询,前缀查询,和通配符查询。Term查询的特点是对输入不做分词处理,而是将输入作为一个整体,在倒排索引中精确匹配。例子使用term查询iPhone查询不到结果,而iphone可以查询到。原因是索引时会对数据进行分词,将iPhone变为iphone。而term查询时没有分词。查询XHDK-B-2查询不到结果,因为索引的数据已经被分词为"xhdk"、“b”、“2”。需要使

2021-04-01 17:04:41 95

原创 Elasticsearch:Mapping

定义Mapping类似数据库中的schema定义,主要作用是定义索引中的字段,包括字段名称、字段类型和字段倒排索引的相关设置(分词器和字段是否被索引)Mapping会把JSON文档映射成Lucene所需要的扁平格式。字段类型:简单类型:Text/Keyword、Date、Integer/Floating、Boolean、IPv4 & IPv6复杂类型:对象类型/嵌套类型特殊类型:geo_point & geo_shape/percolatorDynamic Mappi

2021-03-24 20:29:42 100

空空如也

空空如也

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

TA关注的人

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