ZooKeeper

微服务为什么选Spring Cloud?

时间秒杀一切 提交于 2020-12-18 06:59:46
现如今微服务架构十分流行,而采用微服务构建系统也会带来更清晰的业务划分和可扩展性。同时,支持微服务的技术栈也是多种多样的,本系列文章主要介绍这些技术中的翘楚——Spring Cloud。这是序篇,主要讲述我们为什么选择Spring Cloud和它的技术概览。 1、为什么微服务架构需要Spring Cloud 简单来说,服务化的核心就是将传统的一站式应用根据业务拆分成一个一个的服务,而微服务在这个基础上要更彻底地去耦合(不再共享DB、KV,去掉重量级ESB),并且强调DevOps和快速演化。这就要求我们必须采用与一站式时代、泛SOA时代不同的技术栈,而Spring Cloud就是其中的佼佼者。 DevOps是英文Development和Operations的合体,他要求开发、测试、运维进行一体化的合作,进行更小、更频繁、更自动化的应用发布,以及围绕应用架构来构建基础设施的架构。这就要求应用充分的内聚,也方便运维和管理。这个理念与微服务理念不谋而合。 接下来我们从服务化架构演进的角度来看看为什么Spring Cloud更适应微服务架构。点击 这里 查看Spring系列教程集合。 1.1 从使用nginx说起 最初的服务化解决方案是给提供相同服务提供一个统一的域名,然后服务调用者向这个域名发送HTTP请求,由Nginx负责请求的分发和跳转。 这种架构存在很多问题: Nginx作为中间层

Hadoop NameNode 高可用实现解析

拜拜、爱过 提交于 2020-12-18 06:45:18
转自https://www.ibm.com/developerworks/cn/opensource/os-cn-hadoop-name-node/ 前面的两篇文章都是关于分布式一致性协议Raft的, 图解分布式一致性算法 Raft协议详解 ,其中提到了选主等内容。在不同的项目中,也都有类似的主从切换等策略来保证HA。下文是Hadoop中的NameNode的高可用实现分析,可以对照着看看。 如果在公众号内格式排版不便阅读,可以查看链接。 NameNode 高可用整体架构概述 在 Hadoop 1.0 时代,Hadoop 的两大核心组件 HDFS NameNode 和 JobTracker 都存在着单点问题,这其中以 NameNode 的单点问题尤为严重。因为 NameNode 保存了整个 HDFS 的元数据信息,一旦 NameNode 挂掉,整个 HDFS 就无法访问,同时 Hadoop 生态系统中依赖于 HDFS 的各个组件,包括 MapReduce、Hive、Pig 以及 HBase 等也都无法正常工作,并且重新启动 NameNode 和进行数据恢复的过程也会比较耗时。这些问题在给 Hadoop 的使用者带来困扰的同时,也极大地限制了 Hadoop 的使用场景,使得 Hadoop 在很长的时间内仅能用作离线存储和离线计算,无法应用到对可用性和数据一致性要求很高的在线应用场景中。

【Hadoop学习之四】HDFS HA搭建(QJM)

我只是一个虾纸丫 提交于 2020-12-18 01:59:16
环境   虚拟机:VMware 10   Linux版本:CentOS-6.5-x86_64   客户端:Xshell4   FTP:Xftp4   jdk8   hadoop-3.1.1 由于NameNode对于整个HDFS集群重要性,为避免NameNode单点故障,在集群里创建2个或以上NameNode(不要超过5个),保证高可用。 实现主备NameNode需要解决的问题: 1、通过JournalNodes来保证Active NN与Standby NN之间的元数据同步 2、通过ZKFC来保证Active NN与Standby NN主备切换 3、DataNode会同时向Active NN与Standby NN上报数据块的位置信息 参考: hdfs HA原理及安装 Hadoop组件之-HDFS(HA实现细节) HDFS HA: 高可靠性分布式存储系统解决方案的历史演进 搭建HA集群部署节点清单: 一、平台软件环境 1、平台:GNU/Linux 2、软件:jdk+免密登录 3、JAVA和Hadoop环境变量以及主机名设置 参考: 【Hadoop学习之三】Hadoop全分布式安装 二、配置(node1-node4采用相同配置) 1、hadoop-env.sh export JAVA_HOME=/usr/local/jdk1. 8 .0_65 export HDFS_NAMENODE

docker搭建kafka集群

