خانه - کامپیوترها
مبانی تکرار در MySQL. راه اندازی Replication پایگاه داده mysql نصب و پیکربندی Master

روز همگی بخیر! امروز در مقاله ما به نمونه هایی از راه اندازی تکرار از نوع "master-slave" نگاه خواهیم کرد.

کمی تئوری

چرا تکرار مورد نیاز است؟ اول از همه، این یک شبکه ایمنی است در صورتی که سرور اصلی mysql از کار بیفتد، سپس می توانید به سرور برده تغییر دهید و به کار خود ادامه دهید. ثانیاً، این فرصتی است برای کاهش بار روی سرور اصلی Mysql با استفاده از سرور اصلی فقط برای نوشتن و انجام عملیات خواندن در سرور برده. تکثیر چگونه اتفاق می افتد؟ سرور اصلی Binlog می نویسد، که در آن عملیات انجام شده بر روی پایگاه داده (پایگاه های داده) را نشان می دهد و افست موجود در گزارش را از ابتدای آن تا رکورد فعلی (موقعیت) به خاطر می آورد. سرور برده به Master متصل می شود، مقادیر موقعیت را مقایسه می کند و تغییرات در گزارش را می خواند که از مقدار موقعیت خود شروع می شود و به مقدار موقعیت master ختم می شود. این تغییرات (دستورات) را در پایگاه داده در سرور برده اعمال می کند.

نصب و پیکربندی Master

ما my.cnf را در سرور اصلی تغییر می دهیم:

Server-id = 1 - شناسه سرور را نشان می دهد log_bin = /var/log/mysql/mysql-bin.log - نام ورود و مسیر

یک توضیح کوچک: به طور پیش فرض، جادوگر برای همه پایگاه داده ها binlog می نویسد، این را می توان با استفاده از "binlog-do-db" تغییر داد. هنگامی که از یک پایگاه داده خاص استفاده می شود، مقادیر در گزارش ها ثبت می شوند؛ تغییرات در پایگاه های داده دیگر ثبت نمی شوند.در اینجا می توانید تعیین کنید که چند روز لاگ ذخیره شود، حداکثر اندازه آنها چقدر است (پارامترهای expire_logs_days و max_binlog_size). کاربری را به MySQL اضافه کنید که تحت حقوق او Replication انجام خواهد شد:

GRANT Replication Slave ON *.* TO user_name@ip_slave_server IDENTIFED by "password";

Replication Slave امتیازی است که به کاربر این امکان را می‌دهد که بیلوگ‌ها را بخواند. ip_slave_server - ip سروری که کاربر از آن متصل می شود. سرور mysql را راه اندازی مجدد کنید:

/etc/init.d/mysql راه اندازی مجدد

بیایید کار استاد را بررسی کنیم:

نمایش وضعیت استاد؛

شما باید نام binlog و موقعیت آن را ببینید. هنگام اجرای دستورات در پایگاه داده، موقعیت تغییر خواهد کرد.

راه اندازی برده

ما تغییراتی را در فایل my.cnf ایجاد می کنیم:

Server-id = 2 - شناسه سرور برده باید با شناسه اصلی متفاوت باشد. relay-log = /var/lib/mysql/mysql-relay-bin - مانند یک گزارش باینری، از مجموعه‌ای از فایل‌های شماره‌دار حاوی رویدادهایی تشکیل شده است که تغییرات پایگاه داده را توصیف می‌کنند. relay-log-index = /var/lib/mysql/mysql-relay-bin.index - یک فایل فهرست که شامل نام همه فایل‌های گزارش رله در حال استفاده است. replicate-do-db = پایگاه داده ای که تکرار خواهد شد.

یادداشت مهم! هنگام سازماندهی یک cross db (زمانی که یک پایگاه داده استفاده می شود و داده ها در پایگاه داده دیگری به روز می شوند)، binlog-do-db نیازی به مشخص شدن در تنظیمات سرور اصلی ندارد، binlog-و باید برای همه پایگاه های داده نوشته شود، و در تنظیمات برده لازم است به جای آن از replicate-do استفاده شود -db specify replicate-wild-do-table=db_name.%, که در آن db_name نام پایگاه داده تکرار شده است.سرور mysql را راه اندازی مجدد کنید:

/etc/init.d/mysql راه اندازی مجدد

فعال کردن تکثیر

SET GLOBAL read_only = روشن.

بیایید به وضعیت استاد نگاه کنیم:

نمایش وضعیت استاد؛

ما مقادیر File و Position را به خاطر می آوریم (یا بهتر است بگوییم آنها را یادداشت کنید). مقدار Position نباید اکنون تغییر کند. با استفاده از دستور mysqldump، Master را حذف می کنیم:

Mysqldump -uname -ppassword db_master_name > dump_db،

که در آن name نام کاربری است، رمز عبور رمز عبور، db_master_name نام پایگاه داده، dump_db نام dump است. پس از تکمیل Dump، اجازه نوشتن در پایگاه داده را می دهیم:

SET GLOBAL read_only = OFF.

دامپ را به Slave منتقل می کنیم و آن را گسترش می دهیم

Mysql -uname -ppassword db_slave_name< dump_db

راه اندازی Replication

CHANGE MASTER TO MASTER_HOST = "Master ip"، MASTER_USER = "user_name"، MASTER_PASSWORD = "password"، MASTER_LOG_FILE = "log name"، MASTER_LOG_POS = موقعیت.

master ip - ip سروری که Master در آن قرار دارد، نام کاربری - نام کاربری که در master ایجاد کرده‌ایم، نام log - مقدار File در master هنگام ایجاد تخلیه پایگاه داده، موقعیت - مقدار موقعیت در استاد زمانی که تخلیه پایگاه داده ساخته شد. بیایید برده را شروع کنیم:

شروع به برده؛

بیایید ببینیم همانندسازی چگونه پیش می‌رود: در Master: SHOW MASTER STATUS\G در Slave: SHOW SLAVE STATUS\G

تنظیمات امنیتی در سرور اصلی

پارامتر bind-address در /etc/mysql/my.cnf مشخص می کند که سرور mysql در زمان انتظار برای اتصال به چه آدرس IP گوش دهد. به طور معمول دارای مقدار bind-address = 127.0.0.1 است. اما پس از راه اندازی سرور برده، باید به اتصالات از سرور برده اجازه دهیم و اتصالات محلی باید کار کنند. Bind-address می تواند فقط از یک IP یا از همه اتصالات اجازه دهد. زیرا باید بیش از یک ip برای اتصال مشخص کنیم، خط را با bind-address = 127.0.0.1 کامنت می کنیم. اکنون سرور mysql اتصالات را از تمام آدرس های IP می پذیرد که بسیار خطرناک است. iptables به ما در حل این مشکل کمک می کند:

Iptables -I INPUT -p tcp -s ip_slave_server-a --dport 3306 -j ACCEPT -ابتدا اجازه اتصال از آدرس IP سرور برده iptables -I INPUT -p tcp --dport 3306 -j DROP -سپس اتصال را از تمام آدرس های IP دیگر

اکنون 2 سرور MySQL در حال اجرا در حالت master-slave خواهیم داشت که به طور قابل توجهی قابلیت اطمینان سایت را افزایش می دهد و برای برخی از سایت های دروپال به افزایش سرعت کار کمک می کند. در مقاله بعدی به تغییر حالت های master و slave در صورت خرابی سرور اصلی خواهیم پرداخت.

من نسبتاً اخیراً با تکثیر سرورهای MySQL آشنا شدم و همانطور که آزمایشات مختلفی را با پیکربندی انجام می دادم، آنچه را که برای من مفید بود را یادداشت کردم. وقتی مطالب بسیار زیادی جمع آوری کردم، ایده نوشتن این مقاله به ذهنم خطور کرد. من سعی کرده ام نکات و راه حل هایی را برای برخی از اساسی ترین مسائلی که با آن مواجه شده ام جمع آوری کنم. من پیوندهایی به اسناد و سایر منابع در طول مسیر ارائه خواهم کرد. نمی توانم وانمود کنم که آن را به طور کامل توصیف می کنم، اما امیدوارم مقاله مفید باشد.

یک مقدمه کوتاه

Replication (از لاتین replico - تکرار می کنم) تکرار تغییرات داده ها از سرور اصلی پایگاه داده به یک یا چند سرور وابسته است. با سرور اصلی تماس می گیریم استادو وابسته - ماکت ها.
تغییرات داده‌ای که روی Master اتفاق می‌افتد روی Replica‌ها تکرار می‌شوند (اما نه برعکس). بنابراین، پرس و جوهایی برای تغییر داده ها (INSERT، UPDATE، DELETE، و غیره) فقط بر روی Master اجرا می شوند، در حالی که پرس و جوهایی برای خواندن داده ها (به عبارت دیگر، SELECT) می توانند هم روی replica ها و هم بر روی Master اجرا شوند. فرآیند تکثیر روی یکی از ماکت ها بر عملکرد سایر ماکت ها تأثیر نمی گذارد و عملاً تأثیری بر کار استاد ندارد.
همانندسازی با استفاده از لاگ های باینری که روی master نگهداری می شوند انجام می شود. آنها تمام پرس و جوهایی را که منجر به تغییرات در پایگاه داده می شوند (یا به طور بالقوه منجر می شوند) ذخیره می کنند (پرس و جوها به طور صریح ذخیره نمی شوند، بنابراین اگر می خواهید به آنها نگاه کنید، باید از ابزار mysqlbinlog استفاده کنید). binlog ها به replica ها منتقل می شوند (binlog بارگیری شده از Master "Relay binlog" نامیده می شود) و پرس و جوهای ذخیره شده با شروع از یک موقعیت خاص اجرا می شوند. درک این نکته مهم است که در حین تکرار، خود داده های تغییر یافته منتقل نمی شوند، بلکه فقط درخواست ها هستند که باعث تغییرات می شوند.
با تکرار، محتویات پایگاه داده در چندین سرور کپی می شوند. چرا باید به تکرار متوسل شد؟ چند دلیل وجود دارد:
  • عملکرد و مقیاس پذیری. ممکن است یک سرور نتواند بار ناشی از عملیات خواندن و نوشتن همزمان در پایگاه داده را مدیریت کند. مزایای ایجاد کپی بیشتر خواهد بود که خواندن در هر نوشتن بیشتر در سیستم خود داشته باشید.
  • تحمل خطا. در صورت خرابی replica، تمام درخواست های خواندن می توانند با خیال راحت به Master منتقل شوند. اگر Master ناموفق باشد، درخواست‌های نوشتن را می‌توان به replica منتقل کرد (پس از بازیابی Master، می‌تواند نقش Replica را بر عهده بگیرد).
  • فایل پشتیبانی اطلاعات. Replica را می توان برای مدتی "آهسته" کرد تا mysqldump را انجام دهد، اما master نمی تواند.
  • محاسبات معوق. پرس و جوهای سنگین و آهسته SQL را می توان بر روی یک ماکت جداگانه بدون ترس از تداخل در عملکرد عادی کل سیستم اجرا کرد.
علاوه بر این، ویژگی های جالب دیگری نیز وجود دارد. از آنجایی که این خود داده ها نیستند که به replica ها منتقل می شوند، بلکه کوئری ها هستند که باعث تغییر آنها می شوند، می توانیم از ساختارهای جدول مختلف روی master و replica ها استفاده کنیم. به ویژه، نوع جدول (موتور) یا مجموعه ای از شاخص ها ممکن است متفاوت باشد. به عنوان مثال، برای انجام جستجوی متن کامل، می‌توانیم از نوع جدول MyISAM روی ماکت استفاده کنیم، علیرغم اینکه Master از InnoDB استفاده خواهد کرد.

راه اندازی Replication

فرض کنید یک پایگاه داده MySQL در حال کار داریم که از قبل پر از داده و روشن شده است. و به یکی از دلایلی که در بالا توضیح داده شد، می‌خواهیم Replication سرور خود را فعال کنیم. داده های اولیه ما:
  • آدرس IP اصلی 192.168.1.101، نسخه های مشابه 192.168.1.102 است.
  • MySQL نصب و پیکربندی شد
  • شما باید Replication پایگاه داده testdb را پیکربندی کنید
  • ما می توانیم جادوگر را برای مدتی مکث کنیم
  • ما البته روی هر دو ماشین روت داریم
تنظیمات جادوگر
حتماً شناسه سرور منحصر به فرد، مسیر لاگ های باینری و نام پایگاه داده برای تکرار را در قسمت ذکر کنید:
شناسه سرور = 1
log-bin = /var/lib/mysql/mysql-bin
replicate-do-db = testdb
مطمئن شوید که فضای دیسک کافی برای لاگ های باینری دارید.

بیایید کاربر replication را اضافه کنیم که تحت حقوق آن Replication انجام خواهد شد. امتیاز "Replication Slave" کافی است:
mysql@master> GRANT Replication Slave ON "testdb".* TO "replication"@"192.168.1.102" شناسایی شده با "password";

برای اعمال تغییرات در پیکربندی، MySQL را ریبوت کنید:
سرویس root@master# راه اندازی مجدد mysqld

اگر همه چیز خوب پیش رفت، دستور "show master status" باید چیزی شبیه به این را نشان دهد:
mysql@master>Show MASTER STATUS\G
فایل: mysql-bin.000003
سمت: 98
Binlog_Do_DB:
Binlog_Ignore_DB:
با ایجاد تغییرات در پایگاه داده روی master، مقدار موقعیت باید افزایش یابد.

تنظیمات کپی
بیایید شناسه سرور، نام پایگاه داده برای تکثیر و مسیر باینلاگ های رله را در قسمت پیکربندی مشخص کنیم، سپس MySQL را دوباره بارگیری کنیم:
شناسه سرور = 2
relay-log = /var/lib/mysql/mysql-relay-bin
relay-log-index = /var/lib/mysql/mysql-relay-bin.index
replicate-do-db = testdb

سرویس Root@replica# راه اندازی مجدد mysqld

انتقال داده
در اینجا باید پایگاه داده را برای نوشتن قفل کنیم. برای انجام این کار، می‌توانید برنامه‌ها را متوقف کنید یا از پرچم read_only روی Master استفاده کنید (توجه: این پرچم روی کاربران دارای امتیاز SUPER تأثیری ندارد). اگر جداول MyISAM داریم، بیایید جداول را نیز "فلاش" کنیم:
mysql@master> FLUSH TABLES WITH READ LOCK.
mysql@master> SET GLOBAL read_only = ON;

بیایید وضعیت استاد را با دستور "show master status" ببینیم و مقادیر File و Position را به خاطر بسپاریم (پس از مسدود کردن موفقیت آمیز master، آنها نباید تغییر کنند):
فایل: mysql-bin.000003
سمت: 98

پایگاه داده را تخلیه می کنیم و پس از اتمام عملیات، قفل master را حذف می کنیم:
mysql@master> SET GLOBAL read_only = OFF;

ما Dump را به Replica منتقل می کنیم و داده ها را از آن بازیابی می کنیم.
در نهایت، ما تکرار را با دستورات “change master to” و “start slave” شروع می کنیم و می بینیم که آیا همه چیز به خوبی پیش رفت:
mysql@replica> CHANGE MASTER TO MASTER_HOST = "192.168.1.101"، MASTER_USER = "تکرار"، MASTER_PASSWORD = "گذرواژه"، MASTER_LOG_FILE = "mysql-bin.000003"، MASTER_9;
mysql@replica> start slave.
ما مقادیر MASTER_LOG_FILE و MASTER_LOG_POS را از master می گیریم.

بیایید ببینیم که تکرار با دستور "show Slave status" چگونه پیش می رود:
mysql@replica> نشان دادن وضعیت برده\G
Slave_IO_State: در انتظار استاد برای ارسال رویداد
Master_Host: 192.168.1.101
Master_User: replication
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000003
Read_Master_Log_Pos: 98
Relay_Log_File: mysql-relay-bin.001152
Relay_Log_Pos: 235
Relay_Master_Log_File: mysql-bin.000003
Slave_IO_Running: بله
Slave_SQL_Running: بله
Replicate_Do_DB: testdb,testdb
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 98
Relay_Log Space: 235
Until_Condition: ندارد
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: خیر
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
ثانیه_پشت_استاد: 5

اکنون جالب ترین ارزش ها را برجسته کرده ام. اگر تکرار با موفقیت شروع شود، مقادیر آنها باید تقریباً مشابه فهرست باشد (توضیح دستور "Show Slave status" را در مستندات ببینید). مقدار Seconds_Behind_Master می تواند هر عدد صحیحی باشد.
اگر تکرار نرمال باشد، replica از master پیروی می کند (شماره گزارش در Master_Log_File و موقعیت Exec_Master_Log_Pos افزایش می یابد). زمان تاخیر ماکت از استاد (Seconds_Behind_Master)، در حالت ایده آل، باید برابر با صفر باشد. اگر کاهش پیدا نکند یا رشد نکند، ممکن است بار روی ماکت خیلی زیاد باشد - به سادگی زمان لازم برای تکرار تغییرات روی master را ندارد.
اگر Slave_IO_State خالی و Seconds_Behind_Master NULL باشد، تکرار شروع نشده است. برای پیدا کردن دلیل، حذف آن و شروع مجدد، به گزارش MySQL مراجعه کنید:
mysql@replica> start slave.

از طریق این مراحل ساده ما یک ماکت به دست می آوریم که داده های آن با داده های اصلی یکسان است.
به هر حال، زمانی که Master مسدود می شود، زمانی است که dump ایجاد می شود. اگر ایجاد زمان غیرقابل قبولی طول می کشد، می توانید این را امتحان کنید:

  • با علامت read_only نوشتن به master را مسدود کنید، موقعیت را به خاطر بسپارید و MySQL را متوقف کنید.
  • پس از آن، فایل های پایگاه داده را در replica کپی کنید و Master را فعال کنید.
  • همانند سازی را به روش معمول شروع کنید.
راه های مختلفی برای ایجاد یک ماکت بدون توقف اصلی وجود دارد، اما آنها همیشه کار نمی کنند.

اضافه کردن ماکت

فرض کنید ما قبلاً یک استاد کار و یک ماکت داریم و باید یکی دیگر به آنها اضافه کنیم. انجام این کار حتی ساده تر از اضافه کردن اولین نسخه به Master است. و آنچه بسیار زیباتر است این است که نیازی به توقف استاد برای این نیست.
ابتدا اجازه دهید MySQL را روی نسخه دوم پیکربندی کنیم و مطمئن شویم که پارامترهای لازم را در پیکربندی وارد کرده ایم:
شناسه سرور = 3
replicate-do-db = testdb

حالا بیایید تکرار را روی ماکت اول متوقف کنیم:
mysql@replica-1> stop slave.

ماکت به طور معمول به کار خود ادامه می دهد، اما داده های موجود در آن دیگر جاری نخواهد بود. بیایید به وضعیت نگاه کنیم و موقعیت اصلی را که ماکت قبل از توقف تکرار به آن رسیده است، به خاطر بسپاریم:
mysql@replica-1> نشان دادن وضعیت برده\G

مقادیری که ما نیاز داریم Master_Log_File و Exec_Master_Log_Pos خواهند بود:
Master_Log_File: mysql-bin.000004
Exec_Master_Log_Pos: 155

بیایید یک Dump پایگاه داده ایجاد کنیم و همانند سازی را در اولین ماکت ادامه دهیم:
mysql@replica-1> START SLAVE.

بیایید داده ها را از Dump روی ماکت دوم بازیابی کنیم. سپس Replication را فعال کنید:
mysql@replica-2> CHANGE MASTER TO MASTER_HOST = "192.168.1.101"، MASTER_USER = "تکرار"، MASTER_PASSWORD = "گذرواژه"، MASTER_LOG_FILE = "mysql-bin.000004"، MASTER = "MASTER_BIN.000004"، MASTER_5.
mysql@replica-2> START SLAVE.

مقادیر MASTER_LOG_FILE و MASTER_LOG_POS به ترتیب مقادیر Master_Log_File و Exec_Master_Log_Pos هستند که از نتیجه دستور "show slave status" در اولین ماکت به دست می آیند.
همانند سازی باید از موقعیتی که اولین ماکت متوقف شده است شروع شود (و بر این اساس، یک روگرفت ایجاد می شود). بنابراین، ما دو کپی با داده های یکسان خواهیم داشت.

ادغام کپی ها

گاهی اوقات وضعیت زیر ایجاد می شود: دو پایگاه داده روی Master وجود دارد که یکی از آنها روی یک ماکت و دیگری روی دیگری تکرار می شود. چگونه می توان تکرار دو پایگاه داده را روی هر دو کپی بدون ریختن آنها روی Master یا خاموش کردن آن تنظیم کرد؟ خیلی ساده، با استفاده از دستور "start slave while".
بنابراین، ما یک استاد با پایگاه داده testdb1 و testdb2 داریم که به ترتیب روی replicas replica-1 و replica-2 تکرار می شوند. بیایید همانند سازی هر دو پایگاه داده را بدون توقف Master به replica-1 پیکربندی کنیم.
با دستور Replica-2 را متوقف کنید و موقعیت Master را به خاطر بسپارید:
mysql@replica-2> STOP SLAVE.
mysql@replica-2> نشان دادن وضعیت برده\G
Master_Log_File: mysql-bin.000015
Exec_Master_Log_Pos: 231

بیایید یک Dump از پایگاه داده testdb2 ایجاد کنیم و تکرار را از سر بگیریم (این کار دستکاری ها را با replica-2 کامل می کند). ما Dump را به replica-1 بازیابی می کنیم.

وضعیت روی replica-1 به این صورت است: پایگاه داده testdb1 در یک موقعیت اصلی قرار دارد و به تکرار ادامه می‌دهد، پایگاه داده testdb2 از یک تخلیه از یک موقعیت دیگر بازیابی شده است. بیایید آنها را همگام کنیم.

بیایید تکرار را متوقف کنیم و موقعیت استاد را به خاطر بسپاریم:
mysql@replica-1> STOP SLAVE.
mysql@replica-1> نشان دادن وضعیت برده\G
Exec_Master_Log_Pos: 501

بیایید مطمئن شویم که در پیکربندی برای replica-1 نام پایگاه داده دوم در بخش نشان داده شده است:
replicate-do-db = testdb2

بیایید MySQL را مجددا راه اندازی کنیم تا تغییرات در پیکربندی اعمال شود. به هر حال، امکان راه اندازی مجدد MySQL بدون توقف تکرار وجود داشت - از گزارشی که می دانیم در چه موقعیتی در تکثیر اصلی متوقف شده است.

حالا بیایید از موقعیتی که replica-2 در آن مکث شده بود به موقعیتی که فقط تکرار را متوقف کردیم، تکرار کنیم:
mysql@replica-1> CHANGE MASTER TO MASTER_HOST = "192.168.1.101"، MASTER_USER = "replication"، MASTER_PASSWORD = "password"، MASTER_LOG_FILE = "mysql-bin.000015"، MASTER = "MASTER"
mysql@replica-1> start slave تا MASTER_LOG_FILE = "mysql-bin.000016 ", MASTER_LOG_POS = 501;

به محض اینکه replica به موقعیت مشخص شده در بخش while برسد، Replication به پایان می رسد، پس از آن هر دو پایگاه داده ما با موقعیت اصلی یکسانی مطابقت خواهند داشت (که در آن ما تکرار را در replica-1 متوقف کردیم). بیایید از این مطمئن شویم:
mysql@replica-1> نشان دادن وضعیت برده\G
mysql@replica-1> START SLAVE.
Master_Log_File: mysql-bin.000016
Exec_Master_Log_Pos: 501

بیایید نام هر دو پایگاه داده را به پیکربندی replica-1 در بخش اضافه کنیم:
replicate-do-db = testdb1
replicate-do-db = testdb2

مهم: هر پایگاه داده باید در یک خط جداگانه فهرست شود.
MySQL را مجدداً راه اندازی کنید و به تکرار ادامه دهید:
mysql@replica-1> CHANGE MASTER TO MASTER_HOST = "192.168.1.101"، MASTER_USER = "تکرار"، MASTER_PASSWORD = "گذرواژه"، MASTER_LOG_FILE = "mysql-bin.000016"، MASTER = MASTER
پس از اینکه replica-1 با Master آشنا شد، محتویات پایگاه داده آنها یکسان خواهد بود. شما می توانید پایگاه داده را به روشی مشابه یا با ایجاد یک تخلیه کامل از replica-1 در replica-2 ادغام کنید.

استاد قلعه سازی و ماکت

ممکن است لازم باشد یک ماکت را به حالت اصلی تغییر دهید، به عنوان مثال، در صورت خرابی اصلی یا هنگام انجام کارهای فنی روی آن. برای امکان پذیر ساختن چنین سوئیچ، باید ماکت را مانند Master پیکربندی کنید یا آن را بسازید استاد منفعل.

بیایید ثبت باینری (علاوه بر binlog های رله) را در پیکربندی در بخش فعال کنیم:
log-bin = /var/lib/mysql/mysql-bin

و یک کاربر برای تکرار اضافه کنید:
mysql@master> GRANT Replication Slave ON 'testdb'.* TO 'replication'@'192.168.1.101' شناسایی شده توسط "password";

مستر غیرفعال مانند یک ماکت معمولی همانندسازی را انجام می دهد، اما علاوه بر این، منطق های باینری ایجاد می کند - یعنی می توانیم از آن همانندسازی را شروع کنیم. بیایید این را با دستور "show master status" تأیید کنیم:
mysql@replica> SHOW MASTER STATUS\G
فایل: mysql-bin.000001
موقعیت: 61
Binlog_Do_DB:
Binlog_Ignore_DB:

حال برای اینکه Master Passive را به حالت Active تغییر دهید، باید Replication را روی آن متوقف کنید و Replication را در Master Active سابق فعال کنید. برای اطمینان از اینکه داده ها در زمان سوئیچ از بین نمی روند، استاد فعالباید قفل نوشتن باشد.
mysql@master> FLASH TABLEها با قفل خواندن
mysql@master> SET GLOBAL read_only = ON;
mysql@replica> STOP SLAVE.
mysql@replica> نشان دادن وضعیت استاد؛
فایل: mysql-bin.000001
موقعیت: 61
mysql@master> CHANGE MASTER TO MASTER_HOST = "192.168.1.102"، MASTER_USER = "Replication"، MASTER_PASSWORD = "password"، MASTER_LOG_FILE = "mysql-bin.000001"، MASTER_LOG1;
mysql@master> start slave.
تمام است، بنابراین ما استاد فعال را تغییر دادیم. می توانید بلوک را از استاد سابق حذف کنید.

نتیجه

ما کمی در مورد نحوه راه اندازی Replication در MySQL و انجام برخی از عملیات های اساسی یاد گرفته ایم. متأسفانه سؤالات مهم زیر از حوصله این مقاله خارج است:

  • حذف نقاط شکست منفرد (SPF، Single Points of Failure). هنگام استفاده از یک سرور MySQL، شکست آن منجر به از کار افتادن کل سیستم شد. هنگام استفاده از چندین سرور، خرابی هر یک از آنها منجر به خرابی سیستم می شود، مگر اینکه ما به طور خاص به این موضوع رسیدگی کنیم. ما باید برای رسیدگی به وضعیت با شکست استاد و ماکت فراهم کنیم. یکی از ابزارهای موجود MMM است، اما نیاز به اصلاح با یک فایل دارد.
  • متعادل سازی بار هنگام استفاده از چندین ماکت، مایلیم از مکانیزم متعادل کننده شفاف استفاده کنیم، به خصوص اگر عملکرد ماکت ها ناهموار باشد. تحت لینوکس، امکان استفاده از یک راه حل استاندارد - LVS وجود دارد.
  • تغییر منطق برنامه در یک موقعیت ایده آل، درخواست های خواندن داده ها باید به نسخه های تکراری ارسال شوند و درخواست های تغییر داده ها باید به Master ارسال شوند. با این حال، به دلیل تأخیر احتمالی نسخه‌ها، چنین طرحی اغلب ناکارآمد است و لازم است چنین درخواست‌های خواندنی که هنوز باید روی Master اجرا شوند، شناسایی شوند.
امیدوارم در مقالات بعدی به این موضوعات بپردازم.
با تشکر از توجه شما!

برچسب ها: اضافه کردن برچسب

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

نام گذاری ها:

  • master - سرور اصلی که داده های آن باید کپی شوند.
  • replica - یک سرور تعمیر شده که یک کپی از داده های اصلی را ذخیره می کند

برای تنظیم Replication در MySQL، باید دنباله ای از اقدامات توضیح داده شده در زیر را دنبال کنید، اما این یک جزم نیست و پارامترها می توانند بسته به شرایط تغییر کنند.

در سرور اصلی، فایل my.cnf را ویرایش کنید و خطوط زیر را به بخش mysqld اضافه کنید:

Server-id = log-bin = mysql-bin log-bin-index = mysql-bin.index log-error = mysql-bin.err relay-log = relay-bin relay-log-info-file = relay-bin. اطلاعات relay-log-index = relay-bin.index expire_logs_days=7 binlog-do-db =

  • - شناسه منحصر به فرد سرور MySQL، شماره در محدوده 2 (0-31)
  • - نام پایگاه داده، اطلاعاتی که در مورد آن در گزارش باینری نوشته می شود؛ اگر چندین پایگاه داده وجود داشته باشد، هر کدام به یک خط جداگانه با پارامتر binlog_do_db نیاز دارند.

در Slave، فایل my.cnf را ویرایش کنید و خطوط زیر را به بخش mysqld اضافه کنید:

Server-id = master-host = master master-user = replication master-password = master-port = 3306 relay-log = relay-bin relay-log-info-file = relay-log.info relay-log-index = relay-log.index replicate-do-db =

در سرور اصلی، کاربر replication را با حقوق تکرار داده اضافه کنید:

اعطای SLAVE REPLICATION ON *.* به "replication"@"replica" شناسایی شده توسط "password"

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

Mysql@master> FLUSH TABLES WITH READ LOCK. mysql@master> SET GLOBAL read_only = ON;

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

Mysql@master> SET GLOBAL read_only = OFF.

بیایید از تمام پایگاه های داده روی سرور اصلی (یا آنهایی که نیاز داریم) نسخه پشتیبان تهیه کنیم:

Root@master# tar -czf mysqldir.tar.gz /var/lib/mysql/

یا با استفاده از ابزار mysqldump:

Root@master# mysqldump -u root -p --lock-all-tables > dbdump.sql

بیایید هر دو سرور را متوقف کنیم (در برخی موارد می توانید بدون آن کار کنید):

Root@master# mysqlamdin -u root -p shutdown root@replica# mysqlamdin -u root -p shutdown

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

Root@replica# سی دی /var/lib/mysql root@replica# tar -xzf mysqldir.tar.gz

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

Root@replica# mysql -u root -p< dbdump.sql

بیایید mysql را بر روی سرور اصلی (و سپس در سرور برده، در صورت لزوم) اجرا کنیم:

Root@master# /etc/init.d/mysql start root@replica# /etc/init.d/mysql start

بیایید عملکرد سرورهای master و slave را بررسی کنیم:

Mysql@replica> start slave. mysql@replica> نشان دادن وضعیت برده\G mysql@master> نشان دادن وضعیت استاد\G

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

Root@replica# mysqlbinlog master.info > master_info.sql

در صورت بروز خطا، می توانید از دستورات زیر استفاده کنید:

Mysql@replica> stop slave. mysql@replica> RESET SLAVE. mysql@master> RESET MASTER.

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

برای افزودن داغ سرورهای تکراری می توانید از نحو زیر استفاده کنید:

Mysql@replica> SHOW SLAVE STATUS\G mysql@master> SHOW MASTER STATUS\G mysql@replica-2> CHANGE MASTER TO MASTER_HOST = "master", MASTER_USER =Replication, MASTER_PASSWORDAS = "MASTER_LOG_sword" bin.000004 "، MASTER_LOG_POS = 155; mysql@replica-2> START SLAVE.

اطلاعات وضعیت ها موقعیت و نام فایل گزارش فعلی را نشان می دهد.

با تکثیر ناهمزمان، به‌روزرسانی از یک ماکت پس از مدتی به جای یک تراکنش، به دیگران منتشر می‌شود. بنابراین، تکثیر ناهمزمان یک تأخیر یا زمان انتظار را معرفی می‌کند، که طی آن ممکن است تکثیرهای تکی به طور مؤثر یکسان نباشند. اما این نوع تکرار جنبه‌های مثبتی نیز دارد: سرور اصلی نگران همگام‌سازی داده‌ها نیست؛ می‌توانید پایگاه داده (به عنوان مثال، برای ایجاد یک نسخه پشتیبان) را در یک ماشین برده بدون مشکل برای کاربران مسدود کنید.

