Thứ sáu, 03/01/2014 | 00:00 GMT+7

Cách sử dụng snapshots DigitalOcean để tự động backup các server của bạn

Backup là cực kỳ quan trọng trong bất kỳ loại môi trường production hoặc phát triển nào. Những trường hợp không lường trước có thể khiến bạn mất nhiều ngày hoặc vài tháng năng suất. Bạn có thể dễ dàng mất toàn bộ dự án nếu bạn chưa backup các file của bạn .


Mặc dù có nhiều cách để backup dữ liệu quan trọng của bạn, nhưng cũng có một phương pháp có sẵn thông qua console DigitalOcean và API: ảnh chụp nhanh.

Ảnh chụp nhanh sao chép hình ảnh của toàn bộ VPS của bạn và lưu trữ trên server DigitalOcean. Chúng khác với tính năng “ backup ”, cung cấp các bản backup tự động và có thể được chọn bằng cách đánh dấu vào ô backup . Bạn có thể triển khai lại server của bạn hoặc tạo ra các server mới dựa trên ảnh chụp nhanh của bạn. Bắt đầu từ tháng 10 năm 2016, các ảnh chụp nhanh có giá 0,05 đô la mỗi gigabyte mỗi tháng, dựa trên dung lượng được sử dụng trong hệ thống file .

Trong bài viết này, ta sẽ thảo luận về cách sử dụng ảnh chụp nhanh DigitalOcean như một phương pháp backup môi trường của bạn. Ta sẽ trình bày ngắn gọn cách thủ công để chụp nhanh server của bạn và sau đó nhanh chóng chuyển sang làm như vậy theo cách tự động thông qua API và công việc cron.

Cách sử dụng ảnh chụp nhanh thủ công


Thật dễ dàng sử dụng console DigitalOcean để chụp nhanh server của bạn để backup nhanh chóng, một lần.

Bắt đầu bằng cách tắt server của bạn từ dòng lệnh. Mặc dù có thể chụp nhanh một hệ thống đang hoạt động, việc tắt nguồn cung cấp một số đảm bảo hệ thống file sẽ ở trạng thái nhất quán. Bạn có thể thực hiện việc này một cách an toàn bằng lệnh một lệnh như thế này vào terminal khi bạn được kết nối với server :

sudo poweroff 

Điều này an toàn hơn nhiều so với việc sử dụng các tùy chọn “Power Cycle” trong console , vì tùy chọn đó hoạt động giống như khôi phục cài đặt root .

Tiếp theo, nhấp vào tên server của bạn trong trang “ Server ” chính:

Tên  server  DigitalOcean

Trong màn hình tiếp theo, Nhấp vào tab trên cùng được đánh dấu “Ảnh chụp nhanh”. Nhập tên cho ảnh chụp nhanh của bạn và nhấn nút “Chụp ảnh nhanh” để bắt đầu chụp ảnh nhanh:

DigitalOcean chụp nhanh

Ảnh chụp nhanh của bạn sẽ bắt đầu. Khi quá trình chụp nhanh hoàn tất, server của bạn sẽ được khởi động lại.

Cách chụp nhanh thông qua API


DigitalOcean cung cấp một API cho phép bạn truy cập sức mạnh của console từ dòng lệnh hoặc giao diện lập trình.

Trong phần này, ta sẽ trình bày ý tưởng cơ bản bằng cách sử dụng curl , là một tiện ích dòng lệnh đơn giản để truy cập các trang web.

Tạo khóa API


Trước khi ta bắt đầu, bạn phải cài đặt quyền truy cập API vào account của bạn . Bạn phải làm điều này trong console . Nhấp vào phần “API” của thanh chuyển trên cùng:

Phần API DigitalOcean

Bạn sẽ được đưa đến giao diện API chung. Tại đây, bạn có thể tạo mã thông báo API, đăng ký ứng dụng của nhà phát triển, xem ứng dụng được ủy quyền và đọc tài liệu API.

Nhấp vào “Tạo mã thông báo mới” ở đầu trang:

API tạo DigitalOcean

Đặt tên cho mã thông báo và xác định cấp độ truy cập mà mã này sẽ có cho account của bạn. Đối với hướng dẫn này, bạn cần có cả quyền đọc và ghi:

API tạo DigitalOcean

Đến đây bạn sẽ có một mã thông báo API có sẵn cho bạn:

