PowerData

以下文章来源于Apache Doris 补习班 ,作者苏奕嘉

[

Apache Doris 补习班 .

Apache Doris Active Contributor 和 SelectDB SA 来做的不定时更新,主打 Apache Doris 系列学习文章和相关信息、原理解析或者新特性使用教程,争取 All In 原创,欢迎投稿~

](#)

引  言

    本篇想解决的常见问题场景有两个:

  1. 1. 机器更换网卡、内网网络重构等导致机器内网 IP 失效,启动 Doris 时报当前机器 IP 与 Bdbje 中记录的 IP 地址不一致 导致无法启动的场景
  2. 2. 由于机房搬迁、机器出现故障更换机器等导致集群需要离线迁移的场景

综合下来想解决的问题是一个:

    Doris 本身是一个 IP 敏感的数据库,如果发生了 IP 漂移问题,该如何紧急修复保证集群的数据不丢失?

好,话不多说,本篇就给大家带来该问题的解决方案~

解决思路

    其实思路是借助了容器化部署的能力,定制化的创造出一个可重新启动元数据的环境,然后再利用 Doris 本身的高可用机制来完成集群的迁移和恢复工作,具体的步骤如下:

  1. 1. 元数据拷贝一份,到新机房的节点上面
  2. 2. 创建一个网桥,然后使用老 IP 创建一个容器
  3. 3. 容器里放同版本的一个 FE 进程,把元数据拷贝到这个容器内并放到 FE 的启动元数据目录
  4. 4. fe.conf 里使用元数据恢复模式
  5. 5. 启动容器内 FE
  6. 6. 宿主机启动一个 FE 进程,空白进程,使用宿主机 FE 为 Follower 添加到容器 FE 的集群内
  7. 7. 等待元数据同步
  8. 8. 同步完成后 stop 容器内的 FE
  9. 9. 连接宿主机 FE 删除之前容器内 FE 的注册记录
  10. 10. 完成迁移

注意事项

    该方式为紧急情况的解救方式,非常规方式【但是用于常规好像也没啥问题?】

  • 不允许跨版本恢复【类似于升级操作】

Demo 演示

为节省篇幅,当前测试仅演示 FE 故障恢复,BE 同理

创建旧集群环境

  1. 1. 首先在内网 IP 为 10.0.16.15 的机器部署一套 Doris 1FE 1BE 的集群

     title=

    2. 修改 conf

  2. 3. 启动集群

     title=

  3. 4. 创建库表
  4. create database test;

 title=

5. 停止集群

./bin/stop_fe.sh

6. 保存元数据目录 doris-meta

cp -R ./doris-meta doris-meta-back

创建拯救环境

我们在另一台内网 IP 为 10.0.16.13 的机器进行恢复

 title=

创建 Docker 环境

Docker 环境创建有两种方案:

  1. 1. 使用官方对应的 Docker 版本【虽然最近真的忙的没把各个版本的 Docker Image 都打包出来- -||】
  2. 2. 使用 Docker 容器自己快速构建一个等版本的环境【只需要 CentOS\Ubuntu + JDK8 环境】
  1. 1. 创建 Docker 网桥这里必须要根据旧集群的网段进行创建,比如旧集群的内网 IP 是 10.0.16.15 ,则需要创建一个 10.0.16.0/24 的一个网桥,我们命名为 doris-network
  2. docker network create --driver bridge --subnet=10.0.16.0/24 doris-network
  3. 2. 创建 Docker 容器使用 doris-network 网桥创建一个容器 IP 为 10.0.16.15 的容器
  4. `docker run \`   `-itd \   --name=doris-back \   --network=doris-network \   --ip=10.0.16.15 \   centos:centos7.9.2009 bash`
  5. 3. 下载对应 binary 包并解压缩,这里我使用的是 Doris-2.0-beta 版本,和旧集群版本一致
  6. `wget https://apache-doris-releases.oss-accelerate.aliyuncs.com/apache-doris-2.0-beta-bin-x64.tar.gz tar -zxvf apache-doris-2.0-beta-bin-x64.tar.gz`
  7. 4. 拷贝 FE 二进制目录至容器docker 
  8. `cp apache-doris-2.0-beta-bin-x64/fe/ doris-back:/opt/fe`
  9. 5. 拷贝旧元数据目录至容器内 FE 目录下docker 
  10. `cp doris-meta doris-back:/opt/fe/`
  11. 6. 进入容器
  12. `docker exec -it doris-back bash`
  13. 7. 下载 JDK8 并设置 JAVA_HOME
  14. `# 部署安装 wget yum install -y wget # 下载 JDK8 二进制包 wget https://doris-thirdparty-repo.bj.bcebos.com/thirdparty/jdk-8u131-linux-x64.tar.gz # 解压缩 JDK8 二进制包 tar -zxvf jdk-8u131-linux-x64.tar.gz # 设置 JAVA_HOME export JAVA_HOME=/jdk1.8.0_131 export PATH=$JAVA_HOME/bin:$PATH`
  15. 8. 修改 conf
  16. `vi /opt/fe/conf/fe.conf # 添加 priority_networks priority_networks = 10.0.16.15/32 # 保存退出`
  17. 9. 启动 Doris-FE
  18. cd /opt/fe/bin

    ./start_fe.sh --daemon

  19. 10. 监控 FE 状态
  20. tail -f /opt/fe/log/fe.log
  21. 通过日志可以查看 FE 状态是否正常
  • • 如果有  wait catalog to be ready. FE type: UNKNOWN. is ready: false, counter: xx 之类的字样,需要在 fe.conf 添加 metadata_failure_recovery=true 配置
  • • 重启 FE,日志若正常,则注释掉上述配置,重新启动 FE

创建宿主机环境

  1. 1. 修改宿主机 FE 的 conf
  2. vi /root/apache-doris-2.0-beta-bin-x64/fe/conf/fe.conf # 添加 priority_networks priority_networks = 10.0.16.13/32 # 保存退出
  3. 2. 连接 10.0.16.15 的 Doris 集群,添加宿主机 FE 至容器集群
  4. mysql -uroot -P9030 -h10.0.16.15 alter system add follower "10.0.16.13";
  5. 3. 启动宿主机 FE,使用高可用机制添加进集群
  6. cd /root/apache-doris-2.0-beta-bin-x64/fe ./bin/start_fe.sh --helper 10.0.16.15:9010 --daemon

  1. 4. 元数据同步成功,停止容器 FE
  2. docker stop doris-back
  3. 5. 连接宿主机 FE
  4. mysql -uroot -P9030 -h10.0.16.13
  5. 6. 查看 FE 状态
  6. show frontends\G
  7. 若日志中有如下字样:Caused by: java.net.NoRouteToHostException: No route to host (Host unreachable)则表明当前节点可以对外提供查询服务,但是路由有问题了这里需要先设置元数据恢复模式进行重启 FE正常以后再注销元数据恢复模式,重启 FE
  • • 元数据恢复模式:在 fe.conf 添加 metadata_failure_recovery=true 配置
  1. 7. 将容器化的旧 FE 移除出集群
  2. alter system drop follower "10.0.16.15:9010";
  3. 8. 验证查看之前创建的库是否正常
  4. show databases; use test;

 title=

小结

不预告了,预告老写不完,心理压力大 - -||

老规矩,有问题可以加好友 call 我~

fl_manyi

排版校对 | 刘寄文


PowerData
1 声望2 粉丝

PowerData社区官方思否账号