前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >elastic search数据库集群部署「建议收藏」

elastic search数据库集群部署「建议收藏」

作者头像
全栈程序员站长
发布2022-06-27 11:07:05
2.1K0
发布2022-06-27 11:07:05
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

ES数据库安装

elastica search elasticsearch的概念: 是一个实时的分布式搜索和分析引擎,它可以用于全文搜索,结构化搜索以及分析。它是一个建立在全文搜索引擎 Apache Lucene 基础上的搜索引擎,使用 Java 语言编写。

1、elasticsearch和MongoDB/redis/memcache一样,是非关系性数据库 是一个接近实时的搜索平台,从所索引这个文档到能够被搜索到只有一个轻微的延迟,企业应用定位:采用restfullapi标准的可扩展和高可用的实时数据分析的全文搜索工具 2、可扩展:支持一主多从且扩容容易,只要cluster.nam一致且在同一个网络中就能自动加入当前集群;本身就是开源软件,也支持很多开源的第三方插件 3、高可用:在一个集群的多个节点中进行分布式存储,索引支持shards和复制,即使部分节点down掉,也能自动进行数据恢复和主从切换 4、采用restfullapi标准:通过http接口和json格式进行操作数据 5、数据存储的最小单位是文档,本质上是一个json文本

代码语言:javascript
复制
node节点 :单个的装有elasticsearch服务并且提供故障转移和扩展的服务器
cluster集群:一个集群就是由一个或者多个node组织在一起,共同工作,共同分享整个数据具有负载均衡功能的集群
index索引: 索引就是一个拥有几分相似特征的文档的集合
type类型:索引可以为拥有相同字段的文档定义一个类型;一个索引中可以创建多个type
document文档:一个文档是一个可被索引的基础信息单元
field 列:field是elasticsearch的最小单位,相当于数据的某一个列
shards分片:elastic search将索引分成若干份,每个部分就是一个shard
replicas复制:replicas 是索引里每个shard的拷贝(一份或者多份)

elasticsearch 应用场景 1、搜索:电商、百科、App搜索 2、高亮显示:GitHub 3、分析和数据挖掘:ELK

elasticsearch特点: 1、高性能,天然分布式 2、对运维友好,不需要会java开发语言,开箱即用 3、功能丰富

elasticsearch安装部署6.6版本

rpm -qc elasticsearch 查看配置文件有哪些

代码语言:javascript
复制
[root@localhost soft]# rpm -qc elasticsearch
/etc/elasticsearch/elasticsearch.yml      主配置文件
/etc/elasticsearch/jvm.options       jvm虚拟机配置
/etc/elasticsearch/log4j2.properties  
/etc/elasticsearch/role_mapping.yml
/etc/elasticsearch/roles.yml
/etc/elasticsearch/users
/etc/elasticsearch/users_roles
/etc/init.d/elasticsearch     init启动脚本
/etc/sysconfig/elasticsearch
/usr/lib/sysctl.d/elasticsearch.conf  配置参数,不需要改动
/usr/lib/systemd/system/elasticsearch.service  systemctl 启动文件

1、关闭防火墙

代码语言:javascript
复制
iptables -nL
iptables -F
iptables -X
iptables -Z
iptables -nL

2、下载软件 链接:https://pan.baidu.com/s/1PMpkPwAK03F_KYrZM-5hAw 提取码:lrai

代码语言:javascript
复制
mkdir /data/soft
[root@db-01 /data/soft]# ll -h
total 268M
-rw-r--r-- 1 root root 109M Feb 25  2019 elasticsearch-6.6.0.rpm
-rw-r--r-- 1 root root 159M Sep  2 16:35 jdk-8u102-linux-x64.rpm

3、安装jdk

代码语言:javascript
复制
rpm -ivh jdk-8u102-linux-x64.rpm 
[root@db-01 /data/soft]# java -version
openjdk version "1.8.0_212"
OpenJDK Runtime Environment (build 1.8.0_212-b04)
OpenJDK 64-Bit Server VM (build 25.212-b04, mixed mode)

4、安装

代码语言:javascript
复制
rpm -ivh elasticsearch-6.6.0.rpm

5、启动并检查

代码语言:javascript
复制
systemctl daemon-reload
systemctl enable elasticsearch.service
systemctl start elasticsearch.service

netstat -lntup|grep 9200

[root@db01 /data/soft]# curl 127.0.0.1:9200
{ 
   
  "name" : "pRG0qLR",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "mNuJSe07QM61IOxecnanZg",
  "version" : { 
   
    "number" : "6.6.0",
    "build_flavor" : "default",
    "build_type" : "rpm",
    "build_hash" : "a9861f4",
    "build_date" : "2019-01-24T11:27:09.439740Z",
    "build_snapshot" : false,
    "lucene_version" : "7.6.0",
    "minimum_wire_compatibility_version" : "5.6.0",
    "minimum_index_compatibility_version" : "5.0.0"
  },
  "tagline" : "You Know, for Search"
}

端口说明:

代码语言:javascript
复制
9200作为Http协议,主要用于外部通讯
9300作为Tcp协议,jar之间就是通过tcp协议通讯
ES集群之间是通过9300进行通讯

ES自定义配置 1、查看ES有哪些配置

代码语言:javascript
复制
[root@db01 ~]# rpm -qc elasticsearch 
/etc/elasticsearch/elasticsearch.yml		#ES的主配置文件
/etc/elasticsearch/jvm.options				#jvm虚拟机配置
/etc/sysconfig/elasticsearch				#默认一些系统配置参数
/usr/lib/sysctl.d/elasticsearch.conf		#配置参数,不需要改动
/usr/lib/systemd/system/elasticsearch.service	#system启动文件

2、自定义配置文件

代码语言:javascript
复制
cp /etc/elasticsearch/elasticsearch.yml  /opt/
cat >/etc/elasticsearch/elasticsearch.yml<<EOF node.name: node-1 path.data: /var/lib/elasticsearch path.logs: /var/log/elasticsearch bootstrap.memory_lock: true network.host: 10.0.0.51,127.0.0.1 http.port: 9200 EOF

3、重启服务

代码语言:javascript
复制
systemctl restart elasticsearch.service

4、解决内存锁定失败 重启后查看日志发现提示内存锁定失败

代码语言:javascript
复制
[root@db01 ~]# tail -f /var/log/elasticsearch/elasticsearch.log 
[2019-11-14T09:42:29,513][ERROR][o.e.b.Bootstrap          ] [node-1] node validation exception
[1] bootstrap checks failed
[1]: memory locking requested for elasticsearch process but memory is not locked

解决方案:

代码语言:javascript
复制
systemctl edit elasticsearch
[Service]
LimitMEMLOCK=infinity

systemctl daemon-reload
systemctl restart elasticsearch.service

安装es-head插件安装 链接:https://pan.baidu.com/s/1PMpkPwAK03F_KYrZM-5hAw 提取码:lrai

注意:需要修改配置文件添加允许跨域参数

代码语言:javascript
复制
http.cors.enabled: true 
http.cors.allow-origin: "*"

1.es-head 三种方式 1.npm安装方式 2.docker安装 3.google浏览器插件(推荐)

代码语言:javascript
复制
从google商店安装es-head插件
将安装好的插件导出到本地
修改插件文件名为zip后缀
解压目录
拓展程序-开发者模式-打开已解压的目录
连接地址修改为ES的IP地址

2.具体操作命令 Head插件在5.0以后安装方式发生了改变,需要nodejs环境支持,或者直接使用别人封装好的docker镜像 插件官方地址

代码语言:javascript
复制
https://github.com/mobz/elasticsearch-head

使用docker部署elasticsearch-head

代码语言:javascript
复制
docker pull alivv/elasticsearch-head
docker run --name es-head -p 9100:9100 -dit elivv/elasticsearch-head

使用nodejs编译安装elasticsearch-head

代码语言:javascript
复制
cd /opt/
wget https://nodejs.org/dist/v12.13.0/node-v12.13.0-linux-x64.tar.xz
tar xf node-v12.13.0-linux-x64.tar.xz
mv node-v12.13.0-linux-x64 node
echo 'export PATH=$PATH:/opt/node/bin' >> /etc/profile
source /etc/profile 
npm -v
node -v 
git clone git://github.com/mobz/elasticsearch-head.git
unzip elasticsearch-head-master.zip
cd elasticsearch-head-master
npm install -g cnpm --registry=https://registry.npm.taobao.org
cnpm install
npm run start &

