1.背景描述
2020年团队决定对elasticsearch升级。es(elasticsearch缩写,下同)当前版本为0.9x,升级到5.x版本。es在本公司承载三个部分的业务,站内查询,订单数据统计,elk日志分析。
对于站内查询和订单数据统计,当前业务架构是
mysql -> canal -> kafka -> es
(可以考虑使用kafka connector 代替canal)
2.难点
难点是在升级的时候如何不影响当前业务。
3.具体步骤
A.部署es新集群
下载5.x版本的es,在新的机器上部署新的集群。
B.pull代码,升级代码到es新版本
由于从0.9x到5.x版本跨度比较大,许多java api都发生了变化,需要修复。
一个坑是alias api 发生了语义变化,在后来的自测中修复了此问题。
C.重建索引
我们使用索引重建程序来新建索引。重建索引具体步骤如下,我们称线上索引为online index, 新创建的索引为new index。
1.init
刷新索引名映射关系,检查当前alias只有一个物理索引。
根据预定义的mapping,创建索引new index。
设置在线索引记录数据变更日志,即记录线上索引消费kafka数据,并存储为change log文件.
2.全量索引数据库上的数据到new index
从mysql查出数据同步到es中,如果有多个分表,就按照表顺序同步。可以开启多线程批量插入。
3.对new index索引优化
refresh, flush 索引。调用force-merge api,进行段合并。
4.重放change log到new index中
根据change log 转换为es query,写入到new index。
5.暂停线上索引的写入
因为online index和new index 使用的是相同的kafka consumer group,所以必须停掉online index的消费功能。
6.关闭change log
停止记录在线索引记录数据变更日志。
7.第二阶段重放change log
根据change log 转换为es query,写入到new index。
8.删除change log
删除线索引记录数据变更日志。
9.设置副本数
new index创建索引的时候默认副本数为0,现在动态调整副本数为业务需要的值。比如对现实搜索业务设置两个副本,对订单统计类索引不需要副本。- PUT /new_index/_settings
- {
- "number_of_replicas": 2
- }
复制代码 此阶段可能会比较耗时,需要等待几分钟才能进行下一步操作。更好的做法是调用health api 查看分片状态。- GET _cluster/health
- {
- "cluster_name" : "testcluster",
- "status" : "yellow",
- "timed_out" : false,
- "number_of_nodes" : 1,
- "number_of_data_nodes" : 1,
- "active_primary_shards" : 1,
- "active_shards" : 1,
- "relocating_shards" : 0, // 重新定位的分片
- "initializing_shards" : 0, // 初始化中的分片
- "unassigned_shards" : 1, // 未分配的分片
- "delayed_unassigned_shards": 0,
- "number_of_pending_tasks" : 0,
- "number_of_in_flight_fetch": 0,
- "task_max_waiting_in_queue_millis": 0,
- "active_shards_percent_as_number": 50.0
- }
复制代码 10.别名切换 - POST /_aliases
- {
- "actions": [
- { "remove": { "index": "online_index", "alias": "my_index" }},
- { "add": { "index": "new_index", "alias": "my_index" }}
- ]
- }
复制代码 11.运行在线索引 (从kafka里面读取数据)
new_index 开始从kafka里面消费最新数据。由于之前的操作可能会有延时,需要等待几分钟才能同步到最新数据。
12.删除旧的索引
删除old_index
详细代码步骤如下思考
如果只是简单地新建索引,完全可以这样做(使用不同的消费组)
1.记录时间戳
2.全量索引数据的数据
3.根据前面的时间戳找到kafka中的下标,下标得时间戳必须 < 记录的时间戳
4.根据上一步的下标开始索引数据
D.使用新集群进行业务测试
部署新的客户端服务调用新的es集群,检查业务是否正常。对站内查询检查搜索结果是否一致,对统计类查询查看统计结果是否一致。
E.发布线上客户端搜索代码,修改es地址为新集群地址
上线,观察业务是否稳定。
F.下线旧的es集群
释放旧的es集群的资源。
4.总结
es升级这份工作是两年之前做的,现在来进行总结,部分细节可能会有疏漏。但是总结起来,依然后很多收获,从架构,代码细节上都有改进的空间。es重建代码可以做得更通用,然后开源出来。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |