برنامه نویسی

توزیع PostgreSQL در Amazon Elastic Kubernetes

Summarize this content to 400 words in Persian Lang
پس از شرکت در نشست جهانی قهرمانان AWS در سیاتل، من به ایالات متحده سفر می کنم و می خواهم YugabyteDB را به مکان های زیر ارائه و نشان دهم:

خوشحال می شوم که شما را در آن مکان ها ملاقات کنم و می توانم اسلایدها را با شما به اشتراک بگذارم. من همچنین یک نمایش زنده از کشش و انعطاف پذیری YugabyteDB با استفاده از یک پلت فرم عالی برای یک پایگاه داده بومی ابری انجام خواهم داد: Amazon Elastic Kubernetes Service (Amazon EKS). در اینجا چیزی است که به احتمال زیاد در طول تظاهرات ارائه خواهم کرد.

من یک خوشه آمازون EKS با استفاده از eksctl ابزار خط فرمان من خوشه را با انواع گره ها، اندازه ها و مناطق خاص پیکربندی می کنم و سپس my را به روز می کنم .kube/config برای مدیریت خوشه با استفاده از kubectl.

eksctl create cluster –name yb-demo1 –tags eks=yb-demo1 \
–version 1.27 \
–node-type c5.2xlarge –nodes 4 –nodes-min 0 –nodes-max 4 \
–region eu-west-1 –zones eu-west-1a,eu-west-1b,eu-west-1c \
–nodegroup-name standard-workers –managed –dumpLogs

aws eks update-kubeconfig –region eu-west-1 –name yb-demo1

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

من یک خوشه YugabyteDB تک منطقه ای بسیار در دسترس را در Amazon EKS راه اندازی خواهم کرد. من ایجاد کلاس های ذخیره سازی و StatefulSets را برای هر منطقه در دسترس در یک منطقه مشخص به طور خودکار انجام می دهم. eu-west-1، اطمینان از پیکربندی مناسب استقرار چند AZ. این فرآیند شامل تولید مانیفست های ضروری Kubernetes، اعمال آنها و استفاده از Helm برای استقرار پایگاه داده YugabyteDB است.

cd
region=eu-west-1
masters=$(for az in {a..c} ; do echo “yb-master-0.yb-masters.yb-demo-${region}${az}.svc.cluster.local:7100” ; done | paste -sd,)
placement=$(for az in {a..c} ; do echo “aws.${region}.${region}${az}” ; done | paste -sd,)
echo
echo “$masters”
echo “$region”
echo “$placement”

# create per-AZ StorageClass and StatefulSet
{
for az in {a..c} ; do

{ cat CAT
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: standard-${region}${az}
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp2
zone: ${region}${az}
CAT
} > ${region}${az}.storageclass.yaml
echo “kubectl apply -f ${region}${az}.storageclass.yaml”

{ cat CAT
isMultiAz: True
AZ: ${region}${az}
masterAddresses: “$masters”
storage:
ephemeral: true
master:
storageClass: “standard-${region}${az}”
tserver:
storageClass: “standard-${region}${az}”
replicas:
master: 1
tserver: 2
totalMasters: 3
resource:
master:
requests:
cpu: 0.5
memory: 1Gi
tserver:
requests:
cpu: 1
memory: 2Gi
gflags:
master:
placement_cloud: “aws”
placement_region: “${region}”
placement_zone: “${region}${az}”
ysql_num_shards_per_tserver: 2
tserver_unresponsive_timeout_ms: 10000
hide_dead_node_threshold_mins: 900
tserver:
placement_cloud: “aws”
placement_region: “${region}”
placement_zone: “${region}${az}”
ysql_num_shards_per_tserver: 2
ysql_enable_auth: true
yb_enable_read_committed_isolation: true
ysql_suppress_unsafe_alter_notice: true
ysql_beta_features: true
allowed_preview_flags_csv: ysql_yb_ash_enable_infra,ysql_yb_enable_ash
ysql_yb_ash_enable_infra: true
ysql_yb_enable_ash: true
CAT
} > ${region}${az}.overrides.yaml
echo “kubectl create namespace yb-demo-${region}${az}”

echo “helm install yb-demo yugabytedb/yugabyte –namespace yb-demo-${region}${az} -f ${region}${az}.overrides.yaml –wait \$* ; sleep 5”

done

echo “kubectl exec -it -n yb-demo-${region}a yb-master-0 — yb-admin –master_addresses $masters modify_placement_info $placement 3″

} | tee yb-demo-install.sh

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این اسکریپت نصب را ایجاد کرده است. من با افزودن مخزن YugabyteDB Helm و به روز رسانی آن شروع می کنم، سپس به استقرار YugabyteDB با استفاده از اسکریپت ادامه می دهم.

