1. ES实例OSS快照恢复
创建仓库
PUT _snapshot/仓库名 { "type": "oss", "settings": { "endpoint": "oss-cn-beijing-internal.aliyuncs.com", "access_key_id": "LTA*********", "secret_access_key": "*********", "bucket": "test_bucket", "compress": true } }
索引全量恢复
POST _snapshot/仓库名/快照名/_restore { "indices":"*,-.*,-ilm-*", "ignore_unavailable":"true"}
2. 查看快照恢复情况
- 语法
GET/_recovery
- 可以看到所有索引的相关信息,常见形式如下图所示,如索引「test0617」可以看到不同的shard恢复耗时,开始时间start_time_in_millis,结束时间stop_time_in_millis,总恢复耗时时长total_time_in_millis,单位都是毫秒
3. 总恢复时间实现代码
GET /_recovery包含每个独立索引(包含客户侧业务自建索引和ES系统索引)从快照恢复的开始及结束时长,但不包含整个从OSS快照恢复的耗时统计。
在进行ES跨云、上云迁移时,采用快照恢复的迁移方式需要在压测阶段进行全量、增量快照恢复时长的统计用于评估业务切割时的不可用、停写时间用以进行业务宣导,方案评定等工作。
本方法统计ES实例级别的所有索引快照恢复时间,包含手动输入GET /_recovery及http请求两种信息获取方式。
################ author:sunyf###############fromdatetimeimportdatetime, timedeltaimportjsonimportrequestsdeftimestamp2str(timestamp: int): """ # # 时间戳转字符串 :param timestamp: bigint :return: string format timestamp """# timestamp = 1690965380890 / 1000dt=datetime.fromtimestamp(timestamp/1000) s=dt.strftime("%Y-%m-%d %H:%M:%S:%f") # print(s)returnsdefget_recovery_by_input() ->str: out=""stdin=input("请粘贴GET /_recovery结果,完成后连按两个enter键\n") whilestdin: out+=stdin+'\n'stdin=input() print(f'-------------输入内容为:\n{out}-------------如上为输入内容\n') returnoutdefget_recovery_by_request() ->str: res=requests.get('http://localhost:9200/_recovery', auth=('user', 'pwd')) returnres.textif__name__=='__main__': _input=get_recovery_by_input() # 2选1# _input = get_recovery_by_request()_in=json.loads(_input) indices= [] start= [] stop= [] print(f'-------------如下非系统索引被纳入统计') fork, vin_in.items(): ifnotstr(k).startswith("."): print(k) indices.append(k) for_inv.get('shards'): start.append(_.get('start_time_in_millis')) stop.append(_.get('stop_time_in_millis')) print(f'-------------recovery开始时间:\n{timestamp2str(min(start))}') print(f'-------------recovery结束时间:\n{timestamp2str(max(stop))}') print( f'-------------recovery持续时间:\n{datetime.fromtimestamp(max(stop) /1000) -datetime.fromtimestamp(min(start) /1000)}')