[ELK] Tìm hiểu về Elasticsearch – Phần 3

Tác giả: 23/03/2023

Ở 2 phần trước trong chuỗi bài viết về ELK, Nhân Hòa đã giới thiệu đến bạn đọc về các khái niệm cơ bản của ELK cũng như cách cài đặt sử dụng. Vậy trong bài viết này, hãy cùng đi sâu vào 1 trong 3 thành phần chính là Elasticsearch của bộ phần mềm ELK để hiểu rõ hơn về nó.

1. Elasticsearch là gì?

  • Elasticsearch là 1 công cụ tìm kiếm và phân tích phân tán, là 1 RESTful mã nguồn mở được xây dựng trên Apache Lucene. Kể từ khi phát hành vào năm 2010 thì Elasticsearch đã nhanh chóng trở thành 1 trong những công cụ tìm kiếm được sử dụng phổ biến nhất. Elasticsearch thường được dùng để phân tích nhật ký và tìm kiếm văn bản, thông tin bảo mật và phân tích nghiệp vụ cũng như thông tin vận hành
  • Vì là 1 công cụ mã nguồn mở và miễn phí cho nên chúng ta có thể hoàn toàn cài đặt và sử dụng chỉ cần có 1 máy cài hđh Linux

2. Các khái niệm cơ bản của Elasticsearch

a. Document

Là đơn vị nhỏ nhất để lưu trữ dữ liệu trong Elasticsearch. Đây là 1 đơn vị lưu trữ thông tin cơ bản trong Elasticsearch, là 1 JSON object đối với 1 số dữ liệu

VD: “Chào mừng đến với github của shaidoka”

b. Index

  • Trong Elasticsearch có 1 cấu trúc tìm kiếm gọi là inverted index, nó được thiết kế để cho phép tìm kiếm full-text search. Cách thức khá đơn giản, các văn bản được tách ra thành từng từ có nghĩa sau đó sẽ được map xem thuộc văn bản nào và khi search sẽ ra kết quả cụ thể

  • Có 2 kiểu đánh index là forward index và inverted index. Bản chất của inverted index là đánh theo keyword: words -> pages còn forward index đánh theo nội dung page -> words

  • Có thể thấy việc đánh theo keyword thì việc tìm kiếm sẽ nhanh hơn việc chúng ta phải tìm kiếm theo từng page. Elasticsearch sử dụng Apache lucence để quản lý và tạo inverted index

c. Shard

  • Shard là 1 đối tượng của Lucence, là tập hợp con của 1 index. 1 index có thể được lưu trên nhiều shard
  • Một node bao gồm nhiều shard, shard chính là đối tượng nhỏ nhất hoạt động ở mức thấp nhất, đóng vai trò lưu trữ dữ liệu
  • Chúng ta sẽ không bao giờ làm việc với các Shard vì Elasticsearch sẽ hỗ trợ toàn bộ việc giao tiếp cũng như tự động thay đổi các Shard khi cần thiết
  • Elasticsearch cung cấp 2 cơ chế của shard là primary shard và replica shard
    • Primary shard: lưu trữ dữ liệu và đánh index, sau khi đánh dữ liệu xong sẽ được vận chuyển đến các replica shard, mặc định của Elasticsearch mỗi index có 5 Primary shard thì sẽ đi kèm vs 1 replica shard
    • Replica shard: là nơi lưu trữ dữ liệu nhân bản của Elasticsearch, đóng vai trò đảm bảo tính toàn vẹn dữ liệu khi Primary shard xảy ra vấn đề, ngoài ra nó còn giúp tăng tốc độ tìm kiếm vì có thể cấu hình lượng Replica shard nhiều hơn cấu hình mặc định của Elasticsearch

d. Node

  • Là trung tâm hoạt động của Elasticsearch, là nơi lưu trữ dữ liệu, tham gia thực hiện đánh index của cluster cũng như thực hiện các thao tác tìm kiếm
  • Mỗi node được xác định bằng 1 tên riêng và không được phép trùng lặp

e. Cluster

  • Tập hợp các node hoạt động cùng với nhau, chia sẻ với nhau cùng 1 thuộc tính cluster name. Chính vì thế cluster sẽ được xác định bằng 1 tên riêng và ko được phép trùng lặp. Việc tên của các cluster elasticsearch mà trùng nhau sẽ gây ra lỗi cho các node vì vậy khi cấu hình cần phải lưu ý
  • Mỗi cluster có 1 node chính gọi là master, node master được lựa chọn 1 cách tự động và có thể thay đổi nếu như có sự cố xảy ra. Một cluster có thể bao gồm nhiều nodes. Các nodes có thể hoạt động trên cùng một server. Tuy nhiên trên thực tế, 1 cluster sẽ gồm nhiều nodes hoạt động trên các server khác nhau để đảm bảo nếu 1 server gặp sự cố thì các node trên các server khác có thể hoạt động đầy đủ chức năng. Các node có thể tìm thấy nhau để hoạt động trên cùng 1 cluster thông qua giao thức Unicast
  • Chức năng chính của Cluster là quyết định xem shard nào được phân bổ cho node nào và khi nào thì di chuyển các Cluster để cân bằng lại Cluster

