无法启动 cassandra:无法锁定 JVM 内存 (ENOMEM)

Unable to start cassandra : Unable to lock JVM memory (ENOMEM)

我正在尝试使用 docker-compose 启动一个 cassandra 容器。我正在从我的 macbook 终端发出以下命令。

docker-compose -f src/main/docker/cassandra.yml up 

我的cassandra.yml文件在下面

version: '2'
services:
    primecast-cassandra:
        image: cassandra:3.9
        # volumes:
        #     - ~/volumes/jhipster/primecast/cassandra/:/var/lib/cassandra/data
        ports:
            - 7000:7000
            - 7001:7001
            - 7199:7199
            - 9042:9042
            - 9160:9160
    primecast-cassandra-migration:
        extends:
            file: cassandra-migration.yml
            service: primecast-cassandra-migration
        environment:
            - CREATE_KEYSPACE_SCRIPT=create-keyspace.cql

然而,当我 运行 docker-compose 命令启动 cassandra 服务时,我在终端上收到一些警告并最终停止。

    primecast-cassandra_1            | WARN  14:33:45 Unable to lock JVM memory (ENOMEM). 

This can result in part of the JVM being swapped out, especially with mmapped I/O enabled.  Increase RLIMIT_MEMLOCK or run Cassandra as root.

如果您能提供帮助,我们将不胜感激 谢谢

本质上,此消息告诉您需要为特定用户的锁定内存上的 Linux 系统资源限制指定 memlock unlimited。根据 documentation on recommended production settings,解决此问题的正常(非 Docker)方法是调整 /etc/security/limits.conf 文件(或等效文件):

cassandra - memlock unlimited

在上面的例子中,cassandra是Cassandra在运行下的用户。如果您是 运行 Cassandra 的另一个用户,则需要相应地更改它或只使用星号 (*) 为所有用户强制执行该设置。例如:

* - memlock unlimited

在这种情况下 Docker Compose v2ulimits 应该是服务配置下的有效条目。将 memlock 设置为 -1,这样软限制和硬限制都是“无限制”的:

primecast-cassandra:
    image: cassandra:3.9
    ulimits:
        memlock: -1
    ports: