Thứ hai, 15/09/2014 | 00:00 GMT+7

Cách sử dụng Etcdctl và Etcd, Kho lưu trữ giá trị khóa được phân phối của CoreOS

Một trong những công nghệ làm cho CoreOS trở nên khả thi là etcd , một repository key-value được phân phối global . Dịch vụ này được sử dụng bởi từng máy CoreOS để tạo thành một cụm và làm nền tảng để lưu trữ dữ liệu có thể truy cập global .

Trong hướng dẫn này, ta sẽ khám phá daemon etcd cũng như tiện ích etcdctl và API HTTP / JSON được dùng để điều khiển nó.

Yêu cầu

Để làm theo hướng dẫn này, ta giả định bạn có một cụm máy CoreOS như hướng dẫn của ta về cách cài đặt cụm CoreOS trên bản phác thảo của DigitalOcean . Điều này sẽ để lại cho bạn ba server trong một cụm duy nhất:

  • coreos-1
  • coreos-2
  • coreos-3

Khi bạn đã cài đặt và chạy các máy này, bạn có thể tiếp tục với hướng dẫn này.

Mô hình khám phá cụm Etcd

Một trong những nhiệm vụ cơ bản nhất mà etcd chịu trách nhiệm là tổ chức các máy riêng lẻ thành một cụm. Điều này được thực hiện khi CoreOS được khởi động bằng cách đăng ký tại địa chỉ khám phá được cung cấp trong file cloud-config được chuyển vào khi tạo.

Dịch vụ khám phá do CoreOS chạy có thể truy cập tại https://discovery.etcd.io . Bạn có thể nhận được mã thông báo mới bằng cách truy cập trang /new . Ở đó, bạn sẽ nhận được một mã thông báo mà máy của bạn có thể sử dụng để khám phá các node đồng hành của chúng. Nó sẽ giống như thế này:

https://discovery.etcd.io/dcadc5d4d42328488ecdcd7afae5f57c 

Bạn phải cung cấp mã thông báo mới cho mọi cụm mới. Điều này bao gồm khi bạn phải xây dựng lại cụm bằng cách sử dụng các node có thể có cùng địa chỉ IP. Các trường hợp etcd sẽ bị nhầm lẫn bởi điều này và sẽ không hoạt động chính xác để xây dựng cụm nếu bạn sử dụng lại địa chỉ khám phá.

Truy cập địa chỉ khám phá trong trình duyệt web , bạn sẽ nhận được đối tượng JSON mô tả các máy đã biết. Điều này sẽ không có bất kỳ nút nào khi bạn mới bắt đầu:

{"action":"get","node":{"key":"/_etcd/registry/dcadc5d4d42328488ecdcd7afae5f57c","dir":true,"modifiedIndex":102511104,"createdIndex":102511104}} 

Sau khi khởi động cụm của bạn, bạn có thể xem thêm thông tin tại đây:

{"action":"get","node":{"key":"/_etcd/registry/1edee33e6b03e75d9428eacf0ff94fda","dir":true,"nodes":[{"key":"/_etcd/registry/1edee33e6b03e75d9428eacf0ff94fda/2ddbdb7c872b4bc59dd1969ac166501e","value":"http://10.132.252.38:7001","expiration":"2014-09-19T13:41:26.912303668Z","ttl":598881,"modifiedIndex":102453704,"createdIndex":102453704},{"key":"/_etcd/registry/1edee33e6b03e75d9428eacf0ff94fda/921a7241c31a499a97d43f785108b17c","value":"http://10.132.248.118:7001","expiration":"2014-09-19T13:41:29.602508981Z","ttl":598884,"modifiedIndex":102453736,"createdIndex":102453736},{"key":"/_etcd/registry/1edee33e6b03e75d9428eacf0ff94fda/27987f5eaac243f88ca6823b47012c5b","value":"http://10.132.248.121:7001","expiration":"2014-09-19T13:41:41.817958205Z","ttl":598896,"modifiedIndex":102453860,"createdIndex":102453860}],"modifiedIndex":101632353,"createdIndex":101632353}} 

Nếu bạn cần tìm URL khám phá của một cụm, bạn có thể thực hiện việc này từ bất kỳ máy nào là thành viên. Thông tin này có thể được truy xuất từ bên trong phân cấp /run :

cat /run/systemd/system/etcd.service.d/20-cloudinit.conf 
[Service] Environment="ETCD_ADDR=10.132.248.118:4001" Environment="ETCD_DISCOVERY=https://discovery.etcd.io/dcadc5d4d42328488ecdcd7afae5f57c" Environment="ETCD_NAME=921a7241c31a499a97d43f785108b17c" Environment="ETCD_PEER_ADDR=10.132.248.118:7001" 

