نحوه پیکربندی Group Replication در MySQL روی اوبونتو 20.04

Avatar
نویسنده: دریا آزادخواه
پنج‌شنبه 24 شهریور 1401
مطالعه: ۲۵ دقیقه ۰ نظر ۱۰۸۸ بازدید

با استفاده از Group Replication، می‌توانید داده‌ها و عملیات‌های یک پایگاه‌داده را در پایگاه دیگری کاملاً منعکس کنید. Group Replication را سرور اولیه‌ای انجام می‌دهد که برای اجرای عملیات و ارسال داده‌ها به سرور دوم پیکربندی شده است. سرور دوم می‌تواند اطلاعات را از سرور اصلی دریافت و در دیتابیس خود کپی و ذخیره کند.

Group Replication مکانیزمی عالی و کم‌خطا برای تکرار داده‌هاست. این فرایند شامل ایجاد مجموعه‌ای از سرورهاست که هر‌کدام در مطمئن‌شدن از کپی صحیح داده‌ها مؤثرند. اگر سرور اصلی با مشکل مواجه شود، سیستم انتخابگر می‌تواند سیستمی جدید را از گروه انتخاب کند تا در‌صورت بروز خطا، سیستم‌های دیگر به کارشان ادامه دهند.

خرید سرور لینوکس با قابلیت نصب MySQL در سیستم اوبونتو از پارس پک

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

در این مقاله از آموزش لینوکس، نحوه تنظیم Group Replication در MySQL را با استفاده از مجموعه‌ای از سه سرور اوبونتو 20.04 آموزش خواهیم داد. توجه کنید که سه مورد حداقل تعداد نمونه‌های MySQL است که برای قرار‌دادن در سیستم Group Replication در MySQL نیاز دارید؛ البته می‌توانید حداکثر از ۹ سرور استفاده کنید.

توجه: سرورهای پایگاه‌داده می‌توانند یکی از این دو نقش را در Group Replication ایفا کنند:

  • Master: می‌تواند منبع اصلی و اولیه‌ای باشد که کاربران می‌توانند داده‌ها را از آن دریافت کنند.
  • Slave: نمونه ثانویه‌ای است که رونوشتی از تمام داده‌ها را در منبع ذخیره می‌کند.

پیش‌نیازها

  • سه سرور در حال اجرای اوبونتو 20.04 که هرکدام باید یک کاربر مدیریت non-root با امتیازات sudo و یک فایروال پیکربندی‌شده با UFW داشته باشند.
  • MySQL روی هر سرور نصب شده باشد. بهتر است که از جدیدترین نسخه MySQL موجود در مخازن پیش‌فرض اوبونتو استفاده کنید که تا لحظه نگارش این مقاله، نسخه 8.0.28 است.

خرید سرور لینوکس

در مقاله حاضر، به سه سرور با عناوین Member1 و Member2 و Member3 نیاز خواهید داشت که هرکدام آی‌پی‌های زیر را دارند:

IP address Member
203.0.113.1 member1
203.0.113.2 member2
203.0.113.3 member3

مرحله اول. ایجاد UUID برای شناسایی گروه MySQL

قبل از بازکردن فایل پیکربندی MySQL برای پیکربندی تنظیمات Group Replication، باید UUID ایجاد کنید تا بتوانید از آن برای شناسایی گروه MySQL استفاده کنید.

در Member1، از دستور uuidgen به‌منظور ایجاد UUID معتبر برای گروه استفاده کنید:

uuidgen

خروجی:

168dcb64-7cce-473a-b338-6501f305e561

مقدار دریافتی را کپی کنید؛ زیرا باید هنگام پیکربندی نام گروه، برای مجموعه سرورهای خود از آن استفاده کنید.

نحوه راه اندازی Group Replication

 

پیکربندی Group Replication در MySQL روی ابونتو چطور است؟

مرحله دوم. تنظیم Group Replication در فایل پیکربندی MySQL

فایل پیکربندی اصلی MySQL را در هر سرور MySQL با استفاده از ویرایشگر متن دلخواه خود باز کنید. ما از ویرایشگر نانو استفاده خواهیم کرد.

sudo nano /etc/mysql/my.cnf

در اوبونتو، MySQL به‌همراه فایل‌های زیادی نصب می‌شود که از آن‌ها می‌توانید برای پیکربندی MySQL استفاده کنید. به‌طور پیش‌فرض، فایل my.cnf فقط برای تنظیم منبع فایل‌های اضافه‌شده استفاده می‌شود. شما باید پیکربندی خود را در زیر خطوط includedir! اضافه کنید.

در ابتدا، بخش جدیدی را با اضافه‌کردن هِدِر [mysqld] شروع کنید و سپس تنظیمات زیر را اضافه کنید که ویژخ فعال‌کردن Group Replication است. توجه کنید در این آموزش، از حداقل تنظیمات موردنیاز ذکرشده در مستندات رسمی MySQL برای Group Replication استفاده شده است. پیشوند loose- به MySQL اجازه می‌دهد تا گزینه‌هایی که نمی‌شناسد، به‌خوبی و بدون خطا مدیریت کند. به‌زودی، برخی از این تنظیمات را باید تکمیل و سفارشی کنید:

. . .
!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/

[mysqld]

# General replication settings
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
gtid_mode = ON
enforce_gtid_consistency = ON
master_info_repository = TABLE
relay_log_info_repository = TABLE
binlog_checksum = NONE
log_slave_updates = ON
log_bin = binlog
binlog_format = ROW
transaction_write_set_extraction = XXHASH64
loose-group_replication_bootstrap_group = OFF
loose-group_replication_start_on_boot = OFF
loose-group_replication_ssl_mode = REQUIRED
loose-group_replication_recovery_use_ssl = 1

# Shared replication group configuration
loose-group_replication_group_name = ""
loose-group_replication_ip_whitelist = ""
loose-group_replication_group_seeds = ""

# Single or Multi-primary mode? Uncomment these two lines
# for multi-primary mode, where any host can accept writes
#loose-group_replication_single_primary_mode = OFF
#loose-group_replication_enforce_update_everywhere_checks = ON

# Host specific replication configuration
server_id = 
bind-address = ""
report_host = ""
loose-group_replication_local_address = ""

برای توضیح واضح‌تر همه این گزینه‌های پیکربندی‌، آن‌ها را به بخش‌های کوچکی تقسیم کرده‌ایم. لطفاً آن‌ها را به‌دقت بخوانید؛ زیرا برخی از بخش‌ها انتخاب‌هایی درباره نحوه عملکرد Group Replication ارائه می‌دهند یا از شما می‌خواهند جزئیات خاص پیکربندی خود را وارد کنید.

چطور پروتکل Secure Shell را برای بالا بردن امنیت در اوبونتو نصب کنیم؟

نصب و استفاده از ssh در اوبنتو

1. تنظیمات Group Replication

بخش اول شامل تنظیمات کلی موردنیاز برای Group Replication است که به تغییر نیازی ندارد:

. . .
# General replication settings
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
gtid_mode = ON
enforce_gtid_consistency = ON
master_info_repository = TABLE
relay_log_info_repository = TABLE
binlog_checksum = NONE
log_slave_updates = ON
log_bin = binlog
binlog_format = ROW
transaction_write_set_extraction = XXHASH64
loose-group_replication_bootstrap_group = OFF
loose-group_replication_start_on_boot = OFF
loose-group_replication_ssl_mode = REQUIRED
loose-group_replication_recovery_use_ssl = 1
. . .

یکی از الزامات خاص برای تکرار گروهی در MySQL این است که داده‌ها باید در موتور ذخیره‌سازی InnoDB ذخیره شوند. مستندات MySQL به‌صراحت استفاده از موتورهای ذخیره‌سازی دیگر را منع کرده است که احتمال دارد باعث ایجاد خطا در این بخش شوند.

تنظیمات باقی‌مانده شناسه‌های تراکنش جهانی را روشن و گزارش‌گیری باینری موردنیاز برای Group Replication را پیکربندی و SSL را برای گروه پیکربندی می‌کنند. این پیکربندی چند مورد دیگر را نیز تنظیم می‌کند که به بازیابی و راه‌اندازی Group Replication کمک می‌کنند. در این بخش، به تغییر چیزی نیازی ندارید و این بخش باید در هر سه سرور شما یکسان باشد.

2. تنظیمات اشتراک Group Replication

بخش دوم تنظیمات اشتراک را برای گروه تنظیم می‌کند. شما باید یک بار این بخش را تکمیل و سپس از همان تنظیمات در هریک از سرورهایتان استفاده کنید. به‌طور مثال، باید به UUID گروه که در مرحله قبل ایجاد کردید، فهرستی از اعضای مجاز گروه و اعضای اولیه را اضافه کنید تا هنگام متصل‌شدن به گروه، اطلاعات اولیه را به‌دست آورید. به متغیر Loose-group_Replication_group_name مقدار UUID را بدهید که قبلاً با دستور uuidgen ایجاد کرده‌اید. مطمئن شوید که UUID را به‌دقت و بدون فاصله اضافی در ابتدا و انتها وارد کرده‌اید.

سپس، فهرستی از تمام آدرس‌های IP سرور MySQL خود که با کاما ازهم جدا شده‌اند، در loose-group_Replication_ip_whitelist تنظیم کنید. تنظیم loose-group_Replication_group_seeds باید تقریباً مشابه فهرست سفید (فهرست سرورهای مجاز) باشد؛ اما باید یک پورت Group Replication تعیین‌شده را به انتهای هر عضو اضافه کنید. در این آموزش، از پورت Group Replication توصیه‌شده، یعنی 33061، استفاده کرده‌ایم:

. . .
# Shared replication group configuration
loose-group_replication_group_name = "168dcb64-7cce-473a-b338-6501f305e561"
loose-group_replication_ip_whitelist = "203.0.113.1,203.0.113.2,203.0.113.3"
loose-group_replication_group_seeds = ""203.0.113.1:33061,203.0.113.2:33061,203.0.113.3:33061"
. . .

این بخش باید در هریک از سرورهای MySQL شما یکسان باشد؛ بنابراین، مطمئن شوید که آن را با دقت روی هرکدام کپی کنید.

3. انتخاب Single-Primary یا Multi-Primary

در مرحله بعد، باید تصمیم بگیرید که یک گروه Single-Primary یا Multi-Primary را پیکربندی کنید.

  • در پیکربندی Single-Primary ،MySQL یک سرور اصلی (تقریباً همیشه اولین عضو گروه) را برای مدیریت و نوشتن داده‌ها تعیین می‌کند.
  • در پیکربندی Multi-Primary، به هریک از اعضای گروه اجازه نوشتن داده‌ها و عملیات‌ها داده می‌شود.

اگر می‌خواهید Multi-Primary را پیکربندی کنید، دستورهای loose-group_Replication_single_primary_mode و loose-group_Replication_enforce_update_everywhere_checks را از حالت کامنت خارج کنید. با این کار، یک گروه Multi-Primary راه‌اندازی می‌شود. برای پیکربندی Single-Primary، فقط آن دو خط را در کامنت بگذارید:

. . .
# Single or Multi-primary mode? Uncomment these two lines
# for multi-primary mode, where any host can accept writes
#loose-group_replication_single_primary_mode = OFF
#loose-group_replication_enforce_update_everywhere_checks = ON
. . .

این تنظیمات باید در هریک از سرورهای MySQL شما یکسان باشد. بعداً این تنظیمات را می‌توانید تغییر دهید؛ اما برای انجام این کار، باید هر‌یک از اعضای گروه MySQL خود را مجدداً راه‌اندازی کنید. به‌منظور تغییر پیکربندی جدید، باید هر‌یک از نمونه‌های MySQL را در گروه متوقف و هر عضو را با تنظیمات جدید ری‌استارت و سپس Group Replication را دوباره راه‌اندازی کنید. این کار روی هیچ‌یک از داده‌هایتان تأثیر نمی‌گذارد؛ اما تنها به یک خطا برای ازکارافتادن نیاز دارد.

برای آشنایی با 10 ابزار پرکاربرد نظارت بر ترافیک شبکه اوبونتو مقاله زیر را از دست ندهید.

نظارت بر ترافیک شبکه اوبونتو

4. پیکربندی تنظیمات خاص هر سرور

بخش چهارم شامل تنظیماتی است که در هریک از سرورها متفاوت خواهد بود، ازجمله:

  • شناسه سرور
  • آدرسی که باید به آن متصل شود
  • آدرسی که باید به سایر اعضا گزارش دهید
  • آدرس Local Replication و پورت Listening

در server_id، باید برای هر سرور را به عددی خاص تخصیص دهید. برای عضو اول، این عدد را روی 1 تنظیم کنید و برای سرورهای بعدی آن را به‌ترتیب افزایش دهید. bind-address و report_host را روی آدرس IP سرور مرتبط تنظیم کنید تا MySQL به اتصالات خارجی گوش دهد و آدرس آن را به‌درستی به میزبان‌های دیگر گزارش دهد. loose-group_Replication_local_address نیز باید روی آدرس IP سرور فعلی با پورت Group Replication (33061) تنظیم شود که به آدرس IP اضافه شده است.

به‌عنوان مثال، این قسمت از پیکربندی را برای Member1 با استفاده از آدرس IP به‌کار بردیم:

. . .
# Host specific replication configuration
server_id = 1
bind-address = "203.0.113.1"
report_host = "203.0.113.1"
loose-group_replication_local_address = "203.0.113.1:33061"

این فرایند را در هریک از سرورهای MySQL خود تکمیل کنید. پیکربندی زیر برای Member2 است:

. . .
# Host specific replication configuration
server_id = 2
bind-address = "203.0.113.2"
report_host = "203.0.113.2"
loose-group_replication_local_address = "203.0.113.2:33061"

همچنین، پیکربندی زیر برای Member3 است:

. . .
# Host specific replication configuration
server_id = 3
bind-address = "203.0.113.3"
report_host = "203.0.113.3"
loose-group_replication_local_address = "203.0.113.3:33061"

مطمئن شوید که آدرس IP مربوط به سروری که فایل پیکربندی آن را ویرایش می‌کنید، وارد کرده باشید.

وقتی کارتان تمام شد، دوباره بررسی کنید که تنظیمات پیکربندی Group Replication مشترک در هر سرور یکسان است و تنظیمات خاص هر سرور به‌درستی درون آن قرار داده شده. پس از اتمام کار، فایل را در هر هاست ذخیره کنید و ببندید.

هریک از فایل‌های پیکربندی MySQL سرورهای شما اکنون حاوی دستورالعمل‌های موردنیاز برای MySQL Group Replication است. برای اعمال تنظیمات جدید در نمونه MySQL، سرویس را در هریک از سرورهای خود با دستور زیر ری‌استارت کنید:

sudo systemctl restart mysql

مرحله سوم. به‌روزرسانی قوانین UFW هر سرور

با فرض پیروی از راهنمای پیکربندی اولیه سرور، فایروالی روی هر‌یک از سرورهایی راه‌اندازی کنید که MySQL را روی آن‌ها نصب کرده‌اید و دسترسی به نمایه OpenSSH UFW را فعال کنید. این اقدام امنیتی مهمی است؛ زیرا در‌حال‌حاضر فایروال‌ها اتصالات هر پورت روی سرورهای شما را مسدود می‌کنند؛ اما برای اتصالات SSH ذخیره می‌شوند که کلیدهایی را ارائه می‌کنند و با فایل‌های مرتبط در فایل authorized_keys هر سرور هماهنگ هستند.

در فایل پیکربندی MySQL، سرویس را طوری پیکربندی کرده‌اید که به اتصالات خارجی در پورت پیش‌فرض 3306 گوش دهد. همچنین، 33061 را به‌عنوان پورتی تعریف کرده‌اید که اعضا باید از آن برای هماهنگی تکرار استفاده کنند.

