华为云用户手册

  • 方案架构 通过自定义规则对搜索结果进行排序是通过Elasticsearch的排序API实现的。通过调用排序API查询数据,实现数据按自定义规则排序。 自定义规则查询有两种方式。 用绝对好评率计算总分,按照总分由高到低的顺序排列出查询结果。 总分 = 匹配得分 * (好评率 * 绝对因子) 匹配得分:根据查询结果计分,内容匹配记1分,否则记0分,得分之和即为匹配得分。 好评率:从匹配项的数据内容中获取好评率的值,一般指单条数据的评分。 绝对因子:自定义的好评比例。 用相对好评率计算总分,按照总分由高到低的顺序排列查询结果。 总分 = 匹配得分 * (好评率 * 相对分数) 匹配得分:根据查询结果计分,内容匹配记1分,否则记0分,得分之和即为匹配得分。 好评率:从匹配项的数据内容中获取好评率的值,一般指单条数据的评分。 相对分数:自定义一个好评率阈值,当好评率大于阈值时,返回一个自定义的相对分数;当好评率小于等于阈值时,返回另一个自定义的相对分数。通过这种方式可以避免异常好评率对查询结果的影响。
  • 连接非安全集群 连接非安全集群,示例代码如下: 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
  • 操作步骤 登录 云搜索服务 管理控制台。 在左侧导航栏,选择“集群管理”,进入Elasticsearch集群列表页面。 在集群列表页面中,单击集群操作列的“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天以前的索引已经被删除。
  • 步骤四: IAM 用户登录并验证权限 在登录页面,单击登录下方的“IAM用户”“子用户登录”,在“IAM用户登录”页面,输入“租户名/原华为云账号名”、“IAM用户名/邮件地址”和“密码”。 图10 IAM用户登录 租户名/原华为云账号名:IAM用户所属的账号。 IAM用户名/邮件地址:在IAM创建用户时,输入的IAM用户名/邮件地址,例如“James”。如果不知道用户名及初始密码,请向管理员获取。 IAM用户密码:IAM用户的密码,非账号密码。 单击“登录”,登录华为云。 在“服务列表”中选择 云搜索 服务。 在云搜索服务总览页面右上角,单击“创建集群”按钮,按照创建集群的步骤创建集群,如果创建成功,则表示权限配置成功。
  • 步骤二:给用户组授权 在用户组列表中,单击新建用户组操作列的“授权”。 在用户组选择策略页面中,在搜索框中搜索“ CSS FullAccess”勾选并单击“下一步”。 一般创建集群的权限有“ CS S FullAccess”和“Elasticsearch Administrator”,可根据表1的对应的常用操作和系统权限的关系进行对应的配置设置。表2包含了CSS所有的系统权限。 如果还需要查看资源的消费情况,请在同区域选择“BSS Administrator”权限。 表1 常用操作与系统权限的关系 操作 CSS FullAccess CSS ReadOnlyAccess Elasticsearch Administrator 备注 创建集群 √ x √ - 查询集群列表 √ √ √ - 查询集群详情 √ √ √ - 删除集群 √ x √ - 重启集群 √ x √ - 扩容集群 √ x √ - 扩容实例的数量和存储容量 √ x √ - 查询指定集群的标签 √ √ √ - 查询所有标签 √ √ √ - 加载自定义词库 √ x √ 依赖OBS和IAM权限 查询自定义词库状态 √ √ √ - 删除自定义词库 √ x √ - 自动设置集群快照的基础配置 √ x √ 依赖OBS和IAM权限 修改集群快照的基础配置 √ x √ 依赖OBS和IAM权限 设置自动创建快照策略 √ x √ - 查询集群的自动创建快照策略 √ √ √ - 手动创建快照 √ x √ - 查询快照列表 √ √ √ - 恢复快照 √ x √ - 删除快照 √ x √ - 停用快照功能 √ x √ - 更改规格 √ x √ - 缩容集群 √ x √ - 表2 CSS系统权限 系统角色/策略名称 类别 权限描述 依赖关系 Elasticsearch Administrator 系统角色 CSS服务的所有执行权限。 该角色有依赖,需要在同项目中勾选依赖的Tenant Guest和Server Administrator角色。 Tenant Guest:全局级角色,在全局项目中勾选。 Server Administrator:项目级角色,在同项目中勾选。 CSS FullAccess 系统策略 基于策略授权的CSS服务的所有权限,拥有该权限的用户可以完成基于策略授权的CSS服务的所有执行权限。 无 CSS ReadOnlyAccess 系统策略 CSS服务的只读权限,拥有该权限的用户仅能查看CSS服务数据。 无 设置最小授权范围。 此处以仅为“华北-北京四”区域的资源设置权限为例,选择授权范围方案为“指定区域项目资源”,并选择“cn-north-4 [华北-北京四]”区域。 图6 设置最小授权范围 单击“确定”,完成用户组授权。
  • 应用场景 S3插件(repository-s3)是一个专为Elasticsearch设计的插件,该插件允许用户将Elasticsearch的快照备份存储到与S3 API兼容的存储服务中,例如华为云的 对象存储服务 (OBS)。S3插件提供了一种高效、灵活且安全的方式来备份Elasticsearch集群的数据。 通过S3插件实现自建Elasticsearch集群和华为云Elasticsearch集群之间的数据迁移,常用于以下场景: 服务迁移上云:将自建的Elasticsearch服务迁移到云平台,以利用云服务的可扩展性、维护简便性和成本效益。 跨版本迁移:将低版本的自建Elasticsearch集群数据迁移到高版本的华为云Elasticsearch集群中。 集群整合:将多个自建Elasticsearch集群迁移到一个华为云Elasticsearch集群中整合为统一的数据平台,以简化管理和提高数据一致性。 技术栈统一:当企业已经在华为云上运行其他服务时,为了技术栈的统一和简化管理,可以选择将Elasticsearch集群也迁移至华为云。
  • 通过Kibana访问集群 登录云搜索服务管理控制台。 在“集群管理”页面选择需要登录的集群,单击“操作”列中的“Kibana”进入Kibana登录界面。 非安全模式的集群:将直接进入Kibana操作界面。 安全模式的集群:需要在登录页面输入用户名和密码,单击“Log In”进入Kibana操作界面。用户名默认为admin,密码为创建集群时设置的管理员密码。 登录成功后,可在Kibana界面进行相关操作访问集群。
  • 注意事项 建议Rest High Level Client的版本和Elasticsearch的版本保持一致,例如需要访问的Elasticsearch集群版本是7.6.2,则使用的Rest High Level Client客户端版本建议也是7.6.2。如果您使用相比Elasticsearch集群更高版本的Java Rest High Level Client且存在少量请求的兼容性问题,您可以使用“RestHighLevelClient.getLowLevelClient()”方式直接获取Low Level Client,实现自定义的Elasticsearch请求内容。
  • 应用场景 华为云Logstash是一款全托管的数据接入处理服务,兼容开源Logstash的能力,支持用于Elasticsearch集群间数据迁移。 通过华为云Logstash可以实现华为云Elasticsearch、自建Elasticsearch或第三方Elasticsearch迁移至华为云Elasticsearch,该方案常用于以下场景: 跨版本迁移:利用Logstash的兼容性和灵活性,实现不同版本间的数据迁移,确保数据在新版本中的可用性和一致性。适用于Elasticsearch集群版本跨度较大的迁移场景,例如从6.X版本迁移至7.X版本。 集群合并:使用Logstash进行数据迁移,将多个Elasticsearch集群的数据整合到一个Elasticsearch集群中,实现多个Elasticsearch数据的统一管理和分析。 服务迁移上云:将自建的Elasticsearch服务迁移到云平台,以利用云服务的可扩展性、维护简便性和成本效益。 变更服务提供商:如果企业当前使用的是第三方Elasticsearch服务,但出于成本、性能或其他战略考虑,希望更换服务提供商至华为云。
  • 约束限制 集群迁移过程中,源集群的索引数据不能增删改,否则会导致迁移后的源集群数据和目标集群数据内容不一致。 集群间需要保证网络连通。 如果源集群、Logstash和目标集群在不同VPC,则需要先打通VPC网络建立对等链接。具体操作请参见对等连接简介。 如果是自建Elasticsearch集群迁移至华为云,则可以通过给自建Elasticsearch集群配置公网访问打通网络。 如果是第三方Elasticsearch集群迁移至华为云,则需要建立企业内部数据中心到华为云的VPN通道或专线。
  • 操作步骤 获取Elasticsearch集群信息 准备迁移环境:创建ECS并准备必要的迁移工具和脚本。 创建Logstash集群:创建一个Logstash集群用于迁移数据。 验证集群间的网络连通性:验证Logstash和源Elasticsearch集群的连通性。 使用Logstash迁移集群 在集群迁移初期或需要确保数据完整性的场景,推荐使用Logstash全量迁移集群数据。 在需要持续同步数据或对数据实时性有较高要求的场景,推荐使用Logstash增量迁移集群数据。 释放Logstash集群:当集群迁移完成后,请及时释放Logstash集群。
  • 方案架构 图1 迁移流程 通过华为云Logstash实现Elasticsearch集群间数据迁移的迁移流程如图1所示。 输入(Input):华为云Logstash接收来自华为云Elasticsearch、自建Elasticsearch或第三方Elasticsearch的数据。 华为云Elasticsearch、自建Elasticsearch或第三方Elasticsearch数据迁移到华为云Elasticsearch的操作步骤相同,只是获取源集群的访问地址有差异,具体请参见获取Elasticsearch集群信息。 过滤(Filter):华为云Logstash对数据进行清洗和转换。 输出(Output):华为云Logstash将数据输出到目标设备,如华为云Elasticsearch。 根据业务需求,可以选择全量数据迁移或增量数据迁移。 全量数据迁移:使用Logstash进行全量数据迁移,适用于迁移初期或需要确保数据完整性的场景。 增量数据迁移:通过Logstash配置增量查询,可以只迁移有增量字段的索引数据。此方法适用于需要持续同步数据或对数据实时性有较高要求的场景。
  • 方案优势 高版本兼容性:适用于不同版本的Elasticsearch集群迁移。 高效的数据处理能力:Logstash支持批量读写操作,可以大幅度提高数据迁移的效率。 并发同步技术:利用slice并发同步技术,可以提高数据迁移的速度和性能,尤其是在处理大规模数据时。 配置简单:华为云Logstash的配置相对简单直观,通过配置文件即可实现数据的输入、处理和输出。 强大的数据处理功能:Logstash内置了丰富的过滤器,可以在迁移过程中对数据进行清洗、转换和丰富。 灵活的迁移策略:根据业务需求,可以灵活选择全量迁移或增量迁移,优化存储使用和迁移时间。
  • 使用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接入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; } } }
  • 通过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(","); } }
  • 注意事项 建议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。
  • 方案概述 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数据。 父主题: 接入集群
  • 集群节点数量 当CSS集群的构架与机型确定后,集群的节点数主要由业务对性能的要求决定。 表3 节点数量计算方式 类型 性能基线 节点数量计算方式 示例 写入节点 对于挂载云盘的节点,其单核写入性能基线为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部署等多种架构。 表1 集群架构适用的场景 架构 适用场景 用户价值 读写分离 生产业务,读多写少,数据写入后实时可见性要求低(10s+)。 高并发、低时延 冷热分离 日志业务,冷数据查询性能要求低。 低成本 存算分离 日志业务,冷数据不需要更新,并且冷数据查询性能要求低(10s+);可以和冷热分离结合使用,构建“热-温-冷”3级存储。 低成本 角色分离 集群的规模较大、集群中的索引数量较多或集群可扩展性要求高。 高可用 跨AZ部署 对可用性要求非常高的生产业务,或采用本地盘时。 高可用
  • 写入性能优化 基于Elasticsearch的数据写入流程分析,有以下几种性能优化方案。 表1 写入性能优化 优化方案 方案说明 使用SSD盘或升级集群配置 使用SSD盘可以大幅提升数据写入与merge操作的速度,对应到CSS服务,建议选择“超高IO型”存储,或者超高IO型主机。 采用Bulk API 客户端采用批量数据的写入方式,每次批量写入的数据建议在1~10MB之间。 随机生成_id 如果采用指定_id的写入方式,数据写入时会先触发一次查询操作,进而影响数据写入性能。对于不需要通过_id检索数据的场景,建议使用随机生成的_id。 设置合适的分片数 分片数建议设置为集群数据节点的倍数,且分片的大小控制在50GB以内。 关闭副本 数据写入与查询错峰执行,在数据写入时关闭数据副本,待数据写入完成后再开启副本。 Elasticsearch 7.x版本中关闭副本的命令如下: PUT {index}/_settings { "number_of_replicas": 0 } 调整索引的刷新频率 数据批量写入时,可以将索引的刷新频率“refresh_interval”设置为更大的值或者设置为“-1”(表示不刷新),通过减少分片刷新次数提高写入性能。 Elasticsearch 7.x版本中,将更新时间设置为15s的命令如下: PUT {index}/_settings { "refresh_interval": "15s" } 优化写入线程数与写入队列大小 为应对突发流量,可以适当地提升写入线程数与写入队列的大小,防止突发流量导致出现错误状态码为429的情况。 Elasticsearch 7.x版本中,可以修改如下自定义参数实现写入优化:thread_pool.write.size,thread_pool.write.queue_size。 设置合适的字段类型 指定集群中各字段的类型,防止Elasticsearch默认将字段猜测为keyword和text的组合类型,增加不必要的数据量。其中keyword用于关键词搜索,text用于全文搜索。 对于不需要索引的字段,建议“index”设置为“false”。 Elasticsearch 7.x版本中,将字段“field1”设置为不建构索引的命令如下: PUT {index} { "mappings": { "properties": { "field1":{ "type": "text", "index": false } } } } 优化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 数据写入流程 如图1所示,以Elasticsearch集群为例,介绍客户端往Elasticsearch或OpenSearch集群中写入数据的流程。图中的P表示主分片Primary,R表示副本分片Replica,主副分片在数据节点Node里是随机分配的,但是不能在同一个节点里。 客户端向Node1发送写数据请求,此时Node1为协调节点。 节点Node1根据数据的_id将数据路由到分片2,此时请求会被转发到Node3,并执行写操作。 当主分片写入成功后,它将请求转发到Node2的副本分片上。当副本写入成功后,Node3将向协调节点报告写入成功,协调节点向客户端报告写入成功。 Elasticsearch中的单个索引由一个或多个分片(shard)组成,每个分片包含多个段(Segment),每一个Segment都是一个倒排索引。 图2 Elasticsearch的索引组成 如图3所示,将文档插入Elasticsearch时,文档首先会被写入缓冲区Buffer中,同时写入日志Translog中,然后在刷新时定期从该缓冲区刷新文档到Segment中。刷新频率由refresh_interval参数控制,默认每1秒刷新一次。更多写入性能相关的介绍请参见Elasticsearch的官方介绍Near Real-Time Search。 图3 文档插入Elasticsearch的流程
  • 相关操作 在“看板”页签内,单击“操作”列的对应操作,可编辑、删除、查看看板模板。 表4 相关操作 操作 说明 编辑看板模板 单击“操作”列“编辑”,或直接单击看板名称,编辑已创建的模板。 删除看板模板 仅支持删除状态为“编辑中”的看板模板。单击“操作”列“删除”,进行删除操作。 调测看板模板 所有状态都支持调测。单击“操作”列“调测”跳转至开发环境调测团队页面,测试已创建的看板。 查看看板模板 单击“操作”列“查看”,查看看板信息。查看功能是对内容可见不可编辑。
  • 调测看板 新建看板支持进入调测页面进行调测功能。 单击已建看板“操作”列“调测”按钮,进入开发环境的调测团队页面。 表2 调测团队介绍 操作 说明 团队 左侧导航栏仅保留“调测用团队”,不可添加新团队。 应用管理 团队应用管理页面显示“已选应用”页签,展示已添加的应用。 看板管理 团队看板管理页面显示“已添加看板”及“看板库”页签。 表3 看板调测团队界面操作 操作 说明 清除调测数据 可清理调测团队下的数据。 仅清除实例数据:清空事件列表中的事件,保留测试团队下的事件流及看板。 清除实例数据并清空调测团队:清空事件列表中的事件,同时清空测试团队下所有的事件流和看板。 退出调测环境 关闭调测页面,返回轻应用构建页面。 进入“调测用团队”,单击左上角调测用团队头像,单击“看板管理”页签。 如果在“已选看板”页签的应用中显示事件流模板,表示看板已添加成功。 未添加的看板自动添加至调测用团队,已添加过看板不会重复添加。 调测用页面顶部导航栏展示已添加的看板,单击看板名称,可以进入对应的看板详情页。 单击页面右上角“退出调测环境”,关闭调测页面,返回轻应用构建页面。 退出调测环境保留调试数据。
  • 会议+直播 移动端 用户可在移动端通过“数字化办公”应用直接开启一个直播会议,方便快捷。 在“业务”界面,搜索“数字化会议”应用,点击“视频会议>预约会议”,在高级设置中开启“开启直播”,可预约一个直播会议。 预约会议成功后,单击“分享会议”可邀请与会者加入会议,复制直播地址发给需要观看直播的观众。 观众进入直播后,可进行评论。 PC端 登录个人会议管理平台,创建会议直播 在 WeLink PC端点击头像,选择“个人会议管理平台”进入。 在“创建会议”>“高级参数”界面,“会议直播”栏选择“开启”、“直播间”栏选择“WeLink直播”,点击创建即可。 开始会议直播 在个人会议管理平台点击“我的会议”,以主持人身份加入会议,开始会议。 点击“进入会控”>“启动录制/直播”,开始会议直播。 直播注意事项请参见:WeLink直播注意事项.docx
  • 回放直播 录制/回放直播 “直播”界面的“历史直播”,可以回放录制的直播。 在发起直播界面,勾选“保存回放”。 直播结束后,点击“历史直播”,进入“历史直播”界面。 选择要回放的直播,即可观看回放。 精选直播/精彩回放 精选直播:管理员可在直播应用后台,将未开始或直播中的直播设置为“精选直播”,企业全员可以在“推荐”中查看该直播。 精彩回放:管理员可在直播应用后台,将已结束且支持回看直播设置为“精选回看”,企业全员可以在“推荐”中查看该回看,方便员工观看学习。
  • 直播互动 用户可在移动端观看直播,发表评论等。 主播在PC端共享文档,用户可在移动端观看文档演示,自由切换文档演示窗口和视频窗口 公告支持由主播进行发布,并在评论区中展示(主播发布公告需在PC端操作,移动端仅支持公告展示) 支持主播在PC端进行公告颜色设置,移动端公告增加颜色显示 支持匿名评论(需在先PC端开启允许匿名评论) 小窗模式 新增小窗模式,获取手机悬浮窗权限后,可小窗观看直播。 点击右上角的按钮,可进入小窗模式。 直播中及直播回看均支持小窗模式,小化后的窗口可在界面内自由拖动。 连麦 观众可在移动端与主播进行连麦。同时连麦人数上限为8人。移动端连麦功能使用步骤如下: 主播开启连麦功能。 主播在PC客户端开启直播后,在“连麦设置”中开启“允许观众连麦”功能。 观众发起连麦申请。 观众在移动端进入直播后,点击右下角的连麦按钮,点击“发送申请”,申请连麦。 主播在直播界面,可选择接通连麦或者拒绝连麦。 开始连麦。 如果主播接通连麦后,观众可在移动端,点击“开始连麦”,开始与主播连麦。还可设置是否开启摄像头,是否开启麦克风。 结束连麦。 观众如需结束连麦,点击连麦界面的,在弹出的“连麦管理”界面,点击“结束”,即可结束与主播的连麦。
  • 移动端操作步骤 登录移动端蓝版Welink,单击底部导航栏“业务”,进入业务页面。 在“业务”页面选择We码应用,单击应用进入应用填写页面。 选择团队入口。 个人入口 在选择团队页面选择“ME”团队,进入个人团队页面。 全员入口 在选择团队页面选择“全员”,进入团队页面。 选择模板,填写表单信息,单击“发布”。 事件发布完成,单击底部导航栏“处理”,可查看待处理及已完成的事件。 待处理:ME团队下该应用内所有未完成的事件。 已完成:ME团队下该应用内所有已完成的事件,支持根据事件模板筛选。 单击底部导航栏“看板”,支持查看数据视图。
共100000条