1 前言
1.1 概述
本文档针对ElasticSearch2.1.2内部版本的部署进行介绍。
1.2 适用范围
需要部署ElasticSearch集群的项目。
1.3 部署环境
本文档以最小化安装的Centos7 64位操作系统作为示例进行介绍。
2 部署软件包
elasticsearch-2.1.2.tar.gz
3 部署
3.1 部署环境准备
3.1.1 部署服务器
假设需要在以下三台服务器上搭建ES集群:
172.16.58.21,主机名为bigdata01;
172.16.58.22,主机名为bigdata02;
172.16.58.23,主机名为bigdata03。
注意:这些服务器的ES数据目录所在磁盘请使用ext4文件系统。
3.1.2 关闭相关服务
su - root
- 关闭防火墙
需要在每台服务器关闭防火墙:
systemctl disable NetworkManager.service
systemctl disable firewalld.service
systemctl stop NetworkManager.service
systemctl stop firewalld.service
- 关闭SELinux
集群每台服务器都需要关闭SELinux:
vi /etc/selinux/config
SELINUX=enforcing修改为SELINUX=disabled
注意SELINUXTYPE配置不需要修改
此操作为常见配置,对于Spark部署来说是非必要操作,建议配置。
注意:关闭SELinux后需要重启服务器才会起效。
异常情况处理:
- 错误修改SELINUXTYPE为disabled导致开机失败
系统启动时,按下“e”键进入grub编辑界面,编辑grub菜单,使用上下键选择“kernel”一行,按“e”键进入编辑,在末尾增加“enforcing=0”,按“enter”保存设置并退到上一层,按“b”键继续引导后正常开机,修改“/etc/selinux/config”中的“SELINUXTYPE=targeted”。
- 修改SELINUX后开机卡在登录页面或报faild to load SELinux policy freezing错误
重启时在启动页面按 e,进入 grub 编辑页面,找到 linux 那一行,在最后的 language 后面空格加上 selinux=0,按 ctrl + x 重新启动系统,系统启动后删除 /etc/selinux 下面的 config~ 文件。
3.1.3 配置主机名和IP映射
为每台服务器配置主机名,并对集群中所有节点进行主机名和IP映射。
su - root
- 修改主机名
hostnamectl set-hostname 新主机名
以上命令会更新/etc/hostname文件,因此重启后新主机名依然起效。
执行如下命令使新主机名马上起效:
systemctl restart systemd-hostnamed
- 配置全部节点的IP和主机名映射
vi /etc/hosts
内容为:
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
172.16.58.21 bigdata01
172.16.58.22 bigdata02
172.16.58.23 bigdata03
3.1.4 关闭文件更新时间、关闭swap文件交换
vi /etc/fstab
- 注释包含swap的行:
# /dev/mapper/centos-swap swap swap defaults 0 0
- 关闭文件更新时间,若有多个盘可相应配置
/dev/mapper/centos-root / ext4 noatime,nodiratime 0 0
一般来说,只需要在数据目录配置noatime,nodiratime,若此前相关目录已配置为default,需要把defaults修改为noatime,nodiratime,可通过以下命令查看数据目录的设备名称:
df -h
注意:必须重启服务器,才能使此配置起效。
异常情况处理:
修改完此文件重启服务器后,发现根目录下的所有文件无法修改,如用“touch xxx”命令创建文件失败并报为只读文件系统。查看/etc/fatab文件内容,若根目录的配置被注释了,说明是此错误配置造成的,需要执行如下命令使根目录恢复为可读写状态:
mount -o remount, rw /
然后修改/etc/fstab文件,把根目录的配置的注释去掉。
3.1.5 内存设置参数调整
vi /etc/sysctl.conf
增加:
vm.swappiness=0 # 设置尽可能利用物理内存,在用尽物理内存情况下才使用虚拟内存
vm.max_map_count=655360 # 放开map counts的限制
执行如下命令使配置马上起效:
sysctl -w vm.max_map_count=655360
3.1.6 创建用户和用户组
注意:
每台服务器的es用户的密码必须相同;
若此前已有es用户,则可跳过该小节;
同一台服务器上安装的多个ES可共用es用户及起主目录/opt/es。
创建es用户和用户组
su - root
# 创建用户组,若1001号用户组已经被占用,可换成其他数字
groupadd -g 1001 es
# 创建用户,若用户组号不为1001,需要相应修改
useradd -d /opt/es -s /bin/bash -g 1001 es
passwd es
以下为命令行提示:
更改用户es的密码。
新的密码:es
无效的密码:密码少于8个字符
重新输入新的密码:es
passwd:所有的身份验证令牌已经成功更新。
注意:
标红部分为手工输入的内容,输入过程界面不会显示密码内容;
只有当密码长度少于8时,使用passwd命令修改密码才需要输入两次密码。
设置环境配置权限
chown -R es:es /opt/es
异常情况处理:
- 用户主目录原本存在
若用户主目录在创建用户之前已经存在,在创建用户时会提示目录已存在的提示,此时创建用户是成功的,但切换到用户时会出现如下情况:
[root@bigdata01 ~]$ su - es
上一次登录:日 12月 18 11:20:44 CST 2017pts/0 上
-bash-4.2$
此情况说明用户主目录的用户信息文件未正确创建,此时用户无法正常使用。
解决办法:
su - root
cp .bashrc .bash_profile .bash_logout /opt/es/
chown -R es:es /opt/es/
su - es
source .bashrc .bash_profile
此时命令行提示变成如下:
[es@bigdata01 ~]$
若回到root用户后再切换为es用户后依然如上提示,说明创建用户成功。
- 需要删除用户或用户组
su - root
# 删除用户命令
userdel es
# 删除用户组命令
groupdel es
3.1.7 设置可打开的最大文件个数、放开最大可锁定内存限制
- 修改配置
vi /etc/security/limits.conf
添加:
es soft nofile 65535
es hard nofile 65535
es soft nproc 65535
es hard nproc 65535
es soft memlock unlimited
es hard memlock unlimited
执行如下命令放开锁定内存限制:
ulimit -l unlimited
- 配置在登录后自动加载以上设置
vi /etc/pam.d/login
增加:
session required /lib64/security/pam_limits.so
3.1.8 安装JDK
每台服务器都必须安装JDK 1.8.0_60,请参考《JDK1.8.0_60 部署文档》。
3.2 部署步骤
注意:
3.2.1、3.2.4节都需要在每台服务器进行操作,3.2.2、3.2.3、3.2.5节只需要在需要配置免密码登录的服务器上执行。
配置免密码登录的目的如下:
当需要在一台服务器上批量操作多台服务器时,如批量启停软件节点,为了避免每次远程到其他服务器执行命令时都需要输入密码,就需要在该服务器对目标服务器配置免密码登录,若只需要以其中一台来管理整个集群,则只需要在一台服务器上按照3.2.3的步骤来配置免密码即可,若希望使用多台来管理,则需要在这些服务器上都操作3.2.2、3.2.3、3.2.5。
3.2.1 上传软件到服务器
上传elasticsearch-2.1.2.tar.gz到每台服务器,如/tmp目录,解压到安装目录:
su - root
tar -zxf /tmp/elasticsearch-2.1.2.tar.gz -C /opt
cd /opt/es
ln -s elasticsearch-2.1.1 es
chown -R es:es /opt/es
chmod -R 777 /opt/es/install
注意:
本文档默认/opt目录下此前未安装过ES在/opt/es目录中,若此前安装过,需要安装到另外的目录,需要如下操作:
假设安装到/opt/esface目录中
su - root
mkdir /opt/esface
tar -zxf /tmp/elasticsearch-2.1.2.tar.gz -C /opt/esface
cd /opt/esface
mv es/* ./
rm -rf es
ln -s elasticsearch-2.1.1 es
chown -R es:es /opt/esface
chmod -R 777 /opt/esface/install
安装的多个ES都可以共用es用户。
对于后续步骤,都应以/opt/esface目录作为安装目录来相应修改。
3.2.2 安装必要的软件
su - root
cd /opt/es/install/rpm
rpm -ivh tcl-8.5.7-6.el6.x86_64.rpm
rpm -ivh expect-5.44.1.15-4.el6.x86_64.rpm
注意:这两个软件为做免密码登录必要的软件,要先安装tcl后再安装expect,若系统之前已安装,则可以跳过此步。
3.2.3 配置免密码登录
注意:所有节点必须能相互ping通,所有服务器的es用户已创建好,并且密码必须相同才能使用下面的方法配置免密码登录。
以在bigdata01服务器上作为例子,具体配置步骤如下:
su - es
- 修改脚本读取的IP和主机名映射
vi /opt/es/install/servers.txt
内容为:
172.16.58.21 bigdata01
172.16.58.22 bigdata02
172.16.58.23 bigdata03
- 给es用户做免密码登录
cd /opt/es/install
ssh-keygen -t rsa # 提示输入时直接按回车确认
./establishSSH.sh es es /opt/es
其中:
establishSSH.sh脚本的参数含义如下:
第一个参数:用户名;
第二个参数:用户密码,部署的多台服务器中想用用户名的密码必须相同;
第三个参数:用户主目录,根据3.2.4节中配置的主目录为/opt/es
验证:
使用es用户执行“ssh ip date”和“ssh hostname date”在其他每台服务器执行查看时间的命令,若不需要输入密码即可查看其他服务器的时间,则表示免密码登录做成功。
例如:
ssh 172.16.58.21 date
ssh bigdata01 date
注意:必须ssh ip date和ssh hostname date都不需要输入密码时,免密码登录才算完全配置成功。
异常情况处理:
若此前创建过免密码登录,在操作时会提示是否覆盖文件(y/n),输入y回车覆盖文件继续操作即可。若免密码一直无法做成功,可如下操作(假设要从bigdata01做免密码到全部服务器):
远程到每一台服务器(包括bigdata1),执行如下操作:
su - es
rm -rf ~/.ssh
然后远程到bigdata01,执行如下操作:
su - es
ssh-keygen -t rsa
# 以下ssh-copy-id命令针对bigdata01-03,172.16.58.21-23
# 都分别执行一次,也就是总共执行6次ssh-copy-id命令
ssh-copy-id -i ~/.ssh/id_rsa.pub es@bigdata01
ssh-copy-id -i ~/.ssh/id_rsa.pub es@172.16.58.21
...
ssh-copy-id -i ~/.ssh/id_rsa.pub es@bigdata03
ssh-copy-id -i ~/.ssh/id_rsa.pub es@172.16.58.23
注意:ssh-copy-id命令每次执行都需要输入用户密码
以上命令执行完后,尝试用ssh命令从bigdata01远程到任意节点(包括自身),确认免密码登录是否都做成功。
3.2.4 修改ES配置文件
- 修改配置文件
vi /opt/es/es/config/elasticsearch.yml
修改:
cluster.name: 集群名称
node.name: 节点名称
network.host: 本机IP地址,如172.16.58.21
http.port: 端口号,若不设置默认为9200
transport.tcp.port: 端口号,若不设置默认为9300
node.master: true/false
node.data: true/false
discovery.zen.ping.unicast.hosts: ["172.16.58.21:9300","172.16.58.22:9300","172.16.58.23:9300"]
discovery.zen.minimum_master_nodes: 数字
bootstrap.mlockall: true/false
注意:
cluster.name应全部字母小写,可由字母、数字、下划线等组成,cluster.name同名的节点才会组成集群;
每个节点都应有唯一的node.name,命名规则同cluster.name,一般命名为主机名;
http.port是http访问端口,如通过web网页访问ES集群或通过RESTful接口操作ES集群等通过此端口进行;
transport.tcp.port是tcp访问端口,通过编程语言API来操作ES集群时通过此端口进行;
若本节点可作为Master节点,node.master参数需设置为true,否则为false,此配置应根据实际部署规划来进行设置;
若本节点希望保存索引数据,node.data参数需设置为true,否则为false,此配置应根据实际部署规划来进行设置;
discovery.zen.ping.unicast.hosts参数表示当前节点可通过配置的几个节点来发现集群并加入,一般配置全部Master节点的IP和端口;
discovery.zen.minimum_master_nodes参数配置:假设Master节点数为N,则此参数配置为(N+1)/2,如N为3此值配置2,N为4时配置为2,其中N建议为单数;
-
bootstrap.mlockall参数表示ES进程是否启动后马上申请配置的堆内存并一直占用。1)若为true,则启动时会申请内存并一直占用,前提是按照3.2.5配置了放开可锁定
内存,若未配置,并且elasticsearch.in.sh中配置的堆内存大小超出操作系统的 锁定内存限制,则ES会启动失败。此为建议值,能够提升ES的性能;
2)若为false,则ES启动时会首先占用elasticsearch.in.sh中配置的ES_MIN_MEM
内存空间,若未按3.2.5配置放开可锁定内存,并且该内存空间大小超出操作系统的 锁定内存限制,则ES会启动失败;
紧跟参数的英文冒号后面的空格是必要的,否则会启动ES失败并且无日志输出。
- 为ES进程分配固定堆内存:
vi /opt/es/es/bin/elasticsearch.in.sh
修改:
ES_CLASSPATH="/opt/spark/spark/conf/:$ES_HOME/lib/*:$ES_HOME/libext/*"
...
if [ "x$ES_MIN_MEM" = "x" ]; then
ES_MIN_MEM=4g
fi
if [ "x$ES_MAX_MEM" = "x" ]; then
ES_MAX_MEM=4g
fi
注意:
ES_CLASSPATH中的spark目录应与spark实际安装目录对应;
对于单个ES节点来说,ES_MIN_MEM和ES_MAX_MEM应不小于2G且不大于30G,并且不大于本机内存大小的40%,如:服务器有96G内存则可配置30G,有16G内存则可配置6G,有8G内存则可配置2-3G。当一台服务器上启动两个ES节点时,应两个ES占用总内存不超过本机内存的40%,即有16G内存可为每个ES分配3G,有8G可为每个ES分配2G内存。
3.2.5 为批量起停ES节点准备
vi /opt/es/servers.txt
内容为:
172.16.58.21 bigdata01
172.16.58.22 bigdata02
172.16.58.23 bigdata03
4 起停服务
4.1 启动ES
- 启动多个节点
在配置了免密码登录的服务器上执行:
su - es
/opt/es/es-cluster.sh start
注意:
此命令会启动/opt/es/servers.txt文件中的全部节点上安装目录相同的ES,本文档es-cluster.sh脚本所在的安装目录为/opt/es;
在执行脚本所在服务器上,必须配置免密码登录,可参照3.3.3节。若未配置或配置失败,以上命令每启动一个ES节点都会提示要求输入es用户的密码。此情况下,应先关闭ES集群,把免密码登录配置好,然后重新启动ES集群。
启动单个节点
若想启动单个节点,可在所在服务器上执行:
su - es
/opt/es/es/bin/es-start.sh
4.2 停止ES
- 停止多个节点
在配置了免密码登录的服务器上执行:
su - es
/opt/es/es-cluster.sh stop
注意:
此命令会关闭/opt/es/servers.txt文件中的全部节点上安装目录相同的ES,本文档es-cluster.sh脚本所在的安装目录为/opt/es;
在执行脚本所在服务器上,必须配置免密码登录,可参照3.3.3节。若未配置或配置失败,以上命令每关闭一个ES节点都会提示要求输入es用户的密码。此情况下,需手动关闭每个节点的ES进程,然后把免密码登录配置好,在下次关闭ES集群时更方便。
停止单个节点
在希望停止的节点上执行:
su - es
/opt/es/es/bin/es-stop.sh
或使用ps -ef | grep /opt/es
命令找到ES的进程PID后,执行下面的命令停止单个ES节点:
kill -15 PID