در هریک از سرورهای عضو خود، باید دسترسی به این پورت‌ها را برای سایر اعضای این گروه باز کنید تا همه آن‌ها بتوانند با یکدیگر ارتباط برقرار کنند. به‌منظور بازکردن دسترسی به این پورت‌ها در Member1 برای Member2، دستورهای UFW زیر را روی Member1 اجرا کنید:

sudo ufw allow from member2_server_ip to any port 3306
sudo ufw allow from member2_server_ip to any port 33061

حتماً عضو 2_server_ip را به نشانی IP واقعی سرور Member2 تغییر دهید. سپس، برای بازکردن همان پورت‌ها برای Member3، این دستورها را اجرا کنید:

sudo ufw allow from member3_server_ip to any port 3306
sudo ufw allow from member3_server_ip to any port 33061

درادامه، قوانین فایروال را برای دو سرور دیگر خود به‌روز کنید. دستورهای زیر را روی Member2 اجرا کنید تا مطمئن شوید که آدرس‌های IP را به‌ترتیب تغییر داده‌اید و آدرس‌های Member1 و Member3 را برعکس وارد نکرده‌اید:

sudo ufw allow from member1_server_ip to any port 3306
sudo ufw allow from member1_server_ip to any port 33061
sudo ufw allow from member3_server_ip to any port 3306
sudo ufw allow from member3_server_ip to any port 33061

در‌نهایت، این دو دستور را روی Member3 اجرا کنید. مجدداً مطمئن شوید که آدرس‌های IP صحیح را برای هر سرور وارد کرده‌اید:

sudo ufw allow from member1_server_ip to any port 3306
sudo ufw allow from member1_server_ip to any port 33061
sudo ufw allow from member2_server_ip to any port 3306
sudo ufw allow from member2_server_ip to any port 33061

پس از افزودن این قوانین UFW، هریک از سه نمونه MySQL شما اجازه دسترسی به پورت‌های استفاده‌شده MySQL در دو سرور دیگر را خواهند داشت. با بازبودن دسترسی به پورت‌های MySQL، اکنون می‌توانید یک کاربر Replication ایجاد و افزونه Group Replication را فعال کنید.

برای آموزش پیکربندی و نصب vnc در اوبونتو 20.04 مقاله زیر را از دست ندهید.

vnc در اوبونتو 20.04

مرحله چهارم. پیکربندی کاربران Replication و فعال‌کردن پلاگین Group Replication

به‌منظور برقراری ارتباط با سایر سرورها در Group Replication، هر نمونه MySQL باید یک کاربر Replication اختصاصی داشته باشد. در هریک از سرورهای MySQL خود، با کاربر مدیریت وارد نمونه MySQL شوید تا سشن آغاز شود:

sudo mysql

توجه: حتماً هرکدام از دستورهای این بخش را روی هر‌یک از نمونه‌های MySQL خود اجرا کنید.

از‌آن‌جا‌که هر سرور کاربر Replication مخصوص به خود را دارد، باید در طول فرایند ایجاد، ثبت باینری را خاموش کنید؛ وگرنه به‌محض شروع تکثیر، گروه تلاش می‌کند تا کاربر Replication را از سرور اصلی به سرورهای دیگر بفرستد و با کاربر Replication حال‌حاضر به مشکل بر‌می‌خورد. دستور زیر در prompt MySQL را روی هر‌یک از سرورهای خود اجرا کنید:

SET SQL_LOG_BIN=0;

حالا می‌توانید عبارت CREATE USER را برای ایجاد کاربر Replication خود اجرا کنید. با اجرای دستور زیر، کاربری به نام repl ایجاد کنید. این دستور مشخص می‌کند که کاربر Replication باید با استفاده از SSL متصل شود. همچنین، هنگام ایجاد این کاربر Replication، مطمئن شوید که از رمزعبور امن استفاده می‌کنید:

CREATE USER 'repl'@'%' IDENTIFIED BY 'password' REQUIRE SSL;

در مرحله بعد، به کاربر جدید امتیازهای Replication را در سرور اعطا کنید:

GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';

سپس برای اجرای تغییرات، امتیازها را پاک کنید:

FLUSH PRIVILEGES;

پس‌از‌آن، ثبت باینری را دوباره فعال کنید تا عملیات عادی از سر گرفته شود:

SET SQL_LOG_BIN=1;

درادامه، کانال group_Replication_recovery را طوری تنظیم کنید که از کاربر Replication جدید و رمزعبور مرتبط با آن استفاده کند. هر سرور از این اعتبارنامه‌ها برای احراز هویت در گروه بهره می‌برد:

CHANGE REPLICATION SOURCE TO SOURCE_USER='repl', SOURCE_PASSWORD='password' FOR CHANNEL 'group_replication_recovery';

توجه: اگر از نسخه‌ MySQL قدیمی‌تر از 8.0.23 استفاده می‌کنید، باید از نحو قدیمی MySQL برای تنظیم آن استفاده کنید:

CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='password' FOR CHANNEL 'group_replication_recovery';

با استفاده از کاربر Replication، می‌توانید افزونه group_Replication را فعال کنید تا برای مقداردهی اولیه گروه آماده شود:

INSTALL PLUGIN group_replication SONAME 'group_replication.so';

