All posts by dotte

Redis 备份、容灾及高可用实战

Where to buy 🚀 aged domains and backlinks 🔥 from Best-SEO-Domains | 0083-0608

Where to buy 🚀 aged domains and backlinks 🔥 from Best-SEO-Domains | 0083-0608

一、Redis简单介绍

Redis是一个高性能的key-value非关系型数据库,由于其具有高性能的特性,支持高可用、持久化、多种数据结构、集群等,使其脱颖而出,成为常用的非关系型数据库。

此外,Redis的使用场景也比较多。

  1. 会话缓存(Session Cache)
    Redis缓存会话有非常好的优势,因为Redis提供持久化,在需要长时间保持会话的应用场景中,如购物车场景这样的场景中能提供很好的长会话支持,能给用户提供很好的购物体验。
  2. 全页缓存
    在WordPress中,Pantheon提供了一个不错的插件wp-redis,这个插件能以最快的速度加载你曾经浏览过的页面。
  3. 队列
    Reids提供list和set操作,这使得Redis能作为一个很好的消息队列平台来使用。我们常通过Reids的队列功能做购买限制。比如到节假日或者推广期间,进行一些活动,对用户购买行为进行限制,限制今天只能购买几次商品或者一段时间内只能购买一次。也比较适合适用。
  4. 排名
    Redis在内存中对数字进行递增或递减的操作实现得非常好。所以我们在很多排名的场景中会应用Redis来进行,比如小说网站对小说进行排名,根据排名,将排名靠前的小说推荐给用户。
  5. 发布/订阅
    Redis提供发布和订阅功能,发布和订阅的场景很多,比如我们可以基于发布和订阅的脚本触发器,实现用Redis的发布和订阅功能建立起来的聊天系统。

此外还有很多其它场景,Redis都表现的不错。

二、Redis使用中单点故障问题

正是由于Redis具备多种优良特新,且应用场景非常丰富,以至于Redis在各个公司都有它存在的身影。那么随之而来的问题和风险也就来了。Redis虽然应用场景丰富,但部分公司在实践Redis应用的时候还是相对保守使用单节点部署,那为日后的维护带来了安全风险。

在2015年的时候,曾处理过一个因为单点故障原因导致的业务中断问题。当时的Redis都未采用分布式部署,采用单实例部署,并未考虑容灾方面的问题。

当时我们通过Redis服务器做用户购买优惠商品的行为控制,但后来由于未知原因Redis节点的服务器宕机了,导致我们无法对用户购买行为进行控制,造成了用户能够在一段时间内多次购买优惠商品的行为。

这种宕机事故可以说已经对公司造成了不可挽回的损失了,安全风险问题非常严重,作为当时运维这个系统的我来说有必要对这个问题进行修复和在架构上的改进。于是我开始了解决非分布式应用下Redis单点故障方面的研究学习。

三、非分布式场景下Redis应用的备份与容灾

Redis主从复制现在应该是很普遍了。常用的主从复制架构有如下两种架构方案。

常用Redis主从复制

  • 方案一

Redis这是最常见的一种架构,一个Master节点,两个Slave节点。客户端写数据的时候是写Master节点,读的时候,是读取两个Slave,这样实现读的扩展,减轻了Master节点读负载。

  • 方案二

Maste

  • 这种架构同样是一个Master和两个Slave。不同的是Master和Slave1使用keepalived进行VIP转移。Client连接Master的时候是通过VIP进行连接的。避免了方案一IP更改的情况。

Redis主从复制优点与不足

  • 优点
  1. 实现了对master数据的备份,一旦master出现故障,slave节点可以提升为新的master,顶替旧的master继续提供服务
  2. 实现读扩展。使用主从复制架构, 一般都是为了实现读扩展。Master主要实现写功能,  Slave实现读的功能
  • 不足
    架构方案一
    当Master出现故障时,Client就与Master端断开连接,无法实现写功能,同时Slave也无法从Master进行复制。

架构

此时需要经过如下操作(假设提升Slave1为Master):

  1. 在Slave1上执slaveof no one命令提升Slave1为新的Master节点。
  2. 在Slave1上配置为可写,这是因为大多数情况下,都将slave配置只读。
  3. 告诉Client端(也就是连接Redis的程序)新的Master节点的连接地址。
  4. 配置Slave2从新的Master进行数据复制。

架构方案二
当master出现故障后,Client可以连接到Slave1上进行数据操作,但是Slave1就成了一个单点,就出现了经常要避免的单点故障(single point of failure)。

 

之后需要经过如下操作:

  1. 在Slave1上执行slaveof no one命令提升Slave1为新的Master节点
  2. 在Slave1上配置为可写,这是因为大多数情况下,都将Slave配置只读
  3. 配置Slave2从新的Master进行数据复制

可以发现,无论是哪种架构方案都需要人工干预来进行故障转移(failover)。需要人工干预就增加了运维工作量,同时也对业务造成了巨大影响。这时候可以使用Redis的高可用方案-Sentinel

四、Redis Sentinel介绍

Redis Sentinel为Redis提供了高可用方案。从实践方面来说,使用Redis Sentinel可以创建一个无需人为干预就可以预防某些故障的Redis环境。
Redis Sentinel设计为分布式的架构,运行多个Sentinel进程来共同合作的。运行多个Sentinel进程合作,当多个Sentinel同一给定的master无法再继续提供服务,就会执行故障检测,这会降低误报的可能性。

五、Redis Sentinel功能

Redis Sentinel在Redis高可用方案中主要作用有如下功能:

  • 监控
    Sentinel会不断的检查master和slave是否像预期那样正常运行
  • 通知
    通过API,Sentinel能够通知系统管理员、程序监控的Redis实例出现了故障
  • 自动故障转移
    如果master不像预想中那样正常运行,Sentinel可以启动故障转移过程,其中的一个slave会提成为master,其它slave会重新配置来使用新的master,使用Redis服务的应用程序,当连接时,也会被通知使用新的地址。
  • 配置提供者
    Sentinel可以做为客户端服务发现的认证源:客户端连接Sentinel来获取目前负责给定服务的Redis master地址。如果发生故障转移,Sentinel会报告新的地址。

六、Redis Sentinel架构

Redis

七、Redis Sentinel实现原理

