MyScale vs. Elasticsearch:高效升级和替代方案

向量数据库是设计为专门用于存储和管理向量数据,在许多人工智能应用中发挥着关键作用,如语义文本搜索和图像搜索。虽然传统的词项匹配和 BM25 算法在文本检索中仍然具有重要意义,但广泛采用的 Elasticsearch 系统最近也增加了向量搜索功能,而开源高性能 SQL 向量数据库 MyScaleDB 最近也引入了全文检索功能。

在本文中,我们展示了 MyScaleDB 在全文搜索性能方面与 Elasticsearch 不相上下,同时实现了更低的延迟和40%的内存利用率。此外,当结合向量搜索时,MyScaleDB 的性能提高了10倍,而成本仅为原来的12%。凭借其高性能、低成本以及基于 ClickHouse 的丰富 SQL 生态系统,MyScaleDB 成为 Elasticsearch 的高效升级和强大的替代方案。

Elasticsearch 介绍

Elasticsearch 是一个分布式 RESTful 风格的搜索和分析引擎,基于 Apache Lucene 构建,可以快速地存储、搜索和分析大量数据,广泛应用于日志分析、应用搜索、安全分析、业务分析等领域。
Elasticsearch 具有以下优势:

  1. 强大的搜索能力:Elasticsearch 提供了强大的全文搜索功能,包括对精确值、全文检索和向量搜索,以及复杂的查询、过滤和聚合操作,使用户能够快速准确地检索所需信息。
  2. 丰富的功能:Elasticsearch 提供了丰富的功能和灵活的配置选项,例如文本分析、聚合分析和地理空间搜索等,以满足各种不同的搜索和分析需求。
  3. 丰富的生态系统:Elasticsearch 生态系统庞大,包括各种插件、工具和第三方集成,可以扩展其功能和应用场景,为用户提供更多选择和灵活性。
  4. 分布式架构:作为一个分布式系统,Elasticsearch 可以轻松地扩展到多个节点,实现高可用性和横向扩展,使其适用于大规模的数据处理和分析任务。
  5. 实时数据处理:Elasticsearch 支持实时数据的索引和搜索,可以快速地处理大量的实时数据,并提供即时的查询结果。

然而,Elasticsearch 仍存在一些不足,例如:

  1. 学习曲线陡峭:Elasticsearch 的学习曲线相对陡峭,特别是对于新手来说,需要花费一些时间来理解其复杂的概念和使用方法。
  2. 向量检索算法单一:截止目前 8.13 版本,Elasticsearch 在向量检索领域支持的算法有限,仅包括 brute-force kNN 和基于 HNSW 的 Approximate kNN 两种算法,这限制了其在复杂的向量检索场景下的应用。
  3. 资源占用较高:由于其强大的功能和分布式架构,Elasticsearch 在运行时需要相对较高的资源,包括内存、CPU 和存储空间等。

总的来说,Elasticsearch 在文本检索领域是一个强大的工具,但其在易用性、向量检索和资源利用等方向存在一些不足,在目前复杂的 AI 检索分析场景中存在一定的局限性。

Elasticsearch 首选替代方案:MyScale

MyScale AI 数据库基于开源的 SQL 列式存储数据库 ClickHouse 打造,自研高性能和高数据密度的向量索引算法,并针对 SQL 和向量的联合查询对检索和存储引擎进行了深度的研发和优化,是全球第一个综合性能和性价比大幅超越了专用向量数据库的 SQL 向量数据库产品。

原生兼容 SQL 与向量

MyScale 只需使用 SQL 即可与之交互,使其更易于使用且学习门槛较低,适合广大开发人员快速上手。MyScale 提供了灵活的数据模

[root@192 elasticsearch]# docker logs 69 OpenJDK 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release. [2025-08-13T14:03:30,792][WARN ][o.e.b.ElasticsearchUncaughtExceptionHandler] [unknown] uncaught exception in thread [main] org.elasticsearch.bootstrap.StartupException: java.lang.IllegalStateException: Failed to create node environment at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:140) ~[elasticsearch-6.5.4.jar:6.5.4] at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:127) ~[elasticsearch-6.5.4.jar:6.5.4] at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:86) ~[elasticsearch-6.5.4.jar:6.5.4] at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:124) ~[elasticsearch-cli-6.5.4.jar:6.5.4] at org.elasticsearch.cli.Command.main(Command.java:90) ~[elasticsearch-cli-6.5.4.jar:6.5.4] at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:93) ~[elasticsearch-6.5.4.jar:6.5.4] at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:86) ~[elasticsearch-6.5.4.jar:6.5.4] Caused by: java.lang.IllegalStateException: Failed to create node environment at org.elasticsearch.node.Node.<init>(Node.java:299) ~[elasticsearch-6.5.4.jar:6.5.4] at org.elasticsearch.node.Node.<init>(Node.java:265) ~[elasticsearch-6.5.4.jar:6.5.4] at org.elasticsearch.bootstrap.Bootstrap$5.<init>(Bootstrap.java:212) ~[elasticsearch-6.5.4.jar:6.5.4] at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:212) ~[elasticsearch-6.5.4.jar:6.5.4] at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:333) ~[elasticsearch-6.5.4.jar:6.5.4] at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:136) ~[elasticsearch-6.5.4.jar:6.5.4] ... 6 more Caused by: java.nio.file.AccessDeniedException: /usr/share/elasticsearch/data/nodes at sun.nio.fs.UnixException.translateToIOException(UnixException.java:90) ~[?:?] at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:111) ~[?:?] at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:116) ~[?:?] at sun.nio.fs.UnixFileSystemProvider.createDirectory(UnixFileSystemProvider.java:385) ~[?:?] at java.nio.file.Files.createDirectory(Files.java:689) ~[?:?] at java.nio.file.Files.createAndCheckIsDirectory(Files.java:796) ~[?:?] at java.nio.file.Files.createDirectories(Files.java:782) ~[?:?] at org.elasticsearch.env.NodeEnvironment.lambda$new$0(NodeEnvironment.java:270) ~[elasticsearch-6.5.4.jar:6.5.4] at org.elasticsearch.env.NodeEnvironment$NodeLock.<init>(NodeEnvironment.java:203) ~[elasticsearch-6.5.4.jar:6.5.4] at org.elasticsearch.env.NodeEnvironment.<init>(NodeEnvironment.java:267) ~[elasticsearch-6.5.4.jar:6.5.4] at org.elasticsearch.node.Node.<init>(Node.java:296) ~[elasticsearch-6.5.4.jar:6.5.4] at org.elasticsearch.node.Node.<init>(Node.java:265) ~[elasticsearch-6.5.4.jar:6.5.4] at org.elasticsearch.bootstrap.Bootstrap$5.<init>(Bootstrap.java:212) ~[elasticsearch-6.5.4.jar:6.5.4] at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:212) ~[elasticsearch-6.5.4.jar:6.5.4] at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:333) ~[elasticsearch-6.5.4.jar:6.5.4] at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:136) ~[elasticsearch-6.5.4.jar:6.5.4] ... 6 more
08-14
<think>我们有两个主要问题需要解决: 1. Docker中运行Elasticsearch时,由于宿主机目录权限不足导致的`java.nio.file.AccessDeniedException`错误。 2. 使用已弃用的GC选项(UseConcMarkSweepGC)的警告。 根据引用[1][2],我们知道错误原因是宿主机挂载目录的权限不足,导致容器内Elasticsearch进程无法写入数据目录。 解决方案步骤: 一、解决权限问题(宿主机目录权限) 1. 确保宿主机上用于挂载的目录(例如`/data/elasticsearch`)存在,并且具有合适的权限。 2. 由于Elasticsearch在容器内以`elasticsearch`用户运行(UID为1000),我们需要将宿主机目录的所有权改为UID 1000(或者使用其他方式确保该用户有写权限)。 二、更新GC配置(解决警告) 在Elasticsearch 7.x及以上版本中,建议使用G1GC替代已弃用的CMS。 三、调整Docker运行命令或Docker Compose配置,确保正确设置挂载目录JVM选项。 具体操作: 步骤1:在宿主机上创建数据目录并设置权限 ```bash # 创建目录(如果不存在) sudo mkdir -p /path/to/your/elasticsearch/data # 更改目录所有权给UID 1000(容器内elasticsearch用户的UID) sudo chown -R 1000:1000 /path/to/your/elasticsearch/data # 确保目录具有读写权限 sudo chmod -R 755 /path/to/your/elasticsearch/data ``` 步骤2:修改JVM配置(通过环境变量或挂载自定义jvm.options文件) 方法一:通过环境变量(推荐,简单) 在运行容器时,设置环境变量`ES_JAVA_OPTS`来覆盖GC设置: ```bash -e ES_JAVA_OPTS="-XX:+UseG1GC -XX:G1ReservePercent=25 -XX:InitiatingHeapOccupancyPercent=30" ``` 方法二:挂载自定义jvm.options文件 1. 在宿主机上创建一个自定义的jvm.options文件,例如`/path/to/config/jvm.options`,内容如下: ``` ## JVM configuration ## IMPORTANT: JVM heap size ## You should always set the min and max JVM heap ## size to the same value. For example, to set ## the heap to 4 GB, set: ## ## -Xms4g ## -Xmx4g ## ## See https://www.elastic.co/guide/en/elasticsearch/reference/current/heap-size.html ## for more information ## -Xms1g -Xmx1g ## G1GC Configuration -XX:+UseG1GC -XX:G1ReservePercent=25 -XX:InitiatingHeapOccupancyPercent=30 ## Prefer IPV4 -Djava.net.preferIPv4Stack=true ``` 2. 在运行容器时挂载这个文件: ```bash -v /path/to/config/jvm.options:/usr/share/elasticsearch/config/jvm.options.d/gc.options ``` 步骤3:运行Elasticsearch容器 使用Docker命令运行: ```bash docker run -d \ --name elasticsearch \ -p 9200:9200 \ -p 9300:9300 \ -e "discovery.type=single-node" \ -e ES_JAVA_OPTS="-XX:+UseG1GC -XX:G1ReservePercent=25 -XX:InitiatingHeapOccupancyPercent=30" \ -v /path/to/your/elasticsearch/data:/usr/share/elasticsearch/data \ docker.elastic.co/elasticsearch/elasticsearch:7.17.10 ``` 或者使用Docker Compose(推荐): 创建`docker-compose.yml`文件: ```yaml version: '3.8' services: elasticsearch: image: docker.elastic.co/elasticsearch/elasticsearch:7.17.10 container_name: elasticsearch environment: - discovery.type=single-node - ES_JAVA_OPTS=-XX:+UseG1GC -XX:G1ReservePercent=25 -XX:InitiatingHeapOccupancyPercent=30 volumes: - /path/to/your/elasticsearch/data:/usr/share/elasticsearch/data ports: - 9200:9200 - 9300:9300 ulimits: memlock: soft: -1 hard: -1 networks: - es-net networks: es-net: driver: bridge ``` 步骤4:启动容器 ```bash docker-compose up -d ``` 步骤5:验证 检查容器日志: ```bash docker logs elasticsearch ``` 应该不再出现权限错误CMS弃用警告。 访问Elasticsearch: ```bash curl http://localhost:9200 ``` 总结: 1. 宿主机目录权限问题:确保挂载目录的UID为1000(或适当权限)。 2. GC警告:通过环境变量或自定义jvm.options文件配置G1GC。 参考引用: [^1]: 错误日志显示`java.nio.file.AccessDeniedException`,通常由宿主机挂载目录权限不足导致。 [^2]: 宿主机目录权限不足会导致容器内无法写入,需要正确设置宿主机目录权限。 如果问题仍然存在,请检查SELinux或AppArmor等安全模块是否阻止了访问。 相关问题: 1. 如何调整Elasticsearch容器的内存限制? 2. Docker中如何运行Elasticsearch集群? 3. 如何备份恢复Elasticsearch数据?</think>### 解决 Docker 中 Elasticsearch 权限问题与 GC 警告 #### 问题核心原因分析 1. **权限问题** `java.nio.file.AccessDeniedException` 错误表明: - Elasticsearch 容器用户(UID 1000)无权访问宿主机挂载目录[^1][^2] - 宿主机目录权限不足导致容器内写入失败(错误日志具有误导性) 2. **GC 警告问题** `UseConcMarkSweepGC was deprecated` 是由于: - Elasticsearch 默认配置使用已弃用的 CMS 垃圾回收器 - JDK 9+ 版本中 CMS 已被标记为废弃 --- ### 完整解决方案(Docker 环境) #### 步骤 1:修复宿主机目录权限 ```bash # 创建数据目录(如果不存在) sudo mkdir -p /path/to/elasticsearch/data # 关键操作:授予 UID 1000 权限(Elasticsearch 容器用户) sudo chown -R 1000:1000 /path/to/elasticsearch/data # 验证权限 ls -ld /path/to/elasticsearch/data # 应显示 drwxr-xr-x 1000 1000 ``` #### 步骤 2:修正 Docker 运行命令 ```bash docker run -d \ --name elasticsearch \ -p 9200:9200 -p 9300:9300 \ -e "discovery.type=single-node" \ -e "ES_JAVA_OPTS=-Xms1g -Xmx1g -XX:+UseG1GC" \ # 关键:使用 G1GC 替代 CMS -v /path/to/elasticsearch/data:/usr/share/elasticsearch/data \ # 绑定修复后的目录 docker.elastic.co/elasticsearch/elasticsearch:7.17.10 # 指定版本 ``` #### 步骤 3:验证容器状态 ```bash # 检查容器是否运行 docker ps -a | grep elasticsearch # 查看启动日志(确认无错误) docker logs --tail 50 elasticsearch ``` #### 步骤 4:可选自定义配置 创建自定义 `jvm.options` 文件: ```ini ## /path/to/config/jvm.options -Xms2g -Xmx2g -XX:+UseG1GC -XX:G1ReservePercent=25 -XX:InitiatingHeapOccupancyPercent=30 ``` 运行命令添加挂载: ```bash -v /path/to/config/jvm.options:/usr/share/elasticsearch/config/jvm.options.d/gc.options ``` --- ### 关键配置说明 | 配置项 | 作用 | 推荐值 | |--------|------|--------| | `chown 1000:1000` | 授予容器用户权限 | 必需 | | `-e ES_JAVA_OPTS` | 设置 JVM 参数 | `-XX:+UseG1GC` | | 数据目录权限 | 宿主机目录所有权 | `uid:gid = 1000:1000` | | 安全模块 | 禁用 SELinux/AppArmor | `setenforce 0` (临时) | > **重要提示**:Elasticsearch 容器使用固定 UID 1000 运行,宿主机目录必须匹配此 UID[^1][^2] --- ### 验证成功标准 1. 日志无权限错误: ```log [INFO ] [o.e.n.Node] [node-1] initialized [INFO ] [o.e.g.GatewayService] [node-1] recovered [0] indices ``` 2. API 响应正常: ```bash curl http://localhost:9200 # 应返回包含 "cluster_name" 的 JSON ``` 3. 无 GC 警告: ```log OpenJDK 64-Bit Server VM warning: ... # 此警告应消失 ``` ### 故障排查流程图 ```mermaid graph TD A[启动失败] --> B{查看日志} B -->|AccessDeniedException| C[检查宿主机目录权限] C -->|权限正确| D[检查SELinux/AppArmor] C -->|权限错误| E[chown 1000:1000] D -->|安全模块阻止| F[临时禁用并测试] D -->|无问题| G[检查磁盘空间] ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值