tao hui http://weibo.com/taohui3
영어 버전
디자인 개념
Lushan은 Memcached 프로토콜을 사용하여 가벼운 키 값 데이터베이스였습니다. Lushan을 사용하면 Memcached와 같은 여러 기계에서 클러스터를 쉽게 구축 할 수 있습니다. Lushan 2.0은 또한 여러 공유 라이브러리를 장착 할 수있는 가벼운 응용 프로그램 프레임 워크로, 한 프로세스에서 동시에 데이터에 액세스하고 계산할 수 있으므로 대규모 데이터 정량 및 고성능 서비스를 쉽게 작성할 수 있습니다. 인터넷 추천, 광고 및 검색을위한 비즈니스 시나리오에 특히 적합합니다. Lushan은 Sina Weibo 추천 및 광고 사업에서 수년간 사용되었습니다.
2013 년경, 나는 "Misted Weibo"권장 사항을 개발하고있었습니다. 온라인 및 테스트 버전뿐만 아니라 다양한 알고리즘을 실험하기 위해 온라인으로 여러 데이터 저장소를 제공해야합니다. 이를 위해서는 여러 시스템을 배포해야합니다. 이 접근법은 너무 낮습니다. 그래서, 한 주말에 나는 Lushan을 개발하여 이런 것들에서 당신을 자유롭게 해줄 수 있습니다.
이것은 사실입니다. Lushan은 이후 Weibo 추천 및 광고 사업의 인프라가되었습니다. 이제 12 대의 기계로 각각 T의 온라인 쿼리 데이터를 제공하는 2 개의 클러스터가 각각 10 억 개 이상의 쿼리를 제공합니다.
Lushan의 첫 번째 버전 개발을 마쳤을 때 Lushan이 공유 라이브러리를 동시에 장착 할 수 있도록 항상 욕구가있었습니다. 그러나 나는 프레임 워크가 고유 한 위치를 가져야한다고 생각하기 때문에 오랫동안 내 마음을 구성하지 않았고, 다른 하나는 쉽게 변경된 부분이 아키텍처에서 안정적인 부분과 분리되어야한다는 것입니다. 그러나 2015 년에 Weibo 광고를 개발할 때 사용자의 관심 데이터, 관계형 데이터 및 기능 데이터는 Hadoop를 통해 쉽게 정렬되어 Lushan에 저장되었으며, 두 개의 모듈은 타겟팅 및 CTR 예측 기능을 구현할 수 있습니다. 그래서 나는 원래 아이디어를 포기하고 두 번째 버전을 구현하여 Lushan 기능을 더욱 강력하게 만들었습니다. 실제 애플리케이션에서는 Lushan을 키 값 데이터베이스로만 사용하거나 동시에 컴퓨팅을 제공하는 데이터 및 클러스터 만 제공하는 Lushan 클러스터를 배포 할 수 있습니다.
예제 디렉토리에 샘플 라이브러리가 제공되어 다음 단계에 따라 마운트합니다.
출력은 키 123456에 해당하는 값입니다.
각 단계 설명 :
컴퓨팅 프레임 워크로 사용될 때 Lushan은 HTTP get의 단일 라인 "URL"프로토콜과 유사한 두 개의 프로토콜과 보내기 값 길이를 지정하는 HTTP 게시물과 유사한 프로토콜을 지원하며 이진 데이터 전송을 지원합니다. 모듈 디렉토리에 두 가지 예가 제공됩니다 : Lproxy 및 Lecho는 각각이 두 프로토콜을 보여줍니다.
LPROXY 예제, 요청 된 키의 경우 먼저 쿼리 redis를 먼저하고 Redis가있는 경우 직접 반환하고 Redis가있는 경우 로컬 장착 라이브러리를 쿼리하십시오. 간단한 경우,이 예제는 생산 환경에서도 더 복잡한 요구 사항이있는 경우이 코드를 수정하십시오.
아래 단계를 따르십시오.
텍스트 파일을 만들고 다음 두 줄을 입력하십시오. 첫 번째 탭은 키이며 다음은 다음과 같이 값입니다.
168 hello lushan
187 line 2
도구에서 lushan_line_maker를 사용하여 Lushan 파일 형식으로 변환하십시오.
기계에서 Redis를 시작하고, DBNO를 설정 한 다음 1 인 다음 레코드를 추가하고, 키는 168이고, 값은 "hello redis"입니다.
hproxy 디렉토리에서 Make를 실행하고 생성 된 hmodule.so 및 hmodule.conf를 hmod/15/1.0.0 디렉토리에 배치하고 hmodule.conf의 호스트 및 포트를 수정하여 IP 및 Redis 포트를 배포하십시오.
구현하다:
echo -ne "hmod_open /mnt/lushan/hmod/15/1.0.0/ 15rn" | nc 127.0.0.1 9999
개방 된 것이 반환되면 성공적으로 켜집니다. 그렇지 않으면 libhiredis가 ld_library_path에 있는지 확인하십시오.
질문:
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
그런 다음 예상대로 Redis가 존재하면 Redis 결과가 반환됩니다. 그렇지 않으면 Lushan 데이터가 쿼리됩니다.
모듈 닫기 :
echo -ne "hmod_close 15rn" | nc 127.0.0.1 9999
모든 모듈에 전역 변수가없는 경우 HMOD_OPEN을 사용하여 이전 라이브러리를 직접 교체하여 온라인 서비스에 손실이 없을 수 있습니다.
레코의 예는 비슷합니다. 단순히 요청한 데이터는 매우 간단하며 자세히 설명되지 않습니다.
HDICT는 Lushan이 장착 한 라이브러리 형식입니다. 그는 매우 간단합니다. HDICT_XXXX 디렉토리에는 DAT 및 IDX에 필요한 파일이 두 개 있습니다. 전자에는 데이터가 포함되어 있으며 후자는 DAT 파일에서 값 위치 오프셋의 키를 매핑하는 것입니다. 정의:
typedef struct {
uint64_t key;
uint64_t pos;
} idx_t;
키는 라이브러리 번호가 포함되지 않은 64 비트 부호없는 긴 골격입니다. POS는 값의 길이와 DAT 파일의 오프셋으로 구성됩니다.
pos = (length << 40) | offset;
IDX 파일은 IDX_T.key의 오름차순 순서로 배열되어야합니다. DAT 파일이 필요하지 않습니다. 이미 존재하는 DAT 파일에서 인덱스를 생성하거나 파일을 출력 할 때 동시에 인덱스를 생성 할 수 있습니다.
정렬 된 파일은 Map-Reduce 계산 모델에서 매우 일반적입니다. Hadoop에서 출력 파일 형식을 지정하여 HDICT 형식의 라이브러리를 생성 할 수 있습니다. 예를 들어 다음 명령은 다음과 같습니다.
job.setOutputFormat(LushanFileOutputFormat.class);
통계 상태 데이터를 얻기위한 세 가지 명령이 있습니다 : 통계, 정보 및 hmod_info. 전자는 글로벌 데이터를 출력하는 반면 후자는 각 라이브러리와 각 모듈에 대한 데이터를 출력합니다.
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
lushan.php를 사용하여 그래픽 통계 상태 페이지를 만들 수 있습니다.
MySQL에 대한 경험이 있다면 간단한 클러스터를 쉽게 구축 할 수 있습니다. 먼저 데이터를 그룹, 일반적으로 컴퓨터 번호의 배수로 나누고 싶습니다. 그런 다음 배포하려는 서비스 세트 수를 고려하십시오. 일반적으로 다른 IDC에 배포 된 두 세트의 세트. 그런 다음 그룹화 규칙을 따라 Memcached Client를 통해 데이터를 쿼리하십시오.
매우 간단하지만 Lushan은 여전히 데이터 전송의 세부 정보를 처리하는 데 도움이되는 간단한 프레임 워크를 제공합니다.
Memcached 프로토콜은 간단한 요청 만 지원하지만 비교적 복잡한 결과를 반환 할 수 있습니다. Set Class 명령은 복잡한 요청을 지원하지만 비교적 간단한 결과 만 지원합니다. Lushan 은이를 사용하면 HTTP의 Get 및 Post 프로토콜과 비슷합니다.
GET 요청의 "키"는 250 바이트 한도를 초과 할 수 있습니다. 보낼 때 설정 :
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_VERIFY_KEY, 0);
이런 식으로 LibMemCached를 통해 전송하는 데 아무런 문제가 없습니다. 결과를 반환 할 때는 250 바이트 내에서 키를 반환해야합니다. 읽을 때 잘린 키에 따라 읽히고 잘린 키가 충돌하지 않습니다.
사용은 여러 줄의 요청을 보내는 데 도움이됩니다. 일반적으로 간단한 GET 요청으로 충분하지만 JSON과 유사한 요청을 보내려면 더 복잡한 프로토콜이 필요합니다. Lushan은 Gets 프로토콜을 다시 변형시키고 세트와 동일한 프로토콜로 수정했습니다. 클라이언트를 사용할 때 위의 설정을 눌러 키의 합법성을 확인한 다음 다음 형식으로 패킷을 보내십시오.
gets key 0 0 value_lenrn
valuern
리턴 결과에서 키를 가져 오십시오. 캡슐화는 lutil.h에서 만들어지고 hrequest_pack으로 전화하십시오.
STAT에는 더 많은 시간이 걸리거나 클라이언트에서 시간 초과 시간까지 더 많은 요청을 구성 할 수 있습니다.
특정 수의 업로드에서 전송되지 않은 많은 HDICT 파일이 있으며, 이는 일반적으로 전송 스크립트가 전송되기 전에 중단됩니다.