# install yugabyte Helm chart
helm repo add yugabytedb https://charts.yugabyte.com
helm repo update
helm search repo yugabytedb/yugabyte | cut -c-75

export PATH=”$HOME/cloud/aws-cli:$PATH”

. yb-demo-install.sh

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

من کنسول وب داخلی را که برای وب عمومی باز است با شرکت کنندگان به اشتراک خواهم گذاشت. این به آنها اجازه می دهد تا استقرار، جداول و انجام عملیات خواندن/نوشتن را به تنهایی انجام دهند. در اینجا نحوه ایجاد یک کد QR برای URL این سرویس UI آمده است:

for i in 0 ; do echo $(kubectl get svc -n yb-demo-eu-west-1a –field-selector “metadata.name=yb-master-ui” -o jsonpath=’http://{.items[‘$i’].status.loadBalancer.ingress[0].hostname}:{.items[0].spec.ports[?(@.name==”http-ui”)].port}’) ; done | while read url ; do echo “yb-master-ui $i” ; qrencode -t ANSIUTF8 -s 1 -m 0 “$url” ; echo “$url” ; done

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

PgBench

من از kubectl برای راه اندازی یک PostgreSQL pod استفاده می کنم eu-west-1a، متغیرهای محیطی لازم را برای اتصال به load balancer در این ناحیه دسترسی تنظیم کنید و ابزار pgbench را برای ایجاد جداول با کلیدهای اصلی و خارجی اجرا کنید. سپس جدول را با مقیاس 150 پر می کنم و YugabyteDB بدون تراکنش می نویسد تا بار انبوه بیشتری داشته باشد.

kubectl -n yb-demo-eu-west-1a run -it eu-west-1a –image=postgres:17beta2 –rm=true bash

export PGPASSWORD=yugabyte PGUSER=yugabyte PGDATABASE=yugabyte PGPORT=5433 PGHOST=yb-tservers

pgbench -iIdtpf

PGOPTIONS=”-c yb_disable_transactional_writes=on -c yb_default_copy_from_rows_per_transaction=0″ pgbench -iIg –scale 150
psql -c “select tablename, pg_size_pretty(pg_table_size(tablename::regclass)) from pg_tables where schemaname=”public””

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

من معیار Simple Update را از 20 مشتری اجرا خواهم کرد.

pgbench –client 20 -nN –progress 5 –max-tries 10 -T 3600

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

قابلیت ارتجاعی

برای نشان دادن اینکه چگونه می‌توانیم بدون خرابی مقیاس‌بندی کنیم، تعداد سرورهای تبلت را در هر منطقه در دسترس با صرفاً مقیاس‌بندی StatefulSets دو برابر می‌کنم:

kubectl scale -n yb-demo-eu-west-1a statefulset yb-tserver –replicas=4
kubectl scale -n yb-demo-eu-west-1b statefulset yb-tserver –replicas=4
kubectl scale -n yb-demo-eu-west-1c statefulset yb-tserver –replicas=4

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

برنامه PgBench به کار خود ادامه می دهد و توان عملیاتی افزایش می یابد. با این حال، از آنجایی که PgBench با مجموعه ایستا از اتصالات اجرا می شود که هنگام راه اندازی آن آغاز می شود، به طور کامل از همه گره ها بهره نمی برد و فقط خواندن و نوشتن دوباره متعادل می شود. راه اندازی مجدد PgBench همچنین اتصالات به گره های جدید را متعادل می کند و توان عملیاتی دو برابر می شود. البته، با استفاده از استخر اتصال، نیازی به راه اندازی مجدد آن ندارید.

تاب آوری

برای نشان دادن انعطاف پذیری در برابر شکست، یک گره را می توان با کوچک کردن یک StatefulSet حذف کرد. من حتی یک AZ را به صفر کاهش می دهم تا شکست منطقه را شبیه سازی کنم:

kubectl scale -n yb-demo-eu-west-1c statefulset yb-tserver –replicas=3
kubectl scale -n yb-demo-eu-west-1c statefulset yb-tserver –replicas=0
kubectl scale -n yb-demo-eu-west-1c statefulset yb-tserver –replicas=4

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

برنامه PgBench باید بدون هیچ خطایی ادامه یابد. تنها پیامد خرابی، چند ثانیه کاهش توان عملیاتی به دلیل وقفه های مختلف TCP/IP برای اتصال به گره های ناموفق است.

پاک کردن

شما می توانید با چنین آزمایشگاهی هر طور که می خواهید بازی کنید. فراموش نکنید که خوشه EKS را خاتمه دهید:

aws cloudformation delete-stack –stack-name eksctl-yb-demo1 aws cloudformation delete-stack –stack-name eksctl-yb-demo1-cluster
aws cloudformation delete-stack –stack-name eksctl-yb-demo1-nodegroup-standard-workers
eksctl delete cluster –region=eu-west-1 –name=yb-demo1

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در آن مکان ها، من به تنهایی ارائه نخواهم شد. همکارانی از YugabyteDB، شرکای AWS و سخنرانان Snowflake و Striim نیز ارائه خواهند شد. این یک فرصت عالی برای شبکه سازی، یادگیری و اشتراک گذاری خواهد بود.

به ما در شهری نزدیک خود بپیوندید تا یک شب گفتگوهای فنی، جلسات نمایش و گفتن، و دموهای نمایشی همراه با غذا، نوشیدنی، جوایز و هدایا را داشته باشید.

info.yugabyte.com

پس از شرکت در نشست جهانی قهرمانان AWS در سیاتل، من به ایالات متحده سفر می کنم و می خواهم YugabyteDB را به مکان های زیر ارائه و نشان دهم:

خوشحال می شوم که شما را در آن مکان ها ملاقات کنم و می توانم اسلایدها را با شما به اشتراک بگذارم. من همچنین یک نمایش زنده از کشش و انعطاف پذیری YugabyteDB با استفاده از یک پلت فرم عالی برای یک پایگاه داده بومی ابری انجام خواهم داد: Amazon Elastic Kubernetes Service (Amazon EKS). در اینجا چیزی است که به احتمال زیاد در طول تظاهرات ارائه خواهم کرد.

من یک خوشه آمازون EKS با استفاده از eksctl ابزار خط فرمان من خوشه را با انواع گره ها، اندازه ها و مناطق خاص پیکربندی می کنم و سپس my را به روز می کنم .kube/config برای مدیریت خوشه با استفاده از kubectl.

eksctl create cluster --name yb-demo1 --tags eks=yb-demo1 \
 --version 1.27 \
 --node-type c5.2xlarge --nodes 4 --nodes-min 0 --nodes-max 4 \
 --region eu-west-1 --zones eu-west-1a,eu-west-1b,eu-west-1c \
 --nodegroup-name standard-workers --managed --dumpLogs

aws eks update-kubeconfig --region eu-west-1 --name yb-demo1

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

من یک خوشه YugabyteDB تک منطقه ای بسیار در دسترس را در Amazon EKS راه اندازی خواهم کرد. من ایجاد کلاس های ذخیره سازی و StatefulSets را برای هر منطقه در دسترس در یک منطقه مشخص به طور خودکار انجام می دهم. eu-west-1، اطمینان از پیکربندی مناسب استقرار چند AZ. این فرآیند شامل تولید مانیفست های ضروری Kubernetes، اعمال آنها و استفاده از Helm برای استقرار پایگاه داده YugabyteDB است.

cd
region=eu-west-1
masters=$(for az in {a..c} ; do echo "yb-master-0.yb-masters.yb-demo-${region}${az}.svc.cluster.local:7100" ; done | paste -sd,)
placement=$(for az in {a..c} ; do echo "aws.${region}.${region}${az}" ; done | paste -sd,)
echo
echo "$masters"
echo "$region"
echo "$placement"

# create per-AZ StorageClass and StatefulSet
{
for az in {a..c} ; do

{ cat CAT
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: standard-${region}${az}
provisioner: kubernetes.io/aws-ebs
parameters:
  type: gp2
  zone: ${region}${az}
CAT
} > ${region}${az}.storageclass.yaml
echo "kubectl apply -f ${region}${az}.storageclass.yaml"

{ cat CAT
isMultiAz: True
AZ: ${region}${az}
masterAddresses: "$masters"
storage:
  ephemeral: true
  master:
    storageClass: "standard-${region}${az}"
  tserver:
    storageClass: "standard-${region}${az}"
replicas:
  master: 1
  tserver: 2
  totalMasters: 3
resource:
  master:
   requests:
    cpu: 0.5
    memory: 1Gi
  tserver:
   requests:
    cpu: 1
    memory: 2Gi
gflags:
  master:
    placement_cloud: "aws"
    placement_region: "${region}"
    placement_zone: "${region}${az}"
    ysql_num_shards_per_tserver: 2
    tserver_unresponsive_timeout_ms: 10000
    hide_dead_node_threshold_mins: 900
  tserver:
    placement_cloud: "aws"
    placement_region: "${region}"
    placement_zone: "${region}${az}"
    ysql_num_shards_per_tserver: 2
    ysql_enable_auth: true
    yb_enable_read_committed_isolation: true
    ysql_suppress_unsafe_alter_notice: true
    ysql_beta_features: true
    allowed_preview_flags_csv: ysql_yb_ash_enable_infra,ysql_yb_enable_ash
    ysql_yb_ash_enable_infra: true
    ysql_yb_enable_ash: true
CAT
} > ${region}${az}.overrides.yaml
echo "kubectl create namespace yb-demo-${region}${az}"

echo "helm install yb-demo yugabytedb/yugabyte --namespace yb-demo-${region}${az} -f ${region}${az}.overrides.yaml --wait \$* ; sleep 5"

done

echo "kubectl exec -it -n yb-demo-${region}a yb-master-0 -- yb-admin --master_addresses $masters modify_placement_info $placement 3"

} | tee yb-demo-install.sh

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این اسکریپت نصب را ایجاد کرده است. من با افزودن مخزن YugabyteDB Helm و به روز رسانی آن شروع می کنم، سپس به استقرار YugabyteDB با استفاده از اسکریپت ادامه می دهم.

# install yugabyte Helm chart
helm repo add yugabytedb https://charts.yugabyte.com
helm repo update
helm search repo yugabytedb/yugabyte | cut -c-75

export PATH="$HOME/cloud/aws-cli:$PATH"

. yb-demo-install.sh

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

من کنسول وب داخلی را که برای وب عمومی باز است با شرکت کنندگان به اشتراک خواهم گذاشت. این به آنها اجازه می دهد تا استقرار، جداول و انجام عملیات خواندن/نوشتن را به تنهایی انجام دهند. در اینجا نحوه ایجاد یک کد QR برای URL این سرویس UI آمده است:

for i in 0 ; do echo $(kubectl get svc -n yb-demo-eu-west-1a --field-selector "metadata.name=yb-master-ui"  -o jsonpath='http://{.items['$i'].status.loadBalancer.ingress[0].hostname}:{.items[0].spec.ports[?(@.name=="http-ui")].port}') ; done | while read url ; do echo "yb-master-ui $i" ; qrencode -t ANSIUTF8 -s 1 -m 0 "$url" ; echo "$url" ; done
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

PgBench

من از kubectl برای راه اندازی یک PostgreSQL pod استفاده می کنم eu-west-1a، متغیرهای محیطی لازم را برای اتصال به load balancer در این ناحیه دسترسی تنظیم کنید و ابزار pgbench را برای ایجاد جداول با کلیدهای اصلی و خارجی اجرا کنید. سپس جدول را با مقیاس 150 پر می کنم و YugabyteDB بدون تراکنش می نویسد تا بار انبوه بیشتری داشته باشد.

kubectl -n yb-demo-eu-west-1a run -it eu-west-1a --image=postgres:17beta2 --rm=true bash

export PGPASSWORD=yugabyte PGUSER=yugabyte PGDATABASE=yugabyte PGPORT=5433 PGHOST=yb-tservers

pgbench -iIdtpf

PGOPTIONS="-c yb_disable_transactional_writes=on -c yb_default_copy_from_rows_per_transaction=0" pgbench -iIg --scale 150
psql -c "select tablename, pg_size_pretty(pg_table_size(tablename::regclass)) from pg_tables where schemaname="public""
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

من معیار Simple Update را از 20 مشتری اجرا خواهم کرد.


pgbench --client 20 -nN --progress 5 --max-tries 10 -T 3600

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

قابلیت ارتجاعی

برای نشان دادن اینکه چگونه می‌توانیم بدون خرابی مقیاس‌بندی کنیم، تعداد سرورهای تبلت را در هر منطقه در دسترس با صرفاً مقیاس‌بندی StatefulSets دو برابر می‌کنم:

kubectl scale -n yb-demo-eu-west-1a statefulset yb-tserver --replicas=4
kubectl scale -n yb-demo-eu-west-1b statefulset yb-tserver --replicas=4
kubectl scale -n yb-demo-eu-west-1c statefulset yb-tserver --replicas=4
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

برنامه PgBench به کار خود ادامه می دهد و توان عملیاتی افزایش می یابد. با این حال، از آنجایی که PgBench با مجموعه ایستا از اتصالات اجرا می شود که هنگام راه اندازی آن آغاز می شود، به طور کامل از همه گره ها بهره نمی برد و فقط خواندن و نوشتن دوباره متعادل می شود. راه اندازی مجدد PgBench همچنین اتصالات به گره های جدید را متعادل می کند و توان عملیاتی دو برابر می شود. البته، با استفاده از استخر اتصال، نیازی به راه اندازی مجدد آن ندارید.

تاب آوری

برای نشان دادن انعطاف پذیری در برابر شکست، یک گره را می توان با کوچک کردن یک StatefulSet حذف کرد. من حتی یک AZ را به صفر کاهش می دهم تا شکست منطقه را شبیه سازی کنم:

kubectl scale -n yb-demo-eu-west-1c statefulset yb-tserver --replicas=3
kubectl scale -n yb-demo-eu-west-1c statefulset yb-tserver --replicas=0
kubectl scale -n yb-demo-eu-west-1c statefulset yb-tserver --replicas=4
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

برنامه PgBench باید بدون هیچ خطایی ادامه یابد. تنها پیامد خرابی، چند ثانیه کاهش توان عملیاتی به دلیل وقفه های مختلف TCP/IP برای اتصال به گره های ناموفق است.

پاک کردن

شما می توانید با چنین آزمایشگاهی هر طور که می خواهید بازی کنید. فراموش نکنید که خوشه EKS را خاتمه دهید:

aws cloudformation delete-stack --stack-name eksctl-yb-demo1                                                         aws cloudformation delete-stack --stack-name eksctl-yb-demo1-cluster
aws cloudformation delete-stack --stack-name eksctl-yb-demo1-nodegroup-standard-workers
eksctl delete cluster --region=eu-west-1 --name=yb-demo1
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در آن مکان ها، من به تنهایی ارائه نخواهم شد. همکارانی از YugabyteDB، شرکای AWS و سخنرانان Snowflake و Striim نیز ارائه خواهند شد. این یک فرصت عالی برای شبکه سازی، یادگیری و اشتراک گذاری خواهد بود.

YugabyteDB Roadshow All Up Social 1200x628 1

به ما در شهری نزدیک خود بپیوندید تا یک شب گفتگوهای فنی، جلسات نمایش و گفتن، و دموهای نمایشی همراه با غذا، نوشیدنی، جوایز و هدایا را داشته باشید.

info.yugabyte.com

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا