Elasticsearch部署遇到的那些坑

本文介绍了一个项目中使用Elasticsearch与MongoDB集成的经验,包括安装配置、增量导入及遇到的问题解决方法,如远程连接、oplog大小调整及大文档处理。

最近一个项目要求部署Elasticsearch+mongdb,感觉是一个比较简单的事,却遇到了不少的坑。客户的数据库有5万多条数据,大小共60多G的文档。
先说明步骤:
1、安装Elasticsearch和elasticsearch-river-mongodb,就不多说了,按照随下官方说明安装即可(https://github.com/richardwilly98/elasticsearch-river-mongodb/wiki)。
2、增量导入
先导入30%文档到mongodb,然后启动Elasticsearch服务,通过river插件自动同步到Elasticsearch服务器。
完成后,再导入30%文档到mongodb,这时候不需要关闭Elasticsearch,让它自动同步。
一直增量导入,直到完成。
遇到的坑
1、不能连接远程mongodb。
原来之前mongodb初始化副本集都是本地模式,如下图 : 127.0.0.1一定要换成具体IP,否则远程不能连接。
rs.initiate({“_id” : “rs0”,”members” : [{“_id” : 0,”host” : “127.0.0.1:27017”}]})

2、第一次初始化ES时很顺利,再次增量时,报River out of sync with oplog.rs collection。
由于mongodb oplog大小太小。官方建议100MB,如果硬盘足够,可以扩展到10-20G,修改oplog大小,百度一下 。

3、每次同步到某个文档时,就失败,具体错误忘了,应该也是内存溢出之类的。
后来发现,文档中居然有3G多的文档,这个文档肯定同步不到Elasticsearch里。只有修改river的源码了 ,修改org.elasticsearch.river.mongodb.util.MongoDBHelper.serialize()方法,增加大小判断,如果大于50MB,就不同步内容到Elasticsearch。重新编译并拷贝到Elasticsearch插件里。

Long maxLength=50000000L;
if(file.getLength()<maxLength){
            try (InputStream stream = file.getInputStream()) {
                while ((nRead = stream.read(data, 0, data.length)) != -1) {
                    buffer.write(data, 0, nRead);
                }
                buffer.flush();
            }
            encodedContent=Base64.encodeBytes(buffer.toByteArray());
            buffer.close();
}
Elasticsearch 9.x 集群部署可结合 Docker Compose 在多台机器上进行,以下是详细步骤: ### 环境准备 - **硬件资源**:需要三台服务器或三台虚拟机。 - **镜像**:准备 Elasticsearch 9.x 镜像(官方 Bitnami 镜像)和 Kibana 9.x 镜像(官方 Bitnami 镜像)。 - **软件**:确保 Docker 和 Docker Compose 已安装。 - **网络**:各节点网络可互通,示例节点 IP 如下: - es01:192.168.18.191 - es02:192.168.18.190 - es03:192.168.18.197 [^1] ### 配置文件设置 虽然没有直接给出 Elasticsearch 9.x 的配置文件示例,但可参考 Elasticsearch 7.x 的配置思路进行设置: ```yaml # 集群名称,多个 es 服务的集群名称要一致 cluster.name: cluster-es-prod # 当前 es 的节点名称,多个 es 服务的节点名称不要一致 node.name: node-es01 # 指定本机非回环地址(非 127.0.0.1),配置了后 es 会认为服务运行在生产环境 network.host: 192.168.18.191 # 集群所有节点,写 es 集群节点的 hostname,没有配置,写 ip:port 也可 discovery.seed_hosts: ["192.168.18.191:9300", "192.168.18.190:9300", "192.168.18.197:9300"] # es 暴露对外的端口 http.port: 9200 # 指定 API 端户端调用端口 transport.tcp.port: 9300 # 集群初始化能够参选的节点信息 cluster.initial_master_nodes: ["192.168.18.191:9300", "192.168.18.190:9300", "192.168.18.197:9300"] # 开启跨域访问支持,默认为 false http.cors.enabled: true # 跨域访问允许的域名, 允许所有域名 http.cors.allow-origin: "*" ``` 注:上述配置中的 IP 和节点名称需根据实际情况在不同节点上进行修改。 ### 部署步骤 使用 Docker Compose 部署 Elasticsearch 9.x 集群并集成 Kibana,结合环境准备和配置文件设置,在各节点上完成相应操作,构建出高可用、具备数据冗余的 Elasticsearch 9.x 集群。具体的 Docker Compose 文件编写和部署过程中遇到的及解决办法可参考相关文档进一步完善 [^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值