PHÂN TÍCH, ĐÁNH GIÁ KẾT QUẢ THỰC NGHIỆM

Một phần của tài liệu NGHIÊN CỨU THỬ NGHIỆM GIẢI PHÁP CÂN BẰNG TẢI CHO HỆ QUẢN TRỊ CSDL MYSQL VỚI MYSQL PROXY (Trang 71 - 94)

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 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

Một phần của tài liệu NGHIÊN CỨU THỬ NGHIỆM GIẢI PHÁP CÂN BẰNG TẢI CHO HỆ QUẢN TRỊ CSDL MYSQL VỚI MYSQL PROXY (Trang 71 - 94)