郭襄:十六岁那年,风陵渡口,一见杨过误终生[转载]

原地址: https://www.douban.com/note/643113086/

  在《神雕侠侣》的最后,杨过携着小龙女,并肩下山,归隐而去。其时明月在天,清风吹叶,树巅乌鸦乱叫。郭襄再也忍不住,眼泪夺眶而出。这番真情流露,真是应了那句:相知相见知何日,此时此夜难为情。记得学生时代看到这一幕,感慨的是杨过与小龙女这段惊天地泣鬼神的爱情终于修得圆满结局了。还有就是“新五绝”被各路英雄豪杰洗牌重新定义为“东邪西狂南僧北侠中顽童”的那一段,多少有点儿“自古英雄出我辈,一入江湖岁月催”的惆怅。可此去经年,再度翻阅,竟又是另一番意味。

  风陵渡口初相遇,一见杨过误终身。令人心疼的这位姑娘,曾经在初遇之时,对着杨过莞尔一笑,说道:“我姓郭,单名一个襄字”。没错,这位明媚聪慧的奇女子,正是郭襄。幼年时,觉得她活泼可爱,如沐春风;少年时,觉得她聪慧明媚,灿若星辰;到如今,觉得她至情至性,一片痴心。只可惜,也因了这份执念,爱上了一个不该爱的人,从此漂泊半生,寻寻觅觅冷冷清清。到最后,也只能在峨眉山上,青灯长伴,孤独终老。

  故事的一切,还要从头说起。作为郭靖与黄蓉的二女儿,郭襄生逢于乱世。当时蒙古挥军南下,襄阳危在旦夕。她的父母奉命镇守襄阳,也因此给她取了这个名字。只不过,她一出生就被金轮法王抢去,后来又落入李莫愁之手。险象环生,颠沛流离。嗷嗷待哺之时,还在山洞里喝过豹奶。后来幸好被杨过救走,带回古墓用玉蜂琼浆养了一段时日。最后辗转数月,才回到黄蓉怀里。那是她人生中第一次与杨过有交集,只是那时还太小,杨过也只不过是个十八岁的少年。岁月匆匆流逝,转眼间已过了十六载。此时的郭襄,已经成长为一个楚楚动人的少女。

  作为名门之后的她,遗传了父亲郭靖的温厚善良,母亲黄蓉的古灵精怪,外公黄药师的行事作风,甚至还有外婆冯衡的神韵风采。不同于大姐郭芙的刁蛮任性,总是仗着自己的身份欺横霸道,享受旁人的众星捧月。郭襄可是在父母的严厉管教中成长的,她身上更具有一种贵而不骄的风度,待人接物既磊落大方,又从容淡定。或许是从小在武林世家长大,见惯了各路英雄,她骨子里也有一种侠义之气,行事作风像极了外公黄老邪,是那种更愿意听从内心的人。

  郭襄是在《神雕侠侣》离结束还有四分之一时才出场的,颈挂一串明珠,身着淡绿衣衫,犹如空谷幽兰,气质非凡。在风陵渡口,听闻神雕侠的事迹之后,她顿时心生仰慕之情,应和山西一窟鬼,来了一场说走就走的旅行。没想到因缘际会之中,与杨过相遇。他们一起到黑沼泽抓灵狐,一起替刘瑛姑了却多年的心结,一起智斗周伯通。那或许是她最快乐的时光吧。自己敬仰的大哥哥不仅是盖世英雄,就真切地出现在眼前,还带着自己一起做了那么多有趣的事。以至于多年后回想起来,心口还会微微一热。

  如果说遇上杨过之前,郭襄心里怀揣的是一种对英雄的仰慕之情。那么,在遇上他之后,心里的这种仰慕又加深了几分。那时候的杨过修成盖世武功,早已名满江湖,可以说已经处于一个男人的巅峰时期,再加上对小龙女苦苦等待的痴情,无疑是满足了一个情窦初开的少女关于灵魂伴侣的所有想象。当杨过给她三根金针,可以实现她三个愿望时。她不暇思索就用了两根,只为一睹杨过的真容,还有邀请他前来庆生。关于初见杨过真面目,原著里是这么写的:郭襄眼前顿时出现一张清癯俊秀、风流倜傥的英俊脸孔;但见其剑眉入鬓、凤眼生威,好不俊俏;只是脸色苍白,颇显憔悴。

  当杨过回头见她怔怔地瞧着自己是,神色间显得颇为异样,便微笑道:“怎么?”郭襄俏脸一红,低声道:“没什么”。心中却说:“想不到你生得这般俊”。就是那摘掉面具后的惊鸿一瞥,定格了她的一生韶华。或许很多人都会说,若是当时郭襄没有叫杨过摘下面具,是不是就不会在峨眉清冷的月光中孤寂一生?可是,终究没有如果。这一见,注定了以后的岁月里,一场相思一场灾,情到深处终生误。这匆匆一见,是情愫的萌芽。十六岁的那场生日宴,才是盛大的启程。杨过不仅如约而至,还集结天下英雄,给郭襄送上了三份的贺礼。一是斩杀两千蒙古士兵;二是烧了蒙古大军的粮草;三是清除隐藏在丐帮的奸细霍都。这三件大礼,伴随着漫天的璀璨烟花,一时名动天下。如此华丽,太过荣耀。那一刻,郭襄成了整个武林的焦点。而这一切,都是杨过给她的。试想,一个十六岁的少女,如何能低挡得住这份温柔与盛宠?尤其那个人不仅武功盖世,还相貌堂堂,而且对自己宠爱有加。这就像是一杯毒药,但她喝得心甘情愿。而那场烟花,盛开的不仅是一颗少女心,也开启了一段无疾而终的痴恋。

  人世间,有些相遇是致命的,比如杨过之于郭襄。风陵渡口的那惊鸿一瞥,以及生日宴上的那场烟花,让郭襄心里从此情根深种。再相遇时,已是两个月以后。在绝情谷上,杨过眼见苦等十六年都不见小龙女的踪迹,早已心灰意冷一心求死。这个时候,郭襄毫不迟疑地用掉了第三根金针,只为请求她的大哥哥不要轻生。可杨过哪里还顾得上昔日的约定,纵深一跃,跳入谷底。而郭襄呢?没有半分犹豫,也随着跳了下去。当杨过在绝情谷底的清潭之畔,看到随之而来的郭襄,也不禁吓了一跳,嗔怪她跳下来做什么。记得郭襄当时回答说,看到你跳,我也就跟着来了。看到他苦等心上人,生日愿望是盼着他们团聚;这种股决绝,无法归类,没有杂质。说仰慕吧,太过萧索;说痴情吧,太过俗气。她只知道,认定了这么一个人,心里便再无杂念。就像听父母聊起当年穆念慈对杨康的痴情,她竟然说道:“她是没有法子啊,她既然欢喜了,便有千般不是,也要喜欢到底。”小小年纪,便有这番感悟。其实这又何尝不是在借别人的事,说自己的心呢?看到他生无可恋,便跟着他去。

  那一年的襄阳城下,敌军压阵,战火纷飞。郭襄被蒙古军掳去做人质,绑于高台,柴火堆积,命悬一线。纵使武功盖世如黄老邪,再加上郭靖黄蓉二人,也没有法子能解救。在这生死危急关头,郭襄却毫不畏惧,那么从容安静。她极目远眺,看着山川如画,心里叨念着杨过。念念不忘,必有回响。随着一声清嘶雕鸣,杨过与小龙女鼓风而至。郭襄被救了下来,也见到了美若天仙的小龙女。她在心有余悸之时,不免感慨:“也真只有你,才配得上他”。这番话,当然是发自内心的。她的盖世英雄,终于找回了他心心念念的人。她替他高兴之余,却也难免落寞。郭襄曾在蒙古军营中有这么一段独白,碎碎念道:纵使底下是万丈深渊,纵使可能粉身碎骨,也毫不畏惧,更在所不惜。

  可惜我迟生了二十年。倘若妈妈先生我,再生姊姊,我学会了师父的龙象般若功和无上瑜珈密乘,在全真教道观外住了下来,自称大龙女,小杨过在全真教中受师父欺侮,逃到我家里,我收留了他教他武功,他慢慢的自会跟我好了。他再遇到小龙女,最多不过拉住她手,给她三枚金针,说道:小妹子,你很可爱,我心里也挺喜欢你。不过我的心已属大龙女了。请你莫怪!你有甚幺事,拿一枚金针来,我一定给你办到。

  君生我未生,我生君已老。看似是童言无忌,却也是真情流露。她多么希望,能够早一点遇上他。以至于最后在华山之巅,看着杨过携着小龙女下山,她终于忍不住,风吹花落泪如雨。爱上一个人,只需要一瞬间。可忘记一个人,却需要一辈子。后来襄阳被攻陷,父母双双殉难。郭襄便带着倚天剑,骑着小毛驴,开始浪迹天涯,四处追寻杨过的踪迹。她去终南山,终南山古墓长闭;她到万花坳,万花坳花落无声;她下绝情谷,绝情谷空山寂寂;她回风陵渡,风陵渡凝月冥冥。终南山在陕西,风陵渡和万花坳在山西,绝情谷在湖北。在郭襄浪迹天涯的二十四年里,去了无数次这四个地方。此间辗转,寻而不得,不能忘怀。其实,这二十四年的寻觅,找的不仅是杨过这个人,而是希望从江湖那里听取更多关于他的事迹吧。因为即便找到了,又能怎样呢?相见不如怀念罢。或许是十六岁那年的烟花太过灿烂,燃尽了此后二十四年的韶华。四十岁的那年,郭襄在峨眉山下遇到了一个说书之人。他讲了一个古老的故事:

  • 有两条鱼,生活在大海里,某天被海水冲到浅水沟,只能互相把自己嘴里的泡沫喂到对方嘴里,才能得以生存。这叫相濡以沫。海水最终漫了上来,两条鱼分开了,最终回到海里,不去打扰彼此。这叫相忘于江湖。

  郭襄听完,痛哭一场。杨过等了小龙女十六年,而她却追寻了二十四年。半生循迹,江湖无踪。眼看容颜已老,青丝熬成白发。都说,曾经沧海难为水,除却巫山不是云。可如今,千山暮雪,只影向谁去?关于郭襄的结局,《倚天屠龙记》里曾有简单的交代,借用俞莲舟之口,轻描淡写地说道:

  • 郭女侠走遍天下,找不到杨大侠,四十岁那年忽然大彻大悟,便出家为尼,后来开创了峨嵋一派。

  十六岁那年遇见,用了二十四年去寻觅,最后选择在清冷的峨嵋山上终老。郭襄的这一生,真是让人唏嘘。爱上了一个不该爱的人,在遇见的时候就花光了所有的运气,便注定了以后不得善终,就这样被耽误了一辈子。只是,世人都以为她最终放下了。而当灭绝师太说起她师父叫做风陵师太时,竟是那样令人心酸。终其一生,她都没能忘记风陵渡口的那场相遇,还有十六岁那年的烟花······

  • 我走过山时,山不说话;我路过海时,海不说话;小毛炉滴滴答答,倚天剑伴我走天涯,大家都说我因为爱着杨过大侠,才在峨眉山上出了家,其实我只是爱上了峨眉山上的云和霞, 像极了十六岁那年的烟花。

Elasticsearch的基本原理【转载】

原地址: https://mp.weixin.qq.com/s/i8SzyuxBl4wMkU9z0Mm03Q

生活中的数据

搜索引擎是对数据的检索,所以我们先从生活中的数据说起。我们生活中的数据总体分为两种:结构化数据 和 非结构化数据。

结构化数据:也称作行数据,是由二维表结构来逻辑表达和实现的数据,严格地遵循数据格式与长度规范,主要通过关系型数据库进行存储和管理。指具有固定格式或有限长度的数据,如数据库,元数据等。

非结构化数据:又可称为全文数据,不定长或无固定格式,不适于由数据库二维表来表现,包括所有格式的办公文档、XML、HTML、word文档,邮件,各类报表、图片和咅频、视频信息等。如果要更细致的区分的话,XML、HTML可划分为 半结构化数据。因为它们也具有自己特定的标签格式,所以既可以根据需要按结构化数据来处理,也可抽取出纯文本按非结构化数据来处理。
根据两种数据分类,搜索也相应的分为两种:结构化数据搜索和非结构化数据搜索。

对于结构化数据,因为它们具有特定的结构,所以我们一般都是可以通过关系型数据库(mysql,oracle等)的 二维表(table)的方式存储和搜索,也可以建立索引。

对于非结构化数据,也即对全文数据的搜索主要有两种方法:顺序扫描法,全文检索。

顺序扫描:通过文字名称也可了解到它的大概搜索方式,即按照顺序扫描的方式查询特定的关键字。例如给你一张报纸,让你找到该报纸中“平安”的文字在哪些地方出现过。你肯定需要从头到尾把报纸阅读扫描一遍然后标记出关键字在哪些版块出现过以及它的出现位置。这种方式无疑是最耗时的最低效的,如果报纸排版字体小,而且版块较多甚至有多份报纸,等你扫描完你的眼睛也差不多了。

全文搜索:对非结构化数据顺序扫描很慢,我们是否可以进行优化?把我们的非结构化数据想办法弄得有一定结构不就行了吗?将非结构化数据中的一部分信息提取出来,重新组织,使其变得有一定结构,然后对此有一定结构的数据进行搜索,从而达到搜索相对较快的目的。这种方式就构成了全文检索的基本思路。这部分从非结构化数据中提取出的然后重新组织的信息,我们称之索引。这种方式的主要工作量在前期索引的创建,但是对于后期搜索却是快速高效的。

先说说Lucene

通过对生活中数据的类型作了一个简短了解之后,我们知道关系型数据库的SQL检索是处理不了这种非结构化数据的。这种非结构化数据的处理需要依赖全文搜索,而目前市场上开放源代码的最好全文检索引擎工具包就属于 apache 的 Lucene了。但是 Lucene 只是一个工具包,它不是一个完整的全文检索引擎。Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。目前以 Lucene 为基础建立的开源可用全文搜索引擎主要是 Solr 和 Elasticsearch。

Solr 和 Elasticsearch 都是比较成熟的全文搜索引擎,能完成的功能和性能也基本一样。但是 ES 本身就具有分布式的特性和易安装使用的特点,而Solr的分布式需要借助第三方来实现,例如通过使用ZooKeeper来达到分布式协调管理。不管是 Solr 还是 Elasticsearch 底层都是依赖于 Lucene,而 Lucene 能实现全文搜索主要是因为它实现了倒排索引的查询结构。

如何理解倒排索引呢?假如现有三份数据文档,文档的内容如下分别是:
Java is the best programming language.
PHP is the best programming language.
Javascript is the best programming language.

为了创建倒排索引,我们通过分词器将每个文档的内容域拆分成单独的词(我们称它为词条或 Term),创建一个包含所有不重复词条的排序列表,然后列出每个词条出现在哪个文档。结果如下所示:

Term Doc_1 Doc_2 Doc_3
Java x
is x x x
the x x x
best x x x
programming x x x
language x x x
PHP x
Javascript x

这种结构由文档中所有不重复词的列表构成,对于其中每个词都有一个文档列表与之关联。这种由属性值来确定记录的位置的结构就是倒排索引。带有倒排索引的文件我们称为倒排文件。我们将上面的内容转换为图的形式来说明倒排索引的结构信息,如下图所示:

其中主要有如下几个核心术语需要理解:

  • 词条(Term):索引里面最小的存储和查询单元,对于英文来说是一个单词,对于中文来说一般指分词后的一个词。
  • 词典(Term Dictionary):或字典,是词条Term的集合。搜索引擎的通常索引单位是单词,单词词典是由文档集合中出现过的所有单词构成的字符串集合,单词词典内每条索引项记载单词本身的一些信息以及指向“倒排列表”的指针。
  • 倒排表(Post list):一个文档通常由多个词组成,倒排表记录的是某个词在哪些文档里出现过以及出现的位置。每条记录称为一个倒排项(Posting)。倒排表记录的不单是文档编号,还存储了词频等信息。
  • 倒排文件(Inverted File):所有单词的倒排列表往往顺序地存储在磁盘的某个文件里,这个文件被称之为倒排文件,倒排文件是存储倒排索引的物理文件。

从上图我们可以了解到倒排索引主要由两个部分组成:词典和倒排文件。词典和倒排表是Lucene中很重要的两种数据结构,是实现快速检索的重要基石。词典和倒排文件是分两部分存储的,词典在内存中而倒排文件存储在磁盘上。

ES的核心概念

一些基础知识的铺垫之后我们正式进入今天的主角Elasticsearch的介绍, ES是使用Java编写的一种开源搜索引擎,它在内部使用Lucene做索引与搜索,通过对Lucene的封装,隐藏了Lucene的复杂性,取而代之的提供一套简单一致的 RESTful API。然而,Elasticsearch 不仅仅是 Lucene,并且也不仅仅只是一个全文搜索引擎。它可以被下面这样准确的形容:

  • 一个分布式的实时文档存储,每个字段可以被索引与搜索。
  • 一个分布式实时分析搜索引擎。
  • 能胜任上百个服务节点的扩展,并支持 PB 级别的结构化或者非结构化数据。

官网对Elasticsearch的介绍是Elasticsearch 是一个分布式、可扩展、近实时的搜索与数据分析引擎。我们通过一些核心概念来看下Elasticsearch 是如何做到分布式,可扩展和近实时搜索的。

集群(Cluster)

ES的集群搭建很简单,不需要依赖第三方协调管理组件,自身内部就实现了集群的管理功能。ES集群由一个或多个Elasticsearch节点组成,每个节点配置相同的 cluster.name 即可加入集群,默认值为 “elasticsearch”。确保不同的环境中使用不同的集群名称,否则最终会导致节点加入错误的集群。一个Elasticsearch服务启动实例就是一个节点(Node)。节点通过 node.name来设置节点名称,如果不设置则在启动时给节点分配一个随机通用唯一标识符作为名称。

  1. 发现机制:

