华为云用户手册

  • ESSecuredClientWithCerDemo代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 import org.apache.commons.io.IOUtils; import org.apache.http.auth.AuthScope; import org.apache.http.auth.UsernamePasswordCredentials; import org.apache.http.client.CredentialsProvider; import org.apache.http.impl.client.BasicCredentialsProvider; import org.apache.http.HttpHost; import org.apache.http.nio.conn.ssl.SSLIOSessionStrategy; import org.elasticsearch.action.search.SearchRequest; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.client.RequestOptions; import org.elasticsearch.client.RestClient; import org.elasticsearch.client.RestClientBuilder; import org.elasticsearch.client.RestHighLevelClient; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.search.SearchHit; import org.elasticsearch.search.SearchHits; import org.elasticsearch.search.builder.SearchSourceBuilder; import java.io.FileInputStream; import java.io.IOException; import java.security.KeyStore; import java.security.SecureRandom; import javax.net.ssl.HostnameVerifier; import javax.net.ssl.KeyManagerFactory; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSession; import javax.net.ssl.TrustManagerFactory; public class ESSecuredClientWithCerDemo { private static final String KEY_STORE_PWD = ""; private static final String TRUST_KEY_STORE_PWD = ""; private static final String CA_JKS_PATH = "ca.jks"; private static final String CLIENT_JKS_PATH = "client.jks"; private static final String ELB_ADDRESS = "127.0.0.1"; private static final int ELB_PORT = 9200; private static final String CSS_USERNAME = "user"; private static final String CSS_PWD = ""; public static void main(String[] args) { // 建立客户端 RestHighLevelClient client = initESClient(ELB_ADDRESS, CSS_USERNAME, CSS_PWD); try { // 查询 match_all,相当于 {\"query\": {\"match_all\": {}}} SearchRequest searchRequest = new SearchRequest(); SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); searchSourceBuilder.query(QueryBuilders.matchAllQuery()); searchRequest.source(searchSourceBuilder); // query SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT); System.out.println("query result: " + searchResponse.toString()); SearchHits hits = searchResponse.getHits(); for (SearchHit hit : hits) { System.out.println(hit.getSourceAsString()); } System.out.println("query success"); Thread.sleep(2000L); } catch (InterruptedException | IOException e) { e.printStackTrace(); } finally { IOUtils.closeQuietly(client); } } private static RestHighLevelClient initESClient(String clusterAddress, String userName, String password) { final CredentialsProvider credentialsProvider = new BasicCredentialsProvider(); credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(userName, password)); SSLContext ctx = null; try { KeyStore ks = getKeyStore(CLIENT_JKS_PATH, KEY_STORE_PWD, "JKS"); KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509"); kmf.init(ks, KEY_STORE_PWD.toCharArray()); KeyStore tks = getKeyStore(CA_JKS_PATH, TRUST_KEY_STORE_PWD, "JKS"); TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509"); tmf.init(tks); ctx = SSLContext.getInstance("SSL", "SunJSSE"); ctx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), new SecureRandom()); } catch (Exception e) { e.printStackTrace(); } SSLIOSessionStrategy sessionStrategy = new SSLIOSessionStrategy(ctx, new HostnameVerifier() { @Override public boolean verify(String arg0, SSLSession arg1) { return true; } }); SecuredHttpClientConfigCallback httpClientConfigCallback = new SecuredHttpClientConfigCallback(sessionStrategy, credentialsProvider); RestClientBuilder builder = RestClient.builder(new HttpHost(clusterAddress, ELB_PORT, "https")) .setHttpClientConfigCallback(httpClientConfigCallback); RestHighLevelClient client = new RestHighLevelClient(builder); return client; } private static KeyStore getKeyStore(String path, String pwd, String type) { KeyStore keyStore = null; FileInputStream is = null; try { is = new FileInputStream(path); keyStore = KeyStore.getInstance(type); keyStore.load(is, pwd.toCharArray()); } catch (Exception e) { e.printStackTrace(); } finally { IOUtils.closeQuietly(is); } return keyStore; } }
  • 形态变更概述 CSS集群支持形态变更,包括集群扩容、集群规格变更、集群缩容等。当创建的集群规格不能满足业务需求时,可以通过形态变更,提高集群的使用效率,降低运维成本。 扩容 当集群数据节点(ess)的写入与查询压力大、响应时间过长时,可以通过扩容数据节点的“节点存储容量”保证数据的持久性。如果因数据量过大或操作不当导致数据节点状态异常时,可以扩容“节点数量”保证集群的可用性。 冷数据节点(ess-cold)主要用于分担ess数据节点的压力,当发现冷数据有丢失的风险时,可以扩容冷数据节点的“节点存储容量”保证冷数据的持久性,同时也支持扩容节点个数保证集群的可用性。 变更规格 当新增索引或分片分配的处理时间过长,或管理集群各个节点的协调、调度不足时,可以变更Master节点(ess-master)的“节点规格”保证集群的正常使用。 当数据节点任务分发量、结果汇聚量过大时,需要变更Client节点(ess-client)的“节点规格”。 当数据的写入与查询突然变得缓慢时,可以变更数据节点(ess)的“节点规格”提高数据节点的查询与写入效率。 当存在冷数据查询缓慢时,可以变更冷数据节点(ess-cold)的“节点规格”提高对数据查询的效率。 缩容 当集群有充足的能力处理当前数据时,为节省资源可以随机减小集群占用的资源。 缩容指定节点 当集群有充足的能力处理当前数据时,为节省资源可以指定一个或多个节点进行缩容。 替换指定节点 当集群中的节点发生故障,可以通过删除故障节点,重建一个一样的新节点,实现指定节点替换。 添加Master/Client节点 当集群数据面业务增长,需要动态调整集群形态时,可以增加Master/Client节点。 更改安全模式 集群创建完成后,可以通过更改安全模式进行集群模式变更。CSS服务支持如下几种安全模式更改: 非安全模式切换为安全模式:“非安全模式”切换为“安全模式+HTTP协议”或“安全模式+HTTPS协议” 安全模式切换为非安全模式:“安全模式+HTTP协议”或“安全模式+HTTPS协议”切换为“非安全模式” 切换安全模式下的协议:“安全模式+HTTP协议”切换为“安全模式+HTTPS协议”、“安全模式+HTTPS协议”切换为“安全模式+HTTP协议” 切换可用区 切换可用区包含两大场景:可用区高可用改造和可用区平移切换。 可用区高可用改造:适用于单AZ改造成两AZ、单AZ改造成三AZ或两AZ改造成三AZ的场景,目的是为了提升集群的高可用性。 可用区平移切换:适用于从一个AZ完全迁移到另一个AZ的场景,目的是为了解决当前可用区资源不足的问题。 父主题: 形态变更
  • 在Kibana查询 登录云搜索服务控制台。 在集群管理列表,选择需要查看插件的集群,单击操作列的“Kibana”登录OpenSearch Dashboard界面。 进入Dev Tools,执行如下命令查看集群插件信息: GET _cat/plugins?v 响应体示例如下: name component version css-3657-ess-esn-1-1 analysis-dynamic-synonym 1.3.6 css-3657-ess-esn-1-1 analysis-icu 1.3.6 css-3657-ess-esn-1-1 analysis-ik 1.3.6 css-3657-ess-esn-1-1 analysis-kuromoji 1.3.6 css-3657-ess-esn-1-1 analysis-logtxt 1.0.0 css-3657-ess-esn-1-1 analysis-nori 1.3.6 css-3657-ess-esn-1-1 analysis-pinyin 1.3.6 css-3657-ess-esn-1-1 analysis-stconvert 1.3.6 css-3657-ess-esn-1-1 hpack 2.0.0 css-3657-ess-esn-1-1 ingest-attachment 1.3.6 css-3657-ess-esn-1-1 obs-store-plugin 1.3.6 css-3657-ess-esn-1-1 opensearch-alerting 1.3.6.0 css-3657-ess-esn-1-1 opensearch-anomaly-detection 1.3.6.0 css-3657-ess-esn-1-1 opensearch-asynchronous-search 1.3.6.0 css-3657-ess-esn-1-1 opensearch-cross-cluster-replication 1.3.6.0 css-3657-ess-esn-1-1 opensearch-index-management 1.3.6.0 css-3657-ess-esn-1-1 opensearch-job-scheduler 1.3.6.0 css-3657-ess-esn-1-1 opensearch-knn 1.3.6.0 css-3657-ess-esn-1-1 opensearch-ml 1.3.6.0 css-3657-ess-esn-1-1 opensearch-observability 1.3.6.0 css-3657-ess-esn-1-1 opensearch-performance-analyzer 1.3.6.0 css-3657-ess-esn-1-1 opensearch-reports-scheduler 1.3.6.0 css-3657-ess-esn-1-1 opensearch-security 1.3.6.0 css-3657-ess-esn-1-1 opensearch-sql 1.3.6.0 css-3657-ess-esn-1-1 repository-obs 1.3.6 “name”是集群的节点名称,“component”是插件名称,“version”是插件版本。
  • 操作步骤 登录云搜索服务管理控制台。 在“集群管理”页面选择目标集群,单击操作列“Kibana”,登录Kibana界面。 单击左侧导航栏的“Dev Tools”,执行命令开启访问日志。 开启集群所有节点的访问日志 PUT /_access_log?duration_limit=30s&capacity_limit=1mb 开启集群中某一节点的访问日志 PUT /_access_log/{nodeId}?duration_limit=30s&capacity_limit=1mb {nodeId}为需要开启访问日志的节点ID。 执行命令查看访问日志。 查看集群所有节点的访问日志API GET /_access_log 查看集群中某一节点的访问日志API GET /_access_log/{nodeId} {nodeId}为需要开启访问日志的节点ID。 响应示例: { "_nodes" : { "total" : 1, "successful" : 1, "failed" : 0 }, "cluster_name" : "css-flowcontroller", "nodes" : { "8x-ZHu-wTemBQwpcGivFKg" : { "name" : "css-flowcontroller-ess-esn-1-1", "host" : "10.0.0.98", "count" : 2, "access" : [ { "time" : "2021-02-23 02:09:50", "remote_address" : "/10.0.0.98:28191", "url" : "/_access/security/log?pretty", "method" : "GET", "content" : "" }, { "time" : "2021-02-23 02:09:52", "remote_address" : "/10.0.0.98:28193", "url" : "/_access/security/log?pretty", "method" : "GET", "content" : "" } ] } } } 表2 响应参数说明 参数名 说明 name 节点名称。 host 节点对应的IP地址。 count 统计周期内,访问节点的请求数量。 access 统计周期内,访问节点的请求详情。参数说明请参见表3。 表3 access 参数名 说明 time 记录请求时间。 remote_address 请求对应的源IP地址和端口。 url 请求的原始URL method 对应请求Path的方法。 content 对应请求的内容。 执行命令删除访问日志。 删除集群所有节点的访问日志API DELETE /_access_log 删除集群中某一节点的访问日志API DELETE /_access_log/{nodeId} {nodeId}为需要开启访问日志的节点ID。
  • 背景信息 流量控制提供2种方式查看访问日志。 一种是提供单独的API开启和查看访问日志,API参数配置记录访问日志时间和大小,访问日志内容通过Rest接口返回。 一种是通过日志打印的方式记录访问日志,开启后用户的访问日志会以文件的方式打印到后端日志中,用户通过查看日志文件查看访问日志。本章节将会介绍此种方式临时访问日志记录。 临时访问日志记录在开启或关闭访问日志时,执行命令涉及的配置参数如下: 表1 访问日志的配置参数说明 配置名 类型 说明 duration_limit String 访问日志记录时间。 取值范围:10~120 单位:s 默认值:30 capacity_limit String 访问日志记录大小。统计开启访问日志后记录的请求大小,当统计的大小大于该配置值,访问日志记录终止。 取值范围:1~5 单位:MB 默认值:1 “duration_limit”和“capacity_limit”只要有一个参数达到阈值,访问日志记录就会停止。
  • 冷热数据切换 用户在创建集群的时候如果选择启用冷数据节点,冷数据节点将会打上“cold”标签,用来表示冷节点,同时其他数据节点将会上升为热节点,会被打上“hot”标签。用户可以通过配置指定索引,将数据分配到冷热节点。 通过设置template,可以通过模板将相应的index存储到指定冷热节点。 如下,登录集群的Kibana Console页面,配置myindex开头的索引,储存在冷节点上面。 这样可以通过模板在创建的时候把myindex*的数据存储在冷数据节点上面。 5.x版本使用以下命令创建模板: PUT _template/test { "order": 1, "template": "myindex*", "settings": { "index": { "refresh_interval": "30s", "number_of_shards": "3", "number_of_replicas": "1", "routing.allocation.require.box_type": "cold" } } } 6.x及以上版本使用以下命令创建模板: PUT _template/test { "order": 1, "index_patterns": "myindex*", "settings": { "refresh_interval": "30s", "number_of_shards": "3", "number_of_replicas": "1", "routing.allocation.require.box_type": "cold" } } 同时也可以单独对已经创建好的索引进行操作。 PUT myindex/_settings { "index.routing.allocation.require.box_type": "cold" } 也可以去掉冷热数据配置,不受冷热数据标签影响。 PUT myindex/_settings { "index.routing.allocation.require.box_type": null }
  • 集群高级配置 在离线导入数据场景下,为了提高批量写入性能,建议将索引的refresh_interval参数设置为-1,即关闭自动刷新索引。 建议将备份数number_of_replicas设置为0,当离线数据导入完成后,再设置为需要的值。 其他高级功能的参数配置说明: 表3 集群配置参数 参数 说明 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。
  • 导入向量数据 执行如下命令,导入向量数据。向“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"}
  • 创建向量索引 登录云搜索服务管理控制台。 在“集群管理”页面,选择需要启用向量检索的集群,单击操作列“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" } } } } 表1 创建索引参数说明 类型 参数 说明 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中文档数量在十亿级别以上同时对检索性能要求较高的场景。 PV_GRAPH:图索引,同属内嵌优化的HNSW算法,主要应用在性能和精度均有较高要求,且单shard中文档数量在千万个以内,可用于内存资源充足的场景。同时该算法支持联合标量过滤,目前仅限关联keyword类型字段,相较于后置过滤和布尔查询,可大幅提升返回结果的填充率和查询性能。仅Elasticsearch集群7.10.2版本支持PV_GRAPH索引。 默认值:GRAPH。 说明: 当选择IVF_GRAPH或者IVF_GRAPH_PQ索引时,需要额外进行预构建中心点索引以及注册等步骤,具体内容请参考(可选)预构建与注册。 表2 当使用向量索引加速时(即“indexing”为“true”时),为了获得更高的查询性能以及查询精度,CSS提供了与向量索引相关的可选参数配置。 metric 计算向量之间距离的度量方式。 可选值: euclidean:欧式距离。 inner_product:内积距离。 cosine:余弦距离。 hamming:汉明距离,仅支持设置"dim_type"为"binary"时使用。 默认值:euclidean。 dim_type 向量维度值的类型。 可选值:binary、float(默认)。 sub_fields 新增参数字段sub_fields用于定义向量附属标量字段,仅支持keyword类型,对应新增支持联合过滤功能,仅支持PV_GRPAH类型。 表2 可选参数说明 类型 参数 说明 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]。
  • 示例指导 登录云搜索服务管理控制台。 在左侧导航栏中,选择“集群管理”,进入集群列表页面。 在集群列表中,单击需要使用的集群对应“操作”列的“Kibana”。 如果开启了安全模式,需要输入创建集群时设置的管理员账户名和密码。 在Kibana的左侧导航中选择“Dev Tools”,进入Console界面。 在Console界面,执行如下命令,创建索引“stconvert”,并指定自定义映射来定义数据类型。 低于7.x版本 PUT /stconvert { "settings": { "number_of_shards": 1, "number_of_replicas": 0, "analysis": { "analyzer": { "ts_ik": { "tokenizer": "ik_smart", "char_filter": [ "tsconvert", "stconvert" ] } }, "char_filter": { "tsconvert": { "type": "stconvert", "convert_type": "t2s" }, "stconvert": { "type": "stconvert", "convert_type": "s2t" } } } }, "mappings": { "type": { "properties": { "desc": { "type": "text", "analyzer": "ts_ik" } } } } } 7.x版本及高于7.x版本 PUT /stconvert { "settings": { "number_of_shards": 1, "number_of_replicas": 0, "analysis": { "analyzer": { "ts_ik": { "tokenizer": "ik_smart", "char_filter": [ "tsconvert", "stconvert" ] } }, "char_filter": { "tsconvert": { "type": "stconvert", "convert_type": "t2s" }, "stconvert": { "type": "stconvert", "convert_type": "s2t" } } } }, "mappings": { "properties": { "desc": { "type": "text", "analyzer": "ts_ik" } } } } 返回结果如下所示。 { "acknowledged" : true, "shards_acknowledged" : true, "index" : "stconvert" } 在Console界面,执行如下命令,导入数据到“stconvert”索引中。 低于7.x版本 POST /stconvert/type/1 { "desc": "國際電視臺" } 7.x版本及高于7.x版本 POST /stconvert/_doc/1 { "desc": "國際電視臺" } 当返回结果信息中“failed”字段的值为“0”时,表示数据导入成功。 在Console界面,执行如下命令,搜索关键字“国际”,并查看搜索结果。 GET /stconvert/_search { "query": { "match": { "desc": "国际" } } } 搜索结果如下所示。 { "took" : 15, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : 1, "max_score" : 0.5753642, "hits" : [ { "_index" : "stconvert", "_type" : "type", "_id" : "1", "_score" : 0.5753642, "_source" : { "desc" : "國際電視臺" } } ] } }
  • 备份与恢复概述 为避免数据丢失,您可以将集群的索引数据进行备份,当数据发生丢失或者想找回某一时间段数据时,您可以通过恢复索引操作快速获得数据。索引的备份是通过创建集群快照实现。第一次备份时,建议将所有索引数据进行备份。 管理自动创建快照:自动创建快照指按照设置的规则,每天在指定时间自动创建快照。您可以开启自动创建功能、设置自动创建的策略、和关闭自动创建功能。 手动创建快照:在任意时间,您通过手动创建快照的方式,针对当时的数据或某几个索引创建快照进行备份。 恢复数据:将已有的快照,通过恢复快照功能,将备份的索引数据恢复到指定的集群中。 删除快照:对于已失效的快照,建议删除以释放存储资源。 父主题: 备份与恢复索引
  • 快速问答列表 Q:业务/应用产生的日志文件较多,是否可以手动删除日志数据? A:不可以。系统根据设置的日志存储时间自动清理过期的日志数据。 Q:日志转储后,LTS会删除转储的内容么?转储的日志如何查询? A:不会删除。日志转储是把日志“另存”一份至OBS,转储后,单击“转储对象”列的OBS桶名称,可以跳转至OBS控制台,查看转储的日志文件。 Q:在应用运维管理(AOM)中关闭日志采集开关,会影响云日志服务收集日志吗? A:会。云日志服务与应用运维服务的日志采集开关为同步状态,即如果您在应用运维管理服务关闭了“超额继续采集日志”开关,则云日志服务的开关也同样关闭,关闭后将停止采集日志。 父主题: 其他问题
  • 使用ICAgent采集日志时,推荐的日志轮转方案是什么? 日志轮转也叫日志切割或日志绕接,通俗来讲是对日志文件的大小进行控制。 软件系统通常会长时间的不停机运行,这样会产生很多信息记录到不同的日志中。随着时间的推移,日志的容量自然会越来越大,而硬盘的空间是有限的,就需要对日志文件的大小进行控制。 常用的日志轮转方式有两种:按时间轮转和按日志大小轮转。 按时间轮转:在进行轮转日志时,以时间为标准,当日志出现的时间满足设定的时间阈值时,则进行日志轮转。类似的典型用法有:/var/log/messages 日志即按每7天轮转一次的规则进行日志切分。 按日志大小轮转:在进行轮转日志时,以日志大小为标准,当日志的大小满足设定的大小时,则进行日志轮转。一般应用程序的日志多使用日志大小进行轮转。 在使用日志轮转时,有以下建议: 如何轮转日志: ICAgent不会对您的日志轮转,建议在应用程序中,使用成熟的软件包自定义日志轮转规则。例如:Java的logback、log4j2、Python的logging、Linux系统的logrotate。典型配置日志文件超过100/50/20MB轮转一次,保存10-20个历史日志文件。 轮转后日志文件命名建议: 最佳实践建议:假设您的日志文件路径是/your/log/path/**/*.log,建议您轮转后的文件命名为:/your/log/path/**/*.xxx.log。此处的xxx按照用户习惯,一般是指日期,如20240103,但不能含字母。 自定义轮转规则:如果您的日志文件轮转后命名规则不符合上述的最佳实践建议,可能导致轮转文件被重复采集,您可以通过自定义轮转规则来规避此问题。您可以为每条日志采集路径添加自定义轮转规则,基于正则表达式匹配轮转后的文件名,匹配成功的文件名会被识别为日志轮转文件,不会被重复采集。例如您的日志文件为/your/log/path/**/app1.log,轮转后的文件为/your/log/path/**/app1.20240103.biz.log,那么可以配置自定义轮转规则为{basename}\.[0-9-\.]+\.[0-9]+\.biz\.log。 轮转后日志文件不建议压缩 如果您的日志打印速率较高,日志文件会快速轮转,此时轮转后的文件末尾可能会有少量日志还未被采集,ICAgent将通过Linux的inode识别采集文件的唯一性,如果您轮转后的日志文件是压缩文件,则inode会发生变化。由于您的日志文件名和inode都发生变化,ICAgent将无法保证一定会采集到该轮转文件末尾未被采集的少量日志。 例如:假设您轮转后的文件被压缩,文件名为:/your/log/path/**/*.log.xxx.zip,该文件的文件名和inode都发生变化,则ICAgent将无法保证一定会采集到该轮转文件末尾未被采集的少量日志。 父主题: 日志接入
  • 集群节点数量 当CSS集群的构架与机型确定后,集群的节点数主要由业务对性能的要求决定。 表2 节点数量计算方式 类型 性能基线 节点数量计算方式 示例 写入节点 对于挂载云盘的节点,其单核写入性能基线为1MB/s。 对于超高IO型的节点,其单核写入性能基线为1.5MB/s。 业务峰值时的流量/单节点的核数/单核写入性能基线*副本数 业务峰值写入100MB/s,使用16u64g的节点,预计需要100/16/1*2 = 12个节点。 查询节点 相同节点,不同业务场景下的性能差异非常大,单节点的性能基线难以评估。这里以业务平均查询响应时间作为查询的性能基线进行测算。 QPS/{单节点的核数*3/2/平均查询响应时间(s)}*分片数量 查询QPS要求1000,平均查询响应时间100ms,索引规划3个分片,使用16u64g的节点,预计需要1000/{16*3/2/0.1}*3 = 12个节点。 节点数量 / 节点数量= 写入节点数 + 查询节点数 节点数= 写入节点数 + 查询节点数 = 24个节点数。 在同等集群性能的情况下,建议优先选择高配置少节点的集群。例如32C64G*3 节点的集群相比于8C16G*12节点的集群,在集群稳定性和扩容的便捷性上都有一定的优势。因为高配置的集群如果遇到性能瓶颈需要扩容,则只需要横向扩容,即向集群中加入更多同等配置的节点即可;而低配置的集群在扩容节点配置时,则需要纵向扩容。
  • 集群架构 CSS支持读写分离、冷热分离、存算分离、角色分离、跨AZ部署等多种架构。架构适用的场景如下所示: 架构 适用场景 用户价值 读写分离 生产业务,读多写少,数据写入后实时可见性要求低(10s+)。 高并发、低时延 冷热分离 日志业务,冷数据查询性能要求低。 低成本 存算分离 日志业务,冷数据不需要更新,并且冷数据查询性能要求低(10s+);可以和冷热分离结合使用,构建“热-温-冷”3级存储。 低成本 角色分离 集群的规模较大、集群中的索引数量较多或集群可扩展性要求高。 高可用 跨AZ部署 对可用性要求非常高的生产业务,或采用本地盘时。 高可用
  • 操作步骤 订阅增量。在kafka/MQ中新建消费组,订阅增量数据。 存量数据同步。使用Logstash等工具将源端ES集群中的数据迁移到CSS集群中。如果使用Logstash进行数据迁移,可以参考使用Logstash迁移集群数据。 增量数据同步。待存量数据同步完成之后开启增量消费组,利用ES对数据操作的幂等性,等新的消费组追上之前的消费组时,两边的数据就会追平。 关于日志场景,源端ES集群中的数据并不需要迁移,即可跳过存量数据同步的步骤,待增量数据同步完成后,两边持续同步跑一段时间(例如3天或7天),然后直接割接即可。
  • 迁移流程 在泛IOT、新闻、舆情、社交等数据量较大的行业,通常会引入消息中间件(kafka、MQ等)对流量进行削峰填谷,然后借助Flink/Logstash等工具消费数据并进行数据预处理,最终将数据导入到搜索引擎,对外提供搜索服务。 对于这种源端是kafka/MQ的集群,集群迁移流程如图1所示。 图1 源端为Kafka/MQ的集群迁移流程 该迁移方案具有割接方便和通用性好的优点。 割接方便:一旦两个ES集群的数据保持一致后,随时可割接。 通用性好:两边均可同步对客户端的ES进行增删改查操作。
  • 方案架构 关系型数据库(例如MySQL、GaussDB for MySQL等)受限于全文检索和Ad Hoc查询能力,因此会将Elasticsearch作为关系型数据库的补充,以此提升数据库的全文检索能力和高并发的Ad Hoc查询能力。 本章主要介绍,如何将MySQL数据库中的数据同步到云搜索服务CSS,通过CSS实现数据库的全文检索与Ad Hoc查询分析加速。方案架构图如图1所示。 图1 CSS加速数据库的查询分析方案 用户业务数据存储到MySQL。 通过数据复制服务DRS将MySQL中的数据实时同步到CSS。 通过CSS进行全文检索与数据查询分析。
  • 前提条件 已创建好安全模式的CSS集群和MySQL数据库,且两者在同一个VPC与安全组内。 MySQL数据库中已经有待同步的数据。本章以如下表结构和初始数据举例。 MySQL中创建一个学生信息表: CREATE TABLE `student` ( `dsc` varchar(100) COLLATE utf8mb4_general_ci DEFAULT NULL, `age` smallint unsigned DEFAULT NULL, `name` varchar(32) COLLATE utf8mb4_general_ci NOT NULL, `id` int unsigned NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; MySQL中插入3个学生的初始数据: INSERT INTO student (id,name,age,dsc) VALUES ('1','Jack Ma Yun','50','Jack Ma Yun is a Chinese business magnate, investor and philanthropist.'), ('2','will smith','22','also known by his stage name the Fresh Prince, is an American actor, rapper, and producer.'), ('3','James Francis Cameron','68','the director of avatar'); CSS集群中已完成索引创建,与MySQL中表相对应。 本章集群的索引示例如下: PUT student { "settings": { "number_of_replicas": 0, "number_of_shards": 3 }, "mappings": { "properties": { "id": { "type": "keyword" }, "name": { "type": "short" }, "age": { "type": "short" }, "desc": { "type": "text" } } } } 其中的number_of_shards与number_of_replicas需根据具体业务场景进行配置。
  • 方案概述 Elasticsearch集群支持多种连接方式,根据业务使用的编程语言可以自行选择接入方式。针对CSS服务的3种不同安全模式的集群(非安全模式的集群、安全模式+HTTP协议的集群、安全模式+HTTPS协议的集群),不同客户端的支持情况请参见表1。 CSS提供了可视化的Kibana和Cerebro界面用于监控、使用集群。在CSS服务控制台,可以快速接入每个Elasticsearch集群的Kibana和Cerebro。 其他客户端也可以接入并使用Elasticsearch集群,如Curl命令行、Java客户端、Python客户端等形式,亦或是使用Hadoop提供的客户端实现更复杂的应用。Elasticsearch官方提供了的Java客户端,包括Rest High Level Client、Rest Low Level Client和Transport Client。建议使用对应Elasticsearch集群版本的Java客户端,否则可能存在兼容性问题。 表1 不同客户端接入集群的支持情况 客户端 非安全模式的集群 安全模式+HTTP协议的集群 安全模式+HTTPS协议的集群 Kibana 3种安全模式的集群都支持,安全模式的集群登录Kibana时需要输入用户名和密码进行安全认证,接入集群的操作请参见快速访问Elasticsearch集群。 Cerebro 3种安全模式的集群都支持,安全模式的集群登录Cerebro时需要输入用户名和密码进行安全认证,接入集群的操作请参见快速访问Elasticsearch集群。 Curl 3种安全模式的集群都支持,接入命令有差别,具体请参见通过Curl命令行接入集群。 Java(Rest High Level Client) 3种安全模式的集群都支持,接入命令有差别,具体请参见通过Rest High Level Client接入集群。 Java(Rest Low Level Client) 3种安全模式的集群都支持,接入命令有差别,具体请参见通过Rest Low Level Client接入集群。 Java(Transport Client) 只支持非安全模式的集群,具体请参见通过Transport Client接入集群。 不支持 不支持 Java(Spring Boot) 3种安全模式的集群都支持,接入命令有差别,具体请参见通过Spring Boot接入集群。 Python 3种安全模式的集群都支持,接入命令有差别,具体请参见通过Python接入集群。 ES-Hadoop 3种安全模式的集群都支持,接入命令有差别,具体请参见通过ES-Hadoop实现Hive读写Elasticsearch数据。 父主题: 接入集群
  • 方案架构 ELKB(Elasticsearch、Logstash、Kibana、Beats)提供了一整套日志场景解决方案,是目前主流的一种日志系统。其框架如图所示。 图1 统一日志管理平台框架 Beats是一个轻量级日志采集器,包括Filebeat、Metricbeat等。 Logstash用于对日志进行搜集与预处理,支持多种数据源与ETL处理方式。 Elasticsearch是个开源分布式搜索引擎,提供搜集、分析、存储数据等主要功能,CSS云搜索服务可以创建Elasticsearch集群。 Kibana是一个可视化工具,可以基于Kibana进行Web可视化查询,并制作BI报表。 本章以CSS、Filebeat、Logstash和Kibana为例,搭建一个统一日志管理平台。使用Filebeat采集ECS中的日志,发送到Logstash进行数据处理,再存储到CSS中,最后通过Kibana进行日志的可视化查询与分析。 ELKB系统中各组件的版本兼容性请参见 https://www.elastic.co/support/matrix#matrix_compatibility。
  • 步骤四:增量迁移 使用putty登录准备工作中创建的Linux虚拟机。 在Logstash集群管理页面,单击步骤一:创建Logstash集群中创建的集群名称,进入集群的基本信息页面。选择“配置中心”,或者直接单击目标集群操作列的“配置中心”,进入配置中心页面。 选择步骤三:配置Logstash增量迁移任务中所创建的配置文件,单击左上角的“启动”。 根据界面提示,选择“是”启动Logstash服务会立刻开始迁移数据。 此时可以在管道下面看到启动的配置文件。 数据迁移完毕检查数据一致性,使用putty登录linux虚拟机,执行python checkIndices.py 对比数据结果。
  • 约束和限制 Logstash版本约束: CSS 支持5.5.1,6.3.2,6.5.4,7.1.1,7.6.2,7.10.2多个版本,迁移集群尽量保持大版本一致。 对应ES集群是5.x, 6.x 选择logstash版本5.6.16, 对应ES版本是7.X 选择logstash版本7.10.0。 集群迁移过程禁止修改索引,修改索引会导致原数据和目标数据内容不一致。 索引大小小于100G可以使用迁移任务不用单独分析索引,简化分析工作。
  • 准备工作 创建迁移虚拟机。 创建迁移虚拟机,用于迁移源集群的元数据。 创建ECS虚拟机,虚拟机需要创建linux系统,规格选择2U4G。 测试虚拟机和源集群和目标集群保持连通性,执行命令curl http://{ip}:{port}可以测试结果。 IP是源集群和目的集群访问地址,端口默认是9200,如果不是9200使用集群实际端口。 如下示例仅适用于非安全集群。 curl http://10.234.73.128:9200 { "name" : "voc_es_cluster_new-ess-esn-1-1", "cluster_name" : "voc_es_cluster_new", "cluster_uuid" : "1VbP7-39QNOx_R-llXKKtA", "version" : { "number" : "6.5.4", "build_flavor" : "default", "build_type" : "tar", "build_hash" : "d2ef93d", "build_date" : "2018-12-17T21:17:40.758843Z", "build_snapshot" : false, "lucene_version" : "7.5.0", "minimum_wire_compatibility_version" : "5.6.0", "minimum_index_compatibility_version" : "5.0.0" }, "Tagline" : "You Know, for Search" }
  • 步骤一:创建Logstash集群 迁移数据使用Logstash,创建logstash服务需要费用,默认是按需收费,用户迁移完毕数据及时释放Logstash节省费用。 可以基于集群的索引不同创建多个Logstash集群分别配置不同的迁移任务。 登录云搜索服务管理控制台。 在“总览”或者“集群管理”页面,选择“Logstash”,进入Logsash类型集群管理页面。 单击“创建集群”,进入“创建集群”页面。 选择“当前区域”和“可用区”。 指定集群基本信息,选择“集群类型”和“集群版本”,并输入“集群名称”。 表1 基本参数说明 参数 说明 集群类型 选择“Logstash”。 集群版本 当前支持5.6.16、7.10.0。 对应ES集群是5.x, 6.x 选择logstash版本5.6.16, 对应ES版本是7.X 选择logstash版本7.10.0。 集群名称 自定义的集群名称,可输入的字符范围为4~32个字符,只能包含数字、字母、中划线和下划线,且必须以字母开头。 图2 基本信息配置 指定集群的主机规格相关参数。“节点数量”设置为“1”。“节点规格”选择“8U16G”,其余参数保持默认值。 图3 设置主机规格 设置集群的企业项目,保持默认值即可。 单击“下一步,网络配置”,设置集群的网络配置。 表2 参数说明 参数 说明 虚拟私有云 VPC即虚拟私有云,是通过逻辑方式进行网络隔离,提供安全、隔离的网络环境。 选择创建集群需要的VPC,单击“查看虚拟私有云”进入VPC服务查看已创建的VPC名称和ID。如果没有VPC,需要创建一个新的VPC。 说明: 此处您选择的VPC必须包含网段(CIDR),否则集群将无法创建成功。新建的VPC默认包含网段(CIDR)。 子网 通过子网提供与其他网络隔离的、可以独享的网络资源,以提高网络安全。 选择创建集群需要的子网,可进入VPC服务查看VPC下已创建的子网名称和ID。 安全组 安全组是一个逻辑上的分组,为同一个VPC内具有相同安全保护需求并相互信任的弹性云服务器提供访问策略。单击“查看安全组”可了解安全组详情。 说明: 请确保安全组的“端口范围/ICMP类型”为“Any”或者包含端口9200的端口范围。 图4 设置网络规格 单击“下一步:高级配置”,高级配置可选择默认配置和自定义。此样例保持默认配置即可。 单击“下一步:确认配置”,确认完成后单击“立即创建”开始创建集群。 单击“返回集群列表”,系统将跳转到“集群管理”页面。您创建的集群将展现在集群列表中,且集群状态为“创建中”,创建成功后集群状态会变为“可用”。
  • 连接非安全集群 连接非安全集群,示例代码如下: package main import ( "github.com/elastic/go-elasticsearch/v7" "log" ) func main() { cfg := elasticsearch.Config{ Addresses: []string{ "http://HOST:9200/", }, } es, _ := elasticsearch.NewClient(cfg) log.Println(es.Info()) }
  • 连接安全集群 连接未开启https的安全集群,示例如下: package main import ( "github.com/elastic/go-elasticsearch/v7" "log" ) func main() { cfg := elasticsearch.Config{ Addresses: []string{ "http://HOST:9200/", }, Username: "USERNAME", Password: "PASSWORD", } es, _ := elasticsearch.NewClient(cfg) log.Println(es.Info()) } 连接开启https的安全集群,不使用证书,示例代码如下: package main import ( "crypto/tls" "github.com/elastic/go-elasticsearch/v7" "log" "net/http" ) func main() { cfg := elasticsearch.Config{ Addresses: []string{ "https://HOST:9200/", }, Username: "USERNAME", Password: "PASSWORD", Transport: &http.Transport{ TLSClientConfig: &tls.Config{ InsecureSkipVerify: true, }, }, } es, _ := elasticsearch.NewClient(cfg) log.Println(es.Info()) } 连接开启https的安全集群,使用证书,示例代码如下: package main import ( "crypto/tls" "crypto/x509" "flag" "github.com/elastic/go-elasticsearch/v7" "io/ioutil" "log" "net" "net/http" "time" ) func main() { insecure := flag.Bool("insecure-ssl", false, "Accept/Ignore all server SSL certificates") flag.Parse() // Get the SystemCertPool, continue with an empty pool on error rootCAs, _ := x509.SystemCertPool() if rootCAs == nil { rootCAs = x509.NewCertPool() } // Read in the cert file certs, err := ioutil.ReadFile("/tmp/CloudSearchService.cer") if err != nil { log.Fatalf("Failed to append %q to RootCAs: %v", "xxx", err) } // Append our cert to the system pool if ok := rootCAs.AppendCertsFromPEM(certs); !ok { log.Println("No certs appended, using system certs only") } config := elasticsearch.Config{ Addresses: []string{ "https://HOST:9200/", }, Username: "USERNAME", Password: "PASSWORD", Transport: &http.Transport{ MaxIdleConnsPerHost: 10, ResponseHeaderTimeout: time.Second, DialContext: (&net.Dialer{ Timeout: 30 * time.Second, KeepAlive: 30 * time.Second, }).DialContext, TLSClientConfig: &tls.Config{ InsecureSkipVerify: *insecure, RootCAs: rootCAs, }, }, } es, _ := elasticsearch.NewClient(config) log.Println(elasticsearch.Version) log.Println(es.Info()) }
  • 运行代码 根据集群类型将以上适配的代码写入到EsTest.gc文件并存放到一个单独的目录,在该目录执行以下命令: go env -w GO111MODULE=on go env -w GOPROXY=https://repo.huaweicloud.com/repository/goproxy/ go env -w GONOSUMDB=* go mod init test go mod tidy go run EsTest.go
  • CSS集群如何清理缓存? 清理fielddata 进行聚合和排序时,会使用fielddata数据结构,会占用较大内存。 在Kibana执行如下命令,查看索引的fielddata占用情况。 DELETE /_search/scroll { "scroll_id" : "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAD4WYm9laVYtZndUQlNsdDcwakFMNjU1QQ==" } 当fielddata占用内存过高时,可以执行如下命令清理fielddata。 POST /test/_cache/clear?fielddata=true “test”为fielddata占用内存较高的索引名称。 清理segment 每个segment的FST结构都会被加载到内存中,并且这些内存是不会被垃圾回收的。因此如果索引的segment数量过大,会导致内存使用率较高,建议定期进行清理。 在Kibana执行如下命令,查看各节点的segment数量和占用内存大小。 GET /_cat/nodes?v&h=segments.count,segments.memory&s=segments.memory:desc 如果segment占用内存过高时,可以通过删除部分不用的索引、关闭索引或定期合并不再更新的索引等方式释放内存。 清理cache 在Kibana执行如下命令清理cache。 POST _cache/clear 父主题: 开源搜索引擎咨询
  • Elasticsearch 7.x集群如何在index下创建type? 在Elasticsearch 7.x版本中,去掉了type概念,在7.x及以后的版本中,index都不再支持创建type。 如果需要强制使用,可以在命令中添加“include_type_name=true”强制使用type类型。 PUT _template/urldialinfo_template?include_type_name=true 执行命令后,界面会有提示: “#! Deprecation: [types removal] Specifying include_type_name in put index template requests is deprecated. The parameter will be removed in the next major version. ” 父主题: 开源搜索引擎咨询
共100000条