跨AZ高可用之Elasticsearch实践

作者:SUNNY
时间:2018-01-04


AZ,AWS提出的,可用区(Availability Zone),在每个区域(Region)都有多个可用区。AZ之间物理隔离,独立供电,一个AZ故障,不会影响另外一个AZ,但AZ之间是连通,且网络耗时低。简单可以将AZ理解为独立机房或逻辑机房,这样可以利用AZ的隔离性,对业务进行跨AZ部署,实现高可用。

本文先是简单介绍了跨AZ服务部署的一些方案,之后介绍了调研的Elasticsearch跨AZ部署方案,最后介绍了在当前业务场景下,所采取的一个部署方案实战。

1. Elasticsearch介绍

Elasticsearch是一开源搜索引擎,可以为站点提供实时分析搜索服务;也可以与Logstash、Kibana一起进行日志分析展现(ELK)。 官方网址:https://www.elastic.co。 在我们业务使用中,主要是提供实时商品搜索服务,当前处于业务发展初期,有多个Elasticsearch集群,总体流量较小。

2. 跨AZ部署方案概览

在我理解,按照服务是否有数据,可以分为无状态服务、有状态服务。 无状态服务,像接入层,业务逻辑模块等。 有状态服务,像存储,缓存,消息队列,id分配等。 针对无状态服务,每个AZ按照集群方式部署即可,这是实现该类服务高可用的一个基本措施。 对于接入层,一般有2种方式: 1)购买ELB时,可以选择跨AZ。这样ELB可以将流量分配到不同的AZ; 2)通过DNS解析控制,比如针对某些地区用户可以解析到第一个AZ对应的公网IP,其他地区可以解析到第二个AZ对应的公网IP。 针对有状态服务,由于存在数据一致性、灾备等问题,一般会是主备方式进行部署,如果对性能要求较高,可能还会提供一个读的实例。 但针对id分配服务来说,是一个特例,虽然自己本身是有数据,但由于是预分配,因此可以采用类集群方式部署。

3.Elasticsearch跨AZ部署

AWS做法 AWS实现了Elasticsearch跨AZ部署,虽然跨AZ,但Elasticsearch仍然是一个集群。具体做法是:在2个AZ之间,显示分配Elasticsearch集群副本及分片,集群数量要求为偶数,AWS把这个叫做区域感知(zone awareness)。另外,AWS还采用了专用主节点(Dedicated Master Nodes),来提高集群稳定性。 AWS启用区域感知4节点集群
在这里插入图片描述
从AWS提供的资料来看,Elasticsearch并没有完全解决“脑裂”问题,需要保证AZ间网络可靠性。 通过多AZ部署,实现了数据均衡,数据损失保护。 官方参考文档:http://docs.aws.amazon.com/zh_cn/elasticsearch-service/latest/developerguide/es-managedomains.html

阿里云做法 从阿里云提高资料来分析,可能并没有真正实现Elasticsearch跨AZ部署,只是实现了跨地域备份,同一AZ使用了多副本,同一节点采用了多分区来方式。另外,阿里云也可以使用专用主节点(与AWS类似)。 阿里云Elasticsearch高可用做法
在这里插入图片描述
阿里云做法简单,没有实现Elasticsearch多AZ多活,但有保底方式——数据灾备。出现AZ故障后,能够恢复数据。 官方参考文档:https://data.aliyun.com/product/elasticsearch?spm=5176.8142029.388261.349.3836dbccunNNX1

某数据实时分析系统 使用tribe节点来做Elasticsearch代理层。在2个AZ分别单独搭建Elasticsearch集群,在tribe节点会分别查询2个集群,之后对结果进行合并。 tribe节点目前看是Elasticsearch多集群部署的一个较好方案,但也有许多限制。官方关于使用tribe节点说明很少,但从已使用的团队了解到,进行2个集群数据合并会有一些问题,核心业务要慎重考虑,充分验证。从论坛看到,tribe节点需要客户端代码做一定修改,需要支持多个集群,并且在Elasticsearch 5.3版本之后,会逐步去掉了tribe节点。 官方参考文档:https://www.elastic.co/guide/en/elasticsearch/reference/2.4/modules-tribe.html

当前业务自己做法 Elasticsearch部署没有使用多AZ部署,单AZ部署。
在这里插入图片描述
这种方式严重依赖第一个AZ的稳定性。

小结 (1)单AZ部署,其他AZ容灾备份; (2)多AZ分别部署Elasticsearch集群,集群之间没有关联,业务层实现多AZ写,数据一致性业务层需保证; (3)与2有些类似,多AZ分别部署Elasticsearch集群,使用tribe节点进行读写; (4)跨集群搜索方式(cross cluster search)。这是在5.3版本之后,Elasticsearch自身支持。官方网址:https://www.elastic.co/guide/en/elasticsearch/reference/6.1/modules-cross-cluster-search.html

在这里插入图片描述

4.Elasticsearch跨AZ部署实战
在这里插入图片描述

### OmegaConf 配置管理简介 OmegaConf 是一个强大的 Python 库,用于处理复杂的配置文件。它支持多种数据结构(如字典、列表)以及 YAML 文件的解析和操作。以下是有关如何使用 OmegaConf 的详细介绍。 #### 创建配置对象 可以通过 `OmegaConf.create` 方法创建一个新的配置对象。该方法可以接受字典、YAML 字符串或其他兼容的数据结构作为输入[^1]。 ```python import omegaconf from omegaconf import OmegaConf config_dict = {"database": {"host": "localhost", "port": 6379}} config = OmegaConf.create(config_dict) print(OmegaConf.to_yaml(config)) # 将配置转换为 YAML 格式的字符串 ``` #### 加载外部 YAML 文件 如果需要加载外部 YAML 文件,可使用 `OmegaConf.load` 方法。这使得程序能够轻松读取并应用存储在磁盘上的配置文件。 ```python yaml_file_path = "./example_config.yaml" file_conf = OmegaConf.load(yaml_file_path) # 打印加载后的配置内容 print(file_conf.database.host) # 输出 'localhost' ``` #### 合并多个配置源 当存在多个配置来源时(如默认设置与命令行参数),可以使用 `OmegaConf.merge` 来无缝合并它们。此功能允许开发者优先级较高的配置覆盖较低级别的配置项。 ```python default_configs = OmegaConf.create({"model": {"type": "resnet50"}}) cli_args = OmegaConf.from_dotlist(["model.type=vgg16"]) merged_config = OmegaConf.merge(default_configs, cli_args) assert merged_config.model.type == "vgg16" # 命令行参数成功覆盖默认值 ``` #### 动态更新配置 除了静态定义外,还可以通过访问器动态修改现有配置中的字段。这种灵活性非常适合运行时调整某些超参数或环境变量。 ```python dynamic_update = file_conf.copy() dynamic_update.database.port = 8080 print(dynamic_update.database.port) # 输出新的端口号 8080 ``` #### 错误处理机制 为了防止非法赋值破坏整个系统的稳定性,OmegaConf 提供了严格的模式控制选项。启用严格模式后,任何未声明过的键都将引发异常提示用户修正错误。 ```python strict_mode_enabled = file_conf.copy() strict_mode_enabled.set_struct(True) # 开启只读保护状态 try: strict_mode_enabled.new_field = True # 此处会抛出 AttributeError 异常 except AttributeError as e: print(f"Catch expected error: {e}") ``` --- ### 总结 以上展示了 OmegaConf 在不同场景下的典型用法,包括但不限于初始化配置实、加载外部资源、融合多层设定逻辑以及实施安全防护措施等方面的功能特性。希望这些子能帮助快速掌握其核心概念和技术要点!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值