sourcecode

MySQL 데이터베이스에 많은 양의 히트를 기록하는 모범 사례

codebag 2023. 9. 20. 20:19
반응형

MySQL 데이터베이스에 많은 양의 히트를 기록하는 모범 사례

뭐, 이게 중요한 거.내 미래의 PHP CMS는 매일 50만 명의 방문자를 운전해야 하며 MySQL 데이터베이스(레퍼러, IP 주소, 시간 등)에 모두 기록해야 한다고 가정해 보겠습니다.이렇게 하면 분당 300-500개의 행을 삽입하고 50개를 더 업데이트해야 합니다.가장 큰 문제는 스크립트가 새로운 행을 삽입하고 싶을 때마다 데이터베이스를 호출한다는 것입니다. 즉, 누군가가 페이지를 누를 때마다 말이죠.

제 질문은 먼저 들어오는 히트를 로컬로 캐시할 수 있는 방법이 있나요? 그리고 해당 apc, csv에 가장 적합한 솔루션은 무엇인가요?예를 들어 10분마다 데이터베이스로 주기적으로 전송합니다.이것이 좋은 해결책이며 이 상황을 위한 최선의 방법은 무엇입니까?

하루 50만 건, 1초에 5-7건의 질의에 불과합니다.각 요청이 0.2초 동안 제공된다면 거의 0개의 동시 쿼리가 발생하므로 걱정할 필요가 없습니다.
사용자가 5배 더 많아지더라도 모두 잘 작동할 것입니다.
INSERT DELADE를 사용하고 mysql을 튜닝하면 됩니다.
튜닝 정보: http://www.day32.com/MySQL/ - 매우 유용한 스크립트가 있습니다(아무것도 변경되지 않으며 설정을 최적화하는 팁만 보여줍니다).

먼저 memcache 또는 APC를 사용하여 로그를 작성할 수 있지만 INSERT DELADE MySQL을 사용하면 거의 동일한 작업을 수행할 수 있으며 더 잘 수행할 수 있습니다 :)

파일을 이 작업에 사용하지 마십시오.DB는 PHP보다 잠금 기능이 훨씬 뛰어납니다.효과적인 음소거를 작성하는 것은 그리 사소한 일이 아니므로 DB(또는 memcache, APC)가 이 작업을 수행하도록 하십시오.

자주 사용하는 솔루션:

방문 시 증가하는 카운터를 memcached로 구현하고 100회(또는 1000회) 적중 시마다 데이터베이스에 대한 업데이트를 적용할 수 있습니다.

각 서버에 로컬로 CSV에 저장한 다음 항목을 데이터베이스에 푸시하는 미세한 cron 작업을 수행하여 이를 수행합니다.이는 무엇보다도 가용성이 높은 MySQL 데이터베이스가 필요하지 않도록 하기 위한 것입니다. 데이터베이스는 문제 없이 해당 볼륨의 삽입을 처리할 수 있어야 합니다.

특정 시간에 디렉토리 기반 데이터베이스(또는 플랫 파일에 따라 다름)에 저장하고 PHP 코드를 사용하여 MySQL 데이터베이스에 삽입/업데이트합니다.당신의 php 코드는 Cron을 사용하여 주기적으로 실행할 수 있으므로 서버에 Cron이 있는지 확인하여 10분마다 일정을 설정할 수 있습니다.

이 페이지를 보세요: http://damonparker.org/blog/2006/05/10/php-cron-script-to-run-automated-jobs/ .일부 코드는 클라우드에 작성되었으며 사용할 준비가 되었습니다 :)

가지 방법은 Apache access.log를 사용하는 것입니다.cronolog 유틸리티와 apache를 함께 사용하면 상당히 미세한 로깅을 얻을 수 있습니다. Cronolog는 매우 많은 수의 파일 행의 저장을 처리하고 볼륨 날짜, 연도 등을 기준으로 회전할 수 있습니다.이 유틸리티를 사용하면 Apache에서 로그 쓰기가 발생하는 것을 방지할 수 있습니다.

그런 다음 다른 사람들이 말한 대로 cron 기반 작업을 사용하여 로그를 분석하고 MySQL에서 요약된 데이터나 원시 데이터를 원하는 대로 푸시합니다.

특정 설정을 사용하여 쓰기 집약적인 작업에 전용 데이터베이스(또는 데이터베이스 서버)를 사용하는 것을 고려해 볼 수 있습니다.예를 들어 InnoDB 스토리지가 필요하지 않고 간단한 MyIsam을 유지할 수 있습니다.또한 다른 데이터베이스 스토리지도 생각해 볼 수 있습니다(@Riccardo Galli).

MySQL에 직접 로그인해야 하는 경우 두 개의 데이터베이스를 사용하는 것을 고려합니다.빠른 삽입에 최적화된 것으로, auto_increment primary key 외에는 키가 없음을 의미합니다.또한 조회할 모든 것에 대한 키가 있어 빠른 검색에 최적화되어 있습니다.시간이 지정된 작업은 정기적으로 삽입 전용 데이터베이스에서 읽기 전용 데이터베이스로 히트를 복사합니다. 그러면 양쪽 모두에서 최상의 결과를 얻을 수 있습니다.유일한 단점은 사용 가능한 통계가 이전의 "복사본" 실행과 같은 새것만 나온다는 것입니다.

또한 이전에 데이터를 각 웹 서버의 로컬 디스크에 플랫 파일로 기록하고(여러 프로세스를 사용할 경우 원자적인 추가만 수행하도록 주의) 데몬 프로세스 또는 크론 작업을 사용하여 주기적으로 데이터베이스에 기록하는 시스템을 본 적이 있습니다.

감사 데이터베이스가 다운된 경우에도 웹 앱을 사용할 수 있고, 어떤 이유로든 데이터베이스가 느려진 경우에도 사용자의 성능이 저하되지 않습니다.

제가 말씀드릴 수 있는 것은 로컬에서 생성된 이러한 파일에 대한 모니터링이 있어야 한다는 것입니다. 빌드업은 분명히 문제가 있음을 나타내며 Ops 엔지니어는 그렇지 않은 경우에 이를 인식하지 못할 수도 있습니다.

많은 수의 쓰기 작업과 이런 종류의 데이터에 더 적합한 mongodb 또는 couchdb를 찾을 수 있습니다.

왜냐면INSERT DELAYED에서만 지원됩니다.MyISAM, 이것은 많은 사용자에게 선택사항이 아닙니다.

MySQL Proxy를 사용하여 특정 서명에 일치하는 쿼리의 실행을 연기합니다.

이를 위해서는 맞춤형 Lua 스크립트가 필요합니다. 예제 스크립트가 여기에 있고 일부 튜토리얼이 여기에 있습니다.

이 스크립트는 쿼리 문자열 저장을 위한 Queue 데이터 구조와 지연할 쿼리를 결정하기 위한 패턴 매칭을 구현합니다.대기열이 특정 크기에 도달하거나 일정 시간이 경과하거나 X가 발생하는 이벤트가 발생하면 각 쿼리가 서버로 전송될 때 쿼리 대기열이 비워집니다.

빈스톡이나 아이언큐를 이용한 큐 전략을 사용할 수 있습니다.

언급URL : https://stackoverflow.com/questions/6031263/best-practice-to-record-large-amount-of-hits-into-mysql-database

반응형