云服务器内容精选

  • 集群创建失败 如果集群创建失败后,失败任务会自动转入“失败任务管理”页面。选择“现有集群”,单击图4中进入“失败任务管理”页面,在“任务状态”列中,将鼠标移动到上可以查看到失败原因,如图5所示。可以参见查看失败的集群操作任务章节删除失败任务。 图4 失败任务管理 图5 失败原因 MRS 集群创建失败错误码列表如表6所示。 表6 错误码 错误码 说明 MRS.101 用户请求配额不足,请联系客服提升配额。 MRS.102 用户Token为空或不合法,请稍后重试或联系客服。 MRS.103 用户请求不合法,请稍后重试或联系客服。 MRS.104 用户资源不足,请稍后重试或联系客服。 MRS.105 现子网IP不足,请稍后重试或联系客服。 MRS.201 因E CS 服务导致失败,请稍后重试或联系客服。 MRS.202 因 IAM 服务导致失败,请稍后重试或联系客服。 MRS.203 因VPC服务导致失败,请稍后重试或联系客服。 MRS.400 MRS内部出错,请稍后重试或联系客服。
  • 软件配置 表1 MRS集群软件配置 参数 参数说明 区域 选择区域。 不同区域的云服务产品之间内网互不相通。请就近选择靠近您业务的区域,可减少网络时延,提高访问速度。 计费模式 MRS提供两种计费模式: 包年/包月 按需计费 选择“按需计费”时,可能需要冻结一定的保证金。详细内容,请参见计费说明。 购买时长 包年/包月模式下该参数有效,表示购买集群的时长。最短时长为1个月,最长时长为1年。 如需开通自动续费功能,请勾选“自动续费”,开通后按月购买的集群自动续费周期为1个月,按年购买的集群自动续费周期为1年。 集群名称 集群名称不允许重复。 只能由字母、数字、中划线和下划线组成,并且长度为1~64个字符。 默认名称为mrs_xxxx,xxxx为字母和数字的四位随机组合数,系统自动组合。 集群类型 提供几种集群类型: 分析集群:用来做离线数据分析,提供的是Hadoop体系的组件。 流式集群:用来做流处理任务,提供的是流式处理组件。 混合集群:既可以用来做离线数据分析,也可以用来做流处理任务,提供的是Hadoop体系的组件和流式处理组件。建议同时需要做离线数据分析和流处理任务时使用混合集群。 自定义:用户可按照业务需求调整集群服务的部署方式,具体请参见购买自定义拓扑集群。(目前仅MRS 3.x版本支持) 说明: MRS流式集群不支持“作业管理”和“文件管理”功能。 如需在集群中安装全部组件,请选择“自定义”类型集群。 版本类型 提供以下版本类型: 普通版: 支持集群基础操作,如配置、管理和运维。 支持Presto、Impala、Kudu、Sqoop等组件。 LTS版: 除支持集群基础操作外,还提供版本升级能力。 支持多可用区部署。 支持HetuEngine、IoTDB、CDL组件。 默认版本类型为普通版。 集群版本 MRS目前支持MRS 1.9.2、MRS 3.1.0、MRS 3.1.2-LTS.3、MRS 3.1.5、MRS 3.2.0-LTS.1、MRS 3.3.0-LTS.1版本。默认值为当前最新版本。 组件选择 MRS集群配套的组件,MRS不同版本集群支持的组件版本请参见MRS组件版本一览表。 元数据 是否使用外部数据源存储元数据。 本地元数据: 元数据存储在集群本地。 外置数据连接:使用外部数据源元数据,若集群异常或删除时将不影响元数据,适用于存储计算分离的场景。 支持Hive或Ranger组件的集群支持该功能。 组件名 当“元数据”选择“外置数据连接”时该参数有效。用于表示可以设置外部数据源的组件类型。 Hive Ranger 数据连接类型 当“元数据”选择“外置数据连接”时该参数有效。用于表示外部数据源的类型。创建集群时“数据连接类型”仅支持“本地数据库”。 组件端口(目前仅LTS版本支持) 当前MRS集群内各组件默认通讯端口值的策略。 开源:组件的默认通讯端口遵循开源社区的规范不做修改,与开源社区保持一致。 定制:组件的默认通讯端口与开源社区不一致。 开源默认端口与定制默认端口区别请参考开源组件Web站点。
  • 操作步骤 进入购买MRS集群页面。 在购买集群页面,选择“自定义购买”页签。 创建集群时需要注意配额提醒。当资源配额不足时,建议按照提示申请足够的资源,再创建集群。 参考软件配置配置集群信息后,单击“下一步”。 图1 软件配置 部分区域仅支持一种计费方式,请以控制台实际方式为准。 参考硬件配置配置集群信息后,单击“下一步”。 图2 硬件配置 当前MRS集群如需规划Task节点组进行弹性伸缩,在配置集群节点信息过程中,可参考以下步骤进行操作: 添加分析Task节点组: 对于集群类型为“分析集群”或“混合集群”的集群: 系统会自动添加分析Task节点组“task_node_analysis_group”,请根据实际需求设置节点数量、实例规格及节点磁盘配置。 若不需要该分析Task节点组,可手动删除。 对于集群类型为“自定义”的集群: 在集群节点配置区域,单击“添加节点组”,手动添加一个新的节点组。 配置“拓扑调整”参数为“开启”。 手动选择角色拓扑,使该节点组只包含NodeManager角色(NM)即可。 也可以在集群创建完成后,通过手动添加节点组的方式添加Task节点组,可参考添加Task节点。 添加流式Task节点组(仅MRS 1.9.2支持): 对于集群类型为“流式集群”、“混合集群”的集群: 系统会自动添加流式Task节点组“task_node_streaming_group”,请根据实际需求设置节点数量、实例规格及节点磁盘配置。 若不需要该流式Task节点组,可手动删除。 参考高级配置配置集群信息后,单击“下一步”。 图3 高级配置 在“确认配置”页面检查配置集群信息,如需调整配置,可单击,跳转到对应页签后重新设置参数。 勾选通信安全授权,通信安全授权详情请参考授权安全通信。 单击“立即购买”。 当集群开启Kerberos认证时,需要确认是否需要开启Kerberos认证,若确认开启请单击“继续”,若无需开启Kerberos认证请单击“返回”关闭Kerberos认证后再创建集群。购买集群后,不支持修改。 如果您对价格有疑问,可以单击页面左下角“了解计费详情”,根据计费详情来了解产品价格。 若您选择“按需计费”时,可能因为冻结保证金失败或者账号可能存在风险导致下单失败,请联系技术支持处理。 单击“返回集群列表”,可以查看到集群创建的状态。 集群创建的状态过程请参见表1中的“状态”参数说明。 集群创建需要时间,所创集群的初始状态为“启动中”,创建成功后状态更新为“运行中”,请您耐心等待。 MRS系统界面支持同一时间并发创建10个集群,且最多支持管理100个集群。
  • 使用约束 尽管容灾提供了实时的数据复制功能,但实际的数据同步进展,由多方面的因素决定的,例如,当前主集群业务的繁忙程度,备集群进程的健康状态等。因此,在正常情形下,备集群不应该接管业务。极端情形下是否可以接管业务,可由系统维护人员以及决策人员根据当前的数据同步指标来决定。 容灾功能当前仅支持一主一备。 通常情况下,不允许对备集群的灾备表进行表级别的操作,例如修改表属性、删除表等,一旦误操作备集群后会造成主集群数据同步失败、备集群对应表的数据丢失。 主集群的HBase表已启用容灾功能同步数据,用户每次修改表的结构时,需要手动修改备集群的灾备表结构,保持与主集群表结构一致。
  • 前提条件 主备集群都已经安装并启动成功,且获取集群的管理员权限。 必须保证主备集群间的网络畅通和端口的使用。 如果主集群部署为安全模式且不由一个 FusionInsight Manager管理,主备集群必须已配置跨集群互信。如果主集群部署为普通模式,不需要配置跨集群互信。 主备集群必须已配置跨集群拷贝。 主备集群上的时间必须一致,而且主备集群上的NTP服务必须使用同一个时间源。 必须在主备集群的所有节点的hosts文件中,配置主备集群所有机器的机器名与业务IP地址的对应关系。 如果主集群的客户端安装在集群外的节点上,也需在该节点的hosts文件中配置主备集群所有机器的机器名与业务IP地址的对应关系。 主备集群间的网络带宽需要根据业务流量而定,不应少于最大的可能业务流量。 主备集群安装的MRS版本需要保持一致。 备集群规模不小于主集群规模。
  • 操作步骤 进入快速购买文档数据库DDS页面。 在“购买数据库实例”页面,选择计费模式,填写并选择实例相关信息后,单击“立即购买”。 图1 基础配置 表1 基础配置 参数 描述 计费模式 选择“包年/包月”或“按需计费”。 包年/包月 用户选购完服务配置后,可以根据需要设置购买时长,系统会一次性按照购买价格对账户余额进行扣费。 创建成功后,如果包周期实例到期后不再长期使用资源,可将“包年/包月”实例转为“按需计费”,到期后将转为按需计费实例。具体请参见包周期实例转按需计费。 说明: “包年/包月”方式购买的实例不能直接删除,仅支持资源退订操作,如何退订资源请参见退订包周期实例。 按需计费 用户选购完服务配置后,无需设置购买时长,系统会根据消费时长对账户余额进行扣费。 创建成功后,如果需要长期使用资源,可将“按需计费”实例转为“包年/包月”,继续使用这些资源的同时,享受包周期的低资费。具体请参见按需计费实例转包周期。 区域 资源所在的区域。 说明: 不同区域的内网不互通,且购买后不能更换,请谨慎选择。 项目 当前区域对应的项目,可进行切换。 可用区 可用区是指在同一区域下,电力、网络隔离的物理区域,可用区内部网络互通,不同可用区之间物理隔离。 目前支持将实例部署在单可用区或3可用区。 说明: 目前3可用区的功能只针对部分区域开放,如果您在当前区域的管理控制台上没有看到3可用区,请切换至其他支持3可用区的区域进行购买。 如果业务要求实例之间的网络延时较低,则建议您选择单可用区,将实例的组件部署在同一个可用区内。实例选择单可用区部署时,会默认配置为反亲和部署。反亲和部署是出于高可用性考虑,将您的Primary、Secondary和Hidden节点分别创建在不同的物理机上。 如果业务需要较高的容灾能力,建议您选择3可用区。此时,实例下的dds mongos节点、shard节点和config节点分别部署在3个不同的可用区内。 实例类型 选择“集群”。 集群类型的实例包含dds mongos、shard和config节点。其中,shard和config节点均采用三节点副本集架构,保证高可用。 兼容MongoDB版本 4.4 4.2 4.0 3.4 CPU类型 当前文档数据库实例的CPU架构支持x86和鲲鹏两种类型。 说明: MongoDB4.0、3.4版本可选,其他版本无需选择,默认X86。 x86 x86类型的CPU架构采用复杂指令集(CISC),CISC指令集的每个小指令可以执行一些较低阶的硬件操作,指令数目多而且复杂,每条指令的长度并不相同。由于指令执行较为复杂所以每条指令花费的时间较长。 鲲鹏 鲲鹏类型的CPU架构采用RISC精简指令集(RISC),RISC是一种执行较少类型计算机指令的微处理器,它能够以更快的速度执行操作,使计算机的结构更加简单合理地提高运行速度,相对于X86类型的CPU架构具有更加均衡的性能功耗比。 鲲鹏类型CPU架构的优势是高密度低功耗,可以提供更高的性价比,满足重载业务场景使用。 规格类型 x86 CPU架构下,针对不同的应用场景,可以选择不同的规格类型。 通用型(s6)。通用型的规格实例,适合平时不会持续高压力使用CPU,但偶尔需要提高计算性能完成工作负载的场景,包括但不限于:轻量级的Web服务器、开发、测试环境以及中低性能数据库等。 增强Ⅱ型(c6)。多项技术优化,计算性能强劲稳定,配套25GE(千兆以太网)智能高速网卡,提供超高网络带宽和PPS收发包能力。是高负载场景首选,对于计算与网络有更高性能要求的网站和Web应用、通用数据库及缓存服务器,中重载企业应用等更加适用。 支持的实例规格请参见集群实例规格。 dds mongos性能规格 dds mongos节点的CPU和内存,请参见集群实例规格。创建成功后,可进行规格变更,请参见变更集群实例的CPU和内存规格。 dds mongos数量 数量可选范围为2~32,创建成功后,可进行节点扩容,请参见添加集群实例的节点。 shard性能规格 shard节点的CPU和内存,请参见集群实例规格。shard存储用户的数据,用户不能直接连接shard。创建成功后,可进行规格变更,请参见变更集群实例的CPU和内存规格。 shard存储空间 存储空间最小10GB,最大2000GB,用户选择大小必须为10的整数倍。创建成功后可进行扩容,请参见扩容集群实例的磁盘空间。 说明: 用户购买的存储空间超过600GB,当剩余的可用存储空间为18GB时,实例状态将被设置为只读。 用户购买的存储空间小于等于600GB,当实际使用量到总存储空间的97%时,实例状态将被设置为只读。 此时建议您清理多余的资源或进行扩容。 shard数量 数量可选范围为2~32,创建成功后,可进行节点扩容,请参见添加集群实例的节点。 config性能规格 config节点的CPU和内存,请参见集群实例规格,存储实例的配置信息,用户不能直接连接。创建成功后,可进行规格变更,请参见变更集群实例的CPU和内存规格。 config存储空间 根据config节点的作用和最小需要,存储空间为20GB,创建成功后不可进行扩容。 图2 网络设置及购买时长与数量 表2 网络设置 参数 描述 虚拟私有云 文档数据库实例所在的 虚拟专用网络 ,可对不同业务进行网络隔离,方便地管理、配置内部网络,进行安全、快捷的网络变更。您需要创建或选择所需的虚拟私有云。如何创建虚拟私有云,请参见《虚拟私有云用户指南》中的创建虚拟私有云和子网。所需虚拟私有云的使用限制请参见实例连接方式介绍。 如果不创建或没有可选的虚拟私有云,文档数据库服务默认为您分配资源。 说明: 实例创建完成后不支持切换虚拟私有云,请谨慎选择所属虚拟私有云。 企业项目 该参数针对企业用户使用,如需使用该功能,请联系客服申请开通。 企业项目是一种云资源管理方式,企业项目管理服务提供统一的云资源按项目管理,以及项目内的资源管理、成员管理。 请在下拉框中选择所在的企业项目,其中,default为默认项目。更多企业项目相关的信息,请参见《企业管理用户指南》的项目管理。 如果需要自定义企业项目,请在控制台右上角单击“企业”,进入“企业项目”页面创建,具体请参见《企业管理用户指南》中“创建企业项目”的内容。 表3 购买时长与数量 参数 描述 购买时长 选择“包年/包月”方式的用户需要设置购买时长,最短为1个月,最长为3年。 自动续费 默认不勾选,不进行自动续费。 勾选后实例自动续费,自动续费周期与原订单周期一致。 购买数量 购买数量与集群实例配额有关,所需购买数量超出实例配额时,可根据界面提示申请扩大配额。批量购买的“包年/包月”实例,除实例名称和实例ID外,其余配置信息一致。 在“规格确认”页面,核对实例信息。 包年/包月 如果需要修改,单击“上一步”,修改实例信息。 核对无误后,单击“去支付”,进入“付款”页面,选择支付方式,完成支付。 按需计费 如果需要修改,单击“上一步”,修改实例信息。 核对无误后,单击“提交”,开始创建实例。 单击“返回实例列表”。实例创建成功后,用户可以在“实例管理”页面,查看并管理自己的数据库实例。 创建实例过程中,实例运行状态显示为“创建中”,此过程约15分钟。创建完成的实例的运行状态显示为“正常”。 创建实例时,默认开启自动备份策略,后期可修改。创建成功后,文档数据库服务会自动创建一个全量备份。
  • 使用Spring Boot接入HTTPS集群(使用安全证书) 该场景适用于使用安全证书连接安全模式+HTTPS协议的集群。 获取安全证书(CloudSearchService.cer)。 登录 云搜索服务 控制台。 选择“集群管理”进入集群列表。 单击对应集群的名称,进入集群基本信息页面。 在“基本信息”页面,单击“HTTPS访问”后面的“下载证书”。 图1 下载证书 转换安全证书(CloudSearchService.cer)。将下载的安全证书上传到客户端机器上,使用keytool工具将“.cer”证书转换成Java可以读取的“.jks”证书格式。 在Linux系统中,执行如下命令转换证书。 keytool -import -alias newname -keystore ./truststore.jks -file ./CloudSearchService.cer 在Windows系统中,执行如下命令转换证书。 keytool -import -alias newname -keystore .\truststore.jks -file .\CloudSearchService.cer 其中,newname是由用户自定义的证书名称。 该命令执行后,会提示设置证书密码,并确认密码。请保存该密码,后续接入集群会使用。 application.properties配置文件: 1 2 3 elasticsearch.url=host1:9200,host2:9200 elasticsearch.username=username elasticsearch.password=password 表3 参数说明 参数 描述 host Elasticsearch集群节点的IP地址。 username 访问集群的用户名。 password 用户名对应的密码。 配置代码: com.xxx为项目目录,例如com.company.project。 com.xxx.repository为仓库目录,通过extends org.springframework.data.elasticsearch.repository.ElasticsearchRepository进行具体定义。 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 package com.xxx.configuration; import org.elasticsearch.client.RestHighLevelClient; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.data.elasticsearch.client.ClientConfiguration; import org.springframework.data.elasticsearch.client.RestClients; import org.springframework.data.elasticsearch.config.AbstractElasticsearchConfiguration; import org.springframework.data.elasticsearch.repository.config.EnableElasticsearchRepositories; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.security.KeyStore; import java.security.SecureRandom; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import javax.net.ssl.HostnameVerifier; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSession; import javax.net.ssl.TrustManager; import javax.net.ssl.TrustManagerFactory; import javax.net.ssl.X509TrustManager; @Configuration @EnableElasticsearchRepositories(basePackages = "com.xxx.repository") @ComponentScan(basePackages = "com.xxx") public class Config extends AbstractElasticsearchConfiguration { @Value("${elasticsearch.url}") public String elasticsearchUrl; @Value("${elasticsearch.username}") public String elasticsearchUsername; @Value("${elasticsearch.password}") public String elasticsearchPassword; @Override @Bean public RestHighLevelClient elasticsearchClient() { SSLContext sc = null; try { TrustManager[] tm = {new MyX509TrustManager(cerFilePath, cerPassword)}; sc = SSLContext.getInstance("SSL", "SunJSSE"); sc.init(null, tm, new SecureRandom()); } catch (Exception e) { e.printStackTrace(); } final ClientConfiguration clientConfiguration = ClientConfiguration.builder() .connectedTo(StringHostParse(elasticsearchUrl)) .usingSsl(sc, new NullHostNameVerifier()) .withBasicAuth(elasticsearchUsername, elasticsearchPassword) .build(); return RestClients.create(clientConfiguration).rest(); } private String[] StringHostParse(String hostAndPorts) { return hostAndPorts.split(","); } public static class MyX509TrustManager implements X509TrustManager { X509TrustManager sunJSSEX509TrustManager; MyX509TrustManager(String cerFilePath, String cerPassword) throws Exception { File file = new File(cerFilePath); if (!file.isFile()) { throw new Exception("Wrong Certification Path"); } System.out.println("Loading KeyStore " + file + "..."); InputStream in = new FileInputStream(file); KeyStore ks = KeyStore.getInstance("JKS"); ks.load(in, cerPassword.toCharArray()); TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509", "SunJSSE"); tmf.init(ks); TrustManager[] tms = tmf.getTrustManagers(); for (TrustManager tm : tms) { if (tm instanceof X509TrustManager) { sunJSSEX509TrustManager = (X509TrustManager) tm; return; } } throw new Exception("Couldn't initialize"); } @Override public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { } @Override public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { } @Override public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0]; } } public static class NullHostNameVerifier implements HostnameVerifier { @Override public boolean verify(String arg0, SSLSession arg1) { return true; } } } 其中,cerFilePath和cerPassword是生成的.jks证书的存放路径及其密码。
  • 通过Spring Boot接入HTTP集群 该场景适用于连接非安全模式的集群或是安全模式+HTTP协议的集群。 配置文件: 1 2 3 4 elasticsearch.url=host1:9200,host2:9200 //非安全集群不用配置如下两行。 elasticsearch.username=username elasticsearch.password=password 表1 参数说明 参数 描述 host Elasticsearch集群节点的IP地址。 username 访问集群的用户名。 password 用户名对应的密码。 配置代码: com.xxx为项目目录,例如com.company.project。 com.xxx.repository为仓库目录,通过extends org.springframework.data.elasticsearch.repository.ElasticsearchRepository进行具体定义。 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 package com.xxx.configuration; import org.elasticsearch.client.RestHighLevelClient; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.data.elasticsearch.client.ClientConfiguration; import org.springframework.data.elasticsearch.client.RestClients; import org.springframework.data.elasticsearch.config.AbstractElasticsearchConfiguration; import org.springframework.data.elasticsearch.repository.config.EnableElasticsearchRepositories; @Configuration @EnableElasticsearchRepositories(basePackages = "com.xxx.repository") @ComponentScan(basePackages = "com.xxx") public class Config extends AbstractElasticsearchConfiguration { @Value("${elasticsearch.url}") public String elasticsearchUrl; //非安全集群不用配置如下两个参数。 @Value("${elasticsearch.username}") public String elasticsearchUsername; @Value("${elasticsearch.password}") public String elasticsearchPassword; @Override @Bean public RestHighLevelClient elasticsearchClient() { final ClientConfiguration clientConfiguration = ClientConfiguration.builder() .connectedTo(StringHostParse(elasticsearchUrl)) //非安全集群无需配置withBasicAuth。 .withBasicAuth(elasticsearchUsername, elasticsearchPassword) .build(); return RestClients.create(clientConfiguration).rest(); } private String[] StringHostParse(String hostAndPorts) { return hostAndPorts.split(","); } }
  • 使用Spring Boot接入HTTPS集群(不使用安全证书) 该场景适用于不使用安全证书连接安全模式+HTTPS协议的集群。 配置文件: 1 2 3 elasticsearch.url=host1:9200,host2:9200 elasticsearch.username=username elasticsearch.password=password 表2 参数说明 参数 描述 host Elasticsearch集群节点的IP地址。 username 访问集群的用户名。 password 用户名对应的密码。 配置代码: com.xxx为项目目录,例如com.company.project。 com.xxx.repository为仓库目录,通过extends org.springframework.data.elasticsearch.repository.ElasticsearchRepository进行具体定义。 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 package com.xxx.configuration; import org.elasticsearch.client.RestHighLevelClient; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.data.elasticsearch.client.ClientConfiguration; import org.springframework.data.elasticsearch.client.RestClients; import org.springframework.data.elasticsearch.config.AbstractElasticsearchConfiguration; import org.springframework.data.elasticsearch.repository.config.EnableElasticsearchRepositories; import java.security.KeyManagementException; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import javax.net.ssl.HostnameVerifier; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSession; import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; @Configuration @EnableElasticsearchRepositories(basePackages = "com.xxx.repository") @ComponentScan(basePackages = "com.xxx") public class Config extends AbstractElasticsearchConfiguration { @Value("${elasticsearch.url}") public String elasticsearchUrl; @Value("${elasticsearch.username}") public String elasticsearchUsername; @Value("${elasticsearch.password}") public String elasticsearchPassword; @Override @Bean public RestHighLevelClient elasticsearchClient() { SSLContext sc = null; try { sc = SSLContext.getInstance("SSL"); sc.init(null, trustAllCerts, new SecureRandom()); } catch (KeyManagementException | NoSuchAlgorithmException e) { e.printStackTrace(); } final ClientConfiguration clientConfiguration = ClientConfiguration.builder() .connectedTo(StringHostParse(elasticsearchUrl)) .usingSsl(sc, new NullHostNameVerifier()) .withBasicAuth(elasticsearchUsername, elasticsearchPassword) .build(); return RestClients.create(clientConfiguration).rest(); } private String[] StringHostParse(String hostAndPorts) { return hostAndPorts.split(","); } public static TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() { @Override public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { } @Override public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { } @Override public X509Certificate[] getAcceptedIssuers() { return null; } } }; public static class NullHostNameVerifier implements HostnameVerifier { @Override public boolean verify(String arg0, SSLSession arg1) { return true; } } }
  • 注意事项 建议Elasticsearch Rest High Level Client的版本和Elasticsearch的版本保持一致,例如需要访问的Elasticsearch集群版本是7.10.2,则使用的Elasticsearch Rest High Level Client客户端版本建议也是7.10.2。 本章节以2.5.5版本Spring Boot为例介绍Spring Boot接入集群的方式,对应的spring data elasticsearch版本是4.2.x。
  • 迁移指导 通过 数据复制服务 (DRS)可以实现 GaussDB for MySQL等关系型数据库之间的数据迁移和同步,支持的数据库类型请参见同步方案概览。 表1为DRS服务所支持的源数据库迁移至 CSS 服务的具体指导。 表1 数据同步指导 源数据库类型 目标数据库类型 同步模式 相关文档 RDS for MySQL CSS/ES 全量+增量数据同步 将MySQL同步到CSS/ES 本地自建MySQL数据库 ECS自建MySQL数据库 CSS/ES 全量+增量数据同步 将MySQL同步到CSS/ES GaussDB(for MySQL) CSS/ES 全量+增量数据同步 将GaussDB(for MySQL)同步到CSS/ES
  • 迁移流程 因为Elasticsearch支持全文检索和Ad Hoc查询,所以经常作为关系型数据库(例如GaussDB for MySQL等)的补充,以此提升数据库的全文检索能力和高并发的Ad Hoc查询能力。 对于这种源端是数据库的集群,集群迁移流程如图1所示。 图1 源端为数据库的集群迁移流程 该迁移方案具有割接方便和通用性好的优点。 割接方便:当CSS进入增量同步状态,即可启动业务割接操作。 通用性好:两边均可同步对客户端的ES进行增删改查操作。
  • 写入性能优化 基于Elasticsearch的数据写入流程分析,有以下几种性能优化方案。 表1 写入性能优化 序号 优化方案 方案说明 1 使用SSD盘或升级集群配置 使用SSD盘可以大幅提升数据写入与merge操作的速度,对应到CSS服务,建议选择“超高IO型”存储,或者超高IO型主机。 2 采用Bulk API 客户端采用批量数据的写入方式,每次批量写入的数据建议在1~10MB之间。 3 随机生成_id 如果采用指定_id的写入方式,数据写入时会先触发一次查询操作,进而影响数据写入性能。对于不需要通过_id检索数据的场景,建议使用随机生成的_id。 4 设置合适的分片数 分片数建议设置为集群数据节点的倍数,且分片的大小控制在50GB以内。 5 关闭副本 数据写入与查询错峰执行,在数据写入时关闭数据副本,待数据写入完成后再开启副本。 Elasticsearch 7.x版本中关闭副本的命令如下: PUT {index}/_settings { "number_of_replicas": 0 } 6 调整索引的刷新频率 数据批量写入时,可以将索引的刷新频率“refresh_interval”设置为更大的值或者设置为“-1”(表示不刷新),通过减少分片刷新次数提高写入性能。 Elasticsearch 7.x版本中,将更新时间设置为15s的命令如下: PUT {index}/_settings { "refresh_interval": "15s" } 7 优化写入线程数与写入队列大小 为应对突发流量,可以适当地提升写入线程数与写入队列的大小,防止突发流量导致出现错误状态码为429的情况。 Elasticsearch 7.x版本中,可以修改如下自定义参数实现写入优化:thread_pool.write.size,thread_pool.write.queue_size。 8 设置合适的字段类型 指定集群中各字段的类型,防止Elasticsearch默认将字段猜测为keyword和text的组合类型,增加不必要的数据量。其中keyword用于关键词搜索,text用于全文搜索。 对于不需要索引的字段,建议“index”设置为“false”。 Elasticsearch 7.x版本中,将字段“field1”设置为不建构索引的命令如下: PUT {index} { "mappings": { "properties": { "field1":{ "type": "text", "index": false } } } } 9 优化shard均衡策略 Elasticsearch默认采用基于磁盘容量大小的Load balance策略,在多节点场景下,尤其是在新扩容的节点上,可能出现shard在各节点上分配不均的问题。为避免这类问题,可以通过设置索引级别的参数“routing.allocation.total_shards_per_node”控制索引分片在各节点的分布情况。此参数可以在索引模板中配置,也可以修改已有索引的setting生效。 修改已有索引的setting的命令如下: PUT {index}/_settings { "index": { "routing.allocation.total_shards_per_node": 2 } }
  • 数据写入流程 图1 数据写入流程 当从客户端往Elasticsearch中写入数据时,写入流程如下: 客户端向Node1发送写数据请求,此时Node1为协调节点。 节点Node1根据数据的_id将数据路由到分片2,此时请求会被转发到Node3,并执行写操作。 当主分片写入成功后,它将请求转发到Node2的副本分片上。当副本写入成功后,Node3将向协调节点报告写入成功,协调节点向客户端报告写入成功。 Elasticsearch中的单个索引由一个或多个分片(shard)组成,每个分片包含多个段(Segment),每一个Segment都是一个倒排索引。 图2 Elasticsearch的索引组成 将文档插入Elasticsearch时,文档首先会被写入缓冲区中,然后在刷新时定期从该缓冲区刷新到Segment中。刷新频率由refresh_interval参数控制,默认每1秒刷新一次。 图3 文档插入Elasticsearch的流程
  • 如何选择区域? 选择区域时,您需要考虑以下几个因素: 地理位置 一般情况下,建议就近选择靠近您或者您的目标用户的区域,这样可以减少网络时延,提高访问速度。 在除中国大陆以外的亚太地区有业务的用户,可以选择“中国-香港”、“亚太-曼谷”或“亚太-新加坡”区域。 在非洲地区有业务的用户,可以选择“非洲-约翰内斯堡”区域。 在拉丁美洲地区有业务的用户,可以选择“拉美-圣地亚哥”区域。 “拉美-圣地亚哥”区域位于智利。 资源的价格 不同区域的资源价格可能有差异,请参见华为云服务价格详情。