Khóa API DigitalOcean

Copy paste mã thông báo API vào một vị trí an toàn, vì nó sẽ không hiển thị lại cho bạn. Nếu bạn mất khóa này, bạn sẽ phải tạo lại một mã thông báo khác và điều chỉnh các giá trị của bất kỳ tập lệnh hoặc ứng dụng nào bằng mã thông báo cũ.

Bạn cần cả mã thông báo API để truy cập account của bạn thông qua API.

Đến đây bạn có phần thông tin này, bạn đã sẵn sàng cho thử nghiệm đầu tiên của ta .

Kiểm tra quyền truy cập API


Cú pháp chung cần thiết để vận hành curl mà ta sẽ sử dụng trong hướng dẫn này là:

<pre>
curl -X <span class = “highlight”> PHƯƠNG PHÁP HTTP </span> “<span class =" highlight "> url được yêu cầu </span>“
</pre>

Phương pháp ta sẽ sử dụng là "GET", như trong tài liệu API. URL mà ta đang yêu cầu sẽ là một số biến thể về điều này:

<pre>
https://api.digitalocean.com/v2/ <span class = “highlight”> command </span>
</pre>

Hãy chỉ sử dụng AAABBB làm mã thông báo API mẫu cho ID ứng dụng client mẫu cho các lệnh tiếp theo này.

Vì vậy, xem xét tài liệu API, nếu bạn muốn thực hiện một yêu cầu cho “/ server ”, trả về tất cả các server đang hoạt động trên account của bạn, bạn có thể tạo một URL như sau:

https://api.digitalocean.com/v2/server 

Khi ta đang cố gắng thực hiện điều này từ dòng lệnh, ta sẽ sử dụng curl ở định dạng ta đã chỉ định ở trên. Ta cũng phải bao gồm mã thông báo API trong tiêu đề Ủy quyền. Lệnh trở thành:

curl -X GET -H "Content-Type: application/json" \     -H "Authorization: Bearer AAABBB" \     "https://api.digitalocean.com/server" 

