Tomas
Tomas

Reputation: 514

Elastic Search Give an error No alive nodes found in your cluster

I am start working with elastic search.I successfully install elastic search on my server(Different from application server).But When I try to call Elatic search from my Application server it gives an error Fatal error: Uncaught exception 'Elasticsearch\Common\Exceptions\NoNodesAvailableException' with message 'No alive nodes found in your cluster'

When I check Elastic search status it shows Active.

How can I call elastic search from my Application server to my Elastic search server.

<?php
    require 'vendor/autoload.php';
    $hosts = [
       'ip_address:9200'         // IP + Port
    ];
    $client = Elasticsearch\ClientBuilder::create()->setHosts($hosts)->build();

    $params = [
        'index' => 'my_index',
        'type' => 'my_type',
        'id' => 'my_id',
        'body' => ['testField' => 'abc']
    ];

    $response = $client->index($params);
?>

My elasticsearch.yml Settings

    # ======================== Elasticsearch Configuration =========================
    #
    # NOTE: Elasticsearch comes with reasonable defaults for most settings.
    #       Before you set out to tweak and tune the configuration, make sure you
    #       understand what are you trying to accomplish and the consequences.
    #
    # The primary way of configuring a node is via this file. This template lists
    # the most important settings you may want to configure for a production cluster.
    #
    # Please see the documentation for further information on configuration options:
    # <http://www.elastic.co/guide/en/elasticsearch/reference/current/setup-configuration.html>
    #
    # ---------------------------------- Cluster -----------------------------------
    #
    # Use a descriptive name for your cluster:
    #
     cluster.name: my-application
    #
    # ------------------------------------ Node ------------------------------------
    #
    # Use a descriptive name for the node:
    #
     node.name: node-1
    #
    # Add custom attributes to the node:
    #
    # node.rack: r1
    #
    # ----------------------------------- Paths ------------------------------------
    #
    # Path to directory where to store the data (separate multiple locations by comma):
    #
    # path.data: /path/to/data
    #
    # Path to log files:
    #
    # path.logs: /path/to/logs
    #
    # ----------------------------------- Memory -----------------------------------
    #
    # Lock the memory on startup:
    #
    # bootstrap.memory_lock: true
    #
    # Make sure that the `ES_HEAP_SIZE` environment variable is set to about half the memory
    # available on the system and that the owner of the process is allowed to use this limit.
    #
    # Elasticsearch performs poorly when the system is swapping the memory.
    #
    # ---------------------------------- Network -----------------------------------
    #
    # Set the bind address to a specific IP (IPv4 or IPv6):
    #
    #network.host: 0.0.0.0
    #network.bind_host: 0
    #
    # Set a custom port for HTTP:
    #
    # http.port: 9200
    #
    # For more information, see the documentation at:
    # <http://www.elastic.co/guide/en/elasticsearch/reference/current/modules-network.html>
    #
    # --------------------------------- Discovery ----------------------------------
    #
    # Pass an initial list of hosts to perform discovery when new node is started:
    # The default list of hosts is ["127.0.0.1", "[::1]"]
    #
    # discovery.zen.ping.unicast.hosts: ["host1", "host2"]
    #
    # Prevent the "split brain" by configuring the majority of nodes (total number of nodes / 2 + 1):
    #
    # discovery.zen.minimum_master_nodes: 3
    #
    # For more information, see the documentation at:
    # <http://www.elastic.co/guide/en/elasticsearch/reference/current/modules-discovery.html>
    #
    # ---------------------------------- Gateway -----------------------------------
    #
    # Block initial recovery after a full cluster restart until N nodes are started:
    #
    # gateway.recover_after_nodes: 3
    #
    # For more information, see the documentation at:
    # <http://www.elastic.co/guide/en/elasticsearch/reference/current/modules-gateway.html>
    #
    # ---------------------------------- Various -----------------------------------
    #
    # Disable starting multiple nodes on a single system:
    #
    # node.max_local_storage_nodes: 1
    #
    # Require explicit names when deleting indices:
    #
    # action.destructive_requires_name: true

elasticsearch.yml settings which are not working

network.host: 127.0.0.1

network.host: 0

network.host: 0.0.0.0

network.host: IP_Address

network.bind_host: 0

network.bind_host: IP_Address

When I set the above settings then elasticsearch shows the failed status.

NOTE : Elastic search install on different server from my Application sever.

Upvotes: 15

Views: 98612

Answers (7)

Typewar
Typewar

Reputation: 983

This can happen with mismatch in versions between Elasticsearch-PHP and Elasticsearch. Documented in the Elasticsearch-php library github page explains the compatibilites between them: https://github.com/elastic/elasticsearch-php?tab=readme-ov-file#compatibility

The Elasticsearch client is compatible with currently maintained PHP versions.

Language clients are forward compatible; meaning that clients support communicating with greater or equal minor versions of Elasticsearch without breaking. It does not mean that the client automatically supports new features of newer Elasticsearch versions; it is only possible after a release of a new client version. For example, a 8.12 client version won't automatically support the new features of the 8.13 version of Elasticsearch, the 8.13 client version is required for that. Elasticsearch language clients are only backwards compatible with default distributions and without guarantees made.

Elasticsearch Version Elasticsearch-PHP Branch Supported
main main
8.x 8.x 8.x
7.x 7.x 7.17

Upvotes: 0

Fabien Haddadi
Fabien Haddadi

Reputation: 2080

As you know, S.O is also used as a keyword-based reference for the Community years later. Therefore I'm jumping in to add an important discovery I made about resolving this No alive nodes found in your cluster message: If you guys are trying to connect to ES Cloud using PHP for example, and are getting this exact message, whereas you've been following the Elasticsearch PHP Client > Connecting documentation section, and in particular, trying to connect via the CloudId:

$client = ClientBuilder::create()
   ->setElasticCloudId('<cloud-id>')
   ->setBasicAuthentication('<username>', '<password>')
   ->build();

Well you should try to add CA Bundle verification:

$caBundle = \Composer\CaBundle\CaBundle::getBundledCaBundlePath();
$client = ClientBuilder::create()
            ->setElasticCloudId($ES_CloudID)
            ->setSSLVerification($caBundle)
            ->setBasicAuthentication($ES_username, $ES_password)
            ->build();

I demonstrated that commenting out ->setSSLVerification($caBundle) makes the construction fail.

Upvotes: 1

Sanjay Goswami
Sanjay Goswami

Reputation: 858

Remove the trailing slash in elastic search. Sometimes it creates error.

Atleast in my case I removing the trailing slash from Amazon ES URL make it working.

Upvotes: 0

Ashish Tiwari
Ashish Tiwari

Reputation: 2277

I also facing the same problem. I was specified in host 'myhostaddress:9200'. Change it with IP of your Elasticsearch host server like '127.0.0.1:9200' . It resolve my problem.

Upvotes: 2

Mohd Bashir
Mohd Bashir

Reputation: 979

I have found this error and solved it by following steps:

  1. Comments the plugin setting on app/etc/env.php file.

    'system' => [
    'default' => [
      /* 'smile_elasticsuite_core_base_settings' => [
     'es_client' => [
      'servers' => 'node-1:9200,node-2:9200',
      'enable_https_mode' => '0',
      'enable_http_auth' => '0',
      'http_auth_user' => '',
      'http_auth_pwd' => ''
       ]
      ] */
     ]
    ]
    
  2. Start the server.

  3. upgrade magento

    php bin/magento setup:upgrade 
    

Upvotes: 2

Prakhar Sharma
Prakhar Sharma

Reputation: 23

Your answer can be found at the link I am providing https://forums.aws.amazon.com/thread.jspa?threadID=230626 I got the same problem but through this link it resolved, the answer which suggest attaching a suffix :443 at the end will work

Upvotes: 0

Tomas
Tomas

Reputation: 514

I found the error.Error is coming due to space before node.name and cluster.name.Remove the space and its working fine.

Updated elasticsearch.yml file

# ======================== Elasticsearch Configuration =========================
#
# NOTE: Elasticsearch comes with reasonable defaults for most settings.
#       Before you set out to tweak and tune the configuration, make sure you
#       understand what are you trying to accomplish and the consequences.
#
# The primary way of configuring a node is via this file. This template lists
# the most important settings you may want to configure for a production cluster.
#
# Please see the documentation for further information on configuration options:
# <http://www.elastic.co/guide/en/elasticsearch/reference/current/setup-configuration.html>
#
# ---------------------------------- Cluster -----------------------------------
#
# Use a descriptive name for your cluster:
#
cluster.name: my-application-shakedeal
#
# ------------------------------------ Node ------------------------------------
#
# Use a descriptive name for the node:
#
node.name: shakedeal-1
#
# Add custom attributes to the node:
#
# node.rack: r1
#
# ----------------------------------- Paths ------------------------------------
#
# Path to directory where to store the data (separate multiple locations by comma):
#
# path.data: /path/to/data
#
# Path to log files:
#
# path.logs: /path/to/logs
#
# ----------------------------------- Memory -----------------------------------
#
# Lock the memory on startup:
#
# bootstrap.memory_lock: true
#
# Make sure that the `ES_HEAP_SIZE` environment variable is set to about half the memory
# available on the system and that the owner of the process is allowed to use this limit.
#
# Elasticsearch performs poorly when the system is swapping the memory.
#
# ---------------------------------- Network -----------------------------------
#
# Set the bind address to a specific IP (IPv4 or IPv6):
#
network.host: 127.0.0.1
network.bind_host: IP_ADDRESS
#
# Set a custom port for HTTP:
#
# http.port: 9200
#
# For more information, see the documentation at:
# <http://www.elastic.co/guide/en/elasticsearch/reference/current/modules-network.html>
#
# --------------------------------- Discovery ----------------------------------
#
# Pass an initial list of hosts to perform discovery when new node is started:
# The default list of hosts is ["127.0.0.1", "[::1]"]
#
# discovery.zen.ping.unicast.hosts: ["host1", "host2"]
#
# Prevent the "split brain" by configuring the majority of nodes (total number of nodes / 2 + 1):
#
# discovery.zen.minimum_master_nodes: 3
#
# For more information, see the documentation at:
# <http://www.elastic.co/guide/en/elasticsearch/reference/current/modules-discovery.html>
#
# ---------------------------------- Gateway -----------------------------------
#
# Block initial recovery after a full cluster restart until N nodes are started:
#
# gateway.recover_after_nodes: 3
#
# For more information, see the documentation at:
# <http://www.elastic.co/guide/en/elasticsearch/reference/current/modules-gateway.html>
#
# ---------------------------------- Various -----------------------------------
#
# Disable starting multiple nodes on a single system:
#
# node.max_local_storage_nodes: 1
#
# Require explicit names when deleting indices:
#
# action.destructive_requires_name: true

PHP Code

 <?php
    require 'vendor/autoload.php';
    $indexParams = [
        'index' => 'my_index',
        'body' => [
            'settings' => [
                'number_of_shards' => 5,
                'number_of_replicas' => 1
            ]
        ]
    ];

    $client = Elasticsearch\ClientBuilder::create()
        ->setSSLVerification(false)
        ->setHosts(["IP_ADDRESS:9200"])->build();  
    $response = ''; 
    try {
        /* Create the index */
        $response = $client->indices()->create($indexParams);
        print_r($response);

        print_r($response);

    } catch(Exception $e) {
        echo "Exception : ".$e->getMessage();
    }
    die('End : Elastic Search');

?>

Success Response :

 Array
 (
    [acknowledged] => 1
 )

Upvotes: 3

Related Questions