同步和异步
异步执行相对于同步执行,可以大大提高cpu的利用率,减少cpu的空置时间,提高服务的吞吐量,但是并不能减少单次请求的执行耗时。
spring的webflux使用netty作为容器,其中的api都是异步或者非阻塞式的,而且他也完全支持stream流和函数式编程的特性。
flux和mono是reactor(响应式编程库)的两个基本概念。
flux表示包含0到N个元素的异步序列,是一个数据的发布者(publisher)
mono表示的是包含0或者1个元素的异步序列,也是一个数据的发布者。
这边将es和mono一起封装了一个starter的工具包。
工具包下载
<dependency>
<groupId>com.elasticsearch</groupId>
<artifactId>esTest</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
在yml中配置elasticsearch.hosts的地址
构造一个实体类
@Data
@Indices("goods") //设置索引
pubic class goods{
@IndexID //设置ID
public Long id;
}
创建一个GoodsRepository去继承Resository
剩下就是很简单的使用了。
横向扩容
- 分片自动负载均衡,分片向空闲机器转移
- 扩容极限:节点数大于整体分片数,则必有空闲机器
- 超过扩容极限,可以增加副本数,如设置副本数为2,存储和搜索性能更强了,容错性更好了
- 容错性:只要一个索引的所有主分片在,集群就可以运行
数据路由
es存储数据,文档到底放在哪里
路由算法 shard=hash(routing)% number
主分片数量不可变
集群和分布式的区别
-
集群和分布式:
- 集群:多个人做一样的事。
- 分布式:多个人做不一样的事
-
集群解决的问题:
- 让系统高可用
- 分担请求压力
-
分布式解决的问题:
- 分担存储和计算的压力,提速
- 解耦
-
集群和分布式架构往往是并存的
ElasticSearch 集群正常状态: -
一个正常es集群中只有一个主节点(Master),主节点负责管理整个集群。如创建或删除索引,跟踪哪些节点是群集的一部分,并决定哪些分片分配给相关的节点。
-
集群的所有节点都会选择同一个节点作为主节点。
脑裂现象:
- 脑裂问题的出现就是因为从节点在选择主节点上出现分歧导致一个集群出现多个主节点从而使集群分裂,使得集群处于异常状态。
脑裂产生的原因:
- 网络原因:网络延迟
- 一般es集群会在内网部署,也可能在外网部署,比如阿里云。
- 内网一般不会出现此问题,外网的网络出现问题的可能性大些。
- 节点负载
- 主节点的角色既为master又为data。数据访问量较大时,可能会导致Master节点停止响应(假死状态)。
- JVM内存回收
- 当Master节点设置的JVM内存较小时,引发JVM的大规模内存回收,造成ES进程失去响应。
避免脑裂:
-
网络原因:
discovery.zen.ping.timeout
超时时间配置大一点。默认是3S -
节点负载:角色分离策略
- 候选主节点配置为
- node.master: true
- node.data: false
- 数据节点配置为
- node.master: false
- node.data: true
可以通过
discovery.zen.minimum_master_nodes
来设置最少可工作的候选主节点个数,建议设置为**(候选主节点数 / 2) + 1,** 比如,当有三个候选主节点时,该配置项的值为(3/2)+1=2,也就是保证集群中有半数以上的候选主节点。 - 候选主节点配置为
-
JVM内存回收:修改 config/jvm.options 文件的 -Xms 和 -Xmx 为服务器的内存一半。