В предыдущем посте я упоминал, как быстро запустить YugabyteDB для быстрой кратковременной лаборатории. Она может работать на Micro VM (например, firecracker), и в некоторых случаях у вас нет сетевых интерфейсов. Он не нужен, если вы подключаетесь с помощью ysqlsh
из MicroVM, но вы можете столкнуться с проблемами разрешения имен. Обратите внимание, что вы можете воспроизвести это с помощью docker run --network none
.
Этот пост посвящен следующим ошибкам и их решению:
ysqlsh: FATAL: Timed out: OpenTable RPC (request call id 2) to 0.0.0.0:9100 timed out after 120.000s
или, в yb-tserver.ERROR
:
E0830 11:32:44.518383 66 async_initializer.cc:100] Failed to initialize client: Network error (yb/util/net/net_util.cc:447): Could not determine local host names: Unable to lookup FQDN (699cdfc74424), getaddrinfo returned -11 (EAI_SYSTEM): Connection refused (system error 111)
Это связано с разрешением имен. YugabyteDB является распределенной базой данных и должна иметь совпадающие имя хоста и IP-адрес для идентификации узлов. Последнее сообщение является явным: YugabyteDB вызывает системный вызов Linux getaddrinfo()
, чтобы получить IP-адрес 699cdfc74424
, который является именем хоста моего контейнера.
По сути, это делает то же самое, что и
sh-4.2# getent ahosts $(hostname)
127.0.0.2 STREAM 699cdfc74424
127.0.0.2 DGRAM
127.0.0.2 RAW
::1 STREAM
::1 DGRAM
::1 RAW
Но почему 127.0.0.2
? Я пытаюсь запустить YugabyteDB на 127.0.0.1
, который является единственным интерфейсом моего несетевого контейнера:
/home/yugabyte/bin/yb-master --fs_data_dirs=/var/tmp --master_addresses=127.0.0.1:7100 --replication_factor=1 --default_memory_limit_to_ram_ratio=0.30 &
/home/yugabyte/bin/yb-tserver --fs_data_dirs=/var/tmp --tserver_master_addrs=127.0.0.1:7100 --default_memory_limit_to_ram_ratio=0.30 &
Причина находится в /etc/nsswitch.conf
:
sh-4.2# grep hosts: /etc/nsswitch.conf
#hosts: db files nisplus nis dns
hosts: files dns myhostname
sh-4.2#
Разрешение имени хоста сначала идет к files
, который в данном случае /etc/hosts
:
sh-4.2# cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
Мое имя хоста там неизвестно.
Затем он переходит к dns
, но у меня нет DNS в моем несетевом контейнере (причина ошибки Connection refused
, я полагаю).
Затем он переходит к myhostname
, который разрешает имя хоста, но до 127.0.0.2
. Это используется, чтобы избежать патча /etc/hosts
, но в моем случае не может быть использовано, потому что 127.0.0.2
не известно.
Я пытался запустить yb-master --master_addresses=127.0.0.2:7100
, но он терпит неудачу с сообщением Ни один из локальных адресов не присутствует в master_addresses 127.0.0.2:7100
.
Тогда мое решение — просто добавить имя хоста в /etc/hosts
:
echo "127.0.0.1 localhost $(hostname)" > /etc/hosts
С этим перед запуском yb-master--fs_data_dirs=/var/tmp --master_addresses=127.0.0.1:7100 --replication_factor=1
и yb-tserver --fs_data_dirs=/var/tmp --master_addresses=127. 0.0.1:7100 --replication_factor=1
вы должны иметь возможность подключиться с помощью простого ysqlsh
, который по умолчанию подключается к localhost
.
Конечно, распределенная база данных SQL без сети не имеет смысла, за исключением небольшого контейнера, используемого, например, для непрерывной интеграции.