Chia Sẽ Kinh Nghiệm Về IT



Tìm Kiếm Với Google
-


MySQL Master, Slave, Cluster, Replication.. Database Availability... MySQL Database Replication và Failover

Gởi Ðề Tài Mới  Gửi trả lời
 
Công Cụ Xếp Bài
Tuổi 14-08-2009, 11:02 AM   #1
hoctinhoc
Guest
 
Trả Lời: n/a
Tài liệu MySQL Replication tiếng việt
Tài liệu MySQL Replication tiếng việt
Replication

I. Cách cài dặt Replication
Để cài đặt một môi trường replication cần làm những việc sau:
- Tạo một user có quyền replication trên MySQL Server
- Cấu hình Master MySQL
- Cấu hình Slave MySQL
- Cập nhật cấu hình master trên slave, để slave có thể nhận và kết nối với Master
- Bắt đầu quá trình Replication
Cụ thể như sau:

1. Tạo user có quyền replication (trên master)

mysql> GRANT REPLICATION SLAVE ON *.*
-> TO 'repl'@'%.mydomain.com' IDENTIFIED BY 'slavepass';

2. Cấu hình Master

Cấu hình trong file my.ini (hoặc my.cnf)
[mysqld]
log-bin=mysql-bin
server-id=1
- Khởi tạo binary logging trên Master, nếu không quá trình replication sẽ không có bản ghi nhị phân để thực hiện việc chuyển đổi dữ liệu giữa Master và Slaves
- Đặt Server-id cho các server trong nhóm replication. Server-id của mỗi server phải là duy nhất (không trùng nhau)

3. Cấu hình Slave

Cấu hình trong file my.ini (hoặc my.cnf)
[mysqld]
server-id=2
- Trên các Slave chỉ cần cấu hình Server-id, nếu có nhiều slave, nên đặt ID một các dễ phân biệt, có thể trùng với IP của server chẳng hạn

4. Lấy thông tin replication từ Master

Khi cấu hình replication trên Slave cần xác định được điểm hiện tại của master trong bản ghi nhị phân Master. Dựa vào thông tin này, khi slave bắt đầu quá trình replication, nó có thể bắt đầu quá trình sử lí sự kiện tại thời điểm đúng dựa vào bản ghi nhị phân.
Để lấy thông tin tình trạng Master, cần làm:
mysql> FLUSH TABLES WITH READ LOCK;
Flush tất cả các bảng và ngăn cản những lênh write lên database
mysql > SHOW MASTER STATUS;
+---------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+---------------+----------+--------------+------------------+
| mysql-bin.003 | 73 | test | manual,mysql |
+---------------+----------+--------------+------------------+
Hiển thị tên của log file (mysql-bin.003) và offset (73).
Nếu Master đang chạy mà không khởi tạo bản ghi nhị phân trước đó thì khi show master status, sẽ hiển thị trống, khi đó cấu hình trên slave thì slave’s log và position sẽ là ký tự trắng‘ ’ và 4.

5. Tạo một Data Snapshot sử dụng mysqldump

- Cần lock table trước, hoặc flush tất cả talbe và block tất cả những lênh ghi lên table:
mysql> FLUSH TABLES WITH READ LOCK;
- Tạo một dump cho tất cả những database cần replication hoặc một database riêng lẻ nào đó:
shell> mysqldump --all-databases --lock-all-tables >dbdump.db
- Có thể dùng tùy chọn -- master-data, nó sẽ tự động mở rộng câu lênh CHANGE MASTER được yêu cầu trên Slave để có thể bắt đầu replicate
shell> mysqldump --all-databases --master-data >dbdump.db
- Sau đó cần copy file dump tới Slave hoặc sử dụng file từ trên Master khi kết nối từ xa tới Slave để import data.

6. Tạo Data Snapshot sử dụng file dữ liệu thô (Raw data file)

- Với những database lớn thì đôi khi việc copy dữ liệu thô lại có hiệu quả hơn là sử dụng mysqldump và import file tới từng slave
- Nhưng với những kiểu storage engine có caching hoặc thuật toán phức tạp thì thời gian snapshot và thời gian update thông tin cache và log đôi khi không được cùng lúc, kể cả khi đã read lock. Điều này phụ thuộc vào khả năng phục hồi của storage engine.
- Nếu sử dụng innoDB tables, thì nên sử dụng công cụ InnoDB Hot Backupđể snapshot. Công cụ này ghi lại log name và offset tương ứng để sau sử dụng trên slave. (tool này không free)
- Nếu sử dụng MyISAM table, có thể dùng những tool copy chuẩn như cp hoặc copy, công cụ copy từ xa như là scp hoặc rsync, một công cụ lưu trữ như zip hoặc tar. Hoặc công cụ snapshot file hệ thống như dump
- Để snapshot có hiệu quả, nên shutdown MySQL server trong quá trình xử lí:
o Readlock trước, và lấy master’s status
o Shut down MySQL server:
shell> mysqladmin shutdown
o Copy lại file dữ liệu, có thể dùng một trong những cách sau:
shell> tar cf /tmp/db.tar ./data
shell> zip -r /tmp/db.zip ./data
shell> rsync --recursive ./data /tmp/dbdata
o Khởi động MySQL server
- Nếu sử dụng InnoDB, thi có thể snapshot mà không cần phải shutdown MySQL server

7. Cài đặt Replication trên vơi master và Slaves hoàn toàn mới

- Với Master và những slaves hoàn toàn mới (chưa có dữ liệu) thì sẽ sử dụng cách này. Cũng có thể sử dụng cách để cài đặt trong trường hợp có master mới và có dump dữ liệu mà muốn load lên để replication. Bằng cách load dữ liệu lên trên master mới, rồi sau đó cho replicate với slaves.
- Các bước cài đặt:
o Cấu hình MySQL Master (như phần 2)
o Khởi động MySQL Master
o Khời tạo User có quyền replicate
o Lấy thông tin Master status
o Hủy read lock
mysql> UNLOCK TABLES;
o cấu hình MySQL trên Slave (như phần 3)
o khởi động MySQL Slave
o Chạy lênh CHANGE MASTER để cấu nhận cấu hình Master từ slave
- Nếu cài đặt một môi trường replication sử dụng dữ liệu từ một database server có sẵn thì cần chạy file dump trên Master trước, dữ liệu sẽ tự động được nhân bản xuống các slave

8. Cài đặt Replication với một dữ liệu đã có

- Trước khi replication dữ liệu, cần chọn được cách lấy dữ liệu tốt nhất từ master chuyển tới Slave
- Các bước cài đặt:
o Cấu hình MySQL Master (phần 2)
o Tùy vào trạng thái hiện thời của Master mà dùng Mysqldump đẻ take a snapshot, hoặc snapshot dữ liệu thô (phần 6,7) . Trước đó nên lấy thông tin Master trước. (phần 4)
o Tạo User có quyền replicate
o Cấu hình Slave (phần 3)
o Bước tiếp theo sẽ phụ thuộc vào cách take a snapshot
§ Nếu sử dung mysqldum:
· Khời động Slave, nhưng bỏ qua replication sử dụng tùy chọn –-skip-slave
· Import file dump: shell> mysql < fulldb.dump
§ Nếu snapshot sử dụng dữ liệu thô
· Bung file dữ liệu ra data directory trên slave. Vd: shell> tar xvf dbdump.tar
Ở đây cần quyền ownership trên file này phù hợp với cấu hình trên slave
· Khởi động slave nhưng bỏ qua replication bằng tùy chọn --skip-slave
o Câp nhật thông tin Master trên slave (CHANGE MASTER TO…)
o Bắt đầu slave : mysql> START SLAVE;

9. Thêm Slave vào một môi trường replication đã có

Khi thêm một slave vào, không cần thiết phải stop master mà chỉ cần sao chép cấu hình từ slave cũ sang slave mới.
- Các bước:
o Shutdown slave đang chạy: shell> mysqladmin shutdown
o Copy thư mục dữ liệu từ slave đang chạy sang slave mới. có thể làm việc này bằng cách tạo ra một archive sử dụng tar hoặc win-zip, hoặc dùng ngay cp, rsync. Cần copy cả những file log và file logs và file relay logs,
o Chú ý một lỗi rất hay xảy ra là:
071118 16:44:10 [Warning] Neither --relay-log nor --relay-log-index were used; so
replication may break when this MySQL server acts as a slave and has his hostname
changed!! Please use '--relay-log=new_slave_hostname-relay-bin' to avoid this problem.
071118 16:44:10 [ERROR] FAILED TO OPEN THE RELAY LOG './OLD_SLAVE_HOSTNAME-RELAY-BIN.003525'
(RELAY_LOG_POS 22940879)
071118 16:44:10 [ERROR] COULD NOT FIND TARGET LOG DURING RELAY LOG INITIALIZATION
071118 16:44:10 [ERROR] FAILED TO INITIALIZE THE MASTER INFO STRUCTURE
Lỗi này xảy ra là do –relay-log ở slave mới. Cách giải quyết tôt nhất là copy lại nội dung của relay log trên slave cũ sang slave mới. chú ý trong lúc copy cần stop cả 2 slave này.
o Copy master.inforelay.info files từ Slave cũ sang Slave mới. Những file này chứa vị trí của log
o Khởi động slave
o Cấu hình MySQL slave trên slave mới (phần 3) với một id mới
o Start slave, file master.info được sử dụng để bắt đầu quá trình xử lí replication.

10. Cài đặt cấu hình Master trên Slave:

Mysql> Stop slave;
CHANGE MASTER TO
MASTER_HOST='master.mydomain.com',
MASTER_USER='repl',
MASTER_PASSWORD='slavepass',
MASTER_LOG_FILE='recorded_log_file_name', #lay gia tri trong cau hinh da ghi lai
MASTER_LOG_POS=recorded_log_position; #lay gia tri trong cau hinh da ghi lai
#truoc khi replication thi log=""; post=4;

11. Thực hiện Replicate:

- Tại Master: Unlock table
Mysql> Unlock tables;
- Tại Slave
Mysql> Start slave;

II. Những giải pháp Replication

1. Replication dùng để backup dữ liệu

Chủ yếu dùng Mysqldump (đối với dữ liệu nhỏ), hoặc copy dữ liêu thô (đối với dữ liệu lớn)

2. Replication giữa Master và slaves dùng những kiểu storage engine khác nhau

Quá trinh replication không để ý đến việc các storage engine dùng cho các table ở Master và Slave khác nhau hay không, vì các biến hệ thống storage_enginetable_typekhông được replicated. Điều này cũng thuận lợi cho nhu cầu sử dụng database tai mội Server, ta có thể để Master là InnoDB để nó có thể tận dụng chức năng transaction, còn slave thì để MyISAM để nó chỉ hỗ trợ read, còn transaction thì không cần thiết, mà vẫn replication được
Ta cũng có thể convert kiêu storage engine ở các table sang loại khác, sử dụng:
ALTER TABLE ... Engine='enginetype

3. Replication tăng tốc truy cập sử dụng database từ client vào hệ thống database

Khi đã được replicate, việc truy vấn tới database sẽ có thể được chia sẻ theo chức năng và mục đích. VD: những truy vấn Read sẽ được gửi tới Slave, còn write được gửi tới Master. sẽ được gửi tới Slave, còn write được gửi tới Master.

4. Replication các Databases khác nhau đến các Slaves khác nhau

Khi có một Master và nhiều slaves. Sẽ có nhu cầu replicate các database khác nhau trên Master tới các slave khác nhau, mỗi database (hoặc table) sẽ được replication với một slave. VD:

Có một vài cách sau để thực hiện:
§ Đồng bộ tất cả dữ liệu tới Slave, sau đó database nào không cần thi xóa đi, giữ lại những Database cần thiết (cách này cùn quá ^ ^)
§ Sử dụng Mysqldump để tạo ra những file dump (hoặc copy dữ liệu thô) chỉ chứa database hoặc table cần thiết cho mỗi slave tương ứng.
§ Cấu hình giới hạn những câu lệnh trong Binary log, mà mỗi slave sẽ xử lí khi replicate chỉ là những database hoặc table cần thiết bằng lệnh: replicate-wild-do-table trên mỗi Slave:
· MySQL Slave 1cần replicate những bảng sale, finance trong databaseA cần cấu hình:
replicate-wild-do-table=sales.%
replicate-wild-do-table=finance.%
· MySQL Slave 2 cần replicate những bảng support trong databaseB, cần được cấu hình:
replicate-wild-do-table=support.%
· MySQL Slave 3 cần replicate những bảng service trong databaseC, cần được cấu hình:
replicate-wild-do-table=service.%
§ Trong trường hợp cần loại bỏ một số database, table khỏi quá trình replication:
replicate-ignore-table=table1
replicate-ignore-db=database2.%

5. Cải thiện quy trình replication

Khi một số lượng lớn slaves kết nối với 1 Master, kể cả lưu lượng không lớn nhưng khi tạo kết nối từ từng slave đến server và nhận bản full copy file master binary log, tải mạng ở Master sẽ tăng rất cao và có thể gây ra hiện tượng thắt cổ chai, công với việc khi Master phải đáp ứng nhiều request cùng lúc nữa thì sẽ không ổn.
Có cách để cải thiện vấn đề này là tạo một cấu trúc replication sâu hơn: Master sẽ replicate với một Slave, còn những slave khác sẽ kết nối đến Primary Slave kia để replicate theo yêu cầu:

Để có được như vậy cần cấu hình:
§ Master 1 sẽ là nơi thay đổi, cập nhật và viết lên database. Binary log được khởi tạo
§ Master 2 là Slave của Master 1, và nó là server duy nhất kết nối đến Master 1. ở đây có khởi tạo binary log, và tùy chọn -log-slave-updates để cấu trúc replication từ Master 1 được ghi vào binary log ở Master 2 giúp nó có thể trở thành Master và replicate được với những slaves còn lại.
§ Slave1, 2 3 sẽ cấu hình nhận Master 2 làm master

6. Chuyển đổi Master trong trường hợp lỗi xảy ra

Trong trường hợp Master bị lỗi, cách khắc phục tốt nhất là dựng một slave lên làm master thay thế, vừa có chức năng đáp ứng các requests vừa replication với các slaves còn lại. Việc này chỉ có hiệu quả khi viết một Script đảm bảo được:
§ Theo dõi tình trạng hoạt động của Master
§ Nếu Master fail, một Slave sẽ được chuyển thành Master thay thế
§ Chuyển đổi các ứng dụng và slave với Master mới

VD: một cấu trúc replication:
Khi Master fail, vấn đề đặt ra là chuyển Slave1 thành Master, cấu hình lại cấu trúc replicate với master mới:
§ Khởi tạo sẵn --log-bin-log-slave-updatestrên Slave1
§ Khi Master Unavailable Chắc chắn tất cả các slaves đã xử lí xong những câu lênh trong relay log, trên từng slave, STOP SLAVE IO_THREAD, sau đó kiểm tra SHOW PROCESSLISTcho đến khi thấyHas read all relay log.Lúc này các slaves mới sẵn sàng cho cấu hình mới
§ Thăng chức Slave1 lên Master: STOP SLAVERESETMASTER.
§ Trên các slaves: STOP SLAVE CHANGE MASTER TO MASTER_HOST='Slave1'.
Không cần thiết phải viết binlog và vị trí, vì nó là lần đầu ghi lên binlog nên nó mang gia trị mặc định (binlog = ‘ ’ và position = 4)
§ Trên slave2 và slave3: START SLAVE

Sau khi cấu hình cấu trúc replication sẽ bị thay đổi như sau:
Trong trường hợp khắc phục xong Master ban đầu và muốn thay thế lại giống cấu trúc đầu thì ta lại tạo quá trình xử lí tình huống, Slave1 bị fail và dựng master cũ lên làm Master mới thay thế. Cần nhớ RESET MASTER để các slaves nhận master mới.

7. Cài đặt replication sử dụng SSL

Khi sử dụng SSL trong replication, chính là việc dùng một Security certificate để chứng thực giữa Master và Slave. Đồng thời các Bin log sẽ được mã hóa trong quá trình đồng bộ.

Cần cấu hình:
§ Master cần hỗ trợ kết nối mạng SSL
§ Trên Master, khởi tạo Certificate và thêm cấu hình này vào file cấu hình của Master bên trong mysqld:
ssl-ca=cacert.pem
ssl-cert=server-cert.pem
ssl-key=server-key.pem
§ Trên Slave có thể dùng một trong 2 cách:
· Cũng tạo certificate đó trong file cấu hình của Slave:
ssl-ca=cacert.pem
ssl-cert=server-cert.pem
ssl-key=server-key.pem
· Cấu hình certificate trong lệnh CHANGE MASTER:
CHANGE MASTER TO \
MASTER_HOST='master_hostname', \
MASTER_USER='replicate', \
MASTER_PASSWORD='password', \
MASTER_SSL=1, \
MASTER_SSL_CA = 'ca_file_name', \
MASTER_SSL_CAPATH = 'ca_directory_name', \
MASTER_SSL_CERT = 'cert_file_name', \
MASTER_SSL_KEY = 'key_file_name';
§ Khởi động quá trình replication:
mysql> START SLAVE;
III. Replication FAQ

1. Slave có cần thiết phải kết nối với Master liên tục không?

Không cần thiết. Slave có thể tự kết nối và cập nhật với Master sau khi kết nối lại. Chỉ cần không xóa binlog khỏi Master, vì nếu không có, Slave sẽ không có thông tin để cập nhật

2. Làm thế nào để biết được Slave trễ so với master là bao lâu (lênh cuối cuối được replicatie với slave là lúc nào?)

Dùng lệnh SHOW SLAVE STATUSquan sát cột Seconds_Behind_Master (thời gian được tính bằng giây)

3. Làm thế nào để áp master block lại những update cho đến khi slaves theo kịp

Trên master:
mysql> FLUSH TABLES WITH READ LOCK;
mysql> SHOW MASTER STATUS;
Ghi lại thời điểm replicate (bao gồm tên file và offset)từ kết quả của lênh Show
Trên Slave:
mysql> SELECT MASTER_POS_WAIT('log_name', log_offset);
Thời điểm bắt đầu được replicate sẽ được slave xác định, và chuẩn bị cho replicate (dựa vào kết quả ở bước làm trên master)
Trên master:
mysql> UNLOCK TABLES;
Cho phép Master bắt đâu lại quá trình update

4. Những điều cần lưu ý khi cấu hình replication theo 2 hướng

Không nên cấu hình một Slave nhận replication từ 2 Masters.Những bản update từ 2 Master khác nhau chưa chắc đã giống nhau, điều này có thể làm cho dữ liệu và bản update không được an toàn

5. Làm sao để sử dụng Replication tăng hiệu quả hoạt động của hệ thống

Nên sử cài đặt một Master, và cho các lênh write trỏ vào nó. Lệnh Read sẽ được phân chia giữa Master và Slaves.
Hoặc chúng ta cũng có thể Start Slaves với --skip-innodb,--low-priority-updates, --delay-key-write=ALLđể tăng tốc trên Slave cuối, vì nó không sử dụng Transaction bởi innoDB nữa mà sẽ là non-transaction MyISAM.

6. Replication có thể tăng tốc được bao nhiêu và khi nào cho hiệu năng hệ thống?

Để có thể quyết định được cần sử dụng được bao nhiêu slaves cần dùng trong replication, ta cần biết được nhu cầu Reads, Write lên database, sau đó benchmark mối quan hệ giữa Read and write trên một master và một slaves,
(Có ví dụ như sau:
Let's say that system load consists of 10% writes and 90% reads, and we have determined by benchmarking that reads is 1200 – 2× writes. In other words, the system can do 1,200 reads per second with no writes, the average write is twice as slow as the averageread, and the relationship is linear. Let us suppose that the master and each slave have the same capacity, and that we have one
master and N slaves. Then we have for each server (master or slave):
reads = 1200 – 2 × writes
reads = 9 × writes / (N + 1) (reads are split, but writes go to all servers)
9 × writes / (N + 1) + 2 × writes = 1200
writes = 1200 / (2 + 9/(N+1))
The last equation indicates the maximum number of writes for N slaves, given a maximum possible read rate of 1,200 per minuteand a ratio of nine reads per write.
This analysis yields the following conclusions:
• If N = 0 (which means we have no replication), our system can handle about 1200/11 = 109 writes per second.
• If N = 1, we get up to 184 writes per second.
• If N = 8, we get up to 400 writes per second.
• If N = 17, we get up to 480 writes per second.
• Eventually, as N approaches infinity (and our budget negative infinity), we can get very close to 600 writes per second, increasing
system throughput about 5.5 times. However, with only eight servers, we increase it nearly four times.)

7. Replication có thể hoạt động trên Mix mode

có thể bao gồm nhiều loại hệ điều hành, và nhièu kết cấu phần cứng khác nhau



8. Chu trình viết script cho quá trình Master Failover

( Master
o Show master status: => nếu pos = 0 => fail; (binlog không có hoặc bị lỗi)
o Show master status: => nếu pos # 0 => không fail; )

- Slaves:

Dùng lệnh show slave status với tất cả các slave:
Show slave status: => Slave_IO_State = reconnecting after a failed master event read
§ Kết quả như trên chỉ ở một số máy => gửi report đến admin => check slaves này
§ Kết quả như trên ở tất cả slaves => Master fail
- Master Fail:

o Dựng slave 1 lên làm Master:
§ Khởi tạo sẵn --log-bin-log-slave-updatestrên Slave1
§ Thăng chức Slave1 lên Master: STOP SLAVERESETMASTER.

o Chuyển kết nối sang Master mới với các Slaves

§ Khi Master Unavailable Chắc chắn tất cả các slaves đã xử lí xong những câu lênh trong relay log, trên từng slave, STOP SLAVE IO_THREAD, sau đó kiểm tra SHOW PROCESSLISTcho đến khi thấyHas read all relay log.Lúc này các slaves mới sẵn sàng cho cấu hình mới
§ Trên các slaves: STOP SLAVE CHANGE MASTER TO MASTER_HOST='Slave1'.
Không cần thiết phải viết binlog và vị trí, vì nó là lần đầu ghi lên binlog nên nó mang gia trị mặc định (binlog = ‘ ’ và position = 4)
§ Trên Slaves: START SLAVE



Theo: Hackingart


  Trả lời ngay kèm theo trích dẫn này
Gửi trả lời



Quyền Hạn Của Bạn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Hình Cảm xúc đang Mở
[IMG] đang Mở
Mã HTML đang Tắt




Bây giờ là 12:05 AM. Giờ GMT +7



Diễn đàn tin học QuantriNet
quantrinet.com | quantrimang.co.cc
Founded by Trương Văn Phương | Developed by QuantriNet's members.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.