تکرار Mysql از چندین پایگاه داده. Replication در MySQL چیست؟ ما اقدامات بعدی را در سرور Slave انجام می دهیم

تکثیر داده ها mysqlبه شما امکان می دهد یک کپی دقیق از پایگاه داده را از یک سرور - سرور اصلی (سرور پیشرو) در یک یا چند سرور دیگر (سرور برده) داشته باشید. به طور پیش فرض، تکرار Mysql ناهمزمان است.
به این معنی که سرور اصلی کنترلی ندارد و نمی داند که سرورهای برده در حال خواندن فایل log هستند و آیا آن را به درستی انجام می دهند یا خیر.
همچنین انواع دیگری از همگام سازی، همزمان و نیمه سنکرون وجود دارد که این فرآیندها کنترل می شوند.
بسته به تنظیمات، می‌توانید هم کل پایگاه‌های داده و هم جداول پایگاه‌داده فردی را تکرار کنید.

برای چه چیزی می توانید از Replication استفاده کنید:
1. توزیع بار بین میزبان ها برای بهبود عملکرد.
در چنین طرحی، گره اصلی عملیات خواندن و نوشتن را انجام می دهد، گره هایی که دارای اشتراک گره اصلی هستند، پایه ای را برای خواندن فراهم می کنند، بنابراین ما سرور اصلی را از عملیات خواندن خلاص می کنیم.
2. امنیت داده ها و سهولت نگهداری، از آنجایی که گره برده حاوی داده های فقط خواندنی است، تغییرات در داده های روی مشترک محدود خواهد بود، سهولت نگهداری - امکان اجرای فرآیندهایی که به پایگاه داده سرویس می دهند بدون وقفه در عملکرد برنامه ها
3. توزیع داده ها در فواصل طولانی. شما می توانید یک کپی از داده ها را در هر میزبانی، صرف نظر از مکان آن ایجاد کنید
mysqlاز روش های تکرار زیر پشتیبانی می کند:
سنتی - این روش مبتنی بر تکرار رویدادها از فایل لاگ باینری استاد است و به فایل های گزارش نیاز دارد. موقعیت های بین سرور اصلی و سرور باید همگام شوند.
روش استفاده از شناسه‌های تراکنش جهانی GTID (روش معاملاتی)
mysqlاز انواع همگام سازی زیر پشتیبانی می کند:
ناهمزمان (همگام سازی یک طرفه)
نیمه سنکرون (کنترل جزئی مشترکین)
همزمان (کنترل کامل مشترکین)

راه اندازی روش سنتی تکرار پایگاه داده Mysql

اصل عملیات
سرور اصلی شامل صندوقچهفایل های log، که تمام تغییرات رخ داده در پایگاه داده اصلی را ثبت می کند، فایلی که نام ها را توصیف می کند صندوقچهفایل‌ها و همچنین موقعیتی در گزارشی که آخرین داده اصلی در آن ثبت شده است
گره slave داده هایی را از master دریافت می کند که اطلاعاتی در مورد نام ها دارد صندوقچهفایل ها و موقعیت در فایل لاگ.

راه اندازی جادوگر
my.iniباید دارای یک شناسه منحصر به فرد باشد - عددی از 1 تا 2 تا توان 32 - 1، شناسه سرور.
به‌طور پیش‌فرض server-id=0، یعنی اشتراک‌های سرورهای برده را قبول نکنید

log-bin=mysql-bin
server-id=1

این دو خط برای شروع کافی است
توجه: با این حال، در صورت استفاده از InnoDB، اضافه کردن آن نیز توصیه می شود
innodb_flush_log_at_trx_commit=1
sync_binlog=1

و باید بررسی کنید که قابلیت کار با شبکه غیرفعال نیست و پارامتر skip-networking تنظیم شده است
سرور slave با استفاده از نام کاربری و رمز عبور به Master متصل می شود، بنابراین ابتدا یک کاربر در سرور اصلی ایجاد می کنیم.
ایجاد کاربر repl@%.mydomain.com شناسایی شده توسط slavepass.
GRANT RePLICATION SLAVE ON *.* TO repl@%.mydomain.com;

