Amazon SDB là một khung làm việc truy vấn và chỉ số hóa tập dữ liệu theo thời gian thực một cách nhanh chóng và có thể mở rộng được, nó làm cho việc truy xuất dữ liệu có cấu trúc từ các ứng dụng dựa trên Amazon Web Services trở nên dễ dàng. Nó được thiết kế để làm việc tốt với các dịch vụ khác của Amazon Web Services, như là điện toán đám mây mềm dẻo (Elastic Compute Cloud - EC2) và dịch vụ lưu trữ đơn giản (Simple Storage Service - S3). SDB cho phép bạn xây dựng các ứng dụng tương tác với nhau trong môi trường Amazon Web Services. Bạn chỉ phải thanh toán phí cho dịch vụ mà bạn đã thực sự sử dụng. Một số lớp dịch vụ là miễn phí.
Một số tính năng đáng giá cung cấp bởi SDB:
- Tính tin cậy
- SDB được thiết kế để lưu trữ dữ liệu được đánh chỉ số của bạn một cách dư thừa xuyên qua các trung tâm dữ liệu để làm cho chúng sẵn sàng tại mọi thời điểm.
- Tốc độ
- SDB được thiết kế để cung cấp truy xuất dữ liệu nhanh, đặc biệt nếu các yêu cầu của bạn được tạo ra từ một thể hiện EC2 trong môi trường Amazon Web Services.
- Tính đơn giản
- Mô hình lập trình cho việc truy cập và sử dụng SDB rất đơn giản và có thể được sử dụng từ rất nhiều ngôn ngữ lập trình khác nhau.
- Bảo mật
- SDB được thiết kế để cung cấp độ bảo mật cao. Chỉ có những người dùng được chứng thực mới có thể truy cập tới dữ liệu.
- Tính mềm dẻo
- SBD cung cấp khả năng để lưu trữ dữ liệu ngay trong quá trình xử lý mà không cần bất cứ lược đồ được định nghĩa trước nào.
- Giá rẻ
- Phí sử dụng SDB rất kinh tế. Bạn chỉ phải trả cho những gì bạn thực sự dùng.
Phần còn lại của bài này khám phá các khái niệm nền tảng của SDB.
Một miền (domain) là một thùng chứa mà giúp bạn lưu trữ dữ liệu có cấu trúc của bạn và thực hiện các truy vấn trên chúng. Dữ liệu được lưu trữ trong một miền như các phần tử (item). Một cách khái niệm, một miền giống như một bảng làm việc trong một bảng tính; các phần tử là các dòng trong bảng tính. Bạn có thể thực thi các truy vấn trên một miền, nhưng bạn chưa thể truy vấn liên thông giữa các miền với phiên bản hiện tại của SDB.
Mỗi miền có những dữ liệu thông tin sau đính kèm với nó:
- Ngày và giờ mà dữ liệu thông tin được cập nhật lần cuối
- Số các phần tử trong một miền
- Số các cặp tên thuộc tính-giá trị (attribute name-value) trong miền
- Số các tên thuộc tính duy nhất trong miền
- Tổng kích thước của tất cả các tên phần tử trong miền, theo bytes
- Tổng kích thước của tất cả các giá trị thuộc tính, theo bytes
- Tổng kích thước của tất cả các tên thuộc tính duy nhất, theo bytes
SDB, giống như Simple Queue Service (SQS), tuân theo mô hình "bền vững cuối cùng (eventual consistency)". SDB duy trì nhiều bản sao của mỗi miền để tránh bị lỗi. Mọi thay đổi trên một miền sẽ được lan truyền liên thông qua tất cả các bản sao.
Vì thao tác này đôi khi mất vài giây để thực hiện, tùy theo trạng thái của hệ thống và mạng, có thể một ứng dụng của bạn sẽ không thấy các thay đổi ngay lập tức. Các thay đổi cuối cùng cũng sẽ được lan truyền trong SDB, nhưng bạn phải thận trọng cân nhắc sự chậm trễ này khi thiết kế các ứng dụng dựa trên SDB.Các phần tử biểu diễn các đối tượng riêng lẻ trong các miền của bạn, và chúng chứa các thuộc tính với các giá trị. Về mặt khái niệm, mỗi phần tử là giống với một dòng trong một bảng tính — một thuộc tính là một cột và các giá trị là các ô. Các thuộc tính có thể có nhiều giá trị chứ không nhất thiết phải là một giá trị đơn. SDB tự động chỉ số hóa các miền của bạn mà không quan tâm đến cấu trúc dữ liệu của bạn.
SBD cũng có giới hạn thời gian cho việc thực thi một truy vấn đơn lẻ trên các miền của bạn. Nếu một truy vấn vượt quá 5 giây, SDB sẽ dừng truy vấn và trả lại một lỗi.
Các miền trong SDB rất mềm dẻo và không có bất kỳ lược đồ cố định nào. Mỗi phần tử trong một miền có thể chứa một tập duy nhất lên tới 256 thuộc tính. Các thuộc tính có thể khác với các thuộc tính trong cùng một phần tử hoặc khác phần tử trong miền đó.
Phiên bản hiện tại của SDB có các giới hạn mà bạn nên cân nhắc khi thiết kế ứng dụng của bạn. Bảng 1 chỉ ra các giới hạn đó (như được chỉ ra trong tài liệu mới nhất bởi Amazon).
Bảng 1. Các giới hạn hiện tại
| Tham số | Sự hạn chế hiện tại |
|---|---|
| Kích thước miền | 10 GB cho một miền 250,000,000 cặp tên thuộc tính-giá trị 3-255 ký tự (a-z, A-Z, 0-9, '_', '-', và '.') |
| Số miền cho một tài khoản Amazon Web Services | 100 |
| Các thuộc tính | Cặp tên-giá trị cho một phần tử là
256. Độ dài tên là 1024 bytes. Độ dài giá trị là 1024 bytes. Chỉ các ký tự được phép là các ký tự UTF-8 mà có hiệu lực trong các tài liệu XML. Các ký tự điều khiển và bất cứ chuỗi nào mà không hiệu lực trong XML đều không được phép. Thao tácPutAttributes bị giới hạn tới 100Thao tác Select hoặc QueryWithAttributes bị giới
hạn tới 256. |
| Số phần tử tối đa trong kết quả truy vấn | 256 |
| Thời gian thực hiện truy vấn tối đa | 5 giây |
| Số vị ngữ tối đa cho một biểu thức truy vấn | 10 |
| Số phép so sánh tối đa cho một vị ngữ của biểu thức truy vấn | 10 |
| Số tối đa của các thuộc tính duy nhất trên một biểu thức lựa chọn | 20 |
| Số tối đa của các phép so sánh trên một biểu thức lựa chọn | 20 |
Kích thước trả về tối đa cho một QueryWithAttributes và Select | 1 MB |
Amazon cung cấp một "cấp miễn phí" cho SDB, cùng với giá cho việc sử dụng khi vượt quá giới hạn của cấp miễn phí. Phí được dựa trên:
- Lượng dùng của mối yêu cầu SDB.
- Dung lượng của khả năng của máy được sử dụng cho việc hoàn thành yêu cầu cụ thể, chuẩn hóa với khả năng theo giờ của một bộ xử lý Xeon 1.7-GHz.
25 giờ dùng máy đầu tiên, 1 GB dữ liệu luân chuyển, và 1 GB của kho lưu trữ mà bạn tiêu thụ mỗi tháng là miễn phí ít nhất là đến 01 tháng 6 năm 2009. Đây là một khối lượng đáng kể của lượng sử dụng được cung cấp miễn phí cho một giới hạn thời gian bởi Amazon. Rất nhiều kiểu ứng dụng có thể hoạt động một cách dễ dàng trong giới hạn miễn phí này. Bảng 2 chỉ ra ví dụ về giá.
Bảng 2. Giá cho việc sử dụng máy
| Số lượng | Giá |
|---|---|
| 25 giờ máy đầu tiên | Miễn phí |
| Các giờ máy tiếp theo | $0.14 cho một giờ máy |
Bảng 3 chỉ ra lượng dữ liệu luân chuyển đến và đi từ SDB. Dữ liệu luân chuyển giữa SDB và các dịch vụ khác của Amazon Web Services trong cùng một vùng là miễn phí. Dữ liệu luân chuyển liên vùng giữa SDB và các dịch vụ khác của Amazon Web Services sẽ bị tính phí với giá chuyển dữ liệu qua internet (Internet Data Transfer) trên cả hai phía.
Bảng 3. Phí truyền dữ liệu
| Kiểu truyền | Giá |
|---|---|
| Tất cả dữ liệu | 1 GB dữ liệu đầu tiên truyền
đến là miễn phí $0.100 cho 1 GB — dữ liệu phụ trội truyền đến 1 GB dữ liệu đầu tiên truyền đi là miễn phí $0.170 cho 1 GB — của 10 TB dữ liệu đầu tiên trong tháng truyền đi $0.130 cho 1 GB — của 40 TB dữ liệu tiếp theo trong tháng truyền đi $0.110 cho 1 GB — của 100 TB dữ liệu tiếp theo trong tháng truyền đi $0.100 cho 1 GB — dữ liệu truyền đi trong tháng vượt quá 150 TB |
Bảng 4 phác thảo giá cho việc lưu trữ dữ liệu có cấu trúc.
Bảng 4. Lưu trữ dữ liệu có cấu trúc
| Khối lượng lưu trữ | Giá |
|---|---|
| Tất cả dữ liệu lưu trữ | 1 GB đầu tiên của dữ liệu là miễn
phí. $0.25 cho 1 GB / tháng - tất cả dữ liệu phụ trội |
Để biết bảng giá mới nhất, xem Amazon SDB. Bạn cũng có thể sử dụng Simple Monthly Calculator được cung cấp bởi Amazon để tính phí sử dụng hàng tháng của bạn cho SDB và các dịch vụ khác của Amazon.
Để bắt đầu khám phá SDB, bạn cần đăng ký một tài khoản của Amazon Web Services (xem Tài nguyên). Xem Phần 2 của loạt bài này để biết chi tiết cách đăng ký. Khi bạn đã có tài khoản của Amazon Web Services, bạn phải kích hoạt dịch vụ SDB cho tài khoản của bạn:
- Đăng nhập vào tài khoản Amazon Web Services của bạn.
- Tìm tới trang chủ SDB.
- Nhấn Đăng ký cho dịch vụ Web này (Sign Up For This Web Service) nằm ở bên phải.
- Cung cấp thông tin cần thiết và hoàn tất quá trình đăng ký.
Tất cả các giao tiếp với với bất kỳ dịch vụ nào của Amazon Web Services đều thông qua hoặc giao diện SOAP hoặc giao diện truy vấn. Trong bài viết này, bạn dùng giao diện truy vấn thông qua thư viện của bên thứ ba để giao tiếp với SDB.
Bạn sẽ cần các khóa truy cập, cái mà bạn có thể lấy từ trang thông tin tài khoản cá nhân bằng cách chọn Xem định danh khóa truy cập (Access Key Identifiers). Bây giờ bạn đã sẵn sàng để sử dụng Amazon Web Services và đã kích hoạt dịch vụ SDB cho tài khoản của bạn.
Trong ví dụ này, bạn sử dụng một thư viện Python mã mở của bên thứ ba tên là boto để làm quen với SDB bằng cách thực thi các đoạn mã nhỏ trong cửa sổ lệnh Python.
Cài đặt boto và thiết lập môi trường của bạn
Tải boto.
Phiên bản mới nhất, khi viết bài này, là 1.6b. Giải nén vào một thư mục
tùy ý. Chuyển thư mục làm việc tới nó và thực thi setup.py để cài đặt boto vào môi trường Python của bạn, như
trong Ví dụ
1.
Ví dụ 1. Cài đặt boto
$ cd directory_where_you_unzipped_boto $ python setup.py install |
Thiết lập các biến môi trường để trỏ tới các khóa truy cập Amazon Web Services. Các khóa có sẵn trên trang thông tin tài khoản Web Services Account.
Ví dụ 2. Thiết lập các biến môi trường
# Export variables with your AWS access keys $ export AWS_ACCESS_KEY_ID=Your_AWS_Access_Key_ID $ export AWS_SECRET_ACCESS_KEY=Your_AWS_Secret_Access_Key |
Đảm bảo mọi thứ được thiết lập một cách đúng đắn bằng bách bắt đầu một của sổ lệnh Python và nhập thư viện boto, như trong Ví dụ 3.
Ví dụ 3. Kiểm tra cài đặt
$ python Python 2.4.5 (#1, Apr 12 2008, 02:18:19) [GCC 4.0.1 (Apple Computer, Inc. build 5367)] on darwin Type "help", "copyright", "credits" or "license" for more information. > import boto > |
Sử dụng lớp
SDBConnection để cung cấp giao diện chính
cho việc tương tác với SDB. Bạn sẽ sử dụng boto từ cửa sổ lệnh Python. Ví
dụ gọi các phương thức khác nhau trên đối tượng SDBConnection và kiểm tra phản hồi trả về bởi SDB, cái mà sẽ
giúp bạn làm quen với API trong khi bạn khám phá các khái niệm đằng sau
SDB.
Bước đầu tiên là tạo một đối tượng kết nối tới SDB bằng cách sử dụng các khóa truy cập Amazon Web Services bạn đã nhập vào môi trường của bạn. Thư viện boto luôn kiểm tra môi trường trước tiên để xem nếu các biến đó có tồn tại không. Nếu có, boto tự động sử dụng chúng khi tạo kết nối.
Ví dụ 4. Tạo một kết nối tới SDB
> import boto > sdb_conn = boto.connect_sdb() > |
Trong
phần còn lại của bài viết này, bạn có thể sử dụng đối tượng sdb_conn, được tạo ở trên, để tương tác với SDB.
Bạn có thể tạo các miền mới bằng cách chỉ ra một tên cho miền.
Ví dụ 5. Tạo một miền
> d1 = sdb_conn.create_domain('devworks-dom-1')
>
|
Lấy danh sách tất cả các miền, cái mà trả lại một đối tượng tập kết quả mà là một danh sách của Python, như trong Ví dụ 6. Bạn có thể duyệt qua danh sách này và truy cập tới từng miền.
Ví dụ 6. Liệt kê tất cả các miền
> all_domains = sdb_conn.get_all_domains() > > len(all_domains) 1 > > for d in all_domains: ... print d.name ... devworks-dom-1 |
Bạn cũng có thể lấy một miền đơn lẻ bằng tên của nó.
Ví dụ 7. Liệt kê một miền đơn
> my_domain = sdb_conn.get_domain('devworks-dom-1')
>
> print my_domain.name
devworks-dom-1
|
Các miền mới khởi tạo đương nhiên là rỗng cho đến khi bạn thêm các phần tử vào. Bạn tạo một phần tử mới trong một miền, sau đó thêm các thuộc tính vào.
Ví dụ 8. Tạo mới một phần tử
> my_domain = sdb_conn.get_domain('devworks-dom-1')
>
> i1 = my_domain.new_item('test_item_1')
>
> i1['cars'] = 'BMW'
>
> i1['fruits'] = ['apple', 'orange', 'mango']
>
|
Các phần tử có thể lấy được từ một miền bằng cách chỉ rõ tên phần tử, tên phần tử phải là duy nhất. Nó tương tự như khái niệm khóa chính trong một cơ sở dữ liệu quan hệ.
Ví dụ 9. Lấy một phần tử và các thuộc tính của nó
> my_item = my_domain.get_item('test_item_1')
>
> print my_item
{u'cars': u'BMW', u'fruits': [u'apple', u'mango', u'orange']}
>
|
Đối
tượng phần tử được trả lại ở trên là một đối tượng Item mà sẽ tự động lấy tất cả các thuộc tính của phần tử này
từ SDB khi bạn truy cập bất cứ một thuộc tính nào của nó. Bất cứ cập nhật
nào trên các giá trị của các thuộc tính của đối tượng này sẽ được lưu trữ
một cách tự động trong
SDB.
Ví dụ 10. Cập nhật thuộc tính
> my_item['cars'] u'BMW' > > my_item['cars'] = 'Honda' > > my_item['cars'] 'Honda' > |
Bạn
cũng có thể lấy các phần tử và các thuộc tính bằng cách sử dụng lớp SDBConnection và chỉ rõ miền và các tên phần tử.
Ví dụ 11. Lấy một phần tử bằng cách sử dụng lớp
SDBConnection
>
> sdb_conn.get_attributes('devworks-dom-1','test_item_1')
{u'cars': u'Honda', u'fruits': [u'apple', u'mango', u'orange']}
>
|
Một phần tử bị xóa một cách tự động bởi SDB nếu nó không có bất kỳ một thuộc tính nào. Bạn cũng có thể xóa một phần tử cụ thể và các thuộc tính của nó.
Ví dụ 12. Xóa một phần tử và các thuộc tính của nó
> sdb_conn.get_attributes('devworks-dom-1','test_item_1')
{u'cars': u'Honda', u'fruits': [u'apple', u'mango', u'orange']}
>
> sdb_conn.delete_attributes('devworks-dom-1','test_item_1')
True
> sdb_conn.get_attributes('devworks-dom-1','test_item_1')
{}
>
|
Ví dụ 13. Xóa một miền
> sdb_conn.delete_domain('devworks-dom-1')
True
>
|
Để tìm kiếm dữ liệu có cấu trúc của bạn, SDB cung
cấp một ngôn ngữ truy vấn tùy biến mà chứa các cặp tên thuộc tính-giá trị
gắn với các phần tử. Thành phần cơ bản khi tạo dựng một biểu thức truy vấn
được gọi là một vị ngữ (predicate). Mỗi vị ngữ được chỉ ra bởi một
ngoặc vuông mà bao quanh một thuộc tính, một toán tử so sánh, và một giá
trị để so sánh. Ví dụ, một vị ngữ, (như là ['desc' =
'Hello Devworks']) xác định một so sánh bằng và tạo ra một tập
các tên phần tử. Bạn có thể kết hợp nhiều vị ngữ bằng cách sử dụng các
toán tử như là union và intersection để xây dựng các truy vấn phức tạp.
Khi sử dụng các vị ngữ trong truy vấn của bạn, đặc biệt chú ý rằng tất cả các vị ngữ so sánh được thực hiện theo thứ tự từ điển của SDB. Bạn phải đảm bảo rằng dữ liệu của bạn được lưu trữ trong các thuộc tính bằng cách sử dụng sự biểu hiện chuỗi ký tự tương ứng. Lưu ý rằng các truy vấn kéo dài hơn 5 giây sẽ bị hủy bỏ bởi SDB.
Ví dụ 14. Tạo dữ liệu thử nghiệm
> d2 = sdb_conn.create_domain('devworks-dom-2')
>
> i1 = d2.new_item('car1')
>
> i1['make']= 'BMW'
> i1['color']='grey'
> i1['year']='2008'
> i1['desc']='Sedan'
> i1['model']='530i'
>
> i2 = d2.new_item('car2')
>
> i2['make']= 'BMW'
> i2['color']='white'
> i2['year']='2007'
> i2['desc']='Sports Utility Vehicle'
> i2['model']='X5'
>
|
Ví dụ 15. Truy vấn với một vị ngữ đơn
> rs = d2.query("['make' = 'BMW']")
> for result in rs:
... print result.name
...
car1
car2
>
|
Ví dụ 16. Truy vấn với nhiều vị ngữ
> rs = d2.query("['make' = 'BMW'] intersection ['year' = '2007']")
> for result in rs:
... print result.name
...
car2
>
|
Ngôn ngữ truy vấn cung cấp sự hỗ trợ cho nhiều toán tử so sánh. Nó giúp bạn thực hiện các truy vấn rộng và các truy vấn thuộc tính đa giá trị. Để nắm bắt được tất cả các khả năng và trải nghiệm tốt nhất cho việc tạo các truy vấn và cải tiến chúng để có được sự tối ưu, bạn nên xem các bài viết giới thiệu về ngôn ngữ truy vấn được cung cấp bởi Amazon Web Services.
Bạn cũng có thể lấy được các dữ liệu thông tin cho một miền cái mà cho bạn biết tổng số các phần tử trong miền (bên cạnh các dữ liệu khác).
Ví dụ 17. Dữ liệu thông tin cho một miền
> my_domain = sdb_conn.get_domain('devworks-dom-2')
>
> my_metadata = my_domain.get_metadata()
>
> print my_metadata.item_count
2
> print my_metadata.item_names_size
8
> print my_metadata.attr_value_count
10
> print my_metadata.attr_names_size
22
> print my_metadata.attr_values_size
56
> print my_metadata.timestamp
1231798889
>
|
Bài viết này đã giới thiệu với bạn dịch vụ SDB của Amazon. Bạn đã tìm hiểu một số khái niệm cơ bản và đã khám phá một số hàm chức năng được cung cấp bởi boto, một thư viện Python mã mở để tương tác với SDB.
Học tập
- Khám phá tại sao điện toán đám mây lại
quan trọng, cách bắt đầu, và nơi bạn có thể tìm hiểu thêm về nó tại
developerWorks Cloud computing
space.
- Xem các phần khác trong loạt bài "Điện toán đám mây với Amazon Web
Services":
- Phần 1, "Giới thiệu - Khi nào thì quyết định đi thuê tốt hơn đi mua"
- Phần 2, "Lưu trữ trong đám mây với Amazon Simple Storage Service (S3)"
- Phần 3, "Các máy chủ theo yêu cầu với EC2"
- Phần 4, "Truyền tin tin cậy với SQS"
- Tìm hiểu về đặc trưng của Amazon Web
Services:
- Amazon Simple Storage Service (S3)
- Amazon Elastic Compute Cloud (EC2)
- Amazon Simple Queue Service (SQS)
- Amazon SimpleDB (SDB)
- Service Health Dashboard được cập nhật bởi nhóm Amazon và cung cấp các thông tin mới nhất về trạng thái các dịch vụ.
- Các thay đổi mới nhất trong thế giới Amazon Web Services có trên blog.
-
Đăng ký tài khoản Amazon Web Services.
-
Developer Connection của Amazon Web Services là cổng truy cập tất
cả các tài nguyên cho các nhà phát triển.
-
SDB Technical Resources có tài liệu kỹ thuật, hướng dẫn dùng, và
các bài viết khác đáng lưu ý cho các nhà phát triển.
-
Amazon SimpleDB Developer Guide chứa thông tin về các thành phần
khác nhau của SDB, và cách sử dụng và cấu hình nâng cao.
- Với bài hướng dẫn "Query 101: Building Amazon SimpleDB Queries" tìm hiểu về việc xây
dựng các truy vấn Amazon SimpleDB bằng cách dạo qua một số các ví dụ thực
tế.
- Với bài hướng dẫn "Query 201: Tips & Tricks for Amazon SimpleDB Query" tìm hiểu
về việc xây dựng các truy vấn hiệu quả, bao gồm truy vấn cho ngày tháng,
sử dụng phủ định, và cải tiến hiệu suất truy vấn của bạn.
- Sử dụng Simple Monthly
Calculator để tính chi phí sử dụng hàng tháng của bạn cho EC2 và
các dịch vụ khác của Amazon Web Services.
Lấy sản phẩm và công nghệ
- Truy cập các sản phẩm phần mềm của
IBM trong môi trường ảo Amazon Elastic Compute Cloud (EC2) và bắt
đầu phát triển các ứng dụng của bạn.
Thảo luận
- Xem qua developerWorks
blogs và tham gia vào cộng đồng
developerWorks.

Prabhakar Chaganti là CTO của Ylastic, là người đầu tiên thực hiện xây dựng một giao diện thống nhất cho các nhà kiến trúc sư, nhà quản lý và người giám sát của môi trường điện toán đám mây AWS: EC2, S3, SQS và SimpleDB. Ông cũng là tác giả của hai trong số các cuốn sách được xuất bản gần đây, là Xen Virtualization và GWT Java AJAX Programing. Đồng thời ông cũng giành được giải thưởng cao nhất cho hầu hết các sáng tạo ứng dụng máy ảo trong VMware Global Virtual Appliance Challenge