Day: January 22, 2021

  • Kafka消息系统教程(一文读懂kafka)

    Kafka消息系统教程(一文读懂kafka)

    消息系统的作用,应该大部分小伙伴都清楚,用机油装箱举个例子。 所以消息系统就是如上图我们所说的仓库,能在中间过程作为缓存,并且实现解耦合的作用。 引入一个场景,我们知道中国移动,中国联通,中国电信的日志处理,是交给外包去做大数据分析的,假设现在它们的日志都交给了你做的系统去做用户画像分析。 按照刚刚前面提到的消息系统的作用,我们知道了消息系统其实就是一个模拟缓存,且仅仅是起到了缓存的作用而并不是真正的缓存,数据仍然是存储在磁盘上面而不是内存。 Topic主题 Kafka学习了数据库里面的设计,在里面设计了topic(主题),这个东西类似于关系型数据库的表。 此时我需要获取中国移动的数据,那就直接监听TopicA即可。 Partition分区 kafka还有一个概念叫Partition(分区),分区具体在服务器上面表现起初就是一个目录,一个主题下面有多个分区,这些分区会存储到不同的服务器上面,或者说,其实就是在不同的主机上建了不同的目录。这些分区主要的信息就存在了.log文件里面。跟数据库里面的分区差不多,是为了提高性能。 至于为什么提高了性能,很简单,多个分区多个线程,多个线程并行处理肯定会比单线程好得多。 Topic和partition像是HBASE里的table和region的概念,table只是一个逻辑上的概念,真正存储数据的是region,这些region会分布式地存储在各个服务器上面,对应于Kafka,也是一样,Topic也是逻辑概念,而partition就是分布式存储单元。这个设计是保证了海量数据处理的基础。我们可以对比一下,如果HDFS没有block的设计,一个100T的文件也只能单独放在一个服务器上面,那就直接占满整个服务器了,引入block后,大文件可以分散存储在不同的服务器上。 注意: 分区会有单点故障问题,所以我们会为每个分区设置副本数; 分区的编号是从0开始的。 Producer – 生产者 往消息系统里面发送数据的就是生产者。 Consumer – 消费者 从Kafka里读取数据的就是消费者。 Message – 消息 Kafka里面的我们处理的数据叫做消息。 Kafka的集群架构 创建一个TopicA的主题,3个分区分别存储在不同的服务器,也就是broker下面。Topic是一个逻辑上的概念,并不能直接在图中把Topic的相关单元画出。 需要注意:Kafka在0.8版本以前是没有副本机制的,所以在面对服务器宕机的突发情况时会丢失数据,所以尽量避免使用这个版本之前的Kafka。 Replica – 副本 Kafka中的partition为了保证数据安全,所以每个partition可以设置多个副本。 此时我们对分区0,1,2分别设置3个副本(其实设置两个副本是比较合适的)。 而且其实每个副本都是有角色之分的,它们会选取一个副本作为leader,而其余的作为follower,我们的生产者在发送数据的时候,是直接发送到leader partition里面,然后follower partition会去leader那里自行同步数据,消费者消费数据的时候,也是从leader那去消费数据的。 Consumer Group – 消费者组 我们在消费数据时会在代码里面指定一个group.id,这个id代表的是消费组的名字,而且这个group.id就算不设置,系统也会默认设置。 conf.setProperty(“group.id”,”tellYourDream”) 我们所熟知的一些消息系统一般来说会这样设计,就是只要有一个消费者去消费了消息系统里面的数据,那么其余所有的消费者都不能再去消费这个数据。可是Kafka并不是这样,比如现在consumerA去消费了一个topicA里面的数据。 consumerA: group.id = a consumerB: group.id = a consumerC: group.id = b consumerD: group.id = b 再让consumerB也去消费TopicA的数据,它是消费不到了,但是我们在consumerC中重新指定一个另外的group.id,consumerC是可以消费到topicA的数据的。而consumerD也是消费不到的,所以在Kafka中,不同组可有唯一的一个消费者去消费同一主题的数据。 所以消费者组就是让多个消费者并行消费信息而存在的,而且它们不会消费到同一个消息,如下,consumerA,B,C是不会互相干扰的。 consumer group:a…

  • 电信业务经营许可证年报都需要注意哪些问题,如何办理最省事?大概花多少钱?
  • 腾讯云根据内网ip获取公网IP地址和负载均衡的VIP地址
  • Docker设置配置的三种方式

    Docker设置配置的三种方式

    一、利用Linux的http_proxy等环境变量的dockerd代理 在执行docker pull时,是由守护进程dockerd来执行。 因此,代理需要配在dockerd的环境中。 而这个环境,则是受systemd所管控,因此实际是systemd的配置。 sudo mkdir -p /etc/systemd/system/docker.service.d sudo touch /etc/systemd/system/docker.service.d/proxy.conf 在这个proxy.conf文件中,添加以下内容: [Service] Environment=”HTTP_PROXY=http://proxy.money.com:8080/” Environment=”HTTPS_PROXY=http://proxy.money.com:8080/” Environment=”NO_PROXY=localhost,127.0.0.1,.money.com” 二、Container代理:在容器运行阶段,如果需要代理上网,则需要配置~/.docker/config.json。 以下配置,只在Docker 17.07及以上版本生效。 { “proxies”: { “default”: { “httpProxy”: “http://proxy.money.com:8080”, “httpsProxy”: “http://proxy.money.com:8080”, “noProxy”: “localhost,127.0.0.1,.money.com” } } } 这个是用户级的配置,除了proxies,docker login等相关信息也会在其中。 而且还可以配置信息展示的格式、插件参数等。此外,容器的网络代理,也可以直接在其运行时通过-e注入http_proxy等环境变量。 这两种方法分别适合不同场景。 config.json非常方便,默认在所有配置修改后启动的容器生效,适合个人开发环境。 在CI/CD的自动构建环境、或者实际上线运行的环境中,这种方法就不太合适,用-e注入这种显式配置会更好,减轻对构建、部署环境的依赖。 当然,在这些环境中,最好用良好的设计避免配置代理上网。 三、docker build代理:虽然docker build的本质,也是启动一个容器,但是环境会略有不同,用户级配置无效。 在构建时,需要注入http_proxy等参数。 docker build . \ –build-arg “HTTP_PROXY=http://proxy.money.com:8080/” \ –build-arg “HTTPS_PROXY=http://proxy.money.com:8080/” \…