Cách tốt nhất để tạo Thiết lập sao chép MySQL Master-Slave và khắc phục sự cố là gì?


14

Tôi rất mới với Quản trị cơ sở dữ liệu.

Tôi phải đối mặt với rất nhiều vấn đề trong khi thiết lập sao chép chính chủ-nô lệ mysql.

Tôi cũng phải đối mặt với các vấn đề xử lý sự cố nhân rộng mysql thường xuyên.

Bất cứ ai có thể giúp để hiểu làm thế nào tôi nên đối phó với tất cả những điều này?


Một vài câu hỏi: Tại sao bạn cần phải nhân rộng, bạn đang cố gắng đạt được điều gì? Hệ điều hành của mỗi máy tính đang tham gia sao chép là gì? Phiên bản của MySQL trên mỗi máy tính là gì? Các bảng MyISAM, InnoDB, có gì khác không?
Craig Efrein

@CraigEfrein Tôi cần thiết lập sao chép vì các máy chủ này sẽ được sử dụng trong sản xuất. Tôi đang sử dụng Debian / ubfox trên mỗi máy. mysql5.1 là vaersion. Các bảng đặc biệt là InnoDB.
Abdul Manaf

Ok, tôi sẽ đăng một cấu hình mà tôi đã sử dụng giữa hai người gỡ lỗi một chút. Điều này giả định rằng bạn đã cài đặt MySQL trên tất cả các máy tính và tất cả chúng đều sử dụng cùng một phiên bản và có không gian đĩa đầy đủ. Khi sử dụng bản sao MySQL, bạn phải suy nghĩ về nơi bạn sẽ đặt nhật ký bin của mình, có thể phát triển khá lớn tùy thuộc vào một số yếu tố. Tôi sẽ đưa thông tin đó vào bài đăng của mình
Craig Efrein

Câu trả lời:


19

Tôi đã cung cấp các liên kết đến các hướng dẫn. Chỉ cần lưu ý rằng trên Ubuntu, tệp my.cnf nằm trong /etc/mysql/my.cnf chứ không phải trong /etc/my.cnf như trong hướng dẫn howtoforge. Trong thiết lập của tôi, tôi đã không sử dụng BẢNG XÓA B READNG ĐỌC KHÓA; về chủ. Nếu máy chủ chính của bạn có nhiều hoạt động ghi, bạn có thể cần phải khóa các bảng của mình bằng cách chạy lệnh đó trước khi sao lưu. Nếu bạn sử dụng BẢNG BẢNG VỚI ĐỌC LOCK;, thì sau khi sao lưu, bạn sẽ muốn chạy BẢNG UNLOCK. Nếu bạn gặp phải bất kỳ vấn đề, hãy cho tôi biết.

Đây là hướng dẫn mà tôi đã tìm thấy về cách rèn, được tạo cho Redhat / CentOS: http://www.howtoforge.com/mysql_database_Vplication

Một hướng dẫn khác có vẻ ổn đối với Ubuntu http://www.srcnix.com/2010/10/14/simple-mysql-replication-with-ub Ubuntu-master-to- slave /

Đây là cấu hình tôi đã sử dụng:

Trên máy chủ MASTER

Cấu hình máy chủ chính:

vi /etc/mysql/my.cnf

[mysqld]

# bind-address = 127.0.0.1 (comment this out)
server_id           = 1
log_bin             = /var/log/mysql/mysql-bin.log
log_bin_index       = /var/log/mysql/mysql-bin.log.index
max_binlog_size     = 100M
expire_logs_days    = 1

Khởi động lại MySQL:

/etc/init.d/mysql restart

Kết nối với bảng điều khiển của mysql: mysql -u root -ppassword

Tạo và cấp quyền cho người dùng sao chép.

GRANT REPLICATION SLAVE ON *.* TO 'replication'@'ipaddressofslave' IDENTIFIED BY 'replicationuserpassword';

Đảm bảo sao chép thông tin này ở đâu đó hoặc để nó hiển thị

SHOW MASTER STATUS \G;
mysql> show master status \G;
            File: mysql-bin.000001
        Position: 100
    Binlog_Do_DB: 
Binlog_Ignore_DB:

mysql> quit 

Kết xuất cơ sở dữ liệu vào một tệp:

mysqldump -u root -p databasename > /tmp/databasename-backup.sql

