引 言
本篇想解决的常见问题场景有两个:
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-networkdocker network create --driver bridge --subnet=10.0.16.0/24 doris-network2. 创建 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.gz4. 拷贝 FE 二进制目录至容器
dockercp apache-doris-2.0-beta-bin-x64/fe/ doris-back:/opt/fe5. 拷贝旧元数据目录至容器内 FE 目录下
dockercp doris-meta doris-back:/opt/fe/6. 进入容器
docker exec -it doris-back bash7. 下载 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:$PATH8. 修改 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 --daemon10. 监控 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-back5. 连接宿主机 FE
mysql -uroot -P9030 -h10.0.16.136. 查看 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;

小结
这里不做更多的赘述了,原理都是一样的,就是充分利用 Docker 的特定环境的制造能力 + Doris 本身自带的高可用机制来完成整个集群的拯救和迁移,没有什么特别高大上的地方,只是需要充分利用各个组件的特性来组合设计某一个场景的解决方案,特供给大家,希望能帮助到正在准备提桶跑路的你 ^_^
不预告了,预告老写不完,心理压力大 - -||
老规矩,有问题可以加好友 call 我~
fl_manyi