{"server":[{"id":123456,"name":"irssi","memory":1024,"vcpus":1,"disk":30,"locked":false,"status":"active","kernel":{"id":1221,"name":"Ubuntu 14.04 x64 vmlinuz-3.13.0-24-generic (1221)","version":"3.13.0-24-generic"},"created_at":"2014-04-20T23:47:21Z","features":["backups","private_networking","virtio"],"backup_ids":[8000333,8185675,8381528,8589151,8739369],"snapshot_ids":[],"image":{"id":3240036,"name":"Ubuntu 14.04 x64","distribution":"Ubuntu","slug":null,"public":false,"regions":["nyc1","ams1","sfo1","nyc2","ams2","sgp1","lon1","nyc2"],"created_at":"2014-04-18T15:59:36Z","min_disk_size":20},"size_slug":"1gb","networks":{"v4":[{"ip_address":"XX.XXX.XXX.XXX","netmask":"255.255.0.0","gateway":"10.128.1.1","type":"private"},{"ip_address":"XX.XXX.XXX.XXX","netmask":"255.255.240.0","gateway":"107.170.96.1","type":"public"}],"v6":[]},"region":{"name":"New York 2","slug":"nyc2","sizes":[],"features":["virtio","private_networking","backups"],"available":null}}, . . . 

Ta có thể xác định các server riêng lẻ bằng ID server của chúng. Điều này được giữ trong trường “id” của chuỗi JSON được trả về của từng server . Nó cũng có sẵn ở cuối URL trên trang của server đó trên console :

ID  server  trình duyệt DigitalOcean

Để nhận thông tin về một server duy nhất, ta có thể ra lệnh như thế này. Ta sẽ giả định ID server là 123456:

curl -X GET -H "Content-Type: application/json" \     -H "Authorization: Bearer AAABBB" \     "https://api.digitalocean.com/v2/server/123456" 

    {"server":[{"id":123456,"name":"irssi","memory":1024,"vcpus":1,"disk":30,"locked":false,"status":"active","kernel":{"id":1221,"name":"Ubuntu 14.04 x64 vmlinuz-3.13.0-24-generic (1221)","version":"3.13.0-24-generic"},"created_at":"2014-04-20T23:47:21Z","features":["backups","private_networking","virtio"],"backup_ids":[8000333,8185675,8381528,8589151,8739369],"snapshot_ids":[],"image":{"id":3240036,"name":"Ubuntu 14.04 x64","distribution":"Ubuntu","slug":null,"public":false,"regions":["nyc1","ams1","sfo1","nyc2","ams2","sgp1","lon1","nyc2"],"created_at":"2014-04-18T15:59:36Z","min_disk_size":20},"size_slug":"1gb","networks":{"v4":[{"ip_address":"XX.XXX.XXX.XXX","netmask":"255.255.0.0","gateway":"10.128.1.1","type":"private"},{"ip_address":"XX.XXX.XXX.XXX","netmask":"255.255.240.0","gateway":"107.170.96.1","type":"public"}],"v6":[]},"region":{"name":"New York 2","slug":"nyc2","sizes":[],"features":["virtio","private_networking","backups"],"available":null}}} 

Sau đó, ta có thể thực hiện điều này xa hơn bằng cách phát lệnh cho server cụ thể đó. Giả sử rằng ta đã tắt server an toàn từ bên trong server , ta có thể đưa ra lệnh chụp nhanh như sau:

<pre>
curl -X BÀI ĐĂNG -H 'Content-Type: application / json' \
-H 'Ủy quyền: Người mang AAABBB' \
-d '{“type”: “snapshot”, “name”: “<span class =" highlight "> Tên cho Ảnh chụp nhanh Mới </span>“}' \
Https://api.digitalocean.com/v2/server/123456/actions
</pre>
<pre> {"action": {“id”: 99999999, “status”: “in- process ”, “type”: “snapshot”, “started at”: “2014-11-14T16: 34: 39Z”, “Hoàn thành lúc”: null, “ id tài nguyên ”: 332233, “ loại tài nguyên ”: “ server ”, "zones" : “nyc3”}} </pre>

Thao tác này sẽ trả về một chuỗi JSON bao gồm ID sự kiện của ảnh chụp nhanh mà bạn vừa yêu cầu. Ta có thể sử dụng điều này để truy vấn xem sự kiện đã hoàn tất thành công hay chưa bằng cách sử dụng yêu cầu “sự kiện /”:

curl -X GET -H "Content-Type: application/json" \     -H "Authorization: Bearer $AAABBB" \     "https://api.digitalocean.com/v2/actions/123456" 

{"action":{"id":99999999,"status":"completed","type":"snapshot","started_at":"2014-12-08T21:03:01Z","completed_at":"2014-12-08T21:05:32Z","resource_id":332233,"resource_type":"server","region":"nyc3"}} 

Như bạn thấy , sự kiện này được đánh dấu là “đã hoàn thành”. Ta vừa tạo ảnh chụp nhanh đầu tiên từ dòng lệnh!

Tự động hóa backup ảnh chụp nhanh bằng tập lệnh


Như bạn đã thấy trong phần trước, có thể kiểm soát khá nhiều từ dòng lệnh bằng cách sử dụng API. Tuy nhiên, làm điều này theo cách thủ công không chỉ hơi rườm rà mà còn không giải quyết được vấn đề tự động hóa ảnh chụp nhanh của ta . Trên thực tế, nó đòi hỏi nhiều thao tác với các phương pháp này hơn là trỏ và nhấp chuột xung quanh trong giao diện.

Tuy nhiên, điều tuyệt vời khi có thể truy cập dữ liệu thông qua API là ta có thể thêm chức năng này vào một tập lệnh. Một tập lệnh có lợi không chỉ vì nó tăng tốc tất cả các truy vấn và nhập thủ công mà còn vì ta có thể đặt nó chạy tự động từ dòng lệnh.

Trong phần cài đặt này, ta sẽ tạo một tập lệnh Ruby đơn giản để backup các server của ta . Sau đó, ta sẽ tự động hóa tập lệnh bằng cách thêm một cronjob để chụp nhanh các server của ta theo các khoảng thời gian định trước.

Bạn có thể cài đặt tập lệnh và cronjob để chạy trên máy local của bạn giả sử rằng bạn có quyền truy cập vào trình thông dịch Ruby và cron hoặc từ một server khác. Ta sẽ sử dụng một server Ubuntu 12.04 để chụp nhanh các server khác của ta . Tạo một user bình thường nếu bạn chưa làm như vậy.

Tạo tập lệnh


Để bắt đầu, ta cần download Ruby nếu nó chưa được cài đặt trên hệ thống của ta . Ta có thể làm điều này dễ dàng bằng cách cài đặt trình quản lý version Ruby và yêu cầu nó cung cấp cho ta version ổn định mới nhất:

\curl -sSL https://get.rvm.io | bash -s stable --ruby 

Ta sẽ được yêu cầu nhập password sudo của bạn để cài đặt các tiện ích trợ giúp cần thiết và đặt một số thuộc tính hệ thống. Thao tác này sẽ cài đặt rvm và version ổn định mới nhất của Ruby.

Sau khi cài đặt, ta có thể mã nguồn tập lệnh rvm bằng lệnh:

source ~/.rvm/scripts/rvm 

Tiếp theo, ta cần tạo một file có tên snapshot.rb trong editor yêu thích của bạn:

cd ~ nano snapshot.rb 

Bên trong, bạn có thể dán file tập lệnh sau:

#!/usr/bin/env ruby require 'rest_client' require 'json'  $api_token  = ENV['DO_TOKEN'] $baseUrl    = "https://api.digitalocean.com/v2/" $headers    = {:content_type => :json, "Authorization" => "Bearer #{$api_token}"}  class ResponseError < StandardError; end  def server_on?(server_id)   url     = $baseUrl + "server/#{server_id}"   server = get(url)['server']    server['status'] == 'active' end  def power_off(server_id)   url = $baseUrl + "server/#{server_id}/actions"   params = {'type' => 'power_off'}   post(url, params) end  def snapshot(server_id)   url = $baseUrl + "server/#{server_id}/actions"   params = {'type' => 'snapshot', 'name' => "Server #{server_id} " + Time.now.strftime("%Y-%m-1")}   post(url, params) end  def get(url)   response = RestClient.get(url, $headers){|response, request, result| response }   puts response.code    if response.code == 200     JSON.parse(response)   else     raise ResponseError, JSON.parse(response)["message"]   end end  def post(url, params)   response = RestClient.post(url, params.to_json, $headers){|response, request, result| response }    if response.code == 201     JSON.parse(response)   else     raise ResponseError, JSON.parse(response)["message"]   end end  server = ARGV  server.each do |server_id|   puts "Attempting #{server_id}"    begin     if server_on?(server_id)       power_off(server_id)        while server_on?(server_id) do         sleep 10       end       puts "Powered Off #{server_id}"       sleep 10     end      snapshot(server_id)     puts "Snapshotted #{server_id}"   rescue ResponseError => e     puts "Error Snapshotting #{server_id} - #{e.message}"   end end 

Lưu file khi bạn hoàn tất.

Bây giờ ta có thể thực thi file này bằng lệnh :

chmod 755 snapshot.rb 

Tập lệnh này hoạt động bằng cách gán ID khách hàng và khóa API của ta cho các biến môi trường được gọi là DO_CLIENT_IDDO_API_KEY tương ứng. Sau đó, ta chuyển tập lệnh một danh sách các số ID server . Sau đó, tập lệnh sẽ chạy qua danh sách ID, tắt bất kỳ server nào đang hoạt động và chụp nhanh chúng.

Giả sử ta có cùng một cài đặt mà ta đã sử dụng trước đó, ta có thể chạy lệnh này bằng lệnh :

DO_TOKEN="AAABBB" ./snapshot.rb 123456 

Điều này sẽ chụp nhanh chỉ một server . Có thể thêm nhiều ID server hơn sau ID đầu tiên, được phân tách bằng dấu cách:

DO_TOKEN="AAABBB" ./snapshot.rb 123456 111111 222222 333333 

Tự động hóa Tập lệnh với Cron


Bây giờ ta đã có file script của bạn để hoạt động, ta có thể đặt nó tự động chạy bằng cách sử dụng trình cron.

Vì các lệnh gọi và tập lệnh API của ta không yêu cầu quyền root, ta nên cài đặt điều này trong crontab của user local của ta . Không sử dụng file crontab hệ thống nằm trong /etc , vì các thay đổi có thể bị xóa nếu cron nhận được bản cập nhật.

Trước tiên, ta nên xem liệu user của ta đã có crontab chưa:

crontab -l 

Nếu crontab được in ra, ta nên backup nó trong trường hợp ta muốn hoàn nguyên các thay đổi của bạn sau này:

cd crontab -l > crontab.bak 

Bây giờ ta đã backup crontab của bạn , hãy xem rvm đã cài đặt Ruby của ta ở đâu. Cron không có khái niệm về môi trường, vì vậy ta cần cung cấp cho nó đường dẫn đầy đủ đến cả tập lệnh của ta và chính ruby:

<pre>
ruby nào
</pre>
<pre>
/ home / <span class = “highlight”> your_user </span> /.rvm/rubies/ruby-2.1.0/bin/ruby
</pre>

Của bạn có thể hơi khác một chút. Lưu đường dẫn này để bạn có thể nhập nó vào crontab.

Bây giờ là lúc để chỉnh sửa crontab của bạn. Gõ vào:

crontab -e 

Nếu đây là lần đầu tiên bạn chạy crontab với quyền user này, bạn sẽ được yêu cầu chọn một editor . Nếu bạn không có sở thích về một trong các lựa chọn được liệt kê khác, nano là một lựa chọn an toàn.

Sau đó, bạn sẽ được đưa vào một phiên chỉnh sửa và file sẽ được tải trước với các comment giải thích cách định dạng lệnh cron.

Các lệnh Cron được định dạng theo cách sau:

minute hour day_of_month month day_of_week command_to_run 

Bạn có thể đặt dấu “*” vào bất kỳ vị trí nào trong repository ảng thời gian mà bạn không muốn chỉ định. Cron sẽ đọc đây là tất cả các giá trị của trường đó. Vì vậy, nếu ta muốn chạy một lệnh lúc 3:10 sáng mỗi sáng, ta có thể thêm một mục như sau:

10 03 * * * command 

Nếu ta muốn chạy một lệnh vào trưa ngày đầu tiên hàng tháng, ta có thể nhập:

00 12 1 * * command 

Đối với mục đích của ta , ta sẽ giả định ta muốn chạy một bản backup ảnh chụp nhanh vào mỗi Chủ Nhật và Thứ Năm lúc 3:30 sáng.

Ta có thể thực hiện điều này bằng lệnh một dòng trong crontab của ta trông giống như sau:

<pre>
30 03 * * 0,4 DO TOKEN = “AAABBB” / home / <span class = “highlight”> user của bạn </span> /.rvm/rubies/ruby-2.1.0/bin/ruby / home / <span class = “highlight”> user của bạn </span> /snapshot.rb <span class = “highlight”> drop id1 drop id2… drop idx </span>
</pre>

Thường sẽ hữu ích khi kiểm tra xem lệnh có hoạt động không bằng cách đặt nó thành một vài phút kể từ bây giờ và sau đó xem nó có chạy thành công hay không. Ví dụ: nếu bây giờ là 6:10 chiều, ta có thể thêm một dòng giống như thế này để kiểm tra lệnh:

<pre>
14 18 * * * DO TOKEN = “AAABBB” / home / <span class = “highlight”> user của bạn </span> /.rvm/rubies/ruby-2.1.0/bin/ruby / home / <span class = “Highlight”> user của bạn </span> /snapshot.rb <span class = “highlight”> drop id1 drop id2… drop idx </span>
</pre>

Thao tác này sẽ chạy lệnh sau 4 phút kể từ bây giờ. Khi bạn xác minh lệnh đang hoạt động thành công (tạo ảnh chụp nhanh), bạn có thể chỉnh sửa nó trở lại lịch trình mà bạn muốn giữ.

Kết luận


Có một số cách để backup và việc sắp xếp các chiến lược backup của bạn sẽ mang lại mức độ phù hợp tốt nhất trong trường hợp có sự cố. Sử dụng ảnh chụp nhanh DigitalOcean là một cách đơn giản để cung cấp bản backup cấp hình ảnh.

Nếu bạn tự động hóa quy trình này, điều quan trọng là phải quản lý số lượng ảnh chụp nhanh đang được lưu vào account của bạn. Nếu bạn không kiểm tra account của bạn thường xuyên và xóa các ảnh chụp nhanh cũ, bạn có thể nhanh chóng xếp chồng lên nhau khá nhiều hình ảnh không cần thiết trong account của bạn . Hãy cố gắng hết sức để xóa các ảnh chụp nhanh cũ khi có các ảnh chụp nhanh mới hơn, đang hoạt động.

<div class = “author”> Bởi Justin Ellingwood </div>


Tags:

Các tin liên quan