偏移量

Redis主从复制实现原理

跟風遠走 提交于 2020-02-24 14:41:51
一、Redis2.8之前的版本, 首先redis复制功能分为同步操作和命令传播两个操作   同步操作作于将从服务器的数据库状态更新至主服务器当前所处的数据库状态   命令传播操作则用于在主服务器的数据库状态被修改,导致主从服务器的状态不一致时,让主从服务器的数据重回一致状态。 旧版复制实现: 同步: 1,从服务器想主服务器发送SYNC命令 2,收到SYNC命令的主服务器执行BGSAVE命令,然后生成一个RDB文件,并使用一个缓存区记录从现在开始执行命令的所有写命令 3,当主服务器的BGSAVE命令执行完毕,将RDB文件在发送给从服务器,从服务器载入这个RDB文件,在将数据库状态更新至主服务器状态一致 4,主服务器将记录在缓冲区内里的所有写命令发送给从服务器,然从服务器执行这些写命令,将自己的状态更新跟主服务器当前的状态。 命令传播: 当同步操作执行完后,主从服务器状态达到一致,但每当主服务器的数据发生变化时,导致主从服务器的状态不一致。这时 为了主从服务器再次回到一致状态,主服务器需要将自己执行的命令,发送给从服务器执行,这样主从服务器回到一致状态。 旧版复制的缺陷: 断线后重复制:再主从服务器状态一致时,从服务器发生宕机,这时主服务器继续接收客户端发来的写命令,然主服务器这时状态已被修改。从服务器重新连接,从服务器向主服务器发送同步命令,然主服务器执行BGSAVE命令

深入程序编译链接和装载过程

僤鯓⒐⒋嵵緔 提交于 2020-02-20 02:29:27
文章目录 预编译 编译 汇编 链接 基础先知 指令和数据 分析二进制可重定位目标文件 main.o 的组成 强符号和弱符号 符号表 链接过程分析 运行 提问:一个源文件是如何变成可执行文件的? 在linux中,使用GCC来编译程序,我们逐步来分析: 预编译 gcc -E hello.c hello.i 编译 gcc -S hello.i -o hello.s 汇编 gcc -c hello.s -o hello.o 链接 gcc hello.o -o hello 运行 ./hello 预编译 预编译阶段主要处理以"#"开头的预编译指令。 删除宏定义并作文本替换 递归展开头文件“#include” 处理#if、#ifdef、#elif、#else、#endif等 删除注释“//”和 “/* */” 添加行号和文件标识,以便编译器产生编译调试时的行号信息,以及产生错误或警号时能够显示行号 保留所有的#pragma指令 编译 词法分析 语法分析 语义分析 代码优化 生成汇编指令 汇编 将汇编指令转换成机器指令 链接 基础先知 指令和数据 局部变量属于指令,静态变量和全局变量属于数据。 int gdata1 = 10; //数据 int gdata2 = 0; //数据 强符号 int gdata3;//数据 static int gdata4 = 11; //数据 static int

Kafka Consumer

Deadly 提交于 2020-02-17 09:22:48
基本用法 topic_name = 'my_topic_name' consumer = KafkaConsumer(topic_name, bootstrap_servers=['172.16.89.80:9092']) # consumer是一个消息队列,当后台有消息时,这个消息队列就会自动增加.所以遍历也总是会有数据,当消息队列中没有数据时,就会堵塞等待消息到来 for msg in consumer: recv = "%s:%d:%d: key=%s value=%s" % (msg.topic, msg.partition, msg.offset, msg.key, msg.value) print recv 指定分区、offset、消费组 #encoding:utf8 from kafka import KafkaConsumer, TopicPartition my_topic = "my_topic_name" # 指定需要消费的主题 consumer = KafkaConsumer( bootstrap_servers = "192.168.70.221:19092,192.168.70.222:19092,192.168.70.223:19092", # kafka集群地址 group_id = "my_group_a", # 消费组id enable_auto

redis对string进行的相关操作

强颜欢笑 提交于 2020-02-15 02:14:55
redis对string类型操作的相关命令以及如何在python使用这些命令 redis对string类型操作的命令: 命令 语法 概述 返回值 Redis SET 命令 set key value 设置指定 key 的值 SET 在设置操作成功完成时,才返回 OK Redis Get 命令 get key 获取指定 key 的值。 返回 key 的值,如果 key 不存在时,返回 nil。 如果 key 不是字符串类型,那么返回一个错误。 Redis Getrange 命令 getrange key start end 返回 key 中字符串值的子字符 截取得到的子字符串 Redis Getset 命令 getset key value 将给定 key 的值设为 value ,并返回 key 的旧值(old value)。 返回给定 key 的旧值。 当 key 没有旧值时,即 key 不存在时,返回 nil 。 当 key 存在但不是字符串类型时,返回一个错误。 Redis Getbit 命令 getbit key offset 对 key 所储存的字符串值,获取指定偏移量上的位(bit)。 字符串值指定偏移量上的位(bit)。 当偏移量 OFFSET 比字符串值的长度大,或者 key 不存在时,返回 0 Redis Mget 命令 mget key [key ...]

Spark Streaming 数据限流简述

こ雲淡風輕ζ 提交于 2020-02-07 07:18:54
Spark Streaming对实时数据流进行分析处理,源源不断的从数据源接收数据切割成一个个时间间隔进行处理; 流处理与批处理有明显区别,批处理中的数据有明显的边界、数据规模已知;而流处理数据流并没有边界,也未知数据规模; 由于流处理的数据流特征,使之数据流具有不可预测性,而且数据处理的速率还与硬件、网络等资源有关,在这种情况下如不对源源不断进来的数据流速率进行限制,那当Spark节点故障、网络故障或数据处理吞吐量下来时还有数据不断流进来,那将有可能将出现OOM进而导致Spark Streaming程序崩溃; 在Spark Streaming中不同的数据源采用不同的限速策略,但无论是Socket数据源的限流策略还是Kafka数据源的限流策略其速率(rate)的计算都是使用PIDController算法进行计算而得来; 下面从源码的角度分别介绍 Socket数据源 与 Kafka数据源 的限流处理。 速率限制的计算与更新 Spark Streaming的流处理其实是基于微批处理(MicroBatch)的,也就是说将数据流按某比较小的时间间隔将数据切割成为一段段微批数据进行处理; 添加监听器 StreamingContext调用Start()启动的时候会将速率控制器(rateController)添加到StreamingListener监听器中; 当每批次处理完成时将触发监听器

kafka数据可靠传输

江枫思渺然 提交于 2020-02-07 00:15:05
再说复制 Kafka 的复制机制和分区的多副本架构是Kafka 可靠性保证的核心。把消息写入多个副本可以使Kafka 在发生崩愤时仍能保证消息的持久性。 Kafka 的主题被分为多个分区,分区是基本的数据块。分区存储在单个磁盘上,Kafka 可以保证分区里的事件是有序的,分区可以在线(可用),也可以离线(不可用) 。每个分区可以有多个副本,其中一个副本是首领。所有的事件都直接发送给首领副本,或者直接从首领副本读取事件。其他副本只需要与首领保持同步,并及时复制最新的事件。当首领副本不可用时,其中一个同步副本将成为新首领。 分区首领是同步副本,而对于跟随者副本来说,它需要满足以下条件才能被认为是同步的。 与Zookeeper 之间有一个活跃的会话,也就是说,它在过去的6s(可配置)内向Zookeeper 发送过心跳。 在过去的10s 内(可配置)从首领那里获取过消息。 在过去的10s 内从首领那里获取过最新的消息。光从首领那里获取消息是不够的,它还必须是儿乎零延迟的。 如果跟随者副本不能满足以上任何一点,比如与Zookeeper 断开连接,或者不再获取新消息,或者获取消息滞后了10s 以上,那么它就被认为是不同步的。一个不同步的副本通过与Zookeeper 重新建立连接,并从首领那里获取最新消息,可以重新变成同步的。这个过程在网络出现临时问题并很快得到修复的情况下会很快完成

32位Linux系统虚拟地址映射

不羁岁月 提交于 2020-02-02 12:37:02
IA32体系即Intel32位体系架构,也被称为i386、X86-32或X86。在Intel公司1985年推出的80386微处理器中首先使用。用以取代之前的X86-16位架构,包括8086、80186、80286芯片。谈到这儿,就不得不说说X86架构的发展历史。 Intel 8086是由Intel于1978年所设计的16位微处理器芯片,是x86架构的鼻祖。8086是16位CPU,数据总线16条,地址总线20条,能保存的地址的大小是2^20=1M。 8086增加了4个段寄存器用来保存各内存段的起始地址,这4个段寄存器分别为CS(代码段寄存器)、DS(数据段寄存器)、SS(堆栈段寄存器)、ES(扩展段寄存器)。 由于地址总线共20条,段地址有20位,但是段寄存器只有16位,不能保存20位的地址。 因此,将内存的大小划分为16的倍数(此时还没有操作系统,直接操作的是物理内存)。每块内存起始地址的后四位都为0,段寄存器只保存地址的高16位。正如前面所讲,8086时,地址总线最多只能保存1M的地址空间。 此时,物理内存=段基址+逻辑地址/偏移量。 此时若要取数据,就需要找到物理内存,方法为从DS寄存器中取值,左移4位,就得到了真正的起始地址(DS<<4),再加上变量在该内存段上的偏移量(IP寄存器保存了当前数据在内存段上的偏移量),就得到了数据的物理内存。 DS<<4 + IP =

消息消费队列和索引文件的更新

自作多情 提交于 2020-01-27 00:29:42
ConsumeQueue,IndexFile需要及时更新,否则无法及时被消费,根据消息属性查找消息也会出现较大延迟。 mq通过开启一个线程ReputMessageService来准时转发commitLog文件更新事件,相应的任务处理器根据转发的消息及时更新ConsumeQueue,IndexFile文件 DefaultMessageStore#start ReputMessageService线程每执行一次任务推送休息1毫秒旧继续尝试推送消息到消息消费队列和索引文件。 返回reputFromOffset偏移量开始的全部有效数据,然后循环读取每一条消息。 在DefaultMessageStore的构造方法中: topic:消息主题名称 queueId:消息队列ID commitLogOffset:消息物理偏移量 msgSize:消息长度 tagsCode:消息过滤tag hashcode storeTimestamp:消息存储时间戳 consumeQueueOffset:消息队列偏移量 key:消息索引 success:是否成功解析道完整的消息 uniqKey:消息唯一键 sysFlag:消息系统标记 preparetransactionOffset:消息预处理事务偏移量 propertiesMap:消息属性 bitMap:位图 根据消息主题与队列ID

CSS定位

删除回忆录丶 提交于 2020-01-25 16:05:10
position的取值主要有如下图: 官方给出的总是不那么容易懂得,所以有了以下简洁易懂的总结:   relative :定位是相对于自身位置定位(设置偏移量的时候,会相对于自身所在的位置偏移)。设置了relative的元素仍然处于文档流中,元素的宽高不变,设置偏移量也不会影响其他元素的位置。最外层容器设置为relative定位,在没有设置宽度的情况下,宽度是整个浏览器的宽度。  a bsolute :定位是相对于离元素最近的设置了绝对定位或相对定位的父元素,如果没有父元素设置了绝对或相对定位,则元素相对于根元素即HTML元素定位。设置了absolute的元素脱离了普通文档流,元素在没有设置宽度的情况下,宽度由里面的内容决定。脱离后原来的位置相当于是空的,下面的元素会来占据该位置。 来源: https://www.cnblogs.com/kbinblog/p/10915379.html

Kafka消费者APi

时光怂恿深爱的人放手 提交于 2020-01-25 02:04:52
Kafka客户端从集群中消费消息,并透明地处理kafka集群中出现故障服务器,透明地调节适应集群中变化的数据分区。也和服务器交互,平衡均衡消费者。 public class KafkaConsumer<K,V> extends Object implements Consumer<K,V> 消费者TCP长连接到broker来拉取消息。故障导致的消费者关闭失败,将会泄露这些连接,消费者不是线程安全的,可以查看更多关于 Multi-threaded(多线程) 处理的细节。 跨版本兼容性 该客户端可以与0.10.0或更新版本的broker集群进行通信。较早的版本可能不支持某些功能。例如, 0.10.0 broker不支持 offsetsForTimes ,因为此功能是在版本 0.10.1 中添加的。 如果你调用broker版本不可用的API时,将报 UnsupportedVersionException 异常。 偏移量和消费者的位置 kafka为分区中的每条消息保存一个 偏移量(offset) ,这个 偏移量 是该分区中一条消息的唯一标示符。也表示消费者在分区的位置。例如,一个位置是5的消费者(说明已经消费了0到4的消息),下一个接收消息的偏移量为5的消息。实际上有两个与消费者相关的“位置”概念: 消费者的位置给出了下一条记录的偏移量。它比消费者在该分区中看到的最大偏移量要大一个。