那么有一个问题,ES内部是如何通过一个相同的设置 cluster.name 就能将不同的节点连接到同一个集群的?答案是 ZenDiscovery。Zen Discovery是Elasticsearch的内置默认发现模块(发现模块的职责是发现集群中的节点以及选举master节点)。它提供单播和基于文件的发现,并且可以扩展为通过插件支持云环境和其他形式的发现。Zen Discovery 与其他模块集成,例如,节点之间的所有通信都使用Transport模块完成。节点使用发现机制通过Ping的方式查找其他节点。Elasticsearch 默认被配置为使用单播发现,以防止节点无意中加入集群。只有在同一台机器上运行的节点才会自动组成集群。如果集群的节点运行在不同的机器上,使用单播,你可以为 Elasticsearch 提供一些它应该去尝试连接的节点列表。当一个节点联系到单播列表中的成员时,它就会得到整个集群所有节点的状态,然后它会联系 master 节点,并加入集群。这意味着单播列表不需要包含集群中的所有节点, 它只是需要足够的节点,当一个新节点联系上其中一个并且说上话就可以了。如果你使用master 候选节点作为单播列表,你只要列出三个就可以了。这个配置在 elasticsearch.yml 文件中:

discovery.zen.ping.unicast.hosts: ["host1", "host2:port"]

节点启动后先 ping ,如果 discovery.zen.ping.unicast.hosts 有设置,则 ping 设置中的 host ,否则尝试 ping localhost 的几个端口, Elasticsearch 支持同一个主机启动多个节点, Ping 的 response 会包含该节点的基本信息以及该节点认为的 master 节点。选举开始,先从各节点认为的 master 中选,规则很简单,按照 id 的字典序排序,取第一个。如果各节点都没有认为的 master ,则从所有节点中选择,规则同上。这里有个限制条件就是 discovery.zen.minimum_master_nodes ,如果节点数达不到最小值的限制,则循环上述过程,直到节点数足够可以开始选举。最后选举结果是肯定能选举出一个 master ,如果只有一个 local 节点那就选出的是自己。如果当前节点是 master ,则开始等待节点数达到 discovery.zen.minimummasternodes,然后提供服务。如果当前节点不是 master ,则尝试加入 master 。Elasticsearch 将以上服务发现以及选主的流程叫做 ZenDiscovery 。由于它支持任意数目的集群( 1- N ),所以不能像 Zookeeper 那样限制节点必须是奇数,也就无法用投票的机制来选主,而是通过一个规则,只要所有的节点都遵循同样的规则,得到的信息都是对等的,选出来的主节点肯定是一致的。但分布式系统的问题就出在信息不对等的情况,这时候很容易出现脑裂( Split-Brain )的问题,大多数解决方案就是设置一个 quorum 值,要求可用节点必须大于 quorum (一般是超过半数节点),才能对外提供服务。而 Elasticsearch 中,这个 quorum 的配置就是discovery.zen.minimum_master_nodes 。

  1. 节点的角色

每个节点既可以是候选主节点也可以是数据节点,通过在配置文件 ../config/elasticsearch.yml中设置即可,默认都为 true

node.master: true//是否候选主节点
node.data: true//是否数据节点

数据节点负责数据的存储和相关的操作,例如对数据进行增、删、改、查和聚合等操作,所以数据节点(data节点)对机器配置要求比较高,对CPU、内存和I/O的消耗很大。通常随着集群的扩大,需要增加更多的数据节点来提高性能和可用性。候选主节点可以被选举为主节点(master节点),集群中只有候选主节点才有选举权和被选举权,其他节点不参与选举的工作。主节点负责创建索引、删除索引、跟踪哪些节点是群集的一部分,并决定哪些分片分配给相关的节点、追踪集群中节点的状态等,稳定的主节点对集群的健康是非常重要的。

一个节点既可以是候选主节点也可以是数据节点,但是由于数据节点对CPU、内存核I/0消耗都很大,所以如果某个节点既是数据节点又是主节点,那么可能会对主节点产生影响从而对整个集群的状态产生影响。因此为了提高集群的健康性,我们应该对Elasticsearch集群中的节点做好角色上的划分和隔离。可以使用几个配置较低的机器群作为候选主节点群。主节点和其他节点之间通过Ping的方式互检查,主节点负责Ping所有其他节点,判断是否有节点已经挂掉。其他节点也通过Ping的方式判断主节点是否处于可用状态。虽然对节点做了角色区分,但是用户的请求可以发往任何一个节点,并由该节点负责分发请求、收集结果等操作,而不需要主节点转发,这种节点可称之为协调节点,协调节点是不需要指定和配置的,集群中的任何节点都可以充当协调节点的角色。

  1. 脑裂现象

同时如果由于网络或其他原因导致集群中选举出多个Master节点,使得数据更新时出现不一致,这种现象称之为脑裂,即集群中不同的节点对于master的选择出现了分歧,出现了多个master竞争。“脑裂”问题可能有以下几个原因造成:

网络问题:集群间的网络延迟导致一些节点访问不到master,认为master挂掉了从而选举出新的master,并对master上的分片和副本标红,分配新的主分片

节点负载:主节点的角色既为master又为data,访问量较大时可能会导致ES停止响应(假死状态)造成大面积延迟,此时其他节点得不到主节点的响应认为主节点挂掉了,会重新选取主节点。

内存回收:主节点的角色既为master又为data,当data节点上的ES进程占用的内存较大,引发JVM的大规模内存回收,造成ES进程失去响应。

为了避免脑裂现象的发生,我们可以从原因着手通过以下几个方面来做出优化措施:适当调大响应时间,减少误判通过参数 discovery.zen.ping_timeout设置节点状态的响应时间,默认为3s,可以适当调大,如果master在该响应时间的范围内没有做出响应应答,判断该节点已经挂掉了。调大参数(如6s,discovery.zen.ping_timeout:6),可适当减少误判。选举触发我们需要在候选集群中的节点的配置文件中设置参数 discovery.zen.munimum_master_nodes的值,这个参数表示在选举主节点时需要参与选举的候选主节点的节点数,默认值是1,官方建议取值 (master_eligibel_nodes/2)+1,其中 master_eligibel_nodes为候选主节点的个数。这样做既能防止脑裂现象的发生,也能最大限度地提升集群的高可用性,因为只要不少于discovery.zen.munimum_master_nodes个候选节点存活,选举工作就能正常进行。当小于这个值的时候,无法触发选举行为,集群无法使用,不会造成分片混乱的情况。角色分离即是上面我们提到的候选主节点和数据节点进行角色分离,这样可以减轻主节点的负担,防止主节点的假死状态发生,减少对主节点“已死”的误判。

分片(Shards)

ES支持PB级全文搜索,当索引上的数据量太大的时候,ES通过水平拆分的方式将一个索引上的数据拆分出来分配到不同的数据块上,拆分出来的数据库块称之为一个分片。这类似于MySql的分库分表,只不过Mysql分库分表需要借助第三方组件而ES内部自身实现了此功能。在一个多分片的索引中写入数据时,通过路由来确定具体写入哪一个分片中,所以在创建索引的时候需要指定分片的数量,并且分片的数量一旦确定就不能修改。分片的数量和下面介绍的副本数量都是可以通过创建索引时的 settings来配置,ES默认为一个索引创建5个主分片, 并分别为每个分片创建一个副本。

PUT /myIndex
{
    "settings" : {
        "number_of_shards" : 5,
        "number_of_replicas" : 1
    }
}

ES通过分片的功能使得索引在规模上和性能上都得到提升,每个分片都是Lucene中的一个索引文件,每个分片必须有一个主分片和零到多个副本。

副本(Replicas)

副本就是对分片的Copy,每个主分片都有一个或多个副本分片,当主分片异常时,副本可以提供数据的查询等操作。主分片和对应的副本分片是不会在同一个节点上的,所以副本分片数的最大值是 n -1(其中n为节点数)。对文档的新建、索引和删除请求都是写操作,必须在主分片上面完成之后才能被复制到相关的副本分片,ES为了提高写入的能力这个过程是并发写的,同时为了解决并发写的过程中数据冲突的问题,ES通过乐观锁的方式控制,每个文档都有一个 _version (版本)号,当文档被修改时版本号递增。一旦所有的副本分片都报告写成功才会向协调节点报告成功,协调节点向客户端报告成功。

从上图可以看出为了达到高可用,Master节点会避免将主分片和副本分片放在同一个节点上。假设这时节点Node1服务宕机了或者网络不可用了,那么主节点上主分片S0也就不可用了。幸运的是还存在另外两个节点能正常工作,这时ES会重新选举新的主节点,而且这两个节点上存在我们的所需要的S0的所有数据,我们会将S0的副本分片提升为主分片,这个提升主分片的过程是瞬间发生的。此时集群的状态将会为 yellow。为什么我们集群状态是 yellow 而不是 green 呢?虽然我们拥有所有的2个主分片,但是同时设置了每个主分片需要对应两份副本分片,而此时只存在一份副本分片。所以集群不能为 green 的状态。如果我们同样关闭了 Node2 ,我们的程序依然可以保持在不丢任何数据的情况下运行,因为Node3 为每一个分片都保留着一份副本。如果我们重新启动Node1 ,集群可以将缺失的副本分片再次进行分配,那么集群的状态又将恢复到原来的正常状态。如果Node1依然拥有着之前的分片,它将尝试去重用它们,只不过这时Node1节点上的分片不再是主分片而是副本分片了,如果期间有更改的数据只需要从主分片上复制修改的数据文件即可。
PS: 1、将数据分片是为了提高可处理数据的容量和易于进行水平扩展,为分片做副本是为了提高集群的稳定性和提高并发量。2、副本是乘法,越多消耗越大,但也越保险。分片是除法,分片越多,单分片数据就越少也越分散。3、副本越多,集群的可用性就越高,但是由于每个分片都相当于一个Lucene的索引文件,会占用一定的文件句柄、内存及CPU,并且分片间的数据同步也会占用一定的网络带宽,所以索引的分片数和副本数也不是越多越好。

映射(Mapping)

映射是用于定义ES对索引中字段的存储类型、分词方式和是否存储等信息,就像数据库中的 schema ,描述了文档可能具有的字段或属性、每个字段的数据类型。只不过关系型数据库建表时必须指定字段类型,而ES对于字段类型可以不指定然后动态对字段类型猜测,也可以在创建索引时具体指定字段的类型。对字段类型根据数据格式自动识别的映射称之为动态映射(Dynamic mapping),我们创建索引时具体定义字段类型的映射称之为静态映射或显示映射(Explicit mapping)。在讲解动态映射和静态映射的使用前,我们先来了解下ES中的数据有哪些字段类型?之后我们再讲解为什么我们创建索引时需要建立静态映射而不使用动态映射。ES(v6.8)中字段数据类型主要有以下几类:

类别 数据类型
核心类型 text, keywords, long, integer, short, double, data, boolean等等
复杂类型 Object, Nested
地理类型 geopoint, geoshape
特殊类型 ip, completion, token_count, join等等

text 用于索引全文值的字段,例如电子邮件正文或产品说明。这些字段是被分词的,它们通过分词器传递 ,以在被索引之前将字符串转换为单个术语的列表。分析过程允许Elasticsearch搜索单个单词中每个完整的文本字段。文本字段不用于排序,很少用于聚合。keyword 用于索引结构化内容的字段,例如电子邮件地址,主机名,状态代码,邮政编码或标签。它们通常用于过滤,排序,和聚合。keyword字段只能按其确切值进行搜索。通过对字段类型的了解我们知道有些字段需要明确定义的,例如某个字段是text类型还是keword类型差别是很大的,时间字段也许我们需要指定它的时间格式,还有一些字段我们需要指定特定的分词器等等。如果采用动态映射是不能精确做到这些的,自动识别常常会与我们期望的有些差异。所以创建索引给的时候一个完整的格式应该是指定分片和副本数以及Mapping的定义,如下:

PUT my_index
{
    "settings": {
        "number_of_shards": 5,
        "number_of_replicas": 1
    }
    "mappings": {
        "_doc": {
            "properties": {
                "title": { "type": "text" },
                "name": { "type": "text" },
                "age": { "type": "integer" },
                "created":  {
                    "type": "date",
                    "format": "strict_date_optional_time||epoch_millis"
                }
            }
        }
    }
}
ES的机制原理

ES的基本概念和基本操作介绍完了之后我们可能还有很多疑惑,它们内部是如何运行的?主分片和副本分片是如何同步的?创建索引的流程是什么样的?ES如何将索引数据分配到不同的分片上的?以及这些索引数据是如何存储的?为什么说ES是近实时搜索引擎而文档的 CRUD (创建-读取-更新-删除) 操作是实时的?以及Elasticsearch 是怎样保证更新被持久化在断电时也不丢失数据?还有为什么删除文档不会立刻释放空间?带着这些疑问我们进入接下来的内容。

写索引原理

下图描述了3个节点的集群,共拥有12个分片,其中有4个主分片(S0、S1、S2、S3)和8个副本分片(R0、R1、R2、R3),每个主分片对应两个副本分片,节点1是主节点(Master节点)负责整个集群的状态。

写索引是只能写在主分片上,然后同步到副本分片。这里有四个主分片,一条数据ES是根据什么规则写到特定分片上的呢?这条索引数据为什么被写到S0上而不写到S1或S2上?那条数据为什么又被写到S3上而不写到S0上了?首先这肯定不会是随机的,否则将来要获取文档的时候我们就不知道从何处寻找了。实际上,这个过程是根据下面这个公式决定的:

shard = hash(routing) % number_of_primary_shards

routing 是一个可变值,默认是文档的 _id ,也可以设置成一个自定义的值。routing 通过 hash 函数生成一个数字,然后这个数字再除以 number_of_primary_shards (主分片的数量)后得到余数 。这个在 0 到 numberofprimary_shards-1 之间的余数,就是我们所寻求的文档所在分片的位置。这就解释了为什么我们要在创建索引的时候就确定好主分片的数量并且永远不会改变这个数量:因为如果数量变化了,那么所有之前路由的值都会无效,文档也再也找不到了。由于在ES集群中每个节点通过上面的计算公式都知道集群中的文档的存放位置,所以每个节点都有处理读写请求的能力。在一个写请求被发送到某个节点后,该节点即为前面说过的协调节点,协调节点会根据路由公式计算出需要写到哪个分片上,再将请求转发到该分片的主分片节点上。假如此时数据通过路由计算公式取余后得到的值是 shard = hash(routing) % 4 = 0,则具体流程如下:

  1. 客户端向ES1节点(协调节点)发送写请求,通过路由计算公式得到值为0,则当前数据应被写到主分片S0上。
  2. ES1节点将请求转发到S0主分片所在的节点ES3,ES3接受请求并写入到磁盘。
  3. 并发将数据复制到两个副本分片R0上,其中通过乐观并发控制数据的冲突。一旦所有的副本分片都报告成功,则节点ES3将向协调节点报告成功,协调节点向客户端报告成功。
存储原理

上面介绍了在ES内部索引的写处理流程,这个流程是在ES的内存中执行的,数据被分配到特定的分片和副本上之后,最终是存储到磁盘上的,这样在断电的时候就不会丢失数据。具体的存储路径可在配置文件 ../config/elasticsearch.yml中进行设置,默认存储在安装目录的data文件夹下。建议不要使用默认值,因为若ES进行了升级,则有可能导致数据全部丢失。

path.data: /path/to/data  //索引数据
path.logs: /path/to/logs  //日志记录
  1. 分段存储

索引文档以段的形式存储在磁盘上,何为段?索引文件被拆分为多个子文件,则每个子文件叫作段, 每一个段本身都是一个倒排索引,并且段具有不变性,一旦索引的数据被写入硬盘,就不可再修改。在底层采用了分段的存储模式,使它在读写时几乎完全避免了锁的出现,大大提升了读写性能。

段被写入到磁盘后会生成一个提交点,提交点是一个用来记录所有提交后段信息的文件。一个段一旦拥有了提交点,就说明这个段只有读的权限,失去了写的权限。相反,当段在内存中时,就只有写的权限,而不具备读数据的权限,意味着不能被检索。

段的概念提出主要是因为:在早期全文检索中为整个文档集合建立了一个很大的倒排索引,并将其写入磁盘中。如果索引有更新,就需要重新全量创建一个索引来替换原来的索引。这种方式在数据量很大时效率很低,并且由于创建一次索引的成本很高,所以对数据的更新不能过于频繁,也就不能保证时效性。

索引文件分段存储并且不可修改,那么新增、更新和删除如何处理呢?

  • 新增,新增很好处理,由于数据是新的,所以只需要对当前文档新增一个段就可以了。
  • 删除,由于不可修改,所以对于删除操作,不会把文档从旧的段中移除而是通过新增一个 .del文件,文件中会列出这些被删除文档的段信息。这个被标记删除的文档仍然可以被查询匹配到, 但它会在最终结果被返回前从结果集中移除。
  • 更新,不能修改旧的段来进行反映文档的更新,其实更新相当于是删除和新增这两个动作组成。会将旧的文档在 .del文件中标记删除,然后文档的新版本被索引到一个新的段中。可能两个版本的文档都会被一个查询匹配到,但被删除的那个旧版本文档在结果集返回前就会被移除。

段被设定为不可修改具有一定的优势也有一定的缺点,优势主要表现在:

  • 不需要锁。如果你从来不更新索引,你就不需要担心多进程同时修改数据的问题。
  • 一旦索引被读入内核的文件系统缓存,便会留在哪里,由于其不变性。只要文件系统缓存中还有足够的空间,那么大部分读请求会直接请求内存,而不会命中磁盘。这提供了很大的性能提升。
  • 其它缓存(像filter缓存),在索引的生命周期内始终有效。它们不需要在每次数据改变时被重建,因为数据不会变化。
  • 写入单个大的倒排索引允许数据被压缩,减少磁盘 I/O 和 需要被缓存到内存的索引的使用量。
    段的不变性的缺点如下:
  • 当对旧数据进行删除时,旧数据不会马上被删除,而是在 .del文件中被标记为删除。而旧数据只能等到段更新时才能被移除,这样会造成大量的空间浪费。
  • 若有一条数据频繁的更新,每次更新都是新增新的标记旧的,则会有大量的空间浪费。
  • 每次新增数据时都需要新增一个段来存储数据。当段的数量太多时,对服务器的资源例如文件句柄的消耗会非常大。
  • 在查询的结果中包含所有的结果集,需要排除被标记删除的旧数据,这增加了查询的负担。
  1. 延迟写策略