不羁的心 提交于 2020-12-17 21:41:23
参考:https://www.jianshu.com/p/8ccd712e2599 搭建过程 1. 下载zookeeper镜像 docker pull wurstmeister/zookeeper 2. 下载kafka镜像 docker pull wurstmeister/kafka 3. 创建一个docker-compose.yml文件 version: ' 2 ' services: zookeeper: image: wurstmeister / zookeeper ports: - " 2181:2181 " kafka: image: wurstmeister / kafka ports: - " 9092 " environment: KAFKA_ADVERTISED_HOST_NAME: " 192.168.99.100 " KAFKA_ZOOKEEPER_CONNECT: 192.168 . 99.100 : 2181 volumes: - /var/run/docker.sock:/var/run/docker.sock 4. 启动docker-compose docker-compose up -d 5. 运行kafka集群模式 docker-compose scale kafka=3 6. 查看container docker ps docker ps -a

Docker实战之Kafka集群

醉酒当歌 提交于 2020-12-17 21:41:09
1. 概述 Apache Kafka 是一个快速、可扩展的、高吞吐、可容错的分布式发布订阅消息系统。其具有高吞吐量、内置分区、支持数据副本和容错的特性,适合在大规模消息处理场景中使用。 笔者之前在物联网公司工作,其中 Kafka 作为物联网 MQ 选型的事实标准,这里优先给大家搭建 Kafka 集群环境。由于 Kafka 的安装需要依赖 Zookeeper,对 Zookeeper 还不了解的小伙伴可以在 这里 先认识下 Zookeeper。 Kafka 能解决什么问题呢?先说一下消息队列常见的使用场景吧,其实场景有很多,但是比较核心的有 3 个:解耦、异步、削峰。 2. Kafka 基本概念 Kafka 部分名词解释如下: Broker:消息中间件处理结点,一个 Kafka 节点就是一个 broker,多个 broker 可以组成一个 Kafka 集群。 Topic:一类消息,例如 page view 日志、click 日志等都可以以 topic 的形式存在,Kafka 集群能够同时负责多个 topic 的分发。 Partition:topic 物理上的分组,一个 topic 可以分为多个 partition,每个 partition 是一个有序的队列。 Segment:partition 物理上由多个 segment 组成,下面有详细说明。 offset:每个 partition

从分布式一致性到共识机制(二)Raft算法

瘦欲@ 提交于 2020-12-17 07:55:39
春秋五霸说开 春秋五霸,是指东周春秋时期相继称霸主的五个诸侯,“霸”,意为霸主,即是诸侯之领袖。 典型的比如齐桓公,晋文公,春秋时期诸侯国的称霸,与今天要讨论的Raft算法很像。 一、更加直观的Raft算法 Raft 适用于一个管理日志一致性的协议,相比于 Paxos 协议 Raft 更易于理解和去实现它。 为了提高理解性,Raft 将一致性算法分为了几个部分,包括领导选取(leader selection)、日志复制(log replication)、安全(safety),并且使用了更强的一致性来减少了必须需要考虑的状态。 1.解决什么问题 分布式存储系统通常通过维护多个副本来提高系统的availability,带来的代价就是分布式存储系统的核心问题之一:维护多个副本的一致性。 Raft协议基于复制状态机(replicated state machine),即一组server从相同的初始状态起,按相同的顺序执行相同的命令,最终会达到一直的状态,一组server记录相同的操作日志,并以相同的顺序应用到状态机。 Raft有一个明确的场景,就是管理复制日志的一致性。 如图,每台机器保存一份日志,日志来自于客户端的请求,包含一系列的命令,状态机会按顺序执行这些命令。 一致性算法管理来自客户端状态命令的复制日志,保证状态机处理的日志中的命令的顺序都是一致的,因此会得到相同的执行结果。 2

在Ubuntu中添加诸如zookeeper这样的service

房东的猫 提交于 2020-12-17 01:20:47
我们总是想着把自己的应用在系统启动时自动启动,但是我们又不会写 init.d 中的 shell 脚本,所以,很多时候很无奈地只能手动。现在好了,我们有了 systemd 这样的东东,我们就很容易把事情给办了。 我们先了解一下 systemd : 启动服务: $ sudo service zookeeper start 重启服务: $ sudo service zookeeper restart 关闭服务: $ sudo service zookeeper stop 是不是很熟悉,看起来很不错的样子。 那么我们怎么把诸如 zookeeper 这样的程序加进 systemd 中呢? 首先,我们很了解一下 systemd 的配置放在哪里,一般情况下会在 /etc/systemd/system 中,在这个目录中,会有大量的 wants 和 service 。 其中 wants 表示依赖的基础服务,这些我们不用去管它。 而 service 则是要启动的应用服务,这些才是我们去关注的。一般情况下,每个要启动的服务都会以服务名加 .service 结尾,例如: zookeeper.service redis.service 每个 .service 文件用来配置一个 service ,它们是一个文本文件,格式为 properties ,下面就是一个 zookeeper.service 的例子:

