YugabyteDB в публичной сети 🚀🌐

Распределенная база данных не имеет общих дисков или межсетевых соединений. По соображениям безопасности и производительности вы, вероятно, используете VPC в регионе облака, пиринговые VPC между регионами и прямое соединение между облачными провайдерами. Но можно также развернуть кластер через публичный интернет. Это пример для демонстрации.

У меня есть две учетные записи Oracle Cloud free tier, одна во Франкфурте (eu-fra-1) и одна в Цюрихе (eu-zrh-1). Бесплатный уровень позволяет 2 публичных IP, и я создал 2 бесплатные виртуальные машины в eu-fra-1 и одну в eu-zrh-1, которые могут быть постоянно включены, без какого-либо риска платить что-либо. Вот необходимая информация для одного из них в Цюрихе:

Это небольшие машины (CPU — 20% одного ядра AMD EPYC 7551, и 686MB доступной RAM), конечно, не для выполнения высокой нагрузки, но достаточно для запуска YugabyteDB для тестирования развертывания в публичной сети. Я открыл порты YugabyteDB, используемые для межузловой связи (7100 для yb-master и 9100 для yb-tserver), а также для Web UI (соответственно 7000 и 9000) и порт YSQL для протокола PostgreSQL (5433) для узлов, к которым я хочу подключиться с помощью клиента PostgreSQL.

Вот узлы, которые я буду использовать:

Регион Зона (AD) Публичный IP Частный IP
eu-fra-1 ад-3 yb1.pachot.net 10.0.0.231
эу-фра-1 объявление-3 yb2.pachot.net 10.0.0.200
eu-zrh-1 объявление-1 yb3.pachot.net 10.0.0.14

Я имею доступ по ssh ко всем и быстро проверяю соединение (я открыл все порты, требуемые YugabyteDB, включая 7100)

for public in yb1.pachot.net yb2.pachot.net yb3.pachot.net
do
 for private in 10.0.0.231 10.0.0.200 10.0.0.14
 do
  ssh $public bash -c "echo > /dev/tcp/$private/7100" 2> /dev/null
  echo "$? $public  ->  $private" &
 done
done | awk '/0 /{$1="ok"}/1 /{$1="  "}{print}'
Войдите в полноэкранный режим Выйти из полноэкранного режима

Вот результат:

ok yb1.pachot.net->10.0.0.231
ok yb1.pachot.net->10.0.0.200
   yb1.pachot.net->10.0.0.14
ok yb2.pachot.net->10.0.0.231
ok yb2.pachot.net->10.0.0.200
   yb2.pachot.net->10.0.0.14
   yb3.pachot.net->10.0.0.231
   yb3.pachot.net->10.0.0.200
ok yb3.pachot.net->10.0.0.14
Войти в полноэкранный режим Выход из полноэкранного режима

Это подтверждает, что я могу подключаться по частному IP в пределах одной зоны, но мне нужно использовать публичный IP между зонами. Цель этой статьи — показать, как запустить yb-master и yb-tserver так, чтобы межузловая связь использовала частный IP при включении в одной зоне, и публичный IP в разных зонах.

размещение

Вот параметры, используемые как yb-master, так и yb-tserver.

По сути, при подключении с одного сервера к другому, YugabyteDB будет сравнивать имена облака/региона/зоны и использовать частный IP, если значение параметра use_private_ip одинаково, в противном случае используется публичный IP.

yb-master

yb-master являются плоскостью управления кластера. Они должны знать друг о друге, чтобы выбрать одного из них лидером. При пересечении зоны они будут использовать публичный IP, но локальный сервер также должен быть в списке со своим частным IP (иначе вы получите None of the local addresses are present in master_addresses). Однако каждый сервер должен быть в списке только один раз, что означает, что на кластере RF=3 у вас есть 3 значения с хотя бы одним частным IP. Вы можете получить ошибку Found multiple peers with uuid при упоминании одного и того же узла с разными IP-адресами. --master_addresses перечисляет все 3 мастера, включая запущенный этой командой, используя его частный IP, но публичный IP для остальных