Sentinel集群对自身和Redis主从复制进行监控。当发现Master节点出现故障时,会经过如下步骤:

  • 1)Sentinel之间进行选举,选举出一个leader,由选举出的leader进行failover
  • 2)Sentinel leader选取slave节点中的一个slave作为新的Master节点。对slave选举需要对slave进行选举的方法如下:a) 与master断开时间
    如果与master断开的时间超过down-after-milliseconds(sentinel配置) * 10秒加上从sentinel判定master不可用到sentinel开始执行故障转移之间的时间,就认为该slave不适合提升为master。b) slave优先级
    每个slave都有优先级,保存在redis.conf配置文件里。如果优先级相同,则继续进行。c) 复制偏移位置
    复制偏移纪录着从master复制数据复制到哪里,复制偏移越大表明从master接受的数据越多,如果复制偏移量也一样,继续进行选举

    d) Run ID
    选举具有最小Run ID的Slave作为新的Master
    流程图如下:

  • 3)  Sentinel leader会在上一步选举的新master上执行slaveof no one操作,将其提升为master节点
  • 4)Sentinel leader向其它slave发送命令,让剩余的slave成为新的master节点的slave
  • 5)Sentinel leader会让原来的master降级为slave,当恢复正常工作,Sentinel leader会发送命令让其从新的master进行复制
    以上failover操作均有sentinel自己独自完成,完全无需人工干预。

总结

使用sentinel实现了Redis的高可用,当master出现故障时,完全无需人工干预即可实现故障转移。避免了对业务的影响,提高了运维工作效率。
在部署sentinel的时候,建议使用奇数个sentinel节点,最少三个sentinel节点。

写在最后

由于sentinel知识点比较多,这里仅给大家进行介绍,让大家有个了解,想了解更多可与我联系。谢谢。

from:http://www.yunweipai.com/archives/22663.html

如何优雅、机智地向新公司表露自己想要的薪酬待遇?

本回答针对的是有一定工作经验,主动跳槽或被猎头挖的过程中如何优雅机智谈薪水。

需要明确的是接受一个新的工作,谈薪水只是整个面试一个环节而已,而薪酬谈判的核心就是明确自己的期待和市场情况。

很多职场人跳槽后,本来兴高采烈上班,结果入职后发现其他同岗位同事工资比自己高,瞬间跌入谷底。要是发现自己同事工资比自己低,就开始我心飞翔。

对于你值多少钱这件事情,是市场能给到的价格,你对市场的了解,加之你的谈判技巧等多方面因素决定。

说到底,就是你期望工资的满足程度+你对市场价格的了解程度两个因素决定。

v2-23944475aa3d845ba8dc3c615b8c1242_b

1. 如何知道市场能offer多少呢?

我过去工作就是薪酬架构设计,每年都会参加行业薪酬调研,所以比较了解各行各业的市场情况,也会比较清楚企业设计薪酬价格的底层逻辑——工作本身让我实现了薪酬方面的信息对称。

对于一般的职场人,要了解市场价格,不妨从以下几个方面入手。
积累同行业人脉,认识和结交同行,或者亲戚,朋友,学姐学长,老师等人脉资源
链接行业薪酬专家,比如同行业HR和行业资深猎头。
利用搜索渠道,比如前程无忧,智联招聘,知乎等等……
完全可以把自己定位为一个薪酬调研的小机构,平时注意积累和搜集市场数据。

通过以上渠道你可以大体了解市场薪酬范围,然后设定好自己的底线价格,市场价格,理想价格。

通常来说,底线价格 ≤ 市场价格 ≤ 理想价格。

比如,根据你了解市场某职位薪酬范围是10000-11000左右,那么你应该报多少合适呢?

在给企业方报价的时候,先自己回答一个问题,低于多少我不会接受?

低于10000你去吗?去

低于9000你去吗?去 ——这就是你的大致底线价格。

低于8000你去吗?不去,不去,不去

那么,在谈判环节报12000-13000就是比较明智的价格,也就是高于市场价格的你的理想工资,而你的底线价格大体是9000-10000。

最重要的是通过面试来试探市场对你的反馈,总结自己的能力和经验在市场上值多少钱。

2. 薪酬谈判是否有策略?

有。

很多人的跳槽日常是不清楚外面市场情况,正好猎头或朋友介绍1-2个机会,就挖空心思想谈个理想的offer.

这种想法是比较幼稚的,因为你并不了解市场对你的反馈,报价也是瞎报,高低也不清楚。

v2-114841b188cc959b86e1342811027e7b_b

策略之一,通过面试积累经验,检验自己在市场上的价格

成熟的职场人,在一个岗位工作一年半到两年上就应该主动到市场上看看机会,检验下自己目前的工作内容、能力和经验在市场上是否有价值,市场的真实反应如何?

同时可以尝试报理想价格,看市场给到自己的真实反馈。

当然,我的经验都是在机会众多的一线城市。小城市机会也不会特别多,圈子小,尝试太多,容易坏了名声。

我们通过面试,可以积累面试经验,增加自信,了解市场价格。
总之,市场是最好的试金石。
策略之二,跳槽之前设定好合理的找工作时间,尽量手里有offer去谈offer

很多人跳槽的时候都是在本公司做不下去了,可能是跟领导闹翻了,或者把客户得罪了,或者和同事撕逼了,还有的人是常年不升职加薪,太委屈了,狠下心找工作。

这样的心态去找工作,可以接受的时间长度都很短,忍不住就裸辞,从谈判心态上来说,基本上给钱就走。

从跳槽时机的角度来说,最好在职业上升期或者在公司风光一时的时候离开,这时候你在市场上会获得最高的溢价。

另外,可以给自己设定合理的跳槽时间,比如用6个月左右的时间找到合适的机会,先找几家公司练练手,不要一开始就投自己的理想企业,练手差不多了再投。
如果在练手的过程中拿到几个offer,可以先hold住,拿着offer和理想雇主谈offer。
练手的好处是可以在理想雇主面试环节表现出最佳状态。

通常猎头和企业都会在面试环节问你手头是否有其他offer,希望了解你的求职进程。

如果候选人说,我手里已经有几个offer,自然有底气,这就是谈判的重要筹码。
注意说自己有offer的措辞,可以说,坦白讲,我目前有两个offer,但都不是特别满意,我更希望能到××公司工作…… 因为……我希望….
我曾经负责公司审批升职加薪等流程,现实情况是很多优秀人才被猎头挖之后,拿着offer提辞职,因为是人才嘛,领导和企业自然会count offer来挽回,那么就顺利在企业内部实现升职加薪。
这样的人才通常都是在企业的核心岗位的高价值人才,而那些高替代性的普通员工,你的去留真的没有在意。
因为市场检验了你,给出了标价,企业惜才,你有价值,或者领导正好需要你,就会给到你想要的。

策略之三, 先发制人,高开低走,附加协议

市场上的中高端职位,猎头和企业方对候选人的薪酬都是open的,所谓open,就是根据候选人目前的package(整体薪酬包),根据市场情况,对其能力进行评估,给予一定的合理涨幅。

