- 博客(1200)
- 收藏
- 关注

原创 Redis实操(20429字总结)
之前都是通过看视屏,博客,公众号的形式来学习,还是很零散的,这次买了工作以来第一本技术书《Redis深度历险:核心原理与应用实践》,先粗略读了一遍,现在用笔记的形式把重点再记录下。 2020-7.26注:List的结构中:当数据量大的时候 Redis将链表和ziplist结合起来组成了quicklist1.2.2 5种基础数据结构stringRedis的字符串是动态字符串,是可以修改的字符串,采用预分配冗余空间的方式来减少内存的频繁分配。当字符串长度小于1MB是,扩容
2020-07-26 16:23:05
1265
2

原创 从JMM数据原子操作来分析volatile
并发编程的三个性质:原子性,可见性,有序性JMM数据原子操作:volatile 进行i++操作会出问题的分析两线程同时对i做i++,线程1往内存写经过总线时被线程2感知到了,线程2做i++的操作已经做完了,然而因为感知到i变了,做i无效化重新读,所以线程2做的那次i++的操作执行了但是没起作用问题在讨论原子性操作时,我们经常会听到一个说法:任意单个volatile变量的读写具有原子性,但是volatile++这种操作除外。所以问题就是:为什么volatile++不是原子性
2020-06-24 11:01:42
410
1
原创 What does discovery.seed_hosts and cluster.initial_master_nodes mean in ES
【代码】What does discovery.seed_hosts and cluster.initial_master_nodes mean in ES。
2024-10-15 15:44:29
171
原创 基于RocksDB实现精准的TTL过期淘汰机制
支持海量存储:单个集群存储容量可达数百 TB,线上单集群 TPS 峰值可达百万级。支持水平扩展:存储容量、读写性能都可通过增加机器的方式水平扩展。通过数据分片 (slot) 的方式,将不同的分片散落在不同的节点,保证存储容量和读写性能的可扩展。服务高可用:每个数据分片包含两副本,主备副本可在秒级内切换,保证单个数据分片的读写服务的高可用。
2024-07-10 11:01:39
1056
原创 hostname: Name or service not known
# 再执行的hostname的时候就不会报错了.## 设置hostname。
2024-06-21 16:05:22
566
原创 【已解决】ERROR: bootstrap checks failed memory locking requested for elasticsearch process but memory is
因此登录用户的限制,通过/etc/security/limits.conf与/etc/security/limits.d下的文件设置即可。对于systemd service的资源设置,则需修改全局配置,全局配置文件放在/etc/systemd/system.conf和/etc/systemd/user.conf,同时也会加载两个对应目录中的所有.conf文件/etc/systemd/system.conf.d/system.conf是系统实例使用的,user.conf是用户实例使用的。
2024-06-21 16:04:51
818
原创 这可能是最清晰易懂的 G1 GC 资料
于JDK 6u14版本发布,JDK 7u4版本发行时被正式推出,在JDK9时已经成了默认的垃圾回收器,算是CMS回收器的替代 方案(CMS在JDK9以后已经废弃)G1是一款分代的 (generational),增量的 (incremental),并行的 (parallel),移动式(evacuating)的,软实时的垃圾回收器。其最大特点是暂停时间可配置,我们可以配置一个最大暂停时间,G1就会尽可能的在回收的同时保证程序的暂停时间在允许范围内,而且在大内存环境下表现更好。
2024-06-11 10:41:22
434
原创 JVM 垃圾收集器之G1 收集的具体步骤
G1收集器突出表现出来的一点是通过一个停顿预测模型根据用户配置的停顿时间来选择CSet的大小,从而达到用户期待的应用程序暂停时间。链接:https://juejin.cn/post/7007343142328352804。这一点有点类似于ParallelScavenge收集器。商业转载请联系作者获得授权,非商业转载请注明出处。提到标记就不得不提 G1 的三色标记算法了。下图中,各收集器之间的连线是嘛意思?只是收集的步骤和阶段的名字不同罢了。只是G1 的分代算法不适合新生代。巨大的,庞大的, 来自。
2024-06-11 10:40:50
747
原创 分隔符问题
对路径进行编码:将路径中的特殊字符进行编码,以避免与文件系统冲突。您可以使用 URL 编码或 Base64 编码等方法来对路径进行编码和解码,确保在文件名中使用安全的字符。在代码中,您可以使用相应的编码和解码函数来处理路径。无论您选择哪种方法,都需要在代码中进行相应的更改,以确保路径的正确处理和备份文件名的生成。通过对路径进行编码和解码,可以确保在文件名中使用安全的字符,并在需要时进行恢复。使用其他字符作为替代分隔符:选择一个在路径中不常见的字符作为替代分隔符,例如。
2024-06-06 16:56:32
367
原创 Etcd Raft架构设计和源码剖析1:宏观架构
使用etcd raft应用的架构使用etcd raft应用应当提供哪些功能供raft使用应用是如何和etcd raft交互的etcd raft涉及到的存储概念一个写请求从客户端到在节点之间达成一致,应用到状态机的过程。
2024-06-05 21:02:00
1091
原创 Etcd Raft架构设计和源码剖析2:数据流
之前看到一幅描述etcd raft的流程图,感觉非常直观,但和自己看源码的又有些不同,所以自己模仿着画了一下,再介绍一下。raft:raft主体功能部分Node:raft提供的接口,raft跟上层的通信接口,会运行一个run函数,持续循环处理通道上的数据raftNode:上层应用逻辑其他:Client、Network、State客户端请求发送消息给其他节点接收其他节点消息及处理应用达成一致的日志。
2024-06-05 21:01:24
837
原创 Raft中文翻译与笔记
本文在基础上修改、标注重点。如果遇到中文别扭的地方、不懂的地方,建议配合英文原文一起阅读。Raft与PBFT、Paxos等其他一致性算法相比,确实简单不少,易于理解和实现,还有很强的可用性。Raft的3大核心是强领导者、领导者选举和成员关系变更(增加和减少Raft节点),论文就是围绕着3个核心进行介绍,以及论证安全性(正确性、一致性)和可用性。但成员关系变更的细节,依然还有一些疑问,做了一些注释在文中,需要去看源码和讨论弄清楚。
2024-06-05 21:00:51
829
原创 redis zrange 与 zrangebyscore的区别
3. zrange查询的结果个数<= 查询区间长度,也就是说 ,区间多长,就查询出多少个结果出来(数据不少于区间长度,足够多的情况下),而zrangebyscore的查询结果个数视实际数据而定,也就是凡是符合区间的数据,全部查询出来.2. zrange查询的结果个数,就是索引的区间长度(如【0-7】,区间长度是8,所以查出来8个数据,当然,前提是数据不少于8个),而zrangebyscore由于是用socre来查询,因此,在准备的数据中,有多少个符合【0,7】区间的数据,就会返回多少数据。
2024-05-27 16:06:31
546
原创 Kubernetes Controller的并发reconciling
当Controller watch的对象十分频繁的发生变更,reconcile队列中就会堆积大量的reocncile请求。和默认的单个reconcile循环相比,多个reconcile循环可以更快速的处理reconcile队列中的请求。和默认的单个reconcile循环相比,多个reconcile循环可以更快速的处理reconcile队列中的请求。这个“魔法”是由Kubernetes client-go中实现的工作队列保证的,controller runtime的reconcile队列使用的正是这个队列。
2024-05-20 20:33:04
514
原创 Elasticsearch优化手段
其余情况建议的方式是使用 dfs_query_then_fetch 搜索类型,这种方式将会查询所有关联分片的索引统计信息然后合并,这样评分时使用的就是全局的索引统计信息而不是某个分片的,显然这样增加了额外的成本,然而大多数情况下,这些额外成本是很低廉的,但是如果查询中包含有大量的 fields/terms 或 fuzzy 模糊查询,增加的额外成本可能并不低。如何设置备份的数量?使用场景常常是例如基于时间的索引,历史日期的数据不再改变,因此是只读的,而对于存在写入操作的索引不得进行此项操作。
2024-05-14 11:47:02
590
原创 Elasticsearch:Dynamic mapping
每次文档包含新字段时,这些字段最终都会出现在索引的映射中。在上面我们在 mapping 中加入了 dynamic,并且设置为 strict,它表明如果现有的 mapping 里没有定义这个字段,那么就不 index 这个文档。在 dynamic 为 false 时,这个文档将被建立索引,但是新的字段将不被建立索引,mapping 将不被更新(包含新的的字段的 mapping)在通常的情况下,上面的一个命令可能会自动帮我们在 blogs 索引里增加一个新的叫做 some_new_field 的字段。
2024-05-13 14:48:18
841
原创 Elasticsearch 为什么会产生文档版本冲突?如何避免
索引操作(Index,动词)是有条件的,并且只有在对文档的最后修改分配了由 if_seq_no 和 if_primary_term 参数指定的序列号和 primary term specified(翻译起来拗口,索性用英文)才执行。需要使用:if_seq_no 和 if_primary_term,它俩的用法,后文会有专门解读。但是,在999累计投票数后,碰巧小明同学和小红同学两位同时(并发)发起投票请求,这时候,如果没有版本控制,将导致最终结果不是预期的1001,而是1000。
2024-05-07 17:43:34
829
原创 ElasticSearch-冲突处理
很多时候这是没有问题的,也许我们的主数据存储是一个关系型数据库,我们只是将其复制到ElasticSearch中,使其可以被搜索,也许两个人同时更改同一个文档的几率很小,或者对于我们业务来说,偶尔丢失更改也不是很大的问题,但有时丢失了一个变更是非常严重的。应用程序接下来将决定该如何解决冲突。一个常见的设置是使用其他数据库作为主要的数据存储,使用ElasticSearch做数据检索,意味着主数据库的所有更改都要更新到ElasticSearch,如果多个进程同时更改同一数据,你可能遇到类似于之前描述的并发问题。
2024-05-07 17:11:44
689
原创 git报错-执行git pull 报错信息:error: 工作区中下列未跟踪的文件将会因为合并操作而被覆盖
解决办法:git 远端代码强制覆盖本地代码。
2024-05-07 16:31:31
1302
原创 Elasticsearch 7.X data stream 深入详解
和别名不同的是:别名关联多个索引,写入的时候需要指定 “is_write_index",而 data stream 相对黑盒,这些细节用户无需关注。原有实现由于别名的缺陷实现不了时序数据的管理或实现起来会繁琐、麻烦,data stream 是更为纯粹的存储仅追加时序数据的方式。对于频繁更新或者删除文档的业务场景,用 data stream 不合适,而相反的,使用:模板+别名+ILM更为合适。我把 data stream 比如:存储时序数据的多个索引的抽象集合,简称为:数据流(data stream)。
2024-05-07 16:30:02
728
原创 Elasticsearch 基于Reindex跨集群数据迁移
Reindex可用于Elasticsearch跨集群数据迁移,并且不会复制原索引的mapping(映射)、shard(分片)、replicas(副本)等配置信息。"excludes": ["字段1","字段2"] #排除字段。"conflicts": "proceed",#有异常时,继续执行。"index": "test_index_db",#目标索引。"index": "test_index_db",#源索引。"size": 4000, #速度控制。2、在目标集群执行如下命令(kibana执行)
2024-05-07 15:22:22
642
原创 ES系列之原来查看文档数量有这么多姿势
cat count api的方式能够快速的返回某个索引下文档的数量,需要注意的是已经删除的文档即使还没有物理删除(merge)也不会统计。我们可以来做个实验,任意删除一个文档,然后再次查询下。这是因为cat indices是直接从lucene获取的这些信息,而我们之前的文章讲过nested类型的属性其实在lucene内部是独立的文档,只不过在ES这一层隐藏了这些细节。和cat count api不同的是,cat indices命令统计的文档数量是底层所有的文档数量,如果你不太明天,我举个例子。
2024-05-07 15:10:52
278
原创 关于Kubernetes-v1.23.6-资源调度-StatefulSet-OnDelete当删除的时候才更新
2、此时我们可以删除一个pod,如web-2,再进行观察,可以看到,只有被删除的web-2,才会重新生成,更新到指定的版本。1、更新nginx的版本为 1.7.9 ,然后可以通过如下看到,所有pod都没有进行更新。而还有一种更新的策略为, OnDelete,即只有在 pod 被删除时会进行更新操作。3、最后,没有问题的,再依次将所有的pod进行删除,完成所有的更新。前面提到的普通的滚动更新,都是修改完sts立即就会发生更新操作。
2024-03-28 16:44:49
523
原创 elasticsearch中设置查询的请求超时时间
注意:Elasticsearch 集群实际是需要给 coordinate node 返回 shards number * (from + size) 条数据,然后在单机上进行排序,最后给客户端返回这个 size 大小的数据的。注意:这个缓存的键值要求很严格,请求的 JSON 必须一字不易,缓存才能命中。因为我们的项目是用的php,为了防止调用搜索时,请求处理时间太长,导致php-fpm占满,所以需要对外部接口设置请求的超时时间,避免过多的超时请求,我们可以用过对es的参数限制,设置超时时间。
2024-02-26 17:30:50
1447
原创 Linux I/O 基本原理
(其实还有 boot block,可能会包含一些 bootstrap 代码,在机器启动的时候被读到,这里忽略)其中 inode blocks 放的都是每个文件的 inode,data blocks 里放的是每个文件的内容数据。既然 superblock 这么重要,那肯定不能只有一份,坏了就没了,它在系统中是有很多副本的,在 superblock 损坏的时候,可以使用。zfs 的写操作是事务的,意味着要么就没写,要么就写成功了,不会像其他文件系统那样,应用打开了文件,写入还没保存的时候断电,导致文件为空。
2024-02-26 17:29:59
534
原创 一文搞懂match、match_phrase与match_phrase_prefix的检索过程
用于执行全文查询的标准查询,包括模糊匹配和短语或接近查询。重要参数:控制Token之间的布尔关系:operator:or/and与match查询类似,但用于匹配确切的短语或单词接近匹配。重要参数:Token之间的位置距离:slop 参数与match_phrase查询类似,但是会对最后一个Token在倒排序索引列表中进行通配符搜索。重要参数:模糊匹配数控制:max_expansions 默认值50,最小值为1。
2024-02-22 20:49:18
4191
原创 Elasticsearch Update By Query详解
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。索引的 Mappings 发生变更:字段类型更改,分词器及字典更新。索引的 Setting 发生变更:索引的主分片数发生改变。只能创建新的索引,并设定正确的字段类型,在重新导入数据。改变 Mapping , 增加子字段,使用英文分词器。# 修改 Mapping,增加子字段,使用英文分词器。2.2 案例二:更改已有字段类型的 Mappings。# 创建新的索引并且设定新的Mapping。
2024-02-22 16:07:29
4485
原创 elasticsearch index sorting 索引预排序
(本地测试,对某索引进行reindex操作,重索引至具有索引排序的索引,es记录的峰值写入速度约为3200/s,重索引至无索引排序的索引,es记录的峰值写入速度约为6000/s)搜索性能尚未进行大规模压测。答案是肯定的,在检索阶段:查找top k文档时,默认需要遍历所有文档才可以找到所有的相关文档,但当配置了索引排序后,如果检索排序与索引排序一致,则每个分片上只需要检索前k个文档即可,这样便可以提前结束查询,减少计算和性能损耗。索引预排序只能在索引创建时配置,中途不可以更改或添加;
2024-02-22 15:54:21
775
原创 Linux / OS X tar incompatibility – tarballs created on OS X give errors when untarred in Linux
【代码】Linux / OS X tar incompatibility – tarballs created on OS X give errors when untarred in Linux。
2024-02-22 14:49:14
441
原创 关于idea全局搜索不全的坑
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。原文链接:https://blog.youkuaiyun.com/ZyhMemory/article/details/116265194。在Registry中找到ide.usages.page.size进行修改即可,我这里修改的是10000。idea全局搜索默认只显示100个,超出显示100+,不过谁能注意到这个…在Action中输入Registry。通过设置修改一下初始大小。
2024-02-22 14:45:04
863
原创 (四)elasticsearch 源码之索引流程分析
本文简单描述了es索引流程,包括了http请求是如何解析的,如何确定分片的。但是仍有许多不足,比如没有讨论远程节点是如何处理的,lucene执行引擎的细节,后面博客会继续探讨这些课题。
2024-02-06 17:50:09
1117
原创 (三)elasticsearch 源码之启动流程分析
node.start中启动各个组件。start方法会调用组件的doStart方法。es 使用 guice注入框架,guice是个非常轻量级的依赖注入框架,既然各个组件都已经注入好了,我们现在可以启动了。另一个比较重要的服务,discovery.start(),具体实现类是 Coordinator。具体的我们看两个比较重要的服务 transportService.start();简单了解下es(elasticsearch,下同),现在我们来看下启动代码。下面是启动流程图,我们按照流程图的顺序依次描述。
2024-02-06 16:26:07
1079
原创 对比 elasticsearch 和 mysql
redo log采用的是WAL(Write-ahead logging,预写式日志),所有修改先写入日志,再更新到Buffer Pool,保证了数据不会因MySQL宕机而丢失,从而满足了持久性要求。doc_values,将_source 转化为表结构放在磁盘上,方便聚合,排序,或者脚本操作,默认支持除了text类型的所有类型。fielddata,如果想对text类型的字段进行聚合,排序,或者执行脚本,就必须设置fielddata属性。比如histogram aggs,terms aggs。
2024-02-06 15:44:29
1288
原创 Elasticsearch 通信模块的分析
创建一个新的Netty Server 的好处是可以实现与HttpServerTransport的解耦,把RPC 接受的逻辑和HttpServerTransport分开, 同时也可以对RPC 信息的序列化可以进一步优化。Client 在发送请求给远方的Node 的时候会把在信息的header里面标注为request 这个状态,所以这个回调函数判断到底是远方Node 发来的请求还是返回执行的结果是就是根据这个 TransportStatus.isRequest(status) 状态。
2024-02-06 15:29:31
1547
原创 (五)elasticsearch 源码之查询流程分析
上文我们讨论了es(elasticsearch,下同)索引流程,本文讨论es查询流程,以下是基本流程图本文简单描述了es是如何进行文档查询的,es会先去各个分片上获取符合查询条件的文档id等信息,然后再fetch文档内容。本文没有涉及dfs,后面博客会继续探讨这些课题。
2024-02-05 16:44:22
1416
原创 Elasticsearch内核剖析
大家都知道Elasticsearch是一个开源的分布式搜索和分析引擎,也是一种NoSQL数据库。由于Elasticsearch填补了开源领域分布式搜索引擎的空白,而且难能可贵的是,Elasticsearch提供了非常友好的操作性,上手极其容易,这些特征促使其在过去5年在市场上快速崛起。目前在开源的搜索系统中基本处于垄断地位。虽然Elasticsearch在业界快速崛起,在很多大中小型公司都有广泛的应用,但是很多都只是简单使用,最深入的也仅仅是性能调优和点对点的问题调查,很少缺乏系统性的内核探究。
2024-01-31 15:45:23
737
原创 ElasticSearch 6.x 字段类型
在ElasticSearch中,没有专门的数组(Array)数据类型,但是,在默认情况下,任意一个字段都可以包含0或多个值,这意味着每个字段默认都是数组类型,只不过,数组类型的各个元素值的数据类型必须相同。比如,某个字段的取值最大值不会超过100,那么选择byte类型即可。对于float、half_float和scaled_float,-0.0和+0.0是不同的值,使用term查询查找-0.0不会匹配+0.0,同样range查询中上边界是-0.0不会匹配+0.0,下边界是+0.0不会匹配-0.0。
2024-01-31 15:37:58
211
原创 【转】Elasticsearch干货(三):对于数值类型索引优化
本文我们了解了Elasticsearch和Lucene不同版本中对数值类型range查询的优化,我们牢记以下两点来避免不必要的缓慢查询。对于数值类型的数据,我们是要确定该字段是需要range还是term。比如id,有些情况下我们只需要对它做term查询,这种情况下使用keyword来存储会更好。如果需要使用数值类型(非keyword),并且range的结果集很大的情况下,建议升级到Elasticsearch5.4+之后版本。Elasticsearch深入理解专栏。
2024-01-31 15:23:34
309
原创 Elasticsearch高性能优化实践
第一步,先向所有的分片发请求,各分片只返回文档的相似度得分和文档的 ID,然后协调节点按照各分片返回的分数进行重新排序和排名,再取出需要返回给客户端的 Size 个文档 ID。_source 元数据:就是说,我们在创建一个 Document 的时候,使用的那个放在 Request Body 中的 Json 串(所有的 Field),默认情况下,在 Get 的时候,会原封不动的给我们返回回来。当我们进行查询操作的时候,被删除的数据还会参与检索中,然后根据 .del 文件进行过滤。
2024-01-31 14:51:58
1074
原创 理解“query then fetch”和“dfs query then fetch”
为何文档“drunk”分数为1.0,而其余的分数是0.3?难道这些文档不应该是相同的分数么,因为他们都同等地匹配了“d”。答案是肯定的,但是这个分数本身也有比较合理的地方。
2024-01-31 14:45:56
949
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人