3.1.1.Giới thiệu về mysql proxy
MySQL Proxy là một ứng dụng giao tiếp qua mạng sử dụng giao thức mạng MySQL và cung cấp thông tin liên lạc giữa một hoặc nhiều MySQL server và một hoặc nhiều client.
Trong cấu hình cơ bản nhất, MySQL Proxy chỉ đơn giản là đặt nó giữa client và server, chuyển các truy vấn từ client đến MySQL server và trả lại những phản hồi từ MySQL server cho client thích hợp. Ngoài ra, MySQL Proxy cũng có khả năng giám sát và thay đổi các thông tin liên lạc giữa client và server bằng cách sử dụng ngôn ngữ kịch bản Lua. Bằng cách chặn các truy vấn từ client, MySQL proxy có thể sửa thông tin cho cá truy vấn đề phù hợp với định dạng mà nó sử dụng. MySQL Proxy có thể bổ sung hay loại bỏ những thông tin không cần thiết, sau đó đặt truy vấn vào danh sách các truy vấn để gửi đến các server. Khi các server trả kết quả về cho client, MySQL Proxy sẽ lấy các kết quả này lại, loại bỏ hay bổ sung các thông tin mà các truy vấn tƣơng ứng với kết quả đó đã đƣợc bổ sung hay loại bỏ thông tin trƣớc khi gửi lên server, để trả lại kết quả cho client. Vì vậy, các client không biết đƣợc sự có mặt của MySQL Proxy.
Một chức năng quan trọng của MySQL Proxy là nó đọc các truy vấn từ client gửi đến và lọc ra các truy vấn đọc để gửi đến các slave, lọc ra các truy vấn ghi để gửi đến master. Nếu có nhiều server thì mặc định MySQL Proxy sẽ sử dụng giải thuật roun- robin để chuyển các truy vấn đến các server này.
Khi chỉ định nhiều server theo cách này thì MySQL Proxy tự động xác định các server đang rỗi hay bận. Nếu server bận thì nó sẽ chỉ định server khác để thay thế [25].
MySQL Proxy có thể chạy trên nhiều nên tảng khác nhau nhƣ:
Linux (bao gồm Red Hat, Fedora, Debian, OpenSuSe, Ubuntu) Mac OS X
FreeBSD IBM AIX
34 Sun Solaris
Microsoft Windows (bao gồm: Microsoft Windows XP, Microsoft Windows Vista, Microsoft Windows 2007, Microsoft Windows Server 2003, Microsoft Windows Server 2008)
3.1.2.Giới thiệu về ngôn ngữ kịch bản Lua
Lua là một ngôn ngữ lập trình thông dịch với đặc điểm nhỏ gọn, thƣờng đƣợc dùng để viết các file cấu hình trong những phần mềm lớn.
Lua có một số ƣu điểm nổi bật sau
- Tính mở rộng: Ngƣời ta không chỉ quan tâm đến Lua nhƣ một ngôn ngữ mà còn là một công cụ để xây dựng một ngôn ngữ. Lua dễ dàng giao tiếp với ngôn ngữ C/C++ và những ngôn ngữ khác nhƣ Fortran, Java, Smalltalk, Ada, và thậm chí với những ngôn ngữ scripting khác.
- Tính đơn giản: Lua là một ngôn ngữ đơn giản và nhỏ. Nó có rất ít các khái niệm, kiểu dữ liệu nhƣng lại rất mạnh. Lua rất dễ học và dễ tích hợp vào những chƣơng trình lớn.
- Tính hiệu quả: chƣơng trình đƣợc viết bằng Lua thực thi khá nhanh, nó đƣợc đánh giá là một trong những ngôn ngữ nhanh nhất trong những ngôn ngữ kịch bản.
- Tính khả chuyển: Lua không chỉ chạy tốt trên Windows và Unix mà nó còn chạy tốt trên mọi platforms nhƣ NextStep, OS/2, …
- Tính đa dạng thức: Lua có cấu trúc đa dạng nhƣng giải quyết đƣợc nhiều vấn đề phức tạp khác nhau. Lua không có tính kế thừa nhƣng cho phép tạo ra mối quan hệ đó đối với metatable.
- Thư viện dễ thay đổi: Lua có thể mở rộng các kiểu dữ liệu và các hàm của thƣ viện.
- Tính tích hợp: sử dụng Lua để tích hợp vào các chƣơng trình ứng dụng của mình [26].
35
3.1.3.Nguyên lý hoạt động của MySQL Proxy với ngôn ngữ kịch bản Lua [25]
Sự tƣơng tác chính giữa Proxy MySQL và MySQL server đƣợc cung cấp bởi việc xác định một hoặc nhiều hàm trong ngôn ngữ kịch bản Lua. Một số hàm đƣợc hỗ trợ cho các sự kiện khác nhau và các hoạt động khác nhau trong thứ tự giao tiếp giữa client và một hoặc nhiều MySQL server:
connect_server() : Hàm này đƣợc gọi mỗi khi có một kết nối đến MySQL Proxy từ một client. MySQL Proxy sử dụng chức năng này trong quá trình cân bằng tải để chặn các kết nối từ một client và quyết định máy chủ nào sẽ giao tiếp với client đó. Nếu không xác định một giải pháp đặc biệt, thì MySQL Proxy mặc định sẽ phân phối các truy vấn theo giải thuật round-robin.
read_handshake (): Hàm này đƣợc gọi là khi những thông tin bắt tay đầu tiên đƣợc trả về bởi server. Proxy có thể nắm bắt những thông tin bắt tay đƣợc trả lại này và kiểm tra, bổ sung trƣớc khi trao đổi diễn ra.
read_auth (): Hàm này đƣợc gọi khi các gói tin xác nhận (tên ngƣời dùng, mật khẩu, cơ sở dữ liệu mặc định) của client gửi đến server để xác thực.
read_auth_result (): Hàm này đƣợc gọi là khi server trả về một gói tin xác nhận cho client nêu rõ việc xác thực đã thành công.
read_query (): Hàm này đƣợc gọi mỗi lần truy vấn đƣợc gửi bởi client đến server. Proxy có thể chỉnh sửa và thao tác truy vấn gốc, bao gồm thêm các câu truy vấn mới trƣớc và sau câu lệnh gốc. Ngoài ra cũng có thể sử dụng hàm này để trả về thông tin trực tiếp đến client. Sử dụng hàm này, proxy có thể lọc các truy vấn không mong muốn hoặc các truy vấn vƣợt quá giới hạn đƣợc biết đến.
read_query_result (): Hàm này đƣợc gọi là mỗi khi một kết quả đƣợc trả về từ server, proxy tự động xen các truy vấn vào hàng đợi truy vấn. Proxy thể chỉnh sửa các tập hợp kết quả, hoặc để loại bỏ hoặc chọn lọc các bộ kết quả.
36
Hình 13: Các thủ tục cần thực hiện khi client gửi một truy vấn đến server qua MySQL Proxy
1. Khi client gửi một kết nối đến server, MySQL Proxy gọi hàm
connect_server() để gửi yêu cầu kết nối này đến server. Server nhận đƣợc yêu cầu kết nối của client sẽ gửi lại thông điệp là nó có chấp nhận yêu cầu này hay không. Nếu server không chấp nhận thì client ngừng kết nối, nếu server chấp nhận thì thực hiện bƣớc thứ hai
2. Client gửi truy vấn đến server. MySQL Proxy sử dụng hàm read_query()
để đọc truy vấn này, nó xác định đây là loại truy vấn nào để gửi đến server thích hợp.
3. Sau khi server chấp nhận truy vấn từ client, server gửi kết quả lại cho client. Kết quả này đi qua MySQL Proxy, MySQP Proxy đọc kết quả bằng cách sử dụng hàm read_query_result() và trả về kết quả này cho client.
Cấu trúc nội bộ
Ngoài các hàm trên, một số cấu trúc đƣợc xây dựng cung cấp việc kiểm soát của MySQL Proxy để chuyển các truy vấn và trả về các kết quả bằng cách cung cấp một giao diện đơn giản hóa các yếu tố nhƣ danh sách các truy vấn và nhóm các tập kết quả đƣợc trả về.
37
3.2.GIỚI THIỆU VỀ GIẢI PHÁP REPLICATION TRONG HỆ QUẢN TRỊ CSDL MYSQL MYSQL
Replication đƣợc sử dụng để sao lƣu tất cả các câu lệnh thực thi hoặc tập dữ liệu thay đổi đƣợc tạo ra trên một máy chủ (đƣợc gọi là master server hay ngắn gọn là master) đến các server khác, các server này đƣợc gọi là slave server (hay ngắn gọn là slave).
Đối với MySQLD thì một slave có duy nhất một master. Tuy nhiên, một master có thể có nhiều slave. Thêm vào đó, một master có thể là một slave của một master khác. Điều này phụ thuộc vào các mô hình replication đƣợc xắp đặt nhƣ thế nào.
Trong MySQL, quá trình tạo bản sao là quá trình một chiều và không đồng bộ. Bởi vì quá trình đồng bộ dữ liệu không xảy ra trong thời gian thực. Khi có sự thay đổi dữ liệu trên master thì master ghi các sự kiện vào file Binary log, và lập tức gửi file Binary log đến slave để đồng bộ dữ liệu với slave. Master không quan tâm đến trạng thái của bất kỳ slave nào, nó không biết đƣợc slave đã đƣợc đồng bộ dữ liệu hay chƣa. Điều này làm giảm đƣợc độ trễn giữa master và các slave do không cần mất thời gian các slave biên nhận việc đồng bộ dữ liệu trên chúng đã thành công hay chƣa gửi đến master.
3.2.1.Một số file log đƣợc sử dụng trong MySQLD Binary log
Binary log là một file log đƣợc MySQLD sử dụng trong máy chủ master để ghi lại những thay đổi và những câu lệnh làm thay đổi cơ sở dữ liệu, từ đó có thể sử dụng nó để phục hồi cơ sở dữ liệu. Nội dung của binary log chứa bất kỳ các câu lệnh nào mà xảy ra trong khi máy chủ đang sửa chữa cơ sở dữ liệu: CREATE, INSERT, UPDATE, DROP, DELETE. Các câu lệnh không làm thay đổi cơ sở dữ liệu nhƣ câu lệnh SELECT thì không đƣợc ghi vào file Binary log. Tuy nhiên, một câu lệnh không làm thay đổi cơ sở dữ liệu sẽ đƣợc ghi vào Binary log, nếu nó là một phần của giao dịch nhƣ giao dịch sửa dữ liệu, bởi vì giao dịch sẽ đƣợc ghi vào file Binary log.
Để kích hoạt binary log, sử dụng tùy chọn : log-bin. File binary-log-index là một file text đơn giản mà theo giõi các file Binary log hiện hành. Mặc định, nó có tên là
mysql-bin.index. Để thiết lập tên file và đƣờng dẫn của binary log và binary log index
file, làm theo tùy chọn sau:
38
# log-bin-index - /data/logs/relay/binarylog.index
Dữ liệu của binary log đƣợc chứa trong định dạng nhị phân. Do vậy, không thể mở file với một trình soạn thảo văn bản và đọc nó. Để hiển thị binary log trong định dạng văn bản hoặc có khả năng đọc đƣợc thì bạn phải sử dụng công cụ mysqlbinlog.Thao tác của công cụ mysqlbinlog khá đơn giản.
Trong ví dụ dƣới đây, nội dung ghi trong binary log: mysql-bin.00001 đƣợc chuyển sang định dạng văn bản và sao chép trong file mới là output.sql:
# mysqlbinlog mysql-bin.00001 > output.sql
Nếu để là > output.sql thì nội dung sẽ đƣợc gửi đến giao diện điều khiển.
Relay log
Relay log đƣợc sử dụng bởi slave để sao lƣu các sự kiện nhận đƣợc từ máy chủ master trƣớc khi thực thi trên máy chủ slave. Chúng dùng định dạng nhị phân giống nhƣ file Binary log và chúng có thể đƣợc hiển thị nhờ việc sử dụng công cụ mysqlbinlog. Mặc định một máy chủ slave lƣu trữ relay logs trong datadir. Ngoài file Relay log, trên máy chủ slave còn có file relay-log.index, và relay-log.info. Relay-log.index đƣợc sử dụng để theo dõi các relay log đang đƣợc sử dụng hiện hành. Relay-log.info ngoài việc cung cấp tài liệu về việc sử dụng file log hiện hành, nó còn cung cấp vị trí của nó, và vị trí của file
Binary log trong master.
3.2.2.Các mô hình replication:
Mô hình replication đề cập đến những cách khác nhau kết nối các máy sử dụng replication.
39
Mô hình đơn giản: master – slave
Hình 14: Mô hình replication đơn giản master – slave trong MySQL
Mô hình master – salve bao gồm một master và một slave. Tất cả những thay đổi về cơ sở dữ liệu trên master đƣợc gửi đến slave để đồng bộ dữ liệu. Khi client truy suất đến cơ sở dữ liệu, với những truy vấn ghi thì master sẽ đảm nhận, tất cả các truy vấn đọc sẽ đƣợc slave trả lời. MySQL proxy chịu trách nhiệm lọc các truy vấn ghi hay đọc để gửi đến master hay slave.
Mô hình master – multi slave
Hình 15: Mô hình replication master – multi slave trong MySQL
Mô hình master – multi slave là mô hình mà một master kết nối với nhiều slave. Khác với mô hình master – slave thì mô hình này master không chỉ đồng bộ dữ liệu với
40
một slave mà master phải gửi tất cả những dữ liệu thay đổi trên nó đến toàn bộ slave. Các slave đƣợc phân biệt với nhau bằng các server-id duy nhất (server-id là một số nguyên, mỗi slave có duy nhất một server-id). server-id đƣợc chỉ định trong file cấu hình của MySQLD. Trong mô hình này thì master sẽ trả lời tất cả các truy vấn ghi từ client và các truy vấn đọc sẽ đƣợc MySQL Proxy gửi đều đến tất cả slave.
Mô hình master – relay server
Hình 16: Mô hình master – relay slave trong MySQL
Trong hai mô hình trên, master vừa đảm nhận công việc là trả lời các truy vấn ghi từ client vừa phải ghi các sự kiện vào file Binary log để đồng bộ dữ liệu đến các slave. Khi số lƣợng truy cập của client lớn, nhu cầu thêm các slave là cần thiết để đáp ứng đƣợc tất cả các truy vấn của client. Nhƣng điều này cũng làm tăng công việc của master lên rất nhiều. Để giảm tải công việc cho master thì một relay slave đƣợc sử dụng. relay slave không chịu trách nhiệm trả lời các truy vấn từ client. Khi có sự thay đổi về cơ sở dữ liệu trên master, thay vì master phải đồng bộ đến tất cả slave thì master chỉ gửi file Binary log đến relay server. Công việc đồng bộ dữ liệu cho các slave bây giờ đƣợc giao cho relay server. Ngoài nhiệm vụ đồng bộ dữ liệu, relay slave đƣợc coi nhƣ một máy chủ hot- standby – máy chủ chờ nóng. Điều này có nghĩa là, khi master gặp sự cố, không thể tiếp tục hoạt động thì relay slave đƣợc MySQL proxy chỉ định ngay tức khắc thay thế cho master. Lúc này, relay slave đƣợc coi nhƣ là master mới. Tất cả các truy vấn ghi từ client đƣợc MySQL proxy gửi đến master mới này. Sau khi master cũ khắc phục đƣợc sự cố, nó tiếp tục hoạt động với vai trò của mình và relay slave quay về vị trí là hot-standby.
41
Mô hình master – master
Hình 17: Mô hình replication master – master trong MySQL
Mô hình này có hai master, server A vừa là master của server và đồng thời cũng là slave của server B, tƣơng tự cho server B. Cả hai máy chủ A và B nhận cả các truy vấn đọc và truy vấn ghi. Cả hai máy chủ có khả năng nhận đồng thời các truy vấn INSERT một hàng vào một bảng với một trƣờng là auto-increment. Điều này thực hiện đƣợc là do cả hai máy chủ A và B đều đƣợc cấu hình với:
auto_increment_increment = integer auto_increment_offset = integer
Giá trị của auto_increment_increment xác định khoảng tăng giữa các giá trị auto_increment và nên giống nhau ở mỗi máy chủ. Giá trị này ít nhất phải là số máy chủ trong mạng vòng – nếu mạng vòng có 2 máy chủ thì giá trị của auto_increment_increment nhỏ nhất là 2. Giá trị của auto_increment_offset nên khác nhau giữa các máy chủ.
Ví dụ: thiết lập giá trị của auto_increment cho hai máy chủ A và B nhƣ sau:
# Server A
auto_increment_increment = 10 auto_increment_offset = 1 # Server B
42
auto_increment_offset = 2
Trong ví dụ này thì khoảng tăng là 10, câu lệnh INSERT đầu tiên đến một bảng sẽ bắt đầu với giá trị 1 tại máy chủ A, tại máy chủ B sẽ có giá trị là 2 trong lệnh INSERT tiếp theo. Câu lệnh tiếp theo có giá trị là 11 tại máy chủ A và 12 tại máy chủ B.
Mô hình master-master có khả năng chuyển đổi dự phòng cao. Nếu máy chủ A bị lỗi thì máy chủ B sẽ thay thế ngay lập tức, do vậy tính sẵn sàng của mô hình này rất cao. Tuy nhiên, do cả hai máy chủ đều thực thi tất cả các câu lệnh ghi nên hiệu suất không cao [6].
3.3.GIỚI THIỆU VỀ CÔNG CỤ MYSQLSLAP
mysqlslap là công cụ trong mysql-client đƣợc thiết kế để giả lập các client nhằm kiểm tra tải cho máy chủ MySQL, đồng thời báo cáo thời gian máy chủ MySQL trả về kết quả truy vấn cho client.
mysqlslap chạy trong ba giai đoạn:
Giai đoạn 1: tạo lƣợc đồ, bảng và tùy chọn bất kỳ các chƣơng trình lƣu trữ hoặc dữ
liệu để sử dụng cho việc kiểm tra. Trong giai đoạn này chỉ sử dụng kết nối từ một client.
Giai đoạn 2: Chạy kiểm tra tải. Giai đoạn này có thể sử dụng nhiều client để kết
nối.
Giai đoạn 3: Làm sạch (ngắt kết nối từ client, xóa dữ liệu, bảng và lƣợc đồ nếu
đƣợc chỉ định). Trong giai đoạn này cũng chỉ sử dụng một client để kết nối.