首先导入hotel-admin 一个实现了对数据库数据增删改查的简易后台

本次的目标是,实现对后台数据库Crud的同时,保证ES内部的数据同步变更

  1. 明确主次关系,引起修改的主体是对数据库的Crud,通过使用消息队列技术来监听Crud,实现异步调用Es进行数据的更新
  2. hotel-admin是Publisher,在对数据库进行crud的时候,要同步发送消息到队列
  3. 队列应该分开设计,可以使用topic交换机,分别声明,hotel.insert.queue和hotel.delete.queue队列
  4. 在添加/更新数据的时候rabbitTemplate.convertAndSend(MqConstants._HOTEL_EXCHANGE_,MqConstants._HOTEL_INSERT_KEY_,hotel.getId());
  5. 在删除数据的时候rabbitTemplate.convertAndSend(MqConstants._HOTEL_EXCHANGE_,MqConstants._HOTEL_DELETE_KEY_,id);
  6. 之后是修改hotel-demo的代码
package cn.itcast.hotel.mq;

import cn.itcast.hotel.constant.MqConstants;
import cn.itcast.hotel.service.IHotelService;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
* @Author MisakiMikoto
* @Date 2023/5/23
*/
@Component
public class HotelListener {

@Autowired
private IHotelService hotelService;

/**
* 监听酒店新增或者修改的业务
* @param id 酒店ID
*/
@RabbitListener(queues = MqConstants.HOTEL_INSERT_QUEUE)
public void listenHotelInsertOrUpdate(Long id){
hotelService.insertById(id);
}


/**
* 监听酒店删除的业务
* @param id 酒店ID
*/
@RabbitListener(queues = MqConstants.HOTEL_DELETE_QUEUE)
public void listenHotelDelete(Long id){
hotelService.deleteById(id);
}
}
别忘记还需要声明个个队列与交换机和key的关系

编写一个docker.compose文件实现集群的自动部署

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:
- 9200: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:
- 9201: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:
- 9202:9200
volumes:
data01:
driver: local
data02:
driver: local
data03:
driver: local
networks:
elastic:driver: bridge

启动集群之前还需要设置

vm.max_map_count=262144

这个文件在/etc/下
如果没找到,可以手动创建
然后输入
sudo sysctl -p

集群状态监控

实星代表主节点,空星代表次节点

查询时,请求先传送到coordinating节点,coordinating节点会把请求分发给所有其他的节点,之后把查询的结果进行汇总,然后处理为最终结果返回给用户