Relational Cloud sử dụng các DBMS hiện có như các nút xử lý và lưu trữ truy vấn back-end. Mỗi nút back-end chạy một máy chủ cơ sở dữ liệu. Tập
các máy back-end có thể thay đổi tự động để đáp ứng với tải. Mỗi người thuê
(tenant) của hệ thống – mà chúng ta định nghĩa như là một thực thể có thể lập
hóa đơn (một người sử dụng phân biệt với một tập các ứng dụng, một đơn vị kinh doanh, hoặc một công ty) – có thể tải một hoặc nhiều cơ sở dữ liệu. Một cơ sở dữ liệu có một hoặc nhiều bảng, và một workload liên quan, được xác
định như một tập các truy vấn và giao dịch (transactions) sinh ra cho nó (tập này có thể không được biết cho đến khi chạy). Relational Cloud không trộn
58
chung nhưng các cơ sở dữ liệu thuộc những người thuê khác nhau sẽ thường chạy trong cùng máy chủ cơ sở dữ liệu.
Các ứng dụng giao tiếp với Relational Cloud sử dụng một lớp kết nối tiêu chuẩn như JDBC chẳng hạn. Chúng giao tiếp với Relational Cloud front-end sử dụng một trình điều khiển đặc biệt để đảm bảo dữ liệu của họ dược giữ kín (ví dụ, người quản trị cơ sở dữ liệu không thể đọc được) – Điều này được mô tả chi tiết dưới dây, Khi front-end nhận các câu lệnh SQL từ client, nó hỏi router, trong đó phân tích từng câu lệnh SQL và sử dụng siêu dữ liệu (metadata) của nó để xác định các nút và dự kiến thực thi. Front-end điều phối các giao dịch đa nút (multi-node transaction), tạo ra một kế hoạch thực hiện phân phối, và xử lý chuyển đổi dự phòng (fail-over). Nó cũng cung cấp một mức độ thực hiện sự cách ly bằng cách kiểm soát tốc độ truy vấn từ những người thuê khác nhau được gửi đi.
Front-end giám sát các mẫu truy cập bao gồm bởi các workload và tải của các máy chủ cơ sở dữ liệu. Relational Cloud sử dụng thông tin này để xác định định kỳ cách tốt nhất để: (1) phân vùng (partition) từng cơ sở dữ liệu
thành một hay nhiều mảnh, sản xuất nhiều phân vùng khi tải trên một cơ sở dữ liệu vượt quá khả năng của máy, (2) đặt (place) các phân vùng cơ sở dữ
liệu trên các máy back-end để giảm thiểu số lượng máy và cân bằng tải, di chuyển (migrate) dữ liệu để sẵn sàng, và (3) bảo mật (secure) dữ liệu và xử lý
các truy vấn để chúng có thể chạy trên các back-end không đáng tin cậy trên dữ liệu mã hóa.Kiến trúc hệ thống Relational Cloud được thể hiện trong Hình 2.22, trong đó mô tả các chức năng và phần ranh giới các khu vực tin cậy và không tin cậy.
59
Hình 2.22 Kiến trúc Relational Cloud.
Các ứng dụng giao tiếp với Relational Cloud front-end sử dụng CryptDB. Trên các nút back-end, CryptDB khai thác một sự kết hợp của mã hóa phía máy chủ và các hàm người dùng định nghĩa (UDFs) để cho phép xử lý SQL hiệu quả - đặc biệt là ordering, aggregates, và joins trên dữ liệu mã hóa.
Hiện tại các chuyên gia của MIT đã phát triển các thành phần khác nhau của Relational Cloud và đang trong quá trình tích hợp chúng vào một hệ thống thống nhất duy nhất, trước khi cung cấp nó như là một dịch vụ trên một đám mây công cộng. Họ đã triển khai một thành phần điều phối giao dịch phân tán (distributed transaction coordinator) cùng với một bộ định tuyến (router), phân vùng, tái tạo, và các thành phần CryptDB. Thành phần điều phối giao dịch hỗ trợ cả MySQL và Postgres back-end, và đã triển khai một giao diện JDBC công cộng. Ta có thể phân tích và tự động tạo ra một phân vùng tốt cho nó, và rồi chạy các giao dịch phân tán (distributed transacstion) trên các phân vùng đó. Thành phần điều phối giao dịch hỗ trợ kích hoạt chuyển đổi dự phòng (fail-over) để tạo bản sao trong trường hợp thất bại. Một engine sắp xếp và di chuyển (placement và migration engine) được phát triển theo dõi số liệu thống kê máy chủ cơ sở dữ liệu, hệ điều hành, và tải phần cứng, và sử dụng số liệu thống kê để tiên đoán tải trọng kết hợp được đặt bởi nhiều workload. Nó sử dụng một thiết bị giải quyết (solver) lập trình nguyên, phi tuyến tính để tối ưu các phân vùng cho các máy chủ.
60 2.3.3. Phân tích an ninh
Như đã thảo luận từ trước, CrypytDB – hệ thống con của Relational Cloud đảm bảo tính riêng tư cho dữ liệu được lưu trữ bằng cách mã hóa toàn bộ dữ liệu. Thách thức ở đây là việc thực thi các truy vấn SQL trên dữ liệu mã hóa và thực thi một cách hiệu quả. Ý tưởng quan trọng ở đây là điều chỉnh mức độ
an toàn.
CryptDB bắt đầu cơ sở dữ liệu với tất cả dữ liệu được mã hóa với lược đồ an toàn cao nhất. JDBC client truy cập tới các key cho tất cả các lớp onion của mỗi bản mã được lưu trên máy chủ (bằng cách tính toán chúng dựa trên master key). Khi trình điều khiển JDBC client nhận các truy vấn SQL từ ứng dụng, nó tính toán các khóa onion cần thiết để giải mã các cột nhất định tới mức an toàn tối đa mà cho phép truy vấn thực thi trên máy chủ. Mức độ an toàn tự động điều chỉnh dựa trên các truy vấn mà các ứng dụng thực hiện cho máy chủ.
Để đơn giản hóa việc quản lý các khóa onion, CryptDB mã hóa tất cả các mục dữ liệu trong một cột sử dụng cùng một tập khóa. Từng lớp của onion có một khóa khác nhau (khác so với các cột khác), ngoại trừ các lớp thấp nhất cho phép các join (để cho phép so sánh có ý nghĩa các bản mã giữ hai cột khác nhau như là một phần của join). Các thuật toán mã hóa là đối xứng; để máy chủ loại bỏ một lớp, máy chủ phải nhận onion key đối xứng cho lớp đó từ JDBC client. Một khi máy chủ nhận được khóa để giải mã một onion tới một lớp thấp hơn, nó bắt đầu ghi các giá trị mới được giải mã vào đĩa, như các hàng khác nhau được truy cập hoặc được truy vấn. Sau khi toàn bộ cột được giải mã, bản mã onion gốc được loại bỏ, vì các lớp onion bên trong có thể hỗ trợ một tập các truy vấn so với các lớp bên ngoài.
61
CHƯƠNG 3. TRIỂN KHAI CÀI ĐẶT, THỬ NGHIỆM VÀ ĐÁNH GIÁ MÔ HÌNH.
3.1. Mô hình triển khai
3.1.1. Mô hình triển khai hệ thống.
Hình 3.1 Mô hình hệ thống.
Mô hình triển khai hệ thống thử nghiệm bao gồm 3 máy: Client, Web server và Database server trong đó:
Máy Client đóng vai trò một máy khách truy cập và sử dụng một ứng dụng web trên Web server. Trên Client có cài một web browser như Firefox chẳng hạn.
Máy Web server đóng vai trò là một máy chủ web cung cấp một ứng dụng web cho người dùng đồng thời cũng đóng vai trò là một proxy tiếp nhận và xử lý các truy vấn SQL từ ứng dụng web. Trên Web server có cài đặt apache, php để chạy ứng dụng web và CryptDB.
Máy Database server đóng vai trò là một backend database lưu trữ dữ liệu cho ứng dụng web. Database server này tượng trưng cho backend database được thuê từ các nhà cung cấp dịch vụ đám mây. Trên Database server cài đặt mysql-server.
62
Bảng 3-1 Thông tin các thành phần trong hệ thống
Máy Địa chỉ IP Hệ điều hành Ứng dung cài đặt
Client 192.168.1.4 Windows 7 Ultimate – 64 bit Mozila Firefox 29 Web server 192.168.1.7 Ubuntu Desktop LTS 12.04.4 – 64 bit php5, apache2, CryptDB Database server 192.168.1.8 Ubuntu Server LTS 12.04.4 – 64 bit mysql-server 3.1.2. Mô hình hoạt động hệ thống. Hình 3.2 Lưu đồ hoạt động.
Hoạt động của hệ thống. Nhìn vào lưu đồ hoạt động của hệ thống ta thấy
rõ quá trình hoạt động trải qua 6 bước cụ thể như sau:
Bước 1: Người dùng tại máy Client mở trình duyệt web truy cập vào ứng dụng được lưu trên máy Web server. Sau đó người dùng gửi các yêu cầu về dữ liệu thông qua việc sử dụng các chức năng của ứng dụng đó.
Bước 2: Ứng dụng xử lý các yêu cầu chức năng của người dùng, sinh ra các truy vấn tương ứng để truy vấn tới cơ sở dữ liệu thông qua CryptDB.
Bước 3: CryptDB proxy chặn lại và viết lại các truy vấn đó, điều chỉnh các lớp mã hóa nếu cần thiết sau đó chuyển tiếp các truy vấn được mã hóa tới máy chủ DBMS để thực thi.
63
Bước 4: máy chủ DBMS thực thi các truy vấn đó và trả về kết quả của truy vấn (được mã hóa) cho CryptDB.
Bước 5: CryptDB sẽ tiến hành giải mã các kết quả được mã hóa đó thành bản rõ và trả về cho ứng dụng.
Bước 6: Ứng dụng nhận và hiển thị kết quả dưới dạng bản rõ đáp ứng các yêu cầu của người dùng.
Ứng dụng thử nghiệm. là ứng dụng quản lý nhân viên đơn giản được xây
dựng bằng HTML, CSS, PHP và MySQL gồm có một số chức năng cơ bản như tạo cơ sở dữ liệu, tạo bảng “users” trong cơ sở dữ liệu, thực hiện các thao tác trên bảng đó để quản lý nhân viên như thêm, xem, sửa, xóa, tìm kiếm nhân viên.
Giao diện của ứng dụng thử nghiệm. Bằng cách sử dụng HTML và CSS,
ta có thể dễ dàng tạo được một ứng dụng quản lý nhân viên với giao diện đơn giản như Hình 3.2 trong đó phần header bao gồm các mục thể hiện một số thông tin về ứng dụng, phần sidebar bên tay trái chứa các chức năng của ứng dụng, và phần chính giữa hiển thị nội dung khi ta thực hiện các chức năng đó của ứng dụng.
64
Chức năng của ứng dụng thử nghiệm. Để tạo các chức năng cho ứng
dụng, ngôn ngữ lập trình ta sẽ sử dụng ở đây là PHP. Các chức năng bao gồm tạo cơ sở dữ liệu; tạo hoặc thiết lập lại bảng trong cơ sở dữ liệu; thêm, xem, sửa, xóa, tìm kiếm thông tin nhân viên trong cơ sở dữ liệu.
Chức năng tạo cơ sở dữ liệu: Để tạo cơ sở dữ liệu sử dụng cho ứng dụng, trước hết ta cần kết nối tới máy chủ cơ sở dữ liệu (ở đây ta sẽ kết nối tới CryptDB qua cổng 3307 với user/password mặc định của CryptDB là „root‟/„letmein‟, thành phần kết nối với máy chủ cơ sở dữ liệu là CryptDB), sau khi kết nối thành công ta sẽ tiến hành chạy câu lệnh “CREATE DATABASE datn;” để tạo một cơ sở dữ liệu mới có tên là “datn”. Đoạn mã PHP sau đây sẽ giúp ta thực hiện được việc này.
$dbc = mysql_connect('127.0.0.1:3307', 'root', 'letmein'); if($dbc) {
//kết nối cơ sở dữ liệu thành công //tạo cơ sở dữ liệu
$r = mysql_query("CREATE DATABASE datn;"); if(!$r) { //câu lệnh bị lỗi
$fail = 1; //cờ lỗi gán bằng 1 die(mysql_error($dbc));
}
//thông báo tạo thành công nếu không có lỗi if($fail != 1) {
echo "<p class='success'>your database has been created succesfully</p>";
} } else {
//kết nối cơ sở dữ liệu không thành công
trigger_error("Could not connect to database: ". mysqli_connect_error());
}
Chức năng tạo hoặc thiết lập lại bảng “users” trong cơ sở dữ liệu “datn”: Chức năng này sẽ thực hiện kiểm tra trong cơ sở dữ liệu “datn” đã đồn tại bảng “users” chưa. Nếu bảng “users” chưa tồn tại, sẽ tiến hành tạo bảng “users” mới với các trường “user_id”,
65
“name”, “age”, “email”, “user_level”, “salary”. Nếu bảng “users” đã tồn tại, sẽ tiến hành xóa bảng “user” đó đi và tạo một bảng mới. Ở đây các câu lệnh SQL sẽ được lưu trong một tập tin có tên là “database.sql”, ứng dụng sẽ tiến hành đọc nội dung của tập tin này và thực thi từng câu lệnh có trong tập tin để tạo bảng “user”.
//đọc nội dung tập tin
$sql_contents = file_get_contents('database.sql'); $sql_contents = explode(";", $sql_contents);
//thực thi các câu lệnh trong tập tin foreach ($sql_contents as $q) { if(!empty($q)) { $r = mysqli_query($dbc, $q); if(!$r) { $fail = 1; die(mysqli_error($dbc)); } } }
//thông báo thành công nếu không có lỗi if($fail != 1) {
echo "<p class='success'>your database has been setup/reset succesfully</p>";
}
Chức năng thêm nhân viên: Một form để nhập thông tin của từng nhân viên được tạo ra với các trường tương ứng với các trường trong bảng “users”. Bằng phương thức POST của PHP, giá trị của các trường trong form sẽ được lưu vào các biến cụ thể, các biến này sẽ được sử dụng để thêm thông tin cho một nhân viên vào bảng “users” thông qua lệnh INSERT trong SQL:
$q = "INSERT INTO users (name, age, email, user_level, salary) VALUE ('{$name}', $age, '{$email}', $user_level, $salary)";
//thực thi truy vấn
$r = mysqli_query($dbc, $q) or die(mysqli_error($dbc)); //thông báo thêm thành công hay không
66
$messages = "<p class='success'>The content was added successfully</p>";
} else {
$messages = "<p class='warning'>The content was not added due to a system error</p>";
}
Chức năng xem nhân viên: Khi thực hiện chức năng này, ứng dụng sẽ truy vấn toàn bộ thông tin của các nhân viên có trong cơ sở dữ liệu thông qua lệnh SELECT và hiển thị ra màn hình. Bên cạnh đó người dùng cũng có thể xem thông tin nhân viên đc sắp xếp thứ tự theo các trường tùy ý nhờ đưa lệnh ORDER BY vào trong truy vấn SQL.
$q = "select user_id, name, age, email, user_level, salary from users ORDER BY {$order_by} ASC";
$r = mysqli_query($dbc, $q) or die("Query {$q} \n<br/> MySQL Error: ".mysqli_error($dbc)); if(mysqli_num_rows($r) > 0) { //hiển thị dữ liệu . . . } else {
echo "<p class='warning'>There is currently no content to display. Please add content first.</p>";
}
Chức năng sửa/xóa nhân viên: Trong chức năng xem nhân viên, khi hiển thị nhân viên ra màn hình, bên cạnh mỗi nhân viên sẽ có liên kết tới hai chức năng sửa/xóa. Để có thể sửa/xóa đúng nhân viên, ta sẽ thêm một biến „uid‟ vào liên kết tới hai chức năng này, sau đó sự dụng phương thức GET trong PHP để lấy giá trị của biến „uid‟ và cuối cùng tiến hành UPDATE/DELETE nhân viên có user_id tương ứng với „uid‟ đã chọn.
//thêm biến uid cho liên kết tới chức năng sửa/xóa khi hiển thị trong chức năng xem
67 <td><a class='edit' href='edit_content.php?uid={$content['user_id']}'>Edit</a></t d> <td><a class='delete' href='delete_content.php?uid={$content['user_id']}&name={$con tent['name']}'>Delete</a></td> --- //lấy giá trị biến „uid‟ từ liên kết trong chức năng sửa/xóa if(isset($_GET['uid']) && filter_var($_GET['uid'],
FILTER_VALIDATE_INT, array('min_range'=>1))) { $user_id = $_GET['uid'];
}
Chức năng tìm kiếm nhân viên: Với chức năng này, ta sẽ tạo một form cho người dùng nhập tên nhân viên cần tìm kiếm. Ứng dụng sẽ truy vấn tới cơ sở dữ liệu và SELECT nhân viên có tên ứng với giá trị cần tìm, sau đó hiển thị ra màn hình.
$q = "select user_id, name, age, email, user_level, salary from users where name = '{$search}'";
$r = mysqli_query($dbc, $q) or die("Query {$q} \n<br/> MySQL Error: ".mysqli_error($dbc));
if(mysqli_num_rows($r) > 0) { //hiển thị kết quả tìm được .
. . } else {
echo "<p class='warning'>There is currently no content to display.</p>";
}
Kịch bản thử nghiệm. Với hệ thống được trình bày như trên, kịch bản
thử nghiệm mô hình diễn ra như sau: Đóng vai trò là một người dùng thông thường, ta sẽ sử dụng một trình duyệt web (như Mozila Firefox chẳng hạng) để truy cập tới ứng dụng trên Web server. Sau đó ta sử dụng các chức năng của ứng dụng nhằm truy xuất các dữ liệu cần thiết, ứng dụng thực thi yêu cầu và trả về kết quả cho ta. Đóng vai trò là một người quản trị của Database server, ta sẽ xem xem dữ liệu của người dùng được lưu trữ thế nào trên cơ sở
68
dữ liệu mà ta quả trị. Thử nghiệp thành công nếu kết quả từ Web server trả về cho người dùng bình thường là đọc được còn người quản trị Database server không thể đọc được dữ liệu được lưu trên cơ sở dữ liệu do dữ liệu đã được mã hóa hoàn toàn. Lưu ý với việc các truy vấn phải đi qua CryptDB trước khi tới