先发制人

在面试的最后环节,企业方会抛出关键问题——你期望的工资是多少?

我建议“先发制人”,在了解了市场价格的前提下,所以当然是我们先报出理想价格。

我们先报,主动权就在我们。况且我们心里知道企业价格和我们能接受的底线。比如,底线9000, 市场价格10000, 理想价格12000。

那么,当企业问你的期望工资的时候,你就直接说12000。你有80%的可能拿到11000的offer.

而候选人通常会犯的致命错误是在报价的那一刻突然怂了。

自降身价,比如明明心里想好了理想价格是12000,面试官问出问题的那一刻,嘴就不听使唤的报出10000。

企业经过第二轮谈判开出9000的价格,直接击穿到你的底线价格,好吧,那就接受吧。

这样的场面和谈判过程——非常常见。

高开低走

所谓“高开低走”,也是给企业一点斡旋的空间,当然也有一些情况,基于你报出的价格在企业的薪酬架构里属于低价位,企业也不会和你讨价还价,直接给你offer。

市场上大部分情况是企业会和候选人进行谈判,也就一轮到两轮。你提出一个报价,企业说OK,或者说稍微调整下期望。仅此而已。

附加协议

如果你的期望就是12000,企业谈判中说只能给你11000,你可以尝试谈判和企业协商,是否可以在合同中写出,试用期11000,如果胜任工作,过了试用期将工资调整到12000。

这就是附加协议的例子,你可以根据实际情况来应用。

v2-ce0e3d6ca2261c655382dbc4605050a8_b

3. 企业薪酬架构是什么?

中小企业或者小的创业公司几乎不存在这个概念,也就是随行就市,根据市场大体情况和候选人的报价,以及和内部同岗位人员薪酬进行综合比对,给出最后的offer。

也有一些土豪公司,就给出市场上的最高价格,你开价多少都没关系,看中你的能力就给到让你满意的工资。

但是,大型企业都有完善的薪酬架构体系,薪酬架构是根据企业的职等职级制定的薪酬带,和你谈工资的HR手里通常都有这样类似的一张表。

v2-a6867a756ac32e9123ecb35a9e732b68_b

(一线城市,某IT公司支持部门薪酬价格数据,有一定参考性)

中位数的意思是大多数企业会支付的价格,市场上绝大多数企业都会参加年度薪酬调研,拿到同行业的薪酬数据报告,根据各家的发展战略制定薪酬策略。大部分企业的策略是给到候选人市场上50分位的价格。

如何理解50分位呢?

有比如有5个市场专员的薪酬数据,分别是5000,5500,6000,8000,10000,排在中间也就是第三名的数字,6000,就是市场专员的中间值。

当然也有的企业针对核心岗位,制定高于绝大多数企业的薪酬架构,比如给出90分位的价格来吸引优秀人才。90分位就是1-100个同岗位的薪资数据,排在第90高的数值。

4. 还涉及的一个问题就是,薪酬谈的越高越好吗?

告诉你个事实。企业每年调薪的机会一般是1次或2次。

所以入职的工资对你很重要,如果你谈的很高,比如财务专员薪酬范围是4500-8500,而你谈了8500加入公司(参考上图)。除非你升职,通常来讲,按照公司政策,你未来几年加薪的可能性很低,即便有也不高。

而且如果你是拿到这个级别最高工资加入公司,你的老板和公司对你的期望也会更高。
所谓“颜值越高,责任越重“。
如果你是拿7500工资(红色圈圈数字),担任财务主管职位,就是起步价,每年还会有稳步提升工资的空间。

5. 谈判中,如何突破企业薪酬架构?

谈薪资的时候,有否有听面试官说,你报的工资我们给不了,超过我们的公司政策了,也就是你的报价超过了上面薪酬架构例子中的最高值。

这种情况下,如何突破指导线呢?

不要和HR谈,HR一般没有突破政策的权限。

可以争取机会再次和业务负责人谈,如果业务负责人对你的能力是肯定的会帮你突破,拿到超过企业薪酬架构最高值的offer。
规则都是让老板打破的。

6. 整体报酬的角度看如何谈一个满意的薪水

我曾经用整体报酬的概念回答过除了薪酬和五险一金,在挑选公司的时候最应该考虑什么,链接如下。薪酬谈判的问题也涉及到整体报酬,我将答案简化分享如下。菲凡:除了薪酬和五险一金,在挑选公司的时候最应该考虑什么?

回到我这个整体报酬专家的专业本身,薪水仅仅是一份新工作需要考量的一小部分而已。

在选择公司的时候, 跳槽谈offer,以及拿到几个offer来决策的时候,还是要从整体报酬出发。
直接报酬——通常说的薪水部分
间接报酬——公司福利,不容忽视
工作内容——工作内容本身能够带给你什么价值
职业发展——是否有持续发展的机会
公司文化——你是否能融入公司文化
公司平台——平台决定了你的努力会有多少回报
跟随领导——一个牛逼的领导会带你飞
6.1 直接报酬

包括:工资、补贴、奖金、股票…… 面试最后环节问清楚出了基本工资是否还有其他现金报酬。比如电话补贴,交通补贴,午饭补贴,或者其他技术或岗位补贴。

6.2 间接报酬

五险一金的缴纳,商业医疗保险,年度体检,带薪假期等也是一线城市较好企业的标配。

6.3 工作内容

工作内容代表了工作本身的价值,是否与你的兴趣和能力匹配,工作的多样性、挑战性、重要性以及其意义。

核心部门的核心岗位就是高价值岗位。比如谷歌的工程师,雅诗兰黛等品牌公司的市场岗位,咨询公司的顾问等等。工作内容越核心,未来的价值越不可估量。

6.4 职业发展

了解自己的岗位定位,未来三到五年的发展前景十分重要。比如有些美女前台,毕业的时候工资还挺高的,但是职位本身没有发展空间按,每年调薪幅度有限,几年后也就是原地踏步。

6.5 公司文化

企业文化就是公司所提供的员工与员工、员工与团队之间的良好氛围。说起来很简答,但是文化决定企业的格局,发展和未来。好的企业文化就是鞭策员工和企业共同成长,双赢。

6.6 公司平台

BAT或华为这样的平台我们就不说了,平台是够大的。职场新人,尽量选择顶级或最好的平台开阔视野,工作几年后再决定是否到小公司或初创公司,这个顺序如果错了,那么大公司或顶级公司对你来说就不一定那么容易加入了。而且你错过了学习的黄金时间。

6.7 跟随领导

