CASSANDRA CLUSTER, NODETOOL, ĐỒNG BỘ VÀ SAO LƯU DỮ LIỆU

Cassandra cluster

Cluster là một nhóm gồm hai hoặc nhiều instance Cassandra trao đổi thông tin với nhau bằng cách sử dụng giao thức gossip (trò chuyện phiếm).

Gossip protocol

Gossip là một giao thức dùng để tìm ra vị trí và thông tin về trạng thái của các node khác đang tham gia vào cluster. Đây là một giao thức liên lạc dạng peer-to-peer trong đó mỗi node trao đổi định kỳ thông tin trạng thái của chúng với các node khác mà chúng có liên kết. Tiến trình gossip chạy mỗi giây và trao đổi thông tin với nhiều nhất là ba node khác trong cluster. Các node thông đổi thông tin về chính chúng và cả thông tin với các node mà chúng đã trao đổi, bằng cách này toàn bộ những node có thể nhanh chóng hiểu được trạng thái của tất cả các node còn lại trong cluster. Một gói tin gossip bao gồm cả version đi kèm với nó, như thế trong mỗi lần trao đổi gossip, các thông tin cũ sẽ bị ghi đè bởi thông tin mới nhất ở một số node.

Để ngăn chặn việc phân mảnh thông tin trong giao tiếp gossip, cần thiết phải sử dụng một danh sách các seed node giống nhau ở tất cả các node trong cluster. Điều này cần làm triệt để nhất khi một node khởi động vì mặc định một node sẽ ghi nhớ tất các các node khác mà nó đã từng giao tiếp gossip cùng giữa lần khởi động lại tiếp theo.

Chú ý: Seed node được thiết kế chỉ để khởi động tiến trình gossip giữa các node mới tham gia vào cluster. Seed node không phải là một “single point of failure” (có thể hiểu là nếu seed node gặp vấn đề thì cluster vẫn có thể hoạt động bình thường).

Khởi tạo cluster

Khởi tạo cluster tại một data center

Bạn có thể khởi tạo một cluster với chỉ ở một data center.

Điều kiện tiên quyết: Mỗi node phải được config một cách chuẩn xác trước khi khởi động cluster.

Bạn cần làm xong các việc sau trước khi khởi động cluster:

  1. Cài đặt Cassandra ở mỗi node.
  2. Đặt một tên cho cluster.
  3. Biết được địa chỉ IP của mỗi node.
  4. Quyết định node nào sẽ là seed node. (danh sách seed node sử dụng để tìm các node và hiểu được cấu trúc của cluster)
  5. Quyết định snitch. (Snitch quyết định datacenter nào được dung để ghi và đọc dữ liệu. Snitch cho Cassandra biết về cấu trúc mạng, giúp cho các request được dẫn đường một cách hiệu quả nhất, và cho phép phân phối các replica bằng cách nhóm các replica và cùng một data center hoặc cùng một rack. Tất cả các node phải có cùng thiết lập snitch.)
  6. Và cần chỉnh các thiết lập cần thiết khác trong file cassandra.yaml.
Chú ý: Nếu bạn thay đổi snitch sau khi bạn đã đưa tất cả dữ liệu vào cluster, bạn sẽ phải chạy lệnh full repair để sửa chữa vì snitch mới làm thay đổi toàn bộ cấu trúc của các replica đã có.)

Ở ví dụ sau, chúng ta sẽ cài đặt một cluster gồm có 6 node nằm trên hai rack của một data center. Mỗi node được thiết lập để sử dụng RackInferringSnitch (multiple rack aware) và 256 node ảo (vnode). Tôi khuyến khích việc sử dụng nhiều hơn một node ở mỗi data center.

Các bước thiết lập

  1. Chúng ta sẽ cài đặt Cassandra ở các node như sau:
  • Node0: 110.82.155.0 (seed1)
  • Node1: 110.82.155.1
  • Node2: 110.82.155.2
  • Node3: 110.82.155.3 (seed2)
  • Node4: 110.82.155.4
  • Node5: 110.82.155.5
  1. Nếu bạn đang chạy tường lửa ở các node trong cluster, bạn phải mở một số cổng nhất định để cho phép việc trao đổi thông tin giữa các node.

  2. Nếu Cassandra đang chạy.

  • Tắt đi bằng cách:
    1. $ ps auwx | grep Cassandra
    2. $ sudo kill <pid>
  • Xoá dữ liệu:
    1. $ cd <đường dẫn cài đặt>
    2. $ sudo rm –rf /var/lib/Cassandra/*
  1. Thay đổi các thiết lập sau trong file cassandra.yaml ở mỗi node:
  • num_token: <giá trị nên sử dụng: 256>
  • -seeds: <địa chỉ IP internal của mỗi seed node>
  • listen_address: <địa chỉ IP localhost>
  • endpoint_snitch: <tên của snitch>
  • auto_bootstrap: false (sử dụng true chỉ khi khởi tạo một cluster mới không có chút dữ liệu nào)
  1. Cụ thể đối với từng node
  • node0:
    1. cluster_name: MyDemoCluster
    2. num_tokens: 256
    3. seed_provider: -class_name: org. apache.cassandra.locator.SimpleSeedProvider
    4. parameter: -seeds: 110.82.155.0,100.82.15.3
    5. listen_address: 110.82.115.0
    6. rpc_address: 0.0.0.0
    7. endpoint_snitch: RackInferringSnitch
  • Từ node1 tới node5:

Các thiết lập giống như node0 trừ listen_address.

  1. Sau khi bạn đã cài đặt và thiết lập Cassandra ở tất cả các node, hãy khởi động các seed node trước và sau đó khởi động các node còn lại.

Nếu một node bị khởi động lại bởi chế độ tự động, bạn phải dung node đó và xoá hết dữ liệu của nó.

Để khởi động, bạn sử dụng lệnh: /etc/init.d/cassandra start

  1. Để kiểm tra xem cluster có đang chạy không. Sử dụng câu lệnh nodetool status.

Khởi tạo cluster tại nhiều data center

Bạn có thể khởi tạo một Cassandra cluster trên nhiều data center.

Dữ liệu được sao chép ngầm giữa các các một cách tự động, bạn không cần thao tác gì để di chuyển dữ liệu giữa các hệ thống hay server. Bạn có thể thiết lập số lượng các bản sao của dữ liệu ở mỗi data center và Cassandra sẽ lo phần còn lại, sao lưu dữ liệu giúp bạn.

Thiết lập cần thiết:

1. Tương tự như thiết lập ở tạo cluster tại một data center.
2. Cần tạo một quy ước về tên của các data center và các rack, ví dụ như: DC1, DC2 hoặc 100, 200 và RAC1, RAC2 hoặc R101, R102.

Các bước thiết lập:

  1. Cho rằng bạn cài Cassandra ở các node sau:
  • node0 10.168.66.41 (seed1)
  • node1 10.176.43.66
  • node2 10.168.247.41
  • node3 10.176.170.59 (seed2)
  • node4 10.169.61.170
  • node5 10.169.30.138
  1. Mở tường lửa ở một số node để cho phép các node giao tiếp với nhau.
  2. Nếu Cassandra đang chạy:
  • Tắt Cassandra
    1. $ ps auwx | grep cassandra
    2. $ sudo kill <pid>
  • Xoá dữ liệu
    1. $ cd <đường dẫn cài đặt>
    2. $ sudo rm –rf /var/lib/cassandra/*
  1. Thay đổi các thiết lập sau ở file cassandra.yaml ở mỗi node
  • num_token: <nên dùng giá trị: 256>
  • -seeds: <địa chỉ internal IP của các seed node>
  • listen_address: <địa chỉ IP localhost>
  • endpoint_snitch: <tên snitch>
  • auto_boostrap: false
  1. Thiết lập cụ thể với từng node
  • node0:
    1. cluster_name: MyDemoCluster

    2. num_tokens: 256

    3. seed_provider: -class_name: org.apache.cassandra.locator.SimpleSeedProvider

    4. parameters: -seeds: 10.168.66.41, 10.176.170.59

    5. listen_address: 10.168.66.41

    6. endpoint_snitch: ProperlyFileSnitch

      Chú ý: Cần ít nhất một node ở mỗi datacenter.

  • Từ node1 tới node5
  • Thiết lập tương tự với node0 ngoại trừ listen_address.
  1. Trong file cassandra-topology.properties, thiết lập data center và các tên rack mà bạn quyết định ở phần thiết lập cần thiết tới các địa chỉ IP ở mỗi node. Ví dụ:

#Cassandra Node IP=Data Center:Rack

  • 10.168.66.41=DC1:RAC1
  • 10.176.43.66=DC2:RAC1
  • 10.168.247.41=DC1:RAC1
  • 10.176.170.59=DC2:RAC1
  • 10.169.61.170=DC1:RAC1
  • 10.169.30.138=DC2:RAC1
  1. Cũng trong file cassandra-topologies.properties, đặt tên mặc định cho data center và tên rack dành cho các node không biết.

Thiết lập mặc định cho các node không biết dafault=DC1:RAC1

  1. Cũng trong file cassandra-topologies.properties, đặt tên mặc định cho data center và tên rack dành cho các node không biết.

  2. Để kiểm tra xem cluster có đang chạy hay không, sử dụng lệnh nodetool status.

File thiết lập cassandra.yaml

Là file chứa các thiết lập được sử dụng khi khởi tạo một cluster mới hoặc khi đưa một node mới vào cluster có sẵn. File này cần được xem xét và thay đổi phù hợp mỗi khi khởi động node lần đầu. Các thiết lập này điều khiển cách một node hoạt động trong cluster ví dụ như giao tiếp giữa các node, phân vùng dữ liệu (data partitioning), vị trí đặt bản sao dữ liệu.

  1. Broadcast_address: Nếu cluster của bạn được deploy trên nhiều vùng của Amazon EC2 ( và bạn sử dụng EC2MultiRegionSnitch), bạn nên đặt broadcast_address là địa chỉ IP public của node ( và địa chỉ IP private cho listen_address). Nếu bạn không thiết lập broadcast_address, mặc định nó sẽ là địa chỉ giống listen_address.

  2. Cluster_name: là tên của cluster. Giá trị này phải giống nhau đối với mọi node nằm trong cluster.

  3. Commitlog_directory: Là đường dẫn nơi lưu giữ commit log. Để tối ưu hoá tốc độ ghi, DataStax khuyên bạn nên để commit log ở một ổ đĩa khác với ổ lưu trữ file dữ liệu ( lý tưởng là khác một cách vật lý, không phải là khách theo kiểu logic ).

  4. Data_file_directory: Là đường dẫn tới nơi lưu giữ các dữ liệu về column family (SSTables).

  5. Initial_token: Giá trị này gán vị trị token của node trong ring và gán một khoảng dữ liệu cho node khi nó khởi động lần đầu. Initial_token cũng có thể không cần thiết lập khi đưa một node mới vào cluster sẵn có. Nếu không, giá trị token phụ thuộc vào partitioner mà bạn đang sử dụng. Với một partitioner ngẫu nhiên, giá trị này sẽ nằm trong khoảng từ 0 tới 2 mũ 127. Với ByteOrderPreservingPartitioner, giá trị này sẽ là một mảng byte của các giá trị hex nằm trong giá trị row key thực sự của bạn. Với OrderPreservingPartitioner và CollatedOrderPreservingPartitioner, giá trị này sẽ là một chuỗi ký tự UTF-8 dựa trên giá trị row key thực sự của bạn.

  6. Listen_address: Là địa chỉ IP hay hostname mà các Cassandra node khác sẽ sử dụng nó để kết nối tới node này. Nếu bạn để trống, bạn cần có một dải hostname được thiết lập chính xác trên tất cả các node trong cluster để các hostname đó có thể chuyển tới địa chỉ IP chính xác của node này (sử dụng /etc/hostname, /etc/hosts hoặc là DNS).

  7. Partitioner: Đã được nhắc tới ở bài về partitioner và replication.

  8. Rpc_address: Địa chỉ nghe của remote procedure call ( các kết nối tới client). Để nghe được tất cả các giao interface đã được thiết lập, đặt giá trị là 0.0.0.0. Nếu bạn để trống, bạn cần có một dải hostname được thiết lập chính xác trên tất cả các node trong cluster để các hostname đó có thể chuyển tới địa chỉ IP chính xác của node này (sử dụng /etc/hostname, /etc/hosts hoặc là DNS). Giá trị mặc định : localhost. Giá trị được cho phép: một địa chỉ IP, một hostname, hoặc để trông để dẫn tới một địa chỉ sử dụng hostname được thiết lập ở node.

  9. Rpc_port: Cổng dành cho remote procedure call ( các liên kết tới client) và Thrift service. Giá trị mặc định là 9160.

  10. Saved_caches_directory: Là đường dẫn tới nơi column family key và row cache được lưu trữ.

  11. Seed_provider: là một pluggable interface để cung cấp một danh sách các seed node. Các seed node trong danh sách được phân cách bởi dấu phẩy.

  12. Seeds: Khi một node tham gia vào cluster, nó sẽ liên lạc tới các seed node để quyết định cấu trúc hình học của ring và lấy thông tin gossip từ các node khác trong clustwr. Mọi node trong cluster phải có cùng một danh sách các seed node. Trong một cluster trải trên nhiều data center, mỗi data center phải bao gồm ít nhất một seed node.

  13. Storage_port: Là cổng giao tiếp nội bộ giữa các node. Mặc định là 7000.

  14. Endpoint_snitch: Đặt snitch để thiết lập vị trí node và tìm đường cho request. Snitch trong Cassandra gồm có các kiểu:

  • org.apache.cassandra.locator.SimpleSnitch

  • org.apache.cassandra.locator.RackInferringSnitch

  • org.apache.cassandra.locator.PropertyFileSnitch

  • org.apache.cassandra.locator.Ec2Snitch

Nodetool utility

Là một command line interface sử dụng để quản lý một cluster.

Cấu trúc câu lệnh : nodetool –h HOSTNAME [-p JMX_PORT] COMMAND

Hầu hết các command của nodetool hoạt động trong một node nếu –h không được sử dụng để định danh một hoặc nhiều node khác. Những command sau đây hoạt động trong phạm vi toàn cluster: rebuild, repair, taketoken.

Nếu bạn thực hiện câu lệnh từ chính node mà bạn cầu điều khiển, bạn không cần đưa thêm option –h vào câu lệnh, ngược lại bạn có thể dụng –h để định danh một node khác mà bạn cần điều khiển.

  1. cfhistograms: cung cấp thống kê về các bảng, bao gồm số lượng các SSTable, đọc/viết ngầm, kích thước phân vùng (row), và đếm số cell.

  2. cfstats: cung cấp thống kê về một hoặc nhiều table. Bạn có thể dùng ký hiệu dot (dấu chấm) để chỉ ra một hoặc nhiều tên keyspace và table. Nếu bạn không chỉ ra một keyspace và table, Cassandra sẽ đưa ra thống kê về tất cả các table.

  3. cleanup: sử dụng câu lệnh này để loại bỏ những dữ liệu không cần thiết sau khi thêm một node vào trong cluster. Cassandra không tự động loại bỏ các dữ liệu từ những node đã mất khoảng phân vùng của chúng tới một node mới. Chạy nodetool cleanup ở node nguồn và ở node lân cận cùng chia sẻ một khoảng con (subrange) sau khi node mới được thêm vào. Sau khi thêm node mới vào, nếu chạy câu lệnh này thất bại sẽ khiến cho Cassandra phải bao gồm cả dữ liệu cũ để load cân bằng lại ở node đó. Chạy nodetool cleanup khiến nhất thời tăng tỉ lệ sử dụng ổ đĩa đối với kích thước của SSTable lớn nhất. Xảy ra Disk I/O khi chạy câu lệnh này.

Chạy câu lệnh này ảnh hưởng tới các node có column counter ở một bảng. Cassandra gán một counter ID mới tới node.

Một cách tuỳ chọn, câu lệnh này lấy một danh sách các tên table. Nếu bạn không chỉ rõ keyspace, câu lệnh này sẽ xoá hết tất cả các keyspace mà không còn thuộc về một node.

  1. cleansnapshot: Xoá tất cả các snapshot ở một hoặc nhiều keyspace. Để xoá tất cả các snapshot thì bỏ qua phần tên snapshot.

  2. compact: Câu lệnh này khởi động tiến trình compaction (nén) ở các table sử dụng SizeTieredCompactionStrategy. Bạn có thể chỉ ra một keyspace cho việc nén. Nếu bạn không chỉ ra keyspace, lệnh nodetool sẽ sử dụng keyspace hiện tại. Bạn có thể chỉ chọn ra một hoặc vài table cho việc nén. Nếu bạn không chỉ ra table cụ thể, quá trình nén sẽ diễn ra với tất cả các table ở trong keyspace hiện tại. Đây được gọi là một major compaction (nén toàn bộ). Nếu bạn chỉ ra table cụ thể thì việc nén sẽ chỉ diễn ra ở table đó. Đây gọi là minor compaction (nén một phần). Một major compaction nén tất cả các SSTable đang tồn tại vào một SSTable. Trong quá trình nén, sẽ xuất hiện các điểm chóp ở phần tài nguyên đĩa sử dụng hay disk I/O. Sự xuất hiện này là nhất thời do có những thời điểm tồn tại cả SSTable mới và SSTable cũ. Một major compaction có thể gây ra những tiến trình disk I/O lớn đáng kể.

  3. compactionhistory: Cung cấp lịch sử về các lần compaction.

  4. compactionstats: Đưa ra các thống kê về compaction. Tổng số column cho biết tổng số byte chưa nén của SSTable đang được nén. Log hệ thống liệt kê ra tên của các SSTable bị nén.

  5. decommission: deactive một node bằng cách stream dữ liệu của nó tới một node khác.

  6. describering: Cung cấp các khoảng phân mảnh (partition range) của keyspace.

  7. disableautocompaction: Vô hiệu hoá autocompaction đối với keyspace và một hoặc nhiều table. Một keyspace có thể có một hoặc nhiều table.

  8. disablebackup: vô hiệu hoá incremental backup.

  9. disablebinary: vô hiệu hoá giao thức nhị phân (binary protocol), còn được biết đến với cái tên native transport.

  10. disablegossip: vô hiệu hoá giao thức gossip. Command này thường được sử dụng để giả việc một node đang bị tắt.

  11. disablehandoff: vô hiệu hoá việc lưu trữ future hint ở node hiện tại.

  12. disablethrift: vô hiệu hoá thrift server.

  13. drain: fllush tất cả các memtable của một node và làm cho node ngừng các hoạt động viết. Các hoạt động đọc vẫn hoạt động bình thường. Bạn thường sử dụng lệnh này trước khi update một node lên phiên bản mới của Cassandra.

  14. enableautocompaction, enablebackup, enablebinary, enablegossip, enablehandoff, enablethrift: ngược lại với các lệnh disableautocompaction, disablebackup, diablebinary, disablegosssip, diablehandoff, disablethrift.

  15. flush: flush một hoặc nhiều table ở memtable.

  16. getcompactionthreshold: cung cấp compaction thresholds (ngưỡng nén) lớn nhất và nhỏ nhất bằng đơn vị megabyte ở một table.

  17. getendpoints: cung cấp end point chứa một partition key.

  18. getsstable: cung cấp SSTable chứa partition key.

  19. getstreamthroughput: cung cấp giới hạn throughput của streaming trong hệ thống ở đơn vị byte trên giây.

  20. gossipinfo: Cung cấp thong tin gossip cho cluster.

  21. info: cung cấp thong tin bao gồm token và thông tin về dung lượng ổ đĩa (load), thời gian bắt đầu (khởi tạo), thời gian chạy tính bằng giây (uptime in seconds), và lượng heap memory được sử dụng.

  22. invalidatekeycache: Đặt lại các thông số global key cache về giá trị mặc định và lưu lại tất cả các key. Mặc định, key_cache_keys_to_save bị vô hiệu hoá trong cassandra.yaml. Câu lệnh này đặt lại các thông số này về mặc định.

  23. invalidaterowcache: Đặt lại các thông số global key cache, row_cache_keys_to_save, về mặc định.

  24. join: Cho node tham gia vào một ring (cluster), cho rằng node này ban đầu không khởi động bên trong ring sử dụng tuỳ chọn –D join_ring=false của cassandra utility. Node này cần được thiết lập chính xác về danh sách seed

Reference

http://www.datastax.com/documentation/cassandra/2.0/cassandra/gettingStartedCassandraIntro.html