با اجرای دستور زیر، مطمئن شوید که افزونه فعال است:

SHOW PLUGINS;

افزونه group_Replication در انتهای فهرست ظاهر می‌شود؛ زیرا این افزونه اخیراً اضافه شده است:

+----------------------------+----------+--------------------+----------------------+---------+
| Name                       | Status   | Type               | Library              | License |
+----------------------------+----------+--------------------+----------------------+---------+
|                            |          |                    |                      |         |
| . . .                      | . . .    | . . .              | . . .                | . . .   |
|                            |          |                    |                      |         |
| group_replication          | ACTIVE   | GROUP REPLICATION  | group_replication.so | GPL     |
+----------------------------+----------+--------------------+----------------------+---------+
45 rows in set (0.00 sec)

این خروجی تأیید می‌کند که افزونه بارگذاری شده و در‌حال‌حاضر فعال است. قبل از ادامه مرحله بعدی، مطمئن شوید که هر دستور این بخش را روی هریک از سرورهای MySQL خود اجرا کرده‌اید.

مرحله پنجم. شروع Group Replication

اکنون که هر سرور MySQL یک کاربر Replication دارد و افزونه تکرار گروه فعال است، می‌توانید عملیات خود را شروع کنید.

1. راه‌اندازی اولین نود

برای راه‌اندازی یک گروه، مراحل زیر را روی یکی از اعضای گروه انجام دهید. در این بخش، عملیات‌ها را روی Member1 انجام دادیم. اعضای گروه برای ارسال داده‌های Replication، در ابتدا به داده‌های موجود متکی هستند؛ به‌همین‌دلیل، باید از روشی کمی متفاوت برای راه‌اندازی عضو اولیه گروه استفاده کنید تا بداند که انتظار این اطلاعات اولیه را از سایر سرورهای خود نداشته باشد.

اگر متغیر group_Replication_bootstrap_group را تنظیم کنید، به اعضا می‌گوید که نباید انتظار دریافت اطلاعات از همتایان را داشته باشند و در‌عوض، باید گروهی جدید ایجاد و خود را به‌عنوان عضو اصلی انتخاب کنند. با دستور زیر، می‌توانید این متغیر را فعال کنید:

SET GLOBAL group_replication_bootstrap_group=ON;

سپس، همانندسازی را برای عضو گروه اولیه می‌توانید شروع کنید:

START GROUP_REPLICATION;

درادامه، متغیر group_Replication_bootstrap_group را به OFF می‌توانید برگردانید؛ زیرا این متغیر زمانی مفید است که هیچ عضو دیگری از گروه موجود نباشد.

SET GLOBAL group_replication_bootstrap_group=OFF;

گروه با این سرور به‌عنوان تنها عضو راه‌اندازی می‌شود. این را با بررسی ورودی‌های جدول Replication_group_members در performance_schema پایگاه‌داده تأیید کنید:

SELECT * FROM performance_schema.replication_group_members;

این کوئری یک ردیف را بر‌می‌گرداند که نشان‌دهنده هاست فعلی است:

+---------------------------+--------------------------------------+---------------+-------------+--------------+-------------+----------------+----------------------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST   | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION | MEMBER_COMMUNICATION_STACK |
+---------------------------+--------------------------------------+---------------+-------------+--------------+-------------+----------------+----------------------------+
| group_replication_applier | 13324ab7-1b01-11e7-9dd1-22b78adaa992 | 203.0.113.1  |        3306 | ONLINE       | PRIMARY     | 8.0.28         | XCom                       |
+---------------------------+--------------------------------------+---------------+-------------+--------------+-------------+----------------+----------------------------+
1 row in set (0.00 sec)

مقدار ONLINE برای MEMBER_STATE نشان می‌دهد که این نود به‌طور کامل در گروه است. سپس، یک پایگاه‌داده و جدول آزمایشی با تعدادی اطلاعات آزمایشی ایجاد کنید. هنگامی که اعضای بیشتری به این گروه اضافه می‌شوند، این داده‌ها به‌طور خودکار برای آن‌ها تکرار می‌شود.

با ایجاد پایگاه‌داده آزمایشی به نام Playground (زمین بازی) شروع کنید:

CREATE DATABASE playground;

سپس با دستور زیر، جدولی آزمایشی با نام Equipment (تجهیزات) در پایگاه‌داده Playground ایجاد کنید:

CREATE TABLE playground.equipment ( 
id INT NOT NULL AUTO_INCREMENT,
type VARCHAR(50),
quant INT,
color VARCHAR(25),
PRIMARY KEY(id)
);

این جدول شامل چهار ستون زیر است:

  • id: حاوی مقادیر integer است که به‌طور خودکار افزایش می‌یابد. این یعنی وقتی جدول را با داده‌های آزمایشی ایجاد می‌کنید، به تعیین مقادیر برای این ستون نیازی نخواهید داشت.
  • type: حاوی مقادیر string است که نشان‌دهنده نوع تجهیزات زمین بازی در هر ردیف است.
  • quant: حاوی مقادیر integer برای نشان‌دادن مقدار نوع تجهیزات زمین بازی است.
  • color: مقادیر string را در خود نگه می‌دارد که رنگ تجهیزات داده‌شده را ذخیره می‌کند.