领导虽然风格各异,你需要判断TA是否正直、值得信任,另外要询问部门架构,搞清楚领导在公司的架构中的位置,级别越高,部门越核心,领导就越有话语权。汇报给这样的领导,你才有更多的资源和机会。
一个牛逼的领导可以让你的职业发展如虎添翼,而一个差领导也一定可以让你的职业发展屡屡受挫。

———-重点来了——

7. 薪酬谈判中常见坑有哪些?

大坑一,用奖金来压低底薪。

“有的企业方在谈判中提到,底薪不高,但是奖金可观,希望你降低底薪要求,而实际情况是奖金因为种种情况几乎不发放,或者和当初面试时候说的奖金相差甚远。”

应对策略:

谈奖金部分的都是目标奖金数字,有的是年薪的15%,有的公司目标奖金达到年薪的50%,还有的根据业务情况发放季度奖金,半年奖金等等。不要轻易相信这个目标数字,没有实际意义。

首先仔细询问下企业方过去两年的实际奖金有多少?

当然,也有的公司目标奖金只有10%,而实际发放比例每年都是高于目标奖金,甚至达到年薪的20%+。

实际发放比例才是公司营业能力的体现。不要被目标奖金比例蒙蔽了双眼。

还有的公司,根本不发奖金,目标奖金只是摆设,老板说有就有,说没有就没有。
你再次跳槽的时候,猎头和HR考察你的整体package,也是要看你去年实际拿到的奖金,而不是目标奖金,所以目标奖金低,也是变相的降薪跳槽。
大坑二、加班加班加班

“有的职位工资和工作内容等各方面都不错,但是入职之后才发现,公司没有人按时下班, 公司加班文化非常浓烈,老板喜欢加班,而且没有加班费。”

应对策略:

面试过程中如果面试官询问你对加班的看法,大部分情况是是加班严重的岗位。你可以问问企业方日常的加班强度和加班工资如何计算。如果能链接到该公司的在职人员问问实际情况那就最好了。

避免掉到加班的大坑里。

大坑三、原来公司不调薪

“跳槽的时候,工资谈的还挺满意的,你觉得开心无比,结果加入公司后发现,每年薪资调整就只有1-2%或者几百块,CPI都追不上,变相降薪。”

应对策略:

面试过程中问清楚公司普调比例和加薪政策。比如:去年的加薪幅度是多少?加薪考核的指标是什么?

—–没有实际谈判经验,优雅机智谈薪水都是瞎扯,让自己投入到市场中去体会吧—-

实践出真知。

v2-e19427946e34ffa9f8d572fc8f58740f_b

本人坐标上海,薪酬谈谈判专家,长期混迹于外企500强,我个人思维和经验的局限导致我的分享并不能代表整个中国职场,当然如果对你有些许帮助,你可以手动点赞,不同观点,开放讨论。

你可能喜欢的菲凡其他文章:

【1】如何判断领导的段位

【2】我是如何工资快速破万的

【3】快速升职的秘密

from:https://www.zhihu.com/question/23146089

NLP入门之语音模型原理

作者:云时之间

这一篇文章其实是参考了很多篇文章之后写出的一篇对于语言模型的一篇科普文,目的是希望大家可以对于语言模型有着更好地理解,从而在接下来的NLP学习中可以更顺利的学习.

1:传统的语音识别方法:

这里我们讲解一下是如何将声音变成文字,如果有兴趣的同学,我们可以深入的研究.

首先我们知道声音其实是一种波,常见的MP3等都是压缩的格式,必须要转化成非压缩的纯波形的文件来处理,下面以WAV的波形文件来示例:

大数据
在进行语音识别之前,有的需要把首尾段的静音进行切除,进行强制对齐,以此来降低对于后续步骤的干扰,整个静音的切除技术一般称为VAD,需要用到对于信号处理的一些技术.

如果要对于声音进行分析,就需要对于声音进行分帧,也就是把声音切成一小块一小块,每一小块称为一帧,分帧并不是简单地切开,而是使用的移动窗函数来实现的,并且帧和帧之间一般是有交叠的

大数据
就像上图这样

分帧之后,语音就变成了很多个小段,但是波形在时域上是没有什么描述能力的,因此就必须要将波形进行变换,常见的一种变换方法就是提取MFCC特征,然后根据人耳的生理特性,把每一帧波变成一个多维度向量,这个向量里是包含了这块语音的内容信息,这个过程叫做声学特征的提取,但是实际方法有很多,基本类似.

至此,声音就成了一个12行(假设声学特征是12维)、N列的一个矩阵,称之为观察序列,这里N为总帧数。观察序列如下图所示,图中,每一帧都用一个12维的向量表示,色块的颜色深浅表示向量值的大小。

大数据
接下来就要介绍怎样把这个矩阵变成文本了。首先要介绍两个概念:

1:音素:

单词的发音由音素构成。对英语,一种常用的音素集是卡内基梅隆大学的一套由39个音素构成的音素集,参见The CMU Pronouncing Dictionary‎。汉语一般直接用全部声母和韵母作为音素集,另外汉语识别还分有调无调,不详述。

1. 状态:这里理解成比音素更细致的语音单位就行啦。通常把一个音素划分成3个状态。

语音识别是怎么工作的呢?实际上一点都不神秘,无非是:

把帧识别成状态(难点)。

把状态组合成音素。

把音素组合成单词。

如下图所示:

大数据
图中,每个小竖条代表一帧,若干帧语音对应一个状态,每三个状态组合成一个音素,若干个音素组合成一个单词。也就是说,只要知道每帧语音对应哪个状态了,语音识别的结果也就出来了。

那每帧音素对应哪个状态呢?有个容易想到的办法,看某帧对应哪个状态的概率最大,那这帧就属于哪个状态。比如下面的示意图,这帧在状态S3上的条件概率最大,因此就猜这帧属于状态S3。

大数据
那这些用到的概率从哪里读取呢?有个叫“声学模型”的东西,里面存了一大堆参数,通过这些参数,就可以知道帧和状态对应的概率。获取这一大堆参数的方法叫做“训练”,需要使用巨大数量的语音数据,训练的方法比较繁琐,这里不讲。

但这样做有一个问题:每一帧都会得到一个状态号,最后整个语音就会得到一堆乱七八糟的状态号。假设语音有1000帧,每帧对应1个状态,每3个状态组合成一个音素,那么大概会组合成300个音素,但这段语音其实根本没有这么多音素。如果真这么做,得到的状态号可能根本无法组合成音素。实际上,相邻帧的状态应该大多数都是相同的才合理,因为每帧很短。

解决这个问题的常用方法就是使用隐马尔可夫模型(Hidden Markov Model,HMM)。这东西听起来好像很高深的样子,实际上用起来很简单: 第一步,构建一个状态网络。 第二步,从状态网络中寻找与声音最匹配的路径。

这样就把结果限制在预先设定的网络中,避免了刚才说到的问题,当然也带来一个局限,比如你设定的网络里只包含了“今天晴天”和“今天下雨”两个句子的状态路径,那么不管说些什么,识别出的结果必然是这两个句子中的一句。

那如果想识别任意文本呢?把这个网络搭得足够大,包含任意文本的路径就可以了。但这个网络越大,想要达到比较好的识别准确率就越难。所以要根据实际任务的需求,合理选择网络大小和结构。

搭建状态网络,是由单词级网络展开成音素网络,再展开成状态网络。语音识别过程其实就是在状态网络中搜索一条最佳路径,语音对应这条路径的概率最大,这称之为“解码”。路径搜索的算法是一种动态规划剪枝的算法,称之为Viterbi算法,用于寻找全局最优路径。

大数据
这里所说的累积概率,由三部分构成,分别是:

  1. 观察概率:每帧和每个状态对应的概率
  2. 转移概率:每个状态转移到自身或转移到下个状态的概率
  3. 语言概率:根据语言统计规律得到的概率

其中,前两种概率从声学模型中获取,最后一种概率从语言模型中获取。语言模型是使用大量的文本训练出来的,可以利用某门语言本身的统计规律来帮助提升识别正确率。语言模型很重要,如果不使用语言模型,当状态网络较大时,识别出的结果基本是一团乱麻。

这样基本上语音识别过程就完成了。

2:端到端的模型

现阶段深度学习在模式识别领域取得了飞速的发展,特别是在语音和图像的领域,因为深度学习的特性,在语音识别领域中,基于深度学习的声学模型现如今已经取代了传统的混合高斯模型GMM对于状态的输出进行建模,因此在普通的深度神经网络的基础之上,基于长短记忆网络的递归神经网络对语音序列的强大的建模能力进一步提高了语音识别的性能,但是这些方法依旧包含着最基础的隐马尔可夫HMM的基本结构,因此依旧会出现隐马尔科夫模型的训练和解码的复杂度问题.

基于深度学习的声学模型训练过程必须是由传统的混合高斯模型开始的,然后对训练数据集合进行强制的对齐,然后进行切分得到不同的声学特征,其实传统的方式并不利于对于整句话的全局优化,并且这个方法也需要额外的语音学和语言学的知识,比如发音词典,决策树单元绑定建模等等,搭建系统的门槛较高等问题.

一些科学家针对传统的声学建模的缺点,提出了链接时序分类技术,这个技术是将语音识别转换为序列的转换问题,这样一来就可以抛弃了传统的基于HMM的语音识别系统的一系列假设,简化了系统的搭建流程,从而可以进一步提出了端到端的语音识别系统,减少了语音对于发音词典的要求.

端到端的系统是由LSTM的声学建模方法和CTC的目标函数组成的,在CTC的准则下,LSTM可以在训练过程中自动的学习声学的特征和标注序列的对应关系,也就不需要再进行强制的对数据集合进行对齐的过程了.并且可以根据各种语种的特点,端到端识别直接在字或者单词上进行建模,但是因为端到端的识别可能是意味着发展的趋势,但是因为完全崛弃了语音学的知识,现如今在识别性能上仍然和传统的基于深度学习的建模方法有着一定的差距,不过我最近在看的一篇论文中,基于端到端的藏语识别已经达到甚至超过了现有的通用算法.

就拿藏语举例,藏语是一种我国的少数民族语言,但是因为藏族人口较少,相比起对于英文,汉语这样的大语种来说,存在着语音数据收集困难的问题,在上一篇文章中我们可以知道,自然语言处理的最重要的需求就是语料,如果有很好的语料库自然会事半功倍,这样就导致了藏语的语音识别研究工作起步较晚,并且因为藏语的语言学知识的匮乏进一步阻碍了藏语语音识别的研究的进展,在我国,藏语是属于一种单音节字的语言,在端到端的语音过程中,藏语是建模起来非常简单的一种语言,但是作为一种少数民族语言,语料不足会在训练过程中出现严重的稀疏性问题,并且很多人在研究现有的藏语词典中发现,如果完全崛弃现有的藏语发音词典,完全不利用这样的先验知识,这样其实也是不利于技术的发现的,因此现阶段下,采用CTC和语言知识结合的方式来建模,可以解决在资源受限的情况下声学的建模问题,使得基于端到端的声学模型方法的识别率超过当下基于隐马尔科夫的双向长短时记忆模型.

在基于CD-DNN-HMM架构的语音识别声学模型中,训练DNN通常需要帧对齐标签。在GMM中,这个对齐操作是通过EM算法不断迭代完成的,而训练DNN时需要用GMM进行对齐则显得非常别扭。因此一种不需要事先进行帧对齐的方法呼之欲出。此外对于HMM假设一直受到诟病,等到RNN出现之后,使用RNN来对时序关系进行描述来取代HMM成为当时的热潮。随着神经网络优化技术的发展和GPU计算能力的不断提升,最终使用RNN和CTC来进行建模实现了end-to-end语音识别的声学模型。CTC的全称是Connectionist Temporal Classification,中文翻译大概是连接时序分类。它要达到的目标就是直接将语音和相应的文字对应起来,实现时序问题的分类。

这里仍然可以描述为EM的思想:

E-step:使用BPTT算法优化神经网络参数;

M-step:使用神经网络的输出,重新寻找最有的对齐关系。

CTC可以看成是一个分类方法,甚至可以看作是目标函数。在构建end-to-end声学模型的过程中,CTC起到了很好的自动对齐的效果。同传统的基于CD-DNN-HMM的方法相比,对齐效果引用文章[Alex Graves,2006]中的图是这样的效果:

大数据
这幅图可以理解:基于帧对齐的方法强制要求切分好的帧对齐到对应的标签上去,而CTC则可以时帧的输出为空,只有少数帧对齐到对应的输出标签上。这样带来的差别就是帧对齐的方法即使输出是正确的,但是在边界区域的切分也很难准确,从而给DNN的训练引入错误。c) End-to-end模型由于神经网络强大的建模能力,End-to-end的输出标签也不再需要像传统架构一样的进行细分。例如对于中文,输出不再需要进行细分为状态、音素或者声韵母,直接将汉字作为输出即可;对于英文,考虑到英文单词的数量庞大,可以使用字母作为输出标签。从这一点出发,我们可以认为神经网络将声学符号到字符串的映射关系也一并建模学习了出来,这部分是在传统的框架中时词典所应承担的任务。针对这个模块,传统框架中有一个专门的建模单元叫做G2P(grapheme-to-phoneme),来处理集外词(out of vocabulary,OOV)。在end-to-end的声学模型中,可以没有词典,没有OOV,也没有G2P。这些全都被建模在一个神经网络中。另外,在传统的框架结构中,语音需要分帧,加窗,提取特征,包括MFCC、PLP等等。在基于神经网络的声学模型中,通常使用更裸的Fbank特征。在End-to-en的识别中,使用更简单的特征比如FFT点,也是常见的做法。或许在不久的将来,语音的采样点也可以作为输入,这就是更加彻底的End-to-end声学模型。除此之外,End-to-end的声学模型中已经带有了语言模型的信息,它是通过RNN在输出序列上学习得到的。但这个语言模型仍然比较弱,如果外加一个更大数据量的语言模型,解码的效果会更好。因此,End-to-end现在指声学模型部分,等到不需要语言模型的时候,才是完全的end-to-end。3、 语言模型(Language Model, LM)语言模型的作用可以简单理解为消解多音字的问题,在声学模型给出发音序列之后,从候选的文字序列中找出概率最大的字符串序列。

4、 解码传统的语音识别解码都是建立在WFST的基础之上,它是将HMM、词典以及语言模型编译成一个网络。解码就是在这个WFST构造的动态网络空间中,找到最优的输出字符序列。搜索通常使用Viterbi算法,另外为了防止搜索空间爆炸,通常会采用剪枝算法,因此搜索得到的结果可能不是最优结果。在end-to-end的语音识别系统中,最简单的解码方法是beam search。尽管end-to-end的声学模型中已经包含了一个弱语言模型,但是利用额外的语言模型仍然能够提高识别性能,因此将传统的基于WFST的解码方式和Viterbi算法引入到end-to-end的语音识别系统中也是非常自然的。然而由于声学模型中弱语言模型的存在,解码可能不是最优的。文章[yuki Kanda, 2016]提出在解码的时候,需要将这个若语言模型减掉才能得到最优结果。

End.

转载请注明来自36大数据(36dsj.com):36大数据 » NLP入门之语音模型原理

概念和概念所代表的含义

最近看了一个视频:
5年前节目中他首提引力波,遭嘉宾嘲讽,如今他们都欠他一个道歉

希望各位义愤填膺回答这个问题的时候先看题,引用@游嘉的评论:人们反感的是嘉宾对低学历的科学研究爱好者的武断和嘲笑,否定可以有很多种表达方式,恰恰嘉宾用了很没有教养的一种方式,最后五年后的今天也并没有显示出他们比那个求职者聪明多少

各位大神看清楚题干再抖机灵,没人在赞成民科维护民科,只不过是对嘉宾和主持人态度的不理解。

第一次知乎提问这么多回答真的受宠若惊,其实这个问题哪有那么多专业性,就怪题主手贱多点了科学标签,引来了好多义愤填膺不看题的大神。

作者:CHAI Bin
链接:https://www.zhihu.com/question/40563882/answer/87203104
来源:知乎
著作权归作者所有,转载请联系作者获得授权。

我说三个故事。

1、几千年来,中国的道士们都痴迷于“点石成金”的仙术。现在,我们知道了“核聚变”这个东西,理论上不考虑成本、技术足够先进的话,确实可以把石头变成黄金。所以,中国古代的道士发明了核聚变技术?

2、一千多年前的唐朝,有个皇帝叫作李世民,巧了!我有个朋友也叫李世民。所以,我的朋友当过皇帝?

3、家父喜欢“装逼”,反驳我的时候常说“你懂什么!你连一加一为什么等于二都不知道!大科学家陈景润都没有证明一加一为什么等于二,这是全世界最难的问题!”所以,家父知道什么叫【1+1】?

回到本题,这个狗屁民科知道啥叫“引力波”?只不过听到别人说过这个名词,拿来说出来而已。不是名字一样就是一样东西,不是听到个新名词一知半解就是行家了。

借用评论里@失泆 的一句话,“这些名词为人所敬畏的地方是背后复杂而有依据的理论体系,而不是名词本身”。

另外,作为科班出身的人,我瞧不起所有哗众取宠,“总想搞个大新闻”的民科。

最后,你们慢聊,我去卖“高科技引力波理疗仪”发财去了~

================================================
有人非要说所谓“尊重”。

类比一下,当你平白无故说“你应该吃大便”的时候,我就可以叫你闭嘴了,而不需要听你解释为什么我需要吃大便这个荒谬的事情;同样的,当他说出第一句话的时候,任何有高中科学基础的人就知道他讲的有多荒谬了,就该让他闭嘴了。

要谈尊重也得是互相的,我们尊重的是人,是不同观点,而不是明显的荒谬,并用荒谬来哗众取宠。

他从来没有尊重过知识和科学,你让科学家们怎么尊重他?

去哪儿网基于Mesos和Docker构建私有云服务的实践

作者:徐磊

【导读】本文深入介绍了去哪儿网利用Mesos和Docker构建私有云服务的全过程,分享了从无状态应用向有状态应用逐步过度的经验与心得。

平台概览

2014年下半年左右,去哪儿完成了有关构建私有云服务的技术调研,并最终拍定了Docker/Mesos这一方案。下图1展示了去哪儿数据平台的整体架构:

大数据

图1:去哪儿数据平台的整体架构

该平台目前已实现了如下多项功能:

  • 每天处理约340亿/25TB的数据;
  • 90%的数据在100ms内完成处理;
  • 最长3h/24h的数据回放;
  • 私有的Elasticsearch Cloud;
  • 自动化监控与报警。

为什么选择Docker/Mesos

目前为止,这个数据平台可以说是公司整个流数据的主要出入口,包括私有的Elasticsearch Cloud和监控报警之类的数据。那么为什么选择Docker/Mesos?

选择Docker有两大原因。第一个是打包:对于运维来讲,业务打完包之后,每天面对的是用脚本分发到机器上时所出现的各种问题。业务包是一个比较上层的话题,这里不做深入的讨论,这里讲的“打包”指软件的Runtime层。如果用Docker的打包机制,把最容易出现问题的Runtime包装成镜像并放在registry里,需要的时候拿出来,那么整个平台最多只执行一个远程脚本就可以了,这是团队最看好的一个特性。第二个是运维:Docker取消了依赖限制,只要构建一个虚拟环境或一个Runtime的镜像,就可以直接拉取到服务器上并启动相应的程序。此外Docker在清理上也较为简单,不需要考虑环境卸载不干净等问题。

以常见的计算框架来说,它们本质上仍然属于运行在其上的Job的Runtime。综合上述情况,团队选择针对Runtime去打包。

选择Mesos是因为它足够简单和稳定,而且拥有较成熟的调度框架。Mesos的简单体现在,与Kubernetes相比其所有功能都处于劣势,甚至会发现它本身都是不支持服务的,用户需要进行二次开发来满足实际要求,包括网络层。不过,这也恰好是它的强项。Mesos本身提供了很多SDN接口,或者是有模块加载机制,可以做自定义修改,平台定制功能比较强。所以用Mesos的方案,需要考虑团队是否可以Hold住整个开发过程。

从框架层面来看,Marathon可以支撑一部分长期运行的服务,Chronos则侧重于定时任务/批处理。

以下图2是Mesos的一个简单结构图:

大数据

图2:Mesos结构

数据平台的最终目标架构如下图3所示:

大数据

图3:平台目标

组件容器化与部署

组件的容器化分为JVM容器化和Mesos容器化。JVM容器化需要注意以下几方面:

潜在创建文件的配置都要注意

  • java.io.tmpdir
  • -XX:HeapDumpPath
  • -Xloggc

-Xloggc会记录GC的信息到制定的文件中。现在很少有直接用XLoggc配置的了(已经用MXBean方式替代了)。如果有比较老的程序是通过-Xloggc打印GC日志的话,那么要额外挂载volume到容器内。

时区与编码

  • –env TZ=Asia/Shanghai
  • –volume /etc/localtime:/etc/localtime:ro
  • –env JAVA_TOOL_OPTIONS=”-Dfile.encoding=UTF-8 -Duser.timezone=PRC

时区是另一个注意点。上面所列的三种不同的方法都可以达到目的,其中第一/三个可以写在Dockerfile里,也可以在docker run时通过–env传入。第二种只在docker run时通过volume方式挂载。另外,第三种额外设置了字符集编码,推荐使用此方式。

主动设置heap

  • 防止ergonomics乱算内存

这是Docker内部实现的问题。即使给Docker设置内存,容器内通过free命令看到的内存和宿主机的内存是一样的。而JVM为了使用方便,会默认设置一个人机功能会根据当前机器的内存计算一个堆大小,如果我们不主动设置JVM堆内存的话,很有可能计算出一个超过 Memory Cgroup限制的内存,启动就宕掉,所以需要注意在启动时就把内存设置好。

CMS收集器要调整并行度

  • -XX:ParallelGCThreads=cpus
  • -XX:ConcGCThreads=cpus/2

CMS是常见的收集器,它设置并行度的时候是取机器的核数来计算的。如果给容器分配2个CPU,JVM仍然按照宿主机的核数初始化这些线程数量,GC的回收效率会降低。想规避这个问题有两点,第一点是挂载假的Proc文件系统,比如Lxcfs。第二种是使用类似Hyper的基于Hypervisor的容器。

Mesos容器化要求关注两类参数:配置参数和run参数。

  • 需要关注的配置参数
    • MESOS_systemd_enable_support
    • MESOS_docker_mesos_image
    • MESOS_docker_socket
    • GLOG_max_log_size
    • GLOG_stop_logging_if_full_disk

Mesos是配置参数最多的。在物理机上,Mesos默认使用系统的Systemd管理任务,如果把Mesos通过Docker run的方式启动起来,用户就要关systemd_Enable_support,防止Mesos Slave拉取容器运行时数据造成混乱。

第二个是Docker_Mesos_Image,这个配置告诉Mesos Slave,当前是运行在容器内的。在物理机环境下,Mesos Slave进程宕掉重启,、就会根据executor进程/容器的名字做recovery动作。但是在容器内,宕机后executor全部回收了,重启容器,Slave认为是一个新环境,跳过覆盖动作并自动下发任务,所以任务有可能会发重。

Docker_Socket会告诉Mesos,Docker指定的远端地址或本地文件,是默认挂到Mesos容器里的。用户如果直接执行文件,会导致文件错误,消息调取失败。这个时候推荐一个简单的办法:把当前物理机的目录挂到容器中并单独命名,相当于在容器内直接访问整个物理机的路径,再重新指定它的地址,这样每次一有变动Mesos就能够发现,做自己的指令。

后面两个是Mesos Logging配置,调整生成logging文件的一些行为。

  • 需要关注的run参数
    • –pid=host
    • –privileged
    • –net=host (optional)
    • root user

启动Slave容器的时候最好不加Pid Namespace,因为容器内Pid=1的进程一般都是你的应用程序,易导致子进程都无法回收,或者采用tini一类的进程启动应用达到相同的目的。–privileged和root user主要是针对Mesos的持久化卷功能,否则无法mount到容器内,–net=host是出于网络效率的考虑,毕竟源生的bridge模式效率比较低。

大数据

图4:去哪儿数据平台部署流程图

上图4就是去哪儿数据平台部署的流程图。

基于Marathon的Streaming调度

拿Spark on Mesos记录子,即使是基于Spark的Marathon调度,也需要用户开发一个Frameworks。上生产需要很多代码,团队之前代码加到将近一千,用来专门解决Spark运行在Master中的问题,但是其中一个软件经常跑到Master,对每一个框架写重复性代码,而且内部逻辑很难复用,所以团队考虑把上层的东西全都跑在一个统一框架里,例如后面的运维和扩容,都针对这一个框架做就可以了。团队最终选择了Marathon,把Spark作为Marathon的一个任务发下去,让Spark在Marathon里做分发。

除去提供维标准化和自动化外,基于Spark的Marathon还可以解决Mesos-Dispatcher的一些问题:

  • 配置不能正确同步;这一块更新频率特别慢,默认速度也很慢,所以需要自己来维护一个版本。第一个配置不能正确同步,需要设置一些参数信息、Spark内核核数及内损之类,这里它只会选择性地抽取部分配置发下去。
  • 基于attributes的过滤功能缺失;对于现在的环境,所设置的Attributes过滤功能明显缺失,不管机器是否专用或有没有特殊配置,上来就发,很容易占满ES的机器。
  • 按role/principal接入Mesos;针对不同的业务线做资源配比时,无法对应不同的角色去接入Mesos。
  • 不能re-registery;框架本身不能重注册,如果框架跑到一半挂掉了,重启之后之前的任务就直接忽略不管,需要手工Kill掉这个框架。
  • 不能动态扩容executor。最后是不能扩容、动态调整,临时改动的话只能重发任务。

整个过程比较简单,如下图5所示:

大数据

图5:替代Spark Mesos Dispatcher

不过还是有一些问题存在:

Checkpoint & Block

  • 动态预留 & 持久化卷
  • setJars
  • 清理无效的卷

