Là một cơ sở dữ liệu nguồn mở với giấy phép Apache 2.0, nhƣ cassandra, là một hệ quản trị dữ liệu theo dạng key-value đƣợc tối ƣu cho việc lƣu trữ dữ liệu tƣơng tác với các ứng dụng web.Các ứng dụng đó phải phục vụ rất nhiều ngƣời dùng đồng thời: tạo, lƣu trữ thu hồi, tập hợp, thao tác và trình bày dữ liệu.Membase đƣợc thiết kế để cung cấp một cách đơn giản, nhanh chóng và dễ dàng để mở rộng dữ liệu key-value với độ trễ thấp và băng thông cao.Nó đƣợc thiết kế để phân cụm thành một máy tính duy nhất để triển khai qui mô lớn.
Membase đƣợc viết bằng C và Erlang tƣơng thích với memcache nhƣng có khả năng lƣu trữ lâu bền và phân tán.Với tốc độ thực thi rất nhanh (hơn 200 ngàn bản ghi / giây) bằng cách truy xuất dữ liệu bằng khóa và trên ram.Với việc truy xuất trên Ram thì hầu hết việc truy suất các toán tử đều đƣợc thực thi trong khoảng thời gian ít hơn 1ms..Ngoài ra còn cung cấp việc lƣu trữ dữ liệu lâu bền trên đĩa
Membase đƣợc sử dụng tốt nhất cho các ứng dụng yêu cầu tuy xuất dữ liệu với độ trễ cực thấp, tính đồng nhất cao và khả năng mở rộng cao.Ví dụ nhƣ các chƣơng trình gaming online, rất cần độ trễ truy xuất thấp
20
Chƣơng 3 TÌM HIỂU VỀ COUCHDB 3.1. CouchDB là gì
CouchDB là một hệ quản trị cơ sở dữ liệu NoSQL lƣu trữ theo hƣớng văn bản, nguồn mở, truy cập bằng cách sử dụng hệ thống hàm (API) bằng JSON RESTful, có khả năng khả chuyển cao trong việc tƣơng tác dữ liệu giữa các nút.Điều này khiến cho nó rất thích hợp trong các trƣờng hợp liên quan đến việc thống nhất và bền vững dữ liệu.Việc tích hợp các bản sao (ở đây là các view) làm cho nó là nền tảng lý tƣởng cho việc đồng bộ hóa dữ liệu giữa điện thoại di động, máy tính và máy chủ.Couchdb không có mô hình cố định.Thay vào đó nó lƣu trữ các bản ghi (hay văn bản) theo định dạng JSON, khá nhẹ và dễ hiểu cấu trúc dữ liệu, rất thích hợp cho việc lƣu trữ dữ liệu.
Thuật ngữ "Couch" là từ viết tắt của "Cluster Of Unreliable Commodity Hardware"(dịch là ) đã phản ánh mục tiêu của CouchDB là một cơ sở dữ liệu có khả năng mở rộng cực tốt, đƣa ra tính sẵn sàng và độ tin cậy cao ngay cả khi chạy trên phần cứng mà thƣờng dễ hỏng hoặc lỗi.
3.2. Lịch sử CouchDB
CouchDB ban đầu đƣợc viết bằng C++ bởi Damien Katz, trƣớc đây là làm ngƣời trong nhóm phát triển Lotus notes của IBM.Ban đầu nó ở dƣới dạng nguồn mở với giấy phép GNU ( GNU Genaral Public License).
Nhƣng vào tháng 2 năm 2008 thì nó đã trở thành một dự án của Apache và giấy phép đƣợc chuyển thành giấy phép Apache License.Nó cũng đƣợc chuyển sang nền tảng ErLang OTP với thiết kế nhằm việc tăng cƣờng khả năng chịu lỗi.
Vào đầu tháng 12 nhà sáng lập Damien Katz chuyển sang tập trung cho dự án CouchBase, về bản chất là CouchDB + membase.Đầu tháng 4 thì phiên bản CouchDB 1.2 đã ra đời với rất nhiều cải tiến mới về tốc độ thực thi và nhiều tính năng nổi bật khác.
3.3. Các đặc điểm của CouchDB
Là một cơ sở dữ liệu NoSQL, CouchDB cũng có các đặc điểm của một NoSQL nhƣ khả năng mở rộng, tốc độ cao.Ngoài ra CouchDB còn có các đặc điểm riêng sau
21
3.3.1. Document storage
Một máy chủ CouchDB chứa các cơ sở dữ liệu lƣu các văn bản.Mỗi văn bản là duy nhất trong cơ sở dữ liệu và CouchDB cung cấp một thƣ viện hàm RESTful HTTP cho việc đọc và cập nhât (Thêm, xóa, sửa) các văn bản.
CouchDB lƣu dữ liệu ở dạng văn bản với một hoặc nhiều cặp giá trị key/value bằng JSON.Các giá trị của trƣờng có thể đơn giản nhƣ là kiểu chuỗi, kiểu số hoặc ngày tháng, cũng có thể phức tạp hơn nhƣ kiểu danh sách thứ tự hoặc không thứ tự, hoặc là một mảng liên kết.Mỗi một văn bản trong cơ sở dữ liệu CouchDB có một ID duy nhất và không cần có cấu trúc.Tức là các văn bản(bản ghi) không cần phải tuân theo một cấu trúc nhƣ bắt buộc phải có một trƣờng nào đó và có thể thêm các trƣờng đặc biệt khác mà không phụ thuộc các bản ghi khác nhƣ bên RDBMs.
CouchDB .Văn bản thay đổi bởi các ứng dụng client theo trình tự nhƣ sau.Các ứng dụng client tải văn bản cần dùng, sử dụng chúng bằng cách tƣơng tác nó, sau đó là lƣu chúng vào cơ sở dữ liệu.Nếu có một máy khách khác cũng sửa cùng văn bản đó và lƣu thay đổi của họ trƣớc thì client sẽ nhận một thông báo lỗi vì xung đột không lƣu đƣợc.Để giải quyết xung đột này, thì phiên bản văn bản mới nhất sẽ đƣợc mở sửa lại một lần nữa và cố gắng cập nhật lại.
Việc cập nhật cho các văn bản là hoàn toàn.Tức là nếu đã cập nhật hoặc là cập nhật thành công hoặc là không đƣợc cập nhật.CouchDB không cho phép việc cập nhật văn bản một phần.
3.3.2. Map/Reduce Views và Indexes
Dữ liệu đƣợc lƣu trữ có cấu trúc sử dụng các views.Trong CouchDB, vỡi mỗi một view thì đƣợc cấu trúc bởi một hàm Javascript mà có nhiệm vụ ánh xạ (Map) các giá trị và ghép các giá trị (reduce) đó lại thành một văn bản duy nhất.CouchDB có thể đánh chỉ mục views và thực hiện các tác vụ y nhƣ với các văn bản khác nhƣ cập nhật(update), thêm(add), xóa(delete).
3.3.3. Kiến trúc phân tán với việc nhân bản [10] [11]
CouchDB là một mạng ngang hàng dựa trên hệ thống cơ sở dữ liệu phân tán.Bất cứ một máy nào trong các máy dùng CouchDB(Máy chủ và các máy client) đều có một "nhân bản" cơ sở dữ liệu độc lập, mà các ứng dựng tƣơng tác đầy đủ với cơ sở dữ liệu (truy vấn, thêm xóa sửa).Khi các ứng dụng kết nối lại (online) hoặc theo một chu kỳ, thì
22
dữ liệu sẽ đƣợc đồng bộ 2 chiều.Rất thích hợp với các ứng dụng web hiện nay.Ví dụ nhƣ google docs.Bạn có thể soạn thảo offline khi không kết nối mạng.Khi kết nối mạng.Thì sẽ đồng bộ lại dữ liệu với máy chủ.Vậy điều này sẽ dẫn đến một vấn đề là nếu có 2 hay nhiều máy chủ cùng thay đổi dữ liệu trên cùng một văn bản thì sao.Có thể sẽ xảy ra xung đột.Vậy CouchDB xử lý vấn đề này nhƣ thế nào?
Couch DB đƣợc xây dựng để phát hiện và xử lý những xung đột và quá trình sao chép là tăng dần và nhanh, sao chép văn bản nào thay đổi so với các nhân bản trƣớc.Điều này dẫn đến việc cập nhật các bản ghi và đồng bộ rất nhanh.
Mô hình nhân bản trong CouchDB là mô hình đƣợc thiết kế tốt để tăng tốc, thích hợp cho phân phối.Nền tảng nhân bản này cung cấp một tập các tính năng sau:
Nhân bản từ Master đến máy Slave
Đồng bộ nhân bản giữa máy 2 máy Master với nhau Lọc các nhân bản
Nhân bản tăng dần và 2 chiều (chỉ cập nhật các các văn bản thay đổi từ hai chiều)
Quản lý các xung đột
Các đặc điểm nhân bản có thể đƣợc sử dụng để kết hợp tạp ra các giải pháp mạnh mẽ tới rất nhiều vấn đề trong ngành Công nghệ thông tin.Ngoài các tính năng nhân bản trên, thì ƣu thế của CouchDB về tính ổn định và khả năng mở rộng là một ƣu thế lớn.Nó đƣợc tăng cƣờng hơn nữa khi đƣợc viết trên ngôn ngữ lập trình Erlang.Erlang đƣợc xây dựng để hỗ trợ tối đa cho việc phân phối, khả năng tức thời, khả năng chịu lỗi cao và đã có uy tín trong nhiều năm trong việc xây dựng các hệ thống đáng tin cậy trong ngày công nghiệp viễn thông.Theo thiết kế thì ngôn ngữ Erlang và thời gian chạy đƣợc tận dụng lợi thế phần cứng có nhiều lõi CPU
3.3.4. REST API
CouchDB dùng chuẩn REST.Tất cả các mục có một định danh duy nhất đƣợc lấy thông qua giao thức HTTP.Chuẩn REST sử dụng các phƣơng thức của HTTP nhƣ POST, GET, PUT và DELETE cho bốn toán tử cơ bản (tạo, đọc, cập nhật và xóa) cho tất cả dữ liệu.
23
3.3.5. Tính nhất quán cuối cùng.
CouchDB đảm bảo tính nhất quán cuối cùng:
● Mỗi tài liệu tự nó đã đảm bảo tính đầy đủ
● Mỗi document đều có một resivion, một version riêng.
● Cơ chế Append-only cho phép ghi trong khi vẫn phục vụ truy vấn đọc.a
3.3.6. Sử dụng Offline
CouchDB có thể tạo một bản sao đến các thiết bị (ví dụ nhƣ máy tính xách tay hoặc điện thoại) mà sau đó có thể hoạt động offline và dữ liệu đƣợc đồng bộ khi thiết bị kết nối trở lại.
3.4. Sử dụng CouchDB 3.4.1. Khởi động 3.4.1. Khởi động
Mặc định câu lệnh #couchdb là khởi động couchdb.Nhƣng nó chỉ khởi động tiến trình trực tiếp, không khởi động nhƣ một ứng dụng nền vì vậy.Ta dùng cách sau
Khởi động couchdb nhƣ 1 tiến trình nền #couchdb -b
Tắt couchdb nhƣ một tiền trình nền #couchdb -d
Localhost đến Futon:http://localhost:5984/_utils/
3.4.2. Xử lý truy vấn trong CouchDB
CouchDB dùng chuẩn REST với HTTP API nên chỉ có 4 câu lệnh đặc trƣng GET, PUT, DELETE, POST.Dƣới đây là bảng so sánh công dụng tƣơng ứng:
Bảng 2:Bảng tƣơng ứng các câu lệnh truy vấn
Câu lệnh Tƣơng ứng SQL
GET SELECT
PUT CREATE hoặc UPDATE
DELETE DELETE
24
3.4.3. Views
Định nghĩa
Việc sử lý truy vấn đƣợc thực hiện qua một thành phần trong CouchDB gọi là view. Dƣới đây là một thể hiện ví dụ của một views
{
"_id": "_design/people",
"_rev": "6-2b78f1ce2c09d3d703e68ddb5fa7f9bc", "vendor": {
"timing": "var timing = {};\ntiming.YearToSeconds = function(years){\n\tvar curDate = new Date();\n\tvar startDate = new Date();\n\tstartDate.setFullYear(curDate.getFullYear() - years);\n\treturn (curDate.getTime() - startDate.getTime())/1000;\n}", "couchapp": { "metadata": { "name": "couchapp", "fetch_uri": "git://github.com/couchapp/couchapp.git", "description": "official couchapp vendor"
} } }, "language": "javascript", "views": { "ageByYear": {
"map": "function(doc) {\n\t//Next line is CouchApp directive\n\tvar timing = {};\ntiming.YearToSeconds = function(years){\n\tvar curDate = new
25
Date();\n\tstartDate.setFullYear(curDate.getFullYear() - years);\n\treturn (curDate.getTime() - startDate.getTime())/1000;\n}\n\n\t\n \temit(doc.name, {\n\t\"age\":\n\t{\n\t\t\"seconds\": timing.YearToSeconds(doc.age), \n\t\t\"age\": doc.age\n\t}\n\t\n\t});\t\n}"
},
"age": {
"map": "function(doc) {\n\temit(doc.name, doc.age); \n}",
"reduce": "function(keys, values, rereduce) {\n\treturn sum(values); \n}"
},
"recent-items": {
"map": "function(doc) {\n if (doc.created_at) {\n var p = doc.profile || {};\n emit(doc.created_at, {\n message:doc.message, \n gravatar_url: p.gravatar_url, \n nickname: p.nickname, \n name: doc.name\n });\n }\n};" } }, "lists": { }, "updates": { }, "_attachments": { "index.html": { "content_type": "text/html", "revpos": 3, "digest": "md5-lScL+LCwuZFHXvbLkTUoHA==", "length": 2307,
26 "stub": true }, "vendor/couchapp/md5.js": { "content_type": "text/x-js", "revpos": 3, "digest": "md5-p777iQdVR/HkNU2OXNRcDA==", "length": 8656, "stub": true }, } }
Muốn thực hiện truy vấn, ta chỉ cần gọi tên view với đƣờng dẫn chính xác, có thể thêm các tham số cần thiết là ta có đƣợc truy vấn SQL tƣơng ứng.Ví dụ:
#CURL http://localhost:5984/test/_design/people/_view/age
Phân loại view cố định và views tạm thời
View cố định: Đƣợc lƣu trữ trong document đặc biệt (design view), có khả năng truy cập qua HTTP qua yêu cầu GET tới URI cố định theo định dạng sau /DBname/docID/viewName
View tạm thời: Không đƣợc lƣu trữ trên database, nhƣng đƣợc thực thi theo tùy loại yêu cầu (temporary view).Để thực thi view này ta cần sử dụng phƣơng thức yêu cầu HTTP - POST tới URI theo định dạng /DBname/temp_view_name, nơi mà phần phân của yêu cầu chứa code của hàm view mà content-type đƣợc thiết đặt đến application/ JSON
Ví dụ về view tạm thời
#curl -X PUT -d '{"spatial":{"points":"function(doc) {\n if (doc.loc) {\n emit({\n type: \"Point\", \n coordinates: [doc.loc[0], doc.loc[1]]\n }, [doc._id, doc.loc]);\n }};"}}' http://127.0.0.1:5984/geocouch/_design/main
27
Câu lệnh trên tạo view tạm thời cho cơ sở dữ liệu là geocouch với design là main Chú ý: việc sử dụng view tạm thời chỉ hợp lý trong quá trình phát triển, vì các view này đƣợc thực thi lúc nào đƣợc gọi đến, không nhƣ view cố định, dữ liệu đã đƣợc sinh sẵn.Và thời gian để chạy Javascript làm chậm đáng kể việc truy xuất dữ liệu từ database
Các thành phần trong views
View gồm hai thành phần:Map và reduce.Có chức năng đúng nhƣ tên gọi của nó.Một hàm với chức năng gắn các văn bản với các yêu cầu, mong muốn của ngƣời phát triển với nhau.Một hàm có chắc năng nén dữ liệu
a, Map function
Ví dụ cơ bản
function(doc){ emit(null, doc); }
Hàm trên trả về toàn bộ các document trong database mà không trả lại khóa.doc ở đây ám chỉ là toàn bộ document của CouchDB.Hàm emit có chức năng sinh ra dữ liệu với 2 tham số đầu vào là key và values.Giá trị value có thể là một phần tử hoặc là một đối tƣợng.
Dƣới đây là một ví dụ chi tiết hơn:
function(doc) {
emit(doc.name, doc.age); }
Hàm này trả về tất cả các giá trị trƣờng age của bản ghi nào có trong cơ sở dữ liệu doc, với khóa là trƣờng name
b, Reduce function
Đây là một hàm hữu ích của CouchDB.Nó làm tăng hiệu năng rất lớn cho CouchDB.Nó có chức năng thu gọn các kết quả đƣợc trả về từ hàm map hoặc từ chính các hàm reduce khác.
28
Nếu view có sử dụng hàm reduce.Nó có thể sử dụng việc kết hợp các kết quả cho view đó.Hàm reduce chấp nhận các tập nhƣ đầu vào, các kết quả đã đƣợc trả về qua hàm emit
3.4.6. Futon
CouchDB cũng cung cấp một ứng dụng web application tên là Futon, là một công cụ quản trị nhƣ phpmyadmin của MySQL, phpMoadmin của mongoDB.Nó cho phép bạn bảo trì cơ sở dữ liệu, kiểm soát.
Mặc định CouchDB chiếm cổng 5984 và chạy tại địa chỉ http://127.0.0.1:5984/_utils/
29
Hình 5: Tạo temporary view
3.5. Tìm hiểu phần mở rộng GEO của COUCHDB
3.5.1. GeoCouch là gì
GeoCouch là một nhánh của Couchdb và đƣợc viết bởi Volker Mische.Dự án
GeoCouch đƣợc lƣu ở github tại địa chỉ
https://github.com/couchbase/geocouch.GeoCouch tồn tại dƣới dạng một phần mở rộng của Couchbase(là một cơ sở dữ liệu kết hợp giữa CouchDB và Membase), nhƣng vẫn tƣơng thích tuyệt đối cho các phiên bản couchdb của Apache.
Ngoài việc hỗ trợ trợ tất cả tính năng của CouchDB, thì GeoCouch còn hỗ trợ thêm một cách đánh chỉ mục mới, R-tree.Cấu trúc R-tree đƣợc sử dụng bởi rất nhiều cho việc lƣu trữ dữ liệu không gian địa lý bởi vì nó đƣợc tối ƣu tốc độ cho việc tìm kiếm.R-tree đơn giản là tập các ô hoặc mảnh khung hoặc có thể gọi là khoảng không gian.Nó bao gồm các điểm ánh xạ tới các điểm thực sự trong khoảng đó hoặc giữa các khoảng nhỏ hơn với nhau đƣợc bao gồm trong các khoảng lớn hơn.Nó giảm đƣợc số mảnh phải truy vấn, bởi
30
vì các tập dữ liệu thƣờng đƣợc giới hạn thành các tập nhỏ hơn trong các các điểm ánh xạ đƣợc lƣu trữ.GeoCouch cung cấp một cách dễ dàng nhất để xây dựng các ứng dụng liên quan đến không gian một cách đơn giản bao gồm hỗ trợ định dạng vật lý GeoJSON trong CouchDB view.
3.5.2. Cài đặt GeoCouch
Mặc định GeoCouch chỉ là một phần mở rộng, tức là nếu muốn dùng phải phải cài đặt riêng.
Chúng ta sẽ tải bản geocouch từ github tại địa chỉ sau https://github.com/couchbase/geocouch/ .Tại dây tùy vào phiên bản CouchDB hiện tại ta dùng là phiên bản nào mà ta sẽ chọn nhánh tƣơng ứng đến phiên bản đó.Ở đây trong ví dụ hiện tại ta đang dùng phiên bản CouchDB 1.1.1.Do đó ta sẽ dùng phiên bản sau.
https://github.com/couchbase/geocouch/tree/couchdb1.1.x Tải GeoCouch về máy.
#git clone https://github.com/couchbase/geocouch.git #cd geocouch
Chọn nhánh đúng với phiên bản của CouchDB mình đang dùng
#git checkout couchdb1.1.x
Tiếp theo ta sẽ tạo biến môi trƣờng CouchDB để biên dịch GeoCouch
#export COUCH_SRC=/path/to/source/src/couchdb
Ở đây sẽ lấy ví dụ ở máy hiện tại thì câu lệnh đúng là:
#export COUCH_SRC=/usr/lib64/couchdb/erlang/lib/couch-1.1.1/include/
Sau đó ta chạy lệnh make
#make
Sau khi biên dịch xong thì ta sẽ tiến hành copy file cấu hình từ trong thƣ mục geocouch sang thƣ mục cấu hình của couchdb
#cp etc/couchdb/local.d/geocouch.ini /etc/couchdb/local.d/
Để kiểm tra xem phần cài đặt đã thành công chƣa.Ta sẽ copy các file test vào futon:
31 Tạo file test và add nội dung
#vi /usr/local/share/couchdb/www/script/couch_tests.js #loadTest("spatial.js"); loadTest("list_spatial.js"); loadTest("etags_spatial.js"); loadTest("multiple_spatial_rows.js"); loadTest("spatial_compaction.js"); loadTest("spatial_design_docs.js"); loadTest("spatial_bugfixes.js");
Việc cuối cùng để có thể tiến hành chạy GeoCouch là xuất biến chạy cho nó(lƣu ý.nên xuất biến này cùng với khởi động hệ điều hành, không có biến này, CouchDB và GeoCouch sẽ gặp lỗi)
#export ERL_FLAGS="-pa <geocouch>/build"
#export ERL_FLAGS="-pa /home/tuandung/KLTN/Data-KLTN/geocouch/build/"