چگونه یک کلاستر MySQL به صورت Multi-Node در اوبونتو ایجاد کنیم؟

MySQL Cluster یک راهحل ذخیرهسازی توزیعشده و بهینه برای برنامههایی است که نیاز به دسترسی بالا (High Availability)، مقیاسپذیری (Scalability)، و پایداری بالا دارند. در زیر به دلایل عمدهای که ممکن است نیاز به MySQL Cluster داشته باشید، اشاره میشود:
۱. دسترسی بالا (High Availability):
MySQL Cluster به شما امکان میدهد که از دسترسی بالایی به دادههایتان اطمینان حاصل کنید. این سیستم از معماری Single Point of Failure استفاده میکند، که به این معناست که حتی اگر یک یا چند گره (Node) در خوشه از کار بیافتند، دادهها همچنان در دسترس خواهند بود.
۲. مقیاسپذیری افقی (Horizontal Scalability):
با MySQL Cluster، میتوانید بهطور افقی تعداد گرههای دیتابیس را افزایش دهید تا توانایی مدیریت حجم بالاتری از دادهها و تراکنشها را داشته باشید. این نوع مقیاسپذیری بهخصوص برای برنامههایی که باید حجم بالایی از درخواستها و دادهها را مدیریت کنند، مناسب است.
۳. عملکرد بالا (High Performance):
MySQL Cluster از ساختار حافظهای و توزیعشده برای ذخیرهسازی و مدیریت دادهها استفاده میکند. این ویژگیها باعث میشوند تا عملکرد سیستم بهطور چشمگیری افزایش یابد، بهخصوص برای عملیات خواندن و نوشتن با سرعت بالا.
۴. تحمل خطا (Fault Tolerance):
این سیستم بهگونهای طراحی شده که میتواند خرابیهای گرهها را بدون اختلال در عملکرد کلی سیستم تحمل کند. این به این معنی است که حتی در شرایط بحرانی، برنامههای شما بدون از دست دادن دادهها به کار خود ادامه خواهند داد.
۵. سازگاری با برنامههای Real-Time:
MySQL Cluster برای برنامههایی که نیاز به پاسخگویی در زمان واقعی دارند، مناسب است. به دلیل ساختار حافظهای و توزیعشدهاش، میتواند بهسرعت به درخواستها پاسخ دهد و از تأخیرهای طولانی جلوگیری کند.
۶. توزیع جغرافیایی دادهها:
اگر نیاز دارید که دادههایتان در مکانهای جغرافیایی مختلف توزیع شوند، MySQL Cluster این امکان را به شما میدهد که گرههای دیتابیس را در نقاط مختلف جهان مستقر کنید. این قابلیت میتواند به کاهش تأخیرها و افزایش سرعت دسترسی به دادهها کمک کند.
۷. سازگاری با تراکنشهای توزیعشده:
MySQL Cluster از تراکنشهای توزیعشده پشتیبانی میکند، که به این معناست که میتوانید عملیات پیچیده را به صورت امن و همزمان بر روی دادههای توزیعشده انجام دهید.
۸. پشتیبانی از برنامههای مقیاسپذیر و پرفشار:
برای برنامههایی که حجم بالایی از کاربران و تراکنشها را مدیریت میکنند، MySQL Cluster میتواند یک راهحل کارآمد و موثر باشد.
با توجه به این دلایل، اگر شما به دنبال یک راهحل دیتابیس هستید که بتواند نیازهای دسترسی بالا، مقیاسپذیری، و پایداری را فراهم کند، کلاستر کردن MySQL ممکن است انتخاب مناسبی برای شما باشد.
پایگاه داده توزیعشده MySQL Cluster، دسترسپذیری بالا و کارایی مناسب را برای سیستم مدیریت پایگاه داده MySQL شما فراهم میکند. یک MySQL Cluster شامل یک یا چند نود مدیریت (ndb_mgmd) است که پیکربندی کلاستر را ذخیره کرده و نودهای داده (ndbd) را که دادههای کلاستر در آنها ذخیره میشود، کنترل میکنند. پس از ارتباط با نود مدیریت، کلاینتها (شامل کلاینتهای MySQL، سرورها یا APIهای بومی) بهصورت مستقیم به این نودهای داده متصل میشوند.
در MySQL Cluster معمولاً تکثیر داده وجود ندارد، بلکه به جای آن همگامسازی نودهای داده صورت میگیرد. برای این منظور باید از یک موتور داده خاص به نام NDBCluster (NDB) استفاده شود. میتوان به کلاستر به عنوان یک محیط منطقی واحد MySQL با اجزای افزونهدار فکر کرد. بنابراین، یک MySQL Cluster میتواند در تکثیر با دیگر MySQL Clusterها شرکت کند.
MySQL Cluster در محیطهای shared-nothing به بهترین شکل عمل میکند. ایدهآل این است که هیچ دو جزئی نباید از یک سختافزار مشترک استفاده کنند. برای سادگی و به منظور نمایش، ما به استفاده از تنها سه سرور محدود خواهیم شد. دو سرور را به عنوان نودهای داده تنظیم خواهیم کرد که دادهها را بین خود همگامسازی میکنند. سرور سوم برای Cluster Manager و همچنین برای سرور/کلاینت MySQL استفاده خواهد شد. اگر سرورهای اضافی راهاندازی کنید، میتوانید نودهای داده بیشتری به کلاستر اضافه کنید، Cluster Manager را از سرور/کلاینت MySQL جدا کنید و سرورهای بیشتری را به عنوان Cluster Managers و سرور/کلاینتهای MySQL تنظیم کنید.
پیشنیازها
برای تکمیل این آموزش، به سه سرور نیاز خواهید داشت: دو سرور برای redundant MySQL data nodes و یک سرور برای Cluster Manager (ndb_mgmd) و سرور/کلاینت MySQL (mysqld و mysql).
سه سرور برای مثال با آی پی های زیر باید داشته باشیم:
۱۹۸.۵۱.۱۰۰.۰ –> first MySQL Cluster data node
198.۵۱.۱۰۰.۱ –> second data node
198.۵۱.۱۰۰.۲ –> Cluster Manager & MySQL server node
منظور از “نود MySQL server/client” در اینجا سرور یا کلاینت MySQL است که به عنوان بخشی از کلاستر MySQL عمل میکند. این نود میتواند نقش سرور MySQL (mysqld) را داشته باشد که درخواستهای پایگاه داده را پردازش میکند و همچنین به عنوان کلاینت MySQL (mysql) عمل کند که به سرورهای MySQL دیگر در کلاستر متصل میشود و با آنها تعامل دارد.
در این سناریو، نود MySQL server/client معمولاً روی همان سروری قرار میگیرد که Cluster Manager نیز روی آن اجرا میشود. این نود به مدیریت و تعامل با نودهای داده (data nodes) کمک میکند و به عنوان نقطه ورودی برای تعاملات با پایگاه داده توسط کاربران یا برنامهها عمل میکند.
نصب و پیکربندی Cluster Manager
ابتدا با دانلود و نصب MySQL Cluster Manager، یعنی ndb_mgmd، شروع خواهیم کرد. برای نصب Cluster Manager، ابتدا باید فایل نصبکننده .deb مناسب را از صفحه دانلود رسمی MySQL Cluster دریافت کنید:
https://dev.mysql.com/downloads/cluster/
پایین بروید تا به بخش DEB Package، NDB Management Server برسید و روی لینک دانلودی که dbgsym را ننوشته (مگر اینکه نیاز به نمادهای اشکالزدایی داشته باشید) کلیک کنید. شما به صفحه Begin Your Download هدایت خواهید شد. در اینجا، روی گزینه No thanks, just start my download راست کلیک کرده و لینک فایل .deb را کپی کنید.
برای نمونه برای اوبونتوی ۲۴.۰۴ فایل زیر را پیدا و دانلود کنید:
Ubuntu Linux 24.04 (x86, 64-bit), DEB Package
اکنون، به ماشین مربوط به Cluster Manager خود (در این آموزش، ۱۹۸.۵۱.۱۰۰.۲) وارد شده و فایل deb را داخل آن آپلود نمایید. با استفاده از دستور dpkg -i آن را نصب کنید.
اکنون باید ndb_mgmd را قبل از اولین اجرا پیکربندی کنیم؛ پیکربندی صحیح، تضمین میکند که همگامسازی و توزیع بار به درستی بین نودهای داده انجام شود.
Cluster Manager باید اولین مؤلفهای باشد که در هر MySQL کلاستر راهاندازی میشود. این مؤلفه به یک فایل پیکربندی نیاز دارد که به عنوان یک آرگومان به فایل اجرایی آن منتقل میشود. ما فایل پیکربندی زیر را ایجاد و استفاده خواهیم کرد: /var/lib/mysql-cluster/config.ini.
در ماشین مربوط به Cluster Manager، دایرکتوری /var/lib/mysql-cluster را ایجاد کنید که این فایل در آن قرار خواهد گرفت:
#mkdir /var/lib/mysql-cluster
#vim /var/lib/mysql-cluster/config.ini
محتویات زیر را در داخل این فایل قرار دهید:
config.ini
[ndbd default] # Options affecting ndbd processes on all data nodes:
NoOfReplicas=2 # Number of replicas
[ndb_mgmd] # Management process options:
hostname=198.51.100.2 # Hostname of the manager
datadir=/var/lib/mysql-cluster # Directory for the log files
[ndbd] hostname=198.51.100.0 # Hostname/IP of the first data node
NodeId=2 # Node ID for this data node
datadir=/usr/local/mysql/data # Remote directory for the data files
[ndbd] hostname=198.51.100.1 # Hostname/IP of the second data node
NodeId=3 # Node ID for this data node
datadir=/usr/local/mysql/data # Remote directory for the data files
[mysqld] # SQL node options:
hostname=198.51.100.2 # In our case the MySQL server/client is on the same Droplet as the cluster manager
مطمئن شوید که مقادیر hostname را با آدرسهای IP صحیح ماشینهایی که پیکربندی کردهاید، جایگزین کنید. تنظیم این پارامتر hostname یک اقدام امنیتی مهم است که مانع از اتصال سرورهای دیگر به Cluster Manager میشود. فایل را ذخیره کرده و ویرایشگر متنی خود را ببندید.
این یک فایل پیکربندی مینیمال و ساده برای یک MySQL Cluster است. شما باید پارامترهای موجود در این فایل را بسته به نیازهای خود سفارشی کنید. برای مشاهده نمونهای از یک فایل پیکربندی کامل ndb_mgmd، به مستندات MySQL Cluster مراجعه کنید:
https://dev.mysql.com/doc/mysql-cluster-excerpt/5.7/en/mysql-cluster-config-starting.html
در فایل فوق، میتوانید با افزودن موارد جدید به بخشهای مناسب، اجزای اضافی مانند نودهای داده (ndbd) یا نودهای سرور MySQL (mysqld) را اضافه کنید.
اکنون میتوانیم مدیریت را با اجرای باینری ndb_mgmd و مشخص کردن فایل پیکربندی با استفاده از فلگ -f آغاز کنیم:
#ndb_mgmd -f /var/lib/mysql-cluster/config.ini
احتمالاً خروجی زیر را خواهید دید:
Output
MySQL Cluster Management Server mysql-5.7.22 ndb-7.6.6
2018-۰۷-۲۵ ۲۱:۴۸:۳۹ [MgmtSrvr] INFO — The default config directory ‘/usr/mysql-cluster’ does not exist. Trying to create it…
2018-۰۷-۲۵ ۲۱:۴۸:۳۹ [MgmtSrvr] INFO — Successfully created config directory
این نشان میدهد که سرور MySQL Cluster Management با موفقیت نصب شده و اکنون روی ماشین شما در حال اجرا است. بهتر است که سرور Cluster Management بهطور خودکار در زمان راهاندازی سیستم شروع به کار کند. برای انجام این کار، قصد داریم یک سرویس systemd ایجاد و فعال کنیم. قبل از اینکه سرویس را ایجاد کنیم، باید سرویس در حال اجرا را متوقف کنیم:
#pkill -f ndb_mgmd
حالا، فایل Unit مربوط به systemd را با استفاده از ویرایشگر مورد علاقه خود باز کرده و ویرایش کنید:
#vim /etc/systemd/system/ndb_mgmd.service
محتویات زیر را داخل آن قرار دهید:
ndb_mgmd.service
[Unit] Description=MySQL NDB Cluster Management Server
After=network.target auditd.service
[Service] Type=forking
ExecStart=/usr/sbin/ndb_mgmd -f /var/lib/mysql-cluster/config.ini
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
[Install] WantedBy=multi-user.target
دستورات زیر را به ترتیب بزنید:
#systemctl daemon-reload
#systemctl enable ndb_mgmd
#systemctl start ndb_mgmd
#systemctl status ndb_mgmd
نصب و پیکربندی Data Nodes
توجه: تمام دستورات این بخش باید روی هر دو data node اجرا شوند.
در این مرحله، ما daemon مربوط به ndbd MySQL Cluster data node را نصب کرده و nodes را به گونهای پیکربندی میکنیم که بتوانند با Cluster Manager ارتباط برقرار کنند.
برای نصب data node binaries ابتدا باید فایل .deb مناسب را از صفحه دانلود رسمی MySQL دریافت کنیم.
https://dev.mysql.com/downloads/cluster/
در این صفحه، تحت عنوان Select Operating System، سیستم عامل Ubuntu Linux را انتخاب کنید. سپس، تحت عنوان Select OS Version، نسخه Ubuntu Linux 24.04 (x86, 64-bit) را انتخاب کنید.
به پایین صفحه بروید تا به بخش DEB Package, NDB Data Node Binaries برسید، و روی لینک Download برای نسخهای که شامل dbgsym نیست (مگر اینکه به debug symbols نیاز داشته باشید) کلیک کنید. شما به صفحهای به نام Begin Your Download هدایت میشوید. در این صفحه، روی گزینه No thanks, just start my download. کلیک راست کنید و لینک فایل .deb را کپی کنید.
اکنون، وارد اولین data node Droplet خود شوید (در این آموزش، ۱۹۸.۵۱.۱۰۰.۰) و این فایل .deb را دانلود کنید و با استفاده از dpkg -i آن را نصب کنید. (قبل از نصب، دستورات زیر را بزنید تا پیش نیازها نصب شوند.)
#apt update
#apt install libclass-methodmaker-perl
نودهای داده (Data Nodes) تنظیمات خود را از مسیر استاندارد MySQL یعنی /etc/my.cnf دریافت میکنند. این فایل را با استفاده از ویرایشگر متن مورد علاقهتان ایجاد کنید و ویرایش آن را آغاز کنید:
#vim /etc/my.cnf
اطلاعات زیر را داخل این فایل قرار دهید:
my.cnf
[mysql_cluster] # Options for NDB Cluster processes:
ndb-connectstring=198.51.100.2 # location of cluster manager
تنها تنظیم مورد نیاز برای شروع ndbd، مشخص کردن مکان Cluster Manager node است. بقیه تنظیمات به طور مستقیم از manager دریافت خواهد شد. فایل را ذخیره کرده و از آن خارج شوید.
در مثال ما، نود داده با توجه به تنظیمات manager متوجه خواهد شد که دایرکتوری دادههای آن /usr/local/mysql/data است. قبل از شروع daemon، این دایرکتوری را روی نود ایجاد خواهیم کرد:
#mkdir -p /usr/local/mysql/data
حالا میتوانیم نود داده را با استفاده از دستور زیر راهاندازی کنیم:
#ndbd
خروجی زیر را باید مشاهده کنید:
Output
2018-۰۷-۱۸ ۱۹:۴۸:۲۱ [ndbd] INFO — Angel connected to ‘198.51.100.2:1186’
2018-۰۷-۱۸ ۱۹:۴۸:۲۱ [ndbd] INFO — Angel allocated nodeid: 2
اکنون MySQL data node شما میتواند از طریق شبکه خصوصی با هر دو Cluster Manager و سایر نودهای داده ارتباط برقرار کند.
در نهایت، میخواهیم که daemon مربوط به data node به صورت خودکار هنگام بوت شدن سرور شروع به کار کند. ما از همان روشی که برای Cluster Manager استفاده کردیم، پیروی کرده و یک سرویس systemd ایجاد میکنیم.
قبل از ایجاد سرویس، فرآیند در حال اجرای ndbd را متوقف خواهیم کرد و سایر مراحل را طبق دستورات زیر پی خواهیم گرفت:
#pkill -f ndbd
#vim /etc/systemd/system/ndbd.service
ndbd.service
After=network.target auditd.service [Service] Type=forking
ExecStart=/usr/sbin/ndbd
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure [Install] WantedBy=multi-user.target
#systemctl daemon-reload
#systemctl enable ndbd
#systemctl start ndbd
#systemctl status ndbd
پس از اتمام تنظیمات اولین data node، مراحل این بخش را روی نود داده دیگر (در این آموزش، ۱۹۸.۵۱.۱۰۰.۱) تکرار کنید.
پیکربندی و راهاندازی MySQL Server و Client
یک سرور استاندارد MySQL، مانند سروری که در مخزن APT اوبونتو موجود است، از موتور MySQL Cluster NDB پشتیبانی نمیکند. به این معنی که نیاز داریم سرور SQL مخصوصی که همراه با دیگر نرمافزارهای MySQL Cluster در این آموزش نصب کردهایم را نصب کنیم.
دوباره باینری MySQL Cluster Server را از صفحه دانلود رسمی MySQL Cluster دریافت خواهیم کرد.
https://dev.mysql.com/downloads/cluster/
در این صفحه، زیر بخش Select Operating System، سیستمعامل Ubuntu Linux را انتخاب کنید. سپس، زیر بخش Select OS Version، نسخه Ubuntu Linux 22.04 (x86, 64-bit) را انتخاب کنید.
به پایین صفحه بروید تا به بخش DEB Bundle برسید و روی لینک Download کلیک کنید (این لینک باید اولین گزینه در لیست باشد). شما به صفحه Begin Your Download منتقل خواهید شد. در اینجا، روی No thanks, just start my download. راست کلیک کنید و لینک مربوط به فایل .tar را کپی کنید.
اکنون، به ماشین Cluster Manager وارد شوید (در این آموزش، ۱۹۸.۵۱.۱۰۰.۲)، و این فایل .tar را دانلود کنید (به یاد داشته باشید که ما در حال نصب MySQL Server بر روی همان نودی هستیم که Cluster Manager ما قرار دارد – در یک محیط پروداکشن باید این دیمنها را بر روی نودهای مختلف اجرا کنید).
#mkdir install
#tar -xvf mysql-cluster_X_amd64.deb-bundle.tar -C install/
#cd install
#apt update
#apt install libaio1 libmecab2
#dpkg -i mysql-common_X_amd64.deb
#dpkg -i mysql-cluster-community-client_X_amd64.deb
#dpkg -i mysql-client_X_amd64.deb
#dpkg -i mysql-cluster-community-server_X_amd64.deb
هنگام نصب mysql-cluster-community-server، یک پنجره پیکربندی ظاهر میشود که از شما میخواهد یک رمز عبور برای حساب root در پایگاه داده MySQL خود تعیین کنید. یک رمز عبور قوی و امن انتخاب کنید و <Ok> را فشار دهید. وقتی از شما خواسته شد، این رمز عبور root را دوباره وارد کنید و دوباره <Ok> را فشار دهید تا نصب کامل شود.
اکنون میتوانیم باینری MySQL server را با استفاده از dpkg نصب کنیم:
#dpkg -i mysql-server_X_amd64.deb
اکنون نیاز داریم MySQL server را پیکربندی کنیم. پیکربندی MySQL Server در فایل پیشفرض /etc/mysql/my.cnf ذخیره میشود. این فایل پیکربندی را با استفاده از ویرایشگر مورد علاقه خود باز کنید:
#vim /etc/mysql/my.cnf
محتویات زیر را به اطلاعاتی که داخل آن وجود دارد اضافه نمایید. (append):
my.cnf
. . .
[mysqld] # Options for mysqld process:
ndbcluster # run NDB storage engine
[mysql_cluster] # Options for NDB Cluster processes:
ndb-connectstring=198.51.100.2 # location of management server
#systemctl restart mysql
#systemctl enable mysql




