我们去拉货车时,不会想着去培养更健壮的马,而是应该考虑多找几匹马来拉车。所有分布式系统也是这个原理,垂直扩展毕竟潜力有限,我们应该多考虑如何水平扩展。
ES如何实现海量存储
ES是通过分片来实现海量存储的,ES的基本存储单位是索引,而索引可以分片存储。如下图
?比如一个商品索引,可以分成三个shard分表存储在三台电脑上,那就可以使用三台电脑的硬盘和内存,存储空间大大提升,搜索性能也能提升。
ES如何实现高可用
说到高可用,第一个应该想到的就是备份,ES确实也是这么实现的,shard分为primary shard和replica shard,primary shard就是主分片,replica shard就是副分片,主分片和副分片不在一台服务器上,这样就算挂了一台剩余的也能继续提供服务。
?首先es集群会选举一台服务器成为master node,而客户端的数据只能写入primary shard,由master node负责同步数据到replica shard,而查询操作primary shard和replica shard都能提供,类似于MySql的读写分离,这样可以大大提升查询速度。
当某一台服务器挂了比如PC1挂了,PC3上的replica shard1就会变成primary shard1,这样分片1的数据就能写入PC3了,由于有备份数据也不会丢失,当PC1恢复后PC1上的primary shard1就会变成replica shard1.
那如果master node挂了呢?那ES集群会重新选举出一个master node,并重复以上恢复数据的步骤。
spring-data-es实现方式
用spring-data-es实现es的分片和备份很简单,一个注解就搞定了,shards就是分片数,replicas就是备份数,需要注意的是分片和备份在索引创建完成后是不能修改的
@Document(indexName = "goods", type = "goods", shards = 3, replicas = 1)
查看索引
http://localhost:9200/_cat/indices?v&pretty
可以看到分片和replica创建成功了
?
|