阅读更多

1顶
0踩

开源软件

原创新闻 系统运维

2017-04-24 09:21 by 见习记者 zhangll123 评论(0) 有6908人浏览
1       前言

 

1.1   从一次系统改造谈灰度

公司开办之初,为了能够快速实现公司的战略,就从市场上选购了一套系统,进行了外包方式的合作,这也是大多数公司创业的捷径。随着公司的快速发展,公司组建了自己的研发团队,对现有的系统进行重构变得尤为迫切。同样面临的问题是:领导对时间要求紧迫、研发对现有系统摸不透、做到数据的兼容性,基于这样的要求就必须做到系统上线采用灰度的方式,指定忠实用户进行线上测试、选取有特征的群体进行线上测试和基于流量切换的方式进行线上测试等。

在上面的需求推动下,本人对灰度进行了一次重新的构思。在之前的工作中也都涉及到灰度,当时觉得这都应该是大公司运维的事儿,现在想想这不但是大公司的事儿,更是一个快速发展中的公司应该重视的事儿,尤其是对于互联网公司。

互联网产品有一个特点,就是不停的升级,升级,再升级。一般采用敏捷开发的团队,基本上保持每周一次的发布频率,系统升级总是伴随着风险,新旧版本兼容的风险,用户使用习惯突然改变而造成用户流失的风险,系统down机的风险.....为了避免这些风险,很多产品都采用了灰度发布的策略,其主要思想就是把影响集中到一个点,然后再发散到一个面,出现意外情况后很容易就回退,即使影响也是可控的。

 

1.2   传统系统发布

在百度上搜索了一下:灰度发布是指在黑与白之间,能够平滑过渡的一种发布方式。AB test就是一种灰度发布方式,让一部分用户继续用A,一部分用户开始用B,如果用户对B没有什么反对意见,那么逐步扩大范围,把所有用户都迁移到B上面来。灰度发布可以保证整体系统的稳定,在初始灰度的时候就可以发现、调整问题,以保证其影响度。

在飞速发展的互联网公司,灰度其实就是根据设定的规则将请求路由到我们的灰度版本(灰度机器)上来。比如对于API来说,一般有如下几个需求:特定用户(比如测试帐号)、 特定的App(比如测试app或者合作App)、特定的模块、接口(只有某些接口需要灰度,这种一般是API Container的修改,拿一些不是很重要的API做灰度测试)、特定的机器(某些请求IP转发到灰度机)等。

在传统软件产品发布过程中(例如微软的Windows 7的发布过程中),一般都会经历Pre-Alpha、Alpha、Beta、Release candidate(RC)、RTM、General availability or General Acceptance (GA)等几个阶段(参考Software release life cycle)。可以看出传统软件的发布阶段是从公司内部->外部小范围测试>外部大范围测试->正式发布,涉及的用户数也是逐步放量的过程。

 

1.3   灰度发布能够解决的问题

我们公司是一个互联网公司,不过为了保障系统上线的可靠性,也是一样,每次系统的上线都是经过开发、site、test、bate、生产的多个过程。当程序员和测试人员信心满满的要将系统推到线上的时候,可能因为一个小小的配置导致系统的线上故障,风险不可预估。

每一次产品发布,交到用户手中的时候却不知道这次的产品设计是否能够给用户带来更好的体验,不能指定特殊人群,优先对新的产品进行线上的验证和体验。

       基于如上的问题联想灰度可以解决的问题:

1、    在发布过程中降低上线风险

2、    降低影响范围,并且范围可控

3、    降低对测试的依赖,减少线下自测的数据构造成本

4、    特定的请求能够指向特定的服务器,方便集中监控日志,方便跟踪完整的调用链路

5、    方便系统流量切入

6、    方便回滚

7、    指定特定人群,方便系统回访,方便产品需求收集,完善产品功能,提升产品质量

8、    在无状态的情况下保障用户使用到的版本一致

9、    避免停服给用户带来坏的体验用

 

2       思考

要能解决上面提到的问题有多重方式,不同公司有不同的实现方式。作为一个开源的灰度系统就要 考虑到对业务无侵入,方便升级和配置。

有很多公司实现灰度是基于多部署一套灰度环境作为灰度发布的场景,这样在某些层面是可以达到灰度的手段,但是前端入口配置杂乱,不易于维护,同时不能保障线上系统的配置和灰度系统相同,环境也可能存在差别,存在上线的风险。

