11/08/2018, 22:50

Built Riak back-end database

Như đã giới thiệu ở bài blog trước , Riak database là một dạng lưu trữ dữ liệu mới dựa trên nền tảng NoSQLvới mục tiêu nâng cao hiệu năng cũng như khả năng đảm bảo an toàn dữ liệu của hệ thống. Về cơ bản, Riak được chia làm hai phần chính là Riak Client và Riak server. Trong bài viết trước đã giới ...

Như đã giới thiệu ở bài blog trước , Riak database là một dạng lưu trữ dữ liệu mới dựa trên nền tảng NoSQLvới mục tiêu nâng cao hiệu năng cũng như khả năng đảm bảo an toàn dữ liệu của hệ thống. Về cơ bản, Riak được chia làm hai phần chính là Riak Client và Riak server. Trong bài viết trước đã giới thiệu cơ bản về Riak cũng như cách thiết lập một ứng dụng Ruby on Rails sử dụng Riak. Bài viết lần này sẽ tập trung vào việc xây dựng một hệ thống server back-end Riak dựa trên hệ điều hành Ubuntu 14.04 (Trusty) AMD 64.

Riak hiện nay đã hỗ trợ cơ bản hầu hết các hệ điều hành mã nguồn mở, chúng ta hoàn toàn có thể download từ trang chủ của Basho. Tuy nhiên, trước tiên chúng ta cần phải thiết lập cài đặt Erlang:

Cài đặt Erlang:

  • cài đặt các dependencies packages:
sudo apt-get install build-essential libncurses5-dev openssl libssl-dev fop xsltproc unixodbc-dev
  • trong trường hợp muốn sử dụng GUI đồ họa cần phải cài đặt thêm các gói hỗ trợ đồ họa của Erlang
sudo apt-get install libwxbase2.8 libwxgtk2.8-dev libqt4-opengl-dev
  • Cài đặt Erlang:
wget http://s3.amazonaws.com/downloads.basho.com/erlang/otp_src_R16B02-basho5.tar.gz
tar zxvf otp_src_R16B02-basho5.tar.gz
cd otp_src_R16B02-basho5
./configure && make && sudo make install

Cài đặt Riak:

Việc cài đặt riak hoàn toàn có thể thực hiện đơn giản với một câu lệnh apt-get, tuy nhiên để cài đặt thiết lập dành cho back-end server yêu cầu Riak cần được thiết lập thêm nhiều phần mềm hỗ trợ, do đó việc cài đặt Riak back-end sẽ mất một chút thời gian hơn so với cách thông thường.

  • Tạo key cho Riak resource trên Ubuntu:
curl https://packagecloud.io/gpg.key | sudo apt-key add -
  • Thiết lập apt-transport-https để đảm bảo các package được chuyển về trên https:
sudo apt-get install -y apt-transport-https
  • Với việc HTTPS đã được kích hoạt, việc tiếp theo chúng ta cần thực hiện là tạo một file .list trong thư mục /etc/apt/sources.list.d bằng một shell script đơn giản:
    #!/bin/bash
    HOSTNAME=`hostname -f`
    FILENAME=/etc/apt/sources.list.d/basho.list
    OS=ubuntu
    DIST=trusty
    PACKAGE_CLOUD_RIAK_DIR=https://packagecloud.io/install/repositories/basho/riak
    curl "${PACKAGE_CLOUD_RIAK_DIR}/config_file.list?os=${OS}&dist=${DIST}&name=${HOSTNAME}" > $FILENAME
  • Sau khi chạy script này, resource của Basho sẽ được thêm vào /etc/apt/sources.list.d/basho.list:
# this file was generated by packagecloud.io for
# the repository at https://packagecloud.io/basho/riak
deb https://packagecloud.io/basho/riak/ubuntu/ trusty main
deb-src https://packagecloud.io/basho/riak/ubuntu/ trusty main
  • Cuối cùng việc cài đặt Riak có thể hoàn thiện chỉ với 2 câu lệnh apt:
sudo apt-get update
sudo apt-get install riak

Việc cài đặt Riak có thể coi là kết thúc tại bước này, tuy nhiên, để có thể đưa Riak vào hoạt động, cần phải trải qua nhiều bước cấu hình và cài đặt hệ thống. Phần tiếp theo sẽ sơ lược đưa ra các bước cần phải thực hiện để thiết lập hệ thống Riak backend database

2.1 Lựa chọn giải pháp lưu trữ dữ liệu

Như đã trình bày ở bài viết trước, Riak có khả năng cung cấp các cầu hình hoạt động khác nhau để có thể phục vụ cho nhiều ứng dụng. Mỗi cấu hình đều có những ưu nhược điểm nhất định. Về cơ bản, Riak mặc định có hai cấu hình lưu trữ dữ liệu chính:

Bitcask

Dạng lưu trữ dữ liệu mặc định của Riak

Ưu điểm

  • Trễ truy xuất dữ liệu thấp
  • Băng thông dữ liệu lớn, đặc biệt là luồng dữ liệu ghi: Quá trình ghi vào Bitcask sử dụng đồng đều cả I/O và băng thông của đĩa ghi, điều này mang lại hiệu năng lớn hơn vì (1) Dữ liệu được ghi vào Bitcask không cần phải sắp xếp trên đĩa, (2) cấu trúc của Bitcask cho phép tối thiểu hóa việc di chuyển đĩa trong quá trình ghi.
  • Có khả năng xử lý lượng dữ liệu lớn hơn RAM mà không ảnh hưởng tới chất lượng dữ liệu: Việc truy cập dữ liệu trong Bitcask bao gồm việc tìm kiếm trực tiếp trong bộ nhớ các bảng hash. Điều này mang lại hiệu quả cho Bitcask mặc dù đôi lúc dữ liệu rất lớn
  • Truy xuất một lần duy nhất: Bitcask có khả năng trỏ trực tiếp tới vị trí dữ liệu được lưu trữ trên đĩa nên chỉ cần một lần truy xuất là có khả năng đọc được dữ liệu thậm chí còn không cần thiết đọc tới đĩa do cơ chế caching dữ liệu của hệ điều hành
  • Nhanh chóng khôi phục khi gặp lỗi dữ liệu
  • Dễ dàng Backup:
  • Nhược điểm: Tất cả các keys của hash table đều phải được lưu trữ trên bộ nhớ chính, do đó yêu cầu về dung lượng bộ nhớ là rất lớn.

LevelDB

Ưu điểm

  • Liciense: LevelDB được xây dựng và hỗ trở bởi Google, do đó LevelDB có Liciense từ New BSD và Apache, điều này sẽ giúp người dùng có thể hưởng lợi từ các nền tảng lưu trữ nổi tiếng
  • Nén dữ liệu: LevelDB sử dụng Google Snappy để nén dữ liệu. Điều này đồng nghĩa với việc CPU sẽ phải xử lý nhiều hơn nhưng lưu trữ trên đĩa sẽ ít hơn. Các ứng dụng cơ bản là dữ liệu dạng text bao gồm text, Base64, JSON...

Nhược điểm

  • Thời gian truy xuât dữ liệu lâu
  • Việc truy xuất dữ liệu có thể phải tìm kiếm trên nhiều đĩa trước khi tìm được dữ liệu mong muốn.

Ngoài Bitcask và LevelDB, còn có thêm hai giải pháp cấu hình cho dữ liệu là Memory và Multi. Hai giải pháp này tuy không phải là hai cấu hình mặc địn đề nghị của Riak database nhưng chúng đã kết hợp được một số ưu điểm của cả Bitcask và LevelDB , mang lại cho người sử dụng sự đa dạng trong lựa chọn giải pháp lưu trữ.

2.2 Cấu hình cơ bản

Cũng giống như bao giải pháp lưu trữ dữ liệu khác trên Server, chúng ta có thể cấu hình hoạt động cho Riak dựa trên một file config tên là riak.conf nằm bên trong thư mục /etc/riak . Tất cả những cấu hình liên quan tới Riak đều được thực hiện trong thư mục này. Với những phiên bản Riak cũ hơn (1.3 trở về trước) thì file cấu hình lại tên là app.config.

Cấu hình Erlang

erlang.schedulers.force_wakeup_interval = 500
erlang.schedulers.compactio

Kích thước Ring

Như dã giới thiệu ở bài trước, trong Riak, dữ liệu được tổ chức thành các Ring (vòng tròn) và kích cỡ của các Ring sẽ quyết định hiệu năng hoạt động của hệ thống. Việc thiết lập kích cỡ của Ring phải được thực hiện trước khi các Cluster băt đầu hoạt động. Có thể tham khảo việc tính toán kích thước Ring trên trang của Basho. Kích thước của Ring có thể định nghĩa trong riak.conf

...
ring_size = 64
...

Sau khi thiết lập, chúng ta có thể kiểm tra lại kích thước của Ring bằng câu lệnh Terminal:

riak-admin status | grep ring

Trong bước cấu hình cơ bản này, việc quyết định kích thước của Ring là hết sức quan trọng, nếu như kích thước của Ring quá lớn thì sẽ ảnh hướng tới hiệu năng hoạt động của toàn hệ thống và ngược lại nếu kích thước Ring quá nhỏ thì sẽ không tận dụng hết được tài nguyên của máy chủ. Việc cấu hình Ring nên tùy biến theo tài nguyên của máy chủ (Ram, Disk space, Network, CPU....)

Cấu hình tham số Bucket

buckets.default.last_write_wins = true
buckets.default.r = 3

Nếu trong trường hợp các đặc tính của Bucket bị thay đổi thông qua file cấu hình và sau khi node khỏi động lại, những node đã tồn tại sẽ không bị ảnh hưởng mặc dù cơ chế reset bucket có thể sử dụng để bắt buộc các bucket phải tuần theo cấu hình mới

2.3 Thiết lập Cluster

Sau khi thiết lập cơ bản cho Riak, chúng ta phải thiết lập cho phần quan trọng nhất của Riak, Cluster. Như đã giới thiệu từ trước, Cluster là tập hợp của nhiều node lại với nhau do đó để có thể thiết lập nên cluster chúng ta cần phải đi thiết lập kết nối từng node lại với nhau. Các node có thể nằm trong cùng một server hoặc nằm trong các server khác nhau trong hệ thống mạng nội bộ. Trước tiên cần phải cấu hình tạo node đầu tiên cho cluster.

Thiết lập Node đầu tiên:

  • Trước khi thiết lập Node, chúng ta cần phải tạm dừng hoạt động của Riak lại:
sudo riak stop
  • Thiết lập địa chỉ IP: về mặc định, trong file riak.conf thiết lập node với địa chỉ IP local, nên ta cần phải thay đổi địa chỉ sang địa chỉ IP thực của node, ở đây remote node sử dụng IP 192.168.1.62
listener.protobuf.internal = 192.168.1.62:8087
  • Nếu như muốn thực hiên việc trao đổi trên HTTP/HTTPS:
listener.http.internal = 192.168.1.62:8098
listener.https.internal = 192.168.1.62:8098
  • Thay đổi trong Nodename:
nodename = riak@192.168.1.62
  • Khởi động Riak trở lại:
sudo riak start

Lưu ý Nếu trước đó, Riak đã khởi tạo node mặc định lên thì thay vì khởi động Riak trở lại, ta phải thực hiện thay thế node cũ bằng Node mới

riak-admin cluster replace riak@127.0.0.1 riak@192.168.1.62

Thêm các node tiếp theo vào trong cluster

Để thêm các node tiếp theo vào trong cluster, ta vẫn thực hiện lần lượt các bước cấu hình giống như khởi tạo node đầu tiên. Tiếp đó, thay vì khởi động hay thay thế node trong riak, ta thêm node mới trực tiếp bằng riak-admin. Ở đây, một node mới từ IP 192.168.1.105 muốn tham gia vào cluster. Riak admin sẽ yêu cầu node ban đầu:

