当前位置: 首页 > article >正文

同步数据至ES时,数据丢失问题处理

问题背景:

数据同步到es过程中,发现数据丢失问题,原因正是因为写入索引前会先删除索引导致!

总体流程:

  • 使用别名索引E
  • redis获取当前索引B(即E指向B),获取新索引A
  • 初始化新索引A,将数据存储到新索引A
  • redis存储当前索引A,别名索引E指向A

代码实现:

  1. redis获取当前索引B
    public Class<?> getCurrentIndexByAlias(@NonNull String alias, Class<?> defaultClass) {
        String value = stringRedisTemplate.boundValueOps(INDEX_ALIAS +"_"+ alias).get();
        if (value == null) {
            return defaultClass;
        }
        return Class.forName(value);
    }
  1. 获取新索引A,存储数据
     Method method = currentIndex.getMethod("other");
     //执行方法获取新索引
     Class<?> newIndex = (Class<?>) method.invoke(currentIndex.getDeclaredConstructor().newInstance());
     //初始化索引
     initIndex(newIndex);
     //存储数据
     ...........
  1. redis存储当前索引A
	redisRepository.switch2IndexOfAlias("E", newIndex);
    public void switch2IndexOfAlias(String alias, Class<?> clazz) {
        stringRedisTemplate.boundValueOps(INDEX_ALIAS +"_"+ alias).set(clazz.getName());
    }
  1. 别名索引E指向A
 esRepository.switchIndex("E",newIndex.getAnnotation(Document.class).indexName(),
                    currentIndex.getAnnotation(Document.class).indexName());
    public <T> void switchIndex(String alias, String newIndexName, String oldIndexName) {
        AliasActions aliasActions = new AliasActions();
        //更新新索引
        if (existsIndex(newIndexName)) {
            AliasAction.Add addAction = new AliasAction.Add(AliasActionParameters.builder()
                    .withIndices(newIndexName).withAliases(alias).build());
            aliasActions.add(addAction);
        }
        //删除旧索引
        if (existsIndex(oldIndexName)) {
            AliasAction.Remove removeAction = new AliasAction.Remove(AliasActionParameters.builder()
                    .withIndices(oldIndexName).withAliases(alias).build());
            aliasActions.add(removeAction);
        }
        //绑定别名
        elasticsearchOperations.indexOps(IndexCoordinates.of(newIndexName)).alias(aliasActions);
    }

http://www.kler.cn/a/429211.html

相关文章:

  • Redis超详细入门教程(基础篇)
  • Perl语言的数据库编程
  • Android CustomTextField
  • wireshark抓路由器上的包 抓包路由器数据
  • 【Gossip 协议】Golang的实现库Memberlist 库简介
  • 80_Redis内存策略
  • 为什么 JavaScript 中的 `eval` 被禁止使用?
  • 运维工程师.云计算工程师.服务器操作集锦
  • Sui 集成 Phantom,生态迎来全新里程碑
  • aws(学习笔记第十六课) 使用负载均衡器(ELB)解耦webserver以及输出ELB的日志到S3
  • 解决:IDEA中@Autowired自动注入MyBatis Mapper报红警告的几种解决方法
  • SQL注入--二次注入
  • Mybatis-plus 简单使用,mybatis-plus 分页模糊查询报500 的错
  • 设计模式的艺术读书笔记
  • 前端热门面试题目(六)
  • Elasticsearch使用(2):docker安装es、基础操作、mapping映射
  • MTK关于 Camera Otp
  • 快速了解什么是WELL认证?
  • Kotlin设计模式之抽象工厂模式
  • Linux C/C++如何处理两个静态库相互依赖的问题
  • Vulkan 开发(十二):Vulkan 渲染通道
  • 3D 生成重建026-Wonder3D单视图3d生成
  • 2024.12.6——攻防世界PHP2
  • 2024年11月中国及周边部分亚洲国家干旱情况的监测报告
  • Linux下redis环境的搭建
  • pushgateway HA高可用方案