Tao hui http://weibo.com/taohui3
Versi bahasa Inggris
Konsep desain
Lushan adalah basis data nilai kunci ringan di versi 1.0. Menggunakan Lushan Anda dapat dengan mudah membangun cluster di beberapa mesin seperti memcached. Lushan 2.0 juga merupakan kerangka kerja aplikasi yang ringan yang dapat memasang beberapa perpustakaan bersama, sehingga Anda memiliki kemampuan untuk mengakses data dan menghitung dalam satu proses pada saat yang sama, yang membuatnya mudah untuk menulis layanan data-kuantitas yang besar dan berkinerja tinggi. Terutama cocok untuk skenario bisnis untuk rekomendasi internet, iklan, dan pencarian. Lushan telah digunakan dalam rekomendasi dan bisnis periklanan Sina Weibo selama bertahun -tahun.
Sekitar 2013, saya sedang mengembangkan rekomendasi "Weibo yang terlewatkan". Saya perlu menyediakan beberapa toko data secara online untuk bereksperimen dengan algoritma yang berbeda, serta versi online dan pengujian mereka. Ini membutuhkan beberapa sistem untuk digunakan. Pendekatan ini terlalu rendah. Jadi, satu akhir pekan saya mengembangkan Lushan, yang dapat membebaskan Anda dari hal -hal ini, sangat keren.
Ini benar, Lushan sejak itu menjadi infrastruktur untuk bisnis rekomendasi dan iklan Weibo. Sekarang ada dua kelompok yang beroperasi dan memelihara, dengan 12 mesin masing -masing, menyajikan data kueri online dari T, dengan lebih dari 1 miliar kueri per hari.
Ketika saya selesai mengembangkan versi pertama Lushan, saya selalu memiliki keinginan untuk memungkinkan Lushan memasang perpustakaan bersama secara bersamaan. Tetapi saya sudah lama tidak memutuskan, karena saya percaya bahwa kerangka kerja harus memiliki posisi sendiri, dan yang lainnya adalah bahwa bagian yang mudah diubah harus dipisahkan dari bagian stabil dalam arsitektur. Namun, pada tahun 2015, ketika mengembangkan iklan Weibo, data minat pengguna, data relasional, dan data fitur perkiraan CTR dengan mudah diurutkan melalui Hadoop dan disimpan di Lushan. Jadi saya melepaskan ide asli saya dan menerapkan versi kedua, membuat fungsi Lushan lebih kuat. Dalam aplikasi yang sebenarnya, Anda masih dapat menggunakan Lushan hanya sebagai database nilai kunci, atau menggunakan cluster Lushan yang hanya menyediakan data dan cluster yang menyediakan komputasi pada saat yang sama secara terpisah.
Perpustakaan sampel telah disediakan di direktori contoh, dan memasangnya sesuai dengan langkah -langkah berikut:
Output adalah nilai yang sesuai dengan kunci 123456.
Jelaskan setiap langkah:
Ketika digunakan sebagai kerangka kerja komputasi, Lushan mendukung dua protokol, mirip dengan protokol "URL" baris tunggal dari HTTP, dan protokol yang mirip dengan posting HTTP yang menentukan panjang nilai pengiriman, yang juga mendukung pengiriman data biner. Dua contoh disediakan dalam direktori modul: lproxy dan lecho, yang masing -masing menunjukkan kedua protokol ini.
Contoh lproxy, untuk kunci yang diminta, permintaan redis terlebih dahulu, dan kembali secara langsung jika ada redis, dan kueri perpustakaan yang dipasang lokal jika ada redis. Dalam kasus sederhana, contoh ini juga dapat digunakan di lingkungan produksi.
Ikuti langkah -langkah di bawah ini:
Buat file teks x.txt, masukkan dua baris berikut, tab pertama adalah kunci, dan berikut ini adalah nilainya, sebagai berikut:
168 hello lushan
187 line 2
Gunakan Lushan_line_maker dalam alat untuk mengonversinya ke format file Lushan.
Mulailah redis pada mesin, atur dbno adalah 1, dan kemudian tambahkan catatan, kunci adalah 168, nilai adalah "halo redis"
Jalankan Make di Direktori HProxy, Tempatkan hmodule.so dan hmodule.conf yang dihasilkan di direktori HMOD/15/1.0.0, dan memodifikasi host dan port di hmodule.conf untuk menggunakan IP dan port Redis untuk Anda.
melaksanakan:
echo -ne "hmod_open /mnt/lushan/hmod/15/1.0.0/ 15rn" | nc 127.0.0.1 9999
Jika dibuka dikembalikan, itu akan berhasil dihidupkan, jika tidak periksa apakah libhiredis ada di ld_library_path.
Pertanyaan:
echo -ne "get m15?k=1-168rn" | nc 127.0.0.1 9999
VALUE m15?k=1-168 0 11
hello redis
END
echo -ne "get m15?k=1-187rn" | nc 127.0.0.1 9999
VALUE m15?k=1-187 0 6
line 2
END
Kemudian, seperti yang kita harapkan, jika Redis ada, hasil Redis akan dikembalikan, jika tidak data Lushan akan ditanyakan.
Tutup modul:
echo -ne "hmod_close 15rn" | nc 127.0.0.1 9999
Jika semua modul Anda tidak memiliki variabel global, Anda dapat menggunakan hmod_open untuk secara langsung mengganti perpustakaan lama, sehingga tidak ada kerugian untuk layanan online.
Contoh Lecho serupa, cukup mengembalikan data yang Anda minta.
Hdict adalah format perpustakaan yang dipasang oleh Lushan. Dia sangat sederhana. Ada dua file yang diperlukan di direktori HDICT_XXXX, DAT dan IDX. Yang pertama berisi data Anda, dan yang terakhir adalah pemetaan tombol untuk nilai offset dalam file DAT. definisi:
typedef struct {
uint64_t key;
uint64_t pos;
} idx_t;
Kuncinya adalah kerangka panjang tanpa tanda 64-bit yang tidak termasuk nomor perpustakaan. POS terdiri dari panjang nilai dan offsetnya dalam file DAT:
pos = (length << 40) | offset;
File IDX harus diatur dalam urutan naik IDX_T.Key. File DAT tidak diperlukan. Anda dapat membuat indeks pada file DAT yang sudah ada, atau menghasilkan indeks pada saat yang sama saat mengeluarkan file.
File yang dipesan sangat umum dalam model komputasi peta-reduce. Anda dapat menentukan format file output di Hadoop untuk menghasilkan pustaka dalam format HDICT. Misalnya, perintah berikut:
job.setOutputFormat(LushanFileOutputFormat.class);
Ada tiga perintah untuk mendapatkan data status statistik: statistik, info dan hmod_info. Yang pertama mengeluarkan data global, sedangkan dua output data terakhir untuk setiap pustaka dan setiap modul.
echo -n -e "statsrn" | nc 127.0.0.1 9999
STAT pid 13810
STAT uptime 1435075686
STAT curr_connections 1411
STAT connection_structures 4061
STAT cmd_get 2099151223
STAT get_hits 3950240117
STAT get_misses 2443878402
STAT threads 16
STAT timeouts 117
STAT waiting_requests 0
STAT ialloc_failed 0
END
echo -n -e "inforn" | nc 127.0.0.1 9999
id label state ref num_qry idx_num open_time path
----------------------------------------------------------------
1 interest_CF_trends OPEN 0 139922 18419392 150824-042654 /mnt/lushan/hdb/12/hdict_20150711204737
2 interest_CF_trends OPEN 0 190508 26175141 150824-050246 /mnt/lushan/hdb/12/hdict_20150711204737
echo -ne "hmod_inforn" | nc 127.0.0.1 9999
id label state ref num_qry open_time path
----------------------------------------------------------------
0 OPEN 0 267130787 180419-174502 /mnt/lushan/hmod/0
5 OPEN 0 336829974 180419-174503 /mnt/lushan/hmod/5
Anda dapat menggunakan Lushan.php untuk membuat halaman status statistik grafis.
Jika Anda memiliki pengalaman dengan MySQL, akan mudah untuk membangun cluster sederhana. Pertama, Anda ingin membagi data Anda menjadi grup, biasanya kelipatan nomor mesin Anda. Kemudian pertimbangkan berapa banyak set layanan yang ingin Anda gunakan, biasanya dua set didistribusikan dalam IDC yang berbeda. Kemudian ikuti aturan pengelompokan untuk menanyakan data Anda melalui klien memcached.
Meskipun sangat sederhana, Lushan masih memberikan kerangka kerja sederhana untuk membantu Anda menangani beberapa detail transmisi data.
Protokol memcached relatif sederhana. Perintah Kelas Set mendukung permintaan yang kompleks, tetapi hanya mendukung hasil yang relatif sederhana. Lushan telah membuat dua perubahan pada ini.
"Kunci" dari permintaan GET dapat melebihi batas 250 byte. Pengaturan saat mengirim:
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_VERIFY_KEY, 0);
Dengan cara ini, tidak ada masalah pengiriman melalui libmemcached. Saat mengembalikan hasilnya, Anda harus mengembalikan kunci dalam 250 byte. Selama Anda membaca sesuai dengan kunci terpotong saat membaca, dan kunci terpotong tidak bertentangan.
Gunakan dapat mendukung pengiriman beberapa jalur permintaan. Biasanya permintaan GET sederhana sudah cukup, tetapi jika Anda ingin mengirim permintaan yang mirip dengan JSON, Anda memerlukan protokol yang lebih kompleks. Lushan memodifikasi ulang protokol GET dan memodifikasinya menjadi protokol yang sama dengan yang ditetapkan. Saat menggunakan klien, tekan pengaturan di atas untuk memeriksa legalitas tombol, dan kemudian kirim paket dalam format berikut:
gets key 0 0 value_lenrn
valuern
Ambil saja kunci dalam hasil pengembalian. Enkapsulasi dibuat di Lutil.h, dan hubungi hrequest_pack.
Ada lebih banyak batas waktu dalam stat, atau Anda merekam lebih banyak permintaan dari klien ke waktu waktu yang lebih besar dari atau sama dengan konfigurasi Anda.
Ada banyak file HDICT yang belum ditransmisikan dalam sejumlah unggahan, yang biasanya berarti bahwa skrip transmisi Anda akan terganggu sebelum dikirimkan.