我们可以在客户端开启本地容灾,用来应对Nacos服务端出现问题时,保证客户端的数据和接口稳定性。
这里有两个使用场景:
- 在Nacos服务端发布的时候,我们主动把容灾打开,这样客户端只使用本地容灾数据,Nacos服务的数据抖动或者数据错误都不会影响客户端,我们在Nacos服务端升级完成并且数据验证没问题后再关闭容灾;
- 在Nacos运行期间,突然出现接口不可用或者数据异常,我们可以快速的开启容灾,让客户端使用容灾数据,减小服务受影响的窗口,等Nacos服务端恢复后再关闭容灾;
具体方案可以参考:https://github.com/alibaba/nacos/issues/11053
流程简介
如上图所示,客户端的查询请求都会先经过FailoverReactor,如果FailoverReactor有数据,则直接使用,从而忽略掉Nacos Server返回的数据;如果FailoverReactor里面没有数据,则走正常流程,从ServiceInfoHolder里读取缓存;
磁盘容灾
FailoverReactor里的数据可以使用不同的数据源,默认的数据源为磁盘。
磁盘容灾文件目录
默认的磁盘容灾文件目录为:
这个目录可以定制,如果设置了-D参数:
则容灾磁盘文件目录变为:
磁盘容灾开关
容灾开关存放在磁盘容灾文件目录下的一个文件里,具体文件名为:
文件里存放一个数字0或者1,0代表关闭容灾,1代表打开容灾
磁盘容灾数据
容灾的数据分成多个文件,都是存放在磁盘容灾文件目录下,每一个文件存储一个单独的服务的容灾数据,每个文件的文件名格式如下:
里面的内容为客户端的ServiceInfo类的JSON序列化字符串,例如:
扩展容灾数据源
磁盘容灾不需要外部依赖,逻辑比较简单,但是管理起来不太方便。因此我们也支持使用SPI来扩展容灾数据源,使用磁盘以外的存储。以下是扩展的步骤。
开发自己的容灾数据源类
编写一个类,实现接口com.alibaba.nacos.client.naming.backups.FailoverDataSource:
配置容灾数据源类
在资源目录下新建文件:
{resource.root}的一个例子是src/main/resources。
文件内容为: