<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[eddie's Blog]]></title><description><![CDATA[点个关注呗]]></description><link>https://blog.youkuaiyun.com/weixin_44129784</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; weixin_44129784]]></copyright><item><title><![CDATA[Kafka日志存储——《深入理解Kafka：核心设计与实践原理》]]></title><link>https://blog.youkuaiyun.com/weixin_44129784/article/details/116587569</link><guid>https://blog.youkuaiyun.com/weixin_44129784/article/details/116587569</guid><author>weixin_44129784</author><pubDate>Mon, 10 May 2021 10:01:13 +0800</pubDate><description><![CDATA[文件目录布局

日志格式演变
Kafka消息格式经过了3个版本的变化。
v0版本

v1版本

新增了一个timestamp字段。
启用压缩时，多个KV被压缩在value位置：
v2版本

v2版本使用RecordBatch代替了Message Set，引入可变长整数Varint、ZigZag编码。
日志索引
Kafka日志索引分为两种：

偏移量索引
时间戳索引

Kafka的索引是以稀疏索引构建的，因为Kafka的日志排列都是有序的（offset有序、时间戳有序），所以可以使用这种索引方式，在空间与时间]]></description><category></category></item><item><title><![CDATA[设计一个应用于分布式系统中的可伸缩性IO模型]]></title><link>https://blog.youkuaiyun.com/weixin_44129784/article/details/115294636</link><guid>https://blog.youkuaiyun.com/weixin_44129784/article/details/115294636</guid><author>weixin_44129784</author><pubDate>Mon, 29 Mar 2021 10:12:36 +0800</pubDate><description><![CDATA[设计目标


步骤


分而治之


事件驱动模型


Reactor模型

基本版
多线程版本
其他版本



目标

能够实现优雅地降级，在负载增加的情况下（更多的连接）
能够随着系统的资源的增加，持续地提高性能
还能满足可用性和性能目标

短延迟
满足高峰期请求
可调整的服务质量



分而治之，通常都是实现可伸缩性目标的最好的方法。
步骤
在一些web服务、分布式存储等一些分布式的项目中，他们都基于这样的一个模型：

读取
反序列化
服务的处理
序列化
写出

但是每一步的资源开销都是不一样的，..]]></description><category></category></item><item><title><![CDATA[Redis主从同步]]></title><link>https://blog.youkuaiyun.com/weixin_44129784/article/details/114849030</link><guid>https://blog.youkuaiyun.com/weixin_44129784/article/details/114849030</guid><author>weixin_44129784</author><pubDate>Mon, 15 Mar 2021 20:12:16 +0800</pubDate><description><![CDATA[Redis分布式模型，在CAP定理中，使用了AP的模型，即保证了可用性与分区容错。
Redis采用了BASE最终一致性原理，来保证最终数据的一致，即可以允许出现数据不一致的状态。
增量同步
Redis使用指令流的方式（类似AOF指令）进行同步信息，主节点一边发送指令至从节点，从节点一遍执行该指令，一边将自己的同步情况（偏移量）反馈给主节点。
Redis的指令存放在一个buffer中，buffer是一个环形缓冲区（环形数组），当指令流来不及处理之后，会被后面来的数据进行覆盖，这样就会造成数据的丢失，这时候就会]]></description><category></category></item><item><title><![CDATA[Redis持久化]]></title><link>https://blog.youkuaiyun.com/weixin_44129784/article/details/114824433</link><guid>https://blog.youkuaiyun.com/weixin_44129784/article/details/114824433</guid><author>weixin_44129784</author><pubDate>Mon, 15 Mar 2021 11:31:29 +0800</pubDate><description><![CDATA[因为Redis都是基于内存进行存储的，在突然宕机的情况下，就会造成数据的丢失，所以要开启基于磁盘存储的持久化机制。
RDB (Redis DataBase)
快照，将Redis里的数据进行一次全量操作，存储到一个文件中去。
但是RDB需要对磁盘就行一个大量的IO操作，那么RDB是如何保证在持久化的过程，数据更新的问题呢？
使用操作系统中的fork函数
fork函数COW（Copy On Write）
操作系统克隆出一个Redis的子进程，进行数据的持久化操作。
而在这个子进程中，如果原来的数据段都不进行修改]]></description><category></category></item><item><title><![CDATA[关于Redis-IO模型思考——结合秒杀系统说说为什么是「多路复用+单线程」]]></title><link>https://blog.youkuaiyun.com/weixin_44129784/article/details/114680737</link><guid>https://blog.youkuaiyun.com/weixin_44129784/article/details/114680737</guid><author>weixin_44129784</author><pubDate>Thu, 11 Mar 2021 22:58:11 +0800</pubDate><description><![CDATA[为什么写这篇文章
因为博主最近在实现一个分布式缓存系统，说到分布式缓存系统，不得不去借鉴Redis的一下设计，于是在看了一些关于Redis-IO模型的技术文章与书籍之后，有了这么一个思考，于是写一篇博客来记录一下。
我的分布式缓存系统：https://github.com/eddieVim/eddie-cache
Redis的IO模型
简单来说，多路复用IO + 单线程就是Redis的IO模型所在，相信大部分读者如果看过Redis的一些介绍都有所印象，不过本文并不是主要为了去介绍多路复用IO与传统的IO有什]]></description><category></category></item><item><title><![CDATA[redis-scan命令]]></title><link>https://blog.youkuaiyun.com/weixin_44129784/article/details/114678544</link><guid>https://blog.youkuaiyun.com/weixin_44129784/article/details/114678544</guid><author>weixin_44129784</author><pubDate>Thu, 11 Mar 2021 19:58:54 +0800</pubDate><description><![CDATA[为什么使用scan？
因为在Redis的命令执行是单线程模型的，使用keys指令时，若数据量很大，Redis会对全量数据进行匹配，导致会有几秒钟的阻塞事件，而Scan是通过游标对hash-slot分步进行的，阻塞时间短，适合进行线上生产环境使用。
scan特点

