06-分布式和集群

1.Hash算法

Hash算法在很多分布式集群产品中都有应⽤,⽐如分布式集群架构Redis、 Hadoop、 ElasticSearch,
Mysql分库分表, Nginx负载均衡等
普通Hash算法存在⼀个问题,以ip_hash为例,假定下载⽤户ip固定没有发⽣改变,现在tomcat3出现
了问题, down机了,服务器数量由3个变为了2个,之前所有的求模都需要重新计算。
⼀致性哈希算法
⾸先有⼀条直线,直线开头和结尾分别定为为1和2的32次⽅减1,这相当于⼀个地址,对于这样⼀条
线,弯过来构成⼀个圆环形成闭环,这样的⼀个圆环称为hash环。我们把服务器的ip或者主机名求
hash值然后对应到hash环上,那么针对客户端⽤户,也根据它的ip进⾏hash求值,对应到环上某个位
置,然后如何确定⼀个客户端路由到哪个服务器处理呢?按照顺时针⽅向找最近的服务器节点

一致性hash

假如将服务器3下线,服务器3下线后,原来路由到3的客户端重新路由到服务器4,对于其他客户端没有影响只是这⼀⼩部分受影响(请求的迁移达到了最⼩,这样的算法对分布式集群来说⾮常合适的,避免了⼤量请求迁移 )
但是,⼀致性哈希算法在服务节点太少时,容易因为节点分部不均匀⽽造成数据倾斜问题。例如系统中只有两台服务器,其环分布如下,节点2只能负责⾮常⼩的⼀段,⼤量的客户端请求落在了节点1上,这就是数据(请求)倾斜问题
为了解决这种数据倾斜问题,⼀致性哈希算法引⼊了虚拟节点机制,即对每⼀个服务节点计算多个
哈希,每个计算结果位置都放置⼀个此服务节点,称为虚拟节点。

2.分布式集群时钟同步

不同服务器时钟不一致,势必导致⼀系列问题。
解决方案(基于操作系统进行同步):

  • 分布式集群中各个服务器节点都可以连接互联⽹
  • 当分布式集群中某⼀个服务器节点可以访问互联⽹或者所有节点都不能够访问互联⽹时, 选取集群中的⼀个服务器节点A(172.17.0.17)作为时间服务器(整个集群时间从这台服务器同步,如果这台服务器能够访问互联⽹,可以让这台服务器和⽹络时间保持同步,如果不能就⼿动设置⼀个时间)
    集群中其他节点就可以从A服务器同步时间了

3. 分布式ID

使用分表时,需要使用分布式ID.
解决方案:

  1. uuid(可以使用)
  2. 独立数据库自增id
  3. 雪花算法
  4. 借助Redisde ncr命令获取全局唯一Id(推荐)

4. 分布式调度

定时任务与消息队列的区别

  • 共同点
  1. 异步处理
    ⽐如注册、下单事件
  2. 应⽤解耦
    不管定时任务作业还是MQ都可以作为两个应⽤之间的⻮轮实现应⽤解耦,这个⻮轮可以中转数据,当然单体服务不需要考虑这些,服务拆分的时候往往都会考虑
  3. 流量削峰
    双⼗⼀的时候,任务作业和MQ都可以⽤来扛流量,后端系统根据服务能⼒定时处理订单或者从MQ抓取订单抓取到⼀个订单到来事件的话触发处理,对于前端⽤户来说看到的结果是已经下单成功了,下单是不受任何影响的
  • 本质不同
    定时任务作业是时间驱动,⽽MQ是事件驱动;
    时间驱动是不可代替的,⽐如⾦融系统每⽇的利息结算,不是说利息来⼀条(利息到来事件)就算⼀下,⽽往往是通过定时任务批量计算;
    所以,定时任务作业更倾向于批处理, MQ倾向于逐条处理
    定时任务的实现方式:
    timer、线程、quartz、分布式调度框架Elastic-Job
    任务分片

5. Session共享(一致性)问题

客户端和服务端在某次会话中产⽣的数据不会被保留下来,所以第⼆次请求服务端⽆法认识到你曾经来过, Http为什么要设计为⽆状态协议?早期都是静态⻚⾯⽆所谓有⽆状态,后来有动态的内容更丰富,就需要有状态,出现了两种⽤于保持Http状态的技术,那就是Cookie和Session。

vmware安装centos
DVD版配置网络
redis安装
常用的linux命令
用管理员登录linux
编译redis报错
linux安装jdk1.8
linux安装jdk1.8
linux安装jdk1.8
上传文件到虚拟机
虚拟机克隆
安装nginx
yum命令无法使用
centos安装谷歌浏览器
windows安装tomcat
notepad++支持16进制
centos安装tomcat
centos安装nginx

作业遇到的坑:
1、打成war包后要加上项目路径才能正常访问,不然会出现404
2、要关掉防火墙
systemctl stop firewalld.service 关闭防火墙
3、nginx的配置不生效
./nginx -t:检测配置文件是否正常
./nginx -s reload:重新加载配置

你可能感兴趣的:(06-分布式和集群)