elasticsearch,nest,elasticsearch-7,C#,elasticsearch,Nest,Elasticsearch 7" /> elasticsearch,nest,elasticsearch-7,C#,elasticsearch,Nest,Elasticsearch 7" />

C# 避免ElasticSearch错误503服务器不可用:使用WaitForStatus

C# 避免ElasticSearch错误503服务器不可用:使用WaitForStatus,c#,elasticsearch,nest,elasticsearch-7,C#,elasticsearch,Nest,Elasticsearch 7,当我启动我的程序时,我运行ElasticSearch服务并检查是否存在索引以及是否存在任何文档,假设我只运行ES服务,我有以下两个功能: public ElasticClient getElasticSearchClient() { ConnectionSettings connectionSettings = new Nest.ConnectionSettings(new Uri("http://localhost:9200"))

当我启动我的程序时,我运行ElasticSearch服务并检查是否存在索引以及是否存在任何文档,假设我只运行ES服务,我有以下两个功能:

public ElasticClient getElasticSearchClient()
{
    ConnectionSettings connectionSettings = new Nest.ConnectionSettings(new Uri("http://localhost:9200"))
                                                    .DefaultIndex("myindex")
                                                    .DisableDirectStreaming();
    ElasticClient client = new ElasticClient(connectionSettings);
    //var health = client.Cluster.Health("myindex", a => (a.WaitForStatus(WaitForStatus.Yellow)).Timeout(50));
    return client;
}

public void checkElasticsearchIndex()
{
    var client = getElasticSearchClient();

    var health = this.client.Cluster.Health("myindex", a => (a.WaitForStatus(WaitForStatus.Yellow)));

    CountResponse count = client.Count<myobject>();

    if (!client.Indices.Exists("myindex").IsValid || count.Count == 0)
    {
        BulkWriteAllToIndexES(client);
    }
}
public ElasticClient getElasticSearchClient()
{
ConnectionSettings ConnectionSettings=新嵌套。ConnectionSettings(新Uri(“http://localhost:9200"))
.DefaultIndex(“myindex”)
.DisableDirectStreaming();
ElasticClient=新的ElasticClient(连接设置);
//var health=client.Cluster.health(“myindex”,a=>(a.WaitForStatus(WaitForStatus.Yellow)).Timeout(50));
返回客户;
}
public void checkElasticsearchIndex()
{
var client=getElasticSearchClient();
var health=this.client.Cluster.health(“myindex”,a=>(a.WaitForStatus(WaitForStatus.Yellow));
CountResponse count=client.count();
如果(!client.index.Exists(“myindex”).IsValid | | count.count==0)
{
BulkWriteAllotIndexes(客户端);
}
}
在checkElasticsearchIndex函数中

  • 计数操作失败,并显示以下错误消息:

    OriginalException:Elasticsearch.Net.ElasticsearchClientException:远程服务器返回错误:(503)服务器不可用。。调用:状态代码503来自:GET/myindex/\u count。ServerError:Type:search\u phase\u execution\u异常原因:“所有碎片失败”-->System.Net.WebException:远程服务器返回错误:(503)服务器不可用

  • 健康也会失败:

    OriginalException:Elasticsearch.Net.ElasticsearchClientException:无法连接到远程服务器。调用:状态代码未知,来自:GET/\u cluster/health/myindex?等待\u Status=yellow-->System.Net.WebException:无法连接到远程服务器---->System.Net.Sockets.SocketException:无法建立连接,因为目标计算机主动拒绝它127.0.0.1:9200

  • 正如您所看到的,我尝试了WaitForStatus集群,但没有成功


    我的问题:有没有办法等到客户机/群集/节点准备就绪,而不出现任何异常?

    听起来像是在启动程序的同时启动Elasticsearch过程,但Elasticsearch需要比程序更长的时间才能准备就绪

    如果是这样的话,您可能会对使用.NET客户端用于针对Elasticsearch的集成测试感兴趣。抽象读取Elasticsearch过程的输出,以了解它何时准备就绪,并阻塞直到发生这种情况。他们正在(计划将来将其发布给Nuget)

    有。对于单个节点,它类似于

    using System;
    using Elastic.Managed.Configuration;
    using Elastic.Managed.ConsoleWriters;
    using Elastic.Managed.FileSystem;
    
    namespace Elastic.Managed.Example
    {
        class Program
        {
            static void Main(string[] args)
            {
                var version = "7.5.1";
                var esHome = Environment.ExpandEnvironmentVariables($@"%LOCALAPPDATA%\ElasticManaged\{version}\elasticsearch-{version}");
    
                using (var node = new ElasticsearchNode(version, esHome))
                {
                    node.SubscribeLines(new LineHighlightWriter());
                    if (!node.WaitForStarted(TimeSpan.FromMinutes(2))) throw new Exception();
    
                    // do your work here
                }
            }
        }
    }
    
    这假设Elasticsearch 7.5.1 zip已经下载,并且存在于
    %LOCALAPPDATA%\ElasticManaged\7.5.1\Elasticsearch-7.5.1
    。还有更复杂的问题

    您可以下载、配置和运行Elasticsearch

    var plugins = new ElasticsearchPlugins(ElasticsearchPlugin.RepositoryAzure, ElasticsearchPlugin.IngestAttachment);
    var config = new EphemeralClusterConfiguration("7.5.1", ClusterFeatures.XPack, plugins, numberOfNodes: 1);
    using (var cluster = new EphemeralCluster(config))
    {
        cluster.Start();
    
        var nodes = cluster.NodesUris();
        var connectionPool = new StaticConnectionPool(nodes);
        var settings = new ConnectionSettings(connectionPool).EnableDebugMode();
        var client = new ElasticClient(settings);
    
        Console.Write(client.CatPlugins().DebugInformation);
    }
    

    听起来您在启动程序的同时启动Elasticsearch过程,但Elasticsearch需要比您的程序更长的时间才能准备就绪

    如果是这样的话,您可能会对使用.NET客户端用于针对Elasticsearch的集成测试感兴趣。抽象读取Elasticsearch过程的输出,以了解它何时准备就绪,并阻塞直到发生这种情况。他们正在(计划将来将其发布给Nuget)

    有。对于单个节点,它类似于

    using System;
    using Elastic.Managed.Configuration;
    using Elastic.Managed.ConsoleWriters;
    using Elastic.Managed.FileSystem;
    
    namespace Elastic.Managed.Example
    {
        class Program
        {
            static void Main(string[] args)
            {
                var version = "7.5.1";
                var esHome = Environment.ExpandEnvironmentVariables($@"%LOCALAPPDATA%\ElasticManaged\{version}\elasticsearch-{version}");
    
                using (var node = new ElasticsearchNode(version, esHome))
                {
                    node.SubscribeLines(new LineHighlightWriter());
                    if (!node.WaitForStarted(TimeSpan.FromMinutes(2))) throw new Exception();
    
                    // do your work here
                }
            }
        }
    }
    
    这假设Elasticsearch 7.5.1 zip已经下载,并且存在于
    %LOCALAPPDATA%\ElasticManaged\7.5.1\Elasticsearch-7.5.1
    。还有更复杂的问题

    您可以下载、配置和运行Elasticsearch

    var plugins = new ElasticsearchPlugins(ElasticsearchPlugin.RepositoryAzure, ElasticsearchPlugin.IngestAttachment);
    var config = new EphemeralClusterConfiguration("7.5.1", ClusterFeatures.XPack, plugins, numberOfNodes: 1);
    using (var cluster = new EphemeralCluster(config))
    {
        cluster.Start();
    
        var nodes = cluster.NodesUris();
        var connectionPool = new StaticConnectionPool(nodes);
        var settings = new ConnectionSettings(connectionPool).EnableDebugMode();
        var client = new ElasticClient(settings);
    
        Console.Write(client.CatPlugins().DebugInformation);
    }
    

    不用担心,需要让他们在nuget上起床:)不用担心,需要让他们在nuget上起床:)