Aerospike Hearbeat звонки застряли в TIME_WAIT - PullRequest
2 голосов
/ 02 ноября 2019

Я пытаюсь настроить кластер Aerospike на GCP. Я использую Core OS и Docker для запуска демона Aerospike.

У меня следующая конфигурация в aerospike.conf для as-node-01

    service {
        service-threads 10

    }               

    network {                

        service {
            address any
            port 3000
            access-address as-node-01
        }           
        fabric {
            address any
            port 3001

        }            
        info {
            address any
            port 3003
        }              
        heartbeat {
            mode mesh
            address as-node-01
            port 3002
            mesh-seed-address-port as-node-02 3002
            mesh-seed-address-port as-node-01 3002

        }         
    }


    logging {
        console { 
            context any info
        }
    }               


    namespace rte {       
    memory-size 4G           
        replication-factor 1     
        high-water-memory-pct 60 

        stop-writes-pct 90       
        default-ttl 0            

        storage-engine memory    
    }

и следующая для as-node-02

    service {
        service-threads 10

    }               

    network {                

        service {
            address any
            port 3000
            access-address as-node-02
        }           
        fabric {
            address any
            port 3001

        }            
        info {
            address any
            port 3003
        }              
        heartbeat {
            mode mesh
            address as-node-01
            port 3002
            mesh-seed-address-port as-node-01 3002
            mesh-seed-address-port as-node-02 3002

        }         
    }


    logging {
        console { 
            context any info
        }
    }               


    namespace rte {       
    memory-size 4G           
        replication-factor 1     
        high-water-memory-pct 60 

        stop-writes-pct 90       
        default-ttl 0            

        storage-engine memory    
    }

Я использую aerospike:4.6.0.4 образ докера со следующей командой

docker run -d -v `pwd`:/opt/aerospike/etc --name aerospike -p 3000:3000 -p 3001:3001 -p 3002:3002 -p 3003:3003 aerospike asd --foreground --config-file /opt/aerospike/etc/aerospike.conf

Когда я запускаю демон на обоих узлах, я вижу следующее в содержимом журнала.

Nov 02 2019 07:20:23 GMT: WARNING (socket): (socket.c:959) (repeated:67) Error while connecting socket to 10.160.0.14:3002
Nov 02 2019 07:20:23 GMT: WARNING (hb): (hb.c:4882) (repeated:67) could not create heartbeat connection to node {10.160.0.14:3002}
Nov 02 2019 07:20:23 GMT: WARNING (socket): (socket.c:900) (repeated:67) Error while connecting: 111 (Connection refused)

Затем я попытался с помощью netstat увидеть, что не так, и я вижу, что сердцебиения застряли в состоянии TIME_WAIT.

