以下文章来源于Apache Doris 补习班 ,作者苏奕嘉
[
Apache Doris 补习班 .
Apache Doris Active Contributor 和 SelectDB SA 来做的不定时更新,主打 Apache Doris 系列学习文章和相关信息、原理解析或者新特性使用教程,争取 All In 原创,欢迎投稿~
](#)
引 言
本篇想解决的常见问题场景有两个:
- 1. 机器更换网卡、内网网络重构等导致机器内网 IP 失效,启动 Doris 时报
当前机器 IP 与 Bdbje 中记录的 IP 地址不一致
导致无法启动的场景 - 2. 由于机房搬迁、机器出现故障更换机器等导致集群需要离线迁移的场景
综合下来想解决的问题是一个:
Doris 本身是一个 IP 敏感的数据库,如果发生了 IP 漂移问题,该如何紧急修复保证集群的数据不丢失?
好,话不多说,本篇就给大家带来该问题的解决方案~
解决思路
其实思路是借助了容器化部署的能力,定制化的创造出一个可重新启动元数据的环境,然后再利用 Doris 本身的高可用机制来完成集群的迁移和恢复工作,具体的步骤如下:
- 1. 元数据拷贝一份,到新机房的节点上面
- 2. 创建一个网桥,然后使用老 IP 创建一个容器
- 3. 容器里放同版本的一个 FE 进程,把元数据拷贝到这个容器内并放到 FE 的启动元数据目录
- 4. fe.conf 里使用元数据恢复模式
- 5. 启动容器内 FE
- 6. 宿主机启动一个 FE 进程,空白进程,使用宿主机 FE 为 Follower 添加到容器 FE 的集群内
- 7. 等待元数据同步
- 8. 同步完成后 stop 容器内的 FE
- 9. 连接宿主机 FE 删除之前容器内 FE 的注册记录
- 10. 完成迁移
注意事项
该方式为紧急情况的解救方式,非常规方式【但是用于常规好像也没啥问题?】
- 不允许跨版本恢复【类似于升级操作】
Demo 演示
为节省篇幅,当前测试仅演示 FE 故障恢复,BE 同理
创建旧集群环境
1. 首先在内网 IP 为
10.0.16.15
的机器部署一套 Doris 1FE 1BE 的集群2. 修改 conf
3. 启动集群
- 4. 创建库表
create database test;
5. 停止集群
./bin/stop_fe.sh
6. 保存元数据目录 doris-meta
cp -R ./doris-meta doris-meta-back
创建拯救环境
我们在另一台内网 IP 为 10.0.16.13
的机器进行恢复
创建 Docker 环境
Docker 环境创建有两种方案:
- 1. 使用官方对应的 Docker 版本【虽然最近真的忙的没把各个版本的 Docker Image 都打包出来- -||】
- 2. 使用 Docker 容器自己快速构建一个等版本的环境【只需要 CentOS\Ubuntu + JDK8 环境】
- 1. 创建 Docker 网桥这里必须要根据旧集群的网段进行创建,比如旧集群的内网 IP 是
10.0.16.15
,则需要创建一个10.0.16.0/24
的一个网桥,我们命名为doris-network
docker network create --driver bridge --subnet=10.0.16.0/24 doris-network
- 2. 创建 Docker 容器使用
doris-network
网桥创建一个容器 IP 为10.0.16.15
的容器 `docker run \` `-itd \ --name=doris-back \ --network=doris-network \ --ip=10.0.16.15 \ centos:centos7.9.2009 bash`
- 3. 下载对应 binary 包并解压缩,这里我使用的是
Doris-2.0-beta
版本,和旧集群版本一致 `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`
- 4. 拷贝 FE 二进制目录至容器
docker
`cp apache-doris-2.0-beta-bin-x64/fe/ doris-back:/opt/fe`
- 5. 拷贝旧元数据目录至容器内 FE 目录下
docker
`cp doris-meta doris-back:/opt/fe/`
- 6. 进入容器
`docker exec -it doris-back bash`
- 7. 下载 JDK8 并设置
JAVA_HOME
`# 部署安装 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`
- 8. 修改 conf
`vi /opt/fe/conf/fe.conf # 添加 priority_networks priority_networks = 10.0.16.15/32 # 保存退出`
- 9. 启动 Doris-FE
cd /opt/fe/bin
./start_fe.sh --daemon
- 10. 监控 FE 状态
tail -f /opt/fe/log/fe.log
- 通过日志可以查看 FE 状态是否正常
- • 如果有
wait catalog to be ready. FE type: UNKNOWN. is ready: false, counter: xx
之类的字样,需要在fe.conf
添加metadata_failure_recovery=true
配置 - • 重启 FE,日志若正常,则注释掉上述配置,重新启动 FE
创建宿主机环境
- 1. 修改宿主机 FE 的 conf
vi /root/apache-doris-2.0-beta-bin-x64/fe/conf/fe.conf # 添加 priority_networks priority_networks = 10.0.16.13/32 # 保存退出
- 2. 连接
10.0.16.15
的 Doris 集群,添加宿主机 FE 至容器集群 mysql -uroot -P9030 -h10.0.16.15 alter system add follower "10.0.16.13";
- 3. 启动宿主机 FE,使用高可用机制添加进集群
cd /root/apache-doris-2.0-beta-bin-x64/fe ./bin/start_fe.sh --helper 10.0.16.15:9010 --daemon
- 4. 元数据同步成功,停止容器 FE
docker stop doris-back
- 5. 连接宿主机 FE
mysql -uroot -P9030 -h10.0.16.13
- 6. 查看 FE 状态
show frontends\G
- 若日志中有如下字样:
Caused by: java.net.NoRouteToHostException: No route to host (Host unreachable)
则表明当前节点可以对外提供查询服务,但是路由有问题了这里需要先设置元数据恢复模式进行重启 FE正常以后再注销元数据恢复模式,重启 FE
- • 元数据恢复模式:在
fe.conf
添加metadata_failure_recovery=true
配置
- 7. 将容器化的旧 FE 移除出集群
alter system drop follower "10.0.16.15:9010";
- 8. 验证查看之前创建的库是否正常
show databases; use test;
小结
不预告了,预告老写不完,心理压力大 - -||
老规矩,有问题可以加好友 call 我~
fl_manyi
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。