[Cassandra] cassandra使用nodetool decommission之后发现丢失数据的解决办法


本文总阅读量

1、故事背景

当某一个节点执行nodetool decommission时,这个节点会被退役,该节点上的数据会流到其他正在活动的节点,但是该节点上的数据不会被清除,会保留在数据文件下。当发现剩余的的节点下未完全同步该退役的节点,可使用以下办法尝试去恢复数据。
被退役节点为(A),活动节点为(B)

2、尝试重新启动A节点,报错如下:

1
2
3
4
5
6
This node was decommissioned and will not rejoin the ring unless cassandra.override_decommission=true has been set, or all existing data is removed and th
e node is bootstrapped again
Fatal configuration error; unable to start server. See log for stacktrace.
ERROR [main] 2019-02-12 06:03:30,000 CassandraDaemon.java:749 - Fatal configuration error
org.apache.cassandra.exceptions.ConfigurationException: This node was decommissioned and will not rejoin the ring unless cassandra.override_decommission=t
rue has been set, or all existing data is removed and the node is bootstrapped again

3、报错提示要么删除目录下的所有数据,要么使用override_decommission=true参数启动,下面以添加参数启动,启动正常,启动命令:

1
cassandra -Dcassandra.override_decommission=true -R

4、但是启动完成之后发现,只存在system相关的keyspaces,其它数据没办法加载出来

1
2
cdax@cqlsh> desc keyspaces;
system_auth system_distributed system_schema system system_traces

5、因为要恢复的keyspace–“test”数据目录存在,尝试使用sstableloader去加载数据文件:

1
sstableloader -d 127.0.0.1 /tmp/test/trade_event-8d5d68508fe211e88a9ca166a7412712

6、提示当前节点下不存在test.trade_event表,需要自己先手动创建该表,去B节点上执行desc test_trade_event,查看建表语句,重新在A节点创建该表。

创建完成之后再次执行

1
sstableloader -d 127.0.0.1 /tmp/test/trade_event-8d5d68508fe211e88a9ca166a7412712

7、文件下的数据全部导入test.trade_event表下面,然后使用copy将该表下面的数据全部导入到某一单独文件下:

1
copy trade_event to '/tmp/trade_event.sql' with header=true;

8、恢复之前须知:

copy from操作并不会覆盖掉以前所有旧的数据,只会将A节点存在,B节点不存的数据导入到B节点。但是如果是B和A两个节点主键相同,其他字段数据不同,使用copy from的情况下,A节点的数据会覆盖掉B节点的数据。
因为我们decommission节点之后,启动应用发现缺少数据,导致应用无法起来,这种情况下B节点没有最新数据插入,因此可以执行copy from操作。如果无法确定B节点是否有新的数据插入,建议先根据某个表对应的时间戳先校验,确保没有最新数据插入的情况下,再使用上面的方法执行。

9、导出完成之后,将导出的文件拷贝到B节点,之后再B节点上执行copy from操作将数据恢复:

1
COPY trade_event FROM '/home/test/trade_event.sql' WITH HEADER = TRUE ;
目录
  1. 1. 1、故事背景
  2. 2. 2、尝试重新启动A节点,报错如下:
  3. 3. 3、报错提示要么删除目录下的所有数据,要么使用override_decommission=true参数启动,下面以添加参数启动,启动正常,启动命令:
  4. 4. 4、但是启动完成之后发现,只存在system相关的keyspaces,其它数据没办法加载出来
  5. 5. 5、因为要恢复的keyspace–“test”数据目录存在,尝试使用sstableloader去加载数据文件:
  6. 6. 6、提示当前节点下不存在test.trade_event表,需要自己先手动创建该表,去B节点上执行desc test_trade_event,查看建表语句,重新在A节点创建该表。
  7. 7. 7、文件下的数据全部导入test.trade_event表下面,然后使用copy将该表下面的数据全部导入到某一单独文件下:
  8. 8. 8、恢复之前须知:
  9. 9. 9、导出完成之后,将导出的文件拷贝到B节点,之后再B节点上执行copy from操作将数据恢复:

Proudly powered by Hexo and Theme by Lap
本站访客数人次
© 2020 zeven0707's blog