tcp6       0      0 as-node-01.asia-so:3002 172.17.0.2:39890        TIME_WAIT  
tcp6       0      0 as-node-01.asia-so:3002 172.17.0.2:38662        TIME_WAIT  
tcp6       0      0 as-node-01.asia-so:3002 172.17.0.2:39998        TIME_WAIT  
tcp6       0      0 as-node-01.asia-so:3002 172.17.0.2:39878        TIME_WAIT  
tcp6       0      0 as-node-01.asia-so:3002 172.17.0.2:39716        TIME_WAIT  
tcp6       0      0 as-node-01.asia-so:3002 172.17.0.2:39252        TIME_WAIT  
tcp6       0      0 as-node-01.asia-so:3002 172.17.0.2:39872        TIME_WAIT  
tcp6       0      0 as-node-01.asia-so:3002 172.17.0.2:39776        TIME_WAIT  
tcp6       0      0 as-node-01.asia-so:3002 172.17.0.2:38796        TIME_WAIT  
tcp6       0      0 as-node-01.asia-so:3002 172.17.0.2:38668        TIME_WAIT  
tcp6       0      0 as-node-01.asia-so:3002 172.17.0.2:38844        TIME_WAIT  
tcp6       0      0 as-node-01.asia-so:3002 172.17.0.2:39668        TIME_WAIT  
tcp6       0      0 as-node-01.asia-so:3002 172.17.0.2:39120        TIME_WAIT  
tcp6       0      0 as-node-01.asia-so:3002 172.17.0.2:39138        TIME_WAIT  
tcp6       0      0 as-node-01.asia-so:3002 172.17.0.2:39174        TIME_WAIT  
tcp6       0      0 as-node-01.asia-so:3002 172.17.0.2:38740        TIME_WAIT  
tcp6       0      0 as-node-01.asia-so:3002 172.17.0.2:39614        TIME_WAIT  
tcp6       0      0 as-node-01.asia-so:3002 172.17.0.2:39000        TIME_WAIT  
tcp6       0      0 as-node-01.asia-so:3002 172.17.0.2:39318        TIME_WAIT  
tcp6       0      0 as-node-01.asia-so:3002 172.17.0.2:38982        TIME_WAIT  
tcp6       0      0 as-node-01.asia-so:3002 172.17.0.2:39584        TIME_WAIT  
tcp6       0      0 as-node-01.asia-so:3002 172.17.0.2:39420        TIME_WAIT  
tcp6       0      0 as-node-01.asia-so:3002 172.17.0.2:38758        TIME_WAIT  
tcp6       0      0 as-node-01.asia-so:3002 172.17.0.2:39656        TIME_WAIT  
tcp6       0      0 as-node-01.asia-so:3002 172.17.0.2:39866        TIME_WAIT  
tcp6       0      0 as-node-01.asia-so:3002 172.17.0.2:39482        TIME_WAIT  
tcp6       0      0 as-node-01.asia-so:3002 172.17.0.2:39222        TIME_WAIT  
tcp6       0      0 as-node-01.asia-so:3002 172.17.0.2:39818        TIME_WAIT  

В TIME_WAIT есть сотни таких звонков. государство.

Я не могу понять, почему эти вызовы застряли в TIME_WAIT и не перенаправляются в док-контейнер.

Ответы [ 2 ]

3 голосов
/ 11 ноября 2019

Похоже, вы запускаете два контейнера на двух разных узлах. и использование имен узлов (хостов) в aerospike.conf.

heartbeat {
            mode mesh
            address as-node-01
            port 3002
            mesh-seed-address-port as-node-01 3002
            mesh-seed-address-port as-node-02 3002
}
  • address as-node-01 указывает на интерфейс, который не будет доступен внутри контейнера, если контейнеры не находятся в сети хоста. Вот почему --network=host работает для вас.
  • Если вы не используете --net=host, то по умолчанию контейнеры находятся в частной сети и не могут пропинговать другие хосты (узлы) или подключаться к контейнерам на других хостах.

Так что для работы с этим вам может понадобиться оверлейная сеть (для сетей с несколькими хостами). Затем вы можете просто использовать частный IP-адрес контейнера в конфигурации aerospike mesh.

Вы можете попробовать Docker Swarm. Если не в Docker Swarm, вам может потребоваться запустить внешнее хранилище значений ключей (например, consul и т. Д.) Для обнаружения в оверлейной сети.

https://www.aerospike.com/docs/deploy_guides/docker/networking/index.html

https://docs.docker.com/network/overlay-standalone.swarm/

https://docs.docker.com/network/overlay/

2 голосов
/ 11 ноября 2019

В дополнение к тому, что сказал @SP Кесан,

Похоже, что вы использовали одинаковую привязку адреса для обоих узлов, указывающих на as-node-01. использовать имя интерфейса (то есть: eth0, или eth1, и т. д.). Это также должно работать с оверлейной сетью и позволить вам указать имя интерфейса для оверлейной сети.

Пожалуйста, см .: https://docs.docker.com/network/overlay/

Если контейнеры находились на одном и том же хосте, то только изменение привязки вашего адреса должно помочь в решении проблемы. Поскольку ваши контейнеры находятся на разных хостах, вы можете использовать оверлейную сеть для связи между узлами или использовать --net host и использовать сетевые интерфейсы хоста.


        service {
            address any
            port 3000
            access-address as-node-01
        }           
     ...     
        heartbeat {
            mode mesh
            address as-node-01
            port 3002

и


 service {
            address any
            port 3000
            access-address as-node-02
        }           
...            
        heartbeat {
            mode mesh
            address as-node-01
            port 3002

...