集群和分布式
1. 集群架构
多台服务器,做相同的事情。达到分担大量同一请求的目的。
集群优点:
高伸缩性:根据实际的需求和负荷,动态调整集群节点的规模。
高可用性:即使集群中的某个节点发生故障,整个系统不会因此不可用。(主从复制解决数据备份问题,哨兵机制解决监控管理问题)
高并发:解决大量同时同一请求访问。
Nginx负载均衡器:
接收一切用户请求。
配置了所有节点的服务地址信息。
将请求分发到不同的服务节点上。
2. 分布式架构
多台服务器,分别处理不同的事情。达到应对不同请求的目的。
分布式优点:
划分业务为多个子业务,分别处理不同的请求,提高效率。
3. 集群和分布式区别
集群中的各个节点,具有完全相同的功能。分布式中的各个节点,分别具有不同的功能。
集群只是一种物理形态,将同一个应用部署到多台同样的服务器上。
而分布式是一种工作方式,核心是各个服务器之间的协作。
集群解决了同一时间,大量相同请求的问题。分布式解决了不同请求的问题。
因此分布式+集群,可以解决同一时间,不同的大量请求问题。好的架构,就是先分布式,再集群。
注:微服务和分布式很相似,区别就是分布式是部署到不同服务器上,微服务可以部署到一台服务器上。
redis实现分布式锁
1. 分布式架构的一个问题?
如何确保同一时间,只有一个服务(进程),可以访问某个共享资源。=>使用互斥锁
(锁,就是拿到某个共享资源)
2. 哪个服务拿到了锁?如何告知其他服务?
锁信息,可以放在redis中,使得所有服务都能轻松访问。
3. 单个redis实现分布式锁?
使用set命令,一个服务使用set命令获取锁后,要么服务完成释放锁,要么超时,redis自动删除该锁。
会不会自己申请的锁,被其他服务释放?如何解决?
为了使得只有获取锁的服务才能释放锁,而不被其他服务释放锁。=>所有服务获取锁的key相同,但是获取value是个随机值,是各自服务独有的,这样在释放锁时,其他服务不能释放自己申请的锁。(key表示资源,就是被加锁对象)
总结:单个redis实现分布式锁,set时,value值设置成随机值,是各个服务独有的。
4. 如何解决单个redis存在单点故障问题?
使用主从复制?=>不可行,因为主从复制是异步的,服务在获取主节点的锁后,主节点还没将锁信息同步给从节点,就挂掉了。造成后面服务也能获取该锁,也就是多个服务同时获得一把锁。
方法:采用多个master结点,redlock算法。
服务获取锁时,会向N个master结点循环发送锁请求信息,因此需要设置N次。
当客户端服务获得一半以上的锁,且总消耗时间小于超时时间。那么认为该服务获得了该锁。