使用docker初搭es集群

在校学生跟着黑马2021课程学习spring cloud的笔记,记录文章,用来温习,并且梳理出自己的理论框架

一.es的集群结构

由于单机es必须面临两个问题:

1,海量数据存储问题 2,单点故障问题,

因此就要使用集群来解决,就是把一个索引库从逻辑上分成很多(shard:翻译为碎片,分区),分布到不同的es节点中去,并对每个分片进行备份(replica:复制品),但是备份片不与主分片存储在同一个节点上,因为如果这个节点宕机,其他节点存储了这个节点上的分片副本,就可以恢复出完整的索引库信息

同时每个节点有自己的角色,一般可以修改配置文件让其扮演不同的角色,不做任何修改,每个节点默认扮演下面四种角色

四种角色(根据在集群中的职责划分,职责分离可以让我们根据不同节点的需求分配不同的硬件去部署。而且避免业务之间的互相干扰。):

1,master eligible:备选主节点---主节点可以管理和记录集群状态、决定分片在哪个节点、处理创建和删除索引库的请求(配置参数:node.master ,默认为true),对CPU要求高,但是内存要求低

2,data:数据节点--存储数据、搜索、聚合、CRUD(配置参数:node.data ,默认为true),

         对CPU和内存要求都高

3,ingest:数据存储之前的预处理(配置参数:node.ingest ,默认为true)

4,coordinating:协调节点:路由请求到其它节点,合并其它节点处理的结果,返回给用户(这个节点的参数无法配置,是每个节点默认需要扮演的角色,但是当其他三个参数全部设置为false时,就可以让这个节点只扮演协调节点的角色了),对网络带宽、CPU要求高

大致的集群与用户之间的联系如下图:

由图可见,一个集群至少至少要11个节点,不包括nginx,可能一般小公司用不到,大公司也轮不到一个毛头小子来做,哈哈哈,,

带星号的是目前的主节点,在三个备选直接点中选出,根据什么规则选出来的,不清楚,但是要选为一个主节点,有一个必要条件,这个节点要有(候选节点数+1)/2 及以上的票数才能被选为主节点,

因此候选主节点的数量最好是奇数,对应配置项是discovery.zen.minimum_master_nodes,为什么呢,为了避免脑裂,什么是脑裂,在后面描述故障转移中记录,接下来进入es集群的搭建吧~

 

二.dokcer搭建集群

搭建环境:

1,已经配置好docker和docker-compose(后续会记录在其他文章中)的centos7虚拟机/云服务器一台,虚拟机/服务器的运行内存最少要4G,风扇呼呼响

2,elasticsearch:7.12.1镜像,容器需要基于它去构建

 具备上面这些条件,一个集群的搭建其实特别简单,只需要一个docker-compose.yml文件,

下面是我在搭建集群时的配置文件,

version: '2.2'
services:
  es01:       //服务名称
    image: elasticsearch:7.12.1   //基础镜像
    container_name: es01      //容器名
    environment:
      - node.name=es01        //在集群中这个节点的名称,省事所以与容器名称一样
      - cluster.name=es-docker-cluster    //集群的名称,搭建集群的条件就是集群的名称一致
      - discovery.seed_hosts=es02,es03    //集群中,其他节点的地址,因为使用的是容器,索引可以使用名称访问
      - cluster.initial_master_nodes=es01,es02,es03     //指定哪些节点为候选主节点,可以参与主节点的选举中去
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"    //配置了运行时的内存信息
    volumes:
      - data01:/usr/share/elasticsearch/data    //配置数据卷的挂载信息
    ports:
      - 9201:9200                              //配置宿主机和容器的端口映射
    networks:
      - elastic                               //指定这个容器的网络,这样把三个容器都加入到同一个网络中去,可以实现容器通信,使用名称访问可以,这个网络不存在会自动创建一个
  es02:
    image: elasticsearch:7.12.1
    container_name: es02
    environment:
      - node.name=es02
      - cluster.name=es-docker-cluster
      - discovery.seed_hosts=es01,es03
      - cluster.initial_master_nodes=es01,es02,es03
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    volumes:
      - data02:/usr/share/elasticsearch/data
    ports:
      - 9202:9200
    networks:
      - elastic
  es03:
    image: elasticsearch:7.12.1
    container_name: es03
    environment:
      - node.name=es03
      - cluster.name=es-docker-cluster
      - discovery.seed_hosts=es01,es02
      - cluster.initial_master_nodes=es01,es02,es03
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    volumes:
      - data03:/usr/share/elasticsearch/data
    networks:
      - elastic
    ports:
      - 9203:9200
