笔者所在公司前段时间对线上Elasticsearch进行了一次比较大的升级,版本由1.6.1升级到了5.5.0,由于版本跨度较大,在升级的过程中踩了不少坑,所以将整个过程记录下来,希望能够给需要的同学提供一点帮助。整个升级过程大概分为了下面几步:
- 安装新的ES集群
- 对Mapping和程序代码进行改造
- 迁移数据并进行双写
接下来就逐条说明。
安装并配置Elasticsearch集群
ES的安装很简单,在每台服务器上执行下面的命令:
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.5.0.tar.gz
# 解压
tar zxvf elasticsearch-5.5.0.tar.gz
# 将解压后的目录移到/opt下
mv ./elasticsearch-5.5.0 /opt
下载并解压5.5.0的包,然后直接运行bin目录下的elasticsearch命令即可正常启用ES。如果我们不做任何配置,这样运行起来的ES其实是处于测试环境的,我们这里需要在正式环境使用ES,因此还需要做一些配置。其中比较重要的配置有如下几个:
1、 cluster.name
指定集群的名称,如果某个集群想添加新的节点,那么这个节点所配置的集群名称必须和集群中其他节点的名称保持一致。
2、 node.name
节点名称,方便我们在管理节点的时候区分当前是哪个节点,所以只要取一个有意义的名字即可,比如可以利用当前机器的IP来命名:node-159,159是这台机器的IP。
3、 path.data
和 path.logs
这两个参数默认情况下指向的是/{ES_HOME}/data
和/{ES_HOME}/logs
目录,但是不排除以后ES升级了将原目录删除的可能,如果数据文件和日志文件都在默认路径下就有被误删的风险。因此,这里建议将两者单独存放,比如,数据放在/data/elasticsearch
目录下,日志可以放在/var/log/elasticsearch
目录下。
4、 bootstrap.memory_lock
这个配置在正式环境中非常重要,通过将其设为true
,可以对jvm的内存进行锁定,从而避免了物理内存中数据的换入/换出,而且在正式环境里,ES启动的时候也会做一个检查,如果发现不能锁定内存,将导致程序启动失败。
5、 network.host
默认情况下这个值是127.0.0.1,这就意味着我们只能通过本机来请求ES的rest api,并且,如果你希望搭建集群,那么也只能发现本机的其他节点。 因此,在正式环境,需要将其指定为本机的IP。
6、 http.port
默认是9200,一般也不需要改。
7、 discovery.zen.ping.unicast.hosts
Zen 发现机制是ElasticSearch中默认的用来发现新节点的功能模块,在1.6的版本中,默认采用多播的模式来寻找其他节点,但是在比较大的集群里,这种多播的模式会产生很多不必要的流量开销,因此,2.0之后的版本只能使用单播模式。单播模式是这样的,新加入的节点会发送一个ping请求到事先设置好的地址中,来通知集群它已经准备好加入到集群中了,这个事先设置好的地址就是这个参数指定的地址。
8、 discovery.zen.minimum_master_nodes
这个参数主要的作用就是避免脑裂
现象的发生,那什么是脑裂
现象呢?由于某些节点的失效,部分节点的网络连接会断开,并形成一个与原集群一样名字的集群,这种情况就称为脑裂(split-brain)现象。脑裂现象最大的问题在于,新形成的两个集群会同时索引和修改集群的数据。而这个参数的含义是说:需要多少个节点才能选举一个Master节点,默认值是1。根据经验这个值一般设置成 N/2 + 1,N是集群中节点的数量,例如一个有3个节点的集群,minimum_master_nodes
应该被设置成 3/2 + 1 = 2(向下取整)。由于节点数不满足选举新的mater的条件,因此也就一定程度避免了脑裂现象。
除了上面的这几条配置,我们比