开发一套灰度系统就变得尤为重要,尤其是对于小公司,没有精力去做也就无法保障系统上线的平稳。本人也是出于这种冲动,写下了一套灰度系统,将其开源出来,希望能够为小公司提供一种解决方案,希望能够作为大公司灰度更好参考。

 

3       系统设计

本系管理统主要采用java技术开发,服务端主要用到了spring+springmvc+mybatis+dubbo,前端采用easyui;数据库采用mysql;灰度引擎当前采用java和lua两种技术开发。

项目代码:http://git.oschina.net/xiaoleiziemail/gray

 

3.1   设计目标

1、  能够解决上面提到的问题

2、  做到系统的灵活配置

3、  做到系统不牵涉业务

4、  做到对原有系统无侵入性

 

 

3.2   应有功能

 

 

3.3   整体设计

灰度系统主要分为管控和引擎两大块。管理用户通过管理端对灰度策略和白名单等进行管理,用户请求经过不同的灰度引擎进行智能路由。

 

4       管控平台

 

4.1   灰度管理

 

4.1.1   白名单分组

 

 

4.1.2   白名单管理

 

 

4.1.3   策略管理

 

 

4.1.4   应用管理

 

 

4.1.5   应用服务

 

 

4.1.6   应用灰度

 

 

4.1.7   服务灰度

 

 

4.2   日志监控

 

 

 

4.3   权限管理

 

 

 

5       灰度引擎

目前实现了两种接入方式的引擎,http接入采用lua开发,基于nginx进行灰度,dubbo接入方式采用java开发,选用灰度的负载均衡实现灰度。

 

5.1   Http接入

主要是针对Http入口的应用进行灰度,在应用前端配置nginx负载,在负载的过程中根据相应的策略进行灰度选择和请求转发。

http请求的入口都在nginx上,nginx会根据location的配置进行uri的选择。此时请求数据会判断当前应用是否已经开启灰度,再次判断是应用级别的灰度还是服务级别的灰度,然后根据管控平台配置的灰度策略进行灰度,当前支持白名单、小流量、正则表达式,后续会完善业务域、权重、ip段、地域等。

管控平台会调用引擎管理执行相应的指令,进行关闭、开启、更新策略和白名单数据等,每次nginx重新reload和重启时会从灰度管理系统调用接口读取配置应用的信息,加入缓存。

为了提升性能,应用的基本信息、灰度策略、白名单等数据缓存在nginx开辟的共享内存块中,nginx的每个worker进程都共享此数据,在引擎管理的操纵下进行缓存数据的更新。

 

5.2   Dubbo接入

根据规则在dubbo的入口处选择, dubbo-consumer实现不同的负载均衡,在负载的时候进行白名单校验和策略选择。系统对灰度管控平台非强制依赖,管控平台出现问题不影响系统正常运行。

 

1.         缓存负载策略

在系统启动的时候要根据系统配置拉取灰度策略,并且保存在内存中,定时获取最新的负载策略,需要提供及时触发的策略更新接口。

2.         白名单更新

在系统启动的时候要根据系统配置拉取白名单,并且保存在内存中,定时获取最新的白名单,需要提供及时触发的白名单更新接口。

3.         负载均衡引擎

在系统上线之前选择运行时使用的负载均衡引擎,可提供按照小流量、白名单等方式。

4.         系统配置

系统在上线前需要录入管控平台,并且完成相应的配置,在启动的时候作为唯一标识能够拉取相应的配置。

5.         监控和统计

系统在内存中缓存统计信息,定时上传管控平台,监控出现问题不影响系统正常使用(暂无实现)。

 

6       畅想未来

1、  丰富灰度策略,比如按照地域进行灰度等

2、  实现基于MQ、Schedule等多重接入方式的灰度

3、  实现用户数据的收集

4、  实现用户请求的链路监控

5、  提供运营和运维的开放式接口,提升运营手段,降低运营成本

6、  实现基于docker和灰度系统的全新测试环境

1
0
评论 共 0 条 请登录后发表评论

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • oracle数据库学习计划

    第一部分 sq l 基础 基本查询语句、DDL 和 DML 语句 第二部分 pl/sq l 基础 匿名块的编写、编写程序 第三部分 数据库的体系结构 实例的维护、控制文件、日志文件、数据文件、表空间、数据库的逻辑结构、undo 段的管理、表—存储数据的最基本单元、索引、约束的管理、Profile 配置、权限管理、数据库字符集、元数据 第四

  • oracle数据库inactive状态session过多的原因定位

    新功能上线后,数据库告警,session连接接近最大值,有耗尽的风险。 开始定位解决这个风险问题,首先查看这些连接都在执行什么sql select sql_text,se.* from v$sql s, v$session se where se.prev_hash_value=s....

  • 杀掉oracle中的inactive连接,oracle inactive死连接

    oracle 连接通常分为三种Active 表明当前连接的session正在进行处理, inactive 表明当前连接正在等待进行处理(不是通常理解上的执行完毕) 如何处理inactive 连接,防止过多占用资源,因为inactive 通常是由应用程序...

  • Oracle中session定期清理空闲连接

    参考资料:ORACLE会话连接进程三者总结 ORACLE快速彻底Kill掉的会话 session状态说明 会话有ACTIVE、INACTIVE、KILLED、CACHED、SNIPED五个状态,一般比较常见的有ACTIVE、INACTIVE、KILLED三个状态。 ACTIVE ...

  • Oracle session连接数和inactive的问题记录

    从上周起,服务器Oracle数据库出现问题,用不到半天,就会报maxsession(150)的问题,肯定... 处理方式不外乎两种:扩大oracle最大session数以及清除inactive会话,当然还有,就是从数据库连接池和程序bug上面下手。

  • oracle长时间连接的session,Oracle SNIPED状态的session 多长时间自动清理释放连接?...

    本帖最后由 bfc99 于 2015-9-18 11... select USERNAME,status,count(*) from v$session group by USERNAME,status order by 3;USERNAME ...我觉得你的理解上可能有错误。以下是我对这个问题的认识和理解(我没有实际...

  • oracle数据库连接池连接失败,Oracle数据库连接池频繁出现ORA-02399错误

    ORA-02399具体错误信息为ORA-02399: exceede maximum connect time, you are being logged off大概含义为:超过了最大连接时间,你被强行登出出现原因首先看一下Oracle CONNECT_TIME参数是多少SELECT * FROM DBA_...

  • oracle数据库连接池查看(转载)

    oracle数据库连接池查看 select username , count(*), machine from v$session where username is not null group by username, machine order by username; select sid, machine, LAST_CALL_ET, PROGRAM, prev_...

  • oracle连接数释放,Oracle连接数过多释放机制

    处理方式不外乎两种:扩大oracle最大session数以及清除inactive会话,当然还有,就是从数据库连接池和程序bug上面下手。 从各处收集了一些查看当前会话的语句,记录一下: 1.select count(*) from v$session; ...

  • oracle连接池中间件,【关于中间件连接池与数据库的session 问题以及inactive session 的问题!!】-Oracle论坛-ZOL中关村在线...

    今天查数据库, 有400多个INACTIVE 的 JDBCDEDICATED 连接,22038 2008/12/14 10:44:42 813 JDBC Thin Client INACTIVE 284029 49751722048 ...

  • oracle 空闲连接数_Oracle查询session连接数和inactive以及 概要文件IDLE_TIME限制用户最大空闲连接时间...

    -----############oracle会话和进程################----------------查询会话总数select count(*) from v$session;--查询进程总数select count(*) from v$process;--查询哪些应用的连接数此时是多少select b....

  • oracle数据库连接满了,ORACLE数据库连接数满的分析及优化

    2.若使用了数据库连接池,则考虑连接池的超时设置。从数据库本身来看:1.可以增加数据库的最大连接数;2.可以定时清理数据库中INACTIVE的会话。查看Oracle连接数:select b.MACHINE, b.PROGRA...

  • Oracle session连接数和inactive的问题记录(清除方法)

    从上周起,服务器Oracle数据库出现问题,用不到半天,就会报maxsession(150)的问题,...处理方式不外乎两种:扩大oracle最大session数以及清除inactive会话,当然还有,就是从数据库连接池和程序bug上面下手。 从

  • oracle mysql连接池_oracle数据库连接池查看

    Select count(*) from v$session where status='ACTIVE' ;COUNT(*)----------20SQL> Select count(*) from v$session;COUNT(*)----------187SQL> show parameter processes;NAME TYPE VALUE----------...

  • Oracle查询session连接数和inactive

    服务器Oracle数据库出现问题,用不到半天,就会报maxsession(150)的问题,肯定是... 处理方式不外乎两种:扩大oracle最大session数以及清除inactive会话,当然还有,就是从数据库连接池和程序bug上面下手。  从

  • 养老院管理系统:SpringBoot与Vue前后端不分离架构的设计与实现

    内容概要:本文详细介绍了基于SpringBoot和Vue开发的养老院管理系统的具体实现细节。该系统采用前后端不分离的架构,旨在快速迭代并满足中小项目的开发需求。文中涵盖了多个关键技术点,如数据库设计(组合唯一约束、触发器)、定时任务(@Scheduled、@Async)、前端数据绑定(Vue的条件渲染和动态class绑定)、权限控制(RBAC模型、自定义注解)以及报表导出(SXSSFWorkbook流式导出)。此外,还讨论了开发过程中遇到的一些常见问题及其解决方案,如CSRF防护、静态资源配置、表单提交冲突等。 适合人群:具备一定Java和前端开发经验的研发人员,尤其是对SpringBoot和Vue有一定了解的开发者。 使用场景及目标:适用于需要快速开发中小型管理系统的团队,帮助他们理解如何利用SpringBoot和Vue进行全栈开发,掌握前后端不分离架构的优势和注意事项。 其他说明:文章不仅提供了详细的代码示例和技术要点,还分享了许多实用的小技巧和避坑指南,有助于提高开发效率和系统稳定性。

  • 家族企业如何应对人才流失问题?.doc

    家族企业如何应对人才流失问题?

  • 员工关怀制度.doc

    员工关怀制度.doc

  • 路径规划领域中基于排序搜索的蚁群算法优化及其应用

    内容概要:本文详细探讨了对传统蚁群算法进行改进的方法,特别是在路径规划领域的应用。主要改进措施包括:采用排序搜索机制,即在每轮迭代后对所有路径按长度排序并只强化前20%的优质路径;调整信息素更新规则,如引入动态蒸发系数和分级强化策略;优化路径选择策略,增加排序权重因子;以及实现动态地图调整,使算法能够快速适应环境变化。实验结果显示,改进后的算法在收敛速度上有显著提升,在复杂地形中的表现更加稳健。 适合人群:从事路径规划研究的技术人员、算法工程师、科研工作者。 使用场景及目标:适用于需要高效路径规划的应用场景,如物流配送、机器人导航、自动驾驶等领域。目标是提高路径规划的效率和准确性,减少不必要的迂回路径,确保在动态环境中快速响应变化。 其他说明:改进后的蚁群算法不仅提高了收敛速度,还增强了对复杂环境的适应能力。建议在实际应用中结合可视化工具进行调参,以便更好地观察和优化蚂蚁的探索轨迹。此外,还需注意避免过度依赖排序机制而导致的过拟合问题。

  • 基于PSO算法的配电网分布式光伏选址定容优化及其Matlab实现

    内容概要:本文详细介绍了利用粒子群优化(PSO)算法解决配电网中分布式光伏系统的选址与定容问题的方法。首先阐述了问题背景,即在复杂的配电网环境中选择合适的光伏安装位置和确定合理的装机容量,以降低网损、减小电压偏差并提高光伏消纳效率。接着展示了具体的PSO算法实现流程,包括粒子初始化、适应度函数构建、粒子位置更新规则以及越界处理机制等关键技术细节。文中还讨论了目标函数的设计思路,将多个相互制约的目标如网损、电压偏差和光伏消纳通过加权方式整合为单一评价标准。此外,作者分享了一些实践经验,例如采用前推回代法进行快速潮流计算,针对特定应用场景调整权重系数,以及引入随机波动模型模拟光伏出力特性。最终实验结果显示,经过优化后的方案能够显著提升系统的整体性能。 适用人群:从事电力系统规划与设计的专业人士,尤其是那些需要处理分布式能源集成问题的研究人员和技术人员。 使用场景及目标:适用于希望深入了解如何运用智能优化算法解决实际工程难题的人士;旨在帮助读者掌握PSO算法的具体应用方法,从而更好地应对配电网中分布式光伏系统的选址定容挑战。 其他说明:文中提供了完整的Matlab源代码片段,便于读者理解和复现研究结果;同时也提到了一些潜在改进方向,鼓励进一步探索和创新。

Global site tag (gtag.js) - Google Analytics