복붙노트

[REDIS] PHP 애플리케이션에서 페이지 요청 데이터 로깅의 확장 방법은?

REDIS

PHP 애플리케이션에서 페이지 요청 데이터 로깅의 확장 방법은?

내가 (PHP에서) 개발하고 웹 응용 프로그램은 각 페이지 요청을 기록 할 수있는 능력이 필요합니다.

그냥 일반 ACCESS_LOG처럼 URL이, 소스 IP 주소, 날짜 / 시간을 요청처럼 세부 사항을 저장합니다 그러나 나는 또한의 사용자 ID (PHP는 세션 변수에 저장되어있는) 로그인 한 사용자를 저장해야합니다.

이 데이터는 사이트 전체 또는 나중에 필요에 따라 사용자 분석 보고서 당 생성 쿼리 할 것 - 같은 특정 기간 동안 방문 / 독특한 방문, 페이지 뷰의 총 수와 같은 것들, 지리적 위치 IP 주소를 찾고 위치, 하루 중 가장 활동적인 시간, 가장 활동적인 회원에

것 할 분명한 것은 각 페이지에 MySQL의 삽입 문을 가지고 있지만 응용 프로그램이 필수 / 초 수천을받는 경우, 이것은 내가, 대안에서 일을 확장 방법을 찾고 있도록 데이터베이스에 휴 병목이 될 것입니다 큰 인프라 요구 사항없이 본.

내가 했어 아이디어들 중 일부는 다음과 같다 :

Nginx에 대한 방법 1) 일)을 주기적으로 (야간 데이터베이스에 구문 분석 및로드 할 수있는 정상적인 웹 서버 ACCESS_LOG에서 세션 / 응용 프로그램에서 USER_ID를 로그인 할 수 있습니다. 시스템이 확장됩니다으로이 해킹 약간의 느낌과 각 웹 서버에서 수행해야합니다.

2) 로그인 높은 쓰기 속도를 가지고 레디 스에 각 페이지 요청 -이 문제는 나중에 날짜를 조회 할 수있는 능력의 부족이다.

이 규칙적이 추출 될 3) 로그 캐시 (또는 메시지 큐의 역할 중 하나에서 Memcache / 레디 스에 각 페이지 요청)과, MySQL의 삽입 및 제거 하였다.

더 쿼리 기능이 적합 할 수있다 MongoDB를 추천)겠습니까 뭔가?

난 당신이 접근 할 방법에 관심과 사람이 유사한 응용 프로그램의 경험을 가지고 (또는 아무것도 온라인으로 건너 가지는 경우).

나는 또한 데이터가 적절히 memcache에 저장되도록 구성 할 수있는 방법에 대한 생각에 관심이 있어요 / 레디 스.

감사

