redis(六:redis哨兵集群的组成和运行机制) 哨兵之间互相发现,主要是通过redis的pub/sub实现的,也就是发布订阅模式。哨兵只要和主库建立了连接就可以在主库上发布消息了,比如发布自己的ip和端口。同时也可以从主库上订阅消息,获取其他...
redis(五:redis哨兵模式) 主从库集群模式下,如果从库挂了,主库还可以接受客户端的读写请求。但是如果主库挂了,读请求还可以继续,写请求就不被允许了。如果主库挂了,那就会从从库中选择一个出来作为主库。这里...
redis(四:redis主从库如何实现数据一致) redis的高可靠: 1 数据尽可能的少丢失 2 fuw当redis因为宕机而执行数据恢复时,这个过程中redis是无法对外界做请求操作的。redis应对这个问题是
redis(三:redis RDB&AOF) redis一般都是用来做数据缓存。但是当redis宕机,内存里的数据就会丢失。所以redis里的数据也要做持久化操作。第一时间想到的是从数据库里获取。但是这个操作很影响
redis(二:redis为什么快) redis是单线程的。主要指的是redis的网络IO和键值对读写是由一个线程完成的。但是redis的其他功能持久化,异步删除都是由他们线程完成的。1.多线程导致资源过度消耗。多线程虽然能提高系统的吞吐率,但是带来的线程安全问题,线程上下文切换,线程阻塞问题,都会带来额外的开销。2 redis大部分的操作都是基于内存的。3 redis底层运用高效的数据结构,例如哈希表和跳表。4 redis采用多路复用机制,在网络IO操作中,能并发处理大量的客户端请求,实现高吞吐。基本的IO模型..
redis(一:redis底层数据结构) 一般说的redis的数据结构都是他说操作的数据结构,也就是数据的保存形式,比如string,list,hash,set,sorted set。这里说下他们的底层实现。底层数据结构一共六种,
kafka(十五:kafka的监控和优化) 高吞吐TPS: Broker 端进程或 Client 端应用程序每秒能处理的字节数或消息数。如下是kafka吞吐量优化Broker 端参数 num.replica.fetchers 表示的是 Follower 副本用多少个线程来拉取消息,默认使用 1 个线程。如果你的 Broker 端 CPU 资源很充足,不妨适当调大该参数值,加快 Follower 副本的同步速度。因为在实际生产环境中,配置了 acks=all 的 Producer 程序吞吐量被拖累的首要因素,就是副本同步性能。增加这个..
kafka(十四:高水位和Leader Epoch) 高水位HW高水位的作用定义消息可见性,即用来标识分区下的哪些消息是可以被消费者消费的。 帮助 Kafka 完成副本同步。如上图是某分区中消息的水位情况。在分区高水位以下的消息被认为是已提交消息,反之就是未提交消息。消费者只能消费已提交消息,即图中位移小于 8 的所有消息。位移值等于高水位的消息属于未提交消息。也就是说,高水位上的消息是不能被消费者消费的。图中还有一个日志末端位移的概念,即 Log End Offset,简写是 LEO。它表示副本写入下一条消息的位移值。数字 15 所在的方
kafka(十三:Kafka控制器) 控制器是 Kafka 的核心组件。它的主要作用是在 ZooKeeper 的帮助下管理和协调整个 Kafka 集群。集群中任意一台 Broker 都能充当控制器的角色,但是在运行过程中只能有一个 Broker 成为控制器。ZooKeeper 通过watch机制赋予客户端监控 znode 变更的能力,一旦 znode 节点被创建、删除,子节点数量发生变化,抑或是 znode 所存的数据本身变更,ZooKeeper 会通过节点变更监听器 (ChangeHandler) 的方式显式通知客户端。ZooKeeper
kafka(十二:消费者组重平衡流程) 重平衡触发:组成员数量发生变化。 订阅主题数量发生变化。 订阅主题的分区数发生变化。重平衡过程通知到其他消费者实例:消费者端的心跳线程。Kafka Java 消费者需要定期地发送心跳请求到 Broker 端的协调者,以表明它还存活着。在 Kafka 0.10.1.0 版本之前,发送心跳请求是在消费者主线程完成的,也就是 KafkaConsumer.poll 方法的那个线程。消息处理逻辑也是在这个线程中完成的,一旦消息处理消耗了过长的时间,心跳请求将无法及时发到协调者那里,导致协调者“错误地”认
kafka(十一:Kafka Broker如何处理请求) Kafka 使用的是Reactor 模式。Reactor 模式是事件驱动架构的一种实现方式,特别适合应用于处理多个客户端并发向服务器端发送请求的场景。从这张图中,多个客户端会发送请求给到 Reactor。Reactor 有个请求分发线程 Dispatcher,也就是图中的 Acceptor,它会将不同的请求下发到多个工作线程中处理。在这个架构中,Acceptor 线程只是用于请求分发,不涉及具体的逻辑处理,非常得轻量级,因此有很高的吞吐量表现。而这些工作线程可以根据实际业务处理需要任意增减,从而
kafka(十:Kafka副本机制) 副本机制,备份机制,通常是指分布式系统在多台网络互联的机器上保存有相同的数据拷贝。提供数据冗余。即使系统部分组件失效,系统依然能够继续运转,因而增加了整体可用性以及数据持久性。 提供高伸缩性。支持横向扩展,能够通过增加机器的方式来提升读性能,进而提高读操作吞吐量。 改善数据局部性。将数据放入与用户地理位置相近的地方,从而降低系统延时。Kafka 是有主题概念的,而每个主题又进一步划分成若干个分区。副本的概念实际上是在分区层级下定义的,每个分区配置有若干个副本。所谓副本(Replica),本质就
kafka(九:消费者组 消费进度监控) Kafka 消费者监控消费的滞后程度,这个滞后程度被称为:消费者 Lag 或 Consumer Lag。滞后程度就是指消费者当前落后于生产者的程度。Kafka 生产者向某主题成功生产了 100 万条消息,你的消费者当前消费了 80 万条消息,那么我们就说你的消费者滞后了 20 万条消息,即 Lag 等于 20 万。通常来说,Lag 的单位是消息数,一般是在主题这个级别上讨论 Lag 的,但实际上,Kafka 监控 Lag 的层级是在分区上的。如果要计算主题级别的,你需要手动汇总所有主题分区的 Lag
kafka(八:位移提交offset) 老版本的kafka Offset是Consumer 的消费位移,记录了 Consumer 要消费的下一条消息的位移。Consumer 需要向 Kafka 汇报自己的位移数据,这个过程被称为提交位移。Consumer 能够同时消费多个分区的数据,所以位移的提交实际上是在分区粒度上进行的,即Consumer 需要为分配给它的每个分区提交各自的位移数据。提交位移主要是为了表征 Consumer 的消费进度,这样当 Consumer 发生故障重启之后,就能够从 Kafka 中读取之前提交的位移值,然后从..
kafka(六:消费者组和重平衡) Consumer Group 是 Kafka 提供的可扩展且具有容错性的消费者机制。组内可以有多个消费者,它们共享一个公共的 ID,这个 ID 被称为 Group ID,它标识唯一的一个 Consumer Group。组内的所有消费者协调在一起来消费订阅主题的所有分区。当然,每个分区只能由同一个消费者组内的一个 Consumer 实例来消费。 Consumer Group 之间彼此独立,互不影响,它们能够订阅相同的一组主题而互不干涉。如果所有实例都属于同一个 Group,那么它实现的就是消...
kafka(五:消息交付可靠性保障) kafka实现消息精确可靠性的机制是幂等性和事务。幂等指的是某些操作或函数能够被执行多次,但每次得到的结果都是不变的。幂等性的其最大的优势在于可以安全地重试任何幂等性操作,反正不会破坏我们的系统状态。幂等性producer: Producer 默认不是幂等性的,但我们可以创建幂等性 Producer。指定消息生产者幂等性的方法设置enable.idempotence为true。enable.idempotence 被设置成 true 后,Producer 自动升级成幂等性 Produce...
kafka(四:kakfa拦截器) kafka拦截器:Kafka 拦截器可以应用于包括客户端监控、端到端系统性能检测、消息审计等多种功能在内的场景。Kafka 拦截器分为生产者拦截器和消费者拦截器。生产者拦截器在发送消息前以及消息提交成功后植入你的拦截器逻辑;而消费者拦截器支持在消费消息前以及提交位移后编写特定逻辑。这两种拦截器都支持链的方式,将一组拦截器串连成一个大的拦截器,Kafka 会按照添加顺序依次执行拦截器逻辑。生产者实现拦截器只需要实现ProducerInterceptor 接口。onSend:该方法会在消息发..