riak-admin cluster join riak@192.168.1.62

Màn hình sẽ hiển thị địa chỉ IP của node mới:

Success: staged join request for`riak@192.168.1.105` to `riak@192.168.1.62`

Tuy nhiên sự thay đổi này của Cluster chỉ mang tính chất tạm thời, nếu khởi động lại riak thì sẽ không còn Node riak@192.168.1.105. Để lưu lại node này, chúng ta cần phải commit sự thay đổi của Cluster bằng

riak-admin cluster plan
riak-admin cluster commit

Với số lượng các node tham gia lớn, việc thực hiện bằng tay trên command line sẽ mang lại rất nhiều bất tiện. Do đó việc thực hiện thêm cluster mới thay vào đó có thể làm bằng Erlang script thông qua Riak attach. Việc khởi tạo chức năng cho Riak tới đây có thể nói là cơ bản hoàn tất, tuy nhiên trong quá trình thực hiện có thể gặp nhiều vấn đề do sự khác biệt trong từng server cũng như xung đột giữa các service với nhau. Lỗi thường gặp trong quá trình này gồm có:

  • Trùng port service: Riak sử dụng các port sau là mặc định: 8097, 8098, 8099. Trong trường hợp các port này đã bị chiếm hữu bởi các service khác, chúng ta hoàn toàn có thể thay đổi sang port khác nhưng việc này sẽ ảnh hướng tới việc thêm và tạo node mới
  • Không thể khởi tạo node mới do xung đột cấu hình: Việc này xảy ra khá phổ biến trong trường hợp thay đổi kích thước của Ring. Xóa bỏ đi tất cả những Ring cũ đi là có thể khởi tạo lại Riak : sudo rm -rf /var/lib/riak/ring/*

Nếu số lượng Node trong cluster tăng lên tới mức hàng trăm, nghìn node thì việc quản trị thông qua command line thực sự là thách thức rất lớn đối với người dùng. Để khắc phục nhược điểm này Basho cung đã cung cấp một công cụ tên là Riak Control, được tích hợp bên trong Riak, có thể dễ dàng kích hoạt thông qua file cấu hình:

#enable/disable riak_control panel
riak_control = on

#riak_control authenticate mode: off or userlist
#if userlist mode is enabled, have to config user authenticate bellow
riak_control.auth.mode = userlist

#user authentication list
#defined by riak_control.auth.username.password = userpassord
riak_control.auth.user.admin_badao.password = hanoiVietnam

Và tất nhiên sau khi thay đổi file cấu hình chúng ta sẽ phải khởi động lại Riak. Riak Control cung cấp giao diện quản lý thông qua Web Interface với URL: https://localhost:8906 . Điều này có nghĩa là Riak phải được kích hoạt chức năng HTTPS cùng với port ứng dungj 8906 đã được cấu hình. Giao diện của Riak Control như sau:

Screenshot-from-2014-11-28-204415.png

Sử dụng Riak Control, ta có thể thực hiện được những chức năng chính của Riak thông qua giao diện GUI bao gồm: thêm/xóa node trong cluster, kiểm tra tài nguyên tiêu tốn của Riak cũng như tạm dừng hoạt động node nào đó. Điều này sẽ đảm bảo quá trình hoạt động của server cũng như hiệu năng của Riak.

Riak database tuy có nhiều ưu điểm để ứng dụng vào thực tế nhưng vẫn còn rất mới để đưa vào sử dụng trong các sản phẩm thương mại. Việc xây dựng một Backend database sử dụng Riak cũng tương đối là phức tạp, đòi hỏi sự kiên trì và khả năng quản lý tốt. Tuy nhiên, nếu có thể xây dựng được một Backend database như Riak sẽ tăng khả năng mở rộng cho các ứng dụng, đăc biệt cho các hệ thống phân tán.

0