分布式部署

Redis分布式锁的实现原理

冷暖自知 提交于 2019-12-03 23:38:04
一、写在前面 现在面试,一般都会聊聊分布式系统这块的东西。通常面试官都会从服务框架(Spring Cloud、Dubbo)聊起,一路聊到分布式事务、分布式锁、ZooKeeper等知识。 所以咱们这篇文章就来聊聊分布式锁这块知识,具体的来看看 Redis分布式锁的实现原理。 说实话,如果在公司里落地生产环境用分布式锁的时候,一定是会用开源类库的,比如Redis分布式锁,一般就是用 Redisson框架就好了,非常的简便易用。 大家如果有兴趣,可以去看看Redisson的官网,看看如何在项目中引入Redisson的依赖,然后基于Redis实现分布式锁的加锁与释放锁。 下面给大家看一段简单的使用代码片段,先直观的感受一下: 怎么样,上面那段代码,是不是感觉简单的不行! 此外,人家还支持redis单实例、redis哨兵、redis cluster、redis master-slave等各种部署架构,都可以给你完美实现。 二 、Redisson实现Redis分布式锁的底层原理 好的,接下来就通过一张手绘图,给大家说说Redisson这个开源框架对Redis分布式锁的实现原理。 (1)加锁机制 咱们来看上面那张图,现在某个客户端要加锁。如果该客户端面对的是一个redis cluster集群,他首先会根据hash节点选择一台机器。 这里注意 ,仅仅只是选择一台机器!这点很关键! 紧接着

《大型网站技术架构》读书笔记之六:永无止境之网站的伸缩性架构

≯℡__Kan透↙ 提交于 2019-12-03 23:18:28
http://www.cnblogs.com/edisonchou/ 《大型网站技术架构》读书笔记之六:永无止境之网站的伸缩性架构 此篇已收录至 《大型网站技术架构》读书笔记系列目录 贴,点击访问该目录可获取更多内容。 首先,所谓网站的伸缩性,指 不需要改变网站的软硬件设计,仅仅通过改变部署的服务器数量就可以扩大或者缩小网站的服务处理能力 。在整个互联网行业的发展渐进演化中,最重要的技术就是 服务器集群 ,通过不断地向集群中添加服务器来增强整个集群的处理能力。 一、网站架构的伸缩性设计 1.1 不同功能进行物理分离实现伸缩   (1)纵向分离:将业务处理流程上得不同部分分离部署,实现系统的伸缩性;   (2)横向分离:将不同的业务模块分离部署,实现系统的伸缩性; 1.2 单一功通过集群规模实现伸缩   使用服务器集群,即将相同服务部署在多台服务器上构成一个集群整体对外提供服务。具体来说,集群伸缩性又分为应用服务器集群伸缩性和数据服务器集群伸缩性。这两种集群对于数据状态管理的不同,技术实现也有很大的区别。  It is said that 当一头牛拉不动车的时候,不要去寻找一头更强壮的牛,而是用两头牛来拉车 。 二、应用服务器集群的伸缩性设计 2.1 应用服务器那点必须知道的事儿   (1)应用服务器应该被设计成 无状态 的,即应用服务器不存储请求上下文信息;构建集群后

FastDFS-分布式存储集群部署

家住魔仙堡 提交于 2019-12-03 23:07:15
什么是FastDFS? FastDFS是一个开源的轻量级分布式文件系统。它解决了大数据量存储和负载均衡等问题。特别适合以中小文件(建议范围:4KB < file_size < 500MB)为载体的在线服务,如相册网站、视频网站等等。 FastDFS架构 FastDFS的工作流程 上传文件 上传的流程: client询问tracker上传到的storage tracker返回一台可用的storage client直接和storage通信,完成文件上传 选择tracker server 集群中tracker之间是对等关系,client在上传文件时可以使用任意一个tracker 选择存储group 当tracker接收到上传文件的请求的时候,会为该文件分配一个可以存储的group。目前支持选择的group的规则有: Round robin,轮询 Sepcified group,上传的时候指定某个group Load balance,生成存储空间较多的group优先 选择storage server 当选定group后,tracker会在group内选择一个storage server给client,目前支持选择server的规则有: Round robin,轮询(默认) 根据IP地址进行排序,选择第一个服务器(IP地址最小者) 根据优先级进行排序,上传优先级由storage

SkyWalking 分布式追踪系统