بیایید شرایط را بررسی کنیم
نشان دادن وضعیت کارشناسی ارشد
اگر روال ایجاد لاگ های باینری قبلاً راه اندازی شده است، برای جداول InnoDB، ابتدا باید جداول را در یکی از جلسات قفل کنید.
میزهای فلاش با قفل خواندن.
اگر از جلسه خارج شوید، قفل جدول به طور خودکار آزاد می شود
در جلسه دیگری مقادیر نام را دریافت می کنیم صندوقچهورود و موقعیت
هر دو مقدار نشان دهنده مختصات تکرار هستند که سرور برده باید شروع به خواندن از فایل در محل مورد نظر برای شروع تکرار کند.
مرحله بعدی بستگی به این دارد که آیا داده هایی در سرور برده وجود دارد یا خیر
اگر آنها وجود دارند، جداول را قفل می کنیم و ایجاد می کنیم زباله(این روشی است که هنگام استفاده از InnoDB توصیه می شود)
با دستور می توانید نوع پایگاه داده را پیدا کنید
mysqlshow -u mysql_user -p -i پایگاه داده-نام
اگر پایگاه داده در فایل های باینری ذخیره شود، می توان آنها را از master به سرور برده کپی کرد.
بیایید انجام دهیم زباله
mysqldump --all-databases --master-data dbdump.db
برای انتخاب پایه ها mysqldump -- پایگاه های داده --master-data dbdump.db
پارامتر master-data، به طور خودکار اضافه می کند تغییر استاد بهدر یک گره برده، اگر پارامتر اضافه نشود، تمام جداول در جلسه باید به صورت دستی قفل شوند.
باز کردن قفل
باز کردن قفل جداول؛

پیکربندی Slave Nodeآ
اضافه کردن به my.iniشناسه سرور از شخصی از Master و سایر گره ها

سرور-id=2

یک اشتراک ایجاد کنید
تغییر استاد به
MASTER_HOST=master_host_name،
MASTER_USER=replication_user_name،
MASTER_PASSWORD=replication_password،
MASTER_LOG_FILE= ثبت_log_file_name،
MASTER_LOG_POS=موقعیت_log_ثبت شده;

هنگام تنظیم Replication با داده های موجود، باید قبل از شروع تکرار، یک عکس فوری از Master به Slave منتقل کنید.
ما استفاده می کنیم mysqldump
1. گره برده را با استفاده از آن شروع کنید -- skip-slave-startپارامتری برای جلوگیری از شروع تکرار
2. فایل dump را وارد کنید
mysql fulldb.dump
3. فرآیند اشتراک را شروع کنید
START SLAVE;
بررسی وضعیت تکرار
نمایش وضعیت برده\G
Slave_IO_State: - وضعیت فعلی دستگاه برده
Slave_IO_Running: - آیا جریان داده از Master خوانده می شود
Slave_SQL_Running: - آیا آنها در حال اجرا هستند؟ پرس و جوهای sql، باید بله باشد

مثالبیایید سرور Master (Master) را پیکربندی کنیم - ip 11.11.11.10 V my.ini
[
mysqld] log-bin=mysql-bin server-id=1
یک کاربر ایجاد کنید mysql -u root -p GRANT RePLICATION SLAVE ON *.* TO replica@% شناسایی شده با رمز عبور. امتیازات فلاش؛
بعد، تمام جداول را در پایگاه داده قفل می کنیم میزهای فلاش با قفل خواندن.
ما به وضعیت نگاه می کنیم نشان دادن وضعیت کارشناسی ارشد؛ ما نام و موقعیت فایل را به خاطر می آوریم، از آنها در سرور Slave برای اشتراک استفاده خواهیم کرد

در مورد برده بی my.ini
log-bin=mysql-bin server-id=2

یک اشتراک ایجاد کنید تغییر MASTER به MASTER_HOST=11.11.11.10، MASTER_PORT=3306،
MASTER_USER=مثنی، MASTER_PASSWORD=رمز عبور،
MASTER_LOG_FILE=server-mysql-bin.000002،
MASTER_LOG_POS=1151664، MASTER_CONNECT_RETRY=10;
START SLAVE;
وضعیت تکرار نمایش وضعیت برده\G

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

تکثیر Master-Slave MySQL

