前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ELK弹性堆栈的心脏--Elasticsearch

ELK弹性堆栈的心脏--Elasticsearch

作者头像
shaonbean
发布2019-05-26 09:34:12
5140
发布2019-05-26 09:34:12
举报
文章被收录于专栏:运维前线运维前线

版权声明:本文为木偶人shaon原创文章,转载请注明原文地址,非常感谢。 https://cloud.tencent.com/developer/article/1434688

Elasticsearch是一个分布式,RESTful的搜索和分析引擎,能够解决越来越多的用例。作为弹性堆栈的核心,它集中存储您的数据,所以你可以发现预期和揭示意外。

Elasticsearch 特性

  • 1、弹性,高度可用

硬件反叛,网络分区。 Elasticsearch检测到保持集群(和您的数据)安全和可用的故障。

  • 2、可预测,可靠

Elasticsearch按照你期望的方式运行。事实上,唯一的惊喜应该是它是多么好。

  • 3、简单,透明

Elasticsearch不是一个黑盒子。直观的API用于监控和管理,为您提供完整的可视性和控制。

在您选择的编程语言中与Elasticsearch交互

Elasticsearch使用标准的RESTful API和JSON。我们还以许多语言(如Java,Python,NET和Groovy等)构建和维护客户端。 此外,我们的社区贡献了更多。他们很容易使用,感觉自然使用,和Elasticsearch一样,不限制你可能想用他们做什么。

安装Elasticsearch

Elasticsearch官方指导:https://www.elastic.co/guide/en/elasticsearch/reference

使用源码包(zip/tar.gz)安装Elasticsearch

Elasticsearch作为.zip和.tar.gz包提供。这些包可用于在任何系统上安装Elasticsearch,并且是在尝试Elasticsearch时最容易使用的包格式。

代码语言:javascript
复制
# 
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.1.1.zip
sha1sum elasticsearch-5.1.1.zip 
unzip elasticsearch-5.1.1.zip
cd elasticsearch-5.1.1/ 
#
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.1.1.tar.gz
sha1sum elasticsearch-5.1.1.tar.gz 
tar -xzf elasticsearch-5.1.1.tar.gz
cd elasticsearch-5.1.1/ 

# 从命令行运行Elasticsearch
./bin/elasticsearch

默认情况下,Elasticsearch在前台运行,将其日志打印到标准输出(stdout),并可以通过按Ctrl-C停止。

代码语言:javascript
复制
# 作为daemon运行,要将Elasticsearch作为守护程序运行,请在命令行上指定-d,并使用-p选项将进程ID记录在文件中:

./bin/elasticsearch -d -p pid 
# 日志消息可以在$ES_HOME/logs/目录中找到。 
# 要关闭Elasticsearch,请杀死记录在pid文件中的进程ID:
kill`cat pid`
  • 使用命令行配置Elasticsearch
代码语言:javascript
复制
# 指定Elasticsearch运行时集群的名称和节点的名称
./bin/elasticsearch -d -Ecluster.name=my_cluster -Enode.name=node_1

使用rpm或yum安装Elasticsearch

Elasticsearch的RPM可以从Elasticsearch的网站或从Elasticsearch的RPM存储库下载。它可以用于在任何基于RPM的系统(如OpenSuSE,SLES,Centos,Red Hat和Oracle Enterprise)上安装Elasticsearch。 地址:https://www.elastic.co/guide/en/elasticsearch/reference/current/rpm.html#install-rpm

  • 导入Elasticsearch PGP Key
代码语言:javascript
复制
rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
  • 从RPM repository安装
代码语言:javascript
复制
echo '[elasticsearch-5.x]
name=Elasticsearch repository for 5.x packages
baseurl=https://artifacts.elastic.co/packages/5.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
' | sudo tee /etc/yum.repos.d/elasticsearch.repo
  • 手动下载并安装RPM
代码语言:javascript
复制
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.1.1.rpm
sha1sum elasticsearch-5.1.1.rpm 
sudo rpm --install elasticsearch-5.1.1.rpm
  • 使用SysV init运行Elasticsearch
