Eureka Server注册中心高可用解决方案

Eureka 中各个节点数据是保存在内存之中,当Eureka所有节点都同时重启时,那么所有数据都会丢失,所以使用高可用架构更是必不可少的。

虽然使用高可用架构能降低风险,但在误操作或极端情况下,还是会有可能造成数据丢失的风险,为此随行付架构部为了更彻底解决这个问题,针对Eureka进行以下优化处理:

在应用实例注册到注册中心时,注册中心将应用实例信息持久化到数据库中(将数据持久化到数据库中,非常方便使用sql进行一系列的检索,很好的提高使用的便利性);

注册中心在接收到应用实例(RENEW)心跳请求时,先检查内存中数据是否还存在,如果不存在,则先从数据库中加载数据,并自动注册,然后再继续完成心跳请求。

高可用架构

注册中心单点肯定是不牢靠的,我们通常建议使用3节点组成的集群:

3个节点的集群,每个节点向其它节点注册,这样只要集群中有一个节点正常工作即可。为了方便在本机实现这种效果,我们先修改下hosts文件:

这相当于给本机ip绑了3个hostname。然后在项目中,创建3个profile:

应用配置

application-peer1.yml,将peer1的信息同步到peer2和peer3:

application-peer2.yml,将peer2的信息同步到peer1和peer3:

application-peer3.yml,将peer3的信息同步到peer1和peer2:

同时为了保证系统的安全性,需要设置用户名和密码进行安全验证,比如:

application-dev.yml,开发环境:

通过bootstrap.yml设置默认值:

服务器部署

首先根据实际情况在hosts文件中,加入peer1、peer2、peer3的配置;

然后在3台服务器上分别执行下列命令进启动服务:

在peer1服务器上执行:

在peer2服务器上执行:

在peer3服务器上执行:

效果图

Eureka Server间无法同步数据问题

请注意,Eureka Server相互注册后可能出现无法同步数据的情况。具体表现是每个Eureka Server上的续约数都不一样,同时在General Info标签下别的Eureka Server显示为”unavailable-replicas”。

因为Eureka通过serviceUrl.defaultZone解析到副本的hostname,与实例互相注册时的hostname对比,来判断副本是不是available。所以我们可以通过两种方式来配置:

如何验证同步数据正常

如下图所示:

如果当前节点与某一节点不能同步数据话,会将其节点信息显示在 unavailable-replicas 这行。

客户端配置

首先要在gradle中引入依赖:

在application.yml文件中增加如下配置:

注意:以上配置必须放到application.yml文件中,不能放到bootstrap.yml文件中。

写在最后:

关于随行付的开源Porter项目,你有什么问题或看法,欢迎留言告诉我们,大家一起讨论交流!

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180925B0AXQO00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券