사업 계획을 작성 중이며 내 웹 사이트가 500.000 명의 순 방문자로부터 도달 할 때의 비용을 시뮬레이션해야합니다.
- 방문자 : 500.000
- 페이지 뷰 : 1,500,000
- 스파이더 페이지 뷰 : 500,000
- 총 페이지 뷰 : 2,000,000
각 페이지는 50 개의 쿼리 +-
- 일일 검색어 : 100 백만
- 시간당 : 4 백만
- 분당 : 70,000
- 초당 : 1,200
- 피크 : 3,000
이 계산을 수행 할 때 3,000 개의 쿼리가 필요합니다. 어떤 종류의 서버에서 처리 할 수 있습니까?
문제는 실제로 내 사이트는 하루에 2,000 번 방문하고 초당 + + 150/200 쿼리를 수행합니다.이 시점부터 시작하면 50,000 쿼리 / 초가 예상됩니다.
이 작업을 관리하기 위해 클러스터 또는 복제에 필요한 서버 수는 몇 개입니까?
답변
나는 하루에 수백만 페이지에 달하는 웹 사이트를 가진 전자 상거래 회사에서 일했습니다. 우리는 2 개의 단일 코어 CPU와 2GB의 RAM을 가진 단일 DELL PE 1750을 가지고 있었고, 데이터베이스 크기는 약. 4GB. 피크 타임에이 서버는 초당 최대 50k + 쿼리를 처리했습니다.
말했듯이 데이터베이스가 잘 구성되어 있고 모든 쿼리가 정교하게 조정되었으며 (우리는 느린 쿼리 로그를 분석하고 쿼리 및 인덱스를 수정하는 주 세션이있었습니다) 서버 설정도 미세 조정되었습니다. 캐싱은 확실히 좋은 생각이지만, MySQL은 어쨌든 성능을 분석 한 다음 메모리 사용 방법 (쿼리 캐시와 다른 옵션)을 미세 조정하면됩니다.
이러한 경험을 통해 인덱스 누락, 잘못된 인덱스 및 잘못된 데이터베이스 디자인 (예 : 기본 키와 같은 긴 문자열 필드 및 이와 유사한 넌센스)이 가장 큰 영향을 미친다는 것을 알 수 있습니다.
답변
쿼리의 복잡성, 서버의 메모리 용량 및 디스크 속도에 따라 달라집니다.
쿼리가 매우 단순하거나 잘 조정되어 있으면 단일 대형 데이터베이스 서버가이를 처리 할 수 있습니다. 그러나 쿼리가 매우 복잡하거나 단순하지만 제대로 조정되지 않은 경우 몇 개의 서버가 필요합니다.
답변
실행중인 특정 쿼리, 데이터베이스 구성표 및 크기에 대한 정보가 없으면 실제로 예측할 수 없습니다.
인덱싱 된 열의 간단한 SELECT는 인덱싱되지 않은 열을 기반으로 한 두 개의 JOIN 과 는 다른 짐승입니다. 물론 관련된 테이블에 1K 레코드 또는 1M이 포함되어 있으면 상황이 많이 바뀝니다.
또한:
- 현재 하드웨어 구성은 무엇입니까?
- 현재 부하에서 서버가 사용하는 전력 (CPU, RAM, 디스크 I / O)의 양은 얼마입니까?
답변
이그나시오 (Ignacio)가 말한 것처럼 캐싱을 살펴볼 수 있습니다. cms 또는 아마도 스택 앞. 모든 페이지마다 50 개 이상의 쿼리가 제공됩니다.
답변
귀하의 의견으로 판단 할 때 가장 큰 요인은 데이터 세트 크기 또는 “핫”데이터 세트의 크기입니다. 16 코어 서버에서 3,000qps 또는 8,000qps는 서버가 쿼리를 만족시키기 위해 디스크로 이동하지 않는 한 전혀 문제가되지 않습니다. 활성 데이터 세트가 InnoDB가 캐시에 사용하는 메모리 양을 초과하면 성능이 빠르게 떨어집니다.
답변
큰 “핫”데이터 세트의 경우 “빅 데이터”체계로 변환하는 데 시간을 투자 할 가치가있을 것입니다. 예를 들어, 검색 할 대량의 데이터가 있지만 다시 쓰지 않고 새 데이터 만 추가하는 경우 Apache Hive를보십시오. 둘러보기, 일반적으로 기존 코드에 쉽게 인터페이스 할 수있는 풍미로, 캐시 공간 부족을 방지 할 수 있습니다.
답변
초당 쿼리에 영향을 줄 수있는 것이 너무 많습니다. 직접 테스트하지 않고 내 데이터를 신뢰하지 마십시오. 현재 (2018-09) mysql 데이터베이스 및 시스템으로 qps를 추정하는 데 도움이되도록 속도 테스트 결과를 여기에 게시합니다. 내 테스트에서 데이터 크기는 서버 메모리보다 작습니다 (IO를 크게 줄이고 성능을 크게 향상시킵니다).
하나의 CPU 3.75GB 메모리, 100GB SSD, gcp 클라우드 mysql 서버 인스턴스를 사용하여 다음을 얻습니다.
- 하나의 클라이언트, 하나의 SQL 하나의 행 읽기 : 799 sql / 초.
- 50 개의 클라이언트, 1 개의 SQL 1 행 읽기 : 6403 sql / 초.
- 50 개의 클라이언트, 하나의 SQL 한 행 쓰기 : 4341 개의 행 쓰기, qps. 4341 sql / 초
- 클라이언트 당 1 개의 클라이언트, 30k 개의 행 쓰기 : 92109 개의 기록 된 행 / 초