记一次替换Hadoop/HDFS/HBASE的磁盘
1. 需求
近几个月业务增长很快,数据量也大幅增长,但是存储数据的磁盘眼看就要满载,因此需要迁移数据,并且要满足以下几个需求:
- 由于用的云服务器,磁盘是要收钱的,所以原来的盘腾出来不再续费,只用替换的是10p的云存储。
- 线上数据是不断流动的,不能停服务,不能影响线上数据的正常查询,动态替换。
- 数据一致性必须保证。
2. 方案
参考了(百度了)很多资料后的解决思路:
利用Hadoop副本的机制,集群的副本数是3,先停一个节点的datanode,因为其他两个副本都在其他节点上,不影响hadoop的正常运行,然后修改datanode的磁盘存储目录重启,最后进行副本补全,等副本100%补全后进行下一台节点的磁盘替换。
3. 测试环境实施
- 首先准备一块磁盘格式化后挂载到需要替换磁盘的机器上。
- 强制停止该节点datanode。
kill -9 PID(datanode)
- 修改该节点Hadoop中的hdfs-site.xml配置文件,更换成新磁盘数据存储路径
<property>
<name>dfs.datanode.data.dir</name>
<value>file:///xdata/hadoop/hdfs/data</value>
</property>
- 启动datanode
hadoop-daemon.sh start datanode
- 检验磁盘是否成功替换:http://ip:50070
- 运行Hadoop sbin目录下start-balancer.sh脚本, 重新平衡数据,执行完后不断刷新上面的页面就会发现新磁盘的占用量不断上升。默认同步较慢,可以重新设置带宽提高迁移速度。
hdfs dfsadmin -setBalancerBandwidth 67108864
sbin/start-balancer.sh -threshold 5
- 通过观察http://ip:50070/fsck这个网页来确保副本是否同步完成,ip如果高可用是活跃节点的ip,如果访问页面打印的日志中某个目录被拒绝访问,就执行
hdfs dfs -chmod -R 755 目录
给这个目录授权,同步较慢,可以在start-balancer.sh后面添加相应的参数提高执行效率,直到网页的所有副本同步完成,即下图的平均副本数达到3。
- 等上面数据恢复完后替换下一个节点的磁盘,重复上面的步骤。
- 待验证的问题,迁移过程能不能进行hdfs的正常读写使用,会不会造成hbase数据不一致。