云服务器内容精选

  • 通过索引生命周期管理实现存算分离 登录 云搜索服务 管理控制台。 在左侧导航栏,选择对应的集群类型,进入集群列表页面。 在集群列表页面中,单击集群操作列的“Kibana”登录OpenSearch Dashboards页面。 在OpenSearch Dashboards的左侧导航中选择“Dev Tools”,进入命令执行页面。 创建生命周期策略“hot_warm_policy”。 策略定义:当索引创建3天后,自动调用冻结索引API将数据转储到OBS;索引创建7天后,删除该索引。 PUT _plugins/_ism/policies/hot_warm_policy { "policy": { "description": "hot warm delete workflow", "error_notification": null, "default_state": "hot", "states": [ { "name": "hot", "actions": [], "transitions": [ { "state_name": "warm", "conditions": { "min_index_age": "3d" } } ] }, { "name": "warm", "actions": [ { "freeze_low_cost": {} } ], "transitions": [ { "state_name": "delete", "conditions": { "min_index_age": "7d" } } ] }, { "name": "delete", "actions": [ { "delete": {} } ], "transitions": [] } ], "ism_template": { "index_patterns": [ "data*" ], "priority": 100 } } } 新建索引模板“template_hot_warm”。 模板定义:新建的所有“data”开头的索引会自动关联上生命周期策略“hot_warm_policy”。 PUT _template/template_hot_warm { "index_patterns": "data*", "settings": { "number_of_replicas": 5, "number_of_shards": 1, "index.plugins.index_state_management.policy_id": "hot_warm_policy" }, "mappings": { "properties": { "name": { "type": "text" } } } } 表1 参数说明 参数 说明 number_of_shards 索引分片数 number_of_replicas 索引分片副本数 index.plugins.index_state_management.policy_id 生命周期的策略名 新建一个索引“data-2022-06-06”,该索引会自动应用索引模板“template_hot_warm”,并通过索引模板的配置与生命周期策略“hot_warm_policy”相关联,实现索引在创建3天后冻结,7天后删除。 POST data-2022-06-06/_bulk {"index":{}} {"name":"name1"} {"index":{}} {"name":"name2"} {"index":{}} {"name":"name3"} {"index":{}} {"name":"name4"} {"index":{}} {"name":"name5"} {"index":{}} {"name":"name6"} 查询数据,确认数据是否实现自动存算分离。 在索引创建三天后查看冻结的索引: GET _cat/freeze_indices?s=i&v 正常情况下会显示3天以前的索引已经被冻结: health status index uuid pri rep docs.count docs.deleted store.size pri.store.size green open data-2022-06-06 x8ab5NX6T3Ox_xoGUanogQ 1 1 6 0 7.6kb 3.8kb 在索引创建7天后,查看索引情况,正常情况下7天以前的索引已经被删除。
  • 约束限制 备份与恢复索引功能上线之前(即2018年3月10日之前)创建的集群,无法创建快照。 集群快照会导致CPU、磁盘IO上升等影响,建议在业务低峰期进行操作。 当集群处于“不可用”状态时,快照功能中,除了恢复快照功能外,其他快照信息或功能只能查看,无法进行编辑。 备份与恢复过程中,支持集群扩容(如果是恢复至本集群,则本集群不支持扩容)、访问Kibana、查看监控、删除其他快照的操作。不支持重启此集群、删除此集群、删除正在创建或恢复的快照、再次创建或恢复快照的操作。当此集群正在进行创建快照或者恢复快照过程中,同时的自动创建快照任务将被取消。 快照在恢复过程中不可查询集群数据。 当两个集群的shard不一样时,则无法恢复集群数据。 用于恢复的目标集群版本不得低于源集群版本,一般保持版本一致即可。
  • 通过索引生命周期管理实现存算分离 登录 云搜索 服务管理控制台。 在左侧导航栏,选择对应的集群类型,进入集群列表页面。 在集群列表页面中,单击集群操作列的“Kibana”登录Kibana页面。 在Kibana的左侧导航中选择“Dev Tools”,进入命令执行页面。 创建生命周期策略“hot_warm_policy”。 策略定义:当索引创建3天后,自动调用冻结索引API将数据转储到OBS;索引创建7天后,删除该索引。 PUT _opendistro/_ism/policies/hot_warm_policy { "policy": { "description": "hot warm delete workflow", "error_notification": null, "default_state": "hot", "states": [ { "name": "hot", "actions": [], "transitions": [ { "state_name": "warm", "conditions": { "min_index_age": "3d" } } ] }, { "name": "warm", "actions": [ { "freeze_low_cost": {} } ], "transitions": [ { "state_name": "delete", "conditions": { "min_index_age": "7d" } } ] }, { "name": "delete", "actions": [ { "delete": {} } ], "transitions": [] } ] } } 新建索引模板“template_hot_warm”。 模板定义:新建的所有“data”开头的索引会自动关联上生命周期策略“hot_warm_policy”。 PUT _template/template_hot_warm { "index_patterns": "data*", "settings": { "number_of_replicas": 5, "number_of_shards": 1, "opendistro.index_state_management.policy_id": "hot_warm_policy" }, "mappings": { "properties": { "name": { "type": "text" } } } } 表1 参数说明 参数 说明 number_of_shards 索引分片数 number_of_replicas 索引分片副本数 opendistro.index_state_management.policy_id 生命周期的策略名 新建一个索引“data-2022-06-06”,该索引会自动应用索引模板“template_hot_warm”,并通过索引模板的配置与生命周期策略“hot_warm_policy”相关联,实现索引在创建3天后冻结,7天后删除。 POST data-2022-06-06/_bulk {"index":{}} {"name":"name1"} {"index":{}} {"name":"name2"} {"index":{}} {"name":"name3"} {"index":{}} {"name":"name4"} {"index":{}} {"name":"name5"} {"index":{}} {"name":"name6"} 查询数据,确认数据是否实现自动存算分离。 在索引创建三天后查看冻结的索引: GET _cat/freeze_indices?s=i&v 正常情况下会显示3天以前的索引已经被冻结: health status index uuid pri rep docs.count docs.deleted store.size pri.store.size green open data-2022-06-06 x8ab5NX6T3Ox_xoGUanogQ 1 1 6 0 7.6kb 3.8kb 在索引创建7天后,查看索引情况,正常情况下7天以前的索引已经被删除。
  • 节点监控指标列表 监控的指标ID、指标名称、指标含义以及取值范围参见表2。 监控的测量对象: CSS 集群 - 云服务节点 监控的监控周期(原始指标):1分钟 累计值:从节点启动时开始叠加数值,当节点重启后清零重新累计。 表2 云搜索服务节点支持的监控指标 指标ID 指标名称 指标含义 取值范围 jvm_heap_usage JVM堆使用率 节点JVM堆内存使用率。 单位:百分比 0-100% cpu_usage CPU利用率 CPU利用率。 单位:百分比 0-100% disk_util 磁盘使用率 统计测量对象的磁盘使用率。 单位:百分比。 0-100% load_average 节点Load值 操作系统中1分钟平均排队任务数。 ≥ 0 open_file_descriptors 已打开的文件描述符数 节点已打开的文件描述符数。 ≥ 0 max_file_descriptors 最大允许的文件描述符数 最大允许的文件描述符数。 ≥ 0 thread_pool_write_queue Write队列中总排队任务数 写入线程池中的排队任务数。 ≥ 0 thread_pool_search_queue Search队列中总排队任务数 搜索线程池中的排队任务数。 ≥ 0 thread_pool_force_merge_queue ForceMerge队列中总排队任务数 强制合并线程池中的排队任务数。 ≥ 0 thread_pool_write_rejected Write队列中总的已拒绝任务数 写入线程池中的已拒绝任务数。 ≥ 0 thread_pool_search_rejected Search队列中总的已拒绝任务数 搜索线程池中的已拒绝任务数。 ≥ 0 thread_pool_force_merge_rejected ForceMerge队列中总的已拒绝任务数 强制合并线程池中的已拒绝任务数。 ≥ 0 thread_pool_write_threads Write线程池总大小 写入线程池的大小。 ≥ 0 thread_pool_search_threads Search线程池总大小 搜索线程池的大小。 ≥ 0 thread_pool_force_merge_threads ForceMerge线程池总大小 强制合并线程池的大小。 ≥ 0 thread_pool_flush_queue Flush队列中总排队任务数 Flush线程池中的排队任务数。 ≥ 0 thread_pool_flush_rejected Flush队列中总的已拒绝任务数 Flush线程池中的已拒绝任务数。 ≥ 0 thread_pool_flush_threads Flush线程池总大小 Flush线程池的大小。 ≥ 0 thread_pool_generic_queue Generic队列中总排队任务数 Generic线程池中的排队任务数。 ≥ 0 thread_pool_generic_rejected Generic队列中总的已拒绝任务数 Generic线程池中的已拒绝任务数。 ≥ 0 thread_pool_generic_threads Generic线程池总大小 Generic线程池的大小。 ≥ 0 thread_pool_management_queue Management队列中总排队任务数 Management线程池中的排队任务数。 ≥ 0 thread_pool_management_rejected Management队列中总的已拒绝任务数 Management线程池中的已拒绝任务数。 ≥ 0 thread_pool_management_threads Management线程池总大小 Management线程池的大小。 ≥ 0 thread_pool_refresh_queue Refresh队列中总排队任务数 Refresh线程池中的排队任务数。 ≥ 0 thread_pool_refresh_rejected Refresh队列中总的已拒绝任务数 Refresh线程池中的已拒绝任务数。 ≥ 0 thread_pool_refresh_threads Refresh线程池总大小 Refresh线程池的大小。 ≥ 0 thread_pool_obs_searcher_queue OBS Searcher队列中总排队任务数 OBS Searcher线程池中的排队任务数。 ≥ 0 thread_pool_obs_searcher_rejected OBS Searcher队列中总的已拒绝任务数 OBS Searcher线程池中的已拒绝任务数。 ≥ 0 thread_pool_obs_searcher_threads OBS Searcher线程池总大小 OBS Searcher线程池的大小。 ≥ 0 thread_pool_obs_queue OBS队列中总排队任务数 OBS线程池中的排队任务数。 ≥ 0 thread_pool_obs_rejected OBS队列中总的已拒绝任务数 OBS线程池中的已拒绝任务数。 ≥ 0 thread_pool_obs_threads OBS线程池总大小 OBS线程池的大小。 ≥ 0 thread_pool_obs_upload_queue OBS Upload队列中总排队任务数 OBS Upload线程池中的排队任务数。 ≥ 0 thread_pool_obs_upload_rejected OBS Upload队列中总的已拒绝任务数 OBS Upload线程池中的已拒绝任务数。 ≥ 0 thread_pool_obs_upload_threads OBS Upload线程池总大小 OBS Upload线程池的大小。 ≥ 0 thread_pool_obs_download_queue OBS Download队列中总排队任务数 OBS Download线程池中的排队任务数。 ≥ 0 thread_pool_obs_download_rejected OBS Download队列中总的已拒绝任务数 OBS Download线程池中的已拒绝任务数。 ≥ 0 thread_pool_obs_download_threads OBS Download线程池总大小 OBS Download线程池的大小。 ≥ 0 free_fs_size 文件系统可用大小 CS S集群的文件系统可用大小。 单位:byte ≥ 0 bytes total_fs_size 文件系统总大小 CSS集群的文件系统总大小。 单位:byte ≥ 0 bytes jvm_old_gc_count JVM老年代总GC次数 “老年代”垃圾回收的运行次数。 ≥ 0 jvm_old_gc_time JVM老年代总GC时间 执行“老年代”垃圾回收所花费的时间。 单位:ms ≥ 0 ms jvm_young_gc_count JVM年轻代总GC次数 “年轻代”垃圾回收的运行次数。 ≥ 0 jvm_young_gc_time JVM年轻代GC时间 执行“年轻代”垃圾回收所花费的时间。 单位:ms ≥ 0 ms mem_free_in_bytes 可用内存空间 节点未使用的内存容量。 单位:byte ≥ 0 bytes mem_free_percent 可用内存比例 节点未使用的内存比例。 ≥ 0 mem_used_in_bytes 已用内存空间 节点已使用的内存容量。 单位:byte ≥ 0 bytes current_opened_http_count 当前已打开HTTP连接数 节点当前打开的HTTP连接数。 ≥ 0 total_opened_http_count 全部打开的HTTP连接数 节点全部打开的HTTP连接数。 ≥ 0 disk_read_requests_rate 磁盘读IOPS CSS集群节点的磁盘每秒读取数据的请求总次数。 ≥ 0 disk_write_requests_rate 磁盘写IOPS CSS集群节点的磁盘每秒写数据的请求总次数。 ≥ 0 disk_read_bytes_rate 磁盘读带宽 CSS集群节点的磁盘每秒读出数据量。 ≥ 0 disk_write_bytes_rate 磁盘写带宽 CSS集群节点的磁盘每秒写入数据量。 ≥ 0 shards_count 分片数量 CSS集群节点的分片数量 ≥ 0
  • 集群监控指标列表 监控的指标ID、指标名称、指标含义以及取值范围参见表1。 监控的测量对象:CSS集群(本文介绍的是Elasticsearch集群和OpenSearch集群的监控指标列表) 监控的监控周期(原始指标):1分钟 累计值:从节点启动时开始叠加数值,当节点重启后清零重新累计。 表1 云搜索服务支持的监控指标 指标ID 指标名称 指标含义 取值范围 status 集群健康状态 该指标用于统计测量监控对象的状态。 0,1,2,3 0:集群是100%可用的。 1:数据是完整的,部分副本缺失。高可用性在某种程度上弱化,存在风险,请及时关注集群情况。 2:数据缺失,集群使用时将出现异常。 3:没有获取到集群状态。 disk_util 磁盘使用率 该指标用于统计测量对象的磁盘使用率。 单位:百分比 0-100% max_jvm_heap_usage 最大JVM堆使用率 CSS集群中各个节点的JVM堆使用率的最大值。 单位:百分比。 0-100% max_jvm_young_gc_time 最大JVM Young GC耗时 CSS集群中各个节点的JVM Young GC耗时累计值的最大值。 单位:ms ≥ 0 ms max_jvm_young_gc_count 最大JVM Young GC次数 CSS集群中各个节点的JVM Young GC次数累计值的最大值。 ≥ 0 max_jvm_old_gc_time 最大JVM Old GC耗时 CSS集群中各个节点的JVM Old GC耗时累计值的最大值。 单位:ms ≥ 0 ms max_jvm_old_gc_count 最大JVM Old GC次数 CSS集群中各个节点的JVM Old GC次数累计值的最大值。 ≥ 0 total_fs_size 文件系统总大小 CSS集群的文件系统总大小。 单位:byte ≥ 0 bytes free_fs_size 文件系统可用大小 CSS集群的文件系统可用大小。 单位:byte ≥ 0 bytes max_cpu_usage 最大CPU利用率 CSS集群中各个节点的CPU利用率的最大值。 单位:百分比 0-100% max_cpu_time_of_jvm_process 最大JVM进程使用的CPU时间 CSS集群中各个节点JVM进程使用CPU的时间累计值的最大值。 单位:ms ≥ 0 ms max_virtual_memory_size_of_jvm_process 最大JVM进程使用的虚拟内存大小 CSS集群中各个节点JVM进程可使用的虚拟内存大小的最大值。 单位:byte ≥ 0 bytes max_current_opened_http_count 最大当前打开的HTTP连接数 CSS集群中各个节点打开且尚未关闭的HTTP连接数的最大值。 ≥ 0 max_total_opened_http_count 最大全部打开的HTTP连接数 CSS集群中各个节点打开过的HTTP连接数累计值的最大值。 ≥ 0 indices_count 索引数量 CSS集群的索引数量。 ≥ 0 total_shards_count 分片数量 CSS集群的分片数量。 ≥ 0 primary_shards_count 主分片数量 CSS集群的主分片数量。 ≥ 0 docs_count 文档数量 CSS集群的文档数量。 ≥ 0 docs_deleted_count 被删除的文档数量 CSS集群的被删除的文档数量。 ≥ 0 nodes_count 节点数量 CSS集群的节点数量。 ≥ 0 data_nodes_count 数据节点数量 CSS集群的数据节点数量。 ≥ 0 coordinating_nodes_count 协调节点数量 CSS集群的协调节点数量。 ≥ 0 master_nodes_count Master节点数量 CSS集群的Master节点数量。 ≥ 0 ingest_nodes_count Client节点数量 CSS集群的Client节点数量。 ≥ 0 max_load_average 最大节点Load值 CSS集群中各个节点在操作系统中1分钟平均排队任务数的最大值。 ≥ 0 avg_cpu_usage 平均CPU使用率 CSS集群中各节点CPU利用率的平均值。 单位:百分比 0-100% avg_load_average 平均节点Load值 CSS集群中各节点在操作系统中1分钟平均排队任务数的平均值。 ≥ 0 avg_jvm_heap_usage 平均JVM堆使用率 CSS集群中各节点JVM堆内存使用率的平均值。 单位:百分比 0-100% max_open_file_descriptors 已打开的最大文件描述符数 CSS集群中各个节点已打开的文件描述符数的最大值。 ≥ 0 avg_open_file_descriptors 已打开的平均文件描述符数 CSS集群中各节点已打开的文件描述符数的平均值。 ≥ 0 sum_max_file_descriptors 最大允许的文件描述符数 CSS集群中各节点最大允许的文件描述符数之和。 ≥ 0 sum_open_file_descriptors 已打开的文件描述符数 CSS集群中各节点已打开的文件描述符数之和。 ≥ 0 sum_thread_pool_write_queue Write队列中总排队任务数 写入线程池中的排队任务数。 ≥ 0 sum_thread_pool_search_queue Search队列中总排队任务数 CSS集群中各节点在搜索线程池中的排队任务数之和。 ≥ 0 sum_thread_pool_force_merge_queue ForceMerge队列中总排队任务数 CSS集群中各节点在强制合并线程池中的排队任务数之和。 ≥ 0 sum_thread_pool_write_rejected Write队列中总的已拒绝任务数 CSS集群中各节点在写入线程池中的已拒绝任务数之和。 ≥ 0 sum_thread_pool_search_rejected Search队列中总的已拒绝任务数 CSS集群中各节点在搜索线程池中的已拒绝任务数之和。 ≥ 0 sum_thread_pool_force_merge_rejected Forcemerge队列中总的已拒绝任务数 CSS集群中各节点在强制合并线程池中的已拒绝任务数之和。 ≥ 0 max_thread_pool_search_queue Search队列中最大排队任务数 CSS集群中各个节点在搜索线程池中的排队任务数的最大值。 ≥ 0 max_thread_pool_force_merge_queue ForceMerge队列中最大排队任务数 CSS集群中各个节点在强制合并线程池中的排队任务数的最大值。 ≥ 0 sum_thread_pool_write_threads Write线程池总大小 CSS集群中各节点写入线程池的大小之和。 ≥ 0 sum_thread_pool_search_threads Search线程池总大小 CSS集群中各节点搜索线程池的大小之和。 ≥ 0 sum_thread_pool_force_merge_threads ForceMerge线程池总大小 CSS集群中各节点强制合并线程池的大小之和。 ≥ 0 avg_thread_pool_write_queue Write队列中平均排队任务数 CSS集群中各节点在写入线程池中的排队任务数的平均值。 ≥ 0 avg_thread_pool_search_queue Search队列中平均排队任务数 CSS集群中各节点在搜索线程池中的排队任务数的平均值。 ≥ 0 avg_thread_pool_force_merge_queue ForceMerge队列中平均排队任务数 CSS集群中各节点在强制合并线程池中的排队任务数的平均值。 ≥ 0 avg_thread_pool_search_threads Search线程池平均大小 CSS集群中各节点搜索线程池的大小的平均值。 ≥ 0 avg_thread_pool_write_threads Write线程池平均大小 CSS集群中各节点写入线程池的大小的平均值。 ≥ 0 avg_thread_pool_force_merge_threads ForceMerge线程池平均大小 CSS集群中各节点强制合并线程池的大小的平均值。 ≥ 0 avg_thread_pool_write_rejected Write队列中平均已拒绝任务数 CSS集群中各节点写入线程池中的已拒绝任务数的平均值。 ≥ 0 sum_thread_pool_flush_queue Flush队列中总排队任务数 CSS集群中各个节点在Flush线程池中的排队任务数之和。 ≥ 0 sum_thread_pool_flush_rejected Flush队列中总的已拒绝任务数 CSS集群中各节点在Flush线程池中的已拒绝任务数之和。 ≥ 0 max_thread_pool_flush_queue Flush队列中最大排队任务数 CSS集群中各个节点在Flush线程池中的排队任务数的最大值。 ≥ 0 sum_thread_pool_flush_threads Flush线程池总大小 CSS集群中各节点Flush线程池的大小之和。 ≥ 0 avg_thread_pool_flush_queue Flush队列中平均排队任务数 CSS集群中各节点在Flush线程池中的排队任务数的平均值。 ≥ 0 avg_thread_pool_flush_threads Flush线程池平均大小 CSS集群中各节点在Flush线程池中的排队任务数的平均值。 ≥ 0 sum_thread_pool_generic_queue Generic队列中总排队任务数 CSS集群中各个节点在Generic线程池中的排队任务数之和。 ≥ 0 sum_thread_pool_generic_rejecte Generic队列中总的已拒绝任务数 CSS集群中各节点在Generic线程池中的已拒绝任务数之和。 ≥ 0 max_thread_pool_generic_queue Generic队列中最大排队任务数 CSS集群中各个节点在Generic线程池中的排队任务数的最大值。 ≥ 0 sum_thread_pool_generic_threads Generic线程池总大小 CSS集群中各节点Generic线程池的大小之和。 ≥ 0 avg_thread_pool_generic_queue Generic队列中平均排队任务数 CSS集群中各节点在Generic线程池中的排队任务数的平均值。 ≥ 0 avg_thread_pool_generic_threads Generic线程池平均大小 CSS集群中各节点在Generic线程池中的排队任务数的平均值。 ≥ 0 sum_thread_pool_management_queue Management队列中总排队任务数 CSS集群中各个节点在Management线程池中的排队任务数之和。 ≥ 0 sum_thread_pool_management_rejected Management队列中总的已拒绝任务数 CSS集群中各节点在Management线程池中的已拒绝任务数之和。 ≥ 0 max_thread_pool_management_queue Management队列中最大排队任务数 CSS集群中各个节点在Management线程池中的排队任务数的最大值。 ≥ 0 sum_thread_pool_management_threads Management线程池总大小 CSS集群中各节点Management线程池的大小之和。 ≥ 0 avg_thread_pool_management_queue Management队列中平均排队任务数 CSS集群中各节点在Management线程池中的排队任务数的平均值。 ≥ 0 avg_thread_pool_management_threads Management线程池平均大小 CSS集群中各节点在Management线程池中的排队任务数的平均值。 ≥ 0 sum_thread_pool_refresh_queue Refresh队列中总排队任务数 CSS集群中各个节点在Refresh线程池中的排队任务数之和。 ≥ 0 sum_thread_pool_refresh_rejected Refresh队列中总的已拒绝任务数 CSS集群中各节点在Refresh线程池中的已拒绝任务数之和。 ≥ 0 max_thread_pool_refresh_queue Refresh队列中最大排队任务数 CSS集群中各个节点在Refresh线程池中的排队任务数的最大值。 ≥ 0 sum_thread_pool_refresh_threads Refresh线程池总大小 CSS集群中各节点Refresh线程池的大小之和。 ≥ 0 avg_thread_pool_refresh_queue Refresh队列中平均排队任务数 CSS集群中各节点在Refresh线程池中的排队任务数的平均值。 ≥ 0 avg_thread_pool_refresh_threads Refresh线程池平均大小 CSS集群中各节点在Refresh线程池中的排队任务数的平均值。 ≥ 0 sum_thread_pool_obs_searcher_queue OBS Searcher队列中总排队任务数 CSS集群中各个节点在OBS Searcher线程池中的排队任务数之和。 ≥ 0 sum_thread_pool_obs_searcher_rejected OBS Searcher队列中总的已拒绝任务数 CSS集群中各节点在OBS Searcher线程池中的已拒绝任务数之和。 ≥ 0 max_thread_pool_obs_searcher_queue OBS Searcher队列中最大排队任务数 CSS集群中各个节点在OBS Searcher线程池中的排队任务数的最大值。 ≥ 0 sum_thread_pool_obs_searcher_threads OBS Searcher线程池总大小 CSS集群中各节点OBS Searcher线程池的大小之和。 ≥ 0 avg_thread_pool_obs_searcher_queue OBS Searcher队列中平均排队任务数 CSS集群中各节点在OBS Searcher线程池中的排队任务数的平均值。 ≥ 0 avg_thread_pool_obs_searcher_threads OBS Searcher线程池平均大小 CSS集群中各节点在OBS Searcher线程池中的排队任务数的平均值。 ≥ 0 sum_thread_pool_obs_queue OBS队列中总排队任务数 CSS集群中各个节点在OBS线程池中的排队任务数之和。 ≥ 0 sum_thread_pool_obs_rejected OBS队列中总的已拒绝任务数 CSS集群中各节点在OBS线程池中的已拒绝任务数之和。 ≥ 0 max_thread_pool_obs_queue OBS队列中最大排队任务数 CSS集群中各个节点在OBS线程池中的排队任务数的最大值。 ≥ 0 sum_thread_pool_obs_threads OBS线程池总大小 CSS集群中各节点OBS线程池的大小之和。 ≥ 0 avg_thread_pool_obs_queue OBS队列中平均排队任务数 CSS集群中各节点在OBS线程池中的排队任务数的平均值。 ≥ 0 avg_thread_pool_obs_threads OBS线程池平均大小 CSS集群中各节点在OBS线程池中的排队任务数的平均值。 ≥ 0 sum_thread_pool_obs_upload_queue OBS Upload队列中总排队任务数 CSS集群中各个节点在OBS Upload线程池中的排队任务数之和。 ≥ 0 sum_thread_pool_obs_upload_rejected OBS Upload队列中总的已拒绝任务数 CSS集群中各节点在OBS Upload线程池中的已拒绝任务数之和。 ≥ 0 max_thread_pool_obs_upload_queue OBS Upload队列中最大排队任务数 CSS集群中各个节点在OBS Upload线程池中的排队任务数的最大值。 ≥ 0 sum_thread_pool_obs_upload_threads OBS Upload线程池总大小 CSS集群中各节点OBS Upload线程池的大小之和。 ≥ 0 avg_thread_pool_obs_upload_queue OBS Upload队列中平均排队任务数 CSS集群中各节点在OBS Upload线程池中的排队任务数的平均值。 ≥ 0 avg_thread_pool_obs_upload_threads OBS Upload线程池平均大小 CSS集群中各节点在OBS Upload线程池中的排队任务数的平均值。 ≥ 0 sum_thread_pool_obs_download_queue OBS Download队列中总排队任务数 CSS集群中各个节点在OBS Download线程池中的排队任务数之和。 ≥ 0 sum_thread_pool_obs_download_rejected OBS Download队列中总的已拒绝任务数 CSS集群中各节点在OBS Download线程池中的已拒绝任务数之和。 ≥ 0 max_thread_pool_obs_download_queue OBS Download队列中最大排队任务数 CSS集群中各个节点在OBS Download线程池中的排队任务数的最大值。 ≥ 0 sum_thread_pool_obs_download_threads OBS Download线程池总大小 CSS集群中各节点OBS Download线程池的大小之和。 ≥ 0 avg_thread_pool_obs_download_queue OBS Download队列中平均排队任务数 CSS集群中各节点在OBS Download线程池中的排队任务数的平均值。 ≥ 0 avg_thread_pool_obs_download_threads OBS Download线程池平均大小 CSS集群中各节点在OBS Download线程池中的排队任务数的平均值。 ≥ 0 min_free_fs_size 最小可用存储空间 CSS集群中各个节点可用存储空间的最小值。 单位:byte ≥ 0 bytes avg_jvm_old_gc_count JVM老年代平均GC次数 CSS集群中各个节点“老年代”垃圾回收的运行次数的累计值的平均值。 ≥ 0 avg_jvm_old_gc_time JVM老年代平均GC时间 CSS集群中各个节点执行“老年代”垃圾回收所花费的时间累计值的平均值。 单位:ms ≥ 0 ms avg_jvm_young_gc_count JVM年轻代平均GC次数 CSS集群中各个节点“年轻代”垃圾回收的运行次数的累计值的平均值。 ≥ 0 avg_jvm_young_gc_time JVM年轻代平均GC时间 CSS集群中各个节点执行“年轻代”垃圾回收所花费的时间累计值的平均值。 单位:ms ≥ 0 ms avg_max_file_descriptors 最大允许的文件描述符数-平均值 CSS集群中各节点最大允许的文件描述符数的平均值。 ≥ 0 avg_mem_free_in_bytes 平均可用内存空间 CSS集群中各节点未使用的内存容量的平均值。 单位:byte ≥ 0 bytes avg_mem_free_percent 平均可用内存比例 CSS集群中各节点未使用的内存比例的平均值。 单位:百分比 0-100% avg_mem_used_in_bytes 平均已用内存空间 CSS集群中各节点已使用的内存容量的平均值。 单位:byte ≥ 0 bytes avg_mem_used_percent 平均已用内存比例 CSS集群中各节点已使用的内存比例的平均值。 单位:百分比 0-100% max_mem_free_in_bytes 最大可用内存空间 CSS集群中各个节点未使用的内存容量的最大值。 单位:byte ≥ 0 bytes max_mem_free_percent 最大可用内存比例 CSS集群中各个节点未使用的内存比例的最大值。 单位:百分比 0-100% max_mem_used_in_bytes 最大已用内存空间 CSS集群中各个节点已使用的内存容量的最大值。 单位:byte ≥ 0 bytes max_mem_used_percent 最大已用内存比例 CSS集群中各个节点已使用的内存比例的最大值。 单位:百分比 0-100% sum_jvm_old_gc_count JVM老年代总GC次数 CSS集群中各个节点“老年代”垃圾回收的运行次数的累计值之和。 ≥ 0 sum_jvm_old_gc_time JVM老年代总GC时间 CSS集群中各个节点执行“老年代”垃圾回收所花费的时间累计值之和。 单位:ms ≥ 0ms sum_jvm_young_gc_count JVM年轻代总GC次数 CSS集群中各个节点“年轻代”垃圾回收的运行次数的累计值之和。 ≥ 0 sum_jvm_young_gc_time JVM年轻代总GC时间 CSS集群中各个节点执行“年轻代”垃圾回收所花费的时间累计值之和。 单位:ms ≥ 0 ms sum_current_opened_http_count 当前已打开HTTP连接数 CSS集群中各个节点打开且尚未关闭的HTTP连接数之和。 ≥ 0 sum_total_opened_http_count 历史已打开HTTP连接数 CSS集群中各个节点打开过的HTTP连接数累计值之和。 ≥ 0 IndexingLatency 平均索引延迟 分片完成索引操作所需的平均时间。 单位:ms ≥ 0 ms IndexingRate 平均索引速率 入库TPS,集群每秒平均索引操作数。 ≥ 0 SearchLatency 平均查询延迟 分片完成搜索操作所需的平均时间。 单位:ms。 ≥ 0 ms SearchRate 平均查询速率 查询QPS,集群每秒平均查询操作数。 ≥ 0 task_max_running_time 最大Task运行时长 该指标为集群运行的所有task中,运行时长最长的task的耗时 ≥ 0 ms number_of_pending_tasks Pending Task排队任务数 CSS集群中待Master处理的task的排队任务数。 ≥ 0 sum_disk_read_requests_rate 磁盘读总IOPS CSS集群所有节点的磁盘每秒读取数据的请求总次数。 ≥ 0 sum_disk_write_requests_rate 磁盘写总IOPS CSS集群所有节点的磁盘每秒写数据的请求总次数。 ≥ 0 sum_disk_read_bytes_rate 磁盘读总带宽 CSS集群所有节点的磁盘每秒读出数据量。 ≥ 0 sum_disk_write_bytes_rate 磁盘写总带宽 CSS集群所有节点的磁盘每秒写入数据量。 ≥ 0
  • SecuredHttpClientConfigCallback代码示例 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 import org.apache.http.client.CredentialsProvider; import org.apache.http.impl.nio.client.HttpAsyncClientBuilder; import org.apache.http.nio.conn.ssl.SSLIOSessionStrategy; import org.elasticsearch.client.RestClientBuilder; import org.elasticsearch.common.Nullable; import java.util.Objects; class SecuredHttpClientConfigCallback implements RestClientBuilder.HttpClientConfigCallback { @Nullable private final CredentialsProvider credentialsProvider; /** * The {@link SSLIOSessionStrategy} for all requests to enable SSL / TLS encryption. */ private final SSLIOSessionStrategy sslStrategy; /** * Create a new {@link SecuredHttpClientConfigCallback}. * * @param credentialsProvider The credential provider, if a username/password have been supplied * @param sslStrategy The SSL strategy, if SSL / TLS have been supplied * @throws NullPointerException if {@code sslStrategy} is {@code null} */ SecuredHttpClientConfigCallback(final SSLIOSessionStrategy sslStrategy, @Nullable final CredentialsProvider credentialsProvider) { this.sslStrategy = Objects.requireNonNull(sslStrategy); this.credentialsProvider = credentialsProvider; } /** * Get the {@link CredentialsProvider} that will be added to the HTTP client. * * @return Can be {@code null}. */ @Nullable CredentialsProvider getCredentialsProvider() { return credentialsProvider; } /** * Get the {@link SSLIOSessionStrategy} that will be added to the HTTP client. * * @return Never {@code null}. */ SSLIOSessionStrategy getSSLStrategy() { return sslStrategy; } /** * Sets the {@linkplain HttpAsyncClientBuilder#setDefaultCredentialsProvider(CredentialsProvider) credential provider}, * * @param httpClientBuilder The client to configure. * @return Always {@code httpClientBuilder}. */ @Override public HttpAsyncClientBuilder customizeHttpClient(final HttpAsyncClientBuilder httpClientBuilder) { // enable SSL / TLS httpClientBuilder.setSSLStrategy(sslStrategy); // enable user authentication if (credentialsProvider != null) { httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider); } return httpClientBuilder; } }
  • 集群对接负载均衡器 登录云搜索服务管理控制台。 在“集群管理”页面选择需要对接负载均衡器的集群,单击集群名称进入集群“基本信息”页面。 在左侧菜单栏,选择“负载均衡”,打开负载均衡开关,在弹窗中配置负载均衡基础信息。 表4 配置负载均衡 参数 说明 负载均衡器 选择前面创建的独享型负载均衡器。CSS集群属于托管资源,所选的负载均衡器必须开启“跨VPC后端”能力才能正常使用。 委托 选择 IAM 委托,当前账号授权CSS服务访问和使用ELB资源。 当首次配置委托时,可以单击“自动创建委托”新建委托“css-elb-agency”直接使用。 当已有自动创建的委托时,可以单击“委托一键授权”,删除委托中“ELB Administrator”系统角色或“ELB FullAccess”系统策略的权限,新增如下自定义策略授权委托到最小化权限。 "elb:loadbalancers:list", "elb:loadbalancers:get", "elb:certificates:list", "elb:healthmonitors:*", "elb:members:*", "elb:pools:*", "elb:listeners:*" “自动创建委托”和“委托一键授权”需要如下最小权限。 "iam:agencies:listAgencies", "iam:roles:listRoles", "iam:agencies:getAgency", "iam:agencies:createAgency", "iam:permissions:listRolesForAgency", "iam:permissions:grantRoleToAgency", "iam:permissions:listRolesForAgencyOnProject", "iam:permissions:revokeRoleFromAgency", "iam:roles:createRole" 使用委托需要如下最小权限。 "iam:agencies:listAgencies", "iam:agencies:getAgency", "iam:permissions:listRolesForAgencyOnProject", "iam:permissions:listRolesForAgency" 图1 开启负载均衡 单击“确定”,开启负载均衡。 在“监听器配置”区域,您可以单击右侧配置监听器的相关信息。 表5 配置监听器 参数 配置说明 前端协议 客户端与负载均衡监听器建立流量分发连接的协议。支持选择“HTTP”或“HTTPS”。 根据实际业务需要选择协议。 前端端口 客户端与负载均衡监听器建立流量分发连接的端口。 根据实际业务需要自定义。 SSL解析方式 客户端到服务器端认证方式。仅“前端协议”选择“HTTPS”才需要配置。 根据实际业务需要选择解析方式。 服务器证书 服务器证书用于SSL握手协商,需提供证书内容和私钥。仅“前端协议”选择“HTTPS”才需要配置服务器证书。 选择准备并上传自签名证书创建的服务器证书。 CA证书 CA证书又称客户端CA公钥证书,用于验证客户端证书的签发者。仅“SSL解析方式”选择“双向认证”时,才需要配置CA证书。 选择准备并上传自签名证书创建的CA证书。 在开启HTTPS双向认证功能时,只有当客户端能够出具指定CA签发的证书时,HTTPS连接才能成功。 图2 配置监听器 (可选)在监听器配置区域,单击“访问控制”后的“设置”跳转到负载均衡器的监听器列表,单击监听器访问控制列的“设置”,配置允许通过负载均衡实例访问集群的IP地址组,不设置的话默认允许所有的IP地址访问。 在健康检查区域,您可以查看各个节点IP的健康检查结果。 表6 健康检查结果状态说明 健康检查结果 说明 正常 节点IP连接正常。 异常 节点IP连接,不可用
  • 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; } }
  • 通过Curl命令接入集群 在云搜索服务管理控制台,单击左侧导航栏的“集群管理”。 在集群管理列表页面,单击需要访问的集群名称,进入集群基本信息页面。 在左侧菜单栏选择“负载均衡”,获取并记录负载均衡实例的“私有IP”、“IPv6地址”或“公网IP”。 如果ELB绑定了公网,则不推荐接入非安全模式的集群。非安全模式的集群使用HTTP通信且不需要安全认证即可访问,如果对接公网访问存在安全风险。 在ECS服务器中执行如下Curl命令测试能否通过独享型负载均衡实例接入集群。 表7 不同集群的接入命令 集群安全模式 ELB最终对外提供的服务形态 接入集群的Curl命令 非安全 无认证 curl http://IP:9200 单向认证 curl -k --cert ./client.crt --key ./client.key https://IP:9200 双向认证 curl --cacert ./ca.crt --cert ./client.crt --key ./client.key https://IP:9200 安全+HTTP 密码认证 curl http://IP:9200 -u user:pwd 单向认证+密码认证 curl -k --cert ./client.crt --key ./client.key https://IP:9200 -u user:pwd 双向认证+密码认证 curl --cacert ./ca.crt --cert ./client.crt --key ./client.key https://IP:9200 -u user:pwd 安全+HTTPS 单向认证+密码认证 curl -k --cert ./client.crt --key ./client.key https://IP:9200 -u user:pwd 双向认证+密码认证 curl --cacert ./ca.crt --cert ./client.crt --key ./client.key https://IP:9200 -u user:pwd 表8 变量说明 变量名 说明 IP 负载均衡实例的IP地址。 user 集群的用户名,仅安全集群需要配置。 pwd 用户名对应的密码,仅安全集群需要配置。 当可以正常返回集群信息时,表示连接成功。
  • 场景描述 使用独享型负载均衡器接入集群具有如下优点: 非安全模式集群也支持集成弹性负载均衡服务的能力。 支持用户使用自定义证书进行HTTPS双向认证。 支持7层流量监控及告警配置,方便用户随时查看监控情况。 不同安全模式的集群对接独享型负载均衡器共有8种不同的服务形态,不同服务形态对应的ELB能力如表1所示,8种组合的配置概览如表2所示。 表1 不同集群对应的ELB能力 集群安全模式 ELB最终对外提供的服务形态 ELB负载均衡 ELB流量监控 ELB双向认证 非安全 无认证 支持 支持 不支持 单向认证 双向认证 支持 支持 支持 安全+HTTP 密码认证 支持 支持 不支持 单向认证+密码认证 双向认证+密码认证 支持 支持 支持 安全+HTTPS 单向认证+密码认证 双向认证+密码认证 支持 支持 支持 表2 不同集群对接ELB的配置概览 集群安全模式 ELB最终对外提供的服务形态 ELB监听器 后端服务器组 前端协议 前端端口 SSL解析方式 后端协议 健康检查端口 健康检查路径 非安全 无认证 HTTP 9200 无认证 HTTP 9200 / 单向认证 HTTPS 9200 单向认证 HTTP 9200 双向认证 HTTPS 9200 双向认证 HTTP 9200 安全+HTTP 密码认证 HTTP 9200 无认证 HTTP 9200 /_opendistro/_security/health 单向认证+密码认证 HTTPS 9200 单向认证 HTTP 9200 双向认证+密码认证 HTTPS 9200 双向认证 HTTP 9200 安全+HTTPS 单向认证+密码认证 HTTPS 9200 单向认证 HTTPS 9200 双向认证+密码认证 HTTPS 9200 双向认证 HTTPS 9200 CSS集群对接独享型负载均衡的操作步骤如下: 如果规划ELB监听器的前端协议是HTTPS,则需要准备签名证书并上传至ELB管理控制台:准备并上传自签名证书 在ELB管理控制台创建独享型负载均衡器:创建独享型负载均衡器 Elasticsearch或OpenSearch集群开启负载均衡:集群对接负载均衡器 通过独享型负载均衡实例接入集群:通过Curl命令接入集群 本文还提供了通过独享型负载均衡实例接入集群的Java客户端代码示例:通过负载均衡器的HTTPS双向认证方式接入集群的代码示例(Java)
  • 约束限制 如果ELB绑定了公网,则不推荐接入非安全模式的集群。非安全模式的集群使用HTTP通信且不需要安全认证即可访问,如果对接公网访问存在安全风险。 开启了HTTPS访问的安全模式的集群不支持HTTP类型的前端协议认证,如果需要使用HTTP类型的前端协议,需要将集群的“安全模式”变更为“非安全模式”,具体操作请参见更改Elasticsearch集群安全模式。在变更安全模式前,请先关闭“负载均衡”,安全模式变更完成后再开启“负载均衡”。
  • 创建独享型负载均衡器 登录弹性负载均衡管理控制台。 参考创建独享型负载均衡器,创建独享型负载均衡器。CSS集群对接独享型负载均衡器所需要关注的参数如表3所示,其他参数请根据实际需要填写。 表3 独享型负载均衡器的配置说明 参数 配置说明 取值样例 实例类型 选择“独享型”。 独享型 计费模式 性能独享型负载均衡器的收费类型。 按需计费 区域 选择CSS集群所在的区域。 - 跨VPC后端 开启跨VPC后端才能连接CSS集群。 开启 网络类型 负载均衡器对外提供服务所使用的网络类型。 CSS服务支持“IPv4私网”和“IPv6网络”。 当选择“IPv6网络”时,CSS服务对接负载均衡器后,集群对接的负载均衡实例会显示“私有IP”和“IPv6地址”。只有当独享型负载均衡器绑定了“共享带宽”,才会显示“公网IP”。 当选择“IPv4私网”时,CSS服务对接负载均衡器后,集群对接的负载均衡实例会显示“私有IP”和“公网IP”。 说明: CSS服务仅“华东二”区域支持“IPv6网络”,其他区域只支持“IPv4私网”。 IPv4私网 所属VPC 所属虚拟私有云。无论选择哪种网络类型,均需配置此项。 需要选择和CSS集群同一VPC。 - 子网 选择创建负载均衡实例的子网。无论选择哪种网络类型,均需配置此项。 需要选择和CSS集群同一子网。 - 规格 建议选择功能和性能更优的应用型规格。 应用型(HTTP/HTTPS) “小型 I”
  • 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; } }
  • SecuredHttpClientConfigCallback代码示例 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 import org.apache.http.client.CredentialsProvider; import org.apache.http.impl.nio.client.HttpAsyncClientBuilder; import org.apache.http.nio.conn.ssl.SSLIOSessionStrategy; import org.elasticsearch.client.RestClientBuilder; import org.elasticsearch.common.Nullable; import java.util.Objects; class SecuredHttpClientConfigCallback implements RestClientBuilder.HttpClientConfigCallback { @Nullable private final CredentialsProvider credentialsProvider; /** * The {@link SSLIOSessionStrategy} for all requests to enable SSL / TLS encryption. */ private final SSLIOSessionStrategy sslStrategy; /** * Create a new {@link SecuredHttpClientConfigCallback}. * * @param credentialsProvider The credential provider, if a username/password have been supplied * @param sslStrategy The SSL strategy, if SSL / TLS have been supplied * @throws NullPointerException if {@code sslStrategy} is {@code null} */ SecuredHttpClientConfigCallback(final SSLIOSessionStrategy sslStrategy, @Nullable final CredentialsProvider credentialsProvider) { this.sslStrategy = Objects.requireNonNull(sslStrategy); this.credentialsProvider = credentialsProvider; } /** * Get the {@link CredentialsProvider} that will be added to the HTTP client. * * @return Can be {@code null}. */ @Nullable CredentialsProvider getCredentialsProvider() { return credentialsProvider; } /** * Get the {@link SSLIOSessionStrategy} that will be added to the HTTP client. * * @return Never {@code null}. */ SSLIOSessionStrategy getSSLStrategy() { return sslStrategy; } /** * Sets the {@linkplain HttpAsyncClientBuilder#setDefaultCredentialsProvider(CredentialsProvider) credential provider}, * * @param httpClientBuilder The client to configure. * @return Always {@code httpClientBuilder}. */ @Override public HttpAsyncClientBuilder customizeHttpClient(final HttpAsyncClientBuilder httpClientBuilder) { // enable SSL / TLS httpClientBuilder.setSSLStrategy(sslStrategy); // enable user authentication if (credentialsProvider != null) { httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider); } return httpClientBuilder; } }
  • 通过Curl命令接入集群 在云搜索服务管理控制台,单击左侧导航栏的“集群管理”。 在集群管理列表页面,单击需要访问的集群名称,进入集群基本信息页面。 在左侧菜单栏选择“负载均衡”,获取并记录负载均衡实例的“私有IP”、“IPv6地址”或“公网IP”。 如果ELB绑定了公网,则不推荐接入非安全模式的集群。非安全模式的集群使用HTTP通信且不需要安全认证即可访问,如果对接公网访问存在安全风险。 在ECS服务器中执行如下Curl命令测试能否通过独享型负载均衡实例接入集群。 表7 不同集群的接入命令 集群安全模式 ELB最终对外提供的服务形态 接入集群的Curl命令 非安全 无认证 curl http://IP:9200 单向认证 curl -k --cert ./client.crt --key ./client.key https://IP:9200 双向认证 curl --cacert ./ca.crt --cert ./client.crt --key ./client.key https://IP:9200 安全+HTTP 密码认证 curl http://IP:9200 -u user:pwd 单向认证+密码认证 curl -k --cert ./client.crt --key ./client.key https://IP:9200 -u user:pwd 双向认证+密码认证 curl --cacert ./ca.crt --cert ./client.crt --key ./client.key https://IP:9200 -u user:pwd 安全+HTTPS 单向认证+密码认证 curl -k --cert ./client.crt --key ./client.key https://IP:9200 -u user:pwd 双向认证+密码认证 curl --cacert ./ca.crt --cert ./client.crt --key ./client.key https://IP:9200 -u user:pwd 表8 变量说明 变量名 说明 IP 负载均衡实例的IP地址。 user 集群的用户名,仅安全集群需要配置。 pwd 用户名对应的密码,仅安全集群需要配置。 当可以正常返回集群信息时,表示连接成功。