ES异地双活方案
对于单机房而言,只要参考Elastic Search 官方文档,搭建一个集群即可,示意图如下:
原理类似分布式选举那一套,当一个master节点宕机时,剩下2个投票选出1个新老大,整个集群可以继续服务。对于核心系统,只部署单机房总归有点不保险,万一单机房故障就废了(比如:断电断网、或光缆被挖断)。那有同学肯定会想,多弄几个机房,把集群中的节点分散到多个机房不就好了么?
理论上讲,上面这种结构是可行的,但实际应用中,要考虑的因素会更多:
1、1个机房变3个机房,这成本就得翻好几倍了,回想一下mysql之类的解决方案,master-slave架构顶多放2个机房就可以了。
2、如果3个机房分属异地,比如:上海、广州、北京,三个城市间数据传输必然增加延时,要降低延时一般是拉专线,这样一方面成本还会继续增加,而且这么长距离传输,网络抖动是难免的,抖动期间,会增加选举"误切换"的概率。
3、3个节点之间不断的数据同步,会使三地机房间的网络流量增加,特别是某个节点挂了,重新恢复后,会在短时间内从master上同步数据,有流量风暴的隐患。
当然,官方有一个Cross Cluster Replication(CCR)的方案,架构示意图如下:
原理上讲,这其实也是把一个集群的节点分散部署在2个idc机房,另外,该方案并非免费午餐,官方的描述中,这是企业级的商业收费服务:
那么,普通屌丝公司有没有经济点的做法,即相对省钱,又能达到高可用呢?
圈内有一句名言:“没有什么是不能通过增加一个抽象层解决的,如果没有,就再加一层”。
我们把这个问题分解一下,无非就是“读”高可用,以及“写”高可用,先来看“读”:
假设有2个机房A、B,每个机房各部署1个ES集群,然后有一个java服务,按现在流行的做法,不管是spring cloud也好,还是dubbo也罢,一般也是多机房部署,同样部署在A、B二个机房。可以在service内部引入一个检测机制,用2个线程,分别定时检测A、B二个机房的ES集群健康情况(类似心跳检测),然后把检测结果,写入java service实例的内部全局变量中,假设ES集群状态正常为up,如果挂了为down。这样每个机房的java service就能知道2个ES集群是否可用,然后结合自身所在的机房,优先就近访问(这1点不难做到,服务注册时,可以在meta data元数据里主动标识自身所属的ip,根据ip地址段,就能区分出所在机房)。即:如果A,B二个机房的ES集群都是up健康状态,A机房的java service访问同机房的ES实例,避免了跨机房调用。
当发生故障时,这里有2种情况,一种是某个机房的ES集群down了,但是该机房的java service还是正常的,类似下面:
B机房的ES集群故障,这时候检查结果会标识B:down,B机房的java service此时知道本机房的ES集群有问题,退而求其次,访问另一侧机房的ES.
如果某一侧机房彻底挂了,比如:断电、断网。这时候,剩下一侧机房的java service仍然是优先访问同机房的ES,整个系统仍然可用。
解决了双机房ES"读"的问题,再来看“写”的问题,可能有同学说了,这还不简单,直接双写就行了吧,一份数据,向A、B机房的ES集群各写一份。听想来貌似可行,但是有一些细节问题 :
1、双写并非原子操作,如果A机房的ES集群写成功了,B机房的ES集群没写成功,该怎么办?
2、当B机房的ES挂了,双写不进去时,过一段时间又恢复后,故障期间的数据,B机房的ES集群怎么补进去?如果手动事后补数据,虽然可行,但是毕竟麻烦。
这里,可以引入一层MQ,类似下图这样:
向ES写入的数据,先发到MQ,然后java service再消费这个Topic,要点在于,分成2个Consumer Group来消费,2个group分别对应于2侧的ES,即A-Group消费的Message,写入A机房的ES集群,B-Group消费的Message,写入B机房的ES集群。写入ES成功后,才Ack确认消费成功。由于2个group的消费是各自独立的(各自有各自的offset)。
当1侧ES down时,写入不成功,该Group的Message就不会Ack成功,一直压积着(而另1侧的group则不受影响),等ES恢复时,会继续消费,把故障期间的数据,自动补进去。这样就免去了事后手动补数据的麻烦。
当然,这个方案的提前是MQ本身是高可用的,不过这个不难做到,已经有一些rocket mq双机房多活的案例,不在本文讨论范围,大家可以自行搜索。
参考文档:
https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-discovery.html
https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-node.html
https://zhuanlan.zhihu.com/p/82702078
ES异地双活方案的更多相关文章
- ES+Hbase对接方案概述
方案背景 Hbase的索引方案有很多,越来越多的人开始选择ES+Hbase的方案,其实该方案并没有想象中那么完美,ES并发低,同时查询速度相对Hbase也慢很多,那为什么会选择他呢,它的写入比较快,如 ...
- 571亿背后:DRC助阿里实现异地双活
571亿背后:DRC助阿里实现异地双活 赶集网SQL自动上线
- Mysql双活方案
#### 说明 Mysql主主互备即为两个mysql的互为备份机 ##### Windows下安装步骤(Linux下步骤类似,基本就是装上mysql,然后修改配置来完成主从的设置) - step1 ...
- ES数据同步方案
当业务量上升后,由于mysql对全文检索或模糊查询支持的能力不强,在系统中查询的地方,往往会出现慢sql等,拖累系统其他模块,造成性能低下. 随着ES使用普及率的升高,ES是mysql的一个有效补充. ...
- mysql异地备份方案经验总结
Mysql 数据库异地备份脚本 实验环境:关闭防火墙不然不能授权登录 Mysql-server:192.168.30.25 Mysql-client: 192.168.30.24 实验要求:对mys ...
- kafka 异步双活方案 mirror maker2 深度解析
mirror maker2背景 通常情况下,我们都是使用一套kafka集群处理业务.但有些情况需要使用另一套kafka集群来进行数据同步和备份.在kafka早先版本的时候,kafka针对这种场景就有推 ...
- 多es 集群数据迁移方案
前言 加入新公司的第二个星期的星期二 遇到另一个项目需要技术性支持:验证es多集群的数据备份方案,需要我参与验证,在这个项目中需要关注到两个集群的互通性.es集群是部署在不同的k8s环境中,K8s环境 ...
- mysql 架构 ~异地容灾
一 简介 我们来探讨下多机房下的mysql架构二 目的: 首先要清楚你的目的 1 实现异地机房的容灾备份 2 实现异地机房的双活 三 叙说 1 实现异地机房的容灾备份 ...
- MySQL两地三中心方案初步设计【转】
整体内容会按照如下的方式来进行设计: 首先说下方案的背景,我参考了一些资料(参见附件). 方案背景 随着互联网业务快速发展,多IDC的业务支撑能力和要求也逐步提升,行业内的“两地三中心”方案较为流行. ...
随机推荐
- ASP.NET Core文件上传IFormFile于Request.Body的羁绊
前言 在上篇文章深入探究ASP.NET Core读取Request.Body的正确方式中我们探讨了很多人在日常开发中经常遇到的也是最基础的问题,那就是关于Request.Body的读取方式问题,看是简 ...
- 聊聊 Spring 的 XML Schema 扩展机制的使用方式
前言 在当前Java生态,Spring算的上是最核心的框架,所有的开发组件想要得到大范围更便捷的使用,都要和Spring进行整合,比如我们熟知的Mybatis.Dubbo等,以及内部封装的各类组件包括 ...
- Go语言的函数02---参数
package main import "fmt" /* 常量,变量,函数---源代码的成员 给成员命名的字符称之为[标识符] 合法的标识符有:大小写字母,数字,下划线 命名时不能 ...
- wangEditor 轻量级富文本框编辑器使用方法
首先第一步先去wangEditor官网下载所需要的脚本文件! http://www.wangeditor.com/ 接下来先在你的项目的HTML标签里加上这样一段标签: 1 <body> ...
- Nsight Compute Profilier 分析
profiler报告包含每次内核启动分析期间收集的所有信息.在用户界面中,它包含一个包含常规信息的标题,以及用于在报告页面或单个收集的启动之间切换的控件.默认情况下,报告以选定的详细信息页面开始. 页 ...
- 基于C语言文件操作的学生成绩管理系统
原理 在一个班级学生成绩管理系统中,希望处理每个学生的学习情况信息,其中包括学生的学号.姓名.各科名称和成绩等并能使管理人员通过界面完成对学生信息的录入及对学生信息的录入及对数据的查找.浏览.插入.排 ...
- 【SQLite】SQLite文件突然变大怎么办?瘦身办法
使用VACUUM命令即可: VACUUM 命令通过复制主数据库中的内容到一个临时数据库文件,然后清空主数据库,并从副本中重新载入原始的数据库文件.这消除了空闲页,把表中的数据排列为连续的,另外会清理数 ...
- .Net Core with 微服务 - Consul 注册中心
上一次我们介绍了 Ocelot 网关的基本用法.这次我们开始介绍服务注册发现组件 Consul 的简单使用方法. 服务注册发现 首先先让我们回顾下服务注册发现的概念. 在实施微服务之后,我们的调用都变 ...
- Vue(4)Vue指令的学习1
前言 Vue官网一共有提供了14个指令,分别如下 v-text v-html v-show v-if ☆☆☆ v-else ☆☆☆ v-else-if ☆☆☆ v-for ☆☆☆ v-on ☆☆☆ v ...
- Jetpack Compose和View的互操作性
Jetpack Compose Interoperability Compose风这么大, 对于已有项目使用新技术, 难免会担心兼容性. 对于Compose来说, 至少和View的结合是无缝的. (目 ...