Tải bản đầy đủ

Thực nghiệm với elastic search

TR¦êNG §¹I HäC B¸CH KHOA Hµ NéI
VIÖN C¤NG NGHÖ TH¤NG TIN Vµ TRUYÒN TH¤NG

BÀI TẬP LỚN
MÔN PHÂN TÍCH VÀ THIẾT KẾ CƠ SỞ DỮ LIỆU
ĐỀ TÀI: THỰC NGHIỆM VỚI ELASTIC SEARCH

Giảng viên hướng dẫn
Sinh viên thực hiện
Nguyễn Đăng Chiến
Nguyễn Việt Anh
Đỗ Đức Hiếu

: Vũ Tuyết Trinh


Thực nghiệm với Elastic search

Hà Nội, 12 - 2015

Trang 2



Thực nghiệm với Elastic search

Mục lục

Trang 3


Thực nghiệm với Elastic search

Lời nói đầu
Khi lập trình đến lúc ta sẽ phải làm việc với cơ sở dữ liệu lớn đến hàng GB, ta
phải thực hiện truy vấn với hàng triệu bản ghi thường xuyên. Việc tối ưu các câu
truy vấn SQL chỉ giải quyết được một phần nhỏ. Ngày nay, với sự phát triển của
công nghệ thì Elastic search được coi là một search engine khá tốt, được đánh giá
cao về hiệu năng. Trong bài báo cáo này chúng em sẽ đi tìm hiểu và thực nghiệm
với Elastic search. Chúng em chân thành cảm ơn cô Vũ Tuyết Trinh đã giúp đỡ để
chúng em có thể hoàn thành tốt báo cáo này.

Trang 4


Thực nghiệm với Elastic search
I.
Các khái niệm căn bản trong Elastic search:
1. NRT (Near real time):
- ES là một nền tảng Search “gần” thời gian thực, nghĩa là có 1 độ trễ nhỏ

2.

3.

4.

5.

6.

từ lúc bạn index 1 document cho đến lúc nó có thể được search ra,

thường là khoảng 1 giây.
Cluster:
- Một cluster(cụm) là một tập hợp của một hoặc nhiều Nodes (servers) mà
cùng nhau nắm giữ toàn bộ dữ liệu của bạn và cung cấp các chỉ mục và
khả năng search qua tất cả các nodes. Một cluster được định danh bởi 1
tên duy nhất, mặc định là “elasticsearch”.
- Ta có thể có nhiều clusters độc lập với những cluster name khác nhau.
Node:
- Một node là một server riêng mà là một phần trong Cluster của bạn. Lưu
trữ dữ liệu và tham gia vào việc lập chỉ mục và search. Một node cũng
được định danh bởi một tên riêng biệt, mặc định bằng tên của một nhân
vật trong Marvel, được chỉ định cho node khi khởi động. Cái tên mặc định
này bạn có thể thay đổi được.
- Mặc định mỗi node được thiết đặt để join với một cluster nhất định bởi
cluster name. Mặc định sẽ được join vào “elasticsearch” cluster. Điều đó
có nghĩa khi bạn khởi động một vài nodes trong cùng một mạng của bạn,
thì chúng sẽ nhìn thấy nhau và là các nhánh riêng của một cụm chung tên
là “elasticsearch”.
- Trong một cluster bạn có thể có bao nhiêu node cũng được.
Index :
- Một index là một tập hợp các documents có đặc điểm chung. Ví dụ, bạn có
một index cho dữ liệu sản phẩm, một index khác cho danh mục sản phẩm,
hoặc một index khác để sắp xếp dữ liệu. Một index được được định danh
bởi tên riêng, tên riêng viết thường, ko viết hoa. Cái tên này dùng để liên
hệ đến index khi thực hiện tạo index, search, update, delete document
trong nó.
- Trong một cluster có thể chứa nhiều index.
Type:
- Trong một index bạn có thể định nghĩa một hoặc nhiều types. Một type là
một mục/phân vùng có nghĩa trong index của bạn. Mỗi Type được định
nghĩa cho document bao gồm một số fields. Ví dụ bạn làm blog, bạn có
thể định nghĩa một type cho dữ liệu user, type khác cho dữ liệu blog hay
type khác cho dữ liệu comment.
Document:
- Một Document là một đơn vị thông tin cơ bản để được đánh index. Ví dụ
bạn có một document cho một customer, document khác cho một sản
phẩm hay cho một đơn đặt hàng khác. Document này được format dưới
Trang 5


