Docker

Elasticsearch là gì

Elasticsearch (trang chủ Elasticsearch) phát hành năm 2010, là phần mềm miễn phí, nguồn mở viết bằng ngôn ngữ Java, nó có chức năng như như là công cụ tìm kiếm và phân tích phân tán (máy chủ ở nhiều nơi). Elasticsearch được xây dựng dựa trên Apache Lucene, Elasticsearch trở thành công cụ tìm kiếm (search engine) thông dụng nhất và được sử dụng rộng rãi cho các công việc liên quan đến chỉ mục và tìm kiếm tài liệu, phân tích dữ liệu ...

es

Với các ưu điểm như: khả năng phân tích, tìm kiếm dữ liệu nhanh chóng, hỗ trợ tìm kiếm mờ, dễ dàng tạo ra các truy vấn phức tạp, cung cấp sẵn thư viện client cho nhiều ngôn ngữ (Elasticsearch Clients) như Java, Php ... Elasticsearch được sử dụng bởi nhiều công ty lớn như Facebook, GitHub, Wikimedia ...

Ứng dụng web của bạn với nhiều dữ liệu, bạn có thể tận dụng khả năng của Elasticsearch để cung cấp chức năng tìm kiếm bài viết, sản phẩm ... một cách chuyên nghiệp và nhanh chóng!

Một vài khái niệm và cơ chế hoạt động

Khi đã cài đặt được một hệ thống Elasticsearch (có thể chỉ là một server hay nhiều server phân tán), thì tương tác với nó thông qua cơ chế RESTful, nghĩa là từ client tạo ra các HTTP Request (GET, PUT ...) kèm dữ liệu dạng JSON để tương tác với Elasticsearch (tạo, xóa cập nhật dữ liệu, truy vấn tìm kiếm ...).

Để tạo ra HTTP Request gửi đến Elasticsearch bạn có thể sử dụng bất kỳ ngôn ngữ yêu thích nào, ở phần này để không phụ thuộc ngôn ngữ nào sẽ trình bày việc tạo các HTTP Request kèm dữ liệu JSON bằng cách sử dụng CURL, sau đó có thể có một vài bài viết sử dụng PHP, C#, Java để tương tác với Elasticsearch

Trước khi vào thực hành, có thể lướt qua một số khái niệm sau:

cluster là các server (nodes) - Elasticsearch kết nối với nhau để lưu giữ dữ liệu và cung cấp chức năng đánh chỉ mục, tìm kiếm dữ liệu trên các server đó. Một cluster xác định bởi tên duy nhất (mặc định tên là elasticsearch). Bạn cũng lưu ý, dù bạn chỉ tạo ra hệ thống với 1 server (node) thì vẫn có một cluster, sau này có thể nối nhiều server phân tán vào cluster để mở rộng khả năng của hệ thống mà ở đó một node (server) có thể có một chức năng riêng như (master node, data, client...).

node đó là một server tham ra tạo thành cluster, nó có vai trò lưu dữ liệu, đánh chỉ mục và cung cấp khả năng tìm kiếm. Một node cũng cần xác định một cái tên, mặc định một tên duy nhất (UUID) được sinh ra cho nó khi nó chạy trừ khi bạn gán cho nó một cái tên cụ thể. Mặc định mỗi node cần thiết lập nối vào một cluster đã đặt tên (mặc định là elasticsearch), có nghĩa là khi node hoạt động nó sẽ khám phá mạng tìm đến cluster với tên chỉ định để nối vào. Nếu như bạn chạy một server (node) mà mạng của bạn chưa có một cluster nào với tên chỉ ra, thì node này sẽ tự động là một cluster với tên mặc định elasticsearch

index là một tập hợp các tài liệu (document), những tài liệu này có một số tên thuộc tính tính chất chung. Thường mỗi index là một loại dữ liệu nào đó của bạn ví dụ như index chữa các sản phẩm, index chứa các đơn hàng, index chứa các bài viết ... Mỗi index được đặt một cái tên (nhớ là chữ thường), tên này dùng để thi hành các chức năng như đánh chỉ mục, tìm kiếm, cập nhật ... cho các dữ liệu (document) trong nó. Mỗi node có thể tạo nhiều index

Document là đơn vị thông tin lưu trong index (giống như dòng lưu trong bảng), đơn vị thông tin này biểu diễn bằng JSON (JavaScript Object Notation), qua đó nó lưu loại dữ liệu của bạn như sản phẩm, bài viết, đơn hàng ... Một index lưu bao nhiêu Document cũng được.

Shard Để giải quyết các vấn đề hiệu năng khi lưu trữ dữ liệu lớn bị giới hạn bởi phần cứng ES cung cấp khả năng chia một index ra thành từng mảnh nhỏ hơn - mỗi mảnh nhỏ đó gọi là shard. Khi tạo ra index, bạn có thể chia nó ra thành bao nhiêu shard tùy bạn. Một shard đó vẫn có đầy đủ chức năng như index nhưng độc lập với index, vào có thể lưu ở các node khác nhau. Shard nó giúp giải quết vấn đề hiệu năng tốc độ, tìm kiếm song song trên nhiều node phân tán. Ngoài ra bạn cũng có khái niệm replica đó là một bản backup, copy của shard để ES có thể phục hồi nếu một shard nào đó bị chết.

Cài đặt Elasticsearch và công cụ Kibana

Elasticsearch có thể tải về, cài đặt trực tiếp trên hệ thống máy của bạn với hướng dẫn đơn giản tại Elasticsearch, ở bài này sẽ cài đặt và chạy Elasticsearch bằng Docker (bạn có thể xem cách dùng Docker nếu bạn chưa biết.)

Mặc định Elasticsearch lắng nghe các yêu cầu HTTP gửi đến ở cổng 9200, có nghĩa bạn sẽ tương tác với nó ở địa chỉ http://localhost:9200, vào gửi đi các HTTPD Request có thể thực hiện bằng lệnh CURL nên nếu hệ thống chưa có lệnh này bạn cần cài đặt vào trước để thực hành (Linux, macOS có thể đã có sẵn curl, Windows cần cài thêm). Ngoài ra bạn cũng có thể sử dụng các công cụ như Postman trực quan hơn, hoặc sử dụng thẳng thư viện theo ngôn ngữ lập trình của bạn (Elasticsearch Clients) ...

Một công cụ quản lý, giám sát tương tác với Elasticsearch một cách trực quan qua môi trường web (truy cập bằng trình duyệt) đó là Kibana, dưới đây cũng sẽ cài đặt công cụ này bằng Docker cùng với ES.

Sau đây là file docker-compose.yml với nội dung tạo ra container Docker chạy Elasticsearch và Kibana với mục tiêu như sau:

  • Elasticsearch (elasticsearch:7.0.1) lắng nghe ở cổng 9200, một node tên là elasticsearch và khởi tạo là master node, đặt tên clusterdatasearch
  • Nơi lưu dữ liệu của node là ổ đĩa ánh xạ thư mục /Users/xuanthulab/Desktop/xdata/docker/elasticsearch/data (bạn thay bằng thư mục máy host Docker của bạn).
  • Container chạy kibana (kibana:7.0.1) lắng nghe ở cổng 5601
docker-compose.yml
version: '3'

services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.0.1
    container_name: elasticsearch
    environment:
      - node.name=elasticsearch
      - cluster.name=datasearch
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
      - cluster.initial_master_nodes=elasticsearch
    ulimits:
      memlock:
        soft: -1
        hard: -1
    ports:
      - "9200:9200"
    volumes:
      - esdata:/usr/share/elasticsearch/data

  kibana:
    image: docker.elastic.co/kibana/kibana:7.0.1
    ports:
      - "5601:5601"

volumes:
  esdata:
    driver_opts:
      device: /Users/xuanthulab/Desktop/xdata/docker/elasticsearch/data
      o: bind

Với file docker-compose.yml này, chạy Docker (xem thêm Sử dụng Docker-compose)vào thư mục lưu file này và gõ lệnh để chạy các dịch vụ trên:

docker-compose up

Sau lệnh này nó sẽ tải các image docker tương ứng về và khởi chạy 2 dịch vụ là Elasticsearch (http://localhost:9200) và Kibana (http://localhost:5601)

Và như vậy đã có ES để thực hành.

Hãy vào phần Sử dụng ElasticSearch cơ bản để thực hiện các tương tác đầu tiên!

Đăng ký theo dõi ủng hộ kênh