介绍完了存储的形式,那么索引是写入到磁盘的过程是这怎样的?是否是直接调 fsync 物理性地写入磁盘?答案是显而易见的,如果是直接写入到磁盘上,磁盘的I/O消耗上会严重影响性能,那么当写数据量大的时候会造成ES停顿卡死,查询也无法做到快速响应。如果真是这样ES也就不会称之为近实时全文搜索引擎了。为了提升写的性能,ES并没有每新增一条数据就增加一个段到磁盘上,而是采用延迟写的策略。每当有新增的数据时,就将其先写入到内存中,在内存和磁盘之间是文件系统缓存,当达到默认的时间(1秒钟)或者内存的数据达到一定量时,会触发一次刷新(Refresh),将内存中的数据生成到一个新的段上并缓存到文件缓存系统 上,稍后再被刷新到磁盘中并生成提交点。这里的内存使用的是ES的JVM内存,而文件缓存系统使用的是操作系统的内存。新的数据会继续的被写入内存,但内存中的数据并不是以段的形式存储的,因此不能提供检索功能。由内存刷新到文件缓存系统的时候会生成了新的段,并将段打开以供搜索使用,而不需要等到被刷新到磁盘。在 Elasticsearch 中,写入和打开一个新段的轻量的过程叫做 refresh (即内存刷新到文件缓存系统)。默认情况下每个分片会每秒自动刷新一次。这就是为什么我们说 Elasticsearch 是近实时搜索,因为文档的变化并不是立即对搜索可见,但会在一秒之内变为可见。我们也可以手动触发 refresh, POST/_refresh 刷新所有索引, POST/nba/_refresh刷新指定的索引。尽管刷新是比提交轻量很多的操作,它还是会有性能开销。当写测试的时候, 手动刷新很有用,但是不要在生产> 环境下每次索引一个文档都去手动刷新。而且并不是所有的情况都需要每秒刷新。可能你正在使用 Elasticsearch 索引大量的日志文件, 你可能想优化索引速度而不是> 近实时搜索, 这时可以在创建索引时在 settings中通过调大 refresh_interval=”30s” 的值 , 降低每个索引的刷新频率,设值时需要注意后面带上时间单位,否则默认是毫秒。当 refresh_interval=-1时表示关闭索引的自动刷新。虽然通过延时写的策略可以减少数据往磁盘上写的次数提升了整体的写入能力,但是我们知道文件缓存系统也是内存空间,属于操作系统的内存,只要是内存都存在断电或异常情况下丢失数据的危险。为了避免丢失数据,Elasticsearch添加了事务日志(Translog),事务日志记录了所有还没有持久化到磁盘的数据。添加了事务日志后整个写索引的流程如下图所示。

  • 一个新文档被索引之后,先被写入到内存中,但是为了防止数据的丢失,会追加一份数据到事务日志中。不断有新的文档被写入到内存,同时也都会记录到事务日志中。这时新数据还不能被检索和查询。
  • 当达到默认的刷新时间或内存中的数据达到一定量后,会触发一次 refresh,将内存中的数据以一个新段形式刷新到文件缓存系统中并清空内存。这时虽然新段未被提交到磁盘,但是可以提供文档的检索功能且不能被修改。
  • 随着新文档索引不断被写入,当日志数据大小超过512M或者时间超过30分钟时,会触发一次 flush。内存中的数据被写入到一个新段同时被写入到文件缓存系统,文件系统缓存中数据通过 fsync 刷新到磁盘中,生成提交点,日志文件被删除,创建一个空的新日志。

通过这种方式当断电或需要重启时,ES不仅要根据提交点去加载已经持久化过的段,还需要工具Translog里的记录,把未持久化的数据重新持久化到磁盘上,避免了数据丢失的可能。

  1. 段合并

由于自动刷新流程每秒会创建一个新的段 ,这样会导致短时间内的段数量暴增。而段数目太多会带来较大的麻烦。每一个段都会消耗文件句柄、内存和cpu运行周期。更重要的是,每个搜索请求都必须轮流检查每个段然后合并查询结果,所以段越多,搜索也就越慢。Elasticsearch通过在后台定期进行段合并来解决这个问题。小的段被合并到大的段,然后这些大的段再被合并到更大的段。段合并的时候会将那些旧的已删除文档从文件系统中清除。被删除的文档不会被拷贝到新的大段中。合并的过程中不会中断索引和搜索。

段合并在进行索引和搜索时会自动进行,合并进程选择一小部分大小相似的段,并且在后台将它们合并到更大的段中,这些段既可以是未提交的也可以是已提交的。合并结束后老的段会被删除,新的段被 flush 到磁盘,同时写入一个包含新段且排除旧的和较小的段的新提交点,新的段被打开可以用来搜索。段合并的计算量庞大, 而且还要吃掉大量磁盘 I/O,段合并会拖累写入速率,如果任其发展会影响搜索性能。Elasticsearch在默认情况下会对合并流程进行资源限制,所以搜索仍然有足够的资源很好地执行。

ES的性能优化
存储设备

磁盘在现代服务器上通常都是瓶颈。Elasticsearch 重度使用磁盘,你的磁盘能处理的吞吐量越大,你的节点就越稳定。这里有一些优化磁盘 I/O 的技巧:

  • 使用 SSD。就像其他地方提过的, 他们比机械磁盘优秀多了。
  • 使用 RAID 0。条带化 RAID 会提高磁盘 I/O,代价显然就是当一块硬盘故障时整个就故障了。不要使用镜像或者奇偶校验 RAID 因为副本已经提供了这个功能。
  • 另外,使用多块硬盘,并允许 Elasticsearch 通过多个 path.data 目录配置把数据条带化分配到它们上面。
  • 不要使用远程挂载的存储,比如 NFS 或者 SMB/CIFS。这个引入的延迟对性能来说完全是背道而驰的。
  • 如果你用的是 EC2,当心 EBS。即便是基于 SSD 的 EBS,通常也比本地实例的存储要慢。
内部索引优化


Elasticsearch为了能快速找到某个term,先将所有的term排个序,然后根据二分法查找term,时间复杂度为logN,就像通过字典查找一样,这就是Term Dictionary。现在再看起来,似乎和传统数据库通过B-Tree的方式类似。但是如果term太多,term dictionary也会很大,放内存不现实,于是有了Term Index,就像字典里的索引页一样,A开头的有哪些term,分别在哪页,可以理解term index是一颗树。这棵树不会包含所有的term,它包含的是term的一些前缀。通过term index可以快速地定位到term dictionary的某个offset,然后从这个位置再往后顺序查找。在内存中用FST方式压缩term index,FST以字节的方式存储所有的term,这种压缩方式可以有效的缩减存储空间,使得term index足以放进内存,但这种方式也会导致查找时需要更多的CPU资源。演示地址:Build your own FST对于存储在磁盘上的倒排表同样也采用了压缩技术减少存储所占用的空间,更多可以阅读 Frame of Reference and Roaring Bitmaps。

调整配置参数
  • 给每个文档指定有序的具有压缩良好的序列模式ID,避免随机的UUID-4 这样的 ID,这样的ID压缩比很低,会明显拖慢 Lucene。
  • 对于那些不需要聚合和排序的索引字段禁用Doc values。Doc Values是有序的基于document => field value的映射列表;
  • 不需要做模糊检索的字段使用 keyword类型代替 text 类型,这样可以避免在建立索引前对这些文本进行分词。
  • 如果你的搜索结果不需要近实时的准确度,考虑把每个索引的 index.refreshinterval 改到 30s 。如果你是在做大批量导入,导入期间你可以通过设置这个值为 -1 关掉刷新,还可以通过设置 index.numberof_replicas: 0关闭副本。别忘记在完工的时候重新开启它。
  • 避免深度分页查询建议使用Scroll进行分页查询。普通分页查询时,会创建一个from + size的空优先队列,每个分片会返回from + size 条数据,默认只包含文档id和得分score给协调节点,如果有n个分片,则协调节点再对(from + size)× n 条数据进行二次排序,然后选择需要被取回的文档。当from很大时,排序过程会变得很沉重占用CPU资源严重。
  • 减少映射字段,只提供需要检索,聚合或排序的字段。其他字段可存在其他存储设备上,例如Hbase,在ES中得到结果后再去Hbase查询这些字段。
  • 创建索引和查询时指定路由routing值,这样可以精确到具体的分片查询,提升查询效率。路由的选择需要注意数据的分布均衡。
JVM调优
  • 确保堆内存最小值( Xms )与最大值( Xmx )的大小是相同的,防止程序在运行时改变堆内存大小。Elasticsearch 默认安装后设置的堆内存是 1 GB。可通过 ../config/jvm.option文件进行配置,但是最好不要超过物理内存的50%和超过32GB。
  • GC 默认采用CMS的方式,并发但是有STW的问题,可以考虑使用G1收集器。
  • ES非常依赖文件系统缓存(Filesystem Cache),快速搜索。一般来说,应该至少确保物理上有一半的可用内存分配到文件系统缓存。

Elasticsearch集群搭建

1. 下面是三台服务器的一些基本信息
ip 监听端口 主机名称 系统版本 配置信息 es实例名称 es版本
172.16.50.51 9200/9300 es01 centos7 2u4g es01 7.6
172.16.50.52 9200/9300 es02 centos7 2u4g es02 7.6
172.16.50.53 9200/9300 es03 centos7 2u4g es03 7.6
2. 在三台服务器上面执行下面的命令,执行一些初始化工作
# 创建es运行时的用户
useradd -s /bin/bash -U elasticsearch