解锁Redis锁的正确姿势

北城以北 提交于 2020-12-16 16:04:04
redis是php的好朋友,在php写业务过程中,有时候会使用到锁的概念,同时只能有一个人可以操作某个行为。这个时候我们就要用到锁。锁的方式有好几种,php不能在内存中用锁,不能使用zookeeper加锁,使用数据库做锁又消耗比较大,这个时候我们一般会选用redis做锁机制。 setnx 锁在redis中最简单的数据结构就是string。最早的时候,上锁的操作一般使用setnx,这个命令是当:lock不存在的时候set一个val,或许你还会记得使用expire来增加锁的过期,解锁操作就是使用del命令,伪代码如下: 1if (Redis::setnx("my:lock", 1)) { 2 Redis::expire("my:lock", 10); 3 // ... do something 4 5 Redis::del("my:lock") 6} 这里其实是有问题的,问题就在于setnx和expire中间如果遇到crash等行为,可能这个lock就不会被释放了。于是进一步的优化方案可能是在lock中存储timestamp。判断timestamp的长短。 set 现在官方建议直接使用set来实现锁。我们可以使用set命令来替代setnx,就是下面这个样子 1if (Redis::set("my:lock", 1, "nx", "ex", 10)) { 2 ... do

写代码有这16个好习惯,可以减少80%非业务的bug

混江龙づ霸主 提交于 2020-12-16 15:28:00
前言 每一个好习惯都是一笔财富,本文整理了写代码的16个好习惯,每个都很经典,养成这些习惯,可以规避多数非业务的bug!希望对大家有帮助哈,谢谢阅读,加油哦~ github地址,感谢每颗star ❝ https://github.com/whx123/JavaHome ❞ 公众号: 「捡田螺的小男孩」 1. 修改完代码,记得自测一下 「改完代码,自测一下」 是每位程序员必备的基本素养。尤其不要抱有这种侥幸 「心理:我只是改了一个变量或者我只改了一行配置代码,不用自测了」 。改完代码,尽量要求自己都去测试一下哈,可以规避很多不必要bug的。 2. 方法入参尽量都检验 入参校验也是每个程序员必备的基本素养。你的方法处理, 「必须先校验参数」 。比如入参是否允许为空,入参长度是否符合你的预期长度。这个尽量养成习惯吧,很多 「低级bug」 都是 「不校验参数」 导致的。 ❝ 如果你的数据库字段设置为varchar(16),对方传了一个32位的字符串过来,你不校验参数, 「插入数据库直接异常」 了。 ❞ 3. 修改老接口的时候,思考接口的兼容性。 很多bug都是因为修改了对外老接口,但是却 「不做兼容导致」 的。关键这个问题多数是比较严重的,可能直接导致系统发版失败的。新手程序员很容易犯这个错误哦~ 所以,如果你的需求是在原来接口上修改,,尤其这个接口是对外提供服务的话,一定要考虑接口兼容

写代码有这16个好习惯,可以减少80%非业务的bug

99封情书 提交于 2020-12-16 15:27:30
前言 每一个好习惯都是一笔财富,本文整理了写代码的16个好习惯,每个都很经典,养成这些习惯,可以规避多数非业务的bug!希望对大家有帮助哈,谢谢阅读,加油哦~ 1. 修改完代码,记得自测一下 「改完代码,自测一下」 是每位程序员必备的基本素养。尤其不要抱有这种侥幸 「心理:我只是改了一个变量或者我只改了一行配置代码,不用自测了」 。改完代码,尽量要求自己都去测试一下哈,可以规避很多不必要bug的。 2. 方法入参尽量都检验 入参校验也是每个程序员必备的基本素养。你的方法处理, 「必须先校验参数」 。比如入参是否允许为空,入参长度是否符合你的预期长度。这个尽量养成习惯吧,很多 「低级bug」 都是 「不校验参数」 导致的。 ❝ 如果你的数据库字段设置为varchar(16),对方传了一个32位的字符串过来,你不校验参数, 「插入数据库直接异常」 了。 ❞ 3. 修改老接口的时候,思考接口的兼容性。 很多bug都是因为修改了对外老接口,但是却 「不做兼容导致」 的。关键这个问题多数是比较严重的,可能直接导致系统发版失败的。新手程序员很容易犯这个错误哦~ 所以,如果你的需求是在原来接口上修改,,尤其这个接口是对外提供服务的话,一定要考虑接口兼容。举个例子吧,比如dubbo接口,原本是只接收A,B参数,现在你加了一个参数C,就可以考虑这样处理。 //老接口 void oldService