首先需要安装docker,这里就略过了
在第一台机器上创建 docker-compose.yml 文件内容如下:
services:
es:
image: docker.elastic.co/elasticsearch/elasticsearch:7.16.2
container_name: es
environment:
- bootstrap.memory_lock=true
- xpack.security.enabled=false
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- /path/to/es/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
- /path/to/es/data:/usr/share/elasticsearch/data
- /path/to/es/log:/usr/share/elasticsearch/log
- /path/to/es/plugins:/usr/share/elasticsearch/plugins
ports:
- "9200:9200"
- "9300:9300"
networks:
- esnet
networks:
esnet:
driver: bridge
映射的配置文件如下:
# 指定集群名称3个节点必须一致
cluster.name: es-cluster
#指定节点名称,每个节点名字唯一
node.name: node-1
#是否有资格为master节点,默认为true
node.master: true
#是否为data节点,默认为true
node.data: true
# 绑定ip,开启远程访问,可以配置0.0.0.0
network.host: 0.0.0.0
# 如果是多台机器,需要指定本机IP
network.publish_host: 192.168.177.131
#指定web端口
http.port: 9200
#指定tcp端口
transport.tcp.port: 9300
#用于节点发现
discovery.seed_hosts: ["192.168.177.131", "192.168.177.132", "192.168.177.133"]
#7.0新引入的配置项,初始仲裁,仅在整个集群首次启动时才需要初始仲裁。
#该选项配置为node.name的值,指定可以初始化集群节点的名称
cluster.initial_master_nodes: ["node-1","node-2","node-3"]
#解决跨域问题
http.cors.enabled: true
http.cors.allow-origin: "*"
另外的两台机器也一样
记得更换 node.name,每个节点唯一
cluster.name 集群唯一,也就是三台机器保持一致
在 Docker Compose 文件中,ulimits
部分用于设置容器内进程的用户限制(user limits),这些限制与操作系统级别的资源限制相对应。ulimits
允许你调整容器内进程可以使用的资源量,比如文件描述符的数量、内存锁定的大小等。
对于ulimits
配置:
ulimits: | |
memlock: | |
soft: -1 | |
hard: -1 |
这里,memlock
指的是内存锁定(memory locking)的限制。内存锁定是一种机制,允许进程将其部分或全部地址空间锁定在物理内存中,防止它们被交换(swapping)到磁盘上的交换空间(swap space)。这对于需要高性能和稳定延迟的应用程序(如数据库和搜索引擎)来说非常重要,因为它们依赖于快速访问内存中的数据。
-
soft
指的是软限制(soft limit),它是操作系统警告进程在超过此限制时应该采取行动的阈值。然而,在这个上下文中,将soft
设置为-1
通常意味着没有软限制,或者软限制被设置为尽可能大(尽管-1
在某些上下文中可能表示“无限制”,但在ulimits
的上下文中,它实际上被解释为容器可以使用的最大可能值,这取决于宿主机的限制)。 -
hard
指的是硬限制(hard limit),它是进程可以设置的资源使用的绝对上限。将hard
设置为-1
在这里同样意味着没有硬限制,或者硬限制被设置为尽可能大。然而,需要注意的是,-1
在这个上下文中可能不会被所有系统或工具直接解释为“无限制”,而是需要依赖于具体的实现和解释。实际上,在许多系统中,硬限制通常有一个最大值,而不是无限制的。
对于 memlock
来说,将 soft
和 hard
都设置为 -1
(或尽可能大的值)是为了允许 Elasticsearch 容器锁定尽可能多的内存,从而避免其内存被交换到磁盘上,这有助于提高性能和稳定性。然而,需要注意的是,这样做可能会增加宿主机的内存压力,因为 Elasticsearch 容器将尝试使用尽可能多的内存,而不管宿主机的其他需求如何。因此,在设置这些限制时应该谨慎,并确保宿主机有足够的内存来满足所有运行中的容器和应用程序的需求。
在 docker-compose.yml 文件对应文件下面执行命令
docker compose up -d
报错1:lasticsearchException[failed to bind service]; nested: AccessDeniedException[/usr/share/elasticsearch/data/nodes]........
表示权限不足,出现 AccessDeniedException
错误通常意味着 Docker 容器中的 Elasticsearch 进程没有足够的权限去访问或修改指定的目录。在上面情况中,Elasticsearch 试图在 /usr/share/elasticsearch/data/nodes
下创建目录,但由于权限问题而失败。这个问题通常与 Docker 容器使用的用户权限和宿主机上目录的权限设置有关。
可以修改宿主机目录权限来解决
确保宿主机上的 /path/to/es/data
目录具有适当的权限,允许 Docker 容器内的用户(通常是 elasticsearch
或 root
)访问和修改。可以尝试设置该目录的权限为更宽松的值,比如:
sudo chown -R 1000:1000 /path/to/es/data | |
sudo chmod -R 777 /path/to/es/data |
注意:这里使用 1000:1000
是因为 Elasticsearch 官方镜像默认使用 UID 和 GID 为 1000 的用户。但是,使用 777
权限可能带来安全风险,仅作为测试使用。在生产环境中,应该确保只有必要的用户和组有权访问这些目录。
我这里就采用第一个了:sudo chown -R 1000:1000 /path/to/es/data
如果还是报错,清一下缓存再启动
docker compose down
docker compose up -d
错误2:ERROR: [1] bootstrap checks failed. You must address the points described in the following [1] lines before starting Elasticsearch.
bootstrap check failure [1] of [1]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
这个错误是由于 Elasticsearch 对虚拟内存区域(virtual memory areas)的数量有限制,而当前系统的 vm.max_map_count
设置太低,无法满足 Elasticsearch 的需求。Elasticsearch 需要大量的内存映射区域来优化其性能,特别是在处理大数据集时。
要解决这个问题,需要增加 vm.max_map_count
的值。这个设置通常需要在宿主机的操作系统上进行修改,因为它是一个系统级别的限制。以下是如何在 Linux 系统上修改这个设置的步骤:
-
临时修改(重启后失效):
你可以通过运行以下命令来临时增加vm.max_map_count
的值(以 root 用户执行):sudo sysctl -w vm.max_map_count=262144
这个命令会立即生效,但重启后设置会丢失。
-
永久修改:
要永久修改这个值,你需要在/etc/sysctl.conf
文件中添加一行配置,或者在/etc/sysctl.d/
目录下创建一个新的配置文件(如99-elasticsearch.conf
),并在其中添加以下行:vm.max_map_count=262144
添加后,运行
sudo sysctl --system
或重启系统来应用更改。
我这里采用永久修改。
报错3:
出现这个错误,看一下配置中 network.publish_host: 192.168.177.131 是不是2忘记加了,加上之后重新启动就好了
最后使用 http://192.168.177.131:9200/_cat/nodes?v 验证:
或者 http://192.168.177.133:9200/_nodes/stats?pretty 查看:
到这里 docker 部署 es 集群就结束啦!!!