در اصطلاح Master-Slave، Master سرور اصلی با پایگاه داده است که در پایگاه داده می نویسد، اما خواندن بین master و slave بسته به بار روی سیستم توزیع می شود که تحمل خطا و عملکرد را افزایش می دهد. علاوه بر این، به لطف این رویکرد، یک نسخه از پایگاه داده همیشه در دسترس است و در صورت خرابی یکی از سرورها قابل بازیابی است.

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

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

راه اندازی Replication به هیچ وجه دشوار نیست، زیرا این مکانیسم از همان ابتدا در MySQL ساخته شده بود.

راه اندازی روی سرور Master

اجازه دهید با ویرایش فایل پیکربندی my.cnf، که اغلب در /etc/mysql/my.cnf قرار دارد، شروع کنیم. شما باید پیدا کنید و از نظر برداشت کنید (# را حذف کنید)، یا چنین خطوطی را بنویسید.

Bind-address = 0.0.0.0 server-id = 1 log_bin = /var/log/mysql/mysql-bin.log

مهم! اگر bind-address قبلاً ثبت شده باشد، نیاز به تغییر دارد، در غیر این صورت امکان برقراری ارتباط بین سرورها وجود نخواهد داشت.

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

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

اکنون باید یک کاربر با حقوقی برای تکثیر پایگاه داده خود ایجاد کنیم، این کار را می توان از ریشه انجام داد کنسول MySQLبا استفاده از دستور

اعطای تکرار SLAVE در *.* به "slave_user"@"%" شناسایی شده توسط "slave_password"; امتیازات فلاش؛

جایی که به جای “slave_user” و “slave_password” باید لاگین و رمز عبور را برای Slave بنویسید.

حالا بیایید به داده های اصلی نگاه کنیم

نشان دادن وضعیت کارشناسی ارشد؛

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

راه اندازی در سرور Slave

اولین قدم این است که یک پایگاه داده با همان نامی که قرار است تکرار کنیم ایجاد کنیم. این گام مهمی است و نباید از آن غفلت کرد. سپس به فایل پیکربندی که قبلاً برای ما آشناست بروید my.cnf و تنظیمات را بنویسید.

Server-id = 2 relay-log = /var/log/mysql/mysql-relay-bin.log bin-log = /var/log/mysql/mysql-bin.log

مهم! در bin-log مسیر bin-log نوشته می شود در سرور مستر . شناسه سرور باید با شناسه اصلی متفاوت باشد، تنظیم آن بر روی ۱ بیشتر راحت است.

CHANGE MASTER TO MASTER_HOST="1.1.1.1", MASTER_USER="slave_user", MASTER_PASSWORD="slave_password", MASTER_LOG_FILE = "mysql-bin.000001", MASTER_LOG_POS = 107; START SLAVE;

در جایی که میزبان آدرس IP استاد است، ورود به سیستم و رمز عبور با آدرس‌هایی که در اصلی ایجاد کرده‌ایم مطابقت دارد، master_log_file و master_log_pos با اطلاعاتی پر می‌شوند. آخرین مورد برای پیکربندی سرور اصلی .

از این لحظه تمام تغییرات در پایگاه داده از master به slave منتقل می شود.

بررسی وضعیت تکرار

علاوه بر دستور SHOW MASTER STATUS؛ مشابهی برای Slave SHOW SLAVE STATUS\G وجود دارد که جدولی را با اطلاعات نمایش می دهد. نشانه اصلی اتصال و کارکرد صحیح سرورها وجود چنین خطوطی است

همانند سازی- تکنیکی که در معماری سیستم هایی که تحت بار کار می کنند استفاده می شود که نتیجه آن توزیع بار هنگام کار با یک پایگاه داده در چندین سرور است. تکرار MySQL MASTER SLAVE بیشتر مورد استفاده قرار می گیرد، اما نوع دوم از تکرار نیز استفاده می شود - Master-Master.

MySQL MASTER SLAVE replication چیست و چه کاربردی دارد؟

همانند سازی ارباب-بردهشامل کپی کردن داده ها به سرور MySQL است. اگر سرور اصلی از کار بیفتد، عملکردهای آن به Slave تغییر می کند.

همانندسازی می‌تواند برای بهبود عملکرد سیستم نیز انجام شود، اما عملکرد تقریباً همیشه در اینجا ثانویه است.
هنگامی که یک برنامه کاربردی با پایگاه داده کار می کند، متداول ترین عملیات است انتخاب کنید- درخواست برای خواندن داده ها، تغییر داده ها - درخواست ها حذف, درج کنید, به روز رسانی, تغییر دهیداز نظر آماری خیلی کمتر اتفاق می افتد.

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

راه حل محبوب است، اما همیشه قابل اجرا نیست، زیرا ممکن است در طول تکرار تاخیر وجود داشته باشد - اگر این اتفاق بیفتد، اطلاعات نیز باید از سرور Master خوانده شوند.

هدایت درخواست های نوع خاصی به سرور پایگاه داده خاص در هر صورت در سطح برنامه اجرا می شود.

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

تکرار برای تحمل خطا است، نه برای مقیاس بندی.

تکرار MySQL MASTER SLAVE - راه اندازی در Debian

ما از دو سرور با آدرس استفاده خواهیم کرد:

  • سرور اصلی 192.168.0.1
  • سرور برده 192.168.0.2

برای نمایش از VDS متصل به یک شبکه محلی استفاده می شود.
برای اینکه همیشه مطمئن باشیم که در کدام سرور این یا آن دستور را اجرا می کنیم، فایل های /etc/hosts را در هر دو سرور ویرایش می کنیم.

192.168.0.1 استاد

192.168.0.2 برده

بیایید مقادیر موجود در /etc/hostname را به ترتیب با master و slave جایگزین کنیم تا تغییرات اعمال شده و سرور راه اندازی مجدد شود.

1. تنظیمات را روی سرور اصلی انجام می دهیم.

root@master:/#

ویرایش اصلی فایل پیکربندیسرور پایگاه داده

mcedit /etc/mysql/my.cnf

شناسه سرور را انتخاب کنید - می توانید هر عددی را مشخص کنید، پیش فرض 1 است - فقط خط را از نظر خارج کنید

شناسه سرور = 1

مسیر را برای ورود به سیستم باینری تنظیم کنید - همچنین به طور پیش فرض مشخص شده است، آن را لغو نظر کنید

نام پایگاه داده ای را که در سرور دیگری کپی خواهیم کرد، تنظیم کنید

binlog_do_db = db1

Mysql را مجدداً راه اندازی کنید تا فایل پیکربندی دوباره خوانده شود و تغییرات اعمال شوند:

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

2. حقوق ضروری کاربر را تنظیم کنید

به کنسول سرور پایگاه داده بروید:

ما به کاربر در سرور برده حقوق لازم را می دهیم:

اعطای تکرار SLAVE در *.* به "slave_user"@"%" شناسایی شده توسط "123";

قفل کردن تمام جداول در پایگاه داده

میزهای فلاش با قفل خواندن.

بررسی وضعیت سرور اصلی:

+——————+———-+—————+——————+
| فایل | موقعیت | Binlog_Do_DB | Binlog_Ignore_DB |
+——————+———-+—————+——————+
| mysql-bin.000001 | 327 | db1 | |
+——————+———-+—————+——————+
1 ردیف در مجموعه (0.00 ثانیه)

3. یک پایگاه داده dump روی سرور ایجاد کنید

ایجاد یک پایگاه داده dump:

mysqldump -u root -p db1 > db1.sql

باز کردن قفل جداول در کنسول mysql:

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

scp db1.sql [ایمیل محافظت شده]:/خانه

ما اقدامات بعدی را در سرور Slave انجام می دهیم

root@slave:/#

5. ایجاد پایگاه داده

بارگیری زباله:

mysql -u root -p db1< db1.sql

6. تغییراتی را در my.cnf ایجاد کنید

mcedit /etc/mysql/my.cnf

ما با افزایش مقدار تنظیم شده در سرور Master یک شناسه اختصاص می دهیم

server-id=2

مسیر ثبت رله را تنظیم کنید

relay-log = /var/log/mysql/mysql-relay-bin.log

و مسیر ورود به bin log در سرور Master

log_bin = /var/log/mysql/mysql-bin.log

پایه را مشخص کنید

binlog_do_db = db1

راه اندازی مجدد سرویس

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

7. یک اتصال به سرور Master تنظیم کنید

CHANGE MASTER TO MASTER_HOST="192.168.0.1"، MASTER_USER="slave_user"، MASTER_PASSWORD="123"، MASTER_LOG_FILE = "mysql-bin.000001"، MASTER_LOG_POS = 327;

ما شروع به تکرار در سرور برده می کنیم:

با درخواست زیر می توانید عملکرد Replication را در Slave بررسی کنید:

************************** 1. ردیف ******************** *******
Slave_IO_State: در انتظار استاد برای ارسال رویداد
Master_Host: 192.168.0.1
Master_User: slave_user
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000002
Read_Master_Log_Pos: 107
Relay_Log_File: mysql-relay-bin.000003
Relay_Log Pos: 253
Relay_Master_Log_File: mysql-bin.000002
Slave_IO_Running: بله
Slave_SQL_Running: بله
Replicate_Do_DB:
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: 107
Relay_Log Space: 555
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:
ثانیه_پشت_استاد: 0
Master_SSL_Verify_Server_Cert: خیر
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_IDs:
شناسه_سرور_مستر: 1
1 ردیف در مجموعه (0.00 ثانیه)

از آنجایی که هیچ خطایی رخ نداده است، می توانیم نتیجه بگیریم که Replication به درستی پیکربندی شده است.

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

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

8 آوریل 2009 ساعت 11:10 صبح هم بزنید

مبانی تکرار MySQL

  • MySQL

من نسبتاً اخیراً با تکثیر سرورهای 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، مقدار موقعیت باید افزایش یابد.

تنظیمات کپی
بیایید شناسه سرور، نام پایگاه داده برای تکثیر و مسیر Relay binlogs را در قسمت config مشخص کنیم، سپس 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 را بدون توقف تکثیر مجدداً راه‌اندازی کرد - از لاگ می‌دانیم که در چه موقعیتی در master، تکرار متوقف شده است.

حالا بیایید از موقعیتی که replica-2 متوقف شده بود به موقعیتی که فقط تکرار را متوقف کردیم، تکرار کنیم:
mysql@replica-1> CHANGE MASTER TO MASTER_HOST = "192.168.1.101"، MASTER_USER = "تکرار"، MASTER_PASSWORD = "گذرواژه"، MASTER_LOG_FILE = "mysql-bin.000015"، MASTER = "MASTER_BIN.000015".
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 اجرا شوند، شناسایی شوند.
امیدوارم در مقالات بعدی به این موضوعات بپردازم.
با تشکر از توجه شما!

برچسب ها:

  • mysql
  • همانند سازی
افزودن برچسب

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

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

در نتیجه پایگاه داده شما روی دو سرور در یک زمان قرار می گیرد. هنگامی که یک سرور اصلی (معروف به سرور اصلی) دیگر نمی تواند با آن مقابله کند، به یک سرور یدکی تغییر می کند.

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

حالا بیایید آن را بفهمیم نحوه پیکربندی Replication در MySQL:

  1. بیشتر نصب کنید آخرین نسخه های MySQLبه همه سرورها
  2. یک کاربر با امتیاز در سرور اصلی ایجاد کنید جایگزینی SLAVE. برای آدرسی که می تواند از آن متصل شود، مشخص کنید " همه".
  3. تمام سرورها را متوقف کنید.
  4. در تنظیمات MySQL(در فایل my.cnf) در فصل خطوط زیر را اضافه کنید: log-bin
    server-id=1 لطفاً توجه داشته باشید شناسه سرورباید در همه سرورها متفاوت باشد. در واقع این چیزی است که یک سرور را از سرور دیگر متمایز می کند.
  5. در سرورهای برده، به تنظیمات اضافه کنید MySQLخطوط زیر: master-host=master_host_name
    master-user=ورود به سایت create_user
    master-password=رمز عبور create_user
    master-port=port_for_connecting_to_the_master_server
    server-id=id_of_this_slave_server
  6. همه پایه ها را جابجا کنیداز سرور اصلی گرفته تا برده ها.
  7. اجرا کنسرور سر، سپس همه بردگان.