华为云用户手册

  • 操作步骤 大查询隔离特性和全局超时特性默认关闭,用户可根据需要实时配置,配置后立即生效。 登录 云搜索服务 管理控制台。 在“集群管理”页面,选择待配置大查询隔离的集群,单击操作列“Kibana”,登录Kibana界面。 在Kibana的左侧导航中选择“Dev Tools”,执行如下命令开启大查询隔离和全局查询超时的特性开关。 PUT _cluster/settings { "persistent": { "search.isolator.enabled": true, "search.isolator.time.enabled": true } } 以上两个开关是独立功能,当开关打开后,支持配置的参数请参见表1。 表1 大查询隔离和全局超时的参数配置 特性开关 配置参数 参数说明 search.isolator.enabled search.isolator.memory.task.limit search.isolator.time.management 单个分片查询任务被定义为大查询任务的阈值。 search.isolator.memory.pool.limit search.isolator.memory.heap.limit search.isolator.count.limit 触发隔离池内查询任务中断的阈值。 说明: 参数“search.isolator.memory.heap.limit”定义了节点实际堆内存的使用限制,包括写入和查询等操作,超过限制时将选取隔离池内的大查询任务进行中断。 search.isolator.strategy search.isolator.strategy.ratio 中断隔离池中某一条查询任务的选取策略。 search.isolator.time.enabled search.isolator.time.limit 全局查询任务超时设置。 配置大查询隔离。 执行如下命令,设置单个分片查询任务被定义为大查询任务的阈值。 PUT _cluster/settings { "persistent": { "search.isolator.memory.task.limit": "50MB", "search.isolator.time.management": "10s" } } 表2 参数说明 参数名 数据类型 说明 search.isolator.memory.task.limit String 查询任务用于聚合等操作向节点申请的大内存,申请内存超过此阈值将进行隔离观察。 取值范围:0b~节点最大堆内存 默认值:50MB 说明: 可以通过如下命令查询集群堆内存使用情况和最大值。 GET _cat/nodes?&h=id,ip,port,r,ramPercent,ramCurrent,heapMax,heapCurrent search.isolator.time.management String 查询任务创建至今的时长(即开始使用集群资源进行查询),超过阈值将被隔离观察。 取值范围:≥ 0ms 默认值:10s 执行如下命令,触发隔离池内查询任务中断的阈值。 PUT _cluster/settings { "persistent": { "search.isolator.memory.pool.limit": "50%", "search.isolator.memory.heap.limit": "90%", "search.isolator.count.limit": 1000 } } 表3 参数说明 参数名 数据类型 说明 search.isolator.memory.pool.limit String 当前节点最大堆内存百分比,当隔离池所有大查询任务申请的内存超过此阈值将触发中断控制程序,取消执行隔离池其中一条大查询任务。 取值范围:0.0~100.0% 默认值:50% search.isolator.memory.heap.limit String 当前节点堆内存的实际使用阈值,当节点堆内存使用超过阈值百分比时触发中断控制程序,取消执行隔离池其中一条大查询任务。 取值范围:0.0~100.0% 默认值:90% search.isolator.count.limit Integer 当前节点隔离池的大查询任务数阈值,被观察的查询任务数超过此阈值将触发中断控制程序,不再接受新的大查询。如果继续触发大查询请求,则直接取消该请求。 取值范围:10~50000 默认值:1000 根据业务设置“search.isolator.memory.pool.limit”,“search.isolator.count.limit”参数时,可结合“search.isolator.memory.task.limit”,“search.isolator.time.management”两个参数控制查询任务进入到隔离池的数量。 执行如下命令,中断隔离池中某一条查询任务的选取策略。 PUT _cluster/settings { "persistent": { "search.isolator.strategy": "fair", "search.isolator.strategy.ratio": "0.5%" } } 参数名 数据类型 说明 search.isolator.strategy String 触发中断控制程序时大查询选取的策略。根据策略选取一条查询进行中断。 说明: 大查询隔离池每秒检查一次,直至堆内存下降到安全范围。 取值范围:fair、mem-first、time-first mem-first策略是指触发中断时,选取隔离池中堆内存使用最大的一条查询任务进行中断。 time-first策略是指触发中断时,选取隔离池中已运行时间最长的一条查询任务进行中断。 fair策略是综合考虑内存和时间两种因素,如果分片查询的堆内存申请大小相差不超过“最大堆内存乘search.isolator.strategy.ratio”的大小,则认为时间较长的查询更应该中断。否则认为堆内存使用较大的查询更应该中断。 默认值:fair search.isolator.strategy.ratio String fair策略的阈值,仅当“search.isolator.strategy”值为“fair”生效。综合考虑大查询的运行时间及内存,当大查询任务内存相差不超过此阈值时,考虑选取运行时间长的大查询进行中断。当查询内存相差超过此阈值时,选取大内存查询任务进行中断。 取值范围:0.0-100.0% 默认值:1% 配置全局查询超时。 执行如下命令,设置全局查询任务超时时间。 PUT _cluster/settings { "persistent": { "search.isolator.time.limit": "120s" } } 参数名 数据类型 说明 search.isolator.time.limit String 当全局查询超时功能开启时,所有已创建的查询任务超过此时长将被取消执行。 取值范围:≥ 0ms 默认值:120s
  • 管理向量索引缓存 CSS 的向量检索引擎使用C++实现,使用的是堆外内存,该插件提供了接口对向量索引的缓存进行管理。 查看缓存统计信息 GET /_vector/stats 在向量插件实现中,向量索引与Lucene其他类型索引一样,每一个segment构造并存储一份索引文件,在查询时,该索引文件会被加载到堆外内存中。插件使用缓存机制对这些堆外内存进行管理。上述API能够查询当前堆外内存使用量、缓存命中次数、加载次数等信息。 预加载向量索引 PUT /_vector/warmup/{index_name} 使用上述接口能将指定index_name的向量索引预加载至堆外内存供查询使用。 清除缓存 PUT /_vector/clear/cache PUT /_vector/clear/cache/index_name 在使用向量索引时,缓存机制会限制堆外内存使用量。当总索引大小超出缓存大小限制时,将会发生索引项的换进换出,此时将会影响查询的性能。通过清除缓存API能够将不再使用的索引缓存清空,保证热数据索引的查询性能。 父主题: 配置Elasticsearch集群向量检索
  • 代码示例 from elasticsearch import Elasticsearch from elasticsearch import helpers # 创建Elasticsearch客户端 def get_client(hosts: list, user: str = None, password: str = None): if user and password: return Elasticsearch(hosts, http_auth=(user, password), verify_certs=False, ssl_show_warn=False) else: return Elasticsearch(hosts) # 创建索引表 def create(client: Elasticsearch, index: str): # 索引mapping信息 index_mapping = { "settings": { "index": { "vector": "true", # 开启向量特性 "number_of_shards": 1, # 索引分片数,根据实际需求设置 "number_of_replicas": 0, # 索引副本数,根据实际需求设置 } }, "mappings": { "properties": { "my_vector": { "type": "vector", "dimension": 2, "indexing": True, "algorithm": "GRAPH", "metric": "euclidean" } # 可根据需求添加其他字段 } } } res = client.indices.create(index=index, body=index_mapping) print("create index result: ", res) # 写入数据 def write(client: Elasticsearch, index: str, vecs: list, bulk_size=500): for i in range(0, len(vecs), bulk_size): actions = [ { "_index": index, "my_vector": vec, # 可根据需求添加其他字段 } for vec in vecs[i: i+bulk_size] ] success, errors = helpers.bulk(client, actions, request_timeout=3600) if errors: print("write bulk failed with errors: ", errors) # 根据需求进行错误处理 else: print("write bulk {} docs success".format(success)) client.indices.refresh(index=index, request_timeout=3600) # 查询向量索引 def search(client: Elasticsearch, index: str, query: list, size: int): # 查询语句,可根据需求选择合适的查询方式 query_body = { "size": size, "query": { "vector": { "my_vector": { "vector": query, "topk": size } } } } res = client.search(index=index, body=query_body) print("search index result: ", res) # 删除索引 def delete(client: Elasticsearch, index: str): res = client.indices.delete(index=index) print("delete index result: ", res) if __name__ == '__main__': # 对于非安全集群,使用: es_client = get_client(hosts=['http://x.x.x.x:9200']) # 对于开启了https的安全集群,使用: # es_client = get_client(hosts=['https://x.x.x.x:9200', 'https://x.x.x.x:9200'], user='xxxxx', password='xxxxx') # 对于未开启https的安全集群,使用: # es_client = get_client(hosts=['http://x.x.x.x:9200', 'http://x.x.x.x:9200'], user='xxxxx', password='xxxxx') # 测试索引名称 index_name = "my_index" # 创建索引 create(es_client, index=index_name) # 写入数据 data = [[1.0, 1.0], [2.0, 2.0], [3.0, 3.0]] write(es_client, index=index_name, vecs=data) # 查询索引 query_vector = [1.0, 1.0] search(es_client, index=index_name, query=query_vector, size=3) # 删除索引 delete(es_client, index=index_name)
  • 写入性能优化 关闭副本,待数据导入完成后再开启副本,减少副本构建的开销。 调整“refresh_interval”为120s或者更大,避免频繁刷新索引生成大量小的segments,同时减少merge带来的向量索引构建开销。 适当调大“native.vector.index_threads”的值(默认为4),增加向量索引构建的线程数。 PUT _cluster/settings { "persistent": { "native.vector.index_threads": 8 } }
  • 查询性能优化 在批量导入场景下,数据写入完成后,执行forcemerge操作能有效提升查询效率。 POST index_name/_forcemerge?max_num_segments=1 如果向量索引所需堆外内存超过了熔断线,查询时索引的缓存管理器会控制索引的换进换出,导致查询变慢,此时可适当调大熔断线的配置。 PUT _cluster/settings { "persistent": { "native.cache.circuit_breaker.cpu.limit": "75%" } } 如果查询的fetch阶段开销较大,可通过配置“_source”减小fdt文件的大小,从而降低fetch开销。 PUT my_index { "settings": { "index": { "vector": "true" }, "index.soft_deletes.enabled": false }, "mappings": { "_source": { "excludes": ["my_vector"] }, "properties": { "my_vector": { "type": "vector", "dimension": 128, "indexing": true, "algorithm": "GRAPH", "metric": "euclidean" } } } }
  • Painless语法扩展查询 CS S扩展实现了多种向量距离计算函数,可在自定义的painless脚本中直接使用,用以构建灵活的重打分公式。 示例如下: POST my_index/_search { "size": 10, "query": { "script_score": { "query": { "match_all": {} }, "script": { "source": "1 / (1 + euclidean(params.vector, doc[params.field]))", "params": { "field": "my_vector", "vector": [1, 2] } } } } } 表5 支持的距离计算函数 函数签名 说明 euclidean(Float[], DocValues) 欧式距离函数。 cosine(Float[], DocValues) 余弦相似度函数。 innerproduct(Float[], DocValues) 内积函数。 hamming(String, DocValues) 汉明距离函数。只支持"dim_type"为"binary"的向量字段,输入的查询向量需要为Base64编码字符串格式。
  • 复合查询 向量检索支持与其他ES子查询组合进行复合查询,比如布尔查询、后置过滤等。 以下两个示例的查询结果:首先查询top10条与查询向量距离最近的结果,filter作为过滤条件将仅保留my_label字段为“red”的结果。 布尔查询示例 POST my_index/_search { "size": 10, "query": { "bool": { "must": { "vector": { "my_vector": { "vector": [1, 2], "topk": 10 } } }, "filter": { "term": { "my_label": "red" } } } } } 后置过滤示例 GET my_index/_search { "size": 10, "query": { "vector": { "my_vector": { "vector": [1, 2], "topk": 10 } } }, "post_filter": { "term": { "my_label": "red" } } }
  • ScriptScore查询 写入向量数据后,针对向量字段可以使用ScriptScore进行最近邻查询,查询语法如下所示。 前置过滤条件可以为任意查询,script_score仅针对前置过滤的结果进行遍历,计算向量相似度并排序返回。此种查询方式的性能取决于前置过滤后中间结果集的大小,当前置过滤条件为"match_all"时,相当于全局暴力检索。 POST my_index/_search { "size":2, "query": { "script_score": { "query": { "match_all": {} }, "script": { "source": "vector_score", "lang": "vector", "params": { "field": "my_vector", "vector": [1.0, 2.0], "metric": "euclidean" } } } } } 表3 script_score参数说明 参数 说明 source script脚本描述,使用向量相似度打分时为固定值"vector_score"。 lang script语法描述,使用固定值"vector"。 field 向量字段名称。 vector 查询向量数据。 metric 度量方式,可选值为:euclidean、inner_product、cosine、hamming。 默认值:euclidean。
  • 标准查询 针对创建了向量索引的向量字段,提供了标准向量查询语法。下述查询命令将会返回所有数据中与查询向量最近的size(topk)条数据。 POST my_index/_search { "size":2, "_source": false, "query": { "vector": { "my_vector": { "vector": [1, 1], "topk":2 } } } } 表1 标准查询的参数说明 参数 说明 vector(第一个) 表示该查询类型为VectorQuery。 my_vector 指定了需要查询的向量字段名称。 vector(第二个) 指定查询向量的具体值,支持数组形式以及Base64编码形式的输入。 topk topk的值通常与size保持一致。 其他可选的查询参数 通过调整不同索引的查询参数,可以获得更高的查询性能或者查询精度,其他参数请参见表2。 表2 可选的查询参数说明 参数 子参数 说明 GRAPH类索引配置参数 ef 查询时考察邻居节点的队列大小。值越大查询精度越高,查询速度会变慢。默认值为200。 取值范围:(0, 100000]。 max_scan_num 扫描节点上限。值越大精度越高,查询速度变慢。默认值为10000。 取值范围:(0, 1000000]。 IVF类索引配置参数 nprobe 查询考察中心点的数目。值越大精度越高,查询速度变慢。默认值为100。 取值范围:(0, 100000]。
  • 重打分查询 当使用GRAPH_PQ索引或者IVF_GRAPH_PQ索引时,查询结果是根据PQ计算的非对称距离进行排序。CSS支持Rescore的方式对查询结果进行重打分精排,提升召回率。 假设my_index是PQ类型的索引,Rescore示例如下: GET my_index/_search { "size": 10, "query": { "vector": { "my_vector": { "vector": [1.0, 2.0], "topk": 100 } } }, "rescore": { "window_size": 100, "vector_rescore": { "field": "my_vector", "vector": [1.0, 2.0], "metric": "euclidean" } } } 表4 Rescore参数说明 参数 说明 window_size 向量检索将会返回topk条结果,仅取前window_size条结果精排。 field 向量字段名称。 vector 查询向量数据。 metric 度量方式,可选值为:euclidean、inner_product、cosine、hamming。 默认值:euclidean。
  • 创建向量索引 登录 云搜索 服务管理控制台。 在“集群管理”页面,选择需要启用向量检索的集群,单击操作列“Kibana”,登录Kibana界面。 单击左侧导航栏的“Dev Tools”,执行如下命令创建向量索引。 创建一个名为“my_index”的索引,该索引包含一个名为“my_vector”的向量字段和一个名为“my_label”的文本字段。其中,向量字段创建了GRAPH图索引,并使用欧式距离作为相似度度量。 PUT my_index { "settings": { "index": { "vector": true } }, "mappings": { "properties": { "my_vector": { "type": "vector", "dimension": 2, "indexing": true, "algorithm": "GRAPH", "metric": "euclidean" }, "my_label": { "type": "text" } } } } 表3 创建索引参数说明 类型 参数 说明 Index settings参数 vector 当需要使用向量索引加速时,需要设置该值为true。 Field mappings参数 type 字段类型,“vector”表示该字段为向量字段。 dimension 向量数据维度。取值范围:[1, 4096]。 indexing 是否开启向量索引加速。 可选值: false:表示关闭向量索引加速,向量数据仅写入docvalues,只支持使用ScriptScore以及Rescore进行向量查询。 true:表示开启向量索引加速,系统将创建额外的向量索引,索引算法由"algorithm"字段指定,写入数据后可以使用VectorQuery进行查询。 默认值:false。 algorithm 索引算法。仅当“indexing”为“true”时生效。 可选值: FLAT:暴力计算,目标向量依次和所有向量进行距离计算,此方法计算量大,召回率100%。适用于对召回准确率要求极高的场景。 GRAPH:图索引,内嵌深度优化的HNSW算法,主要应用在对性能和精度均有较高要求且单shard中文档数量在千万个以内的场景。 GRAPH_PQ:将HNSW算法与PQ算法进行了结合,通过PQ降低原始向量的存储开销,能够使HNSW轻松支撑上亿规模的检索场景。 IVF_GRAPH:算法将IVF与HNSW结合,对全量空间进行划分,每一个聚类中心向量代表了一个子空间,极大地提升检索效率,同时会带来微小的检索精度损失。适用于数据量在上亿以上同时对检索性能要求较高的场景。 IVF_GRAPH_PQ:PQ算法与IVF-HNSW的结合,PQ可以通过配置选择与HNSW结合和IVF结合,进一步提升系统的容量并降低系统开销,适用于shard中文档数量在十亿级别以上同时对检索性能要求较高的场景。 默认值:GRAPH。 说明: 当选择IVF_GRAPH或者IVF_GRAPH_PQ索引时,需要额外进行预构建中心点索引以及注册等步骤,具体内容请参考(可选)预构建与注册中心点向量。 其他可选参数 当使用向量索引加速时(即“indexing”为“true”时),为了获得更高的查询性能以及查询精度,CSS提供了与向量索引相关的可选参数配置,参数说明请参见表4。 metric 计算向量之间距离的度量方式。 可选值: euclidean:欧式距离。 inner_product:内积距离。 cosine:余弦距离。 hamming:汉明距离,仅支持设置"dim_type"为"binary"时使用。 默认值:euclidean。 dim_type 向量维度值的类型。 可选值:binary、float(默认)。 sub_fields 新增参数字段sub_fields用于定义向量附属标量字段,仅支持keyword类型,对应新增支持联合过滤功能,仅支持PV_GRPAH类型。 表4 可选参数说明 类型 参数 说明 GRAPH类索引配置参数 neighbors 图索引中每个向量的邻居数,默认值为64,值越大查询精度越高。索引越大,构建速度以及后续的查询速度也会变慢。 取值范围:[10, 255]。 shrink 构建hnsw时的裁边系数,默认值1.0f。 取值范围:(0.1, 10)。 scaling 构建hnsw时上层图节点数的缩放比例,默认值50。 取值范围:(0, 128]。 efc 构建hnsw时考察邻居节点的队列大小,默认值为200,值越大精度越高,构建速度将会变慢。 取值范围:(0, 100000]。 max_scan_num 扫描节点上限,默认值为10000,值越大精度越高,索引速度变慢。 取值范围:(0, 1000000]。 PQ类索引配置参数 centroid_num 每一段的聚类中心点数目,默认值为255。 取值范围:(0, 65535]。 fragment_num 段数,默认值为0,插件自动根据向量长度设置合适的段数。 取值范围:[0, 4096]。
  • 导入向量数据 执行如下命令,导入向量数据。向“my_index”索引中写入向量数据时,需要指定向量字段名称和向量数据。 向量数据输入格式为逗号分隔的浮点型数组时: POST my_index/_doc { "my_vector": [1.0, 2.0] } 向量数据输入格式为小端字节序编码的Base64字符串时: 在写入二值向量,或向量维度较高、数值有效位较多时,使用Base64编码格式传输、解析更加高效。 POST my_index/_doc { "my_vector": "AACAPwAAAEA=" } 当写入大规模数据时,建议使用Bulk操作: POST my_index/_bulk {"index": {}} {"my_vector": [1.0, 2.0], "my_label": "red"} {"index": {}} {"my_vector": [2.0, 2.0], "my_label": "green"} {"index": {}} {"my_vector": [2.0, 3.0], "my_label": "red"}
  • (可选)准备工作 在创建向量索引前,请根据业务场景,完成集群高级配置。 在离线导入数据场景下,为了提高批量写入性能,建议将索引的“refresh_interval”参数设置为“-1”,即关闭自动刷新索引。 建议将备份数“number_of_replicas”设置为“0”,当离线数据导入完成后,再设置为需要的值。 其他高级功能的参数配置说明请参见表1。 表1 集群高级配置参数说明 参数 说明 native.cache.circuit_breaker.enabled 是否开启堆外内存熔断。 默认值:true。 native.cache.circuit_breaker.cpu.limit 向量索引堆外内存使用上限。 假设使用128GB内存的机器且堆内存大小为31GB,默认堆外内存使用上限为(128 - 31) * 45% = 43.65GB,堆外内存使用量超过该值将会触发写入熔断。 默认值:45%。 native.cache.expire.enabled 是否开启缓存超时设置。开启时,如果某些缓存项长时间没有被访问过将会被清除。 取值范围:true、false。 默认值:false。 native.cache.expire.time 超时时长。 默认值:24h。 native.vector.index_threads 创建底层索引时所使用的线程数,每个shard均会使用多个构建线程。该值建议不要设置过大,避免产生过多的构建线程抢占查询资源。 默认值:4。
  • (可选)预构建与注册中心点向量 当创建向量索引时选择使用“IVF_GRAPH”和“IVF_GRAPH_PQ”的索引算法,则需要对中心点向量进行预构建和注册。 在向量索引加速算法中,“IVF_GRAPH”和“IVF_GRAPH_PQ”适用于超大规模场景。这两种算法需要通过对子空间的切割缩小查询范围,子空间的划分通常采用聚类或者随机采样的方式。在预构建之前,需要通过聚类或者随机采样得到所有的中心点向量。通过预构建和注册将中心点向量预构建成GRAPH或者GRAPH_PQ索引,同时注册到CSS集群内,实现在多个节点间共享此索引文件。中心点索引在shard间复用能够有效减少训练的开销、中心点索引的查询次数,提升写入以及查询的性能。 选择启用向量检索的集群,单击操作列“Kibana”,登录Kibana界面。 单击左侧导航栏的“Dev Tools”,进入操作界面。 创建中心点索引表。 创建的索引命名为my_dict,注意该索引的number_of_shards数必须设置为1,否则无法注册。 当需要使用IVF_GRAPH索引时,中心点索引的algorithm设置为GRAPH。 当需要使用IVF_GRAPH_PQ索引时,中心点索引的algorithm设置为GRAPH_PQ。 PUT my_dict { "settings": { "index": { "vector": true }, "number_of_shards": 1, "number_of_replicas": 0 }, "mappings": { "properties": { "my_vector": { "type": "vector", "dimension": 2, "indexing": true, "algorithm": "GRAPH", "metric": "euclidean" } } } } 写入中心点向量数据。 参考导入向量数据将采样或者聚类得到的中心点向量写入上述创建的my_dict索引中。 调用注册接口。 将上述创建的my_dict索引注册具有全局唯一标识名称(dict_name)的Dict对象。 PUT _vector/register/my_dict { "dict_name": "my_dict" } 创建IVF_GRAPH或IVF_GRAPH_PQ索引。 在创建IVF_GRAPH或者IVF_GRAPH_PQ索引时,不再需要指定dimension以及metric信息,只需指定之前注册好的dict名称即可。 PUT my_index { "settings": { "index": { "vector": true } }, "mappings": { "properties": { "my_vector": { "type": "vector", "indexing": true, "algorithm": "IVF_GRAPH", "dict_name": "my_dict", "offload_ivf": false } } } } 表2 Field mappings参数 参数 说明 dict_name 指定依赖的中心点索引名称。该索引字段的向量维度和度量方式将与dict索引保持一致,不再需要额外指定。 offload_ivf 将底层索引实现的IVF倒排索引卸载到ES端实现,可以减少堆外内存的使用,以及减少写入/合并的性能开销,但是查询的性能也有一定的损失。采用默认值即可。 取值范围:true、false。 默认值:false。
  • 原理说明 向量检索从本质上讲,其思维框架和传统的检索方法没有区别。为了提升向量检索的性能,通常需要解决以下两个问题: 减少候选向量集 和传统的文本检索类似,向量检索也需要某种索引结构来避免在全量的数据上做匹配,传统文本检索是通过倒排索引来过滤掉无关文档,而向量检索是通过对向量建立索引结构来绕过不相关的向量,减小需要考察的范围。 降低单个向量计算的复杂度 向量检索支持漏斗模型,先对所有向量进行量化和近似计算,筛选出一定量接近检索目标的数据集,然后基于筛选的数据集进行精细的计算和排序。本方法不需要对所有向量都进行复杂的计算,可以有效提高检索效率。 向量检索即在一个给定的向量数据集中,按照某种度量方式,检索出与查询向量相近的K个向量(K-Nearest Neighbor,KNN),但由于KNN计算量过大,通常只关注近似近邻(Approximate Nearest Neighbor,ANN)问题。
  • 功能介绍 云搜索服务的向量检索引擎集成了暴力检索、图索引(HNSW)、乘积量化、IVF-HNSW等多种向量索引,支持欧式、内积、余弦、汉明等多种相似度计算方式,召回率和检索性能均优于开源引擎。能够满足高性能、高精度、低成本、多模态等多种应用场景及需求。 向量检索支持原生Elasticsearch的所有能力,包括分布式、多副本、错误恢复、快照、权限控制等;兼容所有原生Elasticsearch生态,包括集群监测工具Cerebro,可视化工具Kibana,实时数据采集工具Logstash等;提供Python/Java/Go/C++等多种客户端语言支持。
  • 查询存储冷数据的OBS实时速率 仅2023年02月后创建的Elasticsearch 7.6.2、Elasticsearch 7.10.2和OpenSearch 1.3.6集群支持提升冷数据的查询性能。 为了更清晰的了解到存算分离的插件在OBS中的使用情况,CSS服务新增了OBS实时速率的统计接口,并且将实时速率记录到系统索引“.freeze_obs_rate-YYYY.mm.dd”中。 OBS实时速率的计算方式:每5秒计算一次,查询前5秒内的平均OBS操作速率。 系统索引“.freeze_obs_rate-YYYY.mm.dd”用于存放OBS操作实时速率和OBS操作数据,便于了解存储冷数据的OBS的操作趋势。该索引的默认保留时间是30天。 查询存储冷数据的OBS实时速率。 执行如下命令,查询所有节点中存储冷数据的OBS实时速率。 GET _frozen_stats/obs_rate 执行如下命令,查询指定节点中存储冷数据的OBS实时速率。 GET _frozen_stats/obs_rate/{nodeId} “{nodeId}”为节点ID。 响应示例: { "_nodes" : { "total" : 1, "successful" : 1, "failed" : 0 }, "cluster_name" : "elasticsearch", "nodes" : { "dflDvcSwTJ-fkiIlT2zE3A" : { "name" : "node-1", "transport_address" : "127.0.0.1:9300", "host" : "127.0.0.1", "ip" : "127.0.0.1", "update_time" : 1671777600482, // 当前统计值的更新时间。 "obs_rate" : { "list_op_rate" : 0.0, // obs list操作的速率,单位:次/秒。 "get_meta_op_rate" : 0.0, // obs get meta操作的速率,单位:次/秒。 "get_obj_op_rate" : 0.0, // obs get操作的速率,单位:次/秒。 "put_op_rate" : 0.0, // obs put操作的速率,单位:次/秒。 "obs_total_op_rate" : 0.0, // obs所有操作的速率,单位:次/秒。 "obs_upload_rate" : "0.0 MB/s", // obs上传数据的速率,MB/秒。 "obs_download_rate" : "0.0 MB/s" // obs下载数据的速率,MB/秒。 } } } } 修改存储OBS实时速率的索引“.freeze_obs_rate-YYYY.mm.dd”的保留时间。索引的默认保留时间是30天。 执行如下命令,将索引保留时间改成7天。 PUT _cluster/settings { "persistent": { "low_cost.obs_rate_index.evict_time": "7d" } } 表11 配置项说明 配置项 类型 scope 是否可动态修改 说明 low_cost.obs_rate_index.evict_time String node 是 用于控制索引“.freeze_obs_rate-YYYY.mm.dd”的保留时间。 取值范围:1d~365d。 默认值:30d。 单位:天。
  • 提升冷数据的查询性能 仅2023年02月后创建的Elasticsearch 7.6.2、Elasticsearch 7.10.2和OpenSearch 1.3.6集群支持提升冷数据的查询性能。 在Kibana的Discover页面首次查询冷数据时,由于此时无任何缓存,导致所有数据均需要从OBS上获取,当命中的数据较多时,需要耗费大量的时间从OBS上获取对应的时间字段以及文件元数据。如果将这一部分数据直接缓存在本地,即可大幅提升查询性能,解决Discover页面首次查询慢的问题。云搜索服务就是通过冷数据的本地缓存,实现冷数据的查询性能提升。本地缓存配置是预置的,用户可以基于业务场景修改配置,也可以查询、了解本地缓存信息。 修改冷数据的本地缓存配置。 表10 本地缓存配置项说明 配置项 类型 scope 是否可动态修改 说明 low_cost.local_cache.max.capacity Integer node 是 节点上,能够打开的冷数据缓存的最大数量。(每个shard对应一个缓存对象) 取值范围:10~5000 默认值:500 说明: 当堆内存使用率一直很高时,可以尝试降低该值。 当查询冷数据本地缓存的相关统计指标中load_overflow_count数值一直持续快速增加时,建议调大该值。 index.low_cost.local_cache.threshold Integer index 是 启用冷数据本地缓存的阈值。 当date类型字段的占比小于此值时,启用冷数据本地缓存date类型字段。否则不使用。 如果当前索引的date类型字段占据当前索引的绝大部分数据量,则不建议使用此功能。 单位:% 取值范围:0~100 默认值:50 index.low_cost.local_cache.evict_time 字符串 index 是 冷数据的本地缓存的淘汰时间,当缓存时间大于该值,缓存将被删除。根据index.frozen_date(冻结成功的时间)判定,当索引无index.frozen_date时,则根据索引创建时间判定。 单位:天 取值范围:1d~365d 默认值:30d 说明: 建议根据磁盘用量调整淘汰时长,节省磁盘空间。 执行如下命令,修改“low_cost.local_cache.max.capacity”。 PUT _cluster/settings { "persistent": { "low_cost.local_cache.max.capacity":1000 } } 执行如下命令,修改“index.low_cost.local_cache.threshold”。 PUT es_write_pref2-00000000021/_settings { "index.low_cost.local_cache.threshold":20 } 执行如下命令,修改“index.low_cost.local_cache.evict_time”。 PUT es_write_pref2-00000000021/_settings { "index.low_cost.local_cache.evict_time":"7d" } 查询冷数据的本地缓存信息。 执行如下命令,查询所有节点中冷数据的本地缓存相关指标。 GET /_frozen_stats/local_cache 执行如下命令,查询指定节点中冷数据的本地缓存相关指标。 GET /_frozen_stats/local_cache/{nodeId} “{nodeId}”为节点ID。 返回结果如下: { "_nodes" : { "total" : 1, "successful" : 1, "failed" : 0 }, "cluster_name" : "elasticsearch", "nodes" : { "6by3lPy1R3m55Dcq3liK8Q" : { "name" : "node-1", "transport_address" : "127.0.0.1:9300", "host" : "127.0.0.1", "ip" : "127.0.0.1", "local_cache" : { "get_stats" : { "get_total_count" : 562, //从冷数据本地缓存查询数据的总次数 "get_hit_count" : 562, //从冷数据本地缓存查询数据命中的次数 "get_miss_count" : 0, //从冷数据本地缓存查询数据未命中的次数 "get_total_ns" : 43849200, //从冷数据本地缓存查询数据的总时长 "get_avg_ns" : 78023 //从冷数据本地缓存查询数据的平均时长 }, "load_stats" : { "load_count" : 2, //加载冷数据本地缓存的次数 "load_total_ms" : 29, //加载冷数据本地缓存的总时长 "load_avg_ms" : 14, //加载冷数据本地缓存的平均时长 "load_fail_count" : 0, //加载冷数据本地缓存的失败次数 "load_overflow_count" : 0 //加载冷数据本地缓存时超过缓存池的次数 }, "reload_stats" : { "reload_count" : 0, //重新生成冷数据本地缓存的次数 "reload_total_ms" : 0, //重新生成冷数据本地缓存的总时长 "reload_avg_ms" : 0, //重新生成冷数据本地缓存的平均时长 "reload_fail_count" : 0 //重新生成冷数据本地缓存的失败次数 }, "init_stats" : { "init_count" : 0, //初始化冷数据本地缓存的次数 "init_total_ms" : 0, //初始化冷数据本地缓存的总时长 "init_avg_ms" : 0, //初始化冷数据本地缓存的平均时长 "init_fail_count" : 0 //初始化冷数据本地缓存的失败次数 } } } } }
  • 查看冻结索引任务 执行如下命令,查看冻结索引任务的进度。 GET _freeze_low_cost_progress/${freeze_uuid} 表3 请求参数说明 参数名 说明 freeze_uuid 冻结索引任务的ID,该ID由冻结索引时获取。 返回结果如下: { "stage" : "STARTED", "shards_stats" : { "INIT" : 0, "FAILURE" : 0, "DONE" : 0, "STARTED" : 3, "ABORTED" : 0 }, "indices" : { "data1" : [ { "uuid" : "7OS-G1-tRke2jHZPlckexg", "index" : { "name" : "data1", "index_id" : "4b5PHXJITLaS6AurImfQ9A", "shard" : 2 }, "start_ms" : 1611972010852, "end_ms" : -1, "total_time" : "10.5s", "total_time_in_millis" : 10505, "stage" : "STARTED", "failure" : null, "size" : { "total_bytes" : 3211446689, "finished_bytes" : 222491269, "percent" : "6.0%" }, "file" : { "total_files" : 271, "finished_files" : 12, "percent" : "4.0%" }, "rate_limit" : { "paused_times" : 1, "paused_nanos" : 946460970 } }, { "uuid" : "7OS-G1-tRke2jHZPlckexg", "index" : { "name" : "data1", "index_id" : "4b5PHXJITLaS6AurImfQ9A", "shard" : 0 }, "start_ms" : 1611972010998, "end_ms" : -1, "total_time" : "10.3s", "total_time_in_millis" : 10359, "stage" : "STARTED", "failure" : null, "size" : { "total_bytes" : 3221418186, "finished_bytes" : 272347118, "percent" : "8.0%" }, "file" : { "total_files" : 372, "finished_files" : 16, "percent" : "4.0%" }, "rate_limit" : { "paused_times" : 5, "paused_nanos" : 8269016764 } }, { "uuid" : "7OS-G1-tRke2jHZPlckexg", "index" : { "name" : "data1", "index_id" : "4b5PHXJITLaS6AurImfQ9A", "shard" : 1 }, "start_ms" : 1611972011021, "end_ms" : -1, "total_time" : "10.3s", "total_time_in_millis" : 10336, "stage" : "STARTED", "failure" : null, "size" : { "total_bytes" : 3220787498, "finished_bytes" : 305789614, "percent" : "9.0%" }, "file" : { "total_files" : 323, "finished_files" : 14, "percent" : "4.0%" }, "rate_limit" : { "paused_times" : 3, "paused_nanos" : 6057933087 } } ] } } 表4 返回参数说明 参数名 说明 stage 当前所处状态。取值包括: INIT:刚启动或者正在初始化。 FAILURE:失败。 DONE:完成。 STARTED:已启动。 ABORTED:取消,预留字段。 shards_stats 处在各个状态的shard个数。 indices 每个索引的状态详情。 表5 indices返回值说明 参数名 说明 uuid freeze的uuid。 index 索引信息和shard信息。 start_ms 开始时间。 end_ms 结束时间,如果没有结束则显示为-1。 total_time 已花费时间。 total_time_in_millis 已花费时间毫秒数。 stage 当前shard所处的状态。 failure 失败原因,如果没有失败则显示为null。 size.total_bytes 总共需要冻结的文件的字节数。 size.finished_bytes 已经完成冻结的字节数。 size.percent 已经完成冻结的字节数百分比。 file.total_bytes 总共需要冻结的文件个数。 file.finished_bytes 已经完成冻结的文件个数。 file.percent 已经完成冻结的文件个数百分比。 rate_limit.paused_times 达到限速导致冻结暂停的次数。 rate_limit.paused_nanos 达到限速导致冻结暂停的时间纳秒数。 冻结完成的索引会增加以下settings,可参考表6。 表6 冻结索引settings 参数 说明 index.frozen_low_cost 标识该索引为冻结索引。取值为true。 index.blocks.write 冻结后的索引禁止写入。取值为true。 index.store.type 标识该索引的存储类型为obs。取值为obs。
  • 基于冻结状态查询索引列表 执行如下命令,基于冻结状态查询索引列表。 GET _cat/freeze_indices?stage=${STAGE} 表7 请求参数说明 参数名 说明 STAGE 索引的冻结状态,可选值如下: start:开始冻结但是还未完成的索引列表 done: 已经完成冻结的索引列表 unfreeze:没有冻结的索引列表 空或者其他值:正在冻结过程中或者已经冻结完成的所有索引列表 返回结果如下: green open data2 0bNtxWDtRbOSkS4JYaUgMQ 3 0 5 0 7.9kb 7.9kb green open data3 oYMLvw31QnyasqUNuyP6RA 3 0 51 0 23.5kb 23.5kb 此命令的参数和返回值与开源Elasticsearch的_cat/indices一致。
  • 查询存储在OBS中冷数据的缓存状态 冻结索引之后,当冷数据第一次被查询时,系统会自动进行数据缓存,集群支持查询存储在OBS中冷数据的缓存状态。当需要调试集群性能时,也可以重置缓存状态。 查询节点中存储在OBS中冷数据的缓存状态。 执行如下命令,查询所有节点中冷数据的缓存信息。 GET _frozen_stats 执行如下命令,查询指定节点中冷数据的缓存信息。 GET _frozen_stats/${node_id} 表9 请求参数说明 参数名 说明 node_id 节点ID。 返回结果如下: { "_nodes" : { "total" : 3, // 所有节点数量 "successful" : 3, // 成功的节点数量 "failed" : 0 // 失败的节点数量 }, "cluster_name" : "css-zzz1", // 集群名称 "nodes" : { "7uwKO38RRoaON37YsXhCYw" : { "name" : "css-zzz1-ess-esn-2-1", // 节点名称 "transport_address" : "10.0.0.247:9300", // 节点transport连接地址 "host" : "10.0.0.247", // 节点host "ip" : "10.0.0.247", // 节点IP "block_cache" : { "default" : { "type" : "memory", // cache类型,memory表示内存cache "block_cache_capacity" : 8192, // cache容量 "block_cache_blocksize" : 8192, // cache中单个block大小,单位为bytes,如此处表示8k "block_cache_size" : 12, // cache已被占用的大小 "block_cache_hit" : 14, // cache命中数 "block_cache_miss" : 0, // cache未命中数 "block_cache_eviction" : 0, // cache被逐出次数 "block_cache_store_fail" : 0 // 如果cache满了,可能导致新的cache存储失败,此处表示存储失败的次数 } }, "obs_stats" : { "list" : { "obs_list_count" : 17, // 调用OBS list接口的次数 "obs_list_ms" : 265, // 调用OBS list接口的总耗时 "obs_list_avg_ms" : 15 // 调用OBS list接口的平均耗时 }, "get_meta" : { "obs_get_meta_count" : 79, // 调用OBS 获取元数据接口的次数 "obs_get_meta_ms" : 183, // 调用OBS 获取元数据接口的总耗时 "obs_get_meta_avg_ms" : 2 // 调用OBS 获取元数据接口的平均耗时 }, "get_obj" : { "obs_get_obj_count" : 12, // 调用OBS getObject接口的次数 "obs_get_obj_ms" : 123, // 调用OBS getObject接口的总耗时 "obs_get_obj_avg_ms" : 10 // 调用OBS getObject接口的平均耗时 }, "put_obj" : { "obs_put_obj_count" : 12, // 调用OBS putObject接口的总次数 "obs_put_obj_ms" : 2451, // 调用OBS putObject接口的总耗时 "obs_put_obj_avg_ms" : 204 // 调用OBS putObject接口的平均耗时 }, "obs_op_total" : { "obs_op_total_ms" : 3022, // 调用OBS接口的总耗时 "obs_op_total_count" : 120, // 调用OBS接口的总次数 "obs_op_avg_ms" : 25 // 调用OBS接口的平均耗时 } }, "reader_cache" : { "hit_count" : 0, "miss_count" : 1, "load_success_count" : 1, "load_exception_count" : 0, "total_load_time" : 291194714, "eviction_count" : 0 } }, "73EDpEqoQES749umJqxOzQ" : { "name" : "css-zzz1-ess-esn-3-1", "transport_address" : "10.0.0.201:9300", "host" : "10.0.0.201", "ip" : "10.0.0.201", "block_cache" : { "default" : { "type" : "memory", "block_cache_capacity" : 8192, "block_cache_blocksize" : 8192, "block_cache_size" : 12, "block_cache_hit" : 14, "block_cache_miss" : 0, "block_cache_eviction" : 0, "block_cache_store_fail" : 0 } }, "obs_stats" : { "list" : { "obs_list_count" : 17, "obs_list_ms" : 309, "obs_list_avg_ms" : 18 }, "get_meta" : { "obs_get_meta_count" : 79, "obs_get_meta_ms" : 216, "obs_get_meta_avg_ms" : 2 }, "get_obj" : { "obs_get_obj_count" : 12, "obs_get_obj_ms" : 140, "obs_get_obj_avg_ms" : 11 }, "put_obj" : { "obs_put_obj_count" : 12, "obs_put_obj_ms" : 1081, "obs_put_obj_avg_ms" : 90 }, "obs_op_total" : { "obs_op_total_ms" : 1746, "obs_op_total_count" : 120, "obs_op_avg_ms" : 14 } }, "reader_cache" : { "hit_count" : 0, "miss_count" : 1, "load_success_count" : 1, "load_exception_count" : 0, "total_load_time" : 367179751, "eviction_count" : 0 } }, "EF8WoLCUQbqJl1Pkqo9-OA" : { "name" : "css-zzz1-ess-esn-1-1", "transport_address" : "10.0.0.18:9300", "host" : "10.0.0.18", "ip" : "10.0.0.18", "block_cache" : { "default" : { "type" : "memory", "block_cache_capacity" : 8192, "block_cache_blocksize" : 8192, "block_cache_size" : 12, "block_cache_hit" : 14, "block_cache_miss" : 0, "block_cache_eviction" : 0, "block_cache_store_fail" : 0 } }, "obs_stats" : { "list" : { "obs_list_count" : 17, "obs_list_ms" : 220, "obs_list_avg_ms" : 12 }, "get_meta" : { "obs_get_meta_count" : 79, "obs_get_meta_ms" : 139, "obs_get_meta_avg_ms" : 1 }, "get_obj" : { "obs_get_obj_count" : 12, "obs_get_obj_ms" : 82, "obs_get_obj_avg_ms" : 6 }, "put_obj" : { "obs_put_obj_count" : 12, "obs_put_obj_ms" : 879, "obs_put_obj_avg_ms" : 73 }, "obs_op_total" : { "obs_op_total_ms" : 1320, "obs_op_total_count" : 120, "obs_op_avg_ms" : 11 } }, "reader_cache" : { "hit_count" : 0, "miss_count" : 1, "load_success_count" : 1, "load_exception_count" : 0, "total_load_time" : 235706838, "eviction_count" : 0 } } } } 执行如下命令,可以重置缓存状态。 POST _frozen_stats/reset 此命令主要用于调试性能问题,例如重置缓存状态后再次执行查询可以清晰看到本次查询的缓存命令情况。在业务运行阶段不需要执行此命令。 返回结果如下: { "_nodes" : { "total" : 1, "successful" : 1, "failed" : 0 }, "cluster_name" : "Es-0325-007_01", "nodes" : { "mqTdk2YRSPyOSXfesREFSg" : { "result" : "ok" } } }
  • 冻结索引 执行如下命令,将指定索引转储到OBS中。 POST ${index_name}/_freeze_low_cost 表1 请求参数说明 参数名 说明 index_name 需要冻结的索引名称。 返回结果如下: { "freeze_uuid": "pdsRgUtSTymVDWR_HoTGFw" } 表2 返回参数说明 参数名 说明 freeze_uuid 冻结索引任务的ID,在提交冻结请求后会启动一个异步任务,请求返回任务ID,使用该ID可以查询冻结索引任务的进度。
  • 约束限制 仅Elasticsearch 7.6.2、Elasticsearch 7.10.2、OpenSearch 1.3.6集群支持存算分离。 在执行冻结索引前,系统会将待冻结的索引配置为只读状态,即便在索引数据转储到OBS后,索引也是只读状态,不支持写入数据。 在冻结索引过程中,查询请求不受影响。在冻结完成后,会将索引先Close再Open,在这段时间内,索引不可查询,集群可能短暂出现Red状态,索引Open结束后集群恢复正常。 将历史索引数据转储到OBS的过程中会占用网络带宽。 冻结索引后,索引会被转储到OBS中,同时本地磁盘中的索引数据会被删除。当查询被冻结的索引时,时延会增加,在聚合时,由于查询复杂、数据读取多,时延变长会更明显。 已转储到OBS中的索引不支持解冻,即不可回退为可写的索引。 由于存算分离的特性依赖OBS,所以使用过程中要遵守OBS的“带宽”和“每秒请求数(QPS)”的使用限制,详细请参见OBS使用限制。当超过限制时,集群中涉及到OBS查询的性能都会下降,例如恢复分片的速度变慢、查询数据时变慢等。
  • 典型示例:通过管理员账户给用户分配其他Tenant的访问权限 新添加的test用户可以访问Kibana,并且可以使用Kibana的index_pattern、Discover、Dashboards等权限,但是这并不意味着test用户能看到任意的“.kibana”信息。test用户默认只能看到Private Tenant和Global Tenant空间的数据,如果需要访问其他用户的Tenant空间,则需要通过管理员账户在test用户的Role中定义其他空间的index_pattern、dashboard等信息的访问权限。 使用管理员账户admin在集群的Global Tenant中创建index_pattern和Dashboards。 Global Tenant是所有用户都可以直接访问的,当部门过多时,可以通过给用户分Tenant组进行管理。 在“Security”中选择“Tenants”。单击“+”建立以部门为粒度的Tenant,例如“test_tenant”。 图9 创建Tenants 在“test_tenant”下创建本部门支持访问的index_pattern、Dashboards信息。 在“Security”中选择“Roles”,单击test用户对应的角色“Role1”,在“Tenant Permissions”页签,给“Role1”分配“test_tenant”。 保存后使用test用户访问集群,确认能否访问test_tenant空间内容。
  • 背景信息 云搜索服务用opendistro_security安全插件对外提供安全集群能力,opendistro_security安全插件是基于RBAC(Role-Based Access Control)模型构建。RBAC包括三个重要核心概念:用户(User)、权限(Action)、角色(Role)。RBAC简化了用户和权限的关系,降低了权限管理的难度,方便权限扩展易于维护。三者之前的关系如图1所示。 图1 用户、权限和角色 表1 概念介绍 参数 描述 User 用户:可以向Elasticsearch集群发出操作请求。用户具有凭证(例如,用户名和密码)、零个或多个后端角色以及零个或多个自定义属性。 Role 角色:定义为权限或操作组的组合,包括对集群,索引,文档或字段的操作权限。 Permission 权限:单个动作,例如创建索引(例如indices:admin/create)。 Role mapping 角色映射:用户在成功进行身份验证后会担任角色。角色映射,就是将角色映射到用户(或后端角色)。例如,kibana_user(角色)到jdoe(用户)的映射意味着John Doe在获得kibana_user身份验证后获得了所有权限。同样,all_access(角色)到admin(后端角色)的映射意味着具有后端角色admin(来自LDAP / Active Directory服务器)的任何用户都获得了all_access身份验证后的所有权限。您可以将每个角色映射到许多用户和/或后端角色。 Action group 操作组:一组权限。例如,预定义的SEARCH操作组授权角色使用_search和_msearchAPI。 除了RBAC模型,Elasticsearch还有Tenant概念。RBAC用于解决用户级别的授权问题,而Tenant则处理不同租户间的信息共享问题。通过配置Tenant空间,租户能够在该空间内共享Dashboard、index_pattern等信息。 默认情况下,用户仅能查看其Private Tenant空间中的index_pattern、dashboard等信息。当添加新用户“test”时,系统会自动生成一个名为“.kibana_xxx_test”的索引,该用户Private空间的内容将存储于此。同理,管理员账号的Private Tenant空间内容则存储在“.kibana_xxx_admin”索引中。当需要与其他租户共享index_pattern或Dashboard信息时,可以选择在Global Tenant空间中创建它们,其他用户只需切换至Global Tenant,即可访问共享信息。 在Kibana界面的Security菜单中,您可以控制用户在Elasticsearch集群中的权限,实现集群、索引、文档和字段四个级别的细粒度访问权限控制。 支持添加或删除集群的用户,并能够将用户映射到角色,实现用户关联角色权限。 角色映射功能允许配置角色的成员,通过用户名、后端角色和主机名将用户分配给相应的角色。支持为每种角色配置集群访问权限、索引和文档的访问权限,以及Kibana的使用权限。 有关安全集群的更多安全配置信息以及详细的操作指导,可以参考Elasticsearch的安全模式官方介绍。
  • 典型示例:通过管理员账户给用户分配指定索引“index*”的Read权限 使用管理员账户admin登录安全集群。 在“Security”中选择“Roles”,进入Open Distro Security Roles页面。 在“Open Distro Security Roles”页面,单击“+”添加角色权限。 在“Overview”页签,设置角色名。例如“Role1”。 在“Index Permissions”页签,单击“Add index permissions”设置索引权限。 图8 设置权限 “Index patterns”:输入“index*”,表示需要为所有index开头的索引设置权限。 “Permissions: Action Groups”:选择需要的权限。当需要查询权限时,选择“read”,当需求写入权限时,选择“write”。具体的操作对应着底层的action,可以在Kibana界面的permission模块获得详细介绍。此处以“read”为例,则选择“indices:data/read*”和“indices:admin/mappings/fields/get*”权限。“indices:data/read*”包含“indices:data/read/”下所有的权限,比如“indices:data/read/get”、“indices:data/read/mget”、“indices:data/read/search”等。 单击“Save Role Definition”,保存角色设置,即可看到设置的角色“Role1”。 在Security中选择“Role Mappings”,进入Role Mappings页面。 在“Role Mappings”页面,单击“+”添加用户“test”和角色“Role1”映射。 添加完成后,单击“Submit”。 配置完成后,“test”用户即可拥有“index*”的Read权限。
  • 典型示例:通过管理员账户给用户分配Kibana的访问权限 使用管理员账户admin登录安全集群。 在“Security”中选择“Roles”,进入Open Distro Security Roles页面。 在“Open Distro Security Roles”页面,单击“+”添加角色权限。 在“Overview”页签,设置角色名。例如“kibana_user”。 在“Tenant Permissions”页签设置租户权限。 “Global permissions”:单击“Add Field”,设置角色的kibana读写权限,例如“kibana_all_read”或“kibana_all_write”权限。 “Tenant permissions”:单击“Add tenant pattern”,自行添加租户模式,并且为新增的租户模式设置“kibana_all_read”或“kibana_all_write”权限。 图7 Tenant Permissions页面 单击“Save Role Definition”,保存角色设置,即可看到设置的角色“kibana_user”。 在Security中选择“Role Mappings”,进入Role Mappings页面。 在“Role Mappings”页面,单击“+”添加用户“test”和角色“kibana_user”映射。 添加完成后,单击“Submit”。 配置完成后,“test”用户即可拥有Kibana的读写权限。
  • 通过内网地址访问Kibana登录Elasticsearch集群 同一VPC下的服务器才能通过Elasticsearch集群的内网访问地址访问Kibana。 登录云搜索服务管理控制台。 在集群管理页面,单击集群名称,进入集群基本信息页面。 在集群基本信息页面,获取集群的内网访问地址。 图2 获取内网地址 将集群的内网访问地址的端口号从“9200”改为“5601”,即为Kibana的内网地址。例如,集群的“内网访问IPv4地址”是“192.168.0.***:9200”,则Kibana的内网地址为“192.168.0.***:5601”。 在服务器中,输入Kibana的内网地址即可进入Kibana登录界面。 非安全模式的集群:将直接进入Kibana操作界面。 安全模式的集群:需要在登录页面输入用户名和密码,单击“Log In”进入Kibana操作界面。用户名默认为admin,密码为创建集群时设置的管理员密码。 登录成功后,可在Kibana界面进行相关操作访问Elasticsearch集群。
  • 通过控制台访问Kibana登录Elasticsearch集群 登录云搜索服务管理控制台。 在“集群管理”页面选择需要登录的集群,单击“操作”列中的“Kibana”进入Kibana登录界面。 非安全模式的集群:将直接进入Kibana操作界面。 安全模式的集群:需要在登录页面输入用户名和密码,单击“Log In”进入Kibana操作界面。用户名默认为admin,密码为创建集群时设置的管理员密码。 登录成功后,可在Kibana界面进行相关操作访问集群。
  • 通过公网地址访问Kibana登录Elasticsearch集群 仅安全模式的集群支持通过Kibana公网访问地址访问Kibana。 登录云搜索服务管理控制台。 开启Elasticsearch集群的Kibana公网访问。支持在创建集群的时候就配置Kibana公网访问,或者在集群创建完之后再开启Kibana公网访问。 在创建集群时配置Kibana公网访问:操作指导请参见创建Elasticsearch集群。 集群创建完之后再开启Kibana公网访问: 在集群管理页面,单击需要配置Kibana公网访问的集群名称,进入集群基本信息页面。 左侧菜单栏选择“Kibana公网访问”,在“Kibana公网访问”右侧单击开关,打开Kibana公网访问功能。 在开启Kibana公网访问页面,配置相关参数。如果集群已配置Kibana公网访问,此时也支持修改相关配置。 表2 配置Kibana公网访问 参数 说明 带宽 设置公网访问的带宽。 取值范围:1-100。 单位:Mbit/s。 访问控制开关 如果关闭访问控制开关,则允许任何IP通过公网IP访问集群Kibana。如果开启访问控制开关,则只允许白名单列表中的IP通过公网IP访问集群Kibana。 白名单 设置允许访问的IP地址或网段,中间用英文逗号隔开。仅当打开“访问控制开关”时才需要配置。 建议开启白名单。 说明: Kibana公网访问配置的白名单依赖ELB的白名单能力。更新白名单后,白名单对新建的连接是实时生效的,但对于已存在的长连接,可能会出现去掉的白名单IP地址还能访问Kibana的场景,这是因为要等长连接断开后才生效,预计1分钟左右。 配置完成后,单击“确定”。 待集群的Kibana公网访问开通以后,在Kibana公网访问页面获取“kibana公网访问地址”。 图1 获取Kibana公网访问地址 在浏览器中,输入“kibana公网访问地址”即可进入Kibana登录界面。 在登录页面输入用户名和密码,单击“Log In”进入Kibana操作界面。用户名默认为admin,密码为创建集群时设置的管理员密码。 登录成功后,可在Kibana界面进行相关操作访问Elasticsearch集群。
共100000条