kibana与ES交互

链接:https://pan.baidu.com/s/1PMpkPwAK03F_KYrZM-5hAw 提取码:lrai

1、安装kibana

代码语言:javascript
复制
rpm -ivh kibana-6.6.0-x86_64.rpm

2、配置kubana

代码语言:javascript
复制
[root@localhost soft]# grep -nEv '#|^$' /etc/kibana/kibana.yml
2:server.port: 5601
7:server.host: "10.0.0.51"
28:elasticsearch.hosts: ["http://10.0.0.51:9200"]
37:kibana.index: ".kibana"

3、启动kibana

代码语言:javascript
复制
systemctl start kibana

端口:5601

4、测试命令

代码语言:javascript
复制
curl -XGET 'http://10.0.0.51:9200/_count?pretty' -H 'Content-Type: application/json' -d ' { "query": { "match_all": {} } } '
代码语言:javascript
复制
mysql    es
库           index 索引
表            type 
字段         json key 
行           doc文档

使用HTTP的协议 GET 查看 PUT 提交 POST 提交 DELETE 删除

方法 索引/类型/doc

代码语言:javascript
复制
PUT twitter/_doc/1
{ 
   
    "user" : "kimchy",
    "post_date" : "2009-11-15T14:12:12",
    "message" : "trying out Elasticsearch"
}
在这里插入图片描述
在这里插入图片描述

所有以下划线开头都是系统默认的

代码语言:javascript
复制
{ 
   
"_index": "oldzhang",
"_type": "info",
"_id": "1",
"_version": 1,
"_score": 1,
"_source": { 
   
"name": "zhang",
"age": "29"
}
}

故障案例

一开始使用ES库关联mysql 一开始使用的指定id 后来发现数据库的查询变的慢,根据调研,采用post随机id

elasticsearch 和数据库怎么进行关联

根据id进行关联,但是会进行id比较 不能出现id冲突 根据post 的随机id 不会进行id比较 关联mysql时增加一个字段 解决关联问题

查询命令

1、创建测试语句

代码语言:javascript
复制
POST oldzhang/info/
{ 
   
  "name": "zhang",
  "age": "29",
  "pet": "xiaoqi",
  "job": "it"
}

POST oldzhang/info/
{ 
   
  "name": "xiao1",
  "age": "30",
  "pet": "xiaoqi",
  "job": "it"
}

POST oldzhang/info/
{ 
   
  "name": "xiao2",
  "age": "26",
  "pet": "xiaoqi",
  "job": "it"
}

POST oldzhang/info/
{ 
   
  "name": "xiao4",
  "age": "35",
  "pet": "xiaoqi",
  "job": "it"
}

POST oldzhang/info/
{ 
   
  "name": "ya",
  "age": "28",
  "pet": "xiaomin",
  "job": "it"
}

POST oldzhang/info/
{ 
   
  "name": "xiaomin",
  "age": "26",
  "pet": "xiaowang",
  "job": "SM"

}

POST oldzhang/info/
{ 
   
  "name": "hemengfei",
  "age": "38",
  "pet": "xiaohe",
  "job": "3P"
}

POST oldzhang/info/
{ 
   
  "name": "xiaoyu",
  "age": "28",
  "pet": "bijiben",
  "job": "fly"
}

2、简单查询

代码语言:javascript
复制
GET oldzhang/_search/

3、条件查询

代码语言:javascript
复制
GET oldzhang/_search
{ 
   
  "query": { 
   
    "term": { 
   
      "name": { 
   
        "value": "xiaomin"
      }
    }
  }
}

GET oldzhang/_search
{ 
   
  "query": { 
   
    "term": { 
   
      "job": { 
   
        "value": "it"
      }
    }
  }
}

4、多条件查询

代码语言:javascript
复制
GET /oldzhang/_search
{ 
   
    "query" : { 
   
      "bool": { 
   
        "must": [
          { 
   "match": { 
   "pet": "xiaoqi"}},
          { 
   "match": { 
   "name": "zhang"}}
        ],
        "filter": { 
   
          "range": { 
   
            "age": { 
   
              "gte": 27,
              "lte": 30
            }
          }
          }
        }
      }
    }
}

增删改查 1、自定义的ID更新

代码语言:javascript
复制
PUT oldzhang/info/1
{ 
   
  "name": "zhang",
  "age": 30,
  "job": "it",
  "id": 1
}

2.随机ID更新 #先根据自定义的Id字段查出数据的随机ID

代码语言:javascript
复制
GET oldzhang/_search/
{ 
   
  "query": { 
   
    "term": { 
   
      "id": { 
   
        "value": "2"
      }
    }
  }
}

#取到随机ID后更改数据

代码语言:javascript
复制
PUT oldzhang/info/CVDdknIBq3aq7mPQaoWw
{ 
   
  "name": "yayay",
  "age": 30,
  "job": "it",
  "id": 2
}

MongoDB ES etcd 都是使用jso格式 而Redis是使用

日志的两种格式:

代码语言:javascript
复制
多行匹配格式
json格式

集群相关名词 1、默认分片和副本规则

代码语言:javascript
复制
5分片
1副本

2、集群健康状态

代码语言:javascript
复制
绿色: 所有数据都完整,且副本数满足
黄色: 所有数据都完整,但是副本数不满足
红色: 一个或多个索引数据不完整

3、节点类型

代码语言:javascript
复制
主节点:	 负责调度数据分配到哪个节点
数据节点:  实际负责处理数据的节点
默认: 		主节点也是工作节点

4、数据分片

代码语言:javascript
复制
主分片:		实际存储的数据,负责读写,粗框的是主分片
副本分片:	 主分片的副本,提供读,同步主分片,细框的是副本分片

5、副本

代码语言:javascript
复制
主分片的备份,副本数量可以自定义

部署ES集群 1、安装java

代码语言:javascript
复制
rpm -ivh jdk-8u102-linux-x64.rpm

2、安装ES

代码语言:javascript
复制
rpm -ivh elasticsearch-6.6.0.rpm

3、配置内存锁定

代码语言:javascript
复制
systemctl edit elasticsearch.service
[Service]
LimitMEMLOCK=infinity

4、集群配置文件

node-1

代码语言:javascript
复制
[root@localhost soft]# grep -nEv '#|^$' /etc/elasticsearch/elasticsearch.yml
1:cluster.name: elk
2:node.name: node-1
3:path.data: /var/lib/elasticsearch
4:path.logs: /var/log/elasticsearch
5:bootstrap.memory_lock: true
6:network.host: 10.0.0.51,127.0.0.1
7:http.port: 9200
8:discovery.zen.ping.unicast.hosts: ["10.0.0.51", "10.0.0.52"]
9:discovery.zen.minimum_master_nodes: 1 

node-2

代码语言:javascript
复制
grep  -nEv '#|^$' /etc/elasticsearch/elasticsearch.yml
17:cluster.name: elk
23:node.name: node-2
33:path.data: /var/lib/elasticsearch
37:path.logs: /var/log/elasticsearch
43:bootstrap.memory_lock: true
55:network.host: 10.0.0.52,127.0.0.1
59:http.port: 9200
68:discovery.zen.ping.unicast.hosts: ["10.0.0.51", "10.0.0.52"]
72:discovery.zen.minimum_master_nodes: 1 
代码语言:javascript
复制
discovery.zen.minimum_master_nodes: 1  
这个参数的作用:如果集群想正常工作,至少需要几台机器正常
集群的节点个数的一半以上,也就是大多数
这两台机器能互相通讯

建议: 不要偶数个节点 解释修改参数:尽量使得集群节点数为奇数个

代码语言:javascript
复制
total number of master-eligible nodes     / 2 + 1
所有可能会成为master节点的个数 / 2 + 1

5、启动

代码语言:javascript
复制
systemctl daemon-reload
systemctl restart elasticsearch

6、查看日志

代码语言:javascript
复制
tail  -f /var/log/elasticsearch/elasticsearch.log 

7、查看集群

代码语言:javascript
复制
ES-head查看是否有2个节点
在这里插入图片描述
在这里插入图片描述

集群注意事项

代码语言:javascript
复制
1.插入和读取数据在任意节点都可以执行,效果一样
2.es-head可以连接集群内任一台服务

3.主节点负责读写
如果主分片所在的节点坏掉了,副本分片会升为主分片

4.主节点负责调度
如果主节点坏掉了,数据节点会自动升为主节点

5.通讯端口
默认会有2个通讯端口:9200和9300
9300并没有在配置文件里配置过
如果开启了防火墙并且没有放开9300端口,那么集群通讯就会失败

查看集群各种信息

代码语言:javascript
复制
GET _cat/nodes
GET _cat/health
GET _cat/master
GET _cat/fielddata
GET _cat/indices
GET _cat/shards
GET _cat/shards/oldzhang
在这里插入图片描述
在这里插入图片描述

扩容第三台机器 1、安装java

代码语言:javascript
复制
rpm -ivh jdk-8u102-linux-x64.rpm

2、安装ES

代码语言:javascript
复制
rpm -ivh elasticsearch-6.6.0.rpm

3、配置内存锁定

代码语言:javascript
复制
systemctl edit elasticsearch.service
[Service]
LimitMEMLOCK=infinity

4、db03集群配置文件

代码语言:javascript
复制
cat > /etc/elasticsearch/elasticsearch.yml <<EOF cluster.name: elk node.name: node-3 path.data: /var/lib/elasticsearch path.logs: /var/log/elasticsearch bootstrap.memory_lock: true network.host: 10.0.0.53,127.0.0.1 http.port: 9200 discovery.zen.ping.unicast.hosts: ["10.0.0.51", "10.0.0.53"] discovery.zen.minimum_master_nodes: 1 EOF

解释:

代码语言:javascript
复制
discovery.zen.ping.unicast.hosts: ["10.0.0.51", "10.0.0.53"]
能和集群内任意一个节点ping通即可 通过51可以和集群内所有的机器进行获取(感觉和病毒感染一样)
在这里插入图片描述
在这里插入图片描述

5、添加接点注意

代码语言:javascript
复制
1.对于新添加的节点来说:  
只需要直到集群内任意一个节点的IP和他自己本身的IP即可

对于以前的节点来说:
什么都不需要更改

2.最大master节点数设置
3个节点,设置为2

3.默认创建索引为1副本5分片

4.数据分配的时候会出现2中颜色
紫色: 正在迁移
黄色: 正在复制
绿色: 正常

5.3节点的时候
0副本一台都不能坏 
1副本的极限情况下可以坏2台: 1台1台的坏,不能同时坏2台,在数据复制完成的情况下,可以坏2台
2副本的情况可以同时坏2台

当数据库node2(假设为主库)down掉一个后 这时node1为主库,如果此时有数据写入,等到node2修复好之后,自动同步数据。 磁盘不能写的太满,会导致复制数据出现问题,保证足够的空间使用

动态修改最小发现节点数

代码语言:javascript
复制
GET _cluster/settings

PUT _cluster/settings
{ 
   
  "transient": { 
   
    "discovery.zen.minimum_master_nodes": 2
  }
}
在这里插入图片描述
在这里插入图片描述

出现这种情况是因为:主分片为5,副本为1 所以三个节点的情况下 一个为主分片 一个为副本,另外一个就是没有主分片和副本

3个节点的ES集群,极限情况下,最多允许坏几台? 如果选举参数配置为1的情况下,极限坏2台,不能同时坏,坏一台,等数据同步后,才能坏第二台

红色: 一个或多个索引数据不完整 如果集群编程红色了,只是说明索引数据不完整,

1、副本数和分片数都是可以调整的 2、分片数只有在创建索引的时候才能定义 索引一旦创建完成 分片数不能修改

复习: ES集群故障转移和恢复注意事项

elasticsearch 是一款成熟的数据库,不只是elk的数据库

黄(副本数不满足)—-绿(正常)—-紫(迁移)

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/133264.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年6月9,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
Elasticsearch Service
腾讯云 Elasticsearch Service(ES)是云端全托管海量数据检索分析服务,拥有高性能自研内核,集成X-Pack。ES 支持通过自治索引、存算分离、集群巡检等特性轻松管理集群,也支持免运维、自动弹性、按需使用的 Serverless 模式。使用 ES 您可以高效构建信息检索、日志分析、运维监控等服务,它独特的向量检索还可助您构建基于语义、图像的AI深度应用。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档