Tao hui http://weibo.com/taoHUI3
Version anglaise
Concept de conception
Lushan était une base de données de valeur clé légère dans la version 1.0. En utilisant Lushan, vous pouvez facilement construire un cluster sur plusieurs machines comme Memcached. Lushan 2.0 est également un cadre d'application léger qui peut monter plusieurs bibliothèques partagées, afin que vous ayez la possibilité d'accéder aux données et de calculer dans un processus en même temps, ce qui facilite la rédaction de grandes services de données et de hautes performances. Particulièrement adapté aux scénarios d'entreprise pour les recommandations Internet, la publicité et la recherche. Lushan est utilisé dans les affaires de recommandation et de publicité de Sina Weibo depuis de nombreuses années.
Vers 2013, je développais la recommandation "manquée de Weibo". J'ai besoin de fournir plusieurs magasins de données en ligne pour expérimenter différents algorithmes, ainsi que leurs versions en ligne et test. Cela nécessite que plusieurs systèmes soient déployés. Cette approche est trop faible. Donc, un week-end, j'ai développé Lushan, ce qui peut vous libérer de ces choses, très cool.
Cela est vrai, Lushan est depuis devenu l'infrastructure de la recommandation et de la publicité de Weibo. Maintenant, il y a deux clusters opérant et entretenus, avec 12 machines respectivement, en servant des données de requête en ligne de T, avec plus d'un milliard de requêtes par jour.
Lorsque j'ai fini de développer la première version de Lushan, j'ai toujours eu envie de permettre à Lushan de monter la bibliothèque partagée en même temps. Mais je n'ai pas pris ma décision depuis longtemps, car je crois qu'un cadre devrait avoir son propre positionnement, et l'autre est que la partie facilement modifiée doit être séparée de la partie stable de l'architecture. Cependant, en 2015, lors du développement des publicités de Weibo, les données d'intérêt de l'utilisateur, les données relationnelles et les données des fonctionnalités des estimations CTR ont été facilement triées via Hadoop et stockées dans Lushan. J'ai donc abandonné mon idée originale et implémenté la deuxième version, ce qui rend la fonction Lushan encore plus puissante. Dans les applications réelles, vous pouvez toujours utiliser Lushan uniquement comme une base de données de valeur clé, ou déployer des clusters Lushan qui ne fournissent que des données et des clusters qui fournissent le calcul en même temps séparément.
Une bibliothèque d'échantillons a été fournie dans le répertoire des exemples et le montez en fonction des étapes suivantes:
La sortie est la valeur correspondant à la clé 123456.
Expliquez chaque étape:
Lorsqu'elle est utilisée comme cadre informatique, Lushan prend en charge deux protocoles, similaires au protocole "URL" unique de GET HTTP, et un protocole similaire à la publication HTTP qui spécifie la longueur de valeur d'envoi, qui prend également en charge l'envoi de données binaires. Deux exemples sont fournis dans le répertoire des modules: lproxy et lecho, qui démontrent respectivement ces deux protocoles.
Exemple de lproxy, pour une clé demandée, interrogez d'abord Redis et retournez directement s'il y a redis, et interrogez les bibliothèques montées locales en cas de redis. Dans les cas simples, cet exemple peut également être utilisé dans les environnements de production.
Suivez les étapes ci-dessous:
Créez un fichier texte x.txt, entrez les deux lignes suivantes, le premier onglet est la clé, et ce qui suit est la valeur, comme suit:
168 hello lushan
187 line 2
Utilisez LUSHAN_LINE_MAKER dans les outils pour le convertir au format de fichier Lushan.
Démarrer un redis sur la machine, définir DBNO est 1, puis ajouter un enregistrement, la clé est 168, la valeur est "Hello Redis"
Exécutez Make dans le répertoire hproxy, placez le répertoire HModule.So et Hmodule.conf généré dans le répertoire HMOD / 15 / 1.0.0 et modifiez l'hôte et le port dans HModule.conf pour déployer l'IP et le port de Redis pour vous.
mettre en œuvre:
echo -ne "hmod_open /mnt/lushan/hmod/15/1.0.0/ 15rn" | nc 127.0.0.1 9999
Si l'ouverture est retournée, elle sera activée avec succès, sinon vérifiez si Libhiredis est dans LD_LIBRARY_PATH.
Requête:
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
Ensuite, comme nous nous attendons à ce que Redis existe, le résultat Redis sera retourné, sinon les données Lushan seront interrogées.
Fermez un module:
echo -ne "hmod_close 15rn" | nc 127.0.0.1 9999
Si tous vos modules n'ont pas de variables globales, vous pouvez utiliser HMOD_OPEN pour remplacer directement l'ancienne bibliothèque, afin qu'il n'y ait aucune perte pour les services en ligne.
L'exemple de Lecho est similaire, renvoie simplement les données que vous avez demandées.
Hdict est le format de bibliothèque monté par Lushan. Il est très simple. Il y a deux fichiers nécessaires dans le répertoire HDICT_XXXX, DAT et IDX. Le premier contient vos données, et le second est un mappage de la clé de la valeur compensée de position dans le fichier DAT. définition:
typedef struct {
uint64_t key;
uint64_t pos;
} idx_t;
Key est un long squelette non signé 64 bits qui n'inclut pas le numéro de bibliothèque. POS est composé de la longueur de la valeur et de son décalage dans le fichier DAT:
pos = (length << 40) | offset;
Le fichier IDX doit être organisé par ordre croissant d'idx_t.key. Les fichiers DAT ne sont pas requis. Vous pouvez soit créer un index sur un fichier DAT qui existe déjà, soit générer un index en même temps lors de la sortie du fichier.
Les fichiers commandés sont très courants dans les modèles de calcul Map-Reduce. Vous pouvez spécifier le format de fichier de sortie dans Hadoop pour générer une bibliothèque au format HDICT. Par exemple, la commande suivante:
job.setOutputFormat(LushanFileOutputFormat.class);
Il existe trois commandes pour obtenir des données d'état statistique: statistiques, informations et hmod_info. Le premier produit des données globales, tandis que les deux dernières produisent des données pour chaque bibliothèque et chaque module.
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
Vous pouvez utiliser Lushan.php pour créer des pages d'état de statistiques graphiques.
Si vous avez de l'expérience avec MySQL, il sera facile de construire un simple cluster. Tout d'abord, vous souhaitez diviser vos données en groupes, généralement un multiple du numéro de votre machine. Considérez ensuite le nombre de séries de services que vous souhaitez déployer, généralement deux ensembles de distribution dans différents IDC. Suivez ensuite les règles de regroupement pour interroger vos données via le client memcached.
Bien qu'il soit très simple, Lushan fournit toujours un cadre simple pour vous aider à gérer certains détails de la transmission des données.
Le protocole Memcached est relativement simple. La commande SET CLASS prend en charge les demandes complexes, mais ne prend en charge que des résultats relativement simples. Lushan a apporté deux modifications à cela.
La "clé" de la demande GET peut dépasser la limite de 250 octets. Paramètres lors de l'envoi:
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_VERIFY_KEY, 0);
De cette façon, il n'y a aucun problème à envoyer par libmemcached. Lorsque vous renvoyez le résultat, vous devez renvoyer la clé dans les 250 octets. Tant que vous lisez en fonction de la clé tronquée lors de la lecture, et la clé tronquée ne se confond pas.
Utiliser GOT pour prendre en charge l'envoi de plusieurs lignes de demandes. Habituellement, une demande de GET simple est suffisante, mais si vous souhaitez envoyer une demande similaire à JSON, vous avez besoin d'un protocole plus complexe. Lushan a rénové le protocole GET et l'a modifié au même protocole que Set. Lorsque vous utilisez le client, appuyez sur les paramètres ci-dessus pour vérifier la légalité de la touche, puis envoyez un paquet dans le format suivant:
gets key 0 0 value_lenrn
valuern
Il suffit de récupérer la clé dans le résultat de retour. L'encapsulation est fabriquée dans Lutil.h, et il suffit d'appeler hrequest_pack.
Il y a plus de délais d'attente dans STAT, ou vous enregistrez plus de demandes du client au temps d'attente supérieur ou égal à votre configuration.
Il existe de nombreux fichiers HDICT qui n'ont pas été transmis sous un certain nombre de téléchargements, ce qui signifie généralement que votre script de transmission sera interrompu avant d'être transmis.