关于Checkpoint&Block,通过动态预留的功能可以把这个任务直接“钉死”在这台机器上,如果它挂的话可以直接在原机器上重启,并挂载volume继续工作。如果不用它预留的话,可能调度到其他机器上,找不到数据Block,造成数据的丢失或者重复处理。

持久化卷是Mesos提供的功能,需要考虑它的数据永存,Mesos提供了一种方案:把本地磁盘升级成一个目录,把这个转移到Docker里。每次写数据到本地时,能直接通过持久化卷来维护,免去手工维护的成本。但它目前有一个问题,如果任务已被回收,它持久化卷的数据是不会自己删掉的,需要写一个脚本定时轮巡并对应删掉。

临时文件

  • java.io.tmpdir=/mnt/mesos/sandbox
  • spark.local.dir=/mnt/mesos/sandbox

如果使用持久化卷,需要修改这两个配置,把这一些临时文件写进去,比如shuffle文件等。如果配置持久化卷的话,用户也可以写持久化卷的路径。

Coarse-Grained

Spark有两种资源调度模式:细粒度和粗粒度。目前已经不太推荐细粒度了,考虑到细粒度会尽可能的把所有资源占满,容易导致Mesos资源被耗尽,所以这个时候更倾向选择粗粒度模式。

大数据

图6:Storm on Marathon

上图6展示了基于Storm的Marathon调度,Flink也是如此。结合线上的运维和debug,需要注意以下几方面:

源生Web Console

  • 随机端口
  • OpenResty配合泛域名
  • 默认源生Web Console,前端配置转发,直接访问固定域名。

Filebeat + Kafka + ELK

  • 多版本追溯
  • 日常排错
  • 异常监控

大部分WebUI上看到的都是目前内部的数据处理情况,可以通过ELK查询信息。如果任务曾经运行在不同版本的Spark上,可以把多版本的日志都追踪起来,包括日常、问题监控等,直接拿来使用。

Metrics

第三个需要注意的就是指标。比如Spark ,需要配合Metrics把数据源打出来就行。

ELK on Mesos

目前平台已有近50个集群,约100TB+业务数据量,高峰期1.2k QPS以及约110个节点,Elasticsearch需求逐步增多。

大数据

图7:ELK on Mesos

上图7是ELK on Mesos结构图,也是团队的无奈之选。因为Mesos还暂时不支持multi-role framework功能,所以选择了这种折中的方式来做。在一个Marathon里,根据业务线设置好Quota后,用业务线重新发一个新的Marathon接入进去。对于多租户来讲,可以利用Kubernetes做后续的资源管控和资源申请。

部署ES以后,有一个关于服务发现的问题,可以去注册一个callback,Marathon会返回信息,解析出master/slave进程所在的机器和端口,配合修改Haproxy做一层转发,相当于把后端整个TCP的连接都做一个通路。ES跟Spark不完全相同,Spark传输本身流量就比较大,而ES启动时需要主动联系Master地址,再通过Master获取相应集群,后面再做P2P,流量比较低,也不是一个长链接。

监控与运维

这部分包括了Streaming监控指标与报警、容器监控指标与报警两方面。

Streaming监控指标与报警

Streaming监控含拓扑监控和业务监控两部分。

  • Streaming拓扑监控
  • 业务监控
    • Kafka Topic Lag
    • 处理延迟mean90/upper90
    • Spark scheduler delay/process delay
    • Search Count/Message Count
    • Reject/Exception
    • JVM

拓扑监控包括数据源和整个拓扑流程,需要用户自己去整理和构建,更新的时候就能够知道这个东西依赖谁、是否依赖线上服务,如果中途停的话会造成机器故障。业务监控的话,第一个就是Topic Lag,Topic Lag每一个波动都是不一样的,用这种方式监控会频繁报警,90%的中位数都是落在80—100毫秒范围内,就可以监控到整个范围。

容器监控指标与报警

容器监控上关注以下三方面:

  • Google cAdvisor足够有效
    • mount rootfs可能导致容器删除失败 #771
    • –docker_only
    • –docker_env_metadata_whitelist
  • Statsd + Watcher
    • 基于Graphite的千万级指标监控平台
  • Nagios

容器这一块比较简单,利用Docker并配合Mesos,再把Marathon的ID抓取出来就可以了。我们这边在实践的过程发现一个问题,因为Statsd Watcher容易出现问题,你直接用Docker的时候它会报一些错误出来,这个问题就是Statsd Watcher把路径给挂了的原因。目前我们平台就曾遇到过一次,社区里面也有人曝,不过复现率比较低。用的时候如果发现这个问题把Statsd Watcher直接停掉就好。指标的话,每台机器上放一个statsd再发一个后台的Worker,报警平台也是这个。

其实针对Docker监控的话,还是存在着一些问题:

  • 基础监控压力
    • 数据膨胀
    • 垃圾指标增多
    • 大量的通配符导致数据库压力较高
  • 单个任务的容器生命周期
    • 发布
    • 扩容
    • 异常退出

首先主要是监控系统压力比较大。原来监控虚拟机时都是针对每一个虚拟机的,只要虚拟机不删的话是长期汇报,指标名固定,但在容器中这个东西一直在变,它在这套体系下用指标并在本地之外建一个目录存文件,所以在这种存储机制下去存容器的指标不合适。主要问题是数据膨胀比较厉害,可能一个容器会起名,起名多次之后,在Graphite那边对应了有十多个指标,像这种都是预生成的监控文件。比如说定义每一秒钟一个数据点,要保存一年,这个时候它就会根据每年有多少秒生成一个RRD文件放那儿。这部分指标如果按照现有标准的话,可能容器的生命周期仅有几天时间,不适用这种机制。测试相同的指标量,公司存储的方式相对来说比Graphite好一点。因为Graphite是基于文件系统来做的,第一个优化指标名,目录要转存到数据库里做一些索引加速和查询,但是因为容器这边相对通配符比较多,不能直接得知具体对应的ID,只能通配符查询做聚合。因为长期的通配符在字符串的索引上还是易于使用的,所以现在算是折中的做法,把一些常用的查询结果、目录放到里边。

另一个是容器的生命周期。可以做一些审计或者变更的版本,在Mesos层面基于Marathon去监控,发现这些状态后打上标记:当前是哪一个容器或者哪一个TASK出了问题,对应扩容和记录下来。还有Docker自己的问题,这样后面做整个记录时会有一份相对比较完整的TASK-ID。

End.

转载请注明来自36大数据(36dsj.com):36大数据 » 去哪儿网基于Mesos和Docker构建私有云服务的实践