volumes:
  data01:
    driver: local             //指定挂在的宿主机的目录
  data02:
    driver: local
  data03:
    driver: local

networks:
  elastic:
    driver: bridge            //指定共享网络的连接方式为桥接

编写好这个文件,命名为docker-compose.yml并且上传到root目录下,其实哪里都可以,为了方便,不要太深,

在创建容器之前要先运行两个命令,

vi /etc/sysctl.conf    

这个文件通常包含Linux操作系统的内核参数设置。 通过编辑此文件中的参数,可以更改操作系统的行为和性能。 

vm.max_map_count=262144

该命令是用于设置Linux系统内核参数vm.max_map_count的值,它控制了一个进程可以拥有的最大内存映射区域数量。 具体而言,该参数限制了单个进程能够使用的虚拟内存区域的数量,以及每个区域的大小。 在 Elasticsearch、Logstash 等软件中,该参数需要被设置为一定的数值才能正常运行。 该命令中的“262144”表示设置该参数的值为262144。

然后执行命令,让配置生效

sysctl -p

最后执行docker-compose命令就可以完成集群的搭建了

 

docker-compose up -d

我的集群效果图

至此,一个es集群搭建完成,使用docker真的超简单

 三.分布式新增和查询

搭建完成后,可以使用工具来监听集群的状态

黑马教程使用的是 cerebro-0.9.4,我学习也是跟着使用,

在windows解压教程所使用的文件后,

双击运行bat文件,然后在物理机浏览器进入localhost :9090,输入要连接的地址,要加http://,可能因为要进行协议解析

 进入如下界面可以看到节点状况,带实心五角行的就是目前的主节点

 绿色实线正方形表示的是主分片,虚线的是副本分片,这里分片的id从0-2,因为我设置了索引库分为三个分片,每个分片一个副本,如下图所示,在这里直接创建索引库,名字叫test

 

然后插入数据使用的是postman工具,其实任何api测试工具都可以,

下图是插入一个数据的演示,请求方式是post,遵循rest风格,路径为

http://192.168.112.188:9201/itcast/_doc/5   ,协议+ip+端口+索引库名称+文档类型+数据id,然后数据是json风格,这是根据es的dsl语法来的,学了dsl语法很容易理解,可以多插入几条数据

再根据下面的请求查询索引的数据,显示数据来自哪个分片,并且显示命中的数据

 "explain": true ,这个参数可以显示每条数据来自哪个分片

"_shard": "[itcast][0]",表示第一个分片,很明显这里的分片采用数组的形式存储,

 至此,一个es集群的小练习,操作完毕

四.故障转移

前面提到的脑裂,脑裂是因为集群中的节点失联导致的。


例如一个集群中,主节点与其它节点失联,可能因为网络问题或者其他问题失联

此时,node2和node3认为node1宕机,就会重新选主:当node3当选后,集群继续对外提供服务,node2和node3自成集群,node1自成集群,两个集群数据不同步,出现数据差异。当网络恢复后,因为集群中有两个master节点,集群状态的不一致,出现脑裂的情况。


解决脑裂的方案是,要求选票超过 ( eligible节点数量 + 1 )/ 2 才能当选为主,因此eligible节点数量最好是奇数。对应配置项是discovery.zen.minimum_master_nodes,在es7.0以后,已经成为默认配置,因此一般不会发生脑裂问题、

(这里让es03宕机,关闭,与脑裂展示图宕机节点不一样,理解就行)

 

过一会分片的分布就会变成这样

重新启动es03后(我也不明白为什么es03上全部变成副本分片了,可能我老让它宕机测试,其他两个节点任务它不可靠,不让它承担数据的索引的重担了吧,不得不说,发明es的人真牛,真智能啊)

 

 

这么一点内容,写的我好累啊,本来还觉得做笔记是一件很轻松的事情,唉,下次心血来潮,再说吧,饿死了   ,干饭去                                                                      

-------------------- 2023.4.5(清明节假期)
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值