#修改 elasticsearch 系统文件打开数
cat << EOF >> /etc/security/limits.conf
elasticsearch soft nofile 65536
elasticsearch hard nofile 65536
EOF

#修改 max_map_count 值
sysctl -w vm.max_map_count=655360
echo 'vm.max_map_count=655360' >> /etc/sysctl.conf 
sysctl -p
3. 在三台服务器上面执行一下命令,安装es到opt目录下面
cd /opt && wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.6.1-linux-x86_64.tar.gz
tar zxvf elasticsearch-7.6.1-linux-x86_64.tar.gz && mv elasticsearch-7.6.1 elasticsearch
mkdir -p /opt/elasticsearch/data && mkdir -p /opt/elasticsearch/logs && mkdir -p /opt/elasticsearch/config/certs
chown -Rf elasticsearch.elasticsearch /opt/elasticsearch
4. 在任一台服务器上面运行以下命令生产证书用于集群间的加密通信,并将生成的elastic-certificates.p12文件复制到另外两台服务器上面的/opt/elasticsearch/config/certs目录下
/opt/elasticsearch/bin/elasticsearch-certutil cert -out /opt/elasticsearch/config/certs/elastic-certificates.p12 -pass ""
5.修改172.16.50.51这台服务器/opt/elasticsearch/config/elasticsearch.yml配置文件如下内容:
cluster.name: es-cluster
node.name: es01
node.master: true
node.data: true
path.data: /opt/elasticsearch/data
path.logs: /opt/elasticsearch/logs

network.host: 172.16.50.51
http.port: 9200
network.tcp.no_delay: true
network.tcp.keep_alive: true
network.tcp.reuse_address: true
network.tcp.send_buffer_size: 128mb
network.tcp.receive_buffer_size: 128mb

transport.tcp.port: 9300
transport.tcp.compress: true

discovery.zen.ping.unicast.hosts: ["172.16.50.51", "172.16.50.52","172.16.50.53"]
discovery.zen.minimum_master_nodes: 2

cluster.initial_master_nodes: ["172.16.50.51:9300","172.16.50.52:9300","172.16.50.53:9300"]
cluster.fault_detection.leader_check.interval: 5s
cluster.max_shards_per_node: 100000
cluster.join.timeout: 20s
cluster.publish.timeout: 60s
cluster.routing.allocation.cluster_concurrent_rebalance: 4
cluster.routing.allocation.node_concurrent_recoveries: 8
cluster.routing.allocation.node_initial_primaries_recoveries: 8

xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: certs/elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: certs/elastic-certificates.p12
6. 172.16.50.52的配置文件只需要修改node.name为es02,network.host修改为172.16.50.52即可
7. 172.16.50.53的配置文件只需要修改node.name为es03,network.host修改为172.16.50.53即可
8. 启动es,可以参考 使用supervisor运行elasticsearch
9. 最后在任一台服务器使用以下命令自动生产es的各种连接密码
/opt/elasticsearch/bin/elasticsearch-setup-passwords auto

参考文章: https://abcops.cn/archives/1192

一丁副总裁回应破产:解脱了【转载】