همچنین، توجه کنید که ستون id به‌عنوان کلید اصلی (Primary Key) این جدول مشخص شده است. در MySQL، هر جدولی که در یک گروه تکثیر می‌شود، باید ستونی به‌عنوان کلید اصلی آن جدول داشته باشد.

در‌نهایت، دستور زیر را برای درج یک ردیف داده در جدول اجرا کنید:

INSERT INTO playground.equipment (type, quant, color) VALUES ("slide", 2, "blue");

برای اطمینان از صحت ایجاد جداول، آن جدول را نمایش دهید:

SELECT * FROM playground.equipment;

خروجی:

+----+-------+-------+-------+
| id | type  | quant | color |
+----+-------+-------+-------+
|  1 | slide |     2 | blue  |
+----+-------+-------+-------+
1 row in set (0.00 sec)

پس از اطمینان از عضویت این سرور در گروه و داشتن قابلیت نوشتن، سایر سرورها می‌توانند به گروه ملحق شوند.

برای آموزش کامل نصب داکر روی اوبونتو 20.04 و کار با Docker مقاله زیر را از دست ندهید.

نصب داکر روی اوبونتو 20.04

2. راه‌اندازی نودهای باقی‌مانده

در مرحله بعد، Group Replication را در Member2 آغاز کنید. ازآن‌جاکه از قبل یک عضو فعال دارید، به بوت‌استرپ گروه نیازی ندارید و این عضو می‌تواند فوراً به آن بپیوندد:

START GROUP_REPLICATION;

در Member3 نیز، Group Replication را به‌همین‌صورت آغاز کنید:

START GROUP_REPLICATION;

فهرست عضویت را دوباره در هریک از سه سرور بررسی کنید. این بار سه سرور در خروجی فهرست خواهد شد:

SELECT * FROM performance_schema.replication_group_members;

خروجی:

+---------------------------+--------------------------------------+---------------+-------------+--------------+-------------+----------------+----------------------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST   | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION | MEMBER_COMMUNICATION_STACK |
+---------------------------+--------------------------------------+---------------+-------------+--------------+-------------+----------------+----------------------------+
| group_replication_applier | 13324ab7-1b01-11e7-9dd1-22b78adaa992 | 203.0.113.1  |        3306 | ONLINE       | PRIMARY     | 8.0.28         | XCom                       |
| group_replication_applier | 1ae4b211-1b01-11e7-9d89-ceb93e1d5494 | 203.0.113.2  |        3306 | ONLINE       | SECONDARY   | 8.0.28         | XCom                       |
| group_replication_applier | 157b597a-1b01-11e7-9d83-566a6de6dfef | 203.0.113.3  |        3306 | ONLINE       | SECONDARY   | 8.0.28         | XCom                       |
+---------------------------+--------------------------------------+---------------+-------------+--------------+-------------+----------------+----------------------------+
3 rows in set (0.00 sec)

MEMBER_STATE همه اعضا باید ONLINE باشد. برای گروه جدید، اگر هریک از گره‌ها به‌عنوان RECOVERING بیش از چند ثانیه فهرست شوند، معمولاً نشانه‌ای از وقوع خطا یا پیکربندی اشتباه است. گزارش‌ها را در /var/log/mysql/error.log بررسی کنید تا اطلاعات بیشتری درباره اشتباه مرتکب‌شده دریافت کنید.

سپس، بررسی کنید که آیا اطلاعات پایگاه‌داده آزمایشی روی اعضای جدید تکرار شده است یا خیر:

SELECT * FROM playground.equipment;

خروجی:

+----+-------+-------+-------+
| id | type  | quant | color |
+----+-------+-------+-------+
|  1 | slide |     2 | blue  |
+----+-------+-------+-------+
1 row in set (0.01 sec)

اگر داده‌های سرورهای جدید موجود باشند، بدین‌معنی است که Group Replication به‌درستی کار می‌کند.

برای اینکه بدانید Replication در MySQL چیست و Replication همزمان و غیرهمزمان چه تفاوتی با هم دارند مقاله زیر را بخوانید.

مقایسه Asynchronous Replication و Synchronous Replication

مرحله ششم. آزمایش قابلیت نوشتن اعضای جدید گروه

در مرحله بعد، می‌توانید داده‌ها را از سرورهای جدید به سرورتان وارد کنید. انجام این عملیات کاملاً به نوع پیکربندی گروه‌های شما، یعنی Single-Primary یا Multi-Primary ربط دارد.

1. آزمایش قابلیت نوشتن با Single-Primary

در یک گروه Single-Primary، باید انتظار داشته باشید که هرگونه عملیات نوشتن از یک سرور غیراصلی به‌دلیل Consistency یا سازگاری رد شود. در هر زمان با اجرای کوئری زیر، می‌توانید Primary اولیه خود را پیدا کنید:

SHOW STATUS LIKE '%primary%';

خروجی:

Output
+----------------------------------+--------------------------------------+
| Variable_name                    | Value                                |
+----------------------------------+--------------------------------------+
| group_replication_primary_member | 13324ab7-1b01-11e7-9dd1-22b78adaa992 |
+----------------------------------+--------------------------------------+
1 row in set (0.01 sec)

مقدار خروجی این کوئری MEMBER_ID شما خواهد بود که می‌توانید با MEMBER_ID سرور میزبان خود مطابقت دهید:

SELECT * FROM performance_schema.replication_group_members;

خروجی:

+---------------------------+--------------------------------------+--------------+-------------+--------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST  | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+--------------+-------------+--------------+
| group_replication_applier | 13324ab7-1b01-11e7-9dd1-22b78adaa992 | 203.0.113.1  |        3306 | ONLINE       |
| group_replication_applier | 1ae4b211-1b01-11e7-9d89-ceb93e1d5494 | 203.0.113.2  |        3306 | ONLINE       |
| group_replication_applier | 157b597a-1b01-11e7-9d83-566a6de6dfef | 203.0.113.3  |        3306 | ONLINE       |
+---------------------------+--------------------------------------+--------------+-------------+--------------+
3 rows in set (0.01 sec)

همان‌طور‌که این خروجی نشان می‌دهد، میزبان در 203.0.113.1- Member1 – در‌حال‌حاضر سرور اصلی است. اگر بخواهید ازطریق عضوی دیگر در پایگاه‌داده بنویسید، عملیات با شکست مواجه خواهد شد:

INSERT INTO playground.equipment (type, quant, color) VALUES ("swing", 10, "yellow");

خروجی:

ERROR 1290 (HY000): The MySQL server is running with the --super-read-only option so it cannot execute this statement

این خطا درست است؛ زیرا سیستم Single-Primary پیکر‌بندی‌ شده است و تنها به یک سرور قابلیت نوشتن می‌دهد. اگر سرور اصلی مشکل داشته باشد و گروه را ترک کند، گروه به‌طور خودکار عضوی جدید را به‌عنوان Single-Primary انتخاب می‌کند و نوشتن را می‌پذیرد.

2. آزمایش قابلیت نوشتن با Multi-Primary

برای گروه‌هایی که با Multi-Primary پیکربندی شده‌اند، هر عضوی باید بتواند کاری را در پایگاه‌داده انجام دهد. با بررسی مجدد مقدار group_Replication_primary_member متغیر، می‌توانید ببینید که گروه شما در حالت Multi-Primary کار می‌کند یا خیر:

SHOW STATUS LIKE '%primary%';

خروجی:

+----------------------------------+-------+
| Variable_name                    | Value |
+----------------------------------+-------+
| group_replication_primary_member |       |
+----------------------------------+-------+
1 row in set (0.02 sec)

اگر متغیر خالی باشد، بدین‌معنی است که میزبان اصلی تعیین‌شده‌ای وجود ندارد و هر عضوی باید بتواند نوشتن را بپذیرد. با تلاش برای نوشتن برخی از داده‌ها در جدول Equipment، این Multi-Primary را روی Member2 آزمایش کنید:

INSERT INTO playground.equipment (type, quant, color) VALUES ("swing", 10, "yellow");

خروجی:

Query OK, 1 row affected (0.00 sec)

Member2 بدون هیچ خطایی عملیات نوشتن را انجام داد. در Member3، کوئری زیر را اجرا کنید تا ببینید که آیا مورد جدید اضافه شده است یا خیر:

SELECT * FROM playground.equipment;

خروجی:

+----+-------+-------+--------+
| id | type  | quant | color  |
+----+-------+-------+--------+
|  1 | slide |     2 | blue   |
|  2 | swing |    10 | yellow |
+----+-------+-------+--------+
2 rows in set (0.00 sec)

این تأیید می‌کند که داده Member2 با موفقیت تکرار شده است. اکنون با اجرای عبارت زیر، قابلیت‌های نوشتن را روی Member3 و با INSERT آزمایش کنید:

INSERT INTO playground.equipment (type, quant, color) VALUES ("seesaw", 3, "green");

خروجی:

Query OK, 1 row affected (0.02 sec)

به Member1 بازگردید و آزمایش کنید که آیا داده‌های جدید وارد شده‌اند یا خیر:

SELECT * FROM playground.equipment;

خروجی:

+----+--------+-------+--------+
| id | type   | quant | color  |
+----+--------+-------+--------+
|  1 | slide  |     2 | blue   |
|  2 | swing  |    10 | yellow |
|  3 | seesaw |     3 | green  |
+----+--------+-------+--------+
3 rows in set (0.01 sec)

این خروجی تأیید می‌کند که تکرار در هر جهت کار می‌کند و هر عضو عملیات نوشتن را می‌تواند انجام دهد.

mysql چیست؟

آموزش کامل پیکربندی Group Replication در MySQL

مرحله هفتم. بازگرداندن گروه

هنگامی که گروه کامل پیکربندی و اجرا شد، تا زمانی که اعضای کافی برای انتخاب سرورهای اولیه وجود داشته باشند، اعضای دیگر هم می‌توانند بدون تأثیر بر دردسترس‌بودن بپیوندند یا ترک کنند. بااین‌حال، اگر تغییرات خاصی در پیکربندی انجام شود (مانند جا‌به‌جایی بین Multi-Primary و Single-Primary) یا همه اعضا گروه را ترک کنند، ممکن است لازم باشد گروه را به همان روشی که در ابتدا انجام دادید، دوباره بوت کنید.

در Member1، متغیر group_Replication_bootstrap_group را روی ON قرار دهید:

SET GLOBAL GROUP_REPLICATION_BOOTSTRAP_GROUP=ON;

سپس، گروه را برای مقداردهی اولیه آماده کنید:

START GROUP_REPLICATION;

بعداز‌آن، می‌توانید متغیر group_Replication_bootstrap_group را روی OFF قرار دهید:

SET GLOBAL GROUP_REPLICATION_BOOTSTRAP_GROUP=OFF;

هنگامی که اولین عضو گروه را راه‌اندازی کرد، سایر اعضا می‌توانند بپیوندند:

START GROUP_REPLICATION;

این روند را برای اعضای دیگر اجرا کنید:

START GROUP_REPLICATION;

اکنون، گروه باید آنلاین باشد و همه اعضا در‌دسترس باشند:

SELECT * FROM performance_schema.replication_group_members;

خروجی:

+---------------------------+--------------------------------------+--------------+-------------+--------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST  | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+--------------+-------------+--------------+
| group_replication_applier | 13324ab7-1b01-11e7-9dd1-22b78adaa992 | 203.0.113.1  |        3306 | ONLINE       |
| group_replication_applier | 1ae4b211-1b01-11e7-9d89-ceb93e1d5494 | 203.0.113.2  |        3306 | ONLINE       |
| group_replication_applier | 157b597a-1b01-11e7-9d83-566a6de6dfef | 203.0.113.3  |        3306 | ONLINE       |
+---------------------------+--------------------------------------+--------------+-------------+--------------+
3 rows in set (0.01 sec)

درصورت لزوم، می‌توان از این فرایند برای راه‌اندازی مجدد گروه استفاده کرد.

مرحله هشتم. پیوستن خودکار به گروه هنگام شروع MySQL

با تنظیمات فعلی، اگر سرور عضو ری‌بوت شود، هنگام راه‌اندازی به‌طور خودکار به گروه ملحق نمی‌شود. اگر می‌خواهید اعضا به‌طور خودکار دوباره به گروه ملحق شوند، می‌توانید فایل پیکربندی را کمی تغییر دهید.

تنظیمات ذکر‌شده در این مرحله زمانی مفید است که بخواهید اعضا به‌طور خودکار هنگام راه‌اندازی به آن ملحق شوند. این نکته را مدنظر قرار دهید که مواردی وجود دارد که باید از آن‌ها آگاه باشید:

۱. این تنظیم فقط زمانی تأثیر می‌گذارد که خود نمونه MySQL شروع شود. اگر عضو به‌دلیل مشکلات مهلت زمانی از گروه حذف شود؛ اما نمونه MySQL آنلاین باقی بماند، عضو به‌طور خودکار دوباره ملحق نخواهد شد؛

۲. فعال‌بودن این تنظیم در اولین راه‌اندازی گروه می‌تواند مشکل‌ساز باشد. هنگامی که گروه موجودی برای پیوستن وجود نداشته باشد، فرایند MySQL زمان زیادی طول می‌کشد تا شروع شود؛ زیرا سعی می‌کند با سایر اعضای موجود تماس بگیرد تا مقداردهی اولیه شود و تنها پس از تایم‌اوت طولانی متوقف می‌شود و روند معمولی خود را طی می‌کند. پس‌از‌آن، باید از روشی که پیش‌تر گفتیم، برای بوت استرپ گروه استفاده کنید.

با درنظرگرفتن هشدارهای یادشده، اگر می‌خواهید هنگام شروع MySQL نودها را برای پیوستن خودکار به گروه پیکربندی کنید، فایل اصلی پیکربندی MySQL را باز کنید:

sudo nano /etc/mysql/my.cnf

درون این فایل، متغیر loose-group_Replication_start_on_boot را پیدا کنید و روی ON قرار دهید.

[mysqld]
. . .
loose-group_replication_start_on_boot = ON
. . .

پس از اتمام کار، فایل را ذخیره کنید و ببندید. زمانی که نمونه MySQL شروع شد، عضو باید به‌طور خودکار به گروه ملحق شود.

نتیجه‌گیری

در این مقاله از آموزش اوبونتو، نحوه پیکربندی Group Replication MySQL بین سه سرور Ubuntu 20.04 را آموزش دادیم. برای پیکربندی Single-Primary، اعضا به‌طور خودکار و در‌صورت لزوم یک نود با قابلیت نوشتن را انتخاب می‌کنند. برای گروه‌های Multi-Primary، هر عضوی می‌تواند نوشتن و به‌روزرسانی را انجام دهد.

Group Replication توپولوژی تکرار منعطفی را فراهم می‌کند که به اعضا اجازه می‌دهد به‌دلخواه خود بپیوندند یا ترک کنند و در‌عین‌حال، تضمین‌هایی درزمینه سازگاری داده‌ها و ترتیب پیام‌ها ارائه دهند. Group Replication MySQL ممکن است پیکربندی کمی پیچیده‌ای داشته باشد؛ اما قابلیت‌هایی ارائه می‌کند که در تکرار معمولی نیست.

سؤالات متداول

۱. در Group Replication MySQL اوبونتو حداکثر چند سرور را می‌توان متصل کرد؟

۹ سرور

۲. آیا MySQL رایگان است؟

بله.

۳. آیا می‌توانیم MySQL را روی ویندوز نصب کنیم؟

بله، با استفاده از ابزارهایی مانند Xampp و Wamp.

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

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


ارسال دیدگاه در وبلاگ پارس‌پک را مطالعه کرده و آن‌ها را می‌پذیرم.

با خدمات ابری پارس پک آشنا شوید

اولین ارائه‌دهنده خدمات رایانش ابری در ایران هستیم