写在前面
虽然目前都是微服务,多机房、多实例部署,但难免还是会存在单点服务。例如写数据服务、登录服务、服务发现等,如何解决单点故障问题呢?
什么是单点故障
通常分布式系统采用主从模式,一个主机连接多个处理节点,主节点负责分发任务,而子节点负责处理业务,当主节点发生故障时,会导致整个系统发故障,我们把这种故障叫做单点故障。
- 数据库一般为了提升性能会做主从分离,写主库、读从库。为了保证数据一致性,主库一般是单点
- 登录服务只需要处理用户一次登录过程,一般也是单点服务。(当然也可以做成多实例,登录成功后共享登录信息)
- 服务发现。一般服务发现是一个单点服务,对调用方来说可能是一个ip或者字符串,服务发现拿到ip或者字符串后会通过记录的服务地址,按照负载均衡算法选择一个示例转发请求。这个作为服务发现的服务必须是单点的,调用方需要写死这个服务的ip
解决单点故障问题
多主节点
一般用2个或者更多的主节点,但是同时只有一个主节点可用,其他备用主节点正常情况下不会被使用到。备用节点会定期ping主节点,如果不通则通过算法从所有备用主节点中选择一个节点作为新的主节点顶上去。
单点服务常见容错机制
1、failover:失效转移
Fail-Over的含义为“失效转移”,是一种备份操作模式,当主要组件异常时,其功能转移到备份组件。其要点在于有主有备,且主故障时备可启用,并设置为主。
例如:Mysql的双Master模式,当正在使用的Master出现故障时,可以拿备Master做主使用
2、failback:失效自动恢复
Fail-over之后的自动恢复,在簇网络系统(有两台或多台服务器互联的网络)中,由于要某台服务器进行维修,需要网络资源和服务暂时重定向到备用系统。在此之后将网络资源和服务器恢复为由原始主机提供的过程,称为自动恢复。
例如:MySql的双Master模式,如果主Master故障,则failover至从Master;当主Master恢复之后,则自动切换至主Master。
3、failfast:快速失败
从字面含义看就是“快速失败”,尽可能的发现系统中的错误,使系统能够按照事先设定好的错误的流程执行,对应的方式是“fault-tolerant(错误容忍)”。
例如:以JAVA集合(Collection)的快速失败为例,当多个线程对同一个集合的内容进行操作时,就可能会产生fail-fast事件。当某一个线程A通过iterator去遍历某集合的过程中,若该集合的内容被其他线程所改变了;那么线程A访问集合时,就会抛出ConcurrentModificationException异常(发现错误执行设定好的错误的流程),产生fail-fast事件。
4、failsafe:失效安全
Fail-Safe的含义为“失效安全”,即使在故障的情况下也不会造成伤害或者尽量减少伤害。
例如:写入监控日志出错时,不会对主业务的成败产生影响。
参考
[1]有关单点问题的详解
[2]单点系统架构的可用性与性能优化