复杂度虽然也是 O(n)，但是它是通过游标分步进行的，不会阻塞线程;
提供 limit 参数，可以控制每次返回结果的最大条数，limit 只是一个 hint，返回的结果可多可少;
同 keys 一样，它也提供模式匹配功能;
服务器不需要为游标保存状]]></description><category></category></item><item><title><![CDATA[简单说说JDK8-Stream]]></title><link>https://blog.youkuaiyun.com/weixin_44129784/article/details/114003565</link><guid>https://blog.youkuaiyun.com/weixin_44129784/article/details/114003565</guid><author>weixin_44129784</author><pubDate>Tue, 23 Feb 2021 21:32:05 +0800</pubDate><description><![CDATA[JDK8-Stream
我发现，Stream的处理方式是借鉴于大数据的流式处理方式。
所以我就简单使用Stream来写一个WordCount程序：
先简单说一下下面代码的含义，将一个String[]的内容模拟成文件的一行一行数据，最终我们需要将单词映射为word -&gt; count的形式，进行排序，让相同的word靠在一起，最终即可通过比较相近的元素的word是否相等，相等对count进行相加，即可得到最终的答案。
import java.util.Arrays;
import java.util.Co]]></description><category></category></item><item><title><![CDATA[简单讲讲HashMap & LinkedHashMap]]></title><link>https://blog.youkuaiyun.com/weixin_44129784/article/details/113992262</link><guid>https://blog.youkuaiyun.com/weixin_44129784/article/details/113992262</guid><author>weixin_44129784</author><pubDate>Tue, 23 Feb 2021 15:41:49 +0800</pubDate><description><![CDATA[简单讲讲HashMap &amp; LinkedHashMap
HashMap
HashMap的结构
一个数组 + 链表 or 红黑树
为什么是这样的结构呢？
哈希表原理就是通过哈希映射，来快速定位到对应的key，所以必须要有一个数组用来承接数据，假设我们用Key的hashcode值对数组的长度进行取余，得到对应的数组下标后，进行存储，下次即可通过同样的方法进行快速查找；但是当我们的数据量很大的时候，难免会发生哈希冲突（虽然Key不同但是存储位置是相同的），解决哈希冲突的方法有很多种，HashMap是使用了]]></description><category></category></item><item><title><![CDATA[Spark-CombineByKey函数]]></title><link>https://blog.youkuaiyun.com/weixin_44129784/article/details/113441660</link><guid>https://blog.youkuaiyun.com/weixin_44129784/article/details/113441660</guid><author>weixin_44129784</author><pubDate>Sat, 30 Jan 2021 17:08:43 +0800</pubDate><description><![CDATA[combineByKey
CombineByKey这一函数过程就是根据Key值，将Value值进行合并的过程。
参数解释
def combineByKey[C](
      createCombiner: V =&gt; C,
      mergeValue: (C, V) =&gt; C,
      mergeCombiners: (C, C) =&gt; C): RDD[(K, C)] = {
}

createCombiner: V =&gt; C：如何处理第一个Value
mergeValue]]></description><category></category></item><item><title><![CDATA[大数据开发经典面试题：说一说Yarn、HDFS、MR]]></title><link>https://blog.youkuaiyun.com/weixin_44129784/article/details/113374268</link><guid>https://blog.youkuaiyun.com/weixin_44129784/article/details/113374268</guid><author>weixin_44129784</author><pubDate>Fri, 29 Jan 2021 11:17:08 +0800</pubDate><description><![CDATA[Yarn是什么？
是Hadoop2之后推出的，用于管理集群中的资源，他有这几个角色：

ResourceManager（下文简称RM）
NodeManager（下文简称NM）
ApplicationMaster（下文简称AppMaster）
Container

其中RM是整个集群的管理者，所有的资源的使用申请与释放都要向它进行汇报与调度，NM是集群中各个Node结点的管理资源，主要配合RM进行工作。这两者生命周期是从Yarn启动到结束均存在的。
AppMaster与Container是对进行某一次任务的资]]></description><category></category></item><item><title><![CDATA[Disruptor简介及其应用]]></title><link>https://blog.youkuaiyun.com/weixin_44129784/article/details/113246759</link><guid>https://blog.youkuaiyun.com/weixin_44129784/article/details/113246759</guid><author>weixin_44129784</author><pubDate>Wed, 27 Jan 2021 15:12:02 +0800</pubDate><description><![CDATA[Disruptor
背景

Disruptor是英国外汇交易公司LMAX开发的一个高性能队列，研发的初衷是解决内存队列的延迟问题（在性能测试中发现竟然与I/O操作处于同样的数量级）。基于Disruptor开发的系统单线程能支撑每秒600万订单，2010年在QCon演讲后，获得了业界关注。2011年，企业应用软件专家Martin Fowler专门撰写长文介绍。同年它还获得了Oracle官方的Duke大奖。


目前，包括Apache Storm、Camel、Log4j 2在内的很多知名项目都应用了Disrup]]></description><category></category></item><item><title><![CDATA[说一说Spark-RDD（一）]]></title><link>https://blog.youkuaiyun.com/weixin_44129784/article/details/113062538</link><guid>https://blog.youkuaiyun.com/weixin_44129784/article/details/113062538</guid><author>weixin_44129784</author><pubDate>Sat, 23 Jan 2021 21:28:09 +0800</pubDate><description><![CDATA[RDD

A Resilient Distributed Dataset (RDD).
一个弹性的分布式数据集合。

RDD数据集有5个主要的属性：

在RDD的源码内部，有以下注释，理解即可。


有分区列表，指RDD这个对象中，是知道各个分区数据在分布式文件系统中的哪个位置。
有相同的函数可以用于计算每个切片的数据
有该RDD数据集合所依赖的数据集合列表
可选的，可以有对Key-Value进行分区操作的分区器（例如：默认是hash值分区）
可选的，RDD会更加偏向于数据本地化计算（在每个切片所在的位置进]]></description><category></category></item><item><title><![CDATA[初识Scala（二）]]></title><link>https://blog.youkuaiyun.com/weixin_44129784/article/details/112802546</link><guid>https://blog.youkuaiyun.com/weixin_44129784/article/details/112802546</guid><author>weixin_44129784</author><pubDate>Tue, 19 Jan 2021 11:20:32 +0800</pubDate><description><![CDATA[初识Scala（二）
trait

相当于Java的接口，但是Scala可以实现多继承。

package pro.eddievim.multi

/**
 * @Author eddieVim
 * @微信公众号 艾迪威姆 / PositiveEddie
 * @Blog https://blog.youkuaiyun.com/weixin_44129784
 * @Create 2021/1/17 10:28
 * @Discription
 */
trait God {
  def aSay(): Unit = ]]></description><category></category></item><item><title><![CDATA[设计模式之迭代器模式(Iterator)]]></title><link>https://blog.youkuaiyun.com/weixin_44129784/article/details/112726786</link><guid>https://blog.youkuaiyun.com/weixin_44129784/article/details/112726786</guid><author>weixin_44129784</author><pubDate>Sat, 16 Jan 2021 23:15:50 +0800</pubDate><description><![CDATA[设计模式之迭代器模式(Iterator)

提供一种方法顺序访问一个集合对象中的各个元素,而不暴露该对象的内部表示。

迭代器模式在很多场景都有应用，例如链表的遍历操作，就需要用到迭代器。大数据中的迭代处理（避免出现多个中间数据集）等等。
这里我们来自己实现ArrayList与LinkedList迭代器，加深对迭代器的理解。
MyCollection
package pers.eddievim.dp.iterator;

import java.util.Iterator;

