归档

elasticsearch学习笔记 - 集群相关术语

基本概念

  1. Cluster:集群。
    顾名思义就是好多es服务器,拜了把子成了兄弟,在一起搞事情,他们讲义气不背叛,一个有难八方支援。比如你有8台服务器,其中一台挂了,剩余的兄弟会立刻顶上。客户让然可以正常使用你的服务,从而实现高可用性

  2. Node:节点。
    集群中的每台服务器称之为一个节点。每个节点都是一个兄弟。既然拜了把子,那就有个长幼顺序(节点类型),这个看下面的节点类型小节,先看分片。

  3. Shard:分片。
    一只烤全羊,一个人肯定吃不了,怎么办呢?大家分着吃啊。所以就有了分片,大量的数据汇聚过来,一个节点可能由于内存或磁盘处理能力不足,那就把数据切成一小块一小块的(这就是分片),好几个兄弟一起处理。每个分片放到不同的服务器上。 这样处理起来就快了。
    有肉一起吃,敌人来了当然也要一起扛。当有查询过来的时候,ES会把查询发送给每个相关的分片,并将结果组合在一起,然后返回给用户。

  4. Replia:副本。
    分着吃羊肉,羊是吃完了,但每个人分到的不一样啊,有人吃羊腿,有人吃羊尾巴,显然这样长期下去也是不行的。怎么办呢,再来一只,吃羊腿的再吃羊尾巴,吃羊尾巴的再吃羊腿,这样就公平了。每个人都能说出整只羊各个部位是什么味道。
    同样的道理,数据分片,放在了不同的节点上,如果一台服务器挂掉了,那岂不是数据就丢失了,这种事是不允许发生的,因此就有了副本。每个切片复制一份,发送给其他节点。这样保证每个节点有完整的数据。集群中有一台宕机了也不影响使用。

elasticsearch学习笔记 - 安装

最近用到了es,于是从网上找资料,但是好多都过时了,比如type在elasticsearch 6.0开始已经不推荐使用了。联合查询6.x使用的是join类型的字段,也不在支持type之间的联合查询。问什么要取消type呢?官方给出的理由是

①,而在我们elasticsearch中同一 Index 下,同名 Field 类型必须相同,即使不同的 Type;
②, 同一 Index 下,TypeA 的 Field 会占用 TypeB 的资源(互相消耗资源),会形成一种稀疏存储的情况。尤其是 doc value ,为什么这么说呢?doc value为了性能考虑会保留一部分的磁盘空间,这意味着 TypeB 可能不需要这个字段的 doc_value 而 TypeA 需要,那么 TypeB 就被白白占用了一部分没有半点用处的资源;
③,Score 评分机制是 index-wide 的,不同的type之间评分也会造成干扰。
④,索引元数据本身是放在主节点中维护的,CP 设计。意味着涉及到大量字段变更及元数据变更的操作,都会导致该 Index 被堵塞或假死。我们应该对这样的 Index 做隔离,避免影响到其他 Index 正常的增删改查。甚至当涉及到字段变更十分频繁且无法预定义 schema 的场景时,是否要使用 ES 都应该慎思熟虑了!

出现这种情况主要是在elasticsearch早期时候提出的一些概念,当时为了便于推广,跟关系型数据库作了如下比喻:

myql elasticsearch
database index
table type
column field

很多学习elasticsearch的人估计都看过这个比喻,但其实这是错误的。elasticsearch是基于 Lucene开发的,而在 Lucene中是没有table概念的,有的只是文档和字段。

nohup命令说明

nohup是Linux的一个常用命令,当你想要在退出账户或者关闭终端后进程仍在运行时,就可以使用nohup命令。nohup就是不挂断的意思(no hang up)。

nohup的一般形式为:

1
nohup command >> file 2>&1 &

如果不将 nohup 命令的输出重定向,输出将附加到当前目录的 nohup.out 文件中,否则就是自己指定的文件。

git reset命令详解

git reset命令,非常牛的一个命令,这个命令可以让你时光穿梭回到过去。用在自己分支上很好用,但是千万不要在公共分支上使用。以免造成历史混乱,破坏历史可是重罪,别看那些穿越小说混的风生水起,那都是骗人的。

用git reset之前先要了解几个概念

  • HEAD
    这是当前分支版本顶端的别名,也就是在当前分支你最近的一个提交,也就是本地仓库,即你的commit记录

  • Index
    index也被称为staging area,即add的记录

  • Working Copy
    working copy代表你正在工作的那个文件

mysql权限说明

关于mysql的权限简单的理解就是mysql允许你做你权利以内的事情,不可以越界。比如只允许你执行select操作,那么你就不能执行update操作。只允许你从某台机器上连接mysql,那么你就不能从除那台机器以外的其他机器连接mysql。

那么Mysql的权限是如何实现的呢?这就要说到mysql的两阶段验证,下面详细介绍:
第一阶段:服务器首先会检查你是否允许连接。因为创建用户的时候会加上主机限制,可以限制成本地、某个IP、某个IP段、以及任何地方等,只允许你从配置的指定地方登陆。
第二阶段:如果你能连接,Mysql会检查你发出的每个请求,看你是否有足够的权限实施它。比如你要更新某个表、或者查询某个表,Mysql会查看你对哪个表或者某个列是否有权限。再比如,你要运行某个存储过程,Mysql会检查你对存储过程是否有执行权限等。

git保存密码

git每次提交都输入密码,非常麻烦,让它记住密码就好了。一劳永逸的做法是永久保存,这样每次都不用输入密码。但是,这样会有安全问题,如果电脑忘了关机,任何人都可以对其进行操作。最好是让密码有个时效性,当超过了指定时间,密码自动失效。

mysql主从配置

本教程配置是mysql5.7 不同的版本配置方式有差异,仅供参考

Master的配置

修改配置

修改/etc/mysql/mysql.conf.d/mysqld.cnf(配置文件具体位置根据)

1
2
3
4
5
6
7
[mysqld]
log-bin=mysql-bin
server-id=2
binlog-ignore-db=information_schema
binlog-ignore-db=cluster
binlog-ignore-db=mysql
binlog-do-db=test

这里的server-id用于标识唯一的数据库,在从库必须设置为不同的值。

binlog-ignore-db:表示同步的时候忽略的数据库

binlog-do-db:指定需要同步的数据库

配置完成后重启mysql服务

团队开发中如何使用git分支

git已经成为团队代码管理的标配,合理的使用git分支进行开发,可以大大提高开发效率,降低管理成本。好多人听过git fllow,但都是一知半解,其实并不神秘,也很简单。这是很多研发团队总结出来的一种分支策略而已。