URL được lưu trữ trong mục nhập ETCD_DISCOVERY .

Khi các máy chạy etcd khởi động, chúng sẽ kiểm tra thông tin tại URL này. Nó sẽ gửi thông tin của riêng mình và truy vấn về các thành viên khác. Nút đầu tiên trong cụm rõ ràng sẽ không tìm thấy thông tin về các node khác, vì vậy nó sẽ tự chỉ định mình là group trưởng.

Các máy tiếp theo cũng sẽ liên hệ với URL khám phá với thông tin của chúng. Họ sẽ nhận lại thông tin về các máy đã đăng ký. Sau đó, họ sẽ chọn một trong các máy này và kết nối trực tiếp, tại đây họ sẽ nhận được danh sách đầy đủ các thành viên trong cụm khỏe mạnh. Việc sao chép và phân phối dữ liệu được thực hiện thông qua thuật toán đồng thuận Raft .

Dữ liệu về mỗi máy được lưu trữ trong cấu trúc folder ẩn trong etcd . Bạn có thể xem thông tin về các máy mà etcd biết bằng lệnh :

etcdctl ls /_etcd/machines --recursive 
/_etcd/machines/2ddbdb7c872b4bc59dd1969ac166501e /_etcd/machines/921a7241c31a499a97d43f785108b17c /_etcd/machines/27987f5eaac243f88ca6823b47012c5b 

Các chi tiết mà etcd chuyển cho các thành viên cụm mới được chứa trong các khóa này. Bạn có thể xem các giá trị riêng lẻ bằng cách yêu cầu những giá trị đó với etcdctl :

etcdctl get /_etcd/machines/2ddbdb7c872b4bc59dd1969ac166501e 
etcd=http%3A%2F%2F10.132.252.38%3A4001&raft=http%3A%2F%2F10.132.252.38%3A7001 

Ta sẽ đi sâu hơn về các lệnh etcdctl sau.

Sử dụng Etcdctl

Có hai cách cơ bản để tương tác với etcd . Thông qua API HTTP / JSON và thông qua một ứng dụng client , như tiện ích etcdctl kèm. Ta sẽ xem qua etcdctl trước.

Xem các phím và folder

Để bắt đầu, ta hãy xem những gì etcdctl hiện đang lưu trữ. Ta có thể thấy các phím cấp cao nhất bằng lệnh :

etcdctl ls / 
/coreos.com 

Như bạn thấy , ta có một kết quả. Đến đây, vẫn chưa rõ đây là folder hay khóa. Ta có thể cố gắng để get nút để xem một trong hai giá trị của phím hoặc để thấy rằng nó là một folder :

etcdctl get /coreos.com 
/coreos.com: is a directory 

Để tránh quy trình đệ quy thủ công này, ta có thể etcdctl liệt kê toàn bộ hệ thống phân cấp thông tin hiển thị bằng lệnh :

etcdctl ls / --recursive 
/coreos.com /coreos.com/updateengine /coreos.com/updateengine/rebootlock /coreos.com/updateengine/rebootlock/semaphore 

Như bạn thấy , có khá nhiều folder trong nút /coreos.com ban đầu. Ta có thể thấy việc lấy dữ liệu thực tế từ một nút trông như thế nào bằng cách yêu cầu thông tin ở điểm cuối cuối cùng:

etcdctl get /coreos.com/updateengine/rebootlock/semaphore 
{"semaphore":1,"max":1,"holders":null} 

Điều này không chứa thông tin rất hữu ích cho ta . Ta có thể nhận thêm một số metadata về mục nhập này bằng cách chuyển vào tùy chọn -o extended . Đây là một tùy chọn toàn cục, vì vậy nó phải đến trước lệnh get :

etcdctl -o extended get /coreos.com/updateengine/rebootlock/semaphore 
Key: /coreos.com/updateengine/rebootlock/semaphore Created-Index: 6 Modified-Index: 6 TTL: 0 Etcd-Index: 170387 Raft-Index: 444099 Raft-Term: 8  {"semaphore":1,"max":1,"holders":null} 

Đặt phím và tạo nút

Để tạo một folder mới, bạn có thể sử dụng mkdir như sau:

etcdctl mkdir /example 

Để tạo khóa, bạn có thể sử dụng lệnh mk :

etcdctl mk /example/key data 
data 

Điều này sẽ chỉ hoạt động nếu khóa chưa tồn tại. Nếu ta yêu cầu giá trị của khóa ta đã tạo, ta có thể truy xuất dữ liệu ta đã đặt:

etcdctl get /example/key 
data 

Để cập nhật khóa hiện có, hãy sử dụng lệnh update :

etcdctl update /example/key turtles 
turtles 

Người bạn đồng hành updatedir lệnh cho các folder có lẽ chỉ hữu ích nếu bạn đã cài đặt một TTL, hoặc thời gian đưa ra trực tiếp trên một folder . Điều này sẽ cập nhật thời gian TTL với thời gian đã qua. Bạn có thể đặt TTL cho các folder hoặc khóa bằng cách chuyển đối số --ttl # , trong đó “#” là số giây cần giữ:

etcdctl mkdir /here/you/go --ttl 120 

Sau đó, bạn có thể cập nhật TTL với updatedir :

etcdctl updatedir /here/you/go --ttl 500 

Để thay đổi giá trị của khóa hiện có hoặc để tạo khóa nếu khóa đó không tồn tại, hãy sử dụng lệnh set . Hãy coi đây là sự kết hợp của lệnh mk và lệnh update :

etcdctl set /example/key new 
new 

Điều này có thể bao gồm các đường dẫn không tồn tại. Các thành phần đường dẫn sẽ được tạo động:

etcdctl set /a/b/c here 
here 

Để có được cùng chức năng tạo-nếu-không-tồn tại này cho các folder , bạn có thể sử dụng lệnh setdir :

etcdctl setdir /x/y/z 

Lưu ý : lệnh setdir hiện không hoạt động như đã nêu. Trong xây dựng hiện nay, gương sử dụng của nó các updatedir lệnh và sẽ thất bại nếu folder đã tồn tại. Có một vấn đề mở trên repository GitHub để giải quyết vấn đề này.

Xóa mục nhập

Để xóa các khóa hiện có, bạn có thể sử dụng lệnh rm hoặc rmdir .

Lệnh rm được dùng để xóa khóa:

etcdctl rm /a/b/c 

Nó cũng được dùng đệ quy để xóa một folder và mọi folder con:

etcdctl rm /a --recursive 

Để chỉ xóa một folder trống hoặc một khóa, hãy sử dụng rmdir :

etcdctl rmdir /x/y/z 

Điều này được dùng đảm bảo rằng bạn chỉ xóa các điểm cuối của cấu trúc phân cấp.

Theo dõi các thay đổi

Bạn có thể xem một khóa cụ thể hoặc toàn bộ folder để biết các thay đổi. Việc xem những thứ này bằng etcdctl sẽ khiến hoạt động bị treo cho đến khi một số sự kiện xảy ra với bất cứ thứ gì đang được xem.

Để xem một khóa, hãy sử dụng nó mà không có bất kỳ cờ nào:

etcdctl watch /example/hello 

Để dừng xem, bạn có thể nhấn CTRL-C . Nếu một thay đổi được phát hiện trong quá trình đồng hồ, giá trị mới sẽ được trả lại.

Để xem toàn bộ cấu trúc folder , hãy sử dụng cờ --recursive :

etcdctl watch --recursive /example 

Bạn có thể thấy điều này sẽ hữu ích như thế nào bằng cách đặt nó trong một cấu trúc lặp đơn giản để liên tục theo dõi trạng thái của các giá trị:

while true; do etcdctl watch --recursive /example; done 

Nếu bạn muốn thực hiện một lệnh khi nào phát hiện ra thay đổi, hãy sử dụng lệnh execute exec-watch :

etcdctl exec-watch --recursive  /example -- echo "hello" 

Điều này sẽ lặp lại "xin chào" trên màn hình khi nào một giá trị trong folder đó thay đổi.

Giá trị ẩn

Một điều không rõ ràng ngay lập tức là có cấu trúc folder ẩn trong etcd . Đây là những folder hoặc khóa bắt đầu bằng dấu gạch dưới.

Chúng không được liệt kê bởi các công cụ etcdctl thông thường và bạn phải biết những gì bạn đang tìm kiếm để tìm thấy chúng.

Ví dụ, có một folder ẩn tên là /_coreos.com chứa một số thông tin nội bộ về fleet . Bạn có thể thấy hệ thống phân cấp bằng cách yêu cầu rõ ràng:

etcdctl ls --recursive /_coreos.com  
/_coreos.com/fleet /_coreos.com/fleet/states /_coreos.com/fleet/states/apache@6666.service /_coreos.com/fleet/states/apache@6666.service/2ddbdb7c872b4bc59dd1969ac166501e /_coreos.com/fleet/states/apache@7777.service /_coreos.com/fleet/states/apache@7777.service/921a7241c31a499a97d43f785108b17c . . . 

Một cấu trúc folder khác nằm trong /_etcd :

etcdctl ls --recursive /_etcd 
/_etcd/machines /_etcd/machines/27987f5eaac243f88ca6823b47012c5b /_etcd/machines/2ddbdb7c872b4bc59dd1969ac166501e /_etcd/machines/921a7241c31a499a97d43f785108b17c /_etcd/config 

Các chức năng này giống hệt như bất kỳ mục nhập nào khác, với điểm khác biệt duy nhất là chúng không hiển thị trong danh sách chung. Bạn có thể tạo chúng bằng cách bắt đầu tên khóa hoặc folder của bạn bằng dấu gạch dưới.

Etcd HTTP / JSON API Sử dụng

Cách khác để tương tác với etcd là sử dụng API HTTP / JSON đơn giản.

Để truy cập API, bạn có thể sử dụng một chương trình HTTP đơn giản như curl . Bạn phải cung cấp cờ -L để theo dõi bất kỳ chuyển hướng nào được chuyển trở lại. Từ trong cụm của bạn , bạn có thể sử dụng giao diện 127.0.0.1 local và cổng 4001 cho hầu hết các truy vấn.

Lưu ý : Để kết nối với etcd từ bên trong containers Docker, địa chỉ http://172.17.42.1:4001 được dùng . Điều này có thể hữu ích cho các ứng dụng để cập nhật cấu hình của chúng dựa trên thông tin đã đăng ký.

Có thể đạt được không gian phím thông thường bằng cách truy cập http://127.0.0.1:4001/v2/keys/ trên bất kỳ server nào. Ví dụ: để nhận danh sách các khóa / folder cấp cao nhất, hãy nhập:

curl -L http://127.0.0.1:4001/v2/keys/ 
{"action":"get","node":{"key":"/","dir":true,"nodes":[{"key":"/coreos.com","dir":true,"modifiedIndex":6,"createdIndex":6},{"key":"/services","dir":true,"modifiedIndex":333,"createdIndex":333}]}} 

Dấu gạch chéo trong yêu cầu là bắt buộc. Nó sẽ không giải quyết chính xác nếu không có nó.

Bạn có thể đặt hoặc truy xuất giá trị bằng các động từ HTTP thông thường.

Để sửa đổi hành vi của các hoạt động này, bạn có thể chuyển các cờ vào cuối yêu cầu của bạn bằng cách sử dụng cú pháp ?flag=value . Nhiều cờ có thể được phân tách bằng ký tự & .

Ví dụ, để liệt kê đệ quy tất cả các khóa, ta có thể nhập:

curl -L http://127.0.0.1:4001/v2/keys/?recursive=true 
{"action":"get","node":{"key":"/","dir":true,"nodes":[{"key":"/coreos.com","dir":true,"nodes":[{"key":"/coreos.com/updateengine","dir":true,"nodes":[{"key":"/coreos.com/updateengine/rebootlock","dir":true,"nodes":[{"key":"/coreos.com/updateengine/rebootlock/semaphore","value":"{\"semaphore\":1,\"max\":1,\"holders\":null}","modifiedIndex":6,"createdIndex":6}],"modifiedIndex":6,"createdIndex":6}],"modifiedIndex":6,"createdIndex":6}],"modifiedIndex":6,"createdIndex":6}. . . 

Một thông tin hữu ích khác có thể truy cập bên ngoài keyspace thông thường là thông tin version , có thể truy cập tại đây:

curl -L http://127.0.0.1:4001/version 
etcd 0.4.6 

Bạn có thể xem số liệu thống kê về mối quan hệ của từng trưởng group với từng người theo dõi bằng cách truy cập vào điểm cuối này:

curl -L http://127.0.0.1:4001/v2/stats/leader 
{"leader":"921a7241c31a499a97d43f785108b17c","followers":{"27987f5eaac243f88ca6823b47012c5b":{"latency":{"current":1.607038,"average":1.3762888642395448,"standardDeviation":1.4404313533578545,"minimum":0.471432,"maximum":322.728852},"counts":{"fail":0,"success":98718}},"2ddbdb7c872b4bc59dd1969ac166501e":{"latency":{"current":1.584985,"average":1.1554367141497013,"standardDeviation":0.6872303198242179,"minimum":0.427485,"maximum":31.959235},"counts":{"fail":0,"success":98723}}}} 

Thao tác tương tự được dùng để phát hiện thống kê về máy bạn hiện đang sử dụng:

curl -L http://127.0.0.1:4001/v2/stats/self 
{"name":"921a7241c31a499a97d43f785108b17c","state":"leader","startTime":"2014-09-11T16:42:03.035382298Z","leaderInfo":{"leader":"921a7241c31a499a97d43f785108b17c","uptime":"1h19m11.469872568s","startTime":"2014-09-12T19:47:25.242151859Z"},"recvAppendRequestCnt":1944480,"sendAppendRequestCnt":201817,"sendPkgRate":40.403374523779064,"sendBandwidthRate":3315.096879676072} 

Để xem thống kê về các hoạt động đã được định dạng trước, hãy nhập:

curl -L http://127.0.0.1:4001/v2/stats/store 
{"getsSuccess":78823,"getsFail":14,"setsSuccess":121370,"setsFail":4,"deleteSuccess":28,"deleteFail":32,"updateSuccess":20468,"updateFail":4,"createSuccess":39,"createFail":102340,"compareAndSwapSuccess":51169,"compareAndSwapFail":0,"compareAndDeleteSuccess":0,"compareAndDeleteFail":0,"expireCount":3,"watchers":6} 

Đây chỉ là một vài thao tác được dùng để điều khiển etcd thông qua API.

Cấu hình Etcd

Dịch vụ etcd có thể được cấu hình theo một số cách khác nhau.

Cách đầu tiên là chuyển các tham số bằng file cloud-config của bạn mà bạn sử dụng để khởi động các node của bạn . Trong hướng dẫn khởi động, bạn đã biết một chút về cách thực hiện điều này:

#cloud-config  coreos:   etcd:     discovery: https://discovery.etcd.io/<token>     addr: $private_ipv4:4001     peer-addr: $private_ipv4:7001 . . . 

Để xem các tùy chọn mà bạn có , hãy sử dụng cờ -h với etcd :

etcd -h 

Để bao gồm các tùy chọn này trong cloud-config của bạn, chỉ cần xóa dấu gạch ngang đầu tiên và tách các khóa khỏi các giá trị bằng dấu hai chấm thay vì dấu bằng. Vì vậy -peer-addr=<host:port> trở thành peer-addr: <host:port> .

Khi đọc file cloud-config , CoreOS sẽ dịch chúng thành các biến môi trường trong file đơn vị sơ khai, được sử dụng để khởi động dịch vụ.

Một cách khác để điều chỉnh cài đặt cho etcd là thông qua API. Điều này thường được thực hiện bằng cách sử dụng cổng 7001 thay vì cổng 4001 tiêu chuẩn được sử dụng cho các truy vấn chính.

Ví dụ: bạn có thể nhận một số giá trị cấu hình hiện tại bằng lệnh :

curl -L http://127.0.0.1:7001/v2/admin/config 
{"activeSize":9,"removeDelay":1800,"syncInterval":5} 

Bạn có thể thay đổi các giá trị này bằng cách chuyển JSON mới dưới dạng tải trọng dữ liệu với thao tác PUT:

curl -L http://127.0.0.1:7001/v2/admin/config -XPUT -d '{"activeSize":9,"removeDelay":1800,"syncInterval":5}' 
{"activeSize":9,"removeDelay":1800,"syncInterval":5} 

Để nhận danh sách các máy, bạn có thể truy cập vào điểm cuối /v2/admin/machines :

curl -L http://127.0.0.1:7001/v2/admin/machines 
[{"name":"27987f5eaac243f88ca6823b47012c5b","state":"follower","clientURL":"http://10.132.248.121:4001","peerURL":"http://10.132.248.121:7001"},{"name":"2ddbdb7c872b4bc59dd1969ac166501e","state":"follower","clientURL":"http://10.132.252.38:4001","peerURL":"http://10.132.252.38:7001"},{"name":"921a7241c31a499a97d43f785108b17c","state":"leader","clientURL":"http://10.132.248.118:4001","peerURL":"http://10.132.248.118:7001"}] 

Điều này được dùng để xóa mạnh các máy khỏi cụm bằng phương pháp DELETE.

Kết luận

Như bạn thấy, etcd được dùng để lưu trữ hoặc truy xuất thông tin từ bất kỳ máy nào trong cụm của bạn. Điều này cho phép bạn đồng bộ hóa dữ liệu và cung cấp vị trí cho các dịch vụ để tìm kiếm dữ liệu cấu hình và chi tiết kết nối.

Điều này đặc biệt hữu ích khi xây dựng các hệ thống phân tán vì bạn có thể cung cấp một điểm cuối đơn giản sẽ hợp lệ từ bất kỳ vị trí nào trong cụm. Bằng cách tận dụng tài nguyên này, các dịch vụ của bạn có thể tự cấu hình động.


Tags:

Các tin liên quan