代码语言:javascript
复制
yum makecache && chkconfig --add elasticsearch
sudo -i service elasticsearch start
sudo -i service elasticsearch stop
  • 检查Elasticsearch是否正在运行
代码语言:javascript
复制
curl -XGET 'localhost:9200/?pretty'

会出现下面显示:

代码语言:javascript
复制
{
  "name" : "sBEjnyR",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "wJJ1MD97SSiH2K58TLk0gw",
  "version" : {
    "number" : "5.1.1",
    "build_hash" : "5395e21",
    "build_date" : "2016-12-06T12:36:15.409Z",
    "build_snapshot" : false,
    "lucene_version" : "6.3.0"
  },
  "tagline" : "You Know, for Search"
}

https://www.elastic.co/guide/en/elasticsearch/reference/current/settings.html

基于Docker安装Elasticsearch

Elasticsearch也可用作Docker镜像。图像是使用X-Pack构建的。 X-Pack地址:https://www.elastic.co/guide/en/x-pack/5.1/index.html 为Docker获取Elasticsearch就像对Elastic Docker注册表发出docker pull命令一样简单。 可以使用以下命令检索Docker镜像:

代码语言:javascript
复制
docker pull docker.elastic.co/elasticsearch/elasticsearch:5.1.1

命令行运行Elasticsearch

代码语言:javascript
复制
docker run -p 9200:9200 -e "http.host=0.0.0.0" -e "transport.host=127.0.0.1" docker.elastic.co/elasticsearch/elasticsearch:5.1.1
  • 生产环境设置

对于生产使用,需要将vm_max_map_count内核设置设置为至少262144。根据您的平台: Linuxundefined vm_map_max_count设置应该永久设置在/etc/sysctl.conf中:

代码语言:javascript
复制
$ grep vm.max_map_count /etc/sysctl.conf
vm.max_map_count=262144
  • 检查集群的状态
代码语言:javascript
复制
curl -u elastic http://127.0.0.1:9200/_cat/health

重要Elasticsearch配置

虽然Elasticsearch仅需要很少的配置,但有一些设置需要手动配置,并且在进入生产之前应该进行配置。

代码语言:javascript
复制
path.data and path.logs
cluster.name
node.name
bootstrap.memory_lock
network.host
discovery.zen.ping.unicast.hosts
discovery.zen.minimum_master_nodes

在生产使用中,几乎肯定要更改数据和日志文件夹的位置:

代码语言:javascript
复制
path:
  logs: /var/log/elasticsearch
  data: /var/data/elasticsearch

path.data设置可以设置为多个路径,在这种情况下,所有路径将用于存储数据(虽然属于单个分片的文件将全部存储在同一数据路径上):

代码语言:javascript
复制
path:
  data:
    - /mnt/elasticsearch_1
    - /mnt/elasticsearch_2
    - /mnt/elasticsearch_3
  • cluster.name

节点只能在共享其群集时加入群集。名称与集群中的所有其他节点。默认名称为elasticsearch,但您应将其更改为描述集群用途的适当名称。

代码语言:javascript
复制
cluster.name: logging-prod

确保您不要在不同的环境中重复使用相同的集群名称,否则您最终可能会加入错误的集群。

  • node.name

默认情况下,Elasticsearch将使用随机生成的uuid的第一个字符作为节点id。请注意,节点id是持久的,并且在节点重新启动时不会更改,因此默认节点名也不会更改。 应该配置一个更有意义的名称,这也将有重新启动节点后持续的优势:

代码语言:javascript
复制
node.name: prod-data-2
#
node.name: ${HOSTNAME}
  • bootstrap.memory_lock

对您的节点的健康至关重要的是,没有一个JVM被交换到磁盘。实现的一种方法是将bootstrap.memory_lock设置为true。

代码语言:javascript
复制
bootstrap.memory_lock: true
  • network.host