فهرست منابع استفاده شده

  1. Habrahabr.ru - مبانی تکرار در MySQL (http://habrahabr.ru/blogs/mysql/56702/)
  2. ویکی پدیا (http://ru.wikipedia.org/wiki/Replication_(computing_technology))

هنگام استفاده از هر گونه مطالب از سایت به طور کامل یا جزئی، باید به طور واضح پیوندی را به عنوان منبع ذکر کنید.

این روزها، پایگاه داده MySQL تقریباً در همه جا ممکن استفاده می شود. تصور وب سایتی که بدون MySQL کار کند غیرممکن است. البته استثناهایی هم وجود دارد، اما بخش عمده ای از بازار در اختیار این سیستم پایگاه داده است. و محبوب ترین پیاده سازی MariaDB است. هنگامی که پروژه کوچک است، یک سرور برای اجرای آن کافی است که همه سرویس ها روی آن قرار دارند: وب سرور، سرور پایگاه داده و سرور ایمیل. اما هنگامی که پروژه بزرگتر می شود، ممکن است لازم باشد برای هر سرویس یک سرور جداگانه اختصاص دهید یا حتی یک سرویس را به چندین سرور تقسیم کنید، به عنوان مثال MySQL.

به منظور حفظ یک وضعیت همزمان پایگاه های داده در همه سرورها به طور همزمان، باید از Replication استفاده کنید. در این مقاله به نحوه پیکربندی تکرار MySQL با استفاده از MariaDB Galera Cluster خواهیم پرداخت.

MARIADB GALERA چیست؟

MariaDB Galera یک سیستم خوشه اصلی برای MariaDB است. با شروع با MariaDB 10.1، نرم افزار Galera Server و MariaDB Server در یک بسته ارائه می شوند، بنابراین شما بلافاصله تمام نرم افزارهای مورد نیاز خود را دریافت می کنید. در حال حاضر، MariaDB Galera فقط می تواند با موتورهای پایگاه داده InnoDB و XtraDB کار کند. یکی از مزایای استفاده از Replication، اضافه شدن افزونگی به پایگاه داده سایت است. اگر یکی از پایگاه داده ها خراب شد، می توانید بلافاصله به دیگری تغییر دهید. همه سرورها یک حالت هماهنگ با یکدیگر را حفظ می کنند و اطمینان حاصل می کنند که هیچ تراکنش گم شده ای وجود ندارد.

ویژگی های کلیدی MariaDB Galera:

  • تکرار با همگام سازی ثابت؛
  • ادغام خودکار گره ها؛
  • امکان اتصال چندین گره اصلی؛
  • پشتیبانی از ضبط در هر یک از گره ها.
  • همانندسازی موازی شفاف؛
  • مقیاس پذیری خواندن و نوشتن، حداقل تأخیر؛
  • گره هایی که از کار می افتند به طور خودکار از خوشه جدا می شوند.
  • شما نمی توانید دسترسی به جداول را مسدود کنید.

پیکربندی تکرار MYSQL

در این آموزش ما از Ubuntu 16.04 و MariaDB نسخه 10.1 به عنوان مثال استفاده خواهیم کرد. قبل از شروع، سیستم خود را به طور کامل به روز کنید:

sudo apt-get update -y
sudo apt-get upgrade -y

از آنجایی که ما پیکربندی خود را در چندین گره مستقر خواهیم کرد، باید عملیات به روز رسانی را روی همه آنها انجام دهیم. اگر سرور پایگاه داده MariaDB قبلاً نصب نشده است، باید آن را نصب کنید. ابتدا مخزن و کلید آن را اضافه کنید:

sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8

sudo add-apt-repository "deb http://ftp.utexas.edu/mariadb/repo/10.1/ubuntu xenial main"

sudo apt-get update -y

هنگامی که به روز رسانی لیست بسته کامل شد، MariaDB را با دستور نصب کنید:

sudo apt نصب mariadb-server rsync -y

برای انجام همگام سازی مستقیم به بسته rsync نیاز داریم. پس از اتمام نصب، باید پایگاه داده را با استفاده از اسکریپت mysql_secure_installation ایمن کنید:

sudo mysql_secure_installation

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

رمز عبور فعلی را برای root وارد کنید (برای هیچکدام وارد کنید):
پسورد روت رو عوض کنم؟ n
کاربران ناشناس حذف شوند؟ Y
ورود ریشه از راه دور مجاز نیست؟ Y
پایگاه داده آزمایشی حذف شود و به آن دسترسی داشته باشید؟ Y
اکنون جداول امتیاز مجدد بارگیری شود؟ Y

وقتی همه چیز آماده شد، می توانید به راه اندازی گره هایی که پایگاه داده های mysql بین آنها تکثیر می شود، ادامه دهید. ابتدا، بیایید راه اندازی اولین گره را بررسی کنیم. شما می توانید تمام تنظیمات را در my.cnf قرار دهید، اما بهتر است یک فایل جداگانه برای این اهداف در پوشه /etc/mysql/conf.d/ ایجاد کنید.

این خطوط را اضافه کنید:


binlog_format=ROW

innodb_autoinc_lock_mode=2
bind-address=0.0.0.0

wsrep_on=روشن





wsrep_sst_method=rsync
# پیکربندی گره Galera
wsrep_node_address="192.168.56.101"
wsrep_node_name="Node1"

در اینجا آدرس 192.168.56.101 آدرس گره فعلی است. سپس به سرور دیگری بروید و همان فایل را در آنجا ایجاد کنید:

sudo vi /etc/mysql/conf.d/galera.cnf


binlog_format=ROW
default-storage-engine=innodb
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0
# پیکربندی ارائه دهنده Galera
wsrep_on=روشن
wsrep_provider=/usr/lib/galera/libgalera_smm.so
# پیکربندی خوشه Galera
wsrep_cluster_name="galera_cluster"
wsrep_cluster_address="gcomm://192.168.56.101,192.168.56.102"
# پیکربندی همگام سازی Galera
wsrep_sst_method=rsync
# پیکربندی گره Galera
wsrep_node_address="192.168.56.102"
wsrep_node_name="Node2"

به طور مشابه، آدرس گره در اینجا 192.168.0.103 است. بیایید روی یک مثال با دو سرور تمرکز کنیم، زیرا این برای نشان دادن عملکرد سیستم کافی است و می توانید با وارد کردن یک آدرس IP اضافی در فیلد wsrep_cluster_address یک سرور دیگر اضافه کنید. حالا بیایید ببینیم که مقادیر پارامترهای اصلی به چه معنا هستند و به راه اندازی ادامه دهیم:

  • binlog_format- فرمت گزارش که در آن پرس و جوها ذخیره می شوند، مقدار ردیف نشان می دهد که داده های باینری در آنجا ذخیره می شوند.
  • پیش فرض ذخیره سازی موتور- موتور جدول SQL که ما از آن استفاده خواهیم کرد.
  • innodb_autoinc_lock_mode- حالت عملکرد مولد ارزش AUTO_INCREMENT؛
  • bind-address- آدرس IP که برنامه به اتصالات گوش می دهد، در مورد ما تمام آدرس های IP.
  • wsrep_on- امکان تکرار
  • wsrep_provider- کتابخانه ای که با آن تکثیر انجام خواهد شد.
  • wsrep_cluster_name -نام خوشه باید در همه گره ها مطابقت داشته باشد.
  • wsrep_cluster_address- لیستی از آدرس های سرور که پایگاه داده های mysql بین آنها تکثیر می شود، با کاما از هم جدا می شوند.
  • wsrep_sst_method- حمل و نقلی که برای انتقال داده ها استفاده خواهد شد.
  • wsrep_node_address- آدرس IP گره فعلی؛
  • wsrep_node_name- نام گره فعلی

تنظیمات تکرار MySQL تقریباً کامل شده است. آخرین مرحله باقی مانده قبل از راه اندازی، راه اندازی فایروال است. ابتدا ابزار مدیریت قوانین iptables را در اوبونتو - UFW فعال کنید:

سپس پورت های زیر را باز کنید:

sudo ufw allow 3306/tcp
sudo ufw allow 4444/tcp
sudo ufw allow 4567/tcp
sudo ufw allow 4568/tcp
sudo ufw allow 4567/udp

راه اندازی MARIADB GALERA

پس از راه اندازی موفقیت آمیز تمام گره ها، تنها کاری که باید انجام دهیم این است که خوشه Galera را در اولین گره راه اندازی کنیم. قبل از اینکه بتوانیم کلاستر را شروع کنیم، باید مطمئن شوید که سرویس MariaDB در همه سرورها متوقف شده است:

sudo galera_new_cluster

با دستور زیر می توانید بررسی کنید که خوشه در حال اجرا است یا خیر و چند ماشین به آن متصل شده است:

حالا فقط یک ماشین وجود دارد، حالا به سرور دیگری بروید و یک گره را در آنجا اجرا کنید:

sudo systemctl mysql را شروع کنید

با دستور زیر می توانید بررسی کنید که آیا راه اندازی موفقیت آمیز بوده است یا خیر و آیا خطایی وجود داشته است:

وضعیت sudo systemctl mysql

سپس با اجرای همین دستور، بررسی می کنید که گره جدید به طور خودکار به خوشه اضافه شده است:

mysql -u root -p -e "نمایش وضعیت مانند "wsrep_cluster_size""

برای بررسی نحوه عملکرد تکرار، کافی است یک پایگاه داده در اولین گره ایجاد کنید و ببینید که آیا واقعاً به تمام گره های دیگر اضافه شده است یا خیر:

mysql -u root -p

MariaDB [(هیچکدام)]> ایجاد پایگاه داده test_db;
MariaDB [(هیچ)]> نمایش پایگاه داده.

mysql -u root -p

MariaDB [(هیچ)]> نمایش پایگاه داده.

همانطور که می بینید، پایگاه داده در واقع به طور خودکار در ماشین دیگری ظاهر می شود. تکثیر داده های Mysql کار می کند.



 


خواندن:



HTC Sync Manager: نحوه استفاده، مکان دانلود، حل مشکل

HTC Sync Manager: نحوه استفاده، مکان دانلود، حل مشکل

HTC Sync ابزاری برای اتصال گوشی های هوشمند HTC به کامپیوتر، تبادل داده ها و همگام سازی داده ها بین آنهاست. این برنامه روی...

Xperia Z3 و Xperia Z3 Compact: بررسی و مقایسه مرورگر وب یک برنامه نرم افزاری برای دسترسی و مشاهده اطلاعات در اینترنت است.

Xperia Z3 و Xperia Z3 Compact: بررسی و مقایسه مرورگر وب یک برنامه نرم افزاری برای دسترسی و مشاهده اطلاعات در اینترنت است.

نوشتن این مقایسه منو به دلیل چنین سؤال مکرری در مورد اینکه چه چیزی را انتخاب کنید - Sony Xperia Z3 یا Xperia Z3 Compact ایجاد شد؟ بیشتر اوقات ...

تعرفه های جدید Kyivstar اتصال در دسترس نیست

تعرفه های جدید Kyivstar اتصال در دسترس نیست

شرکت Kievtsar به مشترکین خود اتصال به بسته های تعرفه ای مختلف را به صورت قراردادی ارائه می دهد. از جمله مزایای فراوان این ...

اینترنت تلفن فلای کار نمی کند

اینترنت تلفن فلای کار نمی کند

دستورالعمل ها دریابید - آیا امکان اتصال به اینترنت در مدل گوشی شما وجود دارد؟ این را می توانید در لیست مشخصات فنی پیدا کنید ...

فید-تصویر RSS