запуск мастеров

Вот как я запускаю каждый yb-мастер, на каждом узле, с именем соответствующей зоны (placement_zone), локальным IP (rpc_bind_addresses), публичным IP (server_broadcast_addresses) и master_addresses:

ssh -q opc@yb1.pachot.net /home/opc/yugabyte/bin/yb-master 
--master_addresses=10.0.0.231:7100,yb2.pachot.net:7100,yb3.pachot.net:7100 --server_broadcast_addresses=yb1.pachot.net:7100 
--rpc_bind_addresses=10.0.0.231:7100 --use_private_ip=zone 
--placement_cloud oci --placement_region eu-fra-1 
--placement_zone eu-fra-1-ad-3 --fs_data_dirs=/home/opc/var/data 
--replication_factor=3 --default_memory_limit_to_ram_ratio=0.20  </dev/null &

ssh -q opc@yb2.pachot.net /home/opc/yugabyte/bin/yb-master 
--master_addresses=yb1.pachot.net:7100,10.0.0.200:7100,yb3.pachot.net:7100 --server_broadcast_addresses=yb2.pachot.net:7100 
--rpc_bind_addresses=10.0.0.200:7100 --use_private_ip=zone 
--placement_cloud oci --placement_region eu-fra-1 
--placement_zone eu-fra-1-ad-3 --fs_data_dirs=/home/opc/var/data 
--replication_factor=3 --default_memory_limit_to_ram_ratio=0.20  </dev/null &

ssh -q opc@yb3.pachot.net /home/opc/yugabyte/bin/yb-master 
--master_addresses=yb1.pachot.net:7100,yb2.pachot.net:7100,10.0.0.14:7100 --server_broadcast_addresses=yb3.pachot.net:7100  
--rpc_bind_addresses=10.0.0.14:7100 --use_private_ip=zone 
--placement_cloud oci --placement_region eu-zrh-1 
--placement_zone eu-zrh-1-ad-1 --fs_data_dirs=/home/opc/var/data 
--replication_factor=3 --default_memory_limit_to_ram_ratio=0.20   </dev/null &
Войти в полноэкранный режим Выход из полноэкранного режима

Помните, что это лаборатория, и я запускаю все по ssh, с моего хоста bastion. Вы не будете делать этого в реальном развертывании: об этом позаботится system ctl, или kubernetes, или наша платформа.

Один из мастеров избирается лидером. Вы можете открыть Web UI на каждом сервере, и на главной странице должно отображаться состояние кластера:

  • http://yb1.pachot.net:7000/
  • http://yb2.pachot.net:7000/
  • Лаборатория http://yb3.pachot.net:7000/My является публичной, посмотрите на нее, если хотите.


