本文介绍了set模型。

一 提供海量服务时面对的场景

场景1:如何令黄村机房的TWS机器访问黄村机房的APP服务,避免TWS跨机房调用永丰机房的APP机器?

场景2:DB和Redis如何实现快慢分离,读写分离,加速读取速度,改善用户体验?

场景3:如何实现单节点错误不影响全局服务,防止单点失效造成全局服务挂掉?


场景4:如何实现用户暴增或业务增加导致的机器负载过高性能下降问题?

二 SET模型是什么

SET模型是在系统设计过程中,根据业务特征为进行规模化扩容或部署而建立的基础资源模型,一种工程化、规模化设备容量建设单位。SET模型的核心是用户模型、容量模型,其主要有以下三个特性:

1 高度标准化:充分考虑各种不同的环境以及场景,综合成本、效率多个方面的要求。

2 高度规格化:充分考虑适用环境的一些要求,提供有限种规格。

3 高度模块化:强调的是麻雀虽小五脏俱全

三 SET模型能做什么

3.1 有效防止故障扩散、单点失效

利用SET思想将一个服务按用户范围分成不同的小单元,每个小单元(SET)具备全部业务服务能力,当一个SET发生故障时候,只影响这一小部分用户从实现到有效防止故障扩散。

在带有容错机制的SET架构中,在SET之间增加容错处理,当一个SET发生故障时,使用类似一致性哈希的算法,调用方可以自动切换到下一个SET来存储,并且将新的位置记录在index上以实现高效容错。

3.2 实现海量服务的高效运营

SET模块就像一个集装箱,把各模块标准化、模块化、规模化,它为海量服务运营,特别是设备管理、网络架构,提供了宏观运营支撑框架,从而极大提高了海量服务运营效率。

以电商的SET模型为例,从接入层开始,数据开始sticky,按订单号路由,即按单号分SET,同一个SET尽可能在一个IDC 里,减少模块间调用的耗时,在同一个SET内,逻辑层任何一台机器,调用方可实时摘除,如果是数据层发生故障,先在接入层,把新产生的订单号屏蔽有故障对应的SET编号,比如,SET1 数据库出现故障,为了避免在故障的SET1 上继续产生新的支付请求,在订单生成器直接跳过SET1的单号规则,把新请求导入其它SET。只有未完成的订单会提示故障,稍后恢复阻止了故障引发的进一步恶化。在故障DB上的数据,通过备机与业务逻辑层的数据核对,完成数据一致性的修复。

3.3 应对用户及业务增加带来的服务压力

使用SET模型可以实现服务的动态伸缩,适应业务的增长。在微信手Q的后台服务框架中,相应的TWS请求APP服务时,我们使用SET模型服务以实现压力均分、同机房接入、动态增减APP服务器以实现业务变更需要、用户增长需要。

3.4 实现快慢分离、读写分离

使用SET模型可以方便的管理服务资源,有效实现服务的快慢分离,避免轻量级服务与重量级服务需求杂糅请求到同一服务点,高效避免了请求拥塞和拒绝服务的发生。

使用SET模型还可以做到读写分离,对DB或Redis的读写实施分离,以实现读写互不干扰、提高海量读取服务速度与质量的目标。

3.5 实际场景分享(微信和手Q如何使用SET模型容灾以确保高可用性)

首先是SET标准化。SET是标准业务部署模块,接入层、逻辑层和存储层标准化成不同的SET。

每个SET内都有固定数量的服务器和标准服务容量。譬如,上海XX接入SET设计容量XXX万用户,当前用户数为XXX万,离警戒水位还有XX%,XX小时后可进入扩容点。

SET都具有自动化部署能力,几百台服务器的SET部署时间小于10分钟。SET按单元分布在不同城市之间。每个重点城市都会部署许多套接入SET,逻辑SET和存储SET。

第三,SET间、城市间、区域间都具备全网调度能力。用户到接入SET的调度通过GLBS来切换,譬如接入SET会有许多个VIP,通过域名服务变更VIP就可以把用户请求从天津切到上海。

接入SET到逻辑SET,或逻辑SET到存储SET的访问则通过内部名字服务系统来切换。这样当任何一个IDC或某城市出现问题时,运维人员通过调度可以在几分钟内把流量切到正常的SET,甚至可以通过调度系统做到自动化切换。

第四,存储层的多地同步。存储层会在三地以上部署多套,譬如华南、华中和华北各部署一套存储SET。有写请求时先写华南SET,写成功后通过同步中心把数据同步到华中和华北SET,通过最终一致性保证数据保存在多地存储。数据在三地同步最长时间才几千毫秒,因此用户对数据的不一致基本无感知。

四 应用SET模型到实际项目

以【金手指项目】为例,本节将对上述模型应用进行列举介绍,并回答开始的四个问题

下图是项目整体的SET服务配置

4.1 TWS访问相同机房APP服务问题

使用SET模型服务可以很简单的实现同机房的服务调用,防止跨地域调用带来的各种问题,下图是IDC的APP服务机的SET配置

图中人为的将不同机房的机器进行SET划分,将APP机器划分为黄村、永丰、灰度机三个集合,对应的TWS机器也进行相应划分,如下图:

如此即可将不同机房的TWS对应不同机房的APP以实现服务调用,即TWS的SET0集合的黄村机器调用APP的SET0集合的黄村机器;TWS的SET1集合的永丰机器调用APP的SET1集合的永丰机器;TWS灰度机访问APP灰度机。下面两张图分别是机房的配置情况及同机房TWS访问相同位置APP的模型:

目前只有在异常情况或测试情况下才会配置TWS跨机房访问APP。

4.2 读写分离

应对DB、Redis的读写分离问题,可以将APP服务机划分为DB、Redis读访问机和写访问机两个服务组。

【金手指项目】中我们需要对DB进行读取和非读取划分,因此我们将APP划分为两组:DB访问组、DB隔离组,如下图:

上图所示APP机器无DB读取权限,仅用于接收TWS用户获取已生成数据的请求;

上图所示APP机器有DB读取权限,用于接收管理端、Daemon端的生成规则关键词请求,该请求需要访问数据库获取黑名单、规则详情等信息,并生成规则下关键词以存储或返回管理端。

上述DB权限不同的服务被被调程序分别调用以实现相应服务,将两个权限组的机器再进行地区SET划分:SET0是黄村机房机器,SET1是永丰机房机器,SET2是灰度机,以实现区域隔离,加速访问效率。下图是对应请求服务的TWS机器的SET划分。

4.3 实现容错、预防单点失效

根据上述图表,每个SET有至少一个以上机器可供使用,SET中设置多机器即可实现不同TWS对应APP的SET中的不同机器获取服务,以防止单台服务机失效问题

4.4 应对业务变化、用户增加

对于业务变化问题,如图所示

项目后期,由于IDC机器不能根据域名访问相应JSS机器拉取数据,根据需要增加了HTTP服务SET,如图橙色和浅紫色所示,使用该服务可以令相应APP机器访问JSS服务器82号机。

对于用户增加业务增加问题,我们也可以相同的增加相应服务SET或增加SET中的机器数量以适应业务变更,同样的当活动结束需求降低,可以摘除部分SET内的机器或整体摘除服务。

4.5 关于监听端口

SET集合的端口是用于被调的,即该端口用于监听并提供来自于该端口的请求服务,因此APP的SET集合的端口应该向上级申请,并实现绝对独立,而TWS不用于向APP提供服务,所以其监听端口无用,但是该端口号不能重合现有服务,防止其阻塞TWS正常服务的监听。

4.6 写在最后

其实SET模型只是一种解耦、内聚的思想,用于方便操作和业务需要,应该因地制宜的使用,就如上图的Daemon服务机SET组,仅用于Daemon服务调用单台机器以实现每天刷新当天最新数据。

本文介绍了set模型。

一 提供海量服务时面对的场景

场景1:如何令黄村机房的TWS机器访问黄村机房的APP服务,避免TWS跨机房调用永丰机房的APP机器?

场景2:DB和Redis如何实现快慢分离,读写分离,加速读取速度,改善用户体验?

场景3:如何实现单节点错误不影响全局服务,防止单点失效造成全局服务挂掉?


场景4:如何实现用户暴增或业务增加导致的机器负载过高性能下降问题?

二 SET模型是什么

SET模型是在系统设计过程中,根据业务特征为进行规模化扩容或部署而建立的基础资源模型,一种工程化、规模化设备容量建设单位。SET模型的核心是用户模型、容量模型,其主要有以下三个特性:

1 高度标准化:充分考虑各种不同的环境以及场景,综合成本、效率多个方面的要求。

2 高度规格化:充分考虑适用环境的一些要求,提供有限种规格。

3 高度模块化:强调的是麻雀虽小五脏俱全

三 SET模型能做什么

3.1 有效防止故障扩散、单点失效

利用SET思想将一个服务按用户范围分成不同的小单元,每个小单元(SET)具备全部业务服务能力,当一个SET发生故障时候,只影响这一小部分用户从实现到有效防止故障扩散。

在带有容错机制的SET架构中,在SET之间增加容错处理,当一个SET发生故障时,使用类似一致性哈希的算法,调用方可以自动切换到下一个SET来存储,并且将新的位置记录在index上以实现高效容错。

3.2 实现海量服务的高效运营

SET模块就像一个集装箱,把各模块标准化、模块化、规模化,它为海量服务运营,特别是设备管理、网络架构,提供了宏观运营支撑框架,从而极大提高了海量服务运营效率。

以电商的SET模型为例,从接入层开始,数据开始sticky,按订单号路由,即按单号分SET,同一个SET尽可能在一个IDC 里,减少模块间调用的耗时,在同一个SET内,逻辑层任何一台机器,调用方可实时摘除,如果是数据层发生故障,先在接入层,把新产生的订单号屏蔽有故障对应的SET编号,比如,SET1 数据库出现故障,为了避免在故障的SET1 上继续产生新的支付请求,在订单生成器直接跳过SET1的单号规则,把新请求导入其它SET。只有未完成的订单会提示故障,稍后恢复阻止了故障引发的进一步恶化。在故障DB上的数据,通过备机与业务逻辑层的数据核对,完成数据一致性的修复。

3.3 应对用户及业务增加带来的服务压力

使用SET模型可以实现服务的动态伸缩,适应业务的增长。在微信手Q的后台服务框架中,相应的TWS请求APP服务时,我们使用SET模型服务以实现压力均分、同机房接入、动态增减APP服务器以实现业务变更需要、用户增长需要。

3.4 实现快慢分离、读写分离

使用SET模型可以方便的管理服务资源,有效实现服务的快慢分离,避免轻量级服务与重量级服务需求杂糅请求到同一服务点,高效避免了请求拥塞和拒绝服务的发生。

使用SET模型还可以做到读写分离,对DB或Redis的读写实施分离,以实现读写互不干扰、提高海量读取服务速度与质量的目标。

3.5 实际场景分享(微信和手Q如何使用SET模型容灾以确保高可用性)

首先是SET标准化。SET是标准业务部署模块,接入层、逻辑层和存储层标准化成不同的SET。

每个SET内都有固定数量的服务器和标准服务容量。譬如,上海XX接入SET设计容量XXX万用户,当前用户数为XXX万,离警戒水位还有XX%,XX小时后可进入扩容点。

SET都具有自动化部署能力,几百台服务器的SET部署时间小于10分钟。SET按单元分布在不同城市之间。每个重点城市都会部署许多套接入SET,逻辑SET和存储SET。

第三,SET间、城市间、区域间都具备全网调度能力。用户到接入SET的调度通过GLBS来切换,譬如接入SET会有许多个VIP,通过域名服务变更VIP就可以把用户请求从天津切到上海。

接入SET到逻辑SET,或逻辑SET到存储SET的访问则通过内部名字服务系统来切换。这样当任何一个IDC或某城市出现问题时,运维人员通过调度可以在几分钟内把流量切到正常的SET,甚至可以通过调度系统做到自动化切换。

第四,存储层的多地同步。存储层会在三地以上部署多套,譬如华南、华中和华北各部署一套存储SET。有写请求时先写华南SET,写成功后通过同步中心把数据同步到华中和华北SET,通过最终一致性保证数据保存在多地存储。数据在三地同步最长时间才几千毫秒,因此用户对数据的不一致基本无感知。

四 应用SET模型到实际项目

以【金手指项目】为例,本节将对上述模型应用进行列举介绍,并回答开始的四个问题

下图是项目整体的SET服务配置

4.1 TWS访问相同机房APP服务问题

使用SET模型服务可以很简单的实现同机房的服务调用,防止跨地域调用带来的各种问题,下图是IDC的APP服务机的SET配置

图中人为的将不同机房的机器进行SET划分,将APP机器划分为黄村、永丰、灰度机三个集合,对应的TWS机器也进行相应划分,如下图:

如此即可将不同机房的TWS对应不同机房的APP以实现服务调用,即TWS的SET0集合的黄村机器调用APP的SET0集合的黄村机器;TWS的SET1集合的永丰机器调用APP的SET1集合的永丰机器;TWS灰度机访问APP灰度机。下面两张图分别是机房的配置情况及同机房TWS访问相同位置APP的模型:

目前只有在异常情况或测试情况下才会配置TWS跨机房访问APP。

4.2 读写分离

应对DB、Redis的读写分离问题,可以将APP服务机划分为DB、Redis读访问机和写访问机两个服务组。

【金手指项目】中我们需要对DB进行读取和非读取划分,因此我们将APP划分为两组:DB访问组、DB隔离组,如下图:

上图所示APP机器无DB读取权限,仅用于接收TWS用户获取已生成数据的请求;

上图所示APP机器有DB读取权限,用于接收管理端、Daemon端的生成规则关键词请求,该请求需要访问数据库获取黑名单、规则详情等信息,并生成规则下关键词以存储或返回管理端。

上述DB权限不同的服务被被调程序分别调用以实现相应服务,将两个权限组的机器再进行地区SET划分:SET0是黄村机房机器,SET1是永丰机房机器,SET2是灰度机,以实现区域隔离,加速访问效率。下图是对应请求服务的TWS机器的SET划分。

4.3 实现容错、预防单点失效

根据上述图表,每个SET有至少一个以上机器可供使用,SET中设置多机器即可实现不同TWS对应APP的SET中的不同机器获取服务,以防止单台服务机失效问题

4.4 应对业务变化、用户增加

对于业务变化问题,如图所示

项目后期,由于IDC机器不能根据域名访问相应JSS机器拉取数据,根据需要增加了HTTP服务SET,如图橙色和浅紫色所示,使用该服务可以令相应APP机器访问JSS服务器82号机。

对于用户增加业务增加问题,我们也可以相同的增加相应服务SET或增加SET中的机器数量以适应业务变更,同样的当活动结束需求降低,可以摘除部分SET内的机器或整体摘除服务。

4.5 关于监听端口

SET集合的端口是用于被调的,即该端口用于监听并提供来自于该端口的请求服务,因此APP的SET集合的端口应该向上级申请,并实现绝对独立,而TWS不用于向APP提供服务,所以其监听端口无用,但是该端口号不能重合现有服务,防止其阻塞TWS正常服务的监听。

4.6 写在最后

其实SET模型只是一种解耦、内聚的思想,用于方便操作和业务需要,应该因地制宜的使用,就如上图的Daemon服务机SET组,仅用于Daemon服务调用单台机器以实现每天刷新当天最新数据。

【海量之道】海量之道之SET模型的更多相关文章

  1. (面试)Hash表算法十道海量数据处理面试题

    Hash表算法处理海量数据处理面试题 主要针对遇到的海量数据处理问题进行分析,参考互联网上的面试题及相关处理方法,归纳为三种问题 (1)数据量大,内存小情况处理方式(分而治之+Hash映射) (2)判 ...

  2. 十道海量数据处理面试题 - 数据分析与数据挖掘技术-炼数成金-Dataguru专业数据分析社区

    1.海量日志数据,提取出某日访问百度次数最多的那个IP. 首先是这一天,并且是访问百度的日志中的IP取出来,逐个写入到一个大文件中.注意到IP是32位的,最多有个2^32个IP.同样可以采用映射的方法 ...

  3. 海量数据挖掘MMDS week4: 推荐系统之隐语义模型latent semantic analysis

    http://blog.csdn.net/pipisorry/article/details/49256457 海量数据挖掘Mining Massive Datasets(MMDs) -Jure Le ...

  4. hadoop面试100道收集(带答案)

    1.列出安装Hadoop流程步骤 a) 创建hadoop账号 b) 更改ip c) 安装Java 更改/etc/profile 配置环境变量 d) 修改host文件域名 e) 安装ssh 配置无密码登 ...

  5. july教你如何迅速秒杀掉:99%的海量数据处理面试题

    作者:July出处:结构之法算法之道blog 以下是原博客链接网址 http://blog.csdn.net/v_july_v/article/details/7382693 微软面试100题系列 h ...

  6. 【Java】几道常见的秋招面试题

    前言 只有光头才能变强 Redis目前还在看,今天来分享一下我在秋招看过(遇到)的一些面试题(相对比较常见的) 0.final关键字 简要说一下final关键字,final可以用来修饰什么? 这题我是 ...

  7. 海量数据处理面试题学习zz

    来吧骚年,看看海量数据处理方面的面试题吧. 原文:(Link, 其实引自这里 Link, 而这个又是 Link 的总结) 另外还有一个系列,挺好的:http://blog.csdn.net/v_jul ...

  8. 海量数据处理的 Top K 相关问题

    Top-k的最小堆解决方法 问题描述:有N(N>>10000)个整数,求出其中的前K个最大的数.(称作Top k或者Top 10) 问题分析:由于(1)输入的大量数据:(2)只要前K个,对 ...

  9. 添加了有道生词本的 chrome google翻译扩展和有道翻译扩展

    在chrome发布项目,需要先花美金认证,还得要美国ID,无奈. 直接上源码,需手动导入. 原始项目源码并未开源,个人是从chrome本地文件里拿出来的,拓展来的,侵删(本来想着自已写一个,业余时间, ...

  10. 项目管理软件之争,禅道和JIRA大对比

    本文摘要: 一. 产品介绍 二. 界面设计 1. 界面颜色设计 2. 布局结构 三. 功能区别 四. 价格对比 五. 后期服务 六. 优缺点 七. 总结 说到项目管理软件,不得不提的是禅道和JIRA. ...

随机推荐

  1. 第3章 如何编写函数定义 3.7 if特殊表

    这部分来学习下if特殊表,之前学了defun和let,不好意思,博客中没有写但是鄙人已经看了,哈哈. 什么是if表 if条件特殊表是为了让计算机对条件加以判断,然后选择不同的执行路径的. if特殊表的 ...

  2. 【Python+selenium】之奇怪问题总结

    问题1: <_io.TextIOWrapper name='<stderr>' mode='w' encoding='UTF-8'> Time Elapsed: 0:00:04 ...

  3. 有关于__align(n) ,内存对齐

    __align __align 关键字指示编译器在 n 字节边界上对齐变量. __align 是一个存储类修饰符.它不影响函数的类型. 语法 __align(n) 其中: n 是对齐边界. 对于局部变 ...

  4. ios - 使用@try、catch捕获异常:

    @try { // 可能会出现崩溃的代码 } @catch (NSException *exception) { // 捕获到的异常exception } @finally { // 结果处理 }

  5. 关于IIS上Yii2的Url路由美化

    Yii2默认的路由是酱紫的 http://.../admin/web/index.php?r=site/login 心中理想的美化Url应该这样  http://.../admin/web/site/ ...

  6. EasyDSS流媒体解决方案实现的RTMP/HLS视频直播、直播鉴权(如何完美将EasyDSS过渡到新版)

    上一篇博文介绍了EasyDSS点播功能,然后作为RTMP流媒体服务器,接受RTMP推流.进行实时的直播流分发又是自身一大核心功能. 需求背景: 写本篇博文的一个目的是向大家介绍一下EasyDSS新版的 ...

  7. URAL 1010 Discrete Function【简单暴力】

    链接:  http://acm.timus.ru/problem.aspx?space=1&num=1010 http://acm.hust.edu.cn/vjudge/contest/vie ...

  8. 关于UIView的hitTest:withEvent:方法的理解

    闲来无事 观摩别人的项目 常常发现对UIView的hitTest:withEvent:方法的重写,以前也查过这个方法的用法作用,但是时间一长又忘记了.今天再次看到,就记录一下. 用户触摸屏幕后事件的传 ...

  9. 洛谷P3943 星空

    洛谷P3943 星空 题目背景 命运偷走如果只留下结果, 时间偷走初衷只留下了苦衷. 你来过,然后你走后,只留下星空. 题目描述 逃不掉的那一天还是来了,小 F 看着夜空发呆. 天上空荡荡的,没有一颗 ...

  10. linux c编程:进程控制(二)_竞争条件

    前面介绍了父子进程,如果当多个进程企图对共享数据进行处理.而最后的结果又取决于进程运行的顺序时,就认为发生了竞争关系.通过下面的例子来看下 在这里标准输出被设置为不带缓冲的,于是父子进程每输出一个字符 ...