原地址: https://www.sohu.com/a/45792896_115402

  我们愿意付出代价为错误埋单!当我敲下这个键盘的时候,时间是23:56分,还是2015年的11月30日。尽管这个冬天不太冷,一丁还是没能熬过去。就在今天,一丁宣布破产。在这之前,一丁已经走过了15年。

  今天,一丁刷爆了朋友圈:有人怀念,有人伤感,有人同情,也有人,幸灾乐祸。。。而我们,伤感的同时是感到一阵轻松。是的,你没有看错,是轻松。背负这么大的压力前行,企业太累,老板太累,员工也太累。如今,解脱了。从今天下午开始,接了上百个电话,到现在耳朵还是烫的。有来自朋友的关心,有来自同行的同情,还有来自媒体的采访。在这之前,我从来都没觉得一丁竟然有这么大的影响力。但是原谅我,后面的电话实在是不想接了,同样的话说了百来遍,你试试看?而且,事实就如我在前面的微信里所说的,我所知道的,也并不比你们多。

  我知道的就是今天要宣布企业破产,比正式公布提前几天知道,仅此而已。写此文之前,我本来是和几个小伙伴在KTV唱歌,我不想回应社会上的各种传说,因为随着政府及司法机关介入调查,真相自会大白于天下。而且,我确实不知道太多的情况。而且我不想接受采访,我自己干了15年媒体,言多必失,许多时候背黑锅的都是新闻发言人,你懂的。但是后面,网络上的一些不实传闻持续发酵,也有些人话说得刻薄难听,我觉得我的所知尽管有限,但还是应该告诉大家,或许有一定的主观色彩,或许也是片面的,但毕竟身临其境,比起外面的无端臆测要真实些。

  其实这几天作为我们高管是很痛苦的,我已经连续几天没睡好了。已经知道公司不得不宣布破产,一切努力可能都无济于事,你的员工每天兢兢业业地上班向你汇报今天要做的事,而你还要装做什么都没发生一样地去鼓励或者指导他们。此外,还要面对最近几天在公司转悠的有黑道背景的债权人。我觉得,没有北影表演系的功底,是很难处理好这种情绪的。当然,大部分一丁的员工,真的非常可敬可爱,尽管有些部门已经收到通知,这两天公司闲杂人多不安全,但他们还是坚持到了最后。今天的局面有些失控。民间债权人都收到风声,数十名社会上的小混混强行进入公司,把所有能搬走的东西都搬空了,大到复印机、电视机、电脑,小到椅子、排插,洗劫一空。这也就是为什么不提前跟员工知会一声,就是怕出现债权人无序冲击导致员工出现意外伤害。而下午宣布之前,已经跟员工打好了招呼,让大家有所准备。

  关于老板跑路这事,或许真有其事。我们目前确实联系不上。但我觉得老板暂时消失是明智的选择。因为那些民间债权人,一旦知道钱拿不回来的时候,谁能保证他们不做出危害人身安全的举动?老板之前说过他绝不跑路,他说他犯下的错他自己来承担。按我的理解,等债权人情绪稳定下来,政府和司法机关正式介入之后,老板应该就会出现。他曾经推心置腹地跟我说过,从经商的第一天起,就做好了进监狱的心理准备。因为在他看来,中国的企业家不可能没有原罪。这是中国企业家的悲哀,更是我整个中国的悲哀。顺便说说老板这个人。出身于草根,几乎是白手起家,从一家20平米的小店,发展为资产十亿,年销售额56亿,最高峰时员工逾2000人的集团公司,靠的是什么?除了他个人的聪明才智和全体员工的努力外,还有就是今天让他深陷漩涡的银行和厂商。银行说,你生意做那么好,我给你贷款吧,没事,多贷点;厂商说,你生意做那么好,我给你授信吧,一个亿够不够,给你三个亿吧。就这样,一个靠借贷维持运转的资金链条形成了。野心越来越大,流水越做越多,业务越铺越广,然并卵,传统的电脑手机业务并不赚钱。靠借贷维持的不赚钱的业务越做越大,离死期也就越来越近了。当有一天,哪个环节的货款收不回来,资金链条出现裂痕的时候,你就死定了。这年头,经济大环境不好,都是三角债,无论多小的一家企业倒闭,都会引起多米诺骨牌的崩塌。

  当然,我并不是说,一丁的破产,全是银行和厂商的错。老板个人的盲目扩张,对一些新业态的超前布局或许是更重要的原因。有时候,领先一步半步成为先驱,领先两步三步就成为先烈。老板个人是很有格局很有追求的企业家,他不抽不喝不嫖不养小三,也不怎么陪老婆孩子,平均每天工作十几个小时,周末的时候想到什么问题也随时把所有高管喊过来开会的变态工作狂人,我经常感叹的一点是,光他这精力,就非常人所能及,所以他不成功真是没有天理。但是他的心太大了,他要改变零售的业态,一口气在全国开十几家智能生活体验馆,每家投入及亏损额度惊人。在做一丁网的时候,意图打造一个包罗未来物联网社会所有方面的网站,要做中国最大最专业的IT技术上门O2O,提前三年布局,为传说中2018年会全面到来的物联网社会做准备。可是一丁网的业务也是烧钱的,一丁网是为了2018而布局,然而他没有钱坚持到那一天,银行和厂商也不会等到那一天。所以,靠借贷维持运转的一丁,其破产的命运是不可避免的。其实我刚到集团工作时曾和老板聊到这个话题,我说大哥,咱们能不能不要布这么庞大的局,只专心做其中的一块业务好不好?那是BAT要干的活。后来我知道他也有苦衷:他根本停不下来,只有大的布局,才能讲出大的故事,才会有银行和厂商继续支持他这个不赚钱、靠借贷维持的体系。

  最近这几天,他形容憔悴,而又感觉如释重负。他说,破产也好,“进去”也好,终于可以解脱了。每年一个多亿的利息,一个不赢利的企业,几百上千号的员工。每天他醒过来第一件事,就是要考虑今天银行的利息在哪里?明天员工的工资怎么办?后天给厂商的货款能否及时到位?他活得很累,又要强行给自己打鸡血;他知道公司资金链随时可能断裂又要考虑给新的项目找钱;他放弃了与家人欢聚的时光,只为了一个遥不可及的梦想。我相信他说解脱了是真心话,表面光鲜的全国“双百强”企业的掌门人,其实是一个随时可能进监狱的“负翁”,这是他的不幸,也是所有靠烧钱维持运转的O2O企业需要思考的问题:究竟是先把规模做大,还是先把赢利问题解决好?潮水退去,终会知道谁在裸泳。他解脱了,这一天越早到来,他就越早解脱。每年一个多亿的利息,放在哪个企业身上,都是一个沉重的负担,何况是一个不赢利的民营企业。他知道这一天迟早会到来,也做好了为这一切埋单的准备,正如他自己所说的,我要为自己的错误负责,哪怕是“进去”,总比现在强撑着这么一大摊子要强。所以,当陆续有债权人上门的时候,他尽力配合。只是后面的局势失控了,出于人身安全的考虑,他不得已“跑路”了。跑路之前,他反思了三点:第一,永远不要跟银行借钱;第二,永远不要向民间借贷;第三,量力而行。他说,以后牢记这三点,我们一定还会东山再起。

  他用整个集团的破产重组换来了这三点认识,也许还要用牺牲几年自由的代价来换取另一个自由。尽管代价沉重,但他正在为他的错误埋单。许多人走过的弯路,他也走了。这一跤,摔得有点惨,以致于成为这么大的一个集团无法承受之痛。今天他失败了,不等于他对整个互联网发展的认识是错的。方向对了,时机错了。后果就是一地鸡毛。但我相信,他会回来。我相信,他会东山再起。十五年前,刚走出大学校门、一无所有满脸青涩的吴建荣,一手创办了一丁集团,今天,有经验、有人脉、有能力,也有过惨痛教训的吴建荣,有什么理由不会东山再起?不当老板,不知道当老板的苦。你只看到他成功的一面,你只看到他光鲜的一面,你只看到他上头条的一面,其实每人心中都有一本难念的经。一丁倒了你可以去二丁,二丁倒了去三丁,无非是换一份工作换一个老板而已,每月领完薪水大体上吃喝生活是不愁的。对你来说,只是一份工作而已。而对企业家来说,企业是他的全部,没错,尽管他剥削你的一部分劳动收入,但他承担了全部的风险。他要为他的失误甚至你的失误付出代价。有时候,这个代价甚至直至付出生命。一个群友说的好,企业家以一已之力,创造产品,创造价值,创造工作岗位,而自己承担起了全部的风险。他失败了,说说风凉话可以,落井下石,唯恐天下不乱真的有必要吗?

  再说说我自己。非常感谢朋友们的关心,患难见真情,当然也可以看得出来不少人挺八卦。奚落一下别人的失误,消费一下别人的失败,再八卦一下网络上亦真亦假的消息,越发显现得出来自己的消息灵通英明果敢不同凡响。许多人都这样,我也理解,只是消费别人的失败,也不见得能让自己更成功。很多朋友关心我怎么样,从事发到现在,接了一两百个电话,还有无数微信上的问候。不同的人,同样的事,同样的内容,我回答了无数遍,还是那句话:我很好,我没事。真的,我没事。老板的资金问题虽然让几个人受到牵连,但并未牵扯到我本人。因为我不管财务,不管供应链,也不管集团和老板的自持物业。简单说,我分管的是花钱的部分而非收钱的部分。所以不管是银行还是“黑社会”,找我都没用。所以我真的没事。

  我一样有解脱的感觉。我从今年六月担任集团副总裁,分管营销事业部和一丁创客咖啡,到现在时间不过半年。刚到集团不久,就感觉老板布局太过宏大,不是我们的资源和能力所能做的事情,也跟老板提过,但他就是停不下来。所以后面这一两个月其实是一直想离职,由于各种原因没有走成。再到后面的事大家都知道了,集团出了这样的状况,反而要坚持到最后。所以昨天最后一天上班,跟我的同事们做了一个交待,然后收拾东西回家。然后就和小伙伴约了去唱歌。这段时间里电话就没断过,后来我就没接了,因为答案是一样的,我所知道的就这么多。很感谢媒体的朋友们,从我到一丁集团上班起,你们就一直关心着我这个同行老同志,许多朋友不请自来,对我们一丁集团和一丁创客咖啡做了大量的正面报道。也很对不起媒体的朋友们,许多有经营任务的朋友来找我谈广告,我只能请喝咖啡,以“呵呵”来应对,现在你们知道了,我们确实没钱投广告,又不能告诉你我们没钱,所以只能这样了。还有昨天,许多记者打电话找我,让我谈什么呢?我知道的你全知道,我不知道的集团欠款的数据,还是你从网络上帮我找来的。所以我只能说抱歉。

  还有要说抱歉的是一些从事广告设计行业的朋友,他们为我们拍了视频、做了物料,结果因为货款结算的不及时,现在还拿不到钱,到时只能等破产清算了。虽然不多,但都是小本生意,出了这个事,我心难安。所以我想说的是,我会尽力帮助大家看看能否获得优先的清算。如果实在不行的话,只能由我个人慢慢还了。如果还有一个群体要说对不起的,那就是营销事业部和一丁创客咖啡的同事们。他们对于集团的状况并非完全不知,但是一直坚持到了最后,营销事业部的小伙伴们,昨天下午也全体都在。有个刚来一个月的小姑娘,已经知道唯一的这个月工资有可能要拖很久,今天上午还坚持报了自媒体的选题。我的助理小许,晚上唱歌时,还在讨论之前答应阳光学院的一件事,12月份让创客讲堂进高校。一丁创客咖啡的帅哥美女咖啡师,一直如常营业到晚上十点!我们就象大战风车的唐吉诃德,也象推着巨石上山的西西弗斯,明知做了没什么用还是努力去做,坚持到了最后一刻。这就是我们的职业素养和职业操守!我可以自豪地说,我们这个团队非常棒,只要这种职业素养和敬业精神在,即便放到哪个城市或是哪个公司,我们也豪不输人。心若在,梦就在,一切只不过是从头再来。

  所以说我虽然没事,但如果说有牵挂的,那目前就是老板的安危和这般小伙伴的出路。老板的安危估计不由我左右,但员工的出路我还是要想想办法,毕竟年底了,有些人有家有小的。所以我特别感谢一些朋友,从消息传出到现在,有十几位老板愿意接受我们的团队成员,有意向的现在基本上安排得差不多了。我只能说,你们太有眼光了,毕竟一丁的团队是经过市场的锤练,在血与火的战斗中成长起来的。相信我,他们不会让你们失望。让我感动的是,许多朋友对这场劫难抱以深切的同情,并提了很多好的建议。尤其是一丁创客咖啡,创办以来受到社会各界的热切关注,一关了之确实令许多人不舍。有些朋友希望一丁创客讲堂能易地举行,还有不少朋友表达了通过众筹方式让一丁创客咖啡继续运营的想法。还有不少朋友希望我本人去上班,或者通过某种方式与我的团队合作。在这里,我一并感谢你们,相信我,即使一丁不在了,稍作休整之后,我们的梦想还会继续生根发芽。这就算是我对一丁破产事件的个人回应和个人看法,不代表任何人。媒体的朋友们,如果想喝咖啡,换个地方我请你,如果想采访,那我只能说抱歉,确实我所知道的就这么多,或许还不全对。还有,请允许我,一个曾经的文青,卖弄一点已经过时的骚情:

伤痛让你如此美丽
你可以更加看清自己
前行的路上再无畏惧
即使面对
再多的风雨
伤痛让你如此美丽
让你可以了解世事如棋
每走一步都要小心翼翼
错了一次
就要输掉全局
伤痛让你如此美丽
让你懂得人心可期
只要我们都尚存一息
暂时别离
定会等来更好的相聚
伤痛让你如此美丽
让你明白活着就会有转机
我们的事业还会继续
风雨过后
等着你东山再起

最后,套用一句《魔鬼终结者》里的台词:I’ll be back!

那些毒害孩子的育儿法,正在刷屏朋友圈【转载】

原地址: http://www.yidianzixun.com/article/0M6iwlIT

  如果孩子摔倒了,越哭越不要理他,孩子哭够了自己会站起来的,这样教育出来的孩子会更加的独立自强。这套理论流毒之广让人乍舌,反复刷屏朋友圈,即便你没有看过类似的文章,也一定听说过它。在你把这套理论用在自家孩子身上之前,我想先问你几个问题。你知道这套理论是谁发明的么?这套理论被权威机构验证过么?你肯定都不知道,很自然的,你也不可能知道用这套理论教出来的孩子下场会如何。我现在告诉你,用这套理论教出来的孩子,轻则自卑内向,重则出现精神问题。

华生的育儿理论

  首先,你要了解到这套理论的出处,孩子摔倒不用扶的理论出自美国心理学家约翰·华生发明的哭声免疫法。所谓哭声免疫训练法,简单的说就是孩子哭泣的时候延迟一段时间再去抱,最好是哭了不抱,不哭才抱。随着延迟的时间越来越久,最终孩子就会不哭不闹,独立自强。听起来很有道理对吧,除此之外,华生还发明了延迟满足训练法和婴儿独立完整睡眠法,同样刷屏朋友圈。这套风靡中国的华生育儿理论,毒害了无数的中国孩子。因为华生理论的核心,就在于漠视孩子的亲情需求,对孩子进行冷酷训练,这会导致儿童的心理出现极大的扭曲和异常,最终被毁掉一生。
  我们把时间拉回到1920年,这一年,一个只有8个月大一点的婴儿“小艾伯特”也来到华生的身边。华生向其母亲支付了少量报酬来让其配合自己的试验,此时的华生是美国鼎鼎大名的心理学家,行为心理学的创始人,所以小艾伯特的母亲欣然接受了华生的邀请。华生在小艾伯特身边放了很多毛茸茸的小动物,如小白鼠、小兔子、小狗等。只会爬行的小艾伯特很喜欢这些小动物,华生用了2个月的时间,让小艾伯特和这些毛茸茸的小动物建立了亲密的情感联系。然后,华生开始了他的试验。华生把一只小白鼠像往常一样放在小艾伯特的身边,当艾伯特开心的想要和小白鼠接触的时候,华生突然在他背后重击一根大铁棒,发出巨大刺耳的声音,当场吓得小艾伯特剧烈抽搐并哇哇大哭。反复几次试验之后,只要小白鼠出现在小艾伯特的身边,他就会立刻放声大哭并试图躲避。在华生用其他动物实验几次之后,小艾伯特已经开始恐惧所有毛茸茸的东西,不管是小白兔还是小狗,那些曾经给小艾伯特带来爱与快乐的小动物,现在只要放到小艾伯特的身边,他就会立刻开始恐惧并哭泣。
  小艾伯特的恐惧反应,让华生兴奋异常,他据此撰写了一篇论文,认为人的行为,是可以被训练出来的。华生的论文一出来就震惊了全球的教育界和心理学界,华生被公认为欧美最伟大的教育家。华生以按照成人的需求对孩子行为训练为核心思想,衍生出了哭声免疫法、延迟满足法、婴儿独立完整睡眠法等一系列看起来毫无问题的育儿办法。在华生的理论体系中,人就是机器,你对孩子输入什么样的塑造和训练,就会得到什么样的什么样的输出结果。当孩子这个程序出现异常的时候,只要采取一些惩罚措施,就可以让其重回正轨。
  华生对世界宣称:“给我一打健全的婴儿,把他们带到我独特的世界中,我可以保证,在其中随机选出一个,训练成为任何我所选定的任何类型的人物——医生、律师、艺术家、商人,或者乞丐、窃贼,不用考虑他的天赋、倾向、能力、祖先的职业和种族。
            ——行为主义创始人约翰·华生
  华生的理论问世之后,受到了大量美国家长的欢迎,就好像今天中国的杨教授用电击矫正法受到大量中国家长的欢迎一样。华生的理论戕害了美国数代儿童,直到40年后,心理学家哈洛才用恒河猴母爱剥夺试验彻底推翻了华生的理论。

恒河猴母爱剥夺试验

  哈洛,被列为20世界最残忍的科学家之一,是PETA(善待动物组织)最讨厌的心理学家。他的恒河猴母爱剥夺试验带来的巨大心理创伤让几代恒河猴生不如死。但是,他却彻底颠覆了人类的育儿方法,挽救了无数的人类儿童。哈洛成为教授之后,为了研究猴子的学习行为,建立了一座猴子的实验室,从此和猴子结缘。为了防止猴子生病传染,实验室执行一猴一笼的隔离喂养,哪怕是刚出生的小猴子,也要和母亲分离,这叫产妇剥离。当时华生发明的育儿理念认为,越早将婴儿和产妇剥离,越容易培养孩子的独立性,孩子哭,那就任他哭,哭一夜也不用理会。当时的美国,产后立刻断奶,让孩子独立睡小屋,尽量避免和孩子进行亲密接触,以此来培养孩子独立性的的父母不计其数。按照这一育儿理论,出生后就独立生活在一个笼子里的猴子,应该比自然条件下母猴养育的同类更加的强壮聪明。但是哈洛却发现这些小猴子极其不对劲,和正常的猴子行为出现了巨大差异。这些被产妇剥离的小猴子,目光呆滞,当被撤掉笼子时,他们手足无措,不知道如何和同类相处。而且,这些幼猴无一例外,都对铺在笼中的毛巾产生了强烈的依恋,他们喜欢抱着毛巾,或者用毛巾裹住自己。当哈洛想换掉脏毛巾时,这些幼猴全部产生了激烈的抗拒反应,恐惧的尖叫并缩成一团。按照当时华生的育儿理论,婴儿只会对食物产生依恋,只要给予婴儿充足的食物,母亲是可有可无的,而过度的亲情,只会让被溺爱的孩子成年后丧失独立自强的精神。
  华生所有的理论,无论是哭声免疫法还是婴儿独立完整睡眠法,都建立在这个基石之上。但是毛巾又不能吃,这些猴子这么喜欢毛巾干什么?这种现象让哈洛困惑不解,然后哈洛设计了一个巧妙的试验。哈洛给猴子们准备了两个假妈妈,一个是用钢丝网做成的“铁丝妈妈”,上面带有奶瓶,只能给幼猴提供食物,但是无法拥抱。而另一个是覆盖着软垫的“布料妈妈”,只能提供拥抱,但是不能提供食物。按理说,能提供食物的“铁丝妈妈”,将得到幼猴最大的关注和喜爱,但是实验结果截然相反。所有的幼猴,无一例外的选择了没有乳汁的“布料妈妈”,绝大部分时间,他们都依偎在“绒布妈妈”的身边,只有在饥饿时,他们才会爬到“铁丝妈妈”身上一小会。而当哈洛把发出巨大声响的机械丢到笼子里恐吓幼猴时,恐惧的幼猴紧紧的抱住了布料妈妈,毫不犹豫的抛弃了铁丝妈妈。幼猴,将布料妈妈,当成了安全之源,因为布料妈妈能给幼猴带来拥抱的安全感,这就解释了为何幼猴如此喜爱笼子里的毛巾,因为它把毛巾当成了自己妈妈的怀抱。
  哈洛又做了一个旷场实验,他在幼猴的笼子里放了很多玩具,当笼子里有布料妈妈时,幼猴会大胆的离开布料妈妈,去试图触碰那些玩具,然后迅速的返回布料妈妈的怀抱里。但是当哈洛把布料妈妈撤走时,这些幼猴会缩成一团,表现出非常恐惧的不安全感,给再多玩具也不要,拒绝接触外界的一切事物。哈洛由此得出结论,独立并不是简单的孤立和狠心培训可以得到的,恰恰相反,细心呵护、在妈妈的怀抱里得到安全感的孩子,更愿意去外界独立探索,长大后会更加独立,更加适应社会。
  你以为试验到这里就结束了么?没有,在观察这群猴子数年之后,哈洛发现了更为惊人的现象。当初那群被产妇剥离后长大的猴子,成年后出现了明显的孤僻、抑郁和自闭,有的猴子甚至出现了强烈的自残性,出现了极其明显的心理问题。这群幼猴中,有20只母猴产下了后代,其中7只对自己的孩子表现冷漠,对小猴不理不睬。8只极其暴力的殴打、虐待自己的孩子,有4只更是残忍的杀死幼猴,其中一只幼猴直接被咬碎头骨而死亡。只有1只母猴,笨拙的尝试给自己的孩子喂奶。
  恒河猴母爱剥夺试验证明,那些从小缺乏母爱的人,成年后极易出现巨大心理障碍,且没有能力去抚养后代。哈洛的论文发表后,一夜之间华生就成为了美国妈妈最讨厌的人,华生育儿法被彻底推翻。人们发现,小艾伯特6岁即死于脑积水,所以小艾伯特的案例其实并没有支持华生的理论。但是,华生的孩子们还在,华生坚信自己的理论是正确的,并用自己的理论来教育自家的孩子。华生大儿子雷纳在父亲行为主义理论的教育下,精神出了严重的问题,多次自杀,并在三十多岁时成功自杀身亡。华生的女儿Mary,在成年后,同样多次自杀,患有严重的心理疾病,华生的小儿子离家出走,常年流浪。践行“行为主义婴儿训练法”的华生家族,悲剧甚至延续到了第三代,华生的外孙女Mariette酒精成瘾,心理异常,多次考虑自杀。
  晚年的华生也开始后悔自己出版的育儿理论,表示自己在这方面的研究并不充分,但是这无法挽回他的孩子和万千美国儿童一生的幸福。在美国人全面废弃华生理论的数十年之后,这套洋垃圾漂洋过海,被中国的一群营销号发现,如获至宝,发布之后疯狂的刷屏朋友圈。当年整个美国的精英都没有发现华生的理论有什么问题,一个普通的中国妈妈怎么可能发现这里面蕴藏的巨大陷阱。所以,千千万万的中国儿童成为了这套邪恶理论的牺牲品。孩子不哭的时候,多鼓励孩子站起来,孩子哭泣的时候,请第一时间去抱抱自己的孩子,因为他需要你。当你冷漠的看着你的孩子时,他的内心世界,和这只幼猴是完全一致的。冷漠的训练孩子,的确能得到一个不哭不闹的孩子,但是那并不是孩子变乖了。而是婴儿在绝望中陷入死寂的平静,不再对外发出信号。婴儿对母亲和世界的信任,就这么被掐灭在摇篮中,他的未来,将充满孤寂和灰暗。