在校学生跟着黑马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(清明节假期)