Elasticsearch 是一款开源的分布式搜索和分析引擎,我们可以在其中存储海量的数据并且快速地进行搜索,然而部署 Elasticsearch 集群的过程耗时且繁琐,好在 Elasticsearch 官方为我们提供了 Ansible Playbook 方便我们快速部署 Elasticsearch 集群。ansible-elasticsearch github 地址:https://github.com/elastic/ansible-elasticsearch。本文将演示使用 Ansible 搭建一套 3 Master 和 3 Data 节点的 Elasticsearch 集群。
机器规划
主机名 | IP 地址 | 作用 |
ydt-net-ansible | 11.8.36.62 | Ansible,Web 服务器 |
ydt-net-esansible01 | 11.8.38.130 | Master 节点 |
ydt-net-esansible02 | 11.8.38.131 | Master 节点 |
ydt-net-esansible03 | 11.8.38.136 | Master 节点 |
ydt-net-esansible04 | 11.8.38.137 | Data 节点 |
ydt-net-esansible05 | 11.8.38.138 | Data 节点 |
ydt-net-esansible06 | 11.8.38.140 | Data 节点 |
安装 Ansible
我们首先需要安装好 Ansible,Ansible 的 RPM 包可以到 [这个网站] (https://releases.ansible.com/ansible/rpm/release/epel-7-x86_64/) 下载。
下载完成后使用以下命令安装:
rpm -ivh ansible-安装包
查看 Ansible 版本:
root@ydt-net-ansible:/root # ansible --version ansible 2.9.15 config file = /etc/ansible/ansible.cfg configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules'] ansible python module location = /usr/lib/python2.7/site-packages/ansible executable location = /usr/bin/ansible python version = 2.7.5 (default, Aug 7 2019, 00:51:29) [GCC 4.8.5 20150623 (Red Hat 4.8.5-39)]
配置 Hosts(可选)
在每一台 Elasticsearch 节点和 Ansible 主机上编辑 /etc/hosts 文件配置 hosts 记录。如果后面指定使用 IP 地址进行通信,那么可以跳过这一步。
11.8.38.130 ydt-net-esansible01 11.8.38.131 ydt-net-esansible02 11.8.38.136 ydt-net-esansible03 11.8.38.137 ydt-net-esansible04 11.8.38.138 ydt-net-esansible05 11.8.38.140 ydt-net-esansible06
添加 Ansible Playbook
使用以下命令添加 Elasticsearch Ansible Playbook 到本地,也可以直接克隆 ansible-elasticsearch 的项目到本地,效果是一样的。
ansible-galaxy install elastic.elasticsearch,v7.15.0
Elasticsearch Ansible Playbook 位于 ~/.ansible/roles/elastic.elasticsearch 目录中。
root@ydt-net-ansible:/root #ls ~/.ansible/roles/elastic.elasticsearch/ ansible.cfg defaults elastic.yml filter_plugins Gemfile.lock inventory.yml Makefile meta tasks test CHANGELOG.md docs files Gemfile handlers LICENSE manifest README.md templates vars
设置 Inventory 节点信息
在 ~/.ansible/roles/elastic.elasticsearch 目录下创建 inventory.yml 文件,设置节点的角色以及远程登录的用户名和密码。
[hosts] ydt-net-esansible01 ydt-net-esansible02 ydt-net-esansible03 ydt-net-esansible04 ydt-net-esansible05 ydt-net-esansible06 #master 节点 [master] ydt-net-esansible01 ydt-net-esansible02 ydt-net-esansible03 #data 节点 [data] ydt-net-esansible04 ydt-net-esansible05 ydt-net-esansible06 #用户名和密码 [hosts:vars] ansible_ssh_user='yourusername' ansible_ssh_pass='yourpassword'
编辑 ansible.cfg 文件,设置以下参数,在登录的时候不校验 SSH 公钥。
[defaults] host_key_checking = False
Elasticsearch 集群配置文件
在 ~/.ansible/roles/elastic.elasticsearch 目录下创建 elastic.yml 文件,设置 Elasticsearch 集群的具体配置。有几个参数需要注意:
- es_version:设置 Elasticsearch 的版本,我们本次使用自己准备的 RPM 包安装 Elasticsearch,因此通过
es_custom_package_url
下载的 RPM 包的版本要和es_version
指定的版本匹配。 - cluster.name:集群名称,所有节点设置的集群名称要一致。
- network.host:默认情况下 Elasticsearch 只在 127.0.0.1 监听服务,设置为 0 表示在本机所有 IP 地址都监听服务。
- es_heap_size:设置堆大小,通常情况下设置为服务器内存的一半,最大不要超过 31G。
- cluster.initial_master_nodes:集群初始化时在第一次选举中有成为 Master 资格(master-eligible)的节点列表。
- discovery.seed_hosts:设置种子发现节点,Master 节点会获取整个集群的节点信息,因此通常将该值设置为所有 master-eligible 的节点。
- bootstrap.memory_lock:锁定物理内存地址,防止 Elasticsearch 的内存被交换出去,也就是避免 Elasticsearch 使用 swap 交换分区。
- es_use_repository 和 es_add_repository 设置 为 false 表示不通过公网去下载 Elasticsearch 官网源的安装包。
- es_custom_package_url:设置指定的下载源。
- hosts: master roles: - role: elastic.elasticsearch vars: #版本 es_version: "7.15.0" #堆内存大小 es_heap_size: "2g" #Elasticsearch 节点配置 es_config: cluster.name: "es-ansible" network.host: 0 #集群初始化时在第一次选举中有成为 Master 资格的节点列表 cluster.initial_master_nodes: "ydt-net-esansible01,ydt-net-esansible02,ydt-net-esansible03" #种子发现节点 discovery.seed_hosts: "ydt-net-esansible01:9300,ydt-net-esansible02:9300,ydt-net-esansible03:9300" http.port: 9200 #Master 节点属性 node.data: false node.master: true node.ingest: false node.ml: false cluster.remote.connect: false bootstrap.memory_lock: true #不使用官网源安装 es_use_repository: false es_add_repository: false #指定内网下载 rpm 包的 URL es_custom_package_url: http://11.8.36.62:8080/download/elasticsearch-7.15.0-x86_64.rpm #用户名和密码 es_api_basic_auth_username: "elastic" es_api_basic_auth_password: "elastic@ansible" - hosts: data roles: - role: elastic.elasticsearch vars: es_version: "7.15.0" es_data_dirs: - "/var/lib/elasticsearch" es_heap_size: "4g" es_config: cluster.name: "es-ansible" network.host: 0 discovery.seed_hosts: "ydt-net-esansible01:9300,ydt-net-esansible02:9300,ydt-net-esansible03:9300" http.port: 9200 #Data 节点属性 node.data: true node.master: false node.ml: false bootstrap.memory_lock: true es_use_repository: false es_add_repository: false es_custom_package_url: http://11.8.36.62:8080/download/elasticsearch-7.15.0-x86_64.rpm es_api_basic_auth_username: "elastic" es_api_basic_auth_password: "elastic@ansible"
配置 HTTP 服务器
由于我们的机器无法直接访问公网下载 Elasticsearch 安装包,这里提前从 [Elasticsearch 官网] (https://www.elastic.co/guide/en/elasticsearch/reference/current/rpm.html) 下载好 RPM 包传到内网的服务器上。接下来在服务器上通过 Nginx 部署一个 Web 服务,在 Ansible 部署 Elasticsearch 的时候会通过 es_custom_package_url
指定的 URL 来下载安装 Elasticsearch 所需的 RPM 包。
Nginx 配置如下:
events { worker_connections 1024; } http { server { listen 8080; location / { autoindex on; root html; } } }
将 Elasticsearch RPM 包放在 Nginx 根目录中的 html/download 目录下。启动 Nginx:
sbin/nginx
访问 http://{Nginx服务器地址}:8080/download 应该可以看到下载页面。
部署 Elasticsearch 集群
在 ~/.ansible/roles/elastic.elasticsearch 目录下执行以下命令部署 Elasticsearch 集群。
ansible-playbook elastic.yml -i inventory.yml
验证
如果一切顺利等待一会就可以安装完成,使用以下命令查看 Elasticsearch 集群状态。可以看到此时我们的 Elasticsearch 集群状态是 green,并且 6 个节点都已经成功上线。
#查看集群状态 root@ydt-net-ansible:/root #curl -u elastic:elastic@ansible http://ydt-net-esansible01:9200/_cluster/health?pretty { "cluster_name" : "es-ansible", "status" : "green", "timed_out" : false, "number_of_nodes" : 6, "number_of_data_nodes" : 3, "active_primary_shards" : 0, "active_shards" : 0, "relocating_shards" : 0, "initializing_shards" : 0, "unassigned_shards" : 0, "delayed_unassigned_shards" : 0, "number_of_pending_tasks" : 0, "number_of_in_flight_fetch" : 0, "task_max_waiting_in_queue_millis" : 0, "active_shards_percent_as_number" : 100.0 } #查看节点 root@ydt-net-ansible:/root #curl -u elastic:elastic@ansible http://ydt-net-esansible01:9200/_cat/nodes?v&pretty ip heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name 11.8.38.137 7 72 0 0.00 0.04 0.05 cdfhirstw - ydt-net-esansible04 11.8.38.140 8 72 0 0.13 0.08 0.10 cdfhirstw - ydt-net-esansible06 11.8.38.131 5 78 0 0.00 0.09 0.15 m - ydt-net-esansible02 11.8.38.136 27 78 0 0.01 0.11 0.18 m - ydt-net-esansible03 11.8.38.130 11 78 1 0.00 0.07 0.14 m * ydt-net-esansible01 11.8.38.138 8 72 0 0.00 0.05 0.08 cdfhirstw - ydt-net-esansible05
参考资料
- [INSTALLING ELASTICSEARCH USING ANSIBLE – THE QUICK WAY!] (https://blog.pythian.com/installing-elasticsearch-using-ansible-the-quick-way/)
- [ansible-elasticsearch] (https://github.com/elastic/ansible-elasticsearch)