HBase容量规划
HBase容量规划
在设计分布式系统部署时,必须执行一些基本的数学严谨性,以确保在给定系统的数据和软件要求的情况下有足够的计算能力。对于此功能,在估计某些备份和还原实施的性能时,网络容量的可用性是最大的瓶颈。第二个最昂贵的功能是可以读/写数据的速度。
完全备份
要估计完整备份的持续时间,我们必须了解调用的一般操作:
- 每个 RegionServer 上的预写日志滚动:每个 RegionServer 并行运行几十秒。相对于每个 RegionServer 的负载。
- 获取表格的HBase快照:几十秒。相对于构成表的区域和文件的数量。
- 将快照导出到目标:请参阅下文。相对于数据的大小和到到目标的网络带宽。
为了估计最后一步将花费多长时间,我们必须对硬件做出一些假设。请注意,这些对您的系统来说并不准确 - 这些是您或您的管理员为您的系统所知的数字。假设在单个节点上从 HDFS 读取数据的速度上限为 80MB / s(在该主机上运行的所有 Mapper 上),现代网络接口控制器( NIC )支持 10Gb / s,架顶式交换机可以处理 40Gb / s,集群之间的 WAN 为 10Gb / s。这意味着您只能以 1.25GB / s的速度将数据发送到远程控制器 - 这意味着参与 ExportSnapshot 的16个节点(1.25 * 1024 / 80 = 16)应该能够完全饱和集群之间的链接。由于群集中有更多节点,我们仍然可以使网络饱和,但对任何一个节点的影响较小,这有助于确保本地 SLA。如果快照的大小是 10TB,这将完全备份将花费2.5小时(10 * 1024 / 1.25 / (60 * 60) = 2.23hrs)
作为一般性声明,本地群集与远程存储之间的WAN带宽很可能是完全备份速度的最大瓶颈。
当考虑将备份的计算影响限制为“生产系统”时,可以使用可选的命令行参数对 hbase backup create: -b、-w、-q 进行重用。该 -b 选项定义每个 worker(Mapper)写入数据的带宽。该 -w 参数限制了在 DistCp 作业中生成的工作者数量。该 -q 允许指定的 YARN 队列可以可以限制生成 worker 的特定节点——这可以隔离备份工人执行复制到一组非关键节点。将 -b 和 -w 选项与前面的公式关联起来:-b 用于限制每个节点读取 80MB/s 的数据,-w 用于限制作业产生 16个worker 任务。
增量备份
就像我们为完整备份所做的那样,我们必须了解增量备份过程,以估计其运行时间和成本。
- 识别自上次完全备份或增量备份以来的新预写日志:可忽略不计。来自备份系统表的 Apriori 知识。
- 读取,过滤和写入“最小化”HFile 相当于 WAL:以写入数据的速度为主。相对于 HDFS 的写入速度。
- 将 HFiles 分配到目的地:见上文。
对于第二步,该操作的主要成本是重写数据(假设 WAL 中的大部分数据被保留)。在这种情况下,我们可以假设每个节点的聚合写入速度为 30MB / s。继续我们的 16 节点集群示例,这将需要大约 15 分钟来执行 50GB 数据(50 * 1024/60/60 = 14.2)的此步骤。启动 DistCp MapReduce 作业的时间可能会占据复制数据所需的实际时间(50 / 1.25 = 40秒)并且可以忽略。
安全备份脚本
#!/bin/bash
mydate=`date +%A`
yestoday_begin_time=`date -d $yestoday" 00:00:00" +%s`
echo $yestoday_begin_time
yestoday_end_time=`date -d $yestoday" 23:59:59" +%s`
#yestoday_end_time='1568614500'
echo $yestoday_end_time
function backup_tables
{
#check if dir exist or not
/do1cloud/hadoop-3.0.3/bin/hdfs dfs -ls /do1cloud/real_backup/${1}_${mydate} > /dev/null 2>&1
olddir_check=$(echo $?)
#if dir exist then remove the dir and mkdir new dir
if [[ $olddir_check -eq 0 ]] ; then
echo ${1}_${mydate}
/do1cloud/hadoop-3.0.3/bin/hdfs dfs -rm /do1cloud/real_backup/${1}_$mydate/*
/do1cloud/hadoop-3.0.3/bin/hdfs dfs -rmdir /do1cloud/real_backup/${1}_${mydate}
/do1cloud/hbase-2.0.5/bin/hbase org.apache.hadoop.hbase.mapreduce.Export $1 /do1cloud/real_backup/${1}_${mydate}
else
/do1cloud/hbase-2.0.5/bin/hbase org.apache.hadoop.hbase.mapreduce.Export $1 /do1cloud/real_backup/${1}_${mydate} 1 $yestoday_end_time
fi
/do1cloud/hadoop-3.0.3/bin/hdfs dfs -get /do1cloud/real_backup/${1}_${mydate} /do1cloud/do14export/fortar/${1}_${mydate}_$yestoday_end_time
}
for table in `cat /opt/prodtables.txt`
do
backup_tables $table
done
echo $?"result"
nowtime=`date +'%Y-%m-%d-%H-%M-%S'`
tar -zcf /do1cloud/do14export/fortar/tables_${nowtime}.tar.gz /do1cloud/do14export/fortar/*_${mydate}*/
find /do1cloud/do14export/fortar/ -mtime +5 -exec rm -rf {} \;
增量备份脚本
#!/bin/bash
mydate=`date +%A`
yestoday=`date -d "1 day ago" +"%Y-%m-%d" `
#begin tome format 2019-09-11 00:00:00
yestoday_begin_time=`date -d $yestoday" 00:00:00" +%s`
#yestoday_begin_time="1568627040"
echo $yestoday_begin_time
yestoday_end_time=`date -d $yestoday" 23:59:59" +%s`
#yestoday_end_time="1568627520"
echo $yestoday_end_time
function backup02_tables
{
#check if dir exist or not
/do1cloud/hadoop-3.0.3/bin/hdfs dfs -ls /do1cloud/real_backup02/${1}_${mydate} > /dev/null 2>&1
olddir_check=$(echo $?)
#if dir exist then remove the dir and mkdir new dir
if [[ $olddir_check -eq 0 ]] ; then
echo ${1}_${mydate}
/do1cloud/hadoop-3.0.3/bin/hdfs dfs -rm /do1cloud/real_backup02/${1}_$mydate/*
/do1cloud/hadoop-3.0.3/bin/hdfs dfs -rmdir /do1cloud/real_backup02/${1}_${mydate}
/do1cloud/hbase-2.0.5/bin/hbase org.apache.hadoop.hbase.mapreduce.Export $1 /do1cloud/real_backup02/${1}_${mydate} $yestoday_begin_time $yestoday_end_time
else
/do1cloud/hbase-2.0.5/bin/hbase org.apache.hadoop.hbase.mapreduce.Export $1 /do1cloud/real_backup02/${1}_${mydate} $yestoday_begin_time $yestoday_end_time
fi
/do2cloud/hadoop-3.0.3/bin/hdfs dfs -get /do5cloud/real_backup02/${1}_${mydate} /do3cloud/do24export/fortar/${1}_${mydate}_$yestoday_end_time
}
for table in `cat /opt/prodtables.txt`
do
backup02_tables $table
done
nowtime=`date +'%Y-%m-%d-%H-%M-%S'`
tar -zcf /do6cloud/do14export/fortar/tables_${nowtime}.tar.gz /do0cloud/do94export/fortar/*_${mydate}*/
find /do1cloud/do14export/fortar/ -mtime +5 -exec rm -rf {} \;
更多建议: