Java客户端容灾
我们可以在客户端开启本地容灾,用来应对Nacos服务端出现问题时,保证客户端的数据和接口稳定性。
这里有两个使用场景:
- 在Nacos服务端发布的时候,我们主动把容灾打开,这样客户端只使用本地容灾数据,Nacos服务的数据抖动或者数据错误都不会影响客户端,我们在Nacos服务端升级完成并且数据验证没问题后再关闭容灾;
- 在Nacos运行期间,突然出现接口不可用或者数据异常,我们可以快速的开启容灾,让客户端使用容灾数据,减小服务受影响的窗口,等Nacos服务端恢复后再关闭容灾;
具体方案可以参考:https://github.com/alibaba/nacos/issues/11053
流程简介
如上图所示,客户端的查询请求都会先经过FailoverReactor,如果FailoverReactor有数据,则直接使用,从而忽略掉Nacos Server返回的数据;如果FailoverReactor里面没有数据,则走正常流程,从ServiceInfoHolder里读取缓存;
磁盘容灾
FailoverReactor里的数据可以使用不同的数据源,默认的数据源为磁盘。
磁盘容灾文件目录
默认的磁盘容灾文件目录为:
{user.home}/nacos/naming/{namespace}/failover
这个目录可以定制,如果设置了-D参数:
-DJM.SNAPSHOT.PATH=/mypath
则容灾磁盘文件目录变为:
/mypath/nacos/naming/{namespace}/failover
磁盘容灾开关
容灾开关存放在磁盘容灾文件目录下的一个文件里,具体文件名为:
00-00---000-VIPSRV_FAILOVER_SWITCH-000---00-00
文件里存放一个数字0或者1,0代表关闭容灾,1代表打开容灾
磁盘容灾数据
容灾的数据分成多个文件,都是存放在磁盘容灾文件目录下,每一个文件存储一个单独的服务的容灾数据,每个文件的文件名格式如下:
{group.name}%40%40{service.name}
里面的内容为客户端的ServiceInfo类的JSON序列化字符串,例如:
{
"name":"DEFAULT_GROUP@@test.2",
"groupName":"DEFAULT_GROUP",
"clusters":"",
"cacheMillis":10000,
"hosts":[
{
"instanceId":"1.1.2.1#8888#DEFAULT#DEFAULT_GROUP@@test.2",
"ip":"1.1.2.1",
"port":8888,
"weight":1,
"healthy":true,
"enabled":true,
"ephemeral":true,
"clusterName":"DEFAULT",
"serviceName":"DEFAULT_GROUP@@test.2",
"metadata":{
"k1":"v1"
},
"instanceHeartBeatInterval":5000,
"instanceHeartBeatTimeOut":15000,
"ipDeleteTimeout":30000
}
],
"lastRefTime":1689835375819,
"checksum":"",
"allIPs":false,
"reachProtectionThreshold":false,
"valid":true
}
扩展容灾数据源
磁盘容灾不需要外部依赖,逻辑比较简单,但是管理起来不太方便。因此我们也支持使用SPI来扩展容灾数据源,使用磁盘以外的存储。以下是扩展的步骤。
开发自己的容灾数据源类
编写一个类,实现接口com.alibaba.nacos.client.naming.backups.FailoverDataSource:
public class MyFailoverDataSource implements FailoverDataSource {
@Override
public FailoverSwitch getSwitch() {
// TODO write your own implementation.
return null;
}
@Override
public Map<String, FailoverData> getFailoverData() {
// TODO write your own implementation. For naming module, the map
// should contain failover data with service name as key and ServiceInfo as value
return null;
}
}
配置容灾数据源类
在资源目录下新建文件:
{resource.root}/META-INF/services/com.alibaba.nacos.client.naming.backups.FailoverDataSource
{resource.root}的一个例子是src/main/resources。
文件内容为:
your.package.MyFailoverDataSource