Thực nghiệm với Elastic search
dạng JSON, dạng dữ liệu phổ biến mà tất cả các ngôn ngữ khác có thể
hiểu được.
- Trong mỗi index/type, bạn có thể lưu trữ nhiều documents. Chú ý một
document cần được gán vào một type bên trong index để có thể được
đánh index.
7. Shard & Replicas:
- Mỗi index có thể được chia thành nhiều Shards. Mỗi index cũng có thể
được sao lưu nhiều lần. Mỗi khi được nhân bản, mỗi index sẽ có những
shards chính và những shards nhân bản (copy từ shards chính). Số lượng
shards và replicas có thể được khai báo khi tạo index. Sau khi index được
tạo, bạn có thể thay đổi số lượng bản sao bất cứ lúc nào nhưng không thể
thay đổi số shards.
- Mặc định mỗi index trong Elastic search có 5 primary shard và mỗi shard
sẽ có một replica shard tương ứng. Như vậy nếu ta có tối thiểu 2 node
trong 1 cluster thì ta sẽ có 5 primary shard và 5 replica shard. Như vậy ta
có tổng cộng 10 shard/ 1 index.
II.
Hoạt động bên trong một cluster:
1. Một cluster rỗng:
- Chúng ta sẽ bắt đầu với một node đơn chưa có dữ liệu và chỉ mục, cluster
trông sẽ có dạng như hình sau:

Mỗi node là một “running instance ” của elastic search. Mỗi cluster bao
gồm một hoặc nhiều node. Các node làm việc cùng nhau, chúng chia sẽ dữ
liệu cho nhau. Khi một node được thêm vào hay xóa đi thì dữ liệu sẽ được
tổ chức và dàn trải lại ra các node.
- Một node sẽ được chọn làm master node. Nó có nhiệm vụ quản lý việc tạo
hay xóa các index, thêm hoặc xóa các node của một cluster.
- Chúng ta có thể giao tiếp với mọi node trong cluster. Mọi node đều biết vị
trí của document mà ta đang quan tâm do đó chúng có thể gửi yêu cầu
đến node chứa dữ liệu mà ta quan tâm.
2. Tình trạng của cluster:
- Dưới đây là ví dụ về thông tin của 1 cluster rỗng.
-

Trang 6


Thực nghiệm với Elastic search

Trường status sẽ cho chúng ta biết tình trạng của cluster. Có 3 giá trị thể
hiện tình trạng của cluster bao gồm green, yellow và red.
green: tất cả các primary shard và replica shard đều hoạt động.
yellow: tất cả các primary shard đều hoạt động, còn replica shard có thể
không.
red: không có một primary shard nào hoạt động.
3. Thêm 1 index:
- Để thêm dữ liệu, chúng ta cần 1 index, nơi lưu trữ các dữ liệu liên quan.
Trên thực tế, mỗi index là một tên logic (logical namespace) trỏ đến một
hoặc nhiều shard.
- Các document của chúng ta sẽ được lưu trữ và index tron shard nhưng
chúng ta không làm việc trực tiếp với chúng, chúng ta làm việc với index.
- Shard là một cách để phân tán dữ liệu trong một cluster. Số lượng shard
có thể tăng lên hoặc giảm đi do đó Elastic search có nhiệm vụ tự động
dịch chuyển các shard giữa các node để đảm bảo cluster luôn được giữ
cân bằng.
- Số lượng primary shard sẽ được thiết lập ngay khi index được khởi tạo
còn số lượng replica shard có thể thay đổi theo thời gian.
- Ví dụ chúng ta có 1 node đơn với 3 shard và 1 index:
-

Trang 7


Thực nghiệm với Elastic search

Thông tin về cluster này:

Tình trạng của cluster là yellow nghĩa là các primary shard đã hoạt động
còn các replica shard chưa hoạt động.
4. Trường hợp xảy ra lỗi:
- Để tránh mất mát dữ liệu trong quá trình hoạt động ta cần khai báo các
replica shard cho các primary shard.
- Ta thêm một node vào trong cluster để lưu trữ các replica shard trong
tình trạng node đầu tiên bị lỗi. Điều đó có nghĩa khi node đầu tiên bị lỗi
thì dữ liệu trên cluster vẫn còn, các request vẫn có thể thực hiện trên dữ
liệu sao lưu này.
Ví dụ khi thêm vào node 2:

Trang 8


Thực nghiệm với Elastic search

Thông tin của cluster lúc này:

Ta thấy tình trạng của của cluster hiện tại là green, nghĩa là nó đã sẵn
sàng.
5. Mở rộng theo chiều ngang:
- Ta mở rộng bằng cách thêm vào một node sau đó di chuyển các shard từ
node 1 và node 2 sang.

-

Điều này có nghĩa tài nguyên phần cứng như CPU, RAM, I/O sẽ được chia
sẻ giữa các shard với nhau, cho phép các shard làm việc hiệu quả hơn.
Trang 9


Thực nghiệm với Elastic search
-

Mỗi shard trong một node có khả năng sử dụng tối đa 100% tài nguyên
phần cứng để tăng hiệu quả hoạt động.
Để mở rộng làm tăng hiệu năng request ta có thể tăng số lượng replica
shard, với mỗi primary shard ta có 2 replica shard. Ta sẽ phân bố đều ra 3
node để dữ liệu trên 3 node này là như nhau.

