4.3.1.Client gửi truy vấn trực tiếp đến máy chủ MySQL
Trong mô hình thực nghiệm này, chỉ có duy nhất một MySQL server. Client trực tiếp gửi truy vấn đến server. Lần lƣợt tăng số truy vấn và số client kết nối đến server, thu đƣợc kết quả nhƣ sau:
56
Bảng 2: Kết quả thời gian chạy các truy vấn trong mô hình chỉ có một MySQL server
--number-of-queries --concurrency Average number of seconds to run queries
100 100 5
600 600 35.710
1400 700 45.252
1600 800 Quá tải
b) Hiệu năng của máy
Hình 200: Hiệu năng của server trong mô hình chỉ có duy nhất MySQL server
4.3.2.Mô hình MySQL Proxy – một master – một slave
Mô hình này bao gồm một giải pháp replication với một master và một slave. Máy chủ master có địa chỉ IP và cổng là 10.10.17.40:3306.
Máy chủ slave có địa chỉ IP và công là: 10.10.17.5:3306
MySQL Proxy có địa chỉ IP là 10.10.17.100, lắng nghe trên cổng 4040.
Sử dụng máy có địa chỉ IP là 10.10.17.40 làm client để kết nối đến các máy chủ.
57
Giai đoạn 1 của quá trình công cụ mysqlslap chạy:
Tự động sinh ra lƣợc đồ “mysqlslap”,
Bảng “t1” với ba trƣờng là: id serial, intcol1 INT(32),charcol1 VARCHAR(128) Sinh dữ liệu ngẫu nhiên và chèn vào bảng t1
Toàn bộ các truy vấn từ client gửi đến đƣợc MySQL Proxy gửi về master:
sending to backend : 10.10.17.40:3306 is_slave : false # mysql-proxy --admin-username=root \ > --admin-password=giang \ > --admin-address=10.10.17.100:4041 \ > --proxy- address=10.10.17.100:4040\ > --proxy-backend-addresses=10.10.17.40:3306 \ > --proxy-read-only-backend-addresses=10.10.17.5:3306 \ > --admin-lua-script=/home/giangvit/workspace/proxy/admin-script.lua \ > --proxy-lua-script=/home/giangvit/workspace/mysqlProxy/rw4.lua
2012-05-15 16:47:32: [global] (*) mysql-proxy 0.9.0 started [connect_server] 10.10.17.40:36443 [1].connected_clients = 0 [1].pool.cur_idle = 0 [1].pool.max_idle = 1000000 [1].pool.min_idle = 1 [1].type = 1 [1].state = 0
[1] idle-conns below min-idle [read_query] 10.10.17.40:36443
58 current backend = 0
client default db = client username = root
query = DROP SCHEMA IF EXISTS `mysqlslap` sending to backend : 10.10.17.40:3306
is_slave : false server default db: server username : root in_trans : false in_calc_found : false COM_QUERY : true [read_query] 10.10.17.40:36443 current backend = 0 client default db = client username = root
query = CREATE SCHEMA `mysqlslap` sending to backend : 10.10.17.40:3306 is_slave : false
server default db: server username : root in_trans : false
in_calc_found : false COM_QUERY : true
[read_query] 10.10.17.40:36443 current backend = 0
59 client default db =
client username = root
sending to backend : 10.10.17.40:3306 is_slave : false
server default db: server username : root in_trans : false
in_calc_found : false COM_QUERY : false
[read_query] 10.10.17.40:36443 current backend = 0
client default db = mysqlslap client username = root
query = CREATE TABLE `t1` (id serial,intcol1 INT(32),charcol1 VARCHAR(128)) sending to backend : 10.10.17.40:3306
is_slave : false
server default db: mysqlslap server username : root in_trans : false
in_calc_found : false COM_QUERY : true
[read_query] 10.10.17.40:36443 current backend = 0
client default db = mysqlslap client username = root
60 query = INSERT INTO t1 VALUES
(NULL,1804289383,'mxvtvmC9127qJNm06sGB8R92q2j7vTiiITRDGXM9ZLzkdekb WtmXKwZ2qG1llkRw5m9DHOFilEREk3q7oce8O3BEJC0woJsm6uzFAEynLH2xCsw 1KQ1lT4zg9rdxBL')
sending to backend : 10.10.17.40:3306 is_slave : false
server default db: mysqlslap server username : root in_trans : false
in_calc_found : false COM_QUERY : true
(read_query_result) staying on the same backend in_trans : false
in_calc_found : false have_insert_id : true
61
Giai đoạn 2 của chạy công cụ mysqlslap: tự động sinh ra các truy vấn đọc:
query = SELECT intcol1,charcol1 FROM t1
để kiểm tra tải của hai máy chủ master và slave. Toàn bộ các truy vấn này đƣợc gửi về slave:
sending to backend : 10.10.17.5:3306 is_slave : true
[read_query] 10.10.17.40:36471 current backend = 0
client default db = mysqlslap client username = root
query = SELECT intcol1,charcol1 FROM t1 sending to backend : 10.10.17.5:3306
is_slave : true
server default db: mysqlslap server username : root in_trans : false
in_calc_found : false COM_QUERY : true
[read_query] 10.10.17.40:36471 current backend = 0
client default db = mysqlslap client username = root
(QUIT) current backend = 0
[disconnect_client] 10.10.17.40:36471 [read_query] 10.10.17.40:36472
62 current backend = 0
client default db = mysqlslap client username = root
query = SELECT intcol1,charcol1 FROM t1 sending to backend : 10.10.17.5:3306
is_slave : true
server default db: mysqlslap server username : root in_trans : false
in_calc_found : false COM_QUERY : true
[read_query] 10.10.17.40:36472 current backend = 0
client default db = mysqlslap client username = root
(QUIT) current backend = 0
63
Giai đoạn 3 của quá trình chạy công cụ mysqlslap:
mysqlslap làm sạch quá trình kiểm tra bằng việc xóa dữ liệu và lƣợc đồ đƣợc tạo ra ở giai đoạn 1 để không làm ảnh hƣởng đến cơ sở dữ liệu sẵn có của máy chủ:
query = DROP SCHEMA IF EXISTS `mysqlslap` sending to backend : 10.10.17.40:3306
is_slave : false
Truy vấn này đƣợc gửi về master.
Đồng thời mysqlslap ngắt kết nối đến máy chủ. [read_query] 10.10.17.40:47303
current backend = 0
client default db = mysqlslap client username = root
(QUIT) current backend = 0 [read_query] 10.10.17.40:40536 current backend = 0
client default db = mysqlslap client username = root
query = DROP SCHEMA IF EXISTS `mysqlslap` sending to backend : 10.10.17.40:3306
is_slave : false
server default db: mysqlslap server username : root in_trans : false
in_calc_found : false COM_QUERY : true
64 [disconnect_client] 10.10.17.40:47303
[read_query] 10.10.17.40:40536 current backend = 0
client default db = mysqlslap client username = root
(QUIT) current backend = 0
[disconnect_client] 10.10.17.40:40536
b) Kết quả thời gian trả về từ công cụ mysqlslap
Kết quả thực nghiệm thời gian chạy các truy vấn trong mô hình này nhƣ bảng sau:
Bảng 3: Kết quả thời gian chạy các truy vấn trong mô hình MySQL Proxy-master-slave
--number-of-queries --concurrency Average number of seconds to run queries
100 100 3.691
600 600 9.348
1500 700 9.599
2000 800 10.470
4.3.3.Mô hình MySQL Proxy – một master – hai slave
Mô hình này bao gồm MySQL Proxy và một giải pháp replication với một master và hai slave.
Máy chủ master có địa chỉ IP và cổng là 10.10.17.40:3306. Máy chủ slave thứ nhất có địa chỉ IP và công là: 10.10.17.5:3306 Máy chủ slave thứ hai có địa chỉ IP và cổng là: 10.10.17.100:3306 MySQL Proxy có địa chỉ IP là 10.10.17.100, lắng nghe trên cổng 4040.
65
Sử dụng máy có địa chỉ IP là 10.10.17.40 làm client để kết nối đến các máy chủ.
a) Kết quả chạy của MySQL Proxy:
Kết quả chạy của MySQL Proxy trong mô hình này ở hai giai đoạn 1 và giai đoạn 3 của quá trình chạy công cụ mysqlslap có kết quả tƣơng tự trong giai đoạn 1 và giai đoạn 3 ở mô hình MySQL Proxy – một master – một slave:
Giai đoạn 1 của quá trình chạy công cụ mysqlslap
# mysql-proxy --admin-username=root \ > --admin-password=giang \ > --admin-address=10.10.17.100:4041 \ > --proxy- address=10.10.17.100:4040\ > --proxy-backend-addresses=10.10.17.40:3306 \ > --proxy-read-only-backend-addresses=10.10.17.5:3306 \ > --proxy-read-only-backend-addresses=10.10.17.100:3306 \ > --admin-lua-script=/home/giangvit/workspace/proxy/admin-script.lua \ > --proxy-lua-script=/home/giangvit/workspace/mysqlProxy/rw4.lua
2012-05-15 16:47:32: [global] (*) mysql-proxy 0.9.0 started
[connect_server] 10.10.17.40:38453 [1].connected_clients = 0 [1].pool.cur_idle = 0 [1].pool.max_idle = 1000000 [1].pool.min_idle = 1 [1].type = 1 [1].state = 0
66 [read_query] 10.10.17.40:38453
current backend = 0 client default db = client username = root
query = DROP SCHEMA IF EXISTS `mysqlslap` sending to backend : 10.10.17.40:3306
is_slave : false server default db: server username : root in_trans : false in_calc_found : false COM_QUERY : true [read_query] 10.10.17.40:38453 current backend = 0 client default db = client username = root
query = CREATE SCHEMA `mysqlslap` sending to backend : 10.10.17.40:3306 is_slave : false
server default db: server username : root in_trans : false
in_calc_found : false COM_QUERY : true
67 current backend = 0
client default db = client username = root
sending to backend : 10.10.17.40:3306 is_slave : false
server default db: server username : root in_trans : false
in_calc_found : false COM_QUERY : false
[read_query] 10.10.17.40:38453 current backend = 0
client default db = mysqlslap client username = root
query = CREATE TABLE `t1` (id serial,intcol1 INT(32),charcol1 VARCHAR(128)) sending to backend : 10.10.17.40:3306
is_slave : false
server default db: mysqlslap server username : root in_trans : false
in_calc_found : false COM_QUERY : true
[read_query] 10.10.17.40:38453 current backend = 0
68 client username = root
query = INSERT INTO t1 VALUES
(NULL,1804289383,'mxvtvmC9127qJNm06sGB8R92q2j7vTiiITRDGXM9ZLzkdekb WtmXKwZ2qG1llkRw5m9DHOFilEREk3q7oce8O3BEJC0woJsm6uzFAEynLH2xCsw 1KQ1lT4zg9rdxBL')
sending to backend : 10.10.17.40:3306 is_slave : false
server default db: mysqlslap server username : root in_trans : false
in_calc_found : false COM_QUERY : true
(read_query_result) staying on the same backend in_trans : false
in_calc_found : false have_insert_id : true
69
Giai đoạn 3 của quá trình chạy công cụ mysqlslap:
[read_query] 10.10.17.40:47303 current backend = 0
client default db = mysqlslap client username = root
(QUIT) current backend = 0 [read_query] 10.10.17.40:40536 current backend = 0
client default db = mysqlslap client username = root
query = DROP SCHEMA IF EXISTS `mysqlslap` sending to backend : 10.10.17.40:3306
is_slave : false
server default db: mysqlslap server username : root in_trans : false in_calc_found : false COM_QUERY : true [disconnect_client] 10.10.17.40:47303 [read_query] 10.10.17.40:40536 current backend = 0
client default db = mysqlslap client username = root
(QUIT) current backend = 0
70
Sự khác nhau chính là ở giai đoạn 2 của quá trình chạy công cụ mysqlslap:
Mô hình trƣớc, các câu lệnh SELECT chỉ đƣợc gửi đến một máy chủ slave. Còn trong mô hình này, các câu lệnh SELECT đƣợc MySQL Proxy gửi đều về hai slave theo thuật toán round-robin:
sending to backend : 10.10.17.5:3306 is_slave : true và sending to backend : 10.10.17.100:3306 is_slave : true Giai đoạn 2: [read_query] 10.10.17.40:38844 current backend = 0
client default db = mysqlslap client username = root
query = SELECT intcol1,charcol1 FROM t1 sending to backend : 10.10.17.5:3306
is_slave : true
server default db: mysqlslap server username : root in_trans : false
in_calc_found : false COM_QUERY : true
[read_query] 10.10.17.40:38850 current backend = 0
71 client default db = mysqlslap
client username = root
query = SELECT intcol1,charcol1 FROM t1 sending to backend : 10.10.17.100:3306 is_slave : true
server default db: mysqlslap server username : root in_trans : false
in_calc_found : false COM_QUERY : true
[read_query] 10.10.17.40:38864 current backend = 0
client default db = mysqlslap client username = root
query = SELECT intcol1,charcol1 FROM t1 sending to backend : 10.10.17.5:3306
is_slave : true
server default db: mysqlslap server username : root in_trans : false in_calc_found : false COM_QUERY : true [disconnect_client] 10.10.17.40:38745 [read_query] 10.10.17.40:38856 current backend = 0
72 client default db = mysqlslap
client username = root
query = SELECT intcol1,charcol1 FROM t1 sending to backend : 10.10.17.100:3306 is_slave : true
server default db: mysqlslap server username : root in_trans : false
in_calc_found : false COM_QUERY : true
b) Kết quả thời gian trả về từ công cụ mysqlslap
Kết quả thực nghiệm thời gian chạy các truy vấn trong mô hình này nhƣ bảng sau:
Bảng 4: Kết quả thời gian chạy các truy vấn trong mô hình MySQL Proxy-master-multi slave
--number-of-queries --concurrency Average number of seconds to run queries
100 100 2.550
600 600 9.170
1500 700 9.256
2000 800 9.983
73
Hình 211: Hiệu năng CPU của master
74
Hình 233: Hiệu năng trung bình tải
4.4.NHẬN XÉT
Dựa vào kết quả thực nghiệm trong ba mô hình trên, rút ra nhận xét là:
4.4.1. Khả năng chịu tải của server
Khi số client tăng lên thì thời gian trả chạy các truy vấn cũng tăng lên.
Trong mô hình chỉ có một MySQL server, thì thời gian chạy các truy vấn tăng lên rất nhiều. Khi số client kết nối đến là 800 client thì máy chủ bị quá tải.
Trong hai mô hình mà có mặt của MySQL Proxy, khi client tăng lên thì thời gian chạy các truy vấn tăng lên là không đáng kể. Thời gian này càng giảm khi có thêm slave – mô hình MySQL Proxy – master – multi slave. Hơn nữa, hai mô hình này có thể đáp ứng đƣợc số lƣợng client truy suất đến là rất lớn.
Nhƣ vậy, MySQL Proxy kết hợp với giải pháp replication đã giải quyết rất tốt bài toán cân bằng tải các truy vấn đọc cho hệ quản trị CSDL MySQL.
4.4.2. Khả năng mở rộng
Không chỉ có khả năng cân bằng tải các truy vấn đọc cho hệ quản trị CSDL MySQL, khi quy mô của hệ thống đƣợc mở rộng, số client tăng lên thì có thể thêm slave vào mô hình, giống nhƣ mô hình MySQL Proxy – master – multi slave hoặc sử dụng giải pháp “relay slave replication” kết hợp với MySQL Proxy để đáp ứng tốt hơn nhu cầu của
75
client. Khi thêm slave vào mô hình, việc cấu hình replication là rất đơn giản, không mất nhiều thời gian và không ảnh hƣởng đến hệ thống (Xem phần cấu hình trong phần 4.2.2.). Đặc biệt, để MySQL Proxy biết đƣợc sự có mặt của một server mới thêm vào thì chỉ cần thêm một dòng lệnh trong cấu hình của MySQL Proxy:
--proxy-read-only-backend-addresses = host:port
4.4.3. Tính sẵn sàng cao
Khi master bị lỗi không thể tiếp tục hoạt động hoặc master đƣợc bảo trì và nâng cấp thì một slave có thể đảm nhiệm vai trò của master trong thời gian master vắng mặt. Để làm đƣợc điều này, thì đơn giản chỉ cần thay đổi trong câu lệnh của MySQL Proxy:
Cấu hình cũ khi master vẫn hoạt động:
--proxy-backend-addresses = master-host:port
--proxy-read-only-backend-addresses = slave1-host:port --proxy-read-only-backend-addresses = slave2-host:port
Khi master ngừng hoạt động, giả sử dùng slave1 để thay thế vị trí của master:
--proxy-backend-addresses = slave1-host:port
--proxy-read-only-backend-addresses = slave2-host:port
Sau khi master đƣợc phục hồi, thì dựa vào file Binary log của slave1, master có thể biết đƣợc sự thay đổi đã diễn ra trong cơ sở dữ liệu của mình, từ đó, nó đồng bộ dữ liệu với slave1 mà đã thay thế nó. Lúc này cấu hình trong MySQL Proxy lại quay về nhƣ cũ.
Do vậy, các server của hệ thống luôn sẵn sàng hoạt động, luôn sẵn sàng đáp ứng đƣợc tất cả các truy vấn của client, không xảy ra một sự chậm chễ nào.
76
KẾT LUẬN
Khóa luận đã tập trung nghiên cứu bài toán cân bằng tải cho hệ quản trị CSDL MySQL với MySQL Proxy trong hai mô hình: mô hình MySQL Proxy – master – slave và mô hình MySQL Proxy – master – multi slave.
Về mặt nội dung, khóa luận đã đạt đƣợc những kết quả sau:
Tìm hiểu và phân tích các bài toán cân bằng tải cho các hệ quản trị CSDL MySQL, PostgreSQL, Oracle và SQL.
Tìm hiểu về các tiêu chí đánh giá tải và hiệu năng của máy chủ.
Tìm hiểu về giải pháp replication trong hệ quản trị CSDL MySQL, tìm hiểu về MySQL Proxy, các giải thuật trong bài toán cân bằng tải, nguyên lý hoạt động MySQL Proxy nhờ ngôn ngữ kịch bản Lua. Từ đó, lựa chọn hai mô hình MySQL Proxy – master – slave và MySQL Proxy – master – multi slave để giải quyết bài toán cân bằng tải các truy vấn đọc, đánh giá tải và hiệu năng của MySQL server trong mỗi mô hình.
Do hạn chế về mặt thời gian, kiến thức, số lƣợng và cấu hình của máy tính để thực nghiệm nên khóa luận vẫn còn những điểm hạn chế sau:
Chỉ dừng lại ở bài toán cân bằng tải các truy vấn đọc cho hệ quản trị CSDL MySQL.
Chƣa thử nghiệm đƣợc với số lƣợng client truy cập lớn và số lƣợng các MySQL server chƣa đủ lớn.
Giải pháp cân bằng tải cho hệ quản trị CSDL MySQL sử dụng MySQL Proxy bƣớc đầu đã có những kết quả tốt, khả quan. Trong thời gian tới, tôi sẽ nghiên cứu và phát triển bài toán cân bằng tải theo những hƣớng sau:
Cân bằng tải các truy vấn ghi dựa vào phƣơng pháp Sharding cơ sở dữ liệu MySQL với MySQL Proxy.
Thử nghiệm trên nhiều MySQL server để đánh giá chính xác tải và hiệu năng của các server.
77
TÀI LIỆU THAM KHẢO Tiếng Việt
[1] Võ Duy Pho, Cân bằng tải cho các hệ Webserver lớn và đảm bảo Scalability,
Khóa luận tốt nghiệp, Đại học Bách Khoa Hà Nội, 2006
[2] Đinh Thị Thu Dung, Nghiên cứu, xây dựng và phòng chống Botnet, Khóa luận tốt nghiệp, Đại học Công nghệ - Đại học Quốc gia Hà Nội, 2012
[3] Đỗ Thanh An, Tìm hiểu MySQL Cluster và ứng dụng, Khóa luận tốt nghiệp, Đại học Công nghệ - Đại học Quốc gia Hà Nội, 2012
[4] Đinh Mạnh Tƣờng, Cấu trúc dữ liệu và giải thuật, Khoa Công nghệ Thông tin, Đại học Công nghệ - Đại học Quốc gia Hà Nội, tr. 246-247
Tiếng Anh
[5] Gregory Smith, PostgreSQL 9.0 High Performance, 2010, pp. 370-393
[6] Sheeri Cabral, Keith Murphy, MySQL Administrator‟s Bible, Wiley Publishing, Inc., Indianapolis, Indiana, 2009, pp.
[7] Charles Bell, Mats Kindahl, and Lars Thalmann, MySQL High Availability,
2010, O‟Reilly Media, Inc., 1005 Gravenstein Highway North, Sebastopol, CA 95472, pp. 12-16 Trang web [8] http://en.wikipedia.org/wiki/Web_server [9] http://www.thanhnien.com.vn/pages/20111231/google-va-facebook-duoc-truy- cap-nhieu-nhat-nam-2011.aspx [9] http://www.mysql.com/why-mysql/ [11] http://www.postgresql.org/about/ [12] http://pgcluster.projects.postgresql.org/feature.html [13] http://bucardo.org/wiki/Bucardo [14] http://ossipedia.ipa.go.jp/capacity/EV0612230251/ [15] http://www.pgpool.net/docs/latest/doc/pgpool-en.html
78 [16] http://www.oracle.com [17] http://networksandservers.blogspot.com/2011/03/load-balancing-ii.html [18] http://everac99.wordpress.com/2008/03/31/the-oracle-rac-what-is-it-an-how- does-it-work/ [19] http://msdn.microsoft.com/en-us/library/ms152746.aspx