实现服务高可用奇淫技巧(一)

1. 前言

在上一篇通知文章有说过,六月份会开始更新公众号(当然一些好的文章我也会同步到博客中来,所以大家看到有些文章的内容和公众号中的是一样的),虽然现在已到月底了,但好歹也算没有失言,赶上了末班车了。

公众号中有很多读者留言,大家很期待能继续更新《RF接口自动化系列》文章,放心,牛奶会有的,面包也会有的,自己答应大家的,含泪也有完成的。

不过本篇仍不会更新《RF接口自动化系列》的文章,放心,后续会更新,敬请期待~

本篇会给大家介绍一下服务高可用的实现,大致也会分几篇文章进行讲解。

为什么突然会讲服务高可用,请看【背景】章节!

2. 背景

目前我们组内的主服务器docker主机(ubuntu系统),承载运行了我们组内(效率提升组)大部分对外提供的关键平台服务

先来看一张图吧

简单粗暴地画了一张精简图,从上图中直观地反映我们docker主机的一个简要架构图(如果你觉得真实部署架构也是如此简单, 那只能说明你还是太年轻了),用户访问我们的应用服务,如访问qa.xx.com应用服务(A),经过nginx代理,由nginx反向代理到实际应用服务A中。

这是常规应用部署最简单的单点结构,但作为这类关键服务节点,如果某天docker主机嗝屁了,那就意味着,所有运行在docker应用服务,就无法对外提供服务,可能有的人会说,这种情况,一般来说不会发生吧,好吧,前不久就发生的一宗因为机房中服务异常断电,重启后磁盘启动异常的案例。

所以就引出了本文,通过高可用的方案来解决应用单点部署当发生异常长时间无法对外提供服务的问题!

3. 高可用与负载均衡的区别

  • 高可用集群中的节点一般是一主一备,或者一主多备,通过备份提高整个系统可用性。
  • 而负载均衡集群一般是多主,每个节点都分担请求流量

4. 实现高可用的常用工具

  • ngnix
  • lvs (Linux虚拟服务器,是一个虚拟的服务器集群系统)
  • HAProxy(HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。)
  • keepalived(这里说的keepalived不是apache或者tomcat等某个组件上的属性字段,它也是一个组件,可以实现web服务器的高可用(HA high availably)。它可以检测web服务器的工作状态,如果该服务器出现故障被检测到,将其剔除服务器群中,直至正常工作后,keepalive会自动检测到并加入到服务器群里面。实现主备服务器发生故障时ip瞬时无缝交接。它是LVS集群节点健康检测的一个用户空间守护进程,也是LVS的引导故障转移模块(director failover)。Keepalived守护进程可以检查LVS池的状态。如果LVS服务器池当中的某一个服务器宕机了。keepalived会通过一 个setsockopt呼叫通知内核将这个节点从LVS拓扑图中移除。)

5. 高可用不能解决什么

高可用也就是大家常说的HA(High Availability),高可用的引入,是通过设计减少系统不能提供服务的时间,而不能保证系统可用性是能达到100%的!

6. 高可用实施中有哪些问题需要解决

高可用保证的原则是“集群化”,或者叫“冗余”:只有一个单点,挂了服务会受影响;如果有冗余备份,挂了还有其他backup能够顶上。

保证系统高可用,架构设计的核心准则是:集群。

有了集群之后,还不够,每次出现故障需要人工介入恢复势必会增加系统的不可服务实践。所以,又往往是通过“自动故障转移”来实现系统的高可用。

所以,实现高可用的两个关键点

  • 集群化
  • 自动故障转移
对于服务而言,一旦某个服务器宕机,就将服务切换到其他可用的服务器上;

对于数据而言,如果某个磁盘损坏,就从备份的磁盘(事先就做好了数据的同步复制)读取数据。

结合我们上图来看,要实现高可用的需要解决几个问题

1、服务集群化,需要增加服务物理机 (利用现有的服务机或者新增购买一台新的服务机,建议后者)