Это показывает, что главным лидером является 10.0.0.200 в eu-fra-1-ad-3. Публичные IP не указаны, но я знаю, что это yb2.pachot.net (я также мог получить эту информацию из gflags:

curl -Ls http://yb2.pachot.net:7000/varz?raw | grep -E "master_addresses|rpc_bind_addresses|server_broadcast_addresses|tserver_master_addrs|placement"
Войти в полноэкранный режим Выйти из полноэкранного режима

Обратите внимание, что вы можете получить этот WebGUI от последователей, которые действуют как прокси для лидера, но для этого используются частные IP. Например, при моей конфигурации и yb2.pachot.net в качестве лидера, Web UI на yb3.pachot.net показывает:

Error retrieving leader master URL: http://10.0.0.200:7000/?raw
Error: Network error (yb/util/curl_util.cc:55): curl error: Couldn't connect to server.
Войти в полноэкранный режим Выход из полноэкранного режима

У меня есть вопрос https://github.com/yugabyte/yugabyte-db/issues/11603 по этому поводу.

входящий/исходящий

Я быстро проверяю входящие/исходящие соединения.

for h in http://yb{1..3}.pachot.net:7000 
do 
 curl -Ls $h/rpcz |
 awk -F: '/_connections/{w=$1}/remote_ip/{print h,w,$2}' h=$h
done | sort -u
Войти в полноэкранный режим Выйти из полноэкранного режима

Вот результат:

http://yb1.pachot.net:7000     "inbound_connections"  "10.0.0.200
http://yb2.pachot.net:7000     "outbound_connections"  "10.0.0.231
http://yb2.pachot.net:7000     "outbound_connections"  "152.67.80.204
http://yb3.pachot.net:7000     "inbound_connections"  "150.230.147.84

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

Последователи имеют входящее соединение от лидера:

Они также видны из yb2.pachot.net как исходящие соединения (152.67.80.204 — IP yb3.pachot.net)

yb-сервер

Серверы tservers, или серверы планшетов, представляют собой плоскость данных. Это место, где хранятся, разделяются и реплицируются данные, а также место, куда вы подключаетесь и где обрабатывается ваш SQL. Их может быть много, здесь я начинаю с минимального, чтобы обеспечить высокую доступность на кластере RF=3:

ssh -q opc@yb1.pachot.net /home/opc/yugabyte/bin/yb-tserver 
--tserver_master_addrs=yb1.pachot.net:7100,yb2.pachot.net:7100,yb3.pachot.net:7100 
--server_broadcast_addresses=yb1.pachot.net --rpc_bind_addresses=10.0.0.231:9100 
--use_private_ip=zone --placement_cloud oci 
--placement_region eu-fra-1 --placement_zone eu-fra-1-ad-3 
--fs_data_dirs=/home/opc/var/data --replication_factor=3 
--default_memory_limit_to_ram_ratio=0.30 --enable_ysql=true </dev/null &

ssh -q opc@yb2.pachot.net /home/opc/yugabyte/bin/yb-tserver 
--tserver_master_addrs=yb1.pachot.net:7100,yb2.pachot.net:7100,yb3.pachot.net:7100 --server_broadcast_addresses=yb2.pachot.net 
--rpc_bind_addresses=10.0.0.200:9100 --use_private_ip=zone 
--placement_cloud oci --placement_region eu-fra-1 
--placement_zone eu-fra-1-ad-3 --fs_data_dirs=/home/opc/var/data 
--replication_factor=3 --default_memory_limit_to_ram_ratio=0.30 
--enable_ysql=true </dev/null &

ssh -q opc@yb3.pachot.net /home/opc/yugabyte/bin/yb-tserver --tserver_master_addrs=yb1.pachot.net:7100,yb2.pachot.net:7100,yb3.pachot.net:7100 
--server_broadcast_addresses=yb3.pachot.net --rpc_bind_addresses=10.0.0.14:9100 
--use_private_ip=zone --placement_cloud oci 
--placement_region eu-zrh-1 --placement_zone eu-zrh-1-ad-1 
--fs_data_dirs=/home/opc/var/data --replication_factor=3 
--default_memory_limit_to_ram_ratio=0.30 --enable_ysql=true </dev/null &
Войти в полноэкранный режим Выход из полноэкранного режима

Каждый tserver должен иметь список мастеров, с --tserver_master_addrs, и я использую здесь публичные IP, чтобы все они были видны. Они слушают локальный IP, определенный --rpc_bind_addresses и доступны из публичной сети с публичным IP, заданным в --server_broadcast_addresses. Выбор того, какой IP использовать, зависит от параметров размещения.

Это означает, что вы можете запустить сервер tserver с любого узла, имеющего VNIC в публичной сети, и подключить его к моим мастерам, и вы станете частью базы данных, в своем краевом расположении. Опять же, это лаборатория. Вы не должны открывать эти порты на 0.0.0.0/0, как это сделал я.

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *