CHƯƠNG 1 : TỔNG QUAN FOUNDATIONDB
1.3.4 Loại bỏ node từ cluster
Lựa chọn chế độ dự phòng thích hợp với số node còn lại trong cluster.
Nếu máy cần loại bỏ đang là một trong nhưng máy điều phối cần thiết lập lại để máy này không là máy chủ điều phối.
Sử dụng lệnhexclude trên máy muốn loại bỏ
user@host1$ fdbcli
Using cluster file `/etc/foundationdb/fdb.cluster'. The database is available.
Welcome to the fdbcli. For help, type `help'. fdb> exclude 1.2.3.4 1.2.3.5 1.2.3.6
Waiting for state to be removed from all excluded servers. This may take a while.
It is now safe to remove these machines or processes from the cluster.
Dừng dịch vụ trên máy đã loại bỏ
user@host3$ sudo service foundationdb stop
user@host3$ sudo update-rc.d foundationdb disable
Kiểm tra lại CSDL để chắc chắn tất cả đều hoạt động ổn định.
Có thể gỡ bỏ và xóa các file liên quan đến FDB server trên máy bị loại bỏ. 1.3.5 Xem thông tin trạng thái cluster
Sử dụng câu lệnh status để xem trạng thái của cluster đang chạy:
Using cluster file `/etc/foundationdb/fdb.cluster'. The database is available.
Welcome to the fdbcli. For help, type `help'. fdb> status
Chương 1 : Hình 10: trạng thái của cluster Redundancy mode Chế độ dự phòng đang sử dụng Redundancy mode Chế độ dự phòng đang sử dụng
Storage engine Cấu hình hiện tại của phương thức lưu trữ Coordinators Số lượng máy chủ điều phối của cluster FoundationDB
processes Số lượng tiến trình FDB server chạy trên cluster
Machines Sô lượng máy vật lý(node) của cluster
Overall load Ước tính lượng sử dụng tài nguyên phần cứng Memory availability RAM cho mỗi tiến trình FDB server
Replication health Ước lượng tình trạng của dữ liệu nhân bản Moving data Lượng dữ liệu chuyển qua lại các máy
Sum of key-value sizes
Ước tính dung lượng của KVS không bao gồm các bản sao.
Operating space Ước tính lượng bộ nhớ ram còn trống của mỗi máy.
Read rate Số lượng đọc trên giây
Write rate Số lượng ghi trên giây
Transaction rate Số lượng giao tác trên giây Conflict rate Số lượng xung đột trên giây
1.3.6 Quản lý tập tin trace
/var/log/foundationdb/ Linux
Các tập tin trace(truy vết) có mục đích để chẩn đoán các lỗi hay xung đột trên cluster.
1.3.7 Gỡ bỏ
Để gỡ bỏ FDB server từ một cluster: Gỡ bỏ FDB trên từng máy
o Ubuntu
user@host$ sudo dpkg -P foundationdb-clients foundationdb-server
o RHEL/CentOs
user@host$ sudo rpm -e foundationdb-clients foundationdb-server
Xóa dữ liệu liên quan đến FDB
Trên linux xóa dữ liệu trong các thư mục /var/lib/foundationdb/,
/var/log/foundationdb/, /etc/foundationdb/. 1.3.8 Nâng cấp
Để nâng cấp FDB cluster lên phiên bản mới thì cần phải nâng cấp phiên bản ở từng máy trong cluster. Cluster sẽ không hoạt động cho đến khi toàn bộ các node được cập nhật thành công.
1.4 Kết luận
Trong chương một, tôi đã giới thiệu tổng quan mô hình một hệ thống xử lý giao tác trực tuyến(OLTP system). Đây là hệ thống cơ sở dữ liệu phân tán, chạy trên Cluster. Sau đó giới thiệu về FoundationDB một hệ quản trị CSDL thế hệ mới chú trọng và tập trung vào sức mạnh của giao tác. FouandationDB có rất nhiều đặc tính phù hợp với một hệ thống OLTP hiện đại như hỗ trợ rất mạnh giao tác ACID, khả năng mở rộng quy mô và phòng chống lỗi rất tốt.
Trong chương thứ hai, tôi tập trung vào vấn đề xây dựng ứng dụng với FoundationDB.
CHƯƠNG 2: PHÁT TRIỂN ỨNG DỤNG XỬ LÝ GIAO TÁC TRỰC TUYẾN VỚI FOUNDATIONDB
2.1 Xây dựng ứng dụng với API của FoundationDB[4]
2.1.1 Mô hình dữ liệu
Mô hình dữ liệu lõi của FDB là key-value store có trật tự. Cũng được biết đến như một mảng, từ điển có sắp xếp, đây là cấu trúc dữ liệu kết hợp bởi một tập các bộ khóa-giá trị (key-value) trong đó tất cả khóa là duy nhất và có thứ tự. Tất cả khóa và giá trị trong FDB đều là các chuỗi byte. Ngoài việc phục hồi và lưu trữ, CSDL không phụ thuộc vào nội dung của giá trị. Sự kết hợp của mô hình dữ liệu lõi cùng với giao tác đa khóa cho phép ứng dụng có thể xây dựng các mô hình dữ liệu phong phú hơn đồng thời thừa hưởng những đặc tính của FDB.
2.1.2 Quản lý không gian tên
Do sự sắp xếp của các khóa nên một không gian tên (namespace) trong FDB được định nghĩa bởi bất cứ tiền tố nào được thêm vào trước khóa.
2.1.3 Làm việc với các hàm APIs
FDB hỗ trợ các hàm API (Application Programming Interface) cho các ngôn ngữ Python, Ruby, Node.js, Java và C. Ở mức cao mỗi tập APIs đều hỗ trợ giao tác cho phép:
Thiết đặt một bộ khóa-giá trị. Lấy ra giá trị nhờ vào khóa. Lấy ra một dải khóa-giá trị. Xóa đi một bộ khóa-giá trị. Xóa đi một dải khóa-giá trị.
2.1.4 Cơ bản về giao tác trong FoundationDB
FDB cung cấp mô hình điều khiển sự đồng thời, tương tranh bằng giao tác cho phép nhiều người dùng cùng lúc đọc và ghi vào CSDL. Tất cả các thao tác đọc ghi các bộ khóa-giá trị đều được thực hiện trong phạm vi một giao tác. Một giao tác là một đơn vị nhỏ của công việc được thực thi tin cậy và về mặt logic thì độc lập với các giao tác khác.
@fdb.transactional
defexample(tr):
# Read two values from the database
a=tr.get('a') b=tr.get('b')
# Write two key-value pairs to the database
tr.set('c',a+b) tr.set('d',a+b)
example(db)
2.2 Quản trị SQL Layer[4]
2.2.1 Cài đặt SQL layer
Yêu cầu môi trường cài đặt SQL layer trên windows là cần có môi trường Java runtime(JRE) từ phiên bản 7 trở lên. Máy cài đặt cần cài sẵn FDB client để kết nối vào FDB server cluter. Sau khi cài đặt các gói cài đặt cần thiết từ trang chủ của FDB chúng ta cần kiểm lại SQL layer đã hoạt động tốt:
$ fdbsqlcli -c "SELECT VERSION()"
Kết quả:
_SQL_COL_1
--- FoundationDB 2.0.1 +802bcc3 (1 row)
2.2.2 Khởi động và dừng dịch vụ trên môi trường windows
Sql layer cũng giống các dịch vụ khác trên hệ điều hành windows có thể khởi động, dừng, vô hiệu bằng trình quản lý dịch vụ:
Chương 2: H
Hoặc bằng các câu lệnh sau:
C:\Windows\system32> net start fdbsqllayer The FoundationDB SQL Layer
The FoundationDB SQL Layer
C:\Windows\system32> net stop fdbsqllayer The FoundationDB SQL Layer
Vô hiệu hóa khởi động cùng h
C:\Windows\system32>sc config fdbsqllayer start= demand [SC] ChangeServiceConfig SUCCESS
Chương 2: Hình 1: dịch vụ SQL layer trên window
nh sau:
system32> net start fdbsqllayer The FoundationDB SQL Layer service is starting…
The FoundationDB SQL Layer service was started successfully.
system32> net stop fdbsqllayer
The FoundationDB SQL Layer service was stopped successfully.
ng cùng hệ điều hành:
system32>sc config fdbsqllayer start= demand [SC] ChangeServiceConfig SUCCESS
cessfully.
service was stopped successfully.
2.2.3 Công cụ client
Đi kèm với SQL layer là các công cụ:
Fdbsqlcli: là công cụ giao tiếp với SQL layer bằng dòng lệnh, dùng để thực thi
và xem kết quả các câu lệnh SQL.
Fdbsqlload: dùng để khôi phục dữ liệu từ các tệpsao lưu hoặc các file định
dạng cho trước.
Fdbsqldump: dùng để tạo các bản sao lưu của cấu trúc CSDL, và dữ liệu của nó.
2.2.4 JVM warmup
Thông thường sau khi SQL layer khởi động một câu truy vấn sẽ không thể đạt thời gian thực thi tốt nhất. Sau một vài lần truy vấn thời gian thực thi sẽ ổn định. Điều này xảy ra cho SQL layer là một ứng dụng java chạy trên máy ảo java do đó cần thời gian để dịch các mã class java sang mã máy để thực thi.
2.2.5 Quản lý phiên người dùng (Managing User Sessions)
Bảng Server_sessions trong information_schema cho chúng ta thông tin về những hoạt động đang diễn ra của hệ thống:
caoi=> select
session_id,start_time,remote_address,last_query_executed,query _start_time from information_schema.server_sessions;
session_id | start_time | remote_address | last_query_executed | query_start_time ---+---+---+--- ---+--- 50 | 2013-09-16 11:53:53 | 127.0.0.1 | SELECT * FROM information_schema.server_sessions | 2013-09-16 11:35:53 (1 row) caoi=> select session_id,start_time,remote_address,last_query_executed, query_start_time from information_schema.server_sessions;
session_id | start_time | remote_address | last_query_executed | query_start_time ---+---+---+--- --- ---+--- 50 | 2013-09-16 11:53:53 | 127.0.0.1 |
INSERT INTO employees.salaries VALUES(10144, 71280, DATE '1990-10-13', DATE '1991-10-13'); | 2013-09-16 11:35:53
51 | 2013-09-16 11:53:53 | 127.0.0.1 |
SELECT * FROM information_schema.server_sessions | 2013-09-16 11:35:53
(1 row)
Mỗi dòng cho chúng ta thông tin về phiên của người dùng và cột cuối cùng cho biết câu lệnh SQL mà người dùng đó thực thi sau cùng. Để kết thúc phiên ta có thể dùng lệnh:
ALTER SERVER KILL SESSION 51;
Dừng câu truy vấn đang chạy nhưng vẫn giữ phiên:
ALTER SERVER INTERRUPT SESSION 51;
Để thực hiện với tất cả các phiên đang hoạt động thêm từ khóa “All” chứ không chỉ rõ id của phiên.
2.2.6 Sử dụng tệp tin LOG
Mỗi tiến trình SQL layer đều ghi một file log riêng chứa các thông tin về hoạt động của nó và hệ thống, từ khởi động, dừng đến các câu lệnh DDL hay các lỗi gặp phải. File log giúp chúng ta có thể biết thêm thông tin khi có lỗi truy vấn từ ứng dụng hay khi môi trường dòng lệnh không cung cấp đủ thông tin để tìm ra lỗi. Trên môi
trường windows thì log file thường nằm ở thư mục:
C:\ProgramData\foundationdb\sql\
2.2.7 Gỡ bỏ SQL Layer
Để gỡ bỏ SQL layer trên windows chúng ta sử dụng trình quản lý chương trình trong control panel.
2.2.8 Nâng cấp
Để nâng cấp SQL layer thì chúng ta cần thực hiện theo các bước sau: Ghi chú lại phiên bản SQL layer đang dùng.
Dừng dịch vụ SQL layer.
Tạo một bản sao lưu dữ liệu của SQL layer. Nâng cấp SQL layer.
2.3 Xây dựng ứng dụng tích hợp với SQL Layer[4]
2.3.1 Kiểu dữ liệu
SQL layer cung cấp đầy đủ các kiểu dữ liệu mà một CSDL quan hệ truyền thống vốn có:
Tên Mục Chi tiết
BIGINT Số chinh xác 9223372036854775808+92233720368547 75807.
BLOB Chuỗi byte Đối tượng byte lớn.
BOOLEAN Logic True/false.
CHAR[(length)][CHARAC
TERSETcs][COLLATEco] Chuỗi ký tự Chuỗi ký tự cố định độ dài CHAR[(length)]FORBITD
ATA Chuỗi byte Chuỗi byte cố định độ dài CLOB Chuối ký tự Chuỗi ký tự lớn
Tên Mục Chi tiết
DATETIME Ngày/thời gian (YYYY-MM-DD HH:MM:SS). DECIMAL[(precision[,scale
])] Số chính xác
DOUBLE Số gần đúng 1e-307 đến 1e+308
GUID Chuỗi byte
INT Số chính xác 2147483648 đến +2147483647. REAL Số chính xác 1e-37 đến 1e+37
TIME Thời gian (HH:MM:SS)
VARCHAR(length)[CHAR ACTERSETcs][COLLATE co]
Chuỗi ký tự
VARCHAR(length)
FORBITDATA Chuỗi byte
2.3.2 Truy cập với SQL
SQL layer hỗ trợ đầy đủ các câu lệnh DDL, DML của các CSDL quan hệ truyền thống: DDL o ALTER GROUP o ALTER TABLE o CREATE FUNCTION o CREATE INDEX o CREATE PROCEDURE o CREATE SCHEMA o CREATE SEQUENCE o CREATE TABLE o CREATE VIEW o DROP FUNCTION
o DROP GROUP o DROP INDEX o DROP PROCEDURE o DROP SCHEMA o DROP SEQUENCE o DROP TABLE o DROP VIEW o RENAME TABLE o TRUNCATE TABLE DML o DELETE o INSERT o SELECT o SELECT (Nested) o UPDATE
2.3.2.1 Tạo bảng và truy vấn dữ liệu
Chúng ta sẽ sử dụng công cụ fdbsqlcli có sẵn của SQL layer để chạy các câu lệnh SQL và xem kết quả: CREATETABLEcustomers ( customer_idINTNOTNULLPRIMARYKEY, rand_idINT, nameVARCHAR(20), customer_infoVARCHAR(100), birthdateDATE, INDEX(birthdate) ); ROWS:0
INSERTINTOcustomersVALUES(1,96,'Jim Gray','lost at sea','1944- 01-12');
ROWS:1
Truy vấn dữ liệu:
SELECT*FROMcustomers;
customer_id|rand_id|name|customer_info|birthdate
---+---+---+---+---
1|96|JimGray|lostatsea|1944-01-12
(1row)
Để xem cấu trúc của bảng dữ liệu vừa tạo:
\dt customers
Tablegetting_started.customers Column|Type|Nullable
---+---+---
customer_id|INT|NO rand_id|INT|YES
name|VARCHAR(20)|YES
customer_info|VARCHAR(100)|YES birthdate|DATE|YES
(5rows)
PRIMARY(customer_id) birthdate(birthdate)
2.3.2.2 Tạo chỉ mục(index)
Như các hệ quản trị CSDL khác, SQL layer dựa vào chỉ mục(index) để tối ưu hiệu năng, có bốn loại chỉ mục:
Single table index là loại chỉ mục thường thấy trên một bảng có thể chứa một hoặc nhiều cột.
Trong các hệ quản trị CSDL quan hệ thông thường các chỉ mục được định nghĩa trên một hay nhiều cột của một bảng. VD:
CREATETABLEcustomers ( customer_idINTNOTNULLPRIMARYKEY, rand_idINT, nameVARCHAR(20), customer_infoVARCHAR(100), birthdateDATE, INDEX(birthdate) ); Tạo một chỉ mục:
CREATEINDEXidx_customers_birthdateONcustomers(birthdate);
Loại bỏ chỉ mục:
DROPINDEXcustomers.idx_customers_birthdate;
Table-Group indexes mở rộng cho phép chứa các cột ở các bảng khác nằm trong cùng một nhánh của nhóm bảng (Table-Group).Trong các hệ quản trị CSDL truyền thống không thể định nghĩa một chỉ mục trên nhiều bảng. Tuy nhiên trong SQL layer các dòng dữ liệu của bảng cùng một nhóm được lưu trữ
theo cụm cùng nhau trong KVS. Do đó chúng ta có thể tạo chỉ mục chứa dữ liệu từ nhiều dòng.
Chương 2: Hình 2: ví dụ đánh chỉ mục nhóm
Trên hình ví dụ chúng ta có 2 nhánh customers---addresses và customers---orders---items. Do đó chúng ta có thể tạo table-group indexes như sau:
o Customers-Addresses (customers-->addresses branch) o Customers-Orders (customers-->orders--->items branch) o Customers-Orders-Items (customers-->orders--->items branch) o Customers-Items (customers-->orders--->items branch)
Câu lệnh tạo chỉ mục:
CREATEINDEXidxONtbl(tbl.col)USING<LEFT|RIGHT>JOIN
Full-text indexes cung cấp khả năng tìm kiếm trên toàn bộ đoạn văn bản dựa vào SQL.
2.3.3 Thủ tục và hàm
2.3.3.1 Functions được xây dựng sẵn của SQL layer
SQL layer đã xây dựng sẵn rất nhiều hàm giúp nhà phát triển có thể tương tác tốt hơn với dữ liệu, dưới đây là một số hàm thường dùng:
Tên Hàm Mô tả
abs(numeric) Absolute value.
adddate(d datetime, n numeric) Add n days to d.
addtime(t time, n numeric) Add n seconds to t.
avg(numeric) (Aggregate) Average of all input values. curdate Current date. (alias for current_date) current_date Current date.
current_schema Current schema.
current_session_id() Session ID of the current connection. current_setting(string) Value of the given property.
current_time Current time. current_timestamp Current timestamp.
current_user User name of the current connection. date(datetime) Extract the date portion of a datetime. date_add(x datetime, i interval) Add an interval to a datetime.
date_format(d date, formatstrin
g) Format a date as the given string. date_sub(d datetime, i interval) Subtract an interval from a datetime. datediff(x datetime, y datetime) Number of days between two days. datetime(datetime) Extract datetime.
day(datetime) Day from a date. dayname(date) Name of the weekday.
dayofmonth(datetime) Day from a date. (alias for day) dayofweek(datetime) Day of the week in range 1 to 7. dayofyear(datetime) Day of the year in range 1 to 366. degrees(double) Convert radians to degrees.
describe_expression(expression
) String representation of the return type for e. if(x boolean, a any, b any) Output a if x is true, otherwise b.
ifnull(x any, y any) Output y if x is NULL, otherwise x.
ilike(s string, pattern string[,esc
ape string]) Match pattern against s case-insensitively. inet_aton(string) Numeric value of an IPv4 address.
isfalse(boolean) Check if false. iregex(s string, pattern string,[o
ptions string])
Find if pattern regular expression is in s string, using options for regex matching, and case-insensitive
match.
isnull(any) Check if NULL. istrue(boolean) Check if true.
isunknown(boolean) Check if unknown (i.e. null).
last_day(date) Last day of the month for month of a date.