如何使用一个IP搭建ES集群——Docker如你所愿

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 打开微信扫一扫,关注微信公众号【数据与算法联盟】 转载请注明出处:http://blog.csdn.net/gamer_gyt 博主微博:http://weibo.com/234654758 Github:https://github.com/thinkgamer写在前边的话随着业务的发展,elasticsearch部署在一台机子上显然会不够用,那么我们该如何处理呢,幸运的elasticsearch支持横向扩展,即集群模式,这样无论数据量增长多大,我们只需要扩展我们的es集群即可。

这里写图片描述
打开微信扫一扫,关注微信公众号【数据与算法联盟】
转载请注明出处: http://blog.csdn.net/gamer_gyt
博主微博: http://weibo.com/234654758
Github: https://github.com/thinkgamer


写在前边的话

随着业务的发展,elasticsearch部署在一台机子上显然会不够用,那么我们该如何处理呢,幸运的elasticsearch支持横向扩展,即集群模式,这样无论数据量增长多大,我们只需要扩展我们的es集群即可。

本文永久地址 http://blog.csdn.net/gamer_gyt/article/details/53648983


背景说明

Ubuntu16.04
Docker 1.9
Elasticsearch 2.4
假设现在就一台服务器,我们要用这台服务器来部署一个ES的集群,那么最好的解决办法便是Docker了,我们可以利用Docker启动两个容器,在两个容器内各部署一个ElasticSearch,总而组成一个2个节点的ES集群

linux下Docker的部署:http://blog.csdn.net/gamer_gyt/article/details/52769294
终端安装Docker:http://bbs.csdn.net/topics/392063910
我的Docker专栏:http://blog.csdn.net/column/details/13159.html


Docker网络模式解释

1:host模式

众所周知,Docker使用了Linux的Namespaces技术来进行资源隔离,如PID Namespace隔离进程,Mount Namespace隔离文件系统,Network Namespace隔离网络等。一个Network Namespace提供了一份独立的网络环境,包括网卡、路由、Iptable规则等都与其他的Network Namespace隔离。一个Docker容器一般会分配一个独立的Network Namespace。但如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。

例如,我们在10.10.101.105/24的机器上用host模式启动一个含有web应用的Docker容器,监听tcp80端口。当我们在容器中执行任何类似ifconfig命令查看网络环境时,看到的都是宿主机上的信息。而外界访问容器中的应用,则直接使用10.10.101.105:80即可,不用任何NAT转换,就如直接跑在宿主机中一样。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。

2:container模式

在理解了host模式后,这个模式也就好理解了。这个模式指定新创建的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过lo网卡设备通信。

3:none模式

这个模式和前两个不同。在这种模式下,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。

4:bridge模式

bridge模式是Docker默认的网络设置,此模式会为每一个容器分配Network Namespace、设置IP等,并将一个主机上的Docker容器连接到一个虚拟网桥上


两个容器以组播方式创建ES集群

组播配置示例如下,单播配置在最下边,使用时只需替换加几行配置即可

1:下载Ubuntu最近版镜像

sudo docker pull ubuntu

2:配置基本环境

启动容器,进入容器内安装基本环境vim,java,和elasticsearch

sudo docker run -it -d –name esc1 ubuntu:latest
sudo docker exec -it esc1 /bin/bash
apt-get install vim
apt install openjdk-8-jre

然后安装es,下载安装包 点击下载
将其拷贝到docker内,安装

dpkg -i elasticsearch-2.4.0.deb

至此基本环境已经准备的差不多了,然后便是退出容器,stop 容器,然后进行commit 保存成两个容器

sudo docker commit esc1 es1:1.0
sudo docker commit esc1 es2:1.0

最后查看镜像如图所示:
这里写图片描述

3:es环境配置

分别启动两个容器

sudo docker run -it -d -p 9201:9201 -p 9301:9301 -p 5001:5001 -p 5602:5602 –name esc1 es1:1.0
sudo docker run -it -d -p 9200:9200 -p 9300:9300 -p 5000:5000 -p 5601:5601 –name esc2 es2:1.0

进入两个容器进行配置elasticsearch.ymal文件
esc1:

cluster.name: xdstar
node.name: node-1
node.master: false
node.data: true
network.host: 0.0.0.0
http.port: 9201
transport.tcp.port: 9301

esc2:

cluster.name: xdstar
node.name: node-2
node.master: true
node.data: true
network.host: 0.0.0.0
http.port: 9200
transport.tcp.port: 9300

cluster.name:集群名字,配置必须一样
node.name:每个节点的名字,不能一样
node.master: true 代表可以被选举为主节点,false代表不能被选举为主节点(这里我们设置esc2为主节点)
ndoe.data:代表是否可以存储数据
network.host:表示访问的ip,0.0.0.0表示可以以IP访问或者localhost,127.0.0.1
network.port:访问的端口

启动Elasticsearch

service elasticsearch start

细心的朋友会发现容器的启动端口转发端口不一致,这是因为,这里启动Docker容器默认采用的桥接,和主机共享端口了,所以两者端口不能一致,要不然会重复

启动完es集群,浏览器输入 https:192.168.1.250:9200/_plugin/head
(这里我安装了head插件,插件安装,参考之前的一篇文章,里边有讲到:http://blog.csdn.net/gamer_gyt/article/details/52654263

这里写图片描述

4:安装logstash配置rsyslog解析文件

logstash 2.4版本 点击下载
更多版本:https://www.elastic.co/downloads/past-releases

dpkg -i logstash-all-plugins-2.4.0_all.deb

然后进入配置文件目录

cd /etc/logstash/conf.d
vim rsyscon.conf

添加以下内容

input {
   syslog{
    port => 5000
    type => syslog
  }
}
output {
  stdout {
    codec=> rubydebug
  }
  elasticsearch {
    hosts => ["localhost:9200"]
  }
}

启动logstash

service logstash start

5:本地配置,产生syslog日志

编辑rsyslog的配置文件:

vim /etc/rsyslog.conf

最后添加

 *.*  @localhost:5000
 *.*  @@localhost:5000

重启rsyslog服务

service rsyslog restart

ssh 本地,产生日志

ssh localhost

这个时候观察elasticsearch界面:
这里写图片描述


ES集群的多播与单播

    以上的集群是采用组播的方式来构建的,组播就是通过在你的网络中发送UDP的ping请求以发现节点,其它Elasticsearch会收到这些ping请求并且进行响应,这样随后就会形成一个集群。
    多播对于开发环境是很好的,你不需要做什么事情,打开一些节点,他们自然的会发现对方形成一个集群。
    正是因为这种易用性,你在生产环境中必须禁掉它。否在你得到的结果就是一个节点意外的加入到了你的生产环境,因为他们收到了一个错误的组播信号。对于组播本身并没有错。组播会导致一些愚蠢的问题,并且导致集群变的脆弱(例如:一个网络工程师正在捣鼓网络,而没有告诉你,你会发现所有的节点突然发现不了对方了)。
    在生产环境中,建议使用单播代替组播,也就是说为Elasticsearch提供一些它应该去尝试连接的节点列表。一旦这个节点联系到组播列表中的一员,它就会得到整个集群所有节点的状态,然后它会联系master节点,并加入集群。
    这意味着你的单播列表不需要包含你的集群中的所有节点,它只需要包含足够一个新节点联系上其中一个并且说上话就ok了。

    ES 是一个 P2P 类型(使用 gossip 协议)的分布式系统,除了集群状态管理以外,其他所有的请求都可以发送到集群内任意一台节点上,这个节点可以自己找到需要转发给哪些节点,并且直接跟这些节点通信。
    所以,从网络架构及服务配置上来说,构建集群所需要的配置极其简单。在 Elasticsearch 2.0 之前,无阻碍的网络下,所有配置了相同 cluster.name 的节点都自动归属到一个集群中。
    2.0 版本之后,基于安全的考虑,Elasticsearch 稍作了调整,避免开发环境过于随便造成的麻烦。

    ES 从 2.0 版本开始,默认的自动发现方式改为了单播(unicast)方式。配置里提供几台节点的地址,ES 将其视作 gossip router 角色,借以完成集群的发现。由于这只是 ES 内一个很小的功能,所以 gossip router 角色并不需要单独配置,每个 ES 节点都可以担任。所以,采用单播方式的集群,各节点都配置相同的几个节点列表作为 router 即可。
    此外,考虑到节点有时候因为高负载,慢 GC 等原因可能会有偶尔没及时响应 ping 包的可能,一般建议稍微加大 Fault Detection 的超时时间。
    同样基于安全考虑做的变更还有监听的主机名。现在默认只监听本地 lo 网卡上。所以正式环境上需要修改配置为监听具体的网卡。

network.host: "0.0.0.0" 
discovery.zen.minimum_master_nodes: 3
discovery.zen.ping.timeout: 100s
discovery.zen.fd.ping_timeout: 100s
discovery.zen.ping.unicast.hosts: ["10.19.0.97","10.19.0.98","10.19.0.99","10.19.0.100"]

    上面的配置中,两个 timeout 可能会让人有所迷惑。这里的 fd 是 fault detection 的缩写。也就是说:
    discovery.zen.ping.timeout 参数仅在加入或者选举 master 主节点的时候才起作用;
    discovery.zen.fd.ping_timeout 参数则在稳定运行的集群中,master 检测所有节点,以及节点检测 master 是否畅通时长期有用。
    既然是长期有用,自然还有运行间隔和重试的配置,也可以根据实际情况调整:

discovery.zen.fd.ping_interval: 10s
discovery.zen.fd.ping_retries: 10

单播配置

以上展示为组播方式,单播配置相对来说只需要在配置文件里加几行即可
esc1:

discovery.zen.ping.unicast.hosts: ["localhost:9300","localhost:9301"]

esc2:

discovery.zen.ping.unicast.hosts: ["localhost:9300","localhost:9301"]

PS:我这里尝试了很多次,增加了

discovery.zen.minimum_master_nodes: 3
discovery.zen.ping.timeout: 100s
discovery.zen.fd.ping_timeout: 100s

这三个属性之后集群并不能启动,所以这里只设置了discovery.zen.ping.unicast.hosts属性


OK!!!

相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
2月前
|
数据可视化 Linux API
如何在Linux使用docker部署Swagger Editor并实现无公网IP远程协同编辑API文档
如何在Linux使用docker部署Swagger Editor并实现无公网IP远程协同编辑API文档
|
11天前
|
算法 Nacos Docker
docker部署nacos集群
docker部署nacos集群
20 0
|
11天前
|
NoSQL Redis Docker
使用Docker搭建Redis主从集群
使用Docker搭建Redis主从集群
24 1
|
17天前
|
存储 Kubernetes Docker
构建高效稳定的Docker容器集群:从原理到实践
【4月更文挑战第19天】 在当今微服务架构盛行的时代,容器化技术已经成为了软件开发和部署的标准实践。本文深入探讨了如何利用Docker容器技术,结合Kubernetes集群管理工具,构建一个高效、稳定且可扩展的容器化环境。文章首先简述了Docker的核心原理及其优势,接着详细阐述了Kubernetes的基本概念与组件,最后通过一个实际案例来指导读者如何从零开始搭建并优化一个基于Docker和Kubernetes的容器集群系统。
21 1
|
18天前
|
Kubernetes Linux Docker
如何在Docker和Kubernetes中使用代理IP?
如何在Docker和Kubernetes中使用代理IP?
|
21天前
|
安全 Linux Nacos
如何在CentOS使用Docker运行Nacos容器并实现无公网IP远程访问UI界面
如何在CentOS使用Docker运行Nacos容器并实现无公网IP远程访问UI界面
|
2月前
|
负载均衡 容灾 安全
Docker Swarm总结+基础、集群搭建维护、安全以及集群容灾(1/5)
Docker Swarm总结+基础、集群搭建维护、安全以及集群容灾(1/5)
71 2
|
2月前
|
NoSQL Redis Docker
使用Docker搭建一个“一主两从”的 Redis 集群(超详细步骤)
使用Docker搭建一个“一主两从”的 Redis 集群(超详细步骤)
81 0
|
2月前
|
关系型数据库 MySQL 数据库
使用 Docker 搭建一个“一主一从”的 MySQL 读写分离集群(超详细步骤
使用 Docker 搭建一个“一主一从”的 MySQL 读写分离集群(超详细步骤
67 0
|
2月前
|
存储 负载均衡 网络协议
docker集群的详解以及超详细搭建
手拿把掐学会搭建docker集群