1.搭建elasticsearch集群
该elasticsearch集群是基于docker镜像进行搭建
引入 需要的镜像
docker pull elasticsearch:7.6.1
docker pull kibana:7.6.1
1.1. 配置
master
cluster.name: elasticsearch-cluster
node.name: es-master-10
network.host: 0.0.0.0
network.publish_host: 180.200.7.10
http.port: 9200
transport.tcp.port: 9300
http.cors.enabled: true
http.cors.allow-origin: "*"
node.master: true
node.data: true
discovery.zen.ping.unicast.hosts: ["180.200.7.10:9300","180.200.7.101:9300","180.200.7.102:9300"] discovery.zen.minimum_master_nodes: 1
cluster.initial_master_nodes: es-master-10
slave
cluster.name: elasticsearch-cluster
node.name: es-node-101
network.host: 0.0.0.0
network.publish_host: 180.200.7.101
http.port: 9200
transport.tcp.port: 9300
http.cors.enabled: true
http.cors.allow-origin: "*"
node.master: true
node.data: true
discovery.zen.ping.unicast.hosts: ["180.200.7.10:9300","180.200.7.101:9300","180.200.7.102:9300"]
discovery.zen.minimum_master_nodes: 1
对应的docker-composer
version: '3.6'
services:
es_master_180_10:
image: elasticsearch:7.6.1
container_name: es_master_180_10
environment:
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
volumes:
- /www/wwwroot/2007_SRM/elasticsearch/master_10/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
- /www/wwwroot/2007_SRM/elasticsearch/slave_11/data:/usr/share/elasticsearch/data
privileged: true
ports:
- 9210:9200
- 9310:9300
networks:
es:
ipv4_address: 180.200.7.10
es_slave_11:
image: elasticsearch:7.6.1
container_name: es_slave_11
environment:
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
volumes:
- /www/wwwroot/2007_SRM/elasticsearch/slave_11/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
- /www/wwwroot/2007_SRM/elasticsearch/slave_11/data:/usr/share/elasticsearch/data
privileged: true
ports:
- 9211:9200
- 9311:9300
networks:
es:
ipv4_address: 180.200.7.11
es_slave_12:
image: elasticsearch:7.6.1
container_name: es_slave_12
environment:
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
volumes:
- /www/wwwroot/2007_SRM/elasticsearch/slave_12/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
- /www/wwwroot/2007_SRM/elasticsearch/slave_11/data:/usr/share/elasticsearch/data
privileged: true
ports:
- 9212:9200
- 9312:9300
networks:
es:
ipv4_address: 180.200.7.12
networks:
es:
driver: bridge
ipam:
config:
- subnet: "180.200.7.0/24"
1.2. 构建集群注意事项
- 一个es的容器在构建的时候是需要系统提供200M的内存(建议实现)
- 系统需要配置 sysctl -w vm.max_map_count=262144 参考地址 https://www .jianshu.com/p/79946b7a9c48 3. 配置es的共享目录的时候需要给文件操作的权限777
2. 理解es集群
请求创建
http://192.168.169.120:9210/address
{
"settings":{
"number_of_shards" : 3, //定义3个分片
"number_of_replicas": 1 //1个副本集
},
"mappings":{
"properties":{
"id" :{"type":"keyword"},
"country" :{"type":"keyword"},
"province":{"type":"keyword"},
"city" :{"type":"keyword"},
"address1":{"type":"text"},
"remark" :{"type":"text"}
}
}
}
http://192.168.169.120:9210/es_name
{
"settings":{
"number_of_shards" : 3,
"number_of_replicas": 1
},
"mappings":{
"properties":{
"id" :{"type":"keyword"},
"country" :{"type":"keyword"},
"province":{"type":"keyword"},
"city" :{"type":"keyword"},
"address1":{"type":"text"},
"remark" :{"type":"text"}
}
}
}
如图所示,
- 分片结构:这个索引一共有6个分片,3个shard分片集,每个shard有1个replica副本集,所以一共就有6个分片集,es是基于Lucene内核的,这6个分片集,就是6 个Lucene内核。
- 分片分布: 3个shard会自动分布在3台服务器上,大家可以看到,每台服务器上分布的分片数量是一样多,这个均衡分布是es内部机制完成的, 另外, shard对应 的replica是不会在同一台机器上面的。如上图,shard1是不可能和replica1放在一台机器上的,这样一台机器奔溃了,还有备胎在其它机器上。
- 主从节点: 如上图, 我们有es-node1为master节点,es-node2和es-node3为从节点。我们的主节点,负责管理:集群范围内的所有变更,例如增加、删除索 引,或者增加、删除节点等。但是,主节点并不处理文档级别的增删改查。
3.用户请求方式
如图,不论我们有多少个es实例,当用户需要对es进行增删改查的时候,连接任何一台节点都行,es内部会进行转发。这也是es集群的个性之一。
4.故障转移与扩容
故障转移
假设我们es-node1挂了,集群中会发生什么呢?具体会发生这2个动作:
其一: 因为es-node1是master节点,所以es会自动重新选举一名master。
其二: 因为es-node1上面的shard1和replica3挂了,新的master会把node2上的replica-1提升为shard1.
这样,整个集群还是正常进行的
扩容
这个过程,用户不需要做什么,只需要增加节点到集群就行了
5. 引入中文分词
生成镜像的dockerfile文件
FROM elasticsearch:7.6.1
COPY ./elasticsearch-analysis-ik-7.6.1.zip /usr/share/elasticsearch/plugins/
RUN cd /usr/share/elasticsearch/plugins \
&& mkdir ik \
&& mv elasticsearch-analysis-ik-7.6.1.zip ik/ \
&& cd ik \
&& unzip elasticsearch-analysis-ik-7.6.1.zip \
&& rm -rf elasticsearch-analysis-ik-7.6.1.zip
6.引入Kibara
kibana是es的一个可视化工具,提供了友好的可视化查看和操作页面,同学们可以简单的理解为类似于mysql的phpadmin。
现在我们来创建一个kibana容器:添加到docker-compose中,重新执行一次docker-compose
# ...
kibana:
image: kibana:7.6.1
container_name: kibana
environment:
- "ELASTICSEARCH_HOSTS=http://180.200.7.12:9200"
- "SERVER_PORT=5601"
- "SERVER_HOST=0.0.0.0"
ports:
- 5601:5601
networks:
es:
ipv4_address: 180.200.7.13
# ...
接下来,我们就可以用浏览器进入kibana界面了。
下面这个是kibana的控制台界面,我们可以在左边输入内容,右边会显示执行结果。→ 这是官方推荐
其他可视化工具:head,kibana,elasticHD
7. es 增删改查
7.1 创建商品列表索引
请求地址:http://ip:端口/索引名称
索引名称必须小写
http方法:PUT
实操:
http://ip:9200/goods_list
{
"settings":{
"number_of_shards":2,
"number_of_replicas":1
},
"mappings":{
"properties":{
"id":{"type":"integer"},
"goods_name":{"type":"text"},
"goods_description":{"type":"text"},
"goods_info":{"type":"text"}
}
}
}
参数详解:
number_of_shards:分片数量。
number_of_replicas:副本数量。
注意:默认情况下添加数据时,如果指定的某个字段不存在时,es会自动创建该字段
7.2 指定id,不存在则创建,存在则更新
请求地址:http://ip:端口/索引名/_doc/商品id
上面这里不添加id就自动生成
http方法:PUT
实操:
GET /goods_list/_doc/123
{
"id": "123",
"goods_name": "测试商品的名称",
"goods_description": "测试商品的描述",
"goods_info": "。。。"
}
7.3 查询数据
GET /goods_list/_search/
{
"query": {
"bool": {
"must": [{
"match": {
"goods_name": "测试商品的名称"
}
}]
}
}
}
返回:
{
"took" : 5,
"timed_out" : false,
"_shards" : {
"total" : 2,
"successful" : 2,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 0.2876821,
"hits" : [
{
"_index" : "goods_list",
"_type" : "_doc",
"_id" : "123",
"_score" : 0.2876821,
"_source" : {
"id" : "123",
"goods_name" : "测试商品的名称",
"goods_description" : "测试商品的描述",
"goods_info" : "。。。"
}
}
]
}
}
7.4 修改数据
POST /goods_list/_update_by_query/
{
"query": {
"bool": {
"must": [
{
"term": {
"goods_name": "测试商品的名称"
}
}
]
}
},
"script": {
"source": "ctx._source.goods_name='测试商品的名称1'"
}
}
7.5 删除数据
POST /goods_list/_delete_by_query/
{
"query": {
"bool": {
"must": [
{
"term": {
"goods_name": "测试商品的名称1"
}
}
]
}
}
}