爷,独闯天下 提交于 2019-12-03 13:57:00
随着微服务架构的流行,一些微服务架构下的问题也会越来越突出,比如一个请求会涉及多个服务,而服务本身可能也会依赖其他服务,整个请求路径就构成了一个网状的调用链,而在整个调用链中一旦某个节点发生异常,整个调用链的稳定性就会受到影响,所以会深深的感受到 “银弹” 这个词是不存在的,每种架构都有其优缺点 。 service map 面对以上情况, 我们就需要一些可以帮助理解系统行为、用于分析性能问题的工具,以便发生故障的时候,能够快速定位和解决问题,这时候 APM(应用性能管理)工具就该闪亮登场了。 目前主要的一些 APM 工具有: Cat、Zipkin、Pinpoint、SkyWalking,这里主要介绍 SkyWalking ,它是一款优秀的国产 APM 工具,包括了分布式追踪、性能指标分析、应用和服务依赖分析等。 下面是 SkyWalking 6.x 的架构图: 6.x architecture 说明: SkyWalking 的核心是数据分析和度量结果的存储平台,通过 HTTP 或 gRPC 方式向 SkyWalking Collecter 提交分析和度量数据,SkyWalking Collecter 对数据进行分析和聚合,存储到 Elasticsearch、H2、MySQL、TiDB 等其一即可,最后我们可以通过 SkyWalking UI 的可视化界面对最终的结果进行查看

【Zabbix】分布式监控系统Zabbix【一】

吃可爱长大的小学妹 提交于 2019-12-03 11:46:25
一.Zabbix功能及特性简介   Zabbix可以获取cpu,内存,网卡,磁盘,日志等信息   1.Zabbix数据收集方式:     a.Agent客户端(Agent客户端支持多平台部署)     b.如果是无法安装客户端的设备,例如网络设备,则可以通过SNMP(简单网络管理协议)获取监控数据     c.支持通过IPMI获取硬件的温度,风扇,硬盘,电源等     d.通过Zabbix自带的检测进行监控   2.Zabbix支持自定义监控:     可以通过shell,python,ruby等可执行的脚本收集监控数据   3.Zabbix可以通过监控对象的趋向判断是否可能会发生异常,从而可以做到预告警功能。   4.Zabbix拥有告警关联功能(防止海量的告警难以排查,它可以迅速关联到核心问题所在)   5.Zabbix安全和认证,它可以设置用户的权限,安全方面通过TLS传输信息,防止信息被窃听(TLS是SSL的升级版)   6.Zabbix自动化:     a.网络自动发现     b.Agent自动注册 二.Zabbix架构       三.Zabbix Server安装配置1 (二进制方式:centos7.5+zabbix4.4.1+pgsql12)   ①找到相应的zabbix镜像     1. 在 https://repo.zabbix.com/zabbix/4.4

分布式介绍

喜夏-厌秋 提交于 2019-12-03 10:12:11
随着互联网发展,网站的应用规模在不断的扩大,普通的单体应用不能满足需求,可能一处小小的修改就回导致一个应用的重新部署,而且也不能对付大流量的访问。 此时就可以像微服务一样,对网站的功能进行拆分,比如可以拆分出USER(用户模块),order(订单模块);当用户模块访问量很大时,可以把用户模块独立部署到1号机,2号机,3号机...同时来运行用户模块;1号机200并发,2号机200并发,3号机200并发,这样就一共有600了..;订单模块也可以进行相同的部署; 如果用户模块和订单模块需要数据交互,需要通过RPC(远程调用技术)来实现。以前是通过webservice接口来实现,但是太麻烦了;需要有RPC服务框架;再分布式系统中,国内常用zookeeper+dubbo组合,而Spring Boot推荐使用全栈的Spring(Spring Boot+Spring Cloud)。 当用户模块需要访问订单模块时,需要指定从订单模块1号机,还是2号机来访问...这时就需要注册中心,通过注册中心来判断选择那个。 此时需要用到的注册中心zookeeper 来源: https://www.cnblogs.com/huoxiansudi/p/11788007.html

hadoop伪分布式平台组件搭建

强颜欢笑 提交于 2019-12-03 09:53:06
第一部分:系统基础配置 系统基础配置中主完成了安装大数据环境之前的基础配置,如防火墙配置和安装MySQL、JDK安装等 第一步:关闭防火墙 Hadoop与其他组件的服务需要通过端口进行通信,防火墙的存在会阻拦这些访问,在初学阶段建议将防火墙全部 关闭,命令如下。 systemctl stop firewalld.service vi /etc/selinux/config # Selinux策略 SELINUX=disabled #更改为disabled关闭状态 第二步:安装JDK JDK安装包已经定制在环境当中的“/usr/local”目录中,直接使用即可 cd /usr/local/ rpm -ivh jdk-8u144-linux-x64.rpm java -version 第三步:安装MySQL 由于Hive数据仓库需要使用MySQL作为元数据库,所以在基础环境配置过程中我们需要安装MySQL安装过程如下 (1)安装mysql,命令如下。 wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm yum -y install mysql57-community-release-el7-10.noarch.rpm #安装MySQL服务器 yum -y install

