현재 각 HTTP 게시 요청에서 본문 데이터의 내용을 가져 와서 로그 파일에 기록하는 것이 주된 책임 인 웹 서버를 작성한 것입니다. 게시물 데이터의 내용은 수신되면 난독 화됩니다. 그래서 나는 게시물 데이터를 모호하게 만들지 않고 서버의 로그 파일에 기록합니다. 난독 화 된 후 내용은 모든 요청마다 다른 일련의 임의 키 값 쌍입니다. 고정 데이터가 아닙니다.http 요청 후 로그 파일에 빠른 쓰기
서버에서 Linux 2.6 이상 커널을 실행 중입니다. 서버가 과도한 트래픽을 처리하도록 구성됩니다 (열린 파일의 제한은 32k 등). 이 응용 프로그램은 web.py 프레임 워크를 사용하여 Python으로 작성됩니다. http 서버는 Nginx 뒤에있는 Gunicorn입니다.
Apache Benchmark를 사용하여로드 테스트를 한 후 로그 쓰기 문제없이 초당 최대 600-700 개의 요청을 처리 할 수 있다는 것을 알게되었습니다. Linux는 기본적으로 버퍼링 작업을 잘 수행합니다. 문제는 초당 많은 요청이 동시에 같은 파일에 쓰려고 할 때 발생하기 시작합니다. 데이터가 기록되지 않고 정보가 손실됩니다. 필자는 "파일에 직접 작성하는"설계가 제대로 된 솔루션이 아닐 수도 있음을 알고 있습니다.
누구든지이 문제를 극복 할 수있는 인프라와 코드를 너무 많이 변경하지 않고도 신속하게 구현할 수있는 솔루션을 제안 할 수 있는지 궁금합니다.
나는 Redis와 같은 메모리 저장 장치에 대해 읽었지만 서버 장애시 데이터가 메모리에 있으면 그 데이터가 손실된다는 것을 깨달았습니다. 나는 문서에서 Redis가 영구 저장소로 구성 될 수 있다는 것을 읽었습니다. Redis가 그것을 수행하기에 충분한 메모리가 서버에 필요합니다. 이 솔루션은 특정 간격으로 로그 파일에 Redis (메모리)의 데이터를 덤프 할 스크립트를 작성해야한다는 것을 의미합니다.
더 빠른 해결책이 있는지 궁금합니다. 어떤 도움이라도 대단히 감사하겠습니다!
나쁜 디자인 일종의 데이터/필드/변수 또는 기타 등의 이유로 어떤 이유로 든 잘못된 것으로 간주되는 모든 요청을 작성하는 경우어떤 종류의 필터를 사용하거나 수신 된 데이터의 유효성을 검사하여 요청을 크게 낮추고 파일 대기열을 사용하여 파일 잠금을 처리하고 파일을 쓸 수있을 때마다 비동기 방식으로 작성해야합니다. 쓰여지고, 목록은 계속 나아 간다. – Gntem
어떻게 gunicorn (어떤 작업자 클래스)을 실행합니까? 하나의 서버 프로세스 만 있으면'logging.FileHandler'가 유용 할 수 있습니다. 그렇지 않으면'logging.SyslogHandler'를 가능한 옵션으로 살펴보십시오. – robertklep
mongodb의 쓰기 성능이 좋다고 들었습니다. – Ifthikhan