分布式系统的可用性和扩展性
- 高可用性
- 服务可用性 :允许有节点停止服务
- 数据可用性 :部分节点丢失,不会丢失数据
- 可扩展性
- 请求量提升 / 数据的不断增长(将数据分布都所有接点上)
分布式特性
- elasticsearch的分布式架构的好处
- 存储的水平扩容
- 提高系统的可用性,部分节点停止服务,整个集群的服务不受影响
- elasticsearch的分布式架构
- 不同的集群通过不同的名字来区分,默认名字"elasticsearch"
- 通过配置文件修改,或者在命令行中
-E cluster.name=stark
进行设定 - 一个集群可以有一个或多个节点
节点
- 节点是elasticsearch的实例
- 本质上就是一个Java进程
- 一台机器上可以运行多个elasticsearch进程,但是生产环境一般建议一台机器上只运行一个elasticsearch实例
- 每一个节点都有名字,通过配置文件配置,或者启动的时候
-E node.name=node1指定
- 每一个节点在启动之后,会分配一个UID,保存在data目录下
分片
- 主分片,用以解决数据水平扩展的问题。通过主分片,可以将数据分布到集群内的所有节点之上
- 一个分片是一个运行的Lucene的实例
- 主分片数在索引创建时指定,后续不允许修改,除非Reindex
- 副本 ,用以解决数据高可用的问题,分片是主分片的拷贝
- 副本分片数,可以动态调整
- 增加副本数,还可以在一定程度上提高服务的可用性
{
"settings": {
"number_of_shards": 1,
"number_of_replicas": 1
}
}
查看集群的健康状况
- Green - 主分片与副本都正常分配
- Yellow - 主分片全部正常分配,有副本分片未能正常分片
- Red - 有主分片未能分配
CRUD
1.使用PostMan创建一个名字叫stark的索引
http://127.0.0.1:9200/stark?pretty
# 返回值
{
"acknowledged": true,
"shards_acknowledged": true,
"index": "stark"
}
文档的CRUD
- Type名,约定都用_doc
- Create ,如果ID已经存在,会失败
- Index ,如果ID不存在,创建新的文档。否则先删除现有文档,再创建新的文档,版本会增加。
- Update ,文档必须已经存在,更新只会对相应字段做增量修改。
Create 一个文档
支持自动生成文档ID和指定文档ID两种方式:
- 使用
POST /indexName/_doc
,系统会自动生成Document ID - 使用
PUT /indexName/_create/ID
创建时,URI中显示指定_create
,此时如果该ID的文档已经存在,操作失败
GET 一个文档
GET http://127.0.0.1:9200/IndexName/_doc/ID
- 找到文档,返回Http 200
- 文档元信息,同一个ID的文档,即使被删除,Version号也会不断增加
- _source 中默认包含了文档的所有原始信息
- 找不到文档,返回Http 404
Index 文档
PUT IndexName/_doc/1
{
"tags":["name","age","sex"]
}
Index和Create不一样的地方:如果文档存在,就索引新的文档。否则现有文档会被删除,新的文档被索引,版本信息(Version) + 1。
Update 文档
Update方法不会删除原来的文档,而是实现真正的数据更新,POST方法 ,Payload需要包含在doc中。
POST IndexNmae/_update/1
{
"doc":{
"albums":["aaa","bbb"]
}
}
删除文档
DELETE IndexName/_doc/ID
Bulk API / 批量读取 mGet / 批量查询 msearch
Bulk Api 支持在一次Api调用中,对不同的索引进行操作,支持四种类型操作,Index\Create\Update\Delete。
可以在URI中指定Index,也可以在请求的Payload中进行,操作单挑操作失败,并不影响其他操作,返回结果包括了每一条操作执行的结果。
//对同一个索引进行操作
POST /IndexName/_doc/_bulk
//对不同的索引进行操作
POST _bulk
{ "index" : { "_index" : "test", "_id" : "1" } }
{ "field1" : "value1" }
{ "delete" : { "_index" : "test", "_id" : "2" } }
{ "create" : { "_index" : "test2", "_id" : "3" } }
{ "field1" : "value3" }
{ "update" : {"_id" : "1", "_index" : "test"} }
{ "doc" : {"field2" : "value2"} }
mGet批量操作,可以减少网络链接所产生的开销,提高性能。
#URI中指定index
GET /IndxName/_mget
{
"docs" : [
{
"_id" : "1"
},
{
"_id" : "2"
}
]
}
//对不同的索引进行操作
GET /_mget
{
"docs" : [
{
"_index" : "test",
"_id" : "1"
},
{
"_index" : "test",
"_id" : "2"
}
]
}
批量查询 msearch
### msearch 操作
POST kibana_sample_data_ecommerce/_msearch
{"query" : {"match_all" : {}},"size":1}
{"index" : "kibana_sample_data_flights"}
{"query" : {"match_all" : {}},"size":2}