2nginx请求代理集群(请求入口需引入集群,否则应用服务有集群,nginx挂了,照样game over,所以需要解决如何让nginx可以集群,并能自动故障转移

3、应用服务集群(服务不能单点部署,需集群部署,一个服务提供者挂了,其它可以顶上,所以需要解决如何让应用服务可以集群,并且服务异常可自动故障转移)

4、实现集群后,需保证集群间持久数据层是能保持同步一致的(mysql db、mongo db)

5、应用服务器集群的Session管理。

7. 高可用架构实践方案

整个系统的高可用,其实就是通过每一层的集群(冗余)+自动故障转移来综合实现的。

正如上述在需要解决的问题中,提到的:

1、要解决【客户端层→反向代理层】的高可用:

【客户端层】到【反向代理层】的高可用,是通过反向代理层的集群(冗余)来实现的。以nginx为例:需要准备至少两台nginx,一台对线上提供服务,另一台冗余以保证高可用,常见的实践是keepalived存活探测,相同virtual IP提供服务。

【正常图】:

【其中一台nginx嗝屁了】:

自动故障转移:当nginx挂了的时候,keepalived能够探测到,会自动的进行故障转移,将流量自动迁移到另外一台nginx,由于使用的是相同的virtual IP,这个切换过程对调用方是透明的。

2、要解决【反向代理层→应用服务站点层】的高可用

【反向代理层】到【站点层】的高可用,是通过站点层的集群(冗余)来实现的。假设反向代理层是nginx,nginx.conf里能够配置多个web后端,并且nginx能够探测到多个后端的存活性。

【正常图】:

【其中一台站点服务嗝屁了】:

自动故障转移:当web-server服务站点挂了的时候,nginx能够探测到,会自动的进行故障转移,将请求自动迁移到其他的web-server,整个过程由nginx自动完成,对调用方是透明的。

3、虽然我们的服务应用,没有怎么用到了缓存,但还是想补充一个小章节说一下,【服务层】到【缓存层】的高可用

缓存层的数据集群有几种方式:第一种是利用客户端的封装,service对cache进行双读或者双写,也可以通过主从同步的缓存来解决缓存层的高可用问题。

以redis为例,redis天然支持主从同步,redis官方也有sentinel哨兵机制,来做redis的存活性检测。

【正常图】

【reids-Master嗝屁了】

自动故障转移:当redis主挂了的时候,sentinel能够探测到,会通知调用方访问新的redis,整个过程由sentinel和redis集群配合完成,对调用方是透明的。

注:实际小型业务对缓存并不一定有“高可用”要求,更多的对缓存的使用场景,是用来“加速数据访问”:把一部分数据放到缓存里,如果缓存挂了或者缓存没有命中,是可以去后端的数据库中再取数据的。(当然一些大型的流量平台除外)

4、【服务层>数据库层】的高可用

数据库层一般集群化都会采用了“主从同步,读写分离”架构,

以mysql为例,可以设置两个mysql双主同步,一台对线上提供服务,另一台冗余以保证高可用,常见的实践是keepalived存活探测,相同virtual IP提供服务。

【正常图】

【其中一台数据库嗝屁了】

自动故障转移:当其中一个数据库挂了的时候,keepalived能够探测到,会自动的进行故障转移,将流量自动迁移到shadow-mysql,由于使用的是相同的virtual IP,这个切换过程对调用方是透明的。

5、再来看看应用服务器集群的Session管理,在集群环境下,Session管理的几种常见手段:

  • Session复制:集群中的几台服务器之间同步Session对象,任何一台服务器宕机都不会导致Session对象的丢失,服务器也只需要从本机获取即可
  • Session绑定:利用负载均衡的源地址Hash算法,总是将源于同一IP地址的请求分发到同一台服务器上。即Session绑定在某台特定服务器上,保证Session总能在这台服务器上获取。(这种方案又叫做会话粘滞
  • Cookie记录Session:利用浏览器支持的Cookie记录Session。(所以需要保证服务集群间的域名一致来保证session id一致)

注:显然session复制和绑定不符合高可用的需求。因为一旦某台服务器宕机,那么该机器上得Session也就不复存在了,用户请求切换到其他机器后因为没有Session而无法完成业务处理。

》》未完待续《《

另外,打一个小广告,4月份与testerhome合作办了一个测试开发线下培训,我负责的课题持续集成建设与Docker容器化应用相关,目前课件对外特价优惠,感兴趣的同学可以私聊找我哦~

原文地址:https://www.cnblogs.com/jinjiangongzuoshi/p/9253278.html

时间: 2024-07-31 10:43:36

实现服务高可用奇淫技巧(一)的相关文章

ASP.NET Core 奇淫技巧之伪属性注入

原文:ASP.NET Core 奇淫技巧之伪属性注入 一.前言 开局先唠嗑一下,许久未曾更新博客,一直在调整自己的状态,去年是我的本命年,或许是应验了本命年的多灾多难,过得十分不顺,不论是生活上还是工作上.还好当我度过了所谓的本命年后,许多事情都在慢慢变好,我将会开始恢复更新博客,争取恢复到以前的速度上(因为工作比较忙,所以这个过程可能需要一段时间). 二.关于属性注入 说到属性注入,我们就不得不提一下 DI(Dependency Injection),即依赖注入,用过 ASP.NET Core

HAProxy+KeepAlived实现web服务高可用、动静分离等

大致规划: 主机 IP 描述 VIP 192.168.0.222 对外提供高可用IP haproxy+keepalived (node1) 192.168.0.111 haproxy为后端两台WEB服务的做动静分离:keepalived为haproxy做高可用. haproxy+keepalived (node2) 192.168.0.112 WEB                (node3) 192.168.0.113 提供静态请求响应 Apache+PHP+MySQL   (node4)

高可用集群技术之heartbeat+NFS实现web服务高可用(文本方式配置接口--gui图形配置)

一.高可用集群基本概念   什么是高可用技术呢?在生产环境中我既要保证服务不间断的服务又要保证服务器稳定不down机,但是异常还是会发生,比如说:服务器硬件损坏...导致服务器down机,我该如何保证服务器down机后继续提供服务呢?这时我就应该请出高可用技术来帮忙了,当我们的服务器发生故障后不能继续时,高可用集群技术解决将业务及服务自动转移至其他主机服务器上继续服务,保证服务架构不间断运行. 高可用集群的架构层次: 后端主机层: 这一层主要是正在运行在物理主机上的服务. 2.Message l

C之奇淫技巧——宏的妙用

一.宏列表 当遇到这样的问题的时候: 有一个标记变量,其中的每个位代表相应的含义.我们需要提供一组函数来访问设置这些位,但是对于每个标记位的操作函数都是相似的.若有32个位,难道要搞32套相似的操作函数么? 你也许会说,用一套操作函数,根据传入的参数来判断对哪个位操作.这样固然可行,但是 ①不够直观.例如访问Movable标记位,对于用户来说,is Movable()是很自然的方式,而我们只能提供这样的接口isFlag(Movable) ②扩展性差.若以后增加删改标记位,则需要更改isFlag等

网络服务高可用——双网卡绑定同一IP

很多时候,企业里面的一些关键型网络服务,不仅数据吞量相当大,而且还不允许随便离线的,所以就要求我们的网络服务一定要具有高可用性.数据吞吐量大,很多人就说了,这个简单,在我们的关键业务服务器上多装几张网卡,均衡流量负载也就可以了.但如果多网卡,多IP,不仅浪费了IP资源,更麻烦的事在客户访问的过程中如果出现了某张网卡离线的情况时,还需要重新连接另一IP的网卡才能继续会话,这是一件很头疼的事,有没有一个两全其美的办法了.有,其实操作起来也很简单,那么今天就给大家分享一下,如何实现双网卡绑定同一IP,

优化DP的奇淫技巧

DP是搞OI不可不学的算法.一些丧心病狂的出题人不满足于裸的DP,一定要加上优化才能A掉. 故下面记录一些优化DP的奇淫技巧. OJ 1326 裸的状态方程很好推. f[i]=max(f[j]+sum[i]-sum[j]-100*I) (1<=j<i&&f[j]>=100*i) 然后把无关于j的提出来. f[i]=max(f[j]-sum[j])+sum[i]-100*i; 好的,现在只需要把在O(1)的时间内求出max(f[j]-sum[j])就是坠吼得. 考虑两个决策

NGINX的奇淫技巧 —— 6. IF实现数学比较功能 (1)

NGINX的奇淫技巧 —— 6. IF实现数学比较功能 (1) ARGUS 1月13日 发布 推荐 0 推荐 收藏 3 收藏,839 浏览 nginx的if支持=.!= 逻辑比较, 但不支持if中 <.<.>=.<= 比较.本示例使用了set-misc-nginx-module location = /test/ { default_type html; set_random $a 0 9; #$a 随机 从0-9取 if ( $a <= 4 ){ #$a 如果 < 4

12个实用的 Javascript 奇淫技巧

这里分享12个实用的 Javascript 奇淫技巧.JavaScript自1995年诞生以来已过去了16个年头,如今全世界无数的网页在依靠她完成各种关键任务,JavaScript曾在Tiobe发布的编程语言排行榜中排到了第8名,紧随C#,JavaScript从过去装饰性的一种脚本语言转变为主流的编程语言,人们用它来开发更大更复杂的程序. 1. 取整同时转成数值型: '10.567890'|0 结果: 10 '10.567890'^0 结果: 10 -2.23456789|0 结果: -2 ~~

Heartbeat实现web服务高可用(三)

六:Heartbeat实现WEB服务高可用案例 6.1 部署准备 资源环境:继续使用我们之前已经部署好Heartbeat的两台服务器node01.cn和node02.cn,两台机器heartbeat是双主模式我们再捋一捋    node01.cn   eth0 172.10.25.26 外网管理IP                      eth1 10.25.25.16  心跳直连                      VIP  172.10.25.18        node02.cn