Когда вы запускаете узлы YugabyteDB (yb-master а также yb-tserver) вы говорите им, где они находятся с точки зрения облако, область, край а также зона. Это всего лишь названия трех общих уровней глобальной инфраструктуры, которые можно сопоставить с вашей локальной инфраструктурой. Дата центр, зона отказа а также стойка. Суть в том, что база данных будет использовать эту информацию для размещения данных (одноранговых узлов планшета, которые являются репликами сегментов таблицы и индекса) для обеспечения максимальной доступности и производительности.

  • Чтобы быть устойчивыми к сбоям облачного провайдера, региона или зоны, одноранговые устройства распределены между ними.
  • Чтобы соответствовать ожиданиям по производительности или правилам управления данными, планшеты могут быть ограничены определенным подмножеством кластера (с табличными пространствами).

При подключении к YSQL, конечной точке PostgreSQL, вы можете перечислить все узлы с yb_servers() который отображает их облако, область, край а также зона. При запросе секционированной таблицы вы можете вызвать yb_is_local_table() для фильтрации строк из облака, региона или зоны, к которым вы подключены. Я разместил пример здесь. Вы также можете узнать, к какому узлу вы подключены, посмотрев на его IP-адрес с помощью inet_server_addr() или адрес интерфейса, который он прослушивает current_setting('listen_addresses').

Если вы просто хотите узнать облако, область, край а также зона к которому вы подключены, YugabyteDB предоставляет три простые функции: yb_server_cloud(), yb_server_region(), yb_server_zone()

Вот пример, в котором я не указал информацию о месте размещения:

docker run --rm yugabytedb/yugabyte:2.14.4.0-b26 bash -c "
yugabyted start --tserver_flags=""
until ysqlsh -c 'show server_version' ; do sleep 1 ; done 2>/dev/null
ysqlsh -e <<SQL
select current_setting('listen_addresses'),inet_server_addr();
select * from yb_servers();
select yb_server_cloud(), yb_server_region(), yb_server_zone();
SQL
"
Войти в полноэкранный режим

Выйти из полноэкранного режима

По умолчанию, как показано на yb_tserver() или веб-консоль — «cloud1», «datacenter1», «rack1», но эти новые функции просто сообщат вам, что информация о размещении не была установлена:

Starting yugabyted...
   server_version
---------------------
 11.2-YB-2.14.4.0-b0
(1 row)

select current_setting('listen_addresses'),inet_server_addr();
 current_setting | inet_server_addr
-----------------+------------------
 0.0.0.0         | 127.0.0.1
(1 row)

select * from yb_servers();
     host     | port | num_connections | node_type | cloud  |   region    | zone  | public_ip
--------------+------+-----------------+-----------+--------+-------------+-------+-----------
 7d79fe13d79b | 5433 |               0 | primary   | cloud1 | datacenter1 | rack1 | 127.0.0.1
(1 row)

select yb_server_cloud(), yb_server_region(), yb_server_zone();
NOTICE:  No cloud was set in placement_info setting at node startup.
NOTICE:  No region was set in placement_info setting at node startup.
NOTICE:  No zone was set in placement_info setting at node startup.
 yb_server_cloud | yb_server_region | yb_server_zone
-----------------+------------------+----------------
                 |                  |
(1 row)
Войти в полноэкранный режим

Выйти из полноэкранного режима

Обратите внимание, что УВЕДОМЛЕНИЕ может раздражать и будет удалено:

Если я явно укажу то же имя, что и по умолчанию, «cloud1», с placement_cloud в yugabyted --tserver_flags:

docker run --rm yugabytedb/yugabyte:2.14.4.0-b26 bash -c "
yugabyted start --tserver_flags="placement_cloud=cloud1"
until ysqlsh -c 'show server_version' ; do sleep 1 ; done 2>/dev/null
ysqlsh -e <<SQL
select current_setting('listen_addresses'),inet_server_addr();
select * from yb_servers();
select yb_server_cloud(), yb_server_region(), yb_server_zone();
SQL
"
Войти в полноэкранный режим

Выйти из полноэкранного режима

Имя отображается yb_server_cloud():

Starting yugabyted...
   server_version
---------------------
 11.2-YB-2.14.4.0-b0
(1 row)

select current_setting('listen_addresses'),inet_server_addr();
 current_setting | inet_server_addr
-----------------+------------------
 0.0.0.0         | 127.0.0.1
(1 row)

select * from yb_servers();
     host     | port | num_connections | node_type | cloud  |   region    | zone  | public_ip
--------------+------+-----------------+-----------+--------+-------------+-------+-----------
 ab439408352e | 5433 |               0 | primary   | cloud1 | datacenter1 | rack1 | 127.0.0.1
(1 row)

select yb_server_cloud(), yb_server_region(), yb_server_zone();
 yb_server_cloud | yb_server_region | yb_server_zone
-----------------+------------------+----------------
 cloud1          |                  |
(1 row)

NOTICE:  No region was set in placement_info setting at node startup.
NOTICE:  No zone was set in placement_info setting at node startup.
Войти в полноэкранный режим

Выйти из полноэкранного режима

В реальном развертывании вы устанавливаете три из них, как это для AWS eu-west1a зона в eu-west1 область aws облако:

docker run --rm yugabytedb/yugabyte:2.14.4.0-b26 bash -c "
yugabyted start --tserver_flags="placement_cloud=aws,placement_region=eu-west1,placement_zone=eu-west1a"
until ysqlsh -c 'show server_version' ; do sleep 1 ; done 2>/dev/null
ysqlsh -e <<SQL
select current_setting('listen_addresses'),inet_server_addr();
select * from yb_servers();
select yb_server_cloud(), yb_server_region(), yb_server_zone();
SQL
"
Войти в полноэкранный режим

Выйти из полноэкранного режима

Три функции подскажут вам, в каком облако, область, край а также зона вы подключены к:

Starting yugabyted...
   server_version
---------------------
 11.2-YB-2.14.4.0-b0
(1 row)

select current_setting('listen_addresses'),inet_server_addr();
 current_setting | inet_server_addr
-----------------+------------------
 0.0.0.0         | 127.0.0.1
(1 row)

select * from yb_servers();
     host     | port | num_connections | node_type | cloud |  region  |   zone    | public_ip
--------------+------+-----------------+-----------+-------+----------+-----------+-----------
 a482bc2a786a | 5433 |               0 | primary   | aws   | eu-west1 | eu-west1a | 127.0.0.1
(1 row)

select yb_server_cloud(), yb_server_region(), yb_server_zone();
 yb_server_cloud | yb_server_region | yb_server_zone
-----------------+------------------+----------------
 aws             | eu-west1         | eu-west1a
Войти в полноэкранный режим

Выйти из полноэкранного режима

При использовании балансировщика нагрузки или интеллектуальных драйверов YugabyteDB одна строка подключения клиента может вести к любому узлу, и использование этих функций — правильный способ узнать, где вы находитесь. Это используется внутренне планировщиком запросов YugabyteDB, когда есть выбор, например, с дублированием покрывающих индексов, для уменьшения задержки. Короче говоря, узел, к которому вы подключены, является конечной точкой PostgreSQL, которая обрабатывает ваш запрос (планировщик и исполнитель запросов) и читает или записывает в уровень хранения базы данных (локальные или удаленные узлы). Распределение подключений помогает масштабировать вычислительные ресурсы (рабочая память и обработка) на уровне SQL в дополнение к масштабированию уровня хранения.