مقدمه
کلاسترینگ میتواند قابلیت دسترسی بالا به پایگاه داده شما را تضمین کند. این امر با توزیع تغییرات به چند سرور مختلف ممکن میگردد. در این صورت، اگر یکی از سرورها از کار بیافتد سایر سرورها آماده خدمت رسانی هستند و این منجر به افزایش ضریب اطمینان دسترسی به سرویس میگردد. دو پیکربندی کلی برای کلاسترها وجود دارد: active-passive و active-active در کلاسترهای active-passive تمام عملیاتهای write در یک سرور active صورت میگیرد و سپس به یک یا چند سرور passive دیگر کپی میشود. سرورهای passive فقط در صورت خرابی یک سرور active آماده به خدمت رسانی خواهند بود. در برخی از کلاسترهای active-passive اجازه انجام عملیات SELECT به نودهای passive نیز داده میشود. اما در کلاسترهای active-active تمامی نودها قابلیت read-write دارند و هر تغییری که در هر یک از این نودها ایجاد شود در سایر نودها نیز اعمال میشود.MySQL یک سیستم مدیریت دیتابیس رابطهای و متنباز است که در بین دیتابیسهای اسکیوالی به یک گزینه تبدیل محبوب شده است.
Galera یک راهکار برای کلاسترینگ دیتابیس است که با استفاده از همانند سازی همزمان، امکان استفاده از کلاسترهای multi-master را به شما میدهد. Galera به شما این امکان را میدهد که به هر یک از نودههای کلاستر کوئریهای read-write ارسال نمایید. با این وجود، سینک بودن تمامی نودهای موجود در کلاستر بصورت اوتوماتیک توسط Galera مدیریت خواهد شد و شما از این بابت نگرانی نخواهید داشت. برای کسب اطلاعات بیشتر در مورد Galera به مستندات رسمی آن مراجعه نمایید. شما در این آموزش، نحوه کانفیگ Galera Cluster با MySQL (بصورت active-active) را خواهید آموخت. بدین منظور، شما 3 عدد دراپلت اوبونتو 18.04 را که به عنوان نودهای کلاستر ایفای نقش میکنند، کانفیگ خواهید کرد. لازم به ذکر است که حداقل تعداد نود لازم برای کانفیگ کردن یک کلاستر، 3 نود است.پیشنیازها
1) شما برای دنبال کردن این آموزش به یک اکانت DigitalOcean 2) 3 عدد دراپلت اوبونتو 18.04 با قابلیت private networking فعال، که هر کدام از این دراپلتها باید یک کاربر non-root با امتیازات sudo داشته باشند:- برای تنظیم private networking در این سه دراپلت به این لینکمراجعه نمایید.
- برای ایجاد یک کاربر non-root با امتیازات sudo به این لینکمراجعه نمایید.
در نخستین اقدام، شما باید ریپازیتوریهای مربوط به پکیج Galera و MySQL را به هر سه سرور خود اضافه کنید و بدین ترتیب قادر خواهید بود که نسخه صحیح MySQL و Galera مورد استفاده در این آموزش را نصب نمایید. توجه داشته باشید که کمپانیCodership صاحب اصلی Galera Cluster، ریپازیتوری Galera را نگهداری و ارائه میکند. از آنجایی که هر ریپازیتوری خارجی لزوما قابل اعتماد نیست، دقت داشته باشید که از منبع مطمئن و قابل اعتمادی پکیجها را نصب کنید.
گام اول - اضافه کردن ریپازیتوریهای MySQL به همه سرورها:
در این آموزش از MySQL نسخه 5.7 استفاده خواهید کرد. در اولین قدم، ریپازیتوری مخصوص اوبونتو که توسط Galera ارائه شده را به هر سه سرور اضافه کنید. به محض اینکه ریپازیتوریها روی هر سه سرور آپدیت شدند، همه چیز آماده نصب MySQL همراه با Galera خواهد بود. ابتدا Galera repository key را روی هر سه سرور با استفاده از فرمان apt-key اضافه کنید. در واقع، APT package manager از این کلید برای تصدیق اعتبار پکیج استفاده مینماید.sudo apt-key adv --keyserver keyserver.ubuntu.com --recv BC19DDBA// OutputExecuting: /tmp/apt-key-gpghome.RG5cTZjQo0/gpg.1.sh --keyserver keyserver.ubuntu.com --recv BC19DDBAgpg: key D669017EBC19DDBA: public key "Codership Oy <info@galeracluster.com>" importedgpg: Total number processed: 1gpg: imported: 1sudo nano /etc/apt/sources.list.d/galera.listdeb http://releases.galeracluster.com/mysql-wsrep-5.7/ubuntu bionic maindeb http://releases.galeracluster.com/galera-3/ubuntu bionic mainsudo nano /etc/apt/preferences.d/galera.pref# Prefer Codership repositoryPackage: *Pin: origin releases.galeracluster.comPin-Priority: 1001sudo apt updateگام دوم - نصب MySQL روی همه سرورها:
پیش نیاز کانفیگ Galera Cluster با MySQL، نصب MySQL و Galera روی سرورهایی است که قرار است نقش نودهای کلاستر را ایفا کنند. فرمان زیر را اجرا نمایید:sudo apt install galera-3 mysql-wsrep-5.7sudo ln -s /etc/apparmor.d/usr.sbin.mysqld /etc/apparmor.d/disable/sudo apparmor_parser -R /etc/apparmor.d/usr.sbin.mysqldگام سوم - کانفیگ نود اول:
از آنجایی که هر نود در کلاستر کانفیگ تقریبا یکسانی با سایر نودها دارد، ما ابتدا اولین نود خود را کانفیگ کرده و سپس تنظیمات را در سایر نودها کپی میکنیم. MySQL بصورت پیشفرض به گونهای کانفیگ شده است که دایرکتوری /etc/mysql/conf.d را به منظور دریافت تنظیمات پیکربندی اضافی از فایلهایی که با cnf. پایان مییابند، مورد بررسی قرار میدهد. روی سرور اول در دایرکتوری /etc/mysql/conf.d یک فایل ایجاد کنید و تمامی ویژگیهای کلاستر را در آن وارد نمایید.sudo nano /etc/mysql/conf.d/galera.cnfbinlog_format=ROWdefault-storage-engine=innodbinnodb_autoinc_lock_mode=2bind-address=0.0.0.0# Galera Provider Configurationwsrep_on=ONwsrep_provider=/usr/lib/galera/libgalera_smm.so# Galera Cluster Configurationwsrep_cluster_name="test_cluster"wsrep_cluster_address="gcomm://First_Node_IP,Second_Node_IP,Third_Node_IP"# Galera Synchronization Configurationwsrep_sst_method=rsync# Galera Node Configurationwsrep_node_address="This_Node_IP"wsrep_node_name="This_Node_Name"بخش ابتدائی فایل:
تنظیمات MySQL را به منظور عملکرد صحیح کلاستر اصلاح مینماید. به عنوان مثال، Galera با MyISAM یا سایر موتورهای ذخیرهسازی non-transactional کار نمیکند و mysqld نباید روی آدرس ip لوکال هاست تنظیم شده باشد. اگر به دنبال اطلاعات بیشتر در مورد این بخش هستید به این لینک مراجعه کنید.بخش “Galera Provider Configuration”:
پیکربندی کامپوننتهای MySQL به منظور ارئه یک WriteSet replication API در این بخش صورت میگیرد. WriteSet replication API برای همانندسازی سرورهای موجود در کلاستر مورد استفاده قرار میگیرد. در این مورد خاص میتوان گفت که منظور از WriteSet replication API در واقع همان Galera است که قرار است کار همانندسازی نودهای کلاستر ما را انجام دهد. شما میتوانید در این قسمت پارامترهای کلی مورد نیاز برای پیکربندی محیط همانندسازی اولیه را مشخص کنید. اما در این مورد نیازی به تغییر این قسمت نیست. اگر به دنبال اطلاعات بیشتر در مورد این بخش هستید به این لینک مراجعه کنید.بخش “Galera Cluster Configuration”:
تنظیمات این بخش مربوط به تعریف کلاستر، مشخص نمودن اعضای کلاستر بواسطه آدرس ip یا نام دامنه آنها و ایجاد یک نام برای کلاستر میباشد. توجه داشته باشید که در نظر گرفتن یک نام برای کلاستر به منظور اطمینان از اتصال اعضا به گروه صحیح الزامی میباشد. شما میتوانید مقدار wsrep_cluster_name را بجای "test_cluster" به مقدار معنیدار دیگری تغییر دهید یا به همین صورت رها کنید. در قمست wsrep_cluster_address آدرس ip هر سه سرور خود را وارد نمایید.بخش "Galera Synchronization Configuration":
در این بخش مشخص میگردد که کلاستر چگونه ارتباط بین اعضا را برقرار میسازد و نحوه همگامسازی دادهها بین اعضا تعیین میگردد.
این مورد فقط برای انتقال حالت (state transfer) در هنگامی که یک نود آنلاین میشود، مورد استفاده قرار میگیرد.
برای تنظیمات اولیه، از rsync استفاده کنید. این تنظیم متداول است و پاسخگوی نیازهای فعلی شما خواهد بود.بخش "Galera Node Configuration":
این بخش آدرس ip و نام سرور فعلی را مشخص میکند. اگر قصد دارید تا مشکلات بوجود آمده در سرورها را بواسطه لاگها مورد بررسی قرار دهید و منشا مشکلات را بیابید، این بخش به شما کمک زیادی خواهد کرد. همچنین، به کمک این بخش میتوان به چندین روش مختلف به هر کدام از سرورها ارجاع کرد. wsrep_node_address: آدرس ip سرور فعلی که در آن هستید. wsrep_node_name: هر نام دلخواهی که به شما کمک میکند این نود را در لاگ پیدا کنید. پس از اتمام تنظیمات فایل galera.cnf محتوای آن را کپی کرده و سپس فایل را ذخیره کرده و ببندید. اکنون میتوانید سراغ کانفیگ نودهای بعدی بروید.گام چهارم - کانفیگ نودهای باقیمانده:
به نود دوم رفته و فایل پیکربندی را باز کنید:sudo nano /etc/mysql/conf.d/galera.cnfگام پنجم - باز کردن پورتهای لازم در فایروال همه سرورها:
در این گام باید فایروال را به گونهای کانفیگ کنید که تمامی پورتهای لازم برای ارتباط بین-گرهای باز باشند. در هر کدام از سرورها با اجرای دستور زیر وضعیت فایروال را بررسی نمایید:sudo ufw status// OutputStatus: activeTo Action From-- ------ ----OpenSSH ALLOW AnywhereOpenSSH (v6) ALLOW Anywhere (v6)sudo ufw allow 3306,4567,4568,4444/tcpsudo ufw allow 4567/udpگام ششم - استارت کردن کلاستر:
پیش از هر کاری شما باید سرویس systemd از MySQL را فعال نمایید. با فعال کردن سرویسsystemd، هر وقت که سرورتان ریبوت شود MySQL بصورت خودکار آغاز بکار میکند.فعالسازی استارت خودکار MySQL در زمان بوت شدن سرور:
برای فعالسازی سرویس systemd دستور زیر را روی هر سه سرور اجرا کنید:sudo systemctl enable mysqlCreated symlink /etc/systemd/system/multi-user.target.wants/mysql.service → /lib/systemd/system/mysql.service.بالا آوردن اولین نود:
برای بالا آوردن اولین نود، شما نیاز به یک اسکریپت استارتاپ ویژه دارید. روش مورد استفاده برای پیکربندی کلاستر در این آموزش به گونهای است که در آن هر نود بعد از آنلاین شدن نیاز دارد که برای دریافت حالت اولیه (initial state) حداقل به یک نود دیگر که در فایل galera.cnf برایش مشخص شده، متصل شود. بنابراین، اجرای دستور "systemctl start mysql" با شکست مواجه خواهد شد. زیرا هیچ نود در حال اجرای دیگری وجود ندارد که نود اول بعد از آنلاین شدن به آن متصل شود. راه حل استفاده از اسکریپت mysqld_bootstrap میباشد که به systemd اجازه ارسال پارامتر wsrep-new-cluster-- را میدهد. کد زیر را روی سرور اول اجرا کنید:sudo mysqld_bootstrapmysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"// Output+--------------------+-------+| Variable_name | Value |+--------------------+-------+| wsrep_cluster_size | 1 |+--------------------+-------+بالا آوردن دومین نود:
برای بالا آوردن دومین نود فرمان زیر را اجرا کنید:sudo systemctl start mysqlmysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"// Output+--------------------+-------+| Variable_name | Value |+--------------------+-------+| wsrep_cluster_size | 2 |+--------------------+-------+بالا آوردن نود سوم:
فرمان زیر را اجرا کنید:sudo systemctl start mysqlmysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"// Output+--------------------+-------+| Variable_name | Value |+--------------------+-------+| wsrep_cluster_size | 3 |+--------------------+-------+گام هفتم - آزمایش همانندسازی (Replication):
تا اینجا و با پیمودن گامهای قبلی،کار کانفیگ Galera Cluster با MySQL تقریبا به انتها رسید. ما کلاستر خود را طوری پیکربندی کردهایم که بتواند از هر نودی به نود دیگر عمل همانندسازی را انجام دهد. به این حالت پیکربندی active-active replication میگویند. در این حالت ایجاد هر تغییری در هر یک از نودهای کلاستر در سایر نودها نیز اعمال میگردد. در این گام شما به تست قابلیت replication یا همانندسازی میپردازید تا از صحت عملکرد آن اطمینان یابید.نوشتن روی نود اول:
کارمان را با ایجاد تغییرات دیتابیس روی نود اول شروع میکنیم. با اجرای فرامین زیر یک دیتابیس با نام playground ساخته و جدولی با نام equipment در آن ایجاد میکنیم.mysql -u root -p -e 'CREATE DATABASE playground;CREATE TABLE playground.equipment ( id INT NOT NULL AUTO_INCREMENT, type VARCHAR(50), quant INT, color VARCHAR(25), PRIMARY KEY(id));INSERT INTO playground.equipment (type, quant, color) VALUES ("slide", 2, "blue");'خواندن و نوشتن روی نود دوم:
برای اینکه بفهمید همانندسازی (Replication) درست کار میکند، به نود دوم نگاه کنید:mysql -u root -p -e 'SELECT * FROM playground.equipment;'// Output+----+-------+-------+-------+| id | type | quant | color |+----+-------+-------+-------+| 1 | slide | 2 | blue |+----+-------+-------+-------+mysql -u root -p -e 'INSERT INTO playground.equipment (type, quant, color) VALUES ("swing", 10, "yellow");'خواندن و نوشتن روی نود سوم:
شما میتوانید به همه دادههای موجود در دیتابیس از نود سوم کلاستر نیز دسترسی داشته باشید:mysql -u root -p -e 'SELECT * FROM playground.equipment;'// Output +----+-------+-------+--------+ | id | type | quant | color | +----+-------+-------+--------+ | 1 | slide | 2 | blue | | 2 | swing | 10 | yellow | +----+-------+-------+--------+mysql -u root -p -e 'INSERT INTO playground.equipment (type, quant, color) VALUES ("seesaw", 3, "green");'خواندن نود اول:
در نهایت، با اجرای دستور زیر میتوانید از دسترسی به دادهها روی همه نودهای کلاستر اطمینان بیابید:mysql -u root -p -e 'SELECT * FROM playground.equipment;'// Output +----+--------+-------+--------+ | id | type | quant | color | +----+--------+-------+--------+ | 1 | slide | 2 | blue | | 2 | swing | 10 | yellow | | 3 | seesaw | 3 | green | +----+--------+-------+--------+



