Elasticsearch menggunakan terlalu banyak ruang disk

12

Saya memiliki server CentOS 6.5 di mana saya menginstal Elasticsearch 1.3.2 .

elasticsearch.ymlFile konfigurasi saya adalah modifikasi minimal dari pengiriman dengan elasticsearch sebagai default. Setelah dilucuti dari semua baris yang dikomentari, sepertinya:

cluster.name: xxx-kibana

node:
    name: "xxx"
    master: true
    data: true

index.number_of_shards: 5

index.number_of_replicas: 1

path:
    logs: /log/elasticsearch/log
    data: /log/elasticsearch/data


transport.tcp.port: 9300

http.port: 9200

discovery.zen.ping.multicast.enabled: false

Elasticsearch seharusnya memiliki kompresi ON secara default , dan saya membaca berbagai tolok ukur yang menempatkan rasio kompresi dari serendah 50% hingga setinggi 95%. Sayangnya, rasio kompresi dalam kasus saya adalah -400%, atau dengan kata lain: data yang disimpan dengan ES membutuhkan ruang disk 4 kali lebih banyak daripada file teks dengan konten yang sama . Lihat:

12K     logstash-2014.10.07/2/translog
16K     logstash-2014.10.07/2/_state
116M    logstash-2014.10.07/2/index
116M    logstash-2014.10.07/2
12K     logstash-2014.10.07/4/translog
16K     logstash-2014.10.07/4/_state
127M    logstash-2014.10.07/4/index
127M    logstash-2014.10.07/4
12K     logstash-2014.10.07/0/translog
16K     logstash-2014.10.07/0/_state
109M    logstash-2014.10.07/0/index
109M    logstash-2014.10.07/0
16K     logstash-2014.10.07/_state
12K     logstash-2014.10.07/1/translog
16K     logstash-2014.10.07/1/_state
153M    logstash-2014.10.07/1/index
153M    logstash-2014.10.07/1
12K     logstash-2014.10.07/3/translog
16K     logstash-2014.10.07/3/_state
119M    logstash-2014.10.07/3/index
119M    logstash-2014.10.07/3
622M    logstash-2014.10.07/  # <-- This is the total!

melawan:

6,3M    /var/log/td-agent/legacy_api.20141007_0.log
8,0M    /var/log/td-agent/legacy_api.20141007_10.log
7,6M    /var/log/td-agent/legacy_api.20141007_11.log
6,7M    /var/log/td-agent/legacy_api.20141007_12.log
8,0M    /var/log/td-agent/legacy_api.20141007_13.log
7,6M    /var/log/td-agent/legacy_api.20141007_14.log
7,6M    /var/log/td-agent/legacy_api.20141007_15.log
7,7M    /var/log/td-agent/legacy_api.20141007_16.log
5,6M    /var/log/td-agent/legacy_api.20141007_17.log
7,9M    /var/log/td-agent/legacy_api.20141007_18.log
6,3M    /var/log/td-agent/legacy_api.20141007_19.log
7,8M    /var/log/td-agent/legacy_api.20141007_1.log
7,1M    /var/log/td-agent/legacy_api.20141007_20.log
8,0M    /var/log/td-agent/legacy_api.20141007_21.log
7,2M    /var/log/td-agent/legacy_api.20141007_22.log
3,8M    /var/log/td-agent/legacy_api.20141007_23.log
7,5M    /var/log/td-agent/legacy_api.20141007_2.log
7,3M    /var/log/td-agent/legacy_api.20141007_3.log
8,0M    /var/log/td-agent/legacy_api.20141007_4.log
7,5M    /var/log/td-agent/legacy_api.20141007_5.log
7,5M    /var/log/td-agent/legacy_api.20141007_6.log
7,8M    /var/log/td-agent/legacy_api.20141007_7.log
7,8M    /var/log/td-agent/legacy_api.20141007_8.log
7,2M    /var/log/td-agent/legacy_api.20141007_9.log
173M    total

Apa yang saya lakukan salah? Mengapa data tidak dikompresi?

Saya sementara menambahkan index.store.compress.stored: 1ke file konfigurasi saya, karena saya menemukan bahwa dalam elasticsearch 0.19.5catatan rilis (saat itulah storekompresi keluar pertama), tapi saya belum dapat mengetahui apakah itu membuat perbedaan, dan bagaimanapun kompresi harus dinyalakan oleh default, saat ini ...

Mac
sumber
Apakah Anda pernah mempertimbangkan overhead yang diperlukan untuk menyimpan dan mengindeks data itu? Di sinilah perbedaannya berasal.
mailq
@mailq - AFAIK, elastis kompres baik data dan indeks, dan Anda masih harus melihat penurunan dalam penggunaan ruang pada disk Anda, dibandingkan dengan log teks. Saya berasumsi jarak tempuh dapat bervariasi sesuai dengan struktur log, tetapi log biasanya sangat berulang, jadi pengindeksan tidak harus menjadi yang paling memakan ruang operasi. ... atau saya salah paham?
mac
Log tidak benar-benar berulang. Pengguna A login pada waktu 1. Pengguna B login pada waktu 2. Apa itu berulang? Kedua tuple harus diindeks dan disimpan secara terpisah. Selain entri log itu sendiri.
mailq
@mailq - Supercool maliq, terima kasih banyak. Jika Anda memperluas komentar Anda dan menulis jawaban yang tepat, saya akan senang menandainya sebagai diterima (kalau tidak, saya akan melakukannya nanti, tetapi tidak ingin mencuri guntur Anda!).
mac

Jawaban:

17

Elasticsearch tidak mengecilkan data Anda secara otomatis. Ini berlaku untuk basis data apa pun. Selain menyimpan data mentah, setiap basis data juga harus menyimpan metadata. Database normal hanya menyimpan indeks (untuk pencarian yang lebih cepat) untuk kolom yang db-admin pilih dimuka. ElasticSearch berbeda karena mengindeks setiap kolom secara default. Dengan demikian membuat indeks sangat besar, tetapi di sisi lain memberikan kinerja yang sempurna saat mengambil data.

Dalam konfigurasi normal Anda melihat peningkatan 4 hingga 6 kali dari data mentah setelah pengindeksan. Meskipun sangat tergantung pada data aktual. Tapi ini sebenarnya perilaku yang dimaksudkan.

Jadi untuk mengurangi ukuran basis data, Anda harus sebaliknya seperti yang Anda lakukan di RDBM: Kecualikan kolom agar tidak diindeks atau disimpan sehingga Anda tidak perlu diindeks.

Selain itu Anda dapat mengaktifkan kompresi, tetapi ini hanya akan meningkat ketika "dokumen" Anda besar, yang mungkin tidak benar untuk entri file log.

Ada beberapa perbandingan dan dan tips yang bermanfaat di sini: https://github.com/jordansissel/experiments/tree/master/elasticsearch/disk

Tapi ingat: Pencarian membutuhkan biaya. Biaya yang harus dibayar adalah ruang disk. Tetapi Anda mendapatkan fleksibilitas. Jika ukuran penyimpanan Anda melebihi, maka tumbuhkan secara horizontal! Di sinilah ElasticSearch menang.

mailq
sumber