علی رضا سلیم زاده
علی رضا سلیم زاده
خواندن ۳ دقیقه·۵ سال پیش

راه اندزای MYSQL به صورت MASTER-MASTER

دیتا بیس ها میتونن به صورت Standalone باشند یا با هم در ارتباط باشن وقتی با هم در ارتباط باشن میتونن به صورت های MASTER-SLAVE یا MASTER-MASTER باشن در حالت اول روی سرور مستر عملیات خواندن و نوشتن انجام میشه و روی سرورهای SLAVE فقط خواندن انجام میشه در حالت دوم روی هر دوتا سرور عملیات خواندن و نشتن انجام میشه .

صورت مسئله

چون دوتا سرور فیزیکی داریم و این دوتا از طریق SAN Storage به هم وصل نیستن و دوست داریم که Redundancy داشته باشیم از حالت master-master استفاده میکنیم تا وب اپ ها از روی دوتا سرور بتونن روی هر دوتا دیتابیس بنویسند .

برای راه اندازی از دوتا سرور Cent Os 7 و دیتا بیس Maria Db ورژن 10.3 استفاده کردیم.

برای نصب Maria DB روی Cent Os اول باید ریپازیتوری زیر رو اد کنید

/etc/yum.repos.d/MariaDB.repo

بعد محتویات زیر رو بریزید توش

[mariadb] name = MariaDB baseurl = http://yum.mariadb.org/10.3/centos7-amd64 gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB gpgcheck=1

بعد هم دستور زیر

yum update

بعد هم دستور

yum install MariaDB-server MariaDB-clien

بعد از نصب دستور زیر رو اجرا کنید و کلمه عبور ست کنید

mysql_secure_installation

و ادامه ماجرا

روی سرور اول

بعد از نصب سرویس mariadb رو استپ کنید (مطمین باشید که استپ هست )

systemctl stop mariadb

بعد به مسیر زیر برید و فایل my.cnf رو ویرایش کنید .

/etc/my.cnf

و قسمت Mysql رو به صورت زیر تغییر بدید :

# bind-address          = 127.0.0.1 server-id               = 61 report_host             = master1 log_bin                 = /var/log/mariadb/mariadb-bin log_bin_index           = /var/log/mariadb/mariadb-bin.index relay_log               = /var/log/mariadb/relay-bin relay_log_index         = /var/log/mariadb/relay-bin.index # replicate-do-db       = testdb auto_increment_increment = 5 auto_increment_offset = 1

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

systemctl stop mariadb

حالا وارد محیط Mysql میشیم

mysql -uroot -p

بعد از ورود یک یوزر میسازیم

MariaDB [(none)]> create user 'replusr'@'%' identified by 'replusr';

و دسترسی میدیم بش

MariaDB [(none)]> grant replication slave on *.* to 'replusr'@'%';

حالا وضعیت مستر رو بررسی میکنیم

MariaDB [(none)]> show master status;

خروجیش شبیه این میشه که اسم فایل و Position مهمه که باید نیگه داریم

+--------------------+----------+--------------+------------------+ | File               | Position | Binlog_Do_DB | Binlog_Ignore_DB | +--------------------+----------+--------------+------------------+ | mariadb-bin.000009 |      634 |              |                  | +--------------------+----------+--------------+------------------+

حالا روی سرور دوم

تقریبا تمام مراحلی رو که در سرور 1 اجرا کردیم در این سرور هم اجرا میکنیم با یه تفاوت های کوچیک اولیش تغییرات داخل این فایله (بقیه مراحل عیناً مثل سرور1 اجرا میشه )

داخل این فایل

/etc/my.cnf

محتویات رو به صورت زیر تغییر میدیم

# bind-address          = 127.0.0.1 server-id               = 62 report_host             = master2 log_bin                 = /var/log/mariadb/mariadb-bin log_bin_index           = /var/log/mariadb/mariadb-bin.index relay_log               = /var/log/mariadb/relay-bin relay_log_index         = /var/log/mymariadbql/relay-bin.index # replicate-do-db       = testdb auto_increment_increment = 5 auto_increment_offset = 1
قابل توجه اینکه روی سرور اول باید بتونید master2 رو پینگ کنید و روی سرور دوم بتونید master1 رو پینگ کنید اگر به هر دلیلی نمیتونید و نمیخواید میتونید آی پی ست کنید .

خوب حالا دستور زیر رو توی سرور دوم اجرا میکنیم (بعدش با کمی تغییر توی سرور اول )


MariaDB [(none)]> STOP SLAVE;
MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST='master1', MASTER_USER='replusr', MASTER_PASSWORD='replusr', MASTER_LOG_FILE='mariadb-bin.000009', MASTER_LOG_POS=;
MariaDB [(none)]> START SLAVE;

توی متن بالا

مقدار master1 = اسم سرور اول
مقدار mariadb-bin.000009 = اسم فایلی که با دستور show master status; به دست آوردیم
مقدار 634 = پوزیشنی که با دستور show master status; به دست آوردیم

برای بررسی دستور زیر رو میزنیم

MariaDB [(none)]> SHOW SLAVE STATUS\G

نتیجه باید همچین چیزی بشه اگر ارور یا موردی دیدید باید دلیلش رو بررسی کنید

*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event Master_Host: master1 Master_User: replusr Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mariadb-bin.000009 Read_Master_Log_Pos: 634 Relay_Log_File: relay-bin.000002 Relay_Log_Pos: 537 Relay_Master_Log_File: mariadb-bin.000009 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: 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: 634 Relay_Log_Space: 828 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0 Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 1 Master_SSL_Crl: Master_SSL_Crlpath: Using_Gtid: No Gtid_IO_Pos:

خوب باید همه مراحل رو برای سرور اول هم انجام بدید

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


mysqlreplication
یک شبکه کار برنامه نویس که سخت افزار هم بلده .که یکمی هم تنبل شده
شاید از این پست‌ها خوشتان بیاید