YugabyteDB в виртуальной машине Micro VM без сети

В предыдущем посте я упоминал, как быстро запустить 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)
Enter fullscreen mode Выйти из полноэкранного режима

Это связано с разрешением имен. 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#
Enter fullscreen mode Выход из полноэкранного режима

Разрешение имени хоста сначала идет к 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 без сети не имеет смысла, за исключением небольшого контейнера, используемого, например, для непрерывной интеграции.

Оцените статью
devanswers.ru
Добавить комментарий