해결법

  1. ==============================

    1.이것은 다양한 방법에 확실하게 행할 수있다. 나는 나열된 각 옵션뿐만 아니라 몇 가지 추가 논평을 해결할 수 있습니다.

    이것은 다양한 방법에 확실하게 행할 수있다. 나는 나열된 각 옵션뿐만 아니라 몇 가지 추가 논평을 해결할 수 있습니다.

    Nginx에 그것을 할 수 있다면 1)을 보자. 아파치뿐만 아니라 JBOSS 및 Tomcat을 함께 할. 그때 거기에서 중앙을 수집하는 겨 시스템 로그 및 프로세스를 사용합니다. 이 경로를 들어 내가 같은 구분 된 로그 메시지 형식을 건의 할 것 탭으로 구분이 쉽게 구문 분석하고 읽을 수있다. 나는 PHP 변수를 로깅에 대한 모르겠지만, 확실히 헤더와 쿠키 정보를 기록 할 수 있습니다. 왜 두 번 로그 - 당신이 전혀 Nginx에 로깅을 사용하려는 경우 가능하면 나는이 길을 권하고 싶습니다?

    2) 더 더 아래로 아래, "나중에 날짜를 조회 할 수있는 능력의 부족"이 없습니다.

    3) 이것은 옵션이지만 유용 여부를하면 데이터와 얼마나 많은 정리 쓰려을 유지하려면 시간에 따라 달라집니다. 더 아래.

    4) MongoDB를 확실히 일할 수 있습니다. 당신은 쿼리를 작성해야합니다, 그들은 간단한 SQL 명령이 아니다.

    이제, 레디 스의 데이터를 저장한다. 나는 현재의 syslog-ng를 언급하고 레디 스에 데이터 물건을 구문 분석 프로그램 대상을 사용할 때와 가지를 기록합니다. 내 구조가 조금 다를 수 있습니다 그래서 내 경우에는 내가, 같은 가상 호스트로 클러스터에 의해 같은 여러 그룹화 기준을 가지고있다. 당신이 첫 번째 주소에해야 할 질문은 "내가이 데이터를 밖으로 원하는 작업 데이터"인가? 그 중 일부는 교통 요금 등 카운터 될 것입니다. 그것의 일부가 집계 될 것입니다,보다 "인기에 의해 내 페이지를 주문"과 같은 일을 할 것이다.

    나는 쉽게 레디 스에이를 수 (및 철회)하기 위해 몇 가지 기술을 설명하겠습니다.

    첫째, 우리가 시간 통계를 통해 트래픽을 생각해 보자. 첫 번째는 단위 결정. 당신은 분당 통계 또는 의지에 따라 시간 통계 충분할를 원하십니까? 여기에 주어진 URL의 트래픽을 추적하는 한 가지 방법은 다음과 같습니다

    당신이 zincrby 명령을 사용하여 회원이 제공됩니다 소트 세트에 "HH : MM를"키 ": URL YYYY-MM-DD 트래픽 별 URL"을 사용하여 정렬 된 세트의 데이터를 저장합니다. 파이썬에서 예를 들어, "r은 '당신의 레디 스 연결이다 :

    r.zincrby("traffic-by-url:/foo.html:2011-05-18", "01:04",1)
    

    이 예는 아침에 1시 4분 5 월 18 일에 URL을 "/foo.html"에 대한 카운터를 증가시킨다.

    특정 일에 대한 데이터를 검색하려면, 당신은 ( ": URL : 트래픽에 의해-URL YYYY-MM-DD는" ") 키에 zrange를 호출 할 수 있습니다. 이상에서 인기가 가장 인기에 소트 세트를 얻기 위해 상단을 얻으려면 (10) 예를 들어, 당신은 zrevrange를 사용하고 그것의 범위를 줄 것입니다. zrevrange 역방향 종류를 반환, 가장 히트 상단에있을 것입니다. 몇 가지 더 소트 세트의 명령을 사용할 수 있습니다 당신은 그런 매김 같은 좋은 질의를 할 수 있도록하는, 얻을 최소 점수 등으로 검색 결과의 범위 ..

    당신은 단순히 변경하거나 다른 시간 창을 처리 할 키 이름을 확장 할 수 있습니다. zunionstore 이것을 결합하여 할 수 있습니다 자동 롤 - 업 덜 세분화 된 기간에. 예를 들어, 당신은 "매월 : URL : YYYY-MM 트래픽 별 URL"와 같은 새로운 키에 주 또는 월 및 저장에있는 모든 키의 조합을 할 수 있습니다. 주어진 일에 모든 URL에 위를함으로써 당신은 매일 얻을 수 있습니다. 물론, 당신은 또한 매일 총 트래픽 키와 증가를 가질 수있다. 그것은 주로 당신이 데이터가 입력되고 싶은 경우에 따라 달라집니다 - 오프라인 로그 파일 가져 오기를 통해 또는 사용자 경험의 한 부분으로.

    나는 사용자가 (그리고 서버 부하)을 경험하는 데 걸리는 시간을 늘릴으로 실제 사용자 세션 동안 많은 일에 대해 권하고 싶습니다. 궁극적으로 그 트래픽 수준과 자원을 기반으로 호출 될 것입니다.

    당신이 상상할 수있는 것처럼 위의 저장 방식은 당신이 원하는 또는 결정 통계를 기반으로 모든 카운터에 적용 할 수 있습니다. 및 사용자 ID에 예를 변화 URL 위해 당신은 사용자 별 추적을 가지고있다.

    또한 레디 스에서 원시 로그를 저장할 수 있습니다. 나는 어떤 로그를 JSON 문자열로 저장이 작업을 수행 (I 키 - 값 쌍으로 그들을있다). 그 때 나는 그들을 끌어 데이터와 함께 일을 두 번째 과정이있다.

    원시 안타를 저장하기 위해 당신은 또한 순위로 신기원 시간을 사용하여 정렬 된 세트를 사용하여 쉽게 zrange / zrevrange 명령을 사용하여 시간 창을 잡을 수 있습니다. 또는 사용자 ID를 기반으로하는 키에 저장합니다. 겠습니까이 세트를 분류로 설정이 작동합니다.

    또 다른 옵션은 내가 설명하지했지만 일부 데이터가 유용 할 수 있습니다 해시로 저장됩니다. 이것은 예를 들어, 주어진 세션에 대한 자세한 정보를 저장하는 데 유용 할 수 있습니다.

    당신이 정말로 데이터베이스에있는 데이터를 원하는 경우, 레디 스 '펍 / 하위 기능을 사용하여 시도하고 구분 된 형식으로 파싱이와 파일에 덤프하는 가입자가 있습니다. 그리고 대량으로 가져 (귀하의 DB 또는 동급) 복사 명령을 사용하여 가져 오기 프로세스를 가지고있다. 귀하의 DB는 당신을 감사합니다.

    여기에 조언의 마지막 비트 (나는 아마 이미 충분한 정신 시간을 촬영했습니다)에 명령을 만료의 현명한와 자유주의를 사용하는 것입니다. 레디 스 2.2을 사용하거나 새로운 심지어 카운터 키에 대한 만료를 설정할 수 있습니다. 여기에 가장 큰 장점은 자동 데이터 정리입니다. 내가 위에서 설명한 것 같은 당신이 계획에 따라 상상해보십시오. 만료 명령을 사용하여 당신은 오래된 데이터를 자동으로 제거 할 수 있습니다. 아마도 3 개월, 만 매일 통계까지에 대한 시간별 통계를 원하는; 다음 6 개월은 매일 통계는 매월에만 통계. 간단히 6 (86400 * 180)에서 석 달 (* 90 86400) 후 매일 시간당 키를 만료하면 정리를 할 필요가 없습니다.

    위치 정보 태그 지정을 위해 나는 오프라인 IP의 처리 않습니다. 이 키 구조의 소트 세트를 상상해 : "트래픽 별 IP : YYYY-MM-DD"는 요소로 IP를 사용하고 당-IP 트래픽 데이터를 얻을 수 위의 zincryby 명령이 언급 사용. 지금, 당신의 보고서에서, 당신은 소트 세트를 얻고 IP의 조회를 할 수 있습니다. 보고서를 수행 할 때 트래픽을 저장하려면, 당신은 당신이 원하는 위치로 IP를 매핑 레디 스에서 해시를 설정할 수 있습니다. 예를 들면 : 저장된 값으로 국가 코드와 해시 구성원으로 키와 IP로 "지리적 국가".

    내가 추가 할 큰주의해야 할 점은 트래픽 수준이 매우 높은 경우 레디 스의 두 인스턴스를 실행할 수 있다는 것이다 (또는 더 많은 트래픽에 따라 다름). 쓰기 인스턴스 될 첫 번째는, 그것은 bgsave 옵션을 활성화하지 않을 것입니다. 트래픽 꽤 높은 당신은 항상 bgsave을하고있을 것이다됩니다. 이것은 내가의 두 번째 인스턴스를 추천 할 것입니다. 그것은 최초의 노예이며 디스크에 저장 않습니다. 또한 부하를 분산하기 위해 슬레이브에 대해 쿼리를 실행할 수 있습니다.

    나는이 밖으로 시도하는 당신에게 몇 가지 아이디어와 가지를 제공합니다 바랍니다. 사용자의 특정 요구에 가장 적합한 볼 수있는 다른 옵션 주위 재생합니다. 나는 트래픽이 높은 웹 사이트에 통계를 많이 추적하고 (또한 통계 로그 MTA) 레디 스에서하고 아름답게 수행 - 장고와 구글의 시각화 API와 함께 나는 아주 좋은 찾고 그래프를 얻을.

  2. ==============================

    2.로깅을 위해 MongoDB를 사용할 때 우려 고 쓰기 처리량에 의한 잠금 경합이다. MongoDB에의 삽입하지만 삽입을 많이 () 무거운 쓰기 잠금 경합을 호출하면 기본적으로 스타일을 파이어 앤 포겟. 이 응용 프로그램의 성능에 영향을 미칠 및 집계 / 필터에 저장된 로그를 독자를 방지 할 수있다.

    로깅을 위해 MongoDB를 사용할 때 우려 고 쓰기 처리량에 의한 잠금 경합이다. MongoDB에의 삽입하지만 삽입을 많이 () 무거운 쓰기 잠금 경합을 호출하면 기본적으로 스타일을 파이어 앤 포겟. 이 응용 프로그램의 성능에 영향을 미칠 및 집계 / 필터에 저장된 로그를 독자를 방지 할 수있다.

    하나 개의 솔루션은 Fluentd에, Logstash, 또는 수로로 로그 수집기 프레임 워크를 사용하여 수 있습니다. 이 데몬은 모든 응용 프로그램 노드에 출시 될 예정 및 응용 프로그램 프로세스의 로그를 취합니다.

    그것은 훨씬 더 효율적인 응용 프로그램에서 직접 작성하는 것보다, 그래서 그들은, 쓰기가 일괄 적으로 수행 등 MongoDB를 / PostgreSQL을 /와 같은 다른 시스템에 데이터를 기록 비동기 로그 버퍼합니다. 이 링크는 PHP 프로그램에서 Fluentd에로 로그를 넣어하는 방법을 설명합니다.

    여기에 MongoDB를 + Fluentd에 대한 몇 가지 튜토리얼입니다.

  3. ==============================

    3.시스템 로그는-ng에로 로깅 정보를 보내기 :

    시스템 로그는-ng에로 로깅 정보를 보내기 :

  4. from https://stackoverflow.com/questions/6029195/scalable-way-of-logging-page-request-data-from-a-php-application by cc-by-sa and MIT license