默认情况下,Elasticsearch仅绑定到环回地址。例如127.0.0.1和:: 1。这足以在服务器上运行单个开发节点。 为了与其他服务器上的节点进行通信和形成集群,您的节点将需要绑定到非环回地址。虽然有很多网络设置,通常你需要配置是network.host:

代码语言:javascript
复制
network.host: 192.168.1.10   #$Server_IP
  • discovery.zen.ping.unicast.hostsedit

开箱即用,没有任何网络配置,Elasticsearch将绑定到可用的环回地址,并将扫描端口9300到9305尝试连接到在同一服务器上运行的其他节点。这提供了自动聚类体验,而无需进行任何配置。

当与其他服务器上的节点形成集群时,您必须提供集群中可能是活的和可联系的其他节点的种子列表。这可以指定如下:

代码语言:javascript
复制
discovery.zen.ping.unicast.hosts:
   - 192.168.1.10:9300
   - 192.168.1.11 
   - seeds.mydomain.com 
  • discovery.zen.minimum_master_nodes

为了防止数据丢失,配置discovery.zen.minimum_master_nodes设置,以便每个符合主机条件的节点知道为了形成集群必须可见的主机合格节点的最小数量。 没有此设置,遇到网络故障的群集有可能将群集分为两个独立的群集 - 为了避免裂脑,此设置应设置为符合主机条件的节点的仲裁:

代码语言:javascript
复制
discovery.zen.minimum_master_nodes: 2

重要系统配置

理想情况下,Elasticsearch应该在服务器上单独运行,并使用所有可用的资源。为此,需要配置操作系统以允许运行Elasticsearch的用户访问比默认情况下允许的资源更多的资源。

  • /etc/security/limits.conf 在Linux系统上,可以通过编辑/etc/security/limits.conf文件为特定用户设置持久性限制。要将elasticsearch用户的最大打开文件数设置为65,536,请将以下行添加到limits.conf文件中:
代码语言:javascript
复制
elasticsearch  -  nofile  65536
  • Set JVM heap size via jvm.optionsedit

默认情况下,Elasticsearch告诉JVM使用最小和最大大小为2 GB的堆。当迁移到生产环境时,重要的是配置堆大小以确保Elasticsearch有足够的堆可用。 Elasticsearch将分配在jvm中指定的整个堆。选项通过Xms(最小堆大小)和Xmx(最大堆大小)设置。 这些设置的值取决于服务器上可用的RAM的数量。好的经验法则是: 将最小堆大小(Xms)和最大堆大小(Xmx)设置为彼此相等。undefined Elasticsearch可用的堆越多,可用于缓存的内存越多。但请注意,太多的堆可能会导致长时间垃圾收集暂停。undefined 将Xmx设置为不超过物理RAM的50%,以确保有足够的物理RAM用于内核文件系统缓存。undefined 不要将Xmx设置为高于JVM用于压缩对象指针(压缩oops)的截断值;确切的截止变化,但接近32 GB。您可以通过在日志中查找以下行来验证您是否处于限制之下:

代码语言:javascript
复制
heap size [1.9gb], compressed ordinary object pointers [true]

更好的是,尽量保持低于零基压缩oops的阈值;准确的截止变化,但26 GB在大多数系统上是安全的,但在一些系统上可以高达30 GB。您可以通过使用JVM选项-XX:+ UnlockDiagnosticVMOptions -XX:+ PrintCompressedOopsMode启动Elasticsearch并查找如下所示的行来验证您是否处于限制之下:

代码语言:javascript
复制
heap address: 0x000000011be00000, size: 27648 MB, zero based Compressed Oops
  • Disable Swapping

大多数操作系统尝试对文件系统缓存使用尽可能多的内存,并且急切地换出未使用的应用程序内存。这可能导致JVM堆的部分被交换到磁盘。 交换对性能和节点稳定性非常不利,应该不惜一切代价避免。它可能导致垃圾回收持续几分钟而不是毫秒,并可能导致节点响应缓慢,甚至断开与集群的连接。 有三种方法可禁用交换:

  • Enable bootstrap.memory_lock

第一个选项是在Linux / Unix系统上使用mlockall,或者在Windows上使用VirtualLock,以尝试将进程地址空间锁定到RAM,防止任何Elasticsearch内存被交换出来。这可以通过添加这行到config / elasticsearch.yml文件来完成:

代码语言:javascript
复制
bootstrap.memory_lock: true
  • Disable all swap filesedit

第二个选项是完全禁用交换。通常Elasticsearch是在框上运行的唯一服务,其内存使用由JVM选项控制。应该没有必要启用交换。 在Linux系统上,可以通过运行以下命令临时禁用交换:sudo swapoff -a。要永久禁用它,您需要编辑/etc/fstab文件,并注释掉任何包含单词swap的行。

  • Configure swappiness

Linux系统上可用的另一个选项是确保sysctl值vm.swappiness设置为1.这减少了内核交换的趋势,并且不应该导致在正常情况下交换,同时仍然允许整个系统在紧急情况下交换。

  • 虚拟内存

Elasticsearch默认使用混合mmapfs / niofs目录来存储其索引。 mmap计数的默认操作系统限制可能过低,这可能导致内存不足异常。

代码语言:javascript
复制
sysctl -p -w vm.max_map_count=262144
  • Number of threadsedit

Elasticsearch对不同类型的操作使用多个线程池。重要的是,它能够在需要时创建新线程。确保Elasticsearch用户可以创建的线程数至少为2048。

代码语言:javascript
复制
ulimit -u 2048

Elasticsearch集群

集群环境: OS:CentOS release 6.8 elastic-1 192.168.0.56 elastic-2 192.168.0.160 elk-cluster-name: prod-elk

  • elastic节点配置文件参考:
代码语言:javascript
复制
# elastic-1
egrep -v "^#|^$" /etc/elasticsearch/elasticsearch.yml
cluster.name: prod-elk
node.name: elastic-1
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch 
bootstrap.memory_lock: false
network.host: 192.168.0.56
http.port: 9200
discovery.zen.ping.unicast.hosts: ["192.168.0.56", "192.168.0.160"] # 制定节点的IP
discovery.zen.minimum_master_nodes: 2


# elastic-2
egrep -v "^#|^$" /etc/elasticsearch/elasticsearch.yml
cluster.name: prod-elk
node.name: elastic-2
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch 
bootstrap.memory_lock: false
network.host: 192.168.0.160
http.port: 9200
discovery.zen.minimum_master_nodes: 2
  • elastic-1节点上检查集群状态:
代码语言:javascript
复制
# curl http://192.168.0.56:9200/_cat/health
1483864758 16:39:18 prod-elk green 2 2 0 0 0 0 0 0 - 100.0%

elasticsearch 使用

  • 升级插件

升级节点时必须升级Elasticsearch插件。使用elasticsearch-plugin脚本安装所需的任何插件的正确版本。

  • 查看集群几节点
代码语言:javascript
复制
curl -XGET '192.168.0.56:9200/_cat/nodes?pretty'
192.168.0.160 15 45 1 1.16 0.86 0.81 mdi * elastic-2
192.168.0.56  13 99 0 0.00 0.00 0.00 mdi - elastic-1
  • 等待集群完成分片分配,然后再升级下一个节点。您可以使用_cat / health请求检查进度:
代码语言:javascript
复制
curl -XGET '192.168.0.56:9200/_cat/health?pretty'
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017年01月08日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Elasticsearch 特性
    • 在您选择的编程语言中与Elasticsearch交互
    • 安装Elasticsearch
      • 使用源码包(zip/tar.gz)安装Elasticsearch
        • 使用rpm或yum安装Elasticsearch
          • 基于Docker安装Elasticsearch
            • 重要Elasticsearch配置
              • 重要系统配置
                • Elasticsearch集群
                  • elasticsearch 使用
                  相关产品与服务
                  容器镜像服务
                  容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档