一、配置ES
详细步骤 下载es:https://www.elastic.co/cn/downloads/past-releases/
我选择的是7.6.2,注意es与jdk的版本
或者直接命令行输入:
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.6.2-
然后解压
tar -xzf elasticsearch-7.6.2-linux-x86_64.tar.gz
现在启动es
./bin/elasticsearch
有JSON日志输出,说明es启动成功!!!
在虚拟机中使用node1节点克隆出node2 和 node3
至此,es集群搭建完成!!!
二、集群配置
打开es的配置文件
配置如下
node1节点配置
cluster.name: elastic node.name: node1 #node.roles: [] network.host: 192.168.193.129 bootstrap.memory_lock: true // 生产环境务必配置 #path.data: // 生产环境务必配置到和es不同的目录下 #path.logs: // 生产环境务必配置到和es不同的目录下 http.port: 9201 transport.port: 9301 discovery.seed_hosts: ["192.168.193.129:9301","192.168.193.130:9302","192.168.193.131:9303"] cluster.initial_master_nodes: ["node1"]
node2节点配置
cluster.name: elastic
node.name: node2
#node.roles: []
network.host: 192.168.193.130
bootstrap.memory_lock: true // 生产环境务必配置
#path.data: // 生产环境务必配置到和es不同的目录下
#path.logs: // 生产环境务必配置到和es不同的目录下
http.port: 9202
transport.port: 9302
discovery.seed_hosts: ["192.168.193.129:9301","192.168.193.130:9302","192.168.193.131:9303"]
cluster.initial_master_nodes: ["node1"]
node.name: node2
node3节点配置
cluster.name: elastic node.name: node3 #node.roles: [] network.host: 192.168.193.131 bootstrap.memory_lock: true // 生产环境务必配置 #path.data: // 生产环境务必配置到和es不同的目录下 #path.logs: // 生产环境务必配置到和es不同的目录下 http.port: 9203 transport.port: 9303 discovery.seed_hosts: ["192.168.193.129:9301","192.168.193.130:9302","192.168.193.131:9303"] cluster.initial_master_nodes: ["node1"]
分别启动三个节点服务
-
cluster.name: 这个参数定义了Elasticsearch集群的名称。确保所有想要加入同一集群的节点配置相同的集群名称。在您的配置中,所有节点都设置为
elastic
,表示它们属于同一个名为elastic
的集群。 - node.name: 指定单个节点的名称,用于标识集群中的不同节点。在您的例子中,分别设为
node1
、node2
、node3
,方便管理和识别。 - network.host: 配置节点监听的网络地址。这里是各节点的IP地址,确保节点间可以相互通信。
- bootstrap.memory_lock: 当设置为
true
时,尝试锁定Elasticsearch进程使用的内存,防止操作系统交换内存,这对于生产环境中的稳定性和性能至关重要。这通常需要操作系统支持和相应的启动参数。 - http.port 和 transport.port: 分别指定了节点的HTTP接口端口和节点间通信的Transport端口。在您的配置中,分别为9201、9202、9200,确保这些端口在节点间不冲突,并且可从需要访问的地方访问。
- discovery.seed_hosts: 这个配置项列出了集群中用于发现其他节点的初始主机列表。在启动时,Elasticsearch会尝试连接这些种子节点以发现集群的其他成员。您为每个节点都配置了所有节点的IP和对应的transport端口。
-
cluster.initial_master_nodes: 在Elasticsearch 7.x及更高版本中,此配置用于指定集群启动时的初始主节点列表,用于防止脑裂情况。您为所有节点都指定了
["node1"]
作为初始主节点列表,这意味着在集群首次启动或完全重启时,只有名为node1
的节点被允许成为主节点。通常,如果所有节点都可以成为主节点,这里应列出所有预期的主节点名称。
可以看到三个node都添加进去,至此es集权搭建完成
当Elasticsearch集群中的一台节点(比如B服务器)关机后,再重新启动,其数据同步行为取决于几个因素:
- 数据复制策略:Elasticsearch通过分片和副本机制保证数据的高可用性。每个主分片(primary shard)都有一个或多个副本分片(replica shard),分布在不同的节点上。如果B服务器上有副本分片,在它离线期间,写入操作仍可以在其他副本上成功执行,当B服务器重新上线后,缺失的数据会从主分片或者其他活跃的副本分片自动同步过来,完成数据恢复。
- 集群健康状态:在B服务器离线期间,集群可能会因失去足够的主分片副本而影响其健康状态。如果B服务器上托管了任何主分片,这部分数据在它离线时将无法写入或更新。一旦B服务器重新加入集群,Elasticsearch会尝试恢复这些主分片到正常状态,如果有必要,还会重新分配副本分片以维持预定的副本数量。
- 集群自平衡:Elasticsearch具有自动平衡功能,可以自动管理和重新分配分片,以优化数据分布和查询性能。当B服务器重新加入集群后,如果之前因它离线导致数据分布不均,系统会自动触发再平衡过程,这可能包括移动分片以恢复最佳的分布状态。
-
节点恢复设置:Elasticsearch节点在启动时会尝试从磁盘恢复最近的状态,包括事务日志中的未确认操作,以确保数据一致性。这意味着如果B服务器上的数据在关机前是最新且一致的,重新启动后通常不需要从其他节点大量同步数据,除非有新的写操作在其离线期间发生。
服务器重新启动后,数据会根据集群当前的状态和配置自动进行同步和恢复,以确保数据的完整性和集群的健康状态。不过,为了最小化数据不一致的风险和恢复时间,建议在计划维护或预期停机期间,采取适当的措施,比如避免重要数据写入或暂时调整副本策略。
理论上,你可以设置Elasticsearch集群包含任意数量的节点,包括只设置2个节点的集群。然而,这样的配置并不推荐用于生产环境,原因在于以下几点:
1. **容错性**:Elasticsearch推荐至少有3个主节点(最好是奇数个)以避免所谓的“脑裂”(split-brain)现象。脑裂发生在集群分裂为两个独立部分时,每个部分都足以形成多数派,从而可能导致数据不一致。通过设置`discovery.zen.minimum_master_nodes`参数为`(number_of_master_eligible_nodes / 2) + 1`,可以防止这种情况发生。在只有两个节点的集群中,如果一个节点失败,就不存在多数派,无法选举出新的主节点。
2. **高可用性**:如果集群只有两个节点,并且其中之一是主节点同时持有数据(在较小集群中常见),那么当这个节点故障时,整个集群将无法处理写操作,也无法进行完整的故障恢复,直到该节点恢复。
尽管可以配置只有两个节点的集群,但这样做会显著降低系统的稳定性和可靠性。在生产环境中,至少需要3个节点来维持基本的高可用性和容错性。如果资源有限,可以考虑将某些节点设置为既是主节点也是数据节点,但依然建议遵循至少3个节点的指导原则。对于开发或测试环境,2个节点的集群可能足够使用,但在规划生产环境时应遵循最佳实践。