Lưu ý: không nên có nhiều replica shard cùng tên trong một node như
vậy không làm tăng hiệu năng bởi vì mỗi shard chỉ có thể truy nhập một
phần nhỏ tài nguyên của node, mà điều này chỉ gây dư thừa dữ liệu.
6. Khi một node bị lỗi:
- Khi một node bị lỗi tình trạng được mô tả như sau:
-

-

Node vừa bị lỗi là master node do đó cluster sẽ phải chọn ngẫu nhiên ra
một node làm master node. Sau khi node 1 bị lỗi primary shard 1 và 2 đều
bị mất, nên tình trạng của cluster sẽ chuyển sang red. Lúc này master
node mới sẽ yêu cầu các replicas shard trong các node còn lại tự động
chuyển thành primary. Khi đó tình trạng của cluster sẽ chuyển sang
yellow do khai báo ở trên mỗi 1 primary shard có 2 replicas shard mà
hiện tại chỉ còn 1. Nếu node 2 bị lỗi tương tự như node 1 thì dữ liệu trên

Trang 10


Thực nghiệm với Elastic search
node 3 vẫn còn các replicas shard sẽ tự động chuyển thành primary shard
để giữ cho ứng dụng vẫn chạy.
III.
Kịch bản thử nghiệm:
1. Tài nguyên:
- Gồm có 3 Cloud server với ram 2GB và dung lượng lưu trữ tầm 30GB.
- 2 server có cài java, elastic search.
- 1 server có cài NGINX đóng vai trò là một load balancer.
2. Kịch bản:
Chúng ta tiến hành so sánh hiệu năng khi sử dụng một 1 server và 2
server. Hình vẽ dưới đây sẽ thể hiện kịch bản thử nghiệm:
Thử nghiệm 1: 1 server

Thử nghiệm 2: 2 server

Trên mỗi thử nghiệm ta tiến hành những nội dung sau:

Trang 11


Thực nghiệm với Elastic search
Ta thử nghiệm với 3 phép toán chính: index, find document, và
aggregation.
- Ta sẽ đo ghi lại các thông số: số lượt request thành công trên 1 s, các
thông số CPU, và Disk IOPS (số lượng phép toán read/write trên 1 s của
đĩa).
3. Kết quả:
3.1.
Phép toán Index:
- 10 triệu bản ghi trên mỗi node.
- Số lượng document trong 1 request 500 documents.
-

Number of node

40000 docs

100000 docs

150000 docs

1

39s

77s

150s

2

49s

97s

129s

3.2.
-

Phép toán Aggregation:
Câu truy vấn với Aggregation:
{
"query": {
"bool": {
"must": [{
"range": {
"staff.age": {
"from": "1",
"to": "60"
}
}
}],
"must_not": [],
"should": []
}
},
"aggs" : {
"sum_salary" : { "sum" : { "field" : "salary" } }
}
}
Trang 12


Thực nghiệm với Elastic search
-

Thực nghiệm với 2 test case:
Case 1: 1 node với 10 triệu document.
Case 2 : 2 node với 20 triệu document.
Với các tham số time out 30s, concurrent level 20.

Number of request

1000

2000

3000

Case 1

2,68

2,73

2,69

Case 2

2,69

2,85

2,75

-

Thông số trên CPU:

Number of request

1000

2000

3000

Case 1

99 %

99%

99%

Case 2

40% and 33%

52% and 23%

50% and 40%

3.3.
-

Phép toán Find Document:
Câu truy vấn với Find Document:
{
"query": {
"bool": {
"must": [{
"range": {
"manager.age": {
"from": "20",
"to": "30"
}
}
}],
"must_not": [],
"should": []
}
},
"from": 0,
Trang 13


Thực nghiệm với Elastic search
"size": 50,
"sort": [],
"facets": {}

-

}
Thực nghiệm với 2 test case:
Case 1: 1 node với 10 triệu bản ghi.
Case 2: 2 node với 20 triệu bản ghi.
Time out 30s concurrent level 20.

Number of request

8000

9000

10000

Case 1

165.14

155.24

143

Case 2

230

199.71

290

-

-

Thông số trên DiskIOPs:
Trạng thái thông thường: 1 phép toán.
Trạng thái aggregation: 32 phép toán (với 29 phép toán đọc, 3 phép toán
ghi)
Thông số trên CPU:

Number of request

8000

9000

10000

Case 1

44 %

43%

37%

Case 2

20% and 13%

14% and 22%

27% and 12%

Trang 14


Thực nghiệm với Elastic search
IV.

Kết luận:
Qua thử nghiệm trên ta có thể rút ra kết luận về lợi ích khi sử dụng
elastic search về tính chịu tải, khả năng phân tán, thời gian truy vấn.

Trang 15


Thực nghiệm với Elastic search

Tài liệu tham khảo.
[1] Document Elastic search:
http://elastic.co/guide/en/elasticsearch/reference/1.4
[2] Các tài liệu khác trên mạng Internet.

Trang 16



Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay

×