hive基础操作

只愿长相守 提交于 2019-12-03 09:39:11
1、安装Hadoop Hive 运行在Hadoop之上。Hadoop是一个非常活跃的开源项目,其具有很多的发行版和分支。同时,很多的商业软件公司现在也在开发他们自己的Hadoop分支,有时会对某些组件进行个性化的增强或者替换。这种形式可以促进创新,但是同时也会产生潜在的混乱和兼容性问题。 2、本地模式、伪分布式模式和分布式模式 我们先阐明Hadoop的不同运行模式。我们前面默认的模式是本地模式,这种模式下使用的是本地文件系统。在本地模式下,当执行Hadoop job时(包含有大多数的Hive查询),Map task 和Reduce task在同一个进程中执行。 真实的集群配置都是分布式模式,其中所有没有默认完整URL指定的路径默认都是分布式文件系统中的路径,而且由JobTracker服务来管理job,不同的task在不同的进程中执行。 对于个人计算机工作 的开发者来说,一个进退两难的实际问题是,本地模式并不能真实的反映真实集群的行为状况,这个是测试程序需要记住的事情。为了解决这个需求,一台物理机可以配置在伪分布式模式下运行。这种模式下执行的行为和在分布式模式下的行为是一致的。也就是说,引用的文件系统默认为分布式文件系统,而且由JobTracker服务来管理Job,但是实际上只有一台物理机。因为hive中大多数工作是使用Hadoop中的job

【转】分布式之redis复习精讲

痴心易碎 提交于 2019-12-03 09:24:04
转自: https://www.cnblogs.com/rjzheng/p/9096228.html 引言 为什么写这篇文章? 博主的 《分布式之消息队列复习精讲》 得到了大家的好评,内心诚惶诚恐,想着再出一篇关于复习精讲的文章。但是还是要说明一下,复习精讲的文章偏面试准备,真正在开发过程中,还是脚踏实地,一步一个脚印,不要投机取巧。 考虑到绝大部分写业务的程序员,在实际开发中使用redis的时候,只会setvalue和getvalue两个操作,对redis整体缺乏一个认知。又恰逢博主某个同事下周要去培训redis,所以博主斗胆以redis为题材,对redis常见问题做一个总结,希望能够弥补大家的知识盲点。 复习要点? 本文围绕以下几点进行阐述 1、为什么使用redis 2、使用redis有什么缺点 3、单线程的redis为什么这么快 4、redis的数据类型,以及每种数据类型的使用场景 5、redis的过期策略以及内存淘汰机制 6、redis和数据库双写一致性问题 7、如何应对缓存穿透和缓存雪崩问题 8、如何解决redis的并发竞争问题 正文 1、为什么使用redis 分析 :博主觉得在项目中使用redis,主要是从两个角度去考虑: 性能 和 并发 。当然,redis还具备可以做分布式锁等其他功能,但是如果只是为了分布式锁这些其他功能,完全还有其他中间件(如zookpeer等

redis分布式锁

一个人想着一个人 提交于 2019-12-03 04:49:46
可靠性 首先,为了确保分布式锁可用,我们至少要确保锁的实现同时满足以下四个条件: 互斥性。在任意时刻,只有一个客户端能持有锁。 不会发生死锁。即使有一个客户端在持有锁的期间崩溃而没有主动解锁,也能保证后续其他客户端能加锁。 具有容错性。只要大部分的Redis节点正常运行,客户端就可以加锁和解锁。 解铃还须系铃人。加锁和解锁必须是同一个客户端,客户端自己不能把别人加的锁给解了。 上锁: ublic class RedisTool { private static final String LOCK_SUCCESS = "OK"; private static final String SET_IF_NOT_EXIST = "NX"; private static final String SET_WITH_EXPIRE_TIME = "PX"; /** * 尝试获取分布式锁 * @param jedis Redis客户端 * @param lockKey 锁 * @param requestId 请求标识 * @param expireTime 超期时间 * @return 是否获取成功 */ public static boolean tryGetDistributedLock(Jedis jedis, String lockKey, String requestId, int