Sao chép kết xuất cơ sở dữ liệu vào máy chủ nô lệ bằng scp hoặc sử dụng ftp nếu bạn muốn:

scp /tmp/databasename-backup.sql root@ipaddressofslave:/tmp/

Trên máy chủ SLAVE

Chỉnh sửa cấu hình mysql:

vi /etc/mysql/my.cnf
[mysqld]

# slave server configuration
server_id           = 2

# this is optional, but I find it useful to specify where the relay logs go to control.  
# Don't forget to create the /var/log/mysql directory and give mysql rights to it.  
# chown mysql:mysql -R /var/log/mysql
# disk space
relay_log           = /var/log/mysql/mysql-relay-bin
relay_log_index     = /var/log/mysql/mysql-relay-bin.index
relay_log_space_limit = 2000M

Khởi động lại MySQL: /etc/init.d/mysql restart

Khôi phục bản sao lưu:

mysql -u root -ppassword nameofthedatabase < /tmp/databasename-backup.sql

Kết nối với MySQL:

mysql -u root -ppassword

stop slave;

# master log file and master_log_pos taken from show master status above
CHANGE MASTER TO master_host='ipaddressmaster', master_port=3306, master_user='replication', master_password='replicationuserpassword', master_log_file='mysql-bin.000001', master_log_pos=100;

start slave;

Chạy SHOW SLAVE STATUS\G:

mysql> show slave status\G;
             Slave_IO_State: Waiting for master to send event
                Master_Host: ipaddressmaster
                Master_User: replication
                Master_Port: 3306
              Connect_Retry: 60
            Master_Log_File: mysql-bin.0000001
        Read_Master_Log_Pos: 100
             Relay_Log_File: mysql-relay-bin.000001
              Relay_Log_Pos: 1
      Relay_Master_Log_File: mysql-bin.000001
           Slave_IO_Running: Yes
          Slave_SQL_Running: Yes
            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: 17324288
            Relay_Log_Space: 17324425
            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
1 row in set (0.02 sec)

Sau đó, hãy nhớ rằng nhân rộng có thể thất bại vì nhiều lý do. Trên nô lệ, bạn có thể theo dõi trạng thái bằng cách chạy lệnh SHOW SLAVE STATUS \ G; Hoặc thiết lập một công việc định kỳ để theo dõi trạng thái và gửi email nếu thất bại. Nhận gia đình với đầu ra từ lệnh này. Nếu sao chép đang chạy chính xác, bạn sẽ thấy "Slave_IO_State: Đang chờ chủ để gửi sự kiện".

Khi bạn nhận được thiết lập này một cách chính xác, tôi có thể cung cấp cho bạn một tập lệnh để theo dõi bản sao đó.

Đây là một kịch bản để theo dõi nhật ký lỗi trong MySQL. Nếu bạn thêm dòng

[mysqld]

log-error = /var/log/mysql/mysql.err

khởi động lại mysql: /etc/init.d/mysql khởi động lại

Sau đó, bạn có thể sử dụng đoạn script sau để theo dõi tệp nhật ký. Nếu nhật ký thay đổi theo bất kỳ cách nào, bạn sẽ nhận được một email thông báo cho bạn rằng đã xảy ra lỗi trên máy chủ nô lệ. Nếu bạn muốn kiểm tra nhật ký lỗi một cách thường xuyên, bạn sẽ cần thêm tập lệnh này vào crontab của mình.

Đây là một tập lệnh mẫu: /somepath/monitor_mysql_log.sh

#! /bin/sh
MAIL_TO="addressemail@something.com"

# This is the log that will be monitored.
# If any changes occur to this, then take appropriate action.
MONITORED_LOG=/var/log/mysql/mysql.err

# We will need this log to see whether any changes occured to /tmp/goreb.log
TEMP_LOG=/tmp/.mysql.err.1

# This is a 1-time command i.e. create the log file if it does nto exist.
[ ! -f $TEMP_LOG ] && touch -r $MONITORED_LOG $TEMP_LOG

[ $MONITORED_LOG -nt $TEMP_LOG ] && echo "an error occurred in mysql" | mail -s "Error on MySQL" $MAILTO

# Update $TEMP_LOG with the new modified date of $MONITORED_LOG
touch -r $MONITORED_LOG $TEMP_LOG

Để thêm vào crontab.

Làm cho tập lệnh thực thi:

chmod +x /somepath/monitor_mysql_log.sh

Cập nhật crontab:

crontab -e

* * * * * /somepath/monitor_mysql_log.sh

Và kịch bản sẽ được chạy mỗi phút.

Kịch bản tôi cung cấp là một kịch bản mà tôi vừa nhanh chóng kết hợp lại. Ngoài ra, để máy chủ của bạn có thể gửi email, bạn phải cài đặt một cái gì đó như postfix hoặc sendmail.


cảm ơn rất nhiều, tôi đã làm như thế này và tôi đã có thể thiết lập bản sao ...
Abdul Manaf

bạn có thể cung cấp cho tôi kịch bản để theo dõi nhân rộng.
Abdul Manaf

Xin lưu ý, tập lệnh tôi vừa thêm là thứ bạn cài đặt trên máy chủ nô lệ. Bạn có thể cài đặt nó trên máy chủ chính, nhưng nhật ký lỗi trên máy chủ nô lệ sẽ là thứ bạn quan tâm nhất dựa trên câu hỏi của bạn.
Craig Efrein

cảm ơn sự quan tâm của bạn. Nhưng về cơ bản tôi đã quan tâm đến việc khắc phục lỗi sao chép, tôi nghĩ rằng tập lệnh này sẽ theo dõi các thay đổi của nhật ký lỗi mà tôi sẽ đặt nó.
Abdul Manaf

Vì máy chủ nô lệ của bạn sẽ chỉ nhận dữ liệu và không cập nhật dữ liệu, nên hầu hết thông tin được ghi trong nhật ký lỗi sẽ là về sao chép. Ví dụ, nếu một bảng trên bản gốc bị hỏng, nô lệ sẽ không sao chép bảng và về cơ bản dừng sao chép. Nếu bạn thấy một lỗi trong nhật ký lỗi của máy chủ nô lệ. Nó thường là một dấu hiệu khá tốt cho thấy có gì đó không ổn với bản sao.
Craig Efrein

7

Mysqldump rất nhanh, nhưng việc khôi phục các bãi chứa có thể rất chậm đối với một DB lớn và các bảng khóa không được chấp nhận trên một trang web trực tiếp. Cách tốt hơn và nhanh hơn để thiết lập nô lệ là sử dụng XtraBackup của Percona . XtraBackup áp đặt tải nhỏ lên bản gốc, không yêu cầu khóa và khôi phục trên nô lệ rất nhanh. Cơ chế này tạo ra một bản sao hoàn chỉnh của toàn bộ cơ sở dữ liệu, bao gồm cả những thứ như bảng người dùng, sẽ phá vỡ một số thứ được thiết lập bởi một cài đặt chứng khoán, chẳng hạn như người dùng debian-sys-duy trì, không nhất thiết phải là một điều xấu !

Như một phần thưởng, một khi bạn biết cách làm điều này, bạn có thể sử dụng chính xác cơ chế tương tự cho các bản sao lưu hàng ngày của mình. Sao lưu chậm hơn mysqldump, nhưng khôi phục lại nhanh hơn, đó là những gì bạn cần nếu bạn đang trong tình trạng hoảng loạn và cần khôi phục lại bản sao lưu! Nếu bạn từng gặp một lỗi sao chép lớn, chỉ cần sử dụng quy trình này để dọn rác nô lệ và xây dựng lại nó; nó thực sự không mất nhiều thời gian.

Bạn sẽ cần thiết lập repo apt / yum của Percona cho bản phân phối của mình, sau đó cài đặt xtrabackupgói trên cả chủ và nô lệ. Tôi cũng khuyên bạn nên sử dụng tiện ích nén pigz (gzip song song, có sẵn trong hầu hết các repos tiêu chuẩn) vì nó tạo ra sự khác biệt lớn đối với tốc độ sao lưu.

Quá trình diễn ra như sau (trên Ubuntu, các bản phát hành khác có thể thay đổi đôi chút) và giả sử bạn đã cài đặt MySQL trên nô lệ của mình:

  1. Trước tiên, hãy sao lưu trên bản gốc: mkdir -p /var/xtrabackup; /usr/bin/innobackupex --slave-info --stream=tar --throttle=1500 /var/xtrabackup 2> /tmp/xtrabackup.out | /usr/bin/pigz -p 4 -c --best -q > /var/backups/mysql.tgz(điều chỉnh giá trị bướm ga để hạn chế tác động của sao lưu trên dịch vụ trực tiếp)
  2. Sao chép tệp sao lưu vào nô lệ (sử dụng scp -l 400000để không bỏ đói tổng thể băng thông mạng cho các máy khách trực tiếp)
  3. Dừng mysql trên nô lệ: service mysql stop
  4. Di chuyển thư mục dữ liệu MySQL cũ ra khỏi đường đi: mv /var/lib/mysql /var/lib/mysql2(hoặc nén nó ở đâu đó nếu bạn thiếu dung lượng đĩa)
  5. Tạo một thư mục dữ liệu mới và di chuyển vào đó: mkdir /var/lib/mysql; cd /var/lib/mysql
  6. Tháo tệp sao lưu vào thư mục mới : tar xvzif /path/to/backup/mysql.tgz. Lưu ý itùy chọn trên thao tác tar - nó sẽ không hoạt động nếu không có nó . Điều này sẽ mất một lúc nếu bạn có một DB lớn.
  7. Chạy công cụ Innobackupex trên các tệp được giải nén : /usr/bin/innobackupex --apply-log --use-memory=6G --ibbackup=xtrabackup /var/lib/mysql. Điều này có hiệu quả chạy phục hồi sự cố trên các tệp từ nhật ký nhị phân. Điều này chỉ mất vài giây; sử dụng một lượng bộ nhớ nhỏ hơn nếu trên một máy chủ nhỏ hơn.
  8. Giả sử đã hoàn thành thành công, hãy xóa bản sao lưu và đặt quyền sở hữu các tệp: rm /path/to/backup/mysql.tgz; chown -R mysql:mysql /var/lib/mysql
  9. Bắt đầu mysql: service mysql start
  10. Lấy tên tệp nhật ký chính và vị trí của bản sao lưu (lưu ý KHÔNG phải thông tin trong xtrabackup_slave_info) : cat xtrabackup_binlog_info. Nó sẽ nói một cái gì đó nhưmysql-bin.000916 13889427
  11. Kết nối với MySQL và kiểm tra xem thứ đó có ở đó không.
  12. Đặt lại cài đặt sao chép bằng các chi tiết bạn nhận được về nhật ký: CHANGE MASTER TO MASTER_HOST='192.168.0.1', MASTER_USER='replica', MASTER_PASSWORD='r3plica', MASTER_LOG_FILE='mysql-bin.000916', MASTER_LOG_POS=13889427;(Thay đổi để khớp với chi tiết máy chủ DB thực)
  13. Khởi động lại nô lệ: START SLAVE;
  14. Kiểm tra trạng thái của nô lệ khi nó bắt kịp chủ cho đến khi 'giây_behind_master' là 0: SHOW SLAVE STATUS\G

Nô lệ của bạn bây giờ đã được thiết lập Nếu cần, bây giờ bạn có thể thiết lập sao chép tròn:

  1. Trên nô lệ: FLUSH TABLES WITH READ LOCK; SHOW MASTER STATUS;Lưu ý tên và vị trí tệp nhật ký (một cái gì đó như mysql-bin.000031 và 17244785).
  2. Trên bản gốc : CHANGE MASTER TO MASTER_HOST='192.168.0.2', MASTER_USER='replica', MASTER_PASSWORD='r3plica', MASTER_LOG_FILE='mysql-bin.000031', MASTER_LOG_POS=17244785;, chèn các giá trị từ nô lệ mà chúng ta vừa xem.
  3. Về chủ: START SLAVE;
  4. Về nô lệ: UNLOCK TABLES;

Bây giờ bạn sẽ được thiết lập với một bản sao tròn.

Theo như xử lý sự cố, bộ công cụ của Percona có tất cả các loại trợ giúp như kiểm tra để phát hiện tham nhũng thầm lặng, đo độ trễ và hơn thế nữa. Các hình thức tham nhũng sao chép phổ biến nhất có thể tránh được bằng cách cài đặt binlog_format = MIXEDtrong my.cnf của bạn. Điều đó nói rằng, trong kinh nghiệm của tôi nhân rộng không phải là rắc rối.


Lòng trung thành của bạn là gì?
Pacerier 17/2/2015

Không, ngoài việc là một người dùng hài lòng.
Synchro
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.