3. Ưu điểm của Elasticsearch

  • Có khả năng tìm kiếm và phân tích dữ liệu
  • Có khả năng mở rộng theo chiều ngang
  • Hỗ trợ tìm kiếm khi từ khóa tìm kiếm có thể bị lỗi
  • Hỗ trợ các Elasticsearch client như Java, PHP, JS, Ruby,…

4. Nhược điểm của Elasticsearch

  • Elasticsearch được thiết kế cho mục đích search cho nên khi sử dụng thì chúng ta nên sử dụng kèm theo 1 DB khác như MongoDB hay MySQL
  • Trong Elasticsearch không đảm bảo được toàn vẹn dữ liệu của các hoạt động như Insert, Update hay Delete
  • Không thích hợp với những hệ thống thường xuyên cập nhật dữ liệu. Sẽ rất tốn kém cho việc đánh index dữ liệu

5. Hướng dẫn join cluster Elasticsearch

a. Cài đặt Elasticsearch trên 2 node muốn join cluster

  • Disable IPv6
cat > /etc/sysctl.conf << EOF
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
EOF

sysctl -p
  • Cài đặt java và wget
yum install java-1.8.0-openjdk.x86_64 wget -y
  • Cài đặt Elasticsearch
rpm -ivh elasticsearch-1.7.3.noarch.rpm
  • Khởi động Elasticsearch và cho phép khởi động cùng máy chủ
systemctl start elasticsearch
systemctl enable elasticsearch

b. Cấu hình elasticsearch trên node ELK

  • Mở file cấu hình
vi /etc/elasticsearch/elasticsearch.yml
  • Chỉnh sửa lại các cấu hình như sau
cluster.name: shaidoka
node.name: "Node1"
node.master: true
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
network.host: 0.0.0.0
http.port: 9200
discovery.zen.ping.unicast.hosts: ["10.10.10.183", "10.10.10.181", "10.10.10.182"]
discovery.zen.minimum_master_nodes: 2
  • Để tránh hiện tượng split_brain chúng ta nên để thông số discovery.zen.minimum_master_nodes theo công thức: Tổng số node/2 + 1

c. Cấu hình trên 2 node muốn join vào cluster

  • Mở file cấu hình
vi /etc/elasticsearch/elasticsearch.yml
  • Sửa lại cấu hình trên 2 node như sau
cluster.name: shaidoka
node.name: "Node2" # Node 2 hay Node 3 như trên mô hình
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
network.host: 0.0.0.0
http.port: 9200
discovery.zen.ping.unicast.hosts: ["10.10.10.183", "10.10.10.181", "10.10.10.182"]
discovery.zen.minimum_master_nodes: 2
  • Restart Elasticsearch trên các node

d. Kiểm tra kết quả

  • Đứng trên node bất kỳ gọi đến 1 node trong cluster xem cluster đã được join hay chưa
curl http://10.10.10.181:9200/_cluster/health?pretty
  • Kết quả như sau là ok
{
"cluster_name" : "shaidoka",
"status" : "green",
"timed_out" : false,
"number_of_nodes" : 3,
"number_of_data_nodes" : 3,
"active_primary_shards" : 0,
"active_shards" : 0,
"relocating_shards" : 0,
"initializing_shards" : 0,
"unassigned_shards" : 0,
"delayed_unassigned_shards" : 0,
"number_of_pending_tasks" : 0,
"number_of_in_flight_fetch" : 0
}
  • Check các node trong cluster
curl -XGET 'http://10.10.10.181:9200/_cluster/state?pretty' | less
  • Kết quả
100 924 100 924 0 0 45132 0 --:--:-- --:--:-- --:--:-- 46200
{
"cluster_name" : "cloud365",
"version" : 4,
"master_node" : "lLtteXggSyGxygvtJ9N7Zw",
"blocks" : { },
"nodes" : {
"VYfyWZ8hToeeLKs4fXm69g" : {
"name" : "Hildegarde",
"transport_address" : "inet[/10.10.10.181:9300]",
"attributes" : { }
},
"lLtteXggSyGxygvtJ9N7Zw" : {
"name" : "Node1",
"transport_address" : "inet[/10.10.10.183:9300]",
"attributes" : {
"master" : "true"
}
},
"T7KaZyfvRZq6D_72Xjf6Nw" : {
"name" : "Node3",
"transport_address" : "inet[/10.10.10.182:9300]",
"attributes" : { }
}
},
"metadata" : {
"templates" : { },
"indices" : { }
},
"routing_table" : {
"indices" : { }
},
"routing_nodes" : {
"unassigned" : [ ],
"nodes" : {
"VYfyWZ8hToeeLKs4fXm69g" : [ ],
"lLtteXggSyGxygvtJ9N7Zw" : [ ],
"T7KaZyfvRZq6D_72Xjf6Nw" : [ ]
}
},
"allocations" : [ ]
}
(END)

Tổng kết

Elasticsearch là một công cụ rất hữu dụng và phổ biến, không chỉ trong ELK mà rất nhiều bộ phần mềm khác cũng sử dụng công cụ này. Do đó tìm hiểu sâu về từng thành phần của ELK là không bao giờ thừa cả.

Hay tiếp tục theo dõi các bài viết khác của Nhân Hòa tại Wiki Nhân Hòa.

 

Chúc các bạn luôn may mắn và thành công trong công việc!

Trả lời