2021-02-14 情人节关于ES的思考

ES,ElasticSearch的缩写,并不特殊,特殊的是今天是西方的情人节,说起情人节,是不是最先想到的是圣瓦伦丁这位大神,一个基督徒。其实这位大哥跟情人节没什么直接关系,把情人节跟他的名字联系在一起的是英国的李白,乔叟;把情人节炒作起来的是贺卡/邮币商人还有当初做了心形巧克力的吉百利。
ES跟数据库有些相似之处,毕竟它也来自Compass,15年前为西安的华商网做搜索,第一次用到了Lucene/Compass,到了现在搜索领域的热度远不如当年,技术上的确也有进步,对比大数据还是差了很多。ES最近我们也在用,的确是因为要把用户的使用情况这种使用日志记录下来,就是记录“某某在几月几日几点几分在系统上做了什么操作,就是系统使用日志”,为啥我们要记录这些,就是想记录之后,能够看到大家在系统上作业的过程,从流程到时间都会记录,还能让管理者更好的进行搜索也是避免一些操作型风险的产生。既然说ES跟数据库有相似之处,相似在:


数据库-ES
  • 索引(Index): 索引与关系型数据库实例(Database)相当。索引只是一个 逻辑命名空间,它指向一个或多个分片(shards)
  • 文档类型(Type):相当于数据库中的表的概念。每个文档在ES中都必须设定它的类型。文档类型使得同一个索引中在存储结构不同文档时,只需要依据文档类型就可以找到对应的参数映射(Mapping)信息,方便文档的存取。
  • 文档(Document) :相当于数据库中的row, 是可以被索引的基本单位。例如,你可以有一个的客户文档,有一个产品文档,还有一个订单的文档。文档是以JSON格式存储的。在一个索引中,您可以存储多个的文档。
    ES主要就这些基本概念了,弄明白很容易。别问为啥能进行搜索,因为这还要借助于分词工具比如“ik_max_word”等。
PUT my/_doc/1
 {
    "msg":"我爱北京天安门"
 }
POST /my/_search
{
    "query": {
        "match": {
            "msg": "北京"
        }
    }
}
PUT my/_mapping
{
    "properties": {
        "msg": {
            "type": "text",
            "analyzer": "ik_max_word"
        }
    }
}

只要我们给定我们的标准日志格式,就能够轻松获取所有的日志。ES只是存储了这些索引,更方便进行检索。前后联动的逻辑,我们不细说了,因为都一样。

<template>
  <div id="login">
    <el-form ref="form" :model="User" label-width="80px">
      <el-form-item label="账号">
        <el-input v-model="User.username"></el-input>
      </el-form-item>
      <el-form-item label="密码">
        <el-input v-model="User.password" type="password"></el-input>
      </el-form-item>
      <el-form-item>
        <el-button type="primary" @click="toLogin">立即登录</el-button>
        <el-button>取消</el-button>
      </el-form-item>
    </el-form>
  </div>
</template>

<script>
const axios = require("axios");
export default {
  name: 'login',
  data () {
    return {
      User: { //Assume user has only two attributes
        username: '',
        password: ''
      }
    }
  },
  methods: {
    toLogin () {//登录方法
      var vm = this;
      axios.post('http://localhost:8080/login', this.User)
        .then(function (response) {
          if (response.data.state == 200) {//登录成功
            vm.$notify.success({//弹窗
              title: '登录',
              message: '登录成功!',
              position: 'bottom-right'
            });
        })
        .catch(function (error) {
          console.log(error)
        })
    }
  }
}

</script>

<style>
#login {
  width: 800px;
  margin: 0 auto;
  margin-top: 100px;
}
</style>

Java的代码片段如下:


@RestController
public class LoginController {

    @Autowired
    private UserServiceImpl userService;

    /**
     * Login
     * @param response
     * @param request
     * @param user
     * @param model
     * @return
     */
    @PostMapping("/login")
    public ResponseResult Login(HttpServletResponse response , HttpServletRequest request, @RequestBody User user, Model model){
        ResponseResult responseResult=new ResponseResult();
        try {
            User my-user = userService.userlogin(request, response, user);
            if (user2!=null){
                responseResult.setState(200);
                responseResult.setMsg("登录成功!");
                return responseResult;
            }
        }catch (Exception e) {
            .....
        }
    }.....

UserServiceImpl.java
@Service
public class UserServiceImpl{
    @Autowired
    private UserDao userDao;

    private Map<Integer,String> UserLogin = new HashMap<>();
    @Resource
    private KafkaTemplate<String, String> kafkaTemplate;
    /**
     * 登录
     * @param request
     * @param response
     * @param u
     * @return
     */
    public User userlogin(HttpServletRequest request, HttpServletResponse response, User u){
        //查询登录是否成功
        User user=userDao.findByUsernameAndPassword(u.getUsername(),u.getPassword());
        //判断user是否为空
        if(user==null){
            return null;
        }
       kafkaTemplate.send("Kafka.topic.user", user.toString());
        return user;
    } .....

只要再写个Consumer消费一下消息,并且把消息的内容ES一下即可:

KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);
consumer.subscribe(Collections.singletonList("Kafka.topic.user"));

说白了就是这么个过程


VUE->Spring Controller - Kafka->ES

当然,你完全可以通过Logstash来完成这件事,也不复杂,还是ELK的精髓所在。
日志的来源还是靠客户端的事件获取。ES的shards是用来做集群使用的,关于集群ES倒是用不上Zookeeper了,因为自己干的就是这么个集群的事情,用分片这个词更恰当。ES可以把一个完整的索引分成多个分片,这样的好处是可以把一个大的索引拆分成多个,分布到不同的节点上。构成分布式搜索。分片的数量只能在索引创建前指定,而且索引创建后不能更改。除了分片,ES还提供Replicas,代表了索引副本,副本的作用一是提高系统的容错性,当某个节点某个分片损坏或丢失时可以从副本中恢复。二是提高ES的查询效率,能够自动对搜索请求进行负载均衡(设计的的确巧妙)。当然在实际使用的场景下,一些基本的设置还是要注意的,比如:

  • 内存:特别是机器内存大于64G的时候,还有GC,另外像Query Cache的设置,是否需要手动Flush,避免使用脚本来对ES进行线上的操作等等。
    总之,还是要在实际场景中去使用,技术才会有价值,好吧还是祝大家情人节快乐。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容