/**
 * @Author ]]></description><category></category></item><item><title><![CDATA[Golang Channel简介]]></title><link>https://blog.youkuaiyun.com/weixin_44129784/article/details/111818312</link><guid>https://blog.youkuaiyun.com/weixin_44129784/article/details/111818312</guid><author>weixin_44129784</author><pubDate>Sun, 27 Dec 2020 16:22:21 +0800</pubDate><description><![CDATA[Go Channel
Channel，管道。从它的名字，就可以差不多可以了解到是一个与队列类似的东西。
它可以轻松地实现，线程之间的通信，线程之间可以通过它接收和发送数据，达到线程安全的目的。
定义初始化
channel := make(chan int) // 初始化一个不带缓冲区的channel
channel := make(chan int, 9) // 初始化一个带9个缓冲区的channel

有无缓冲区区别？


有缓冲区
若缓冲区大小为N，线程A发送数据至channel中，若channel中已]]></description><category></category></item><item><title><![CDATA[麻省理工硬核课程分布式系统lab_1解析 MIT6.824	lab_1 MapReduce]]></title><link>https://blog.youkuaiyun.com/weixin_44129784/article/details/111044116</link><guid>https://blog.youkuaiyun.com/weixin_44129784/article/details/111044116</guid><author>weixin_44129784</author><pubDate>Fri, 11 Dec 2020 17:04:11 +0800</pubDate><description><![CDATA[这个Lab并不是真的让我们去实现MapReduce的分布式并行框架，而是通过本地开启不同的进程（线程），去模拟集群执行MapReduce程序。

课程相关文献

建议优先使用官方的相关资料，进行完成课程，本文章仅供参考。


MIT 6.824 分布式系统课程官网mit 6.824 Distributed Systems
MIT6.824 分布式系统 MapReduce 实验1mit 6.824 Lab1 MapReduce
谷歌MapReduce论文MapReduce Paper

源代码

作者代码仓.]]></description><category></category></item><item><title><![CDATA[从源码级别深挖Zookeeper监听机制]]></title><link>https://blog.youkuaiyun.com/weixin_44129784/article/details/110586639</link><guid>https://blog.youkuaiyun.com/weixin_44129784/article/details/110586639</guid><author>weixin_44129784</author><pubDate>Thu, 03 Dec 2020 22:41:20 +0800</pubDate><description><![CDATA[从源码级别深挖Zookeeper监听机制

监听机制是Zookeeper的一个重要特性，例如：Zookeeper实现的高可用集群、分布式锁，就利用到了这一特性。

在Zookeeper被监听的结点对象/信息发生了改变，就会触发监听机制，通知注册者。
注册监听机制
创建客户端，创建默认监听器
在创建zookeeper客户端实例时，需要下列参数。
new ZooKeeper(String connectString, int sessionTimeout, Watcher watcher)

三个参数分别的含义]]></description><category></category></item><item><title><![CDATA[初识Scala（一）]]></title><link>https://blog.youkuaiyun.com/weixin_44129784/article/details/110531874</link><guid>https://blog.youkuaiyun.com/weixin_44129784/article/details/110531874</guid><author>weixin_44129784</author><pubDate>Thu, 03 Dec 2020 14:53:45 +0800</pubDate><description><![CDATA[初识Scala
val 与 var
val
常量：相当于使用final修饰的变量
var
用于声明变量
object 与 class
object


Scala的object就相当于一个单例的对象，即static class修饰


Object内的方法是直接可以运行的（不需要new一个对象），所以main方法必须在object


object允许裸露代码，相当于object将代码放到了static静态代码块中


class

class内的方法是必须要创建对象后才能使用的
类里允许裸露代码，其字节码]]></description><category></category></item><item><title><![CDATA[初识HBase（HBase数据模型与架构）]]></title><link>https://blog.youkuaiyun.com/weixin_44129784/article/details/110221275</link><guid>https://blog.youkuaiyun.com/weixin_44129784/article/details/110221275</guid><author>weixin_44129784</author><pubDate>Fri, 27 Nov 2020 09:47:55 +0800</pubDate><description><![CDATA[HBase

Apache HBase™ is the Hadoop database, a distributed, scalable, big data store.
Use Apache HBase™ when you need random, realtime read/write access to your Big Data. This project’s goal is the hosting of very large tables – billions of rows X millions]]></description><category></category></item><item><title><![CDATA[计算机网络——网络分层 + TCP三次握手四次挥手]]></title><link>https://blog.youkuaiyun.com/weixin_44129784/article/details/109953688</link><guid>https://blog.youkuaiyun.com/weixin_44129784/article/details/109953688</guid><author>weixin_44129784</author><pubDate>Sun, 22 Nov 2020 15:01:41 +0800</pubDate><description><![CDATA[网络分层
OSI
自顶向下：

应用层
表示层
会话层
运输层
网络层
数据链路层
物理层



TCP/IP体系结构
自顶向下：

应用层（TELNET、HTTP、FTP、SMTP）
运输层（TCP、UDP）
网络层IP
网络接口层


结合两种模型可以得出一种五层的体系结构
自顶向下：

应用层
运输层
网络层
数据链路层
物理层


五层协议体系结构

应用层
运输层
网络层
数据链路层
物理层


应用层

应用层的任务就是通过应用进程间的交互来完成特定网络应用。应用层协议定义，应用层进程之间通信和]]></description><category></category></item></channel></rss>