Ошибка сломанной трубы при запросе от aerospike

у меня есть пространство имен "test" и установлено "demo" когда я запускаю "select * from test.demo" в терминале aql, я получаю эту ошибку. Что именно вызывает поломку трубы?

enter image description here

и я получил предупреждающее сообщение в журнале сервера ниже.

server log

а мой aerospike.conf:

service {
    paxos-single-replica-limit 1 # Number of nodes where the replica count is automatically reduced to 1.
    proto-fd-max 15000
}

logging {
    file /var/log/aerospike/aerospike.log {
            context any info
    }
}

network {
    service {
            address any
            port 3000
    }

    heartbeat {
            mode multicast
            multicast-group 239.1.99.222
            port 9918

            # To use unicast-mesh heartbeats, remove the 3 lines above, and see
            # aerospike_mesh.conf for alternative.

            interval 150
            timeout 10
    }

    fabric {
            port 3001
    }

    info {
            port 3003
    }
}

namespace test {
    replication-factor 2
    memory-size 4G
    default-ttl 30d # 30 days, use 0 to never expire/evict.

    storage-engine memory
}
namespace bar {
    replication-factor 2
    memory-size 4G
    default-ttl 30d # 30 days, use 0 to never expire/evict.

    storage-engine memory

    # To use file storage backing, comment out the line above and use the
    # following lines instead.
    #       storage-engine device {
    #               file /opt/aerospike/data/bar.dat
    #               filesize 16G
    #               data-in-memory true # Store data in memory in addition to file.
    #       }
}

кто-нибудь может выяснить причину?

aql использует клиент C. Ошибка -10 в клиенте C: AEROSPIKE_ERR_CONNECTION Ошибка синхронного подключения. Ошибка чтения сокета 11: ресурс временно недоступен - интересно, почему это происходит.

pgupta 11.04.2018 17:11

Может быть, что-нибудь интересное в логах сервера?

Meher 11.04.2018 23:11

@ Meher , привет, Meher, я только что получил предупреждение в журналах сервера, как показано ниже. 12 апреля 2018 г., 06:07:58 GMT: WARNING (proto): (proto.c: 693) ошибка отправки - fd 29 Broken pipe

Darian.miao 12.04.2018 08:11

Какой тайм-аут установлен в aql?

lvolmar 13.04.2018 22:51

@ Darian.miao, возможно ли, что в вашем пространстве имен есть много записей, с которыми не связан какой-либо набор? Это замедлит сканирование, которое вы выполняете, а затем приведет к тайм-ауту клиента. Но если у вас действительно есть только эти 2 записи в этих 2 наборах, тогда я не уверен, что может быть причиной этого ... можете ли вы показать общее количество записей, которые у вас есть в пространстве имен?

Meher 16.04.2018 23:48
2
5
454
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я думаю, вы получаете ошибку сокета при попытке отправить результат сканирования на сокет, для которого уже истекло время ожидания на стороне клиента.

Error: (-10) Socket read error: 11, [::1]:3000, 36006

По умолчанию тайм-аут aql установлен на 1000 мс.

Его можно увеличить до 100000 мс с помощью параметра командной строки -T. (или используя установленный тайм-аут в интерактивном режиме aql)

aql -T 100000

-T, --timeout <ms> Set the timeout (ms) for commands. Default: 1000 Эта опция эквивалентна установке TotalTimeout на другие клиенты.

Установка более высокого тайм-аута должна помочь, но не отвечает на вопрос, почему базовое сканирование займет так много времени.

Вот пример с настройкой разных тайм-аутов клиентов, он показывает тайм-аут клиентов до получения результата сканирования. В журналах вы увидите ошибку отправки TCP для сканирования.

WARNING (proto): (proto.c:693) send error - fd 32 Broken pipe

Подробности из консоли aql:

aql> set timeout 10
TIMEOUT = 10
aql> select * from test.demo
Error: (-10) Socket read error: 11, 127.0.0.1:3000, 58496

aql> select * from test.demo
Error: (-10) Socket read error: 115, 127.0.0.1:3000, 58498


aql> set timeout 100
TIMEOUT = 100
aql> select * from test.demo
Error: (-10) Socket read error: 115, 127.0.0.1:3000, 58492

aql> set timeout 1000
TIMEOUT = 1000
aql> select * from test.demo
+-----+-------+
| foo | bar   |
+-----+-------+
| 123 | "abc" |
+-----+-------+
1 row in set (0.341 secs)

По-прежнему остается загадкой, почему у вашего клиента aql был тайм-аут для возврата 1 записи, если тайм-аут по умолчанию был равен 1000 мс. Вы случайно не изменили тайм-аут. Или иметь огромное количество записей в пространстве имен test с нулевыми наборами.

AQL - это интерактивное приложение C. Тайм-аут AQL предназначен только для ограничения вывода AQL, если вы выполните «select * ...» для огромного набора данных. Я бы подумал, что изменение тайм-аута не решит эту проблему ... но давайте посмотрим.

pgupta 14.04.2018 21:52

Другие вопросы по теме