es总结和思考2
2019-06-13 本文已影响0人
LoveAnny
ES如何处理并发问题
其实这个问题问的是悲观锁和乐观锁,以及在ES中的应用
- 悲观锁
悲观锁就是只要操作就加锁(不太严谨),比如线程A读取数据,则线程A此时就对A进行加锁,知道线程A显式释放锁,如果此时线程B请求数据,则不能请求到任何数据,只能等待。
- 乐观锁
所谓乐观锁就是通过版本控制,如果线程A读取数据版本为1,此时线程B可以读取到数据也是1,如果此时AB同时修改数据,假设A先修改,则会先判断当前版本是否和发送的版本一直,如果一直则可以修改,不一致则修改失败,需要重新请求版本,之后再修改
ES 中采用的就是乐观锁,并且ES中写操作是异步并发执行,如果,AB同时修改数据,假设A先修改,B后修改,异步并发执行意思即是有可能B修改的指令先到达ES集群,此时就直接修改,当A到达后则忽略A的修改。
为什么ES 中Primary Shard 不可以修改
ES中index 数据是存储在多个Shard中,其中每个document 只能存储在一个primary shard ,在index 创建时一旦指定了primary shard 个数,之后就不可以修改。这是因为当index 中新增document 时,会根据document ID计算该document id 所在的Parimary Shard ,该算法是Hash + mod 算法。所以假设primary shard 个数可以修改,则一旦增加了个数,再次根据相同document id 查询时,有可能就找不到之前的primary ID ,所以ES 中Primary Shard 是不可以修改的。