높은 동시성 및 대규모 트래픽 문제를 해결하는 방법은 무엇입니까? 다음 기사에서는 높은 동시성과 대규모 트래픽 웹에 대한 아이디어와 솔루션을 공유할 것입니다. 도움이 되기를 바랍니다.
추천 비디오 강좌: "수백만 개의 데이터 동시성 솔루션(이론 + 실무) "
높은 동시성 인터뷰 질문 공유: 높은 동시성에 관한 PHP 인터뷰 질문 15개(요약)
QPS: 초당 요청 수 또는 쿼리 수 인터넷 분야에서는 초당 해당 요청 수(http 요청)를 나타냅니다.
초당 최대 QPS: (총 PV의 80%)/(6시간 동안 초의 20%), 80%의 방문이 20%의 시간에 집중됩니다.
동시 연결 수: 처리 시스템 동시 요청 수
처리량: 단위 시간당 처리된 요청 수(일반적으로 QPS 및 동시성에 의해 결정됨).
응답 시간: 요청부터 응답까지 걸리는 시간입니다. 예를 들어 시스템이 HTTP 요청을 처리하는 데 100ms가 걸립니다. 이 100ms는 시스템의 응답 시간입니다.
PV: 페이지 조회수는 페이지 조회수 및 클릭수, 즉 방문자가 24시간 이내에 방문한 페이지 수입니다.
UV: 순 방문자(UniQue Visitor), 즉 동일한 방문자가 특정 시간 범위 내에 웹 사이트를 여러 번 방문하며 순 방문자 1명으로만 계산됩니다.
대역폭: 대역폭 크기 계산은 최대 트래픽과 평균 페이지 크기라는 두 가지 지표에 중점을 둡니다.
일일 웹사이트 대역폭 =PV/통계 시간(하루의 초로 변환)*평균 페이지 크기(KB 단위)*8.
스트레스 테스트: 테스트가 견딜 수 있는 최대 동시성, 최대 QPS, 동시 테스트 기계는 테스트 중인 기계와 분리되어야 하며 온라인 서버에서 동시성 테스트를 수행하지 마십시오. , ab 테스트가 있는 머신을 관찰하고, 테스트된 머신의 프런트 엔드 머신의 CPU, 메모리, 네트워크 등이 최대 제한의 75%를 초과하지 않았습니다.
동시성
응답 속도
내결함성
일반적으로 사용되는 성능 테스트 도구: ab, wrk, http_load, Web Bench, Siege, Apache JMeter.
트래픽 최적화
웹 리소스 안티 리칭으로 타사 시스템이 이미지, CSS, js 등을 훔치는 것을 방지합니다. 서버 트래픽 및 서버 대역폭 점유
프런트엔드 최적화
http 요청 감소: 이미지 병합, js 병합, CSS 병합 및 압축 파일이 더 클 수 있지만 요청은 줄어듭니다
추가 비동기 요청: 실제 Ajax 호출 인터페이스를 통해 데이터 획득
탐색 시작 서버 캐싱 및 파일 압축(nginx 압축 모듈도 활성화 가능)
cdn 가속: 대역폭 부족 문제 해결, 데이터를 cdn에 캐시 노드, 액세스 시 가장 가까운 노드를 선택하고 대역폭을 줄이고 액세스 속도를 높입니다.
독립적인 사진 서버 구축: 사진은 매우 io 친화적입니다. 다른 서버와 웹 서버를 완전히 분리할 수 있습니다. 별도의 사진 서버를 구축합니다. 컴퓨팅 유형에 속하지 않는 구성도 적절하게 조정할 수 있습니다. 사진 서버는 클러스터
서버 측 최적화
페이지 정적화: 동적 페이지 정적 HTML, 서버 부하 감소, 페이지 정적화 침투, 정적화 유효 시간
동적 언어 동시 처리: 비동기 처리, 멀티스레딩, 대기열 비동기 처리
데이터베이스 최적화:
데이터베이스 캐시: memcache, redis 캐시
mysql 인덱스 최적화, mysql 하위 데이터베이스 및 테이블, mysql 파티션 작업, mysql 마스터-슬레이브 복제 읽기-쓰기 분리, mysql 로드 밸런싱, mysql 마스터-슬레이브 상시 대기
웹 서버 최적화:
로드 밸런싱: ningx의 역방향 프록시를 사용하여 로드 밸런싱을 사용할 수 있으며 네트워크 배포를 사용할 수 있습니다. 레이어의 lvs의 네 번째 레이어는 로드 밸런싱을 구현합니다
책임 밸런싱
4계층 로드 밸런싱: 소위 4계층 로드 밸런싱은 IP+포트 로드 밸런싱을 기반으로 합니다.
7계층 로드 밸런싱: 소위 7계층 -레이어 로드 밸런싱은 (URL) 정보를 기반으로 한 로드 밸런싱입니다
7레이어 로드 밸런싱 구현:
URL 등 애플리케이션 계층 정보를 기반으로 한 부채 밸런싱 Ningx의 프록시는 매우 강력한 기능을 구현합니다. 7레이어 로드 밸런싱은 강력한 기능, 우수한 성능, 안정적인 작동, 간단하고 유연한 구성을 갖추고 있으며 제대로 작동하지 않는 백엔드 서버를 자동으로 제거할 수 있습니다. 업로드 파일은 비동기 모드로 업로드할 수 있습니다. 가중치를 할당할 수 있으며 할당 방법이 유연합니다.
nginx 로드 밸런싱 전략
IP 해시(내장)
가중 폴링(내장)
공정한 전략(확장)
범용 해시(확장)
일관된 해시(확장)
1 nginx에 내장된 또 다른 로드 밸런싱 전략인 The 프로세스는 IP 해시 알고리즘은 위장된 폴링 알고리즘입니다
2. 가중 폴링 전략
먼저 가중치가 높은 시스템에 요청을 할당합니다. 머신이 다른 머신보다 낮은 값으로 떨어지면, 모든 백엔드 머신이 다운되면 nginx는 모든 머신의 플래그를 즉시 초기 상태로 지웁니다. 머신이 타임아웃 상태가 되도록
3. 공정한 전략
백엔드 서버의 응답 시간을 기준으로 로드 상황을 판단하고, 부하가 가장 가벼운 머신을 선택하여 오프로딩
범용 해시, 일관된 성적 해싱 전략, 일반 해싱은 상대적으로 간단합니다. nginx 내장 변수를 해싱 키로 사용할 수 있으며, 일관된 해싱은 내장된 일관된 해싱 링을 사용하고, memcache 4계층 로드 밸런싱 구현을 지원합니다. 메시지의 대상 주소와 포트는 로드 밸런싱 장치에서 설정한 서버 선택 방법과 결합하여 최종 선택되는 내부 서버
lvs 관련 용어: DS: Director 서버 대상 서버, 즉 로드 밸런서네 번째 레이어는 7개 레이어보다 더 많은 무게를 지닐 수 있습니다. 작은 동시성 양을 사용하여
대규모 사이트의 7개 레이어는 URL, 세션 기반, 동적 및 정적 분리와 같은 보다 복잡한 로드 밸런싱 제어를 달성할 수 있습니다. 7번째 레이어는 CPU 시간과 동시 실행량을 많이 차지할 수 있습니다.cdn Accelerate
노드: 실제 서버의 거울로 이해될 수 있습니다.
1. 기업 사이트(특히 사진 수가 많고 정적 페이지가 많은 사이트)의 액세스 속도가 향상됩니다.
기존 액세스: 사용자가 브라우저에 도메인 이름을 입력하여 요청을 시작하고, 도메인 이름을 확인하여 서버 IP 주소를 얻은 다음, IP 주소를 기반으로 해당 서버를 찾고, 서버가 응답하여 데이터를 반환합니다.
cdn을 사용하여 액세스: 사용자가 요청을 시작하고 지능형 DNS 분석(IP를 기반으로 지리적 위치 및 액세스 네트워크 유형 결정, 가장 짧은 경로와 가장 가벼운 로드를 가진 서버 선택), 캐시 서버 IP 획득 및 콘텐츠를 사용자에게 반환하고(캐시된 경우), 원본 사이트에 대한 요청을 시작하고, 결과에 사용자에게 액세스하고, 결과를 캐시 서버에 저장합니다. cdn에 적용 가능한 시나리오는 무엇입니까?사이트 또는 애플리케이션에서 CSS, js, 이미지 및 html과 같은 대량의 정적 리소스 배포를 가속화합니다
cdn을 구현하는 방법은 무엇입니까?BAT 및 기타 CDN 서비스
독립이 필요한가요?
1. 웹 서버의 I/O 로드를 공유하고, 리소스를 많이 사용하는 사진 서비스를 분리하고, 서버의 성능과 안정성을 향상시킵니다.
2. 사진 서비스 설정 타겟 캐싱 솔루션으로 대역폭 비용 절감 및 액세스 속도 향상
독립적인 도메인 이름을 사용하는 이유는 무엇입니까?
이유: 동일한 도메인 이름에서 동시 브라우저 연결 수가 제한되어 있습니다. 브라우저 연결 제한을 돌파하는 것은 쿠키로 인해 캐싱에 적합하지 않습니다. 캐시맞아
독립이후 문제인가요?
사진 업로드 및 동기화 방법
NPS 공유 방법
FTP 동기화 사용
관련 개념: 동적 언어 정적화란 무엇이며 그 이유는 무엇입니까? 정적이다 , 정적 구현.
프로세스란 무엇입니까
프로세스(Process)는 특정 데이터 수집에 대한 실행 활동에 대한 컴퓨터의 프로그램이며, 자원을 할당하고 예약하는 시스템 기본 단위는 운영 체제 구조의 기초입니다
프로세스는 "실행 프로그램"입니다
프로세스 상태의 3가지 상태 모델
다중 프로그래밍 시스템에서 프로세스는 프로세서에서 교대로 실행되고 상태는 계속해서 변경됩니다.
실행 중: 프로세스가 프로세서에서 실행 중이면 실행 상태에 있다고 합니다. 이 상태의 프로세스 수는 프로세서 수보다 작거나 같습니다. 단일 프로세서 시스템의 경우 실행 상태에는 프로세스가 하나만 있습니다. 다른 프로세스를 실행할 수 없는 경우(예: 모든 프로세스가 차단됨) 일반적으로 시스템의 유휴 프로세스가 자동으로 실행됩니다.
Ready: 프로세스가 프로세서를 제외한 모든 리소스를 획득하고 프로세서를 획득한 후 실행될 수 있으면 준비 상태라고 합니다. 준비 상태는 여러 우선순위에 따라 대기열에 포함될 수 있습니다. 예를 들어, 프로세스가 타임 슬라이스 부족으로 인해 준비 상태에 들어가면 낮은 우선 순위 대기열에 배치되고, 프로세스가 I/O 작업 완료로 인해 준비 상태에 들어가면 해당 프로세스는 우선순위가 높은 큐.
차단: 대기 또는 휴면 상태라고도 하며, 프로세스는 특정 이벤트(예: I/O 요청 및 I/O 완료 대기 등)가 발생하기를 기다리고 있으며 이때 일시적으로 실행이 중지됩니다. 시간이 지나면 프로세서가 프로세스에 할당되어도 실행할 수 없으므로 프로세스가 차단된다고 합니다.
스레드란 무엇입니까
동시 사용자 요청으로 인해 시스템 리소스 오버헤드나 사용자 요청 응답 효율성 측면에서 각 요청에 대한 프로세스를 생성하는 것은 분명히 불가능합니다. 따라서 운영 체제에는 스레드 개념이 도입되었습니다.
경량 프로세스라고도 불리는 스레드는 프로그램 실행 흐름의 가장 작은 단위입니다.
스레드는 프로세스 내의 개체로 시스템에 의해 독립적으로 스케줄링되고 할당되는 기본 단위입니다. 스레드 자체는 시스템 리소스를 소유하지 않고 작업에 필수적인 일부 리소스만 소유하지만 공유가 가능합니다. 동일한 프로세스에 속하는 다른 스레드. 프로세스가 소유한 모든 리소스입니다.
스레드는 다른 스레드를 생성하고 취소할 수 있으며, 동일한 프로세스의 여러 스레드가 동시에 실행될 수 있습니다.
스레드는 프로그램의 단일 순차 제어 흐름입니다. 프로세스 내에서 상대적으로 독립적이고 스케줄링 가능한 실행 단위입니다. 시스템이 독립적으로 CPU를 스케줄링하고 할당하는 기본 단위입니다.
스레드의 세 가지 상태
준비 상태: 스레드가 실행할 모든 조건을 갖추고 있고 논리적으로 실행될 수 있으며 프로세서를 기다리고 있습니다.
실행 상태: 프로세서를 차지하는 스레드가 실행 중입니다.
Blocking 상태: 스레드가 이벤트(예: 세마포어)를 기다리고 있으며 논리적으로 실행할 수 없습니다.
코루틴이란 무엇인가요? 코루틴은 사용자 모드의 경량 스레드이며 코루틴의 일정은 사용자가 완전히 제어합니다. 코루틴에는 자체 레지스터 컨텍스트와 스택이 있습니다. 조정 일정이 전환되면 레지스터 컨텍스트와 스택이 다른 위치에 저장되고 다시 전환되면 이전에 저장된 레지스터 컨텍스트와 스택이 복원됩니다. 잠금이므로 컨텍스트 전환이 매우 빠릅니다.
스레드와 프로세스의 차이점은 무엇인가요?
1. 스레드는 프로세스 내의 실행 단위입니다. 프로세스에는 하나 이상의 스레드가 있으며 프로세스는 자체 주소 공간을 공유합니다.
2. 프로세스는 리소스 할당 및 소유권의 단위입니다. 동일한 프로세스의 스레드는 프로세스의 리소스를 공유합니다.
3. 스레드는 프로세서 스케줄링의 기본 단위이지만 프로세스는 아닙니다.
4. 둘 다 동시에 실행될 수 있습니다.
5 각각의 독립적인 스레드는 프로그램 실행을 위한 진입점을 가지며 순차적으로 실행됩니다. 시퀀스와 프로그램의 종료는 가능하지만 스레드는 독립적으로 실행될 수 없으며 애플리케이션에 종속되어야 하며 애플리케이션은 다중 스레드 실행 제어를 제공합니다.
스레드와 코루틴의 차이점은 무엇인가요?
1. 스레드는 여러 개의 코루틴을 가질 수 있고, 프로세스는 여러 개의 코루틴을 단독으로 가질 수도 있습니다.
2. 스레드와 프로세스는 모두 동기 메커니즘인 반면, 코루틴은 비동기
3입니다. 마지막 호출 상태를 유지할 수 있습니다. 프로세스가 다시 들어갈 때마다 마지막 호출 상태로 들어가는 것과 같습니다.
동일한 컴퓨터 시스템에서 두 개 이상의 프로세스가 동시에 실행되도록 허용하면 프로세스가 하나 더 열리고 리소스가 하나 더 할당되어 프로세스 간 통신이 불편해진다는 의미입니다 멀티스레딩이란 무엇인가요?
스레드는 프로세스를 여러 조각으로 나누고, 각 조각은 독립적인 프로세스가 될 수 있습니다. 다중 프로세스와의 차이점은 하나의 프로세스의 리소스만 사용되며 스레드가 통신할 수 있다는 것입니다. 여러 개념 간의 차이점 사이?
싱글 프로세스 싱글 스레드: 한 테이블에서 한 사람이 식사
단계
소켓 만들기
while 루프에 들어가서 프로세스 수락 작업을 차단하고 클라이언트 연결이 기본 프로세스에 들어갈 때까지 기다린 다음 다중 프로세스 아래에서 포크를 통해 하위 프로세스를 만듭니다. 프로세스 모델.
멀티 스레드 모드에서 하위 스레드를 생성할 수 있습니다
데이터를 받은 후 서버 프로그램은 이를 처리한 다음 이를 사용하여 클라이언트에 응답을 보냅니다.
이 모델은 동시성 문제를 해결하기 위해 프로세스 수에 크게 의존합니다.
많은 수의 프로세스를 시작하면 추가 프로세스 스케줄링 소비가 발생합니다
비동기 비차단 모델
요즘에는 epoll을 기반으로 다양한 동시성 비동기 IO 서버 프로그램이 구현됩니다
IO 다중화 비동기 비차단 이 프로그램은 이름에서 알 수 있듯이 Reactor라는 이름에서 알 수 있듯이 자체적으로 데이터 송수신을 처리하지 않는 고전적인 Reactor 모델을 사용합니다. 소켓 핸들의 이벤트 변경 사항만 모니터링할 수 있습니다. Reactor 모델:
- add:添加一个socket到reactor - set:修改socket对应的事件,如可读可写 - del:从reactor中移除 - callback:事件发生后回掉指定的函数
nginx: 다중 스레드 Reactor
swoole: 다중 스레드 Reactor + 다중 프로세스 작업자
php 동시 프로그래밍 실습
1.php swoole 확장, 병렬, 고성능 네트워크 통신 엔진은 순수 C 언어로 작성되었으며 PHP 언어의 비동기 멀티스레드 서버, 비동기 tcp/udp 네트워크 클라이언트, 비동기 mysql, 비동기 redis, 데이터베이스 연결 풀, AsyncTask, 메시지 큐, 밀리초 타이머, 비동기 파일 읽기 및 쓰기, 비동기 DNS 쿼리.
3.swoole2 .0은 Go 언어와 유사한 코루틴을 지원하며 완전 동기 코드를 사용하여 비동기 프로그램을 구현할 수 있습니다
4. 메시지 대기열
5. 애플리케이션 분리
시나리오 설명: 주문, 주문 시스템은 재고 시스템에 알려야 합니다.
인벤토리 시스템에 액세스할 수 없는 경우 주문 감소가 실패하여 주문 실패가 발생합니다.
주문 시스템이 인벤토리 시스템에서 분리됩니다
참조 대기열
사용자가 주문, 주문 시스템이 완료됩니다. 지속성 처리, 메시지 큐에 메시지 쓰기 및 사용자의 주문이 성공적으로 접수되었다는 메시지 반환
주문 정보를 얻기 위해 풀/푸시 방법을 사용하여 주문을 구독합니다. , 재고 시스템은 주문 정보를 기반으로 재고 작업을 수행합니다
6. 트래픽 피크 컷 적용 시나리오: 플래시 판매 활동, 트래픽이 즉시 급증하고 사용자가 요청을 시작한 후 서버에 큰 압박이 가해집니다. 서버는 이를 수신하여 먼저 메시지 대기열에 씁니다. 메시지 대기열 길이가 최대값을 초과하면 오류가 직접 보고되거나 사용자에게 요청 볼륨을 제어하고 높은 트래픽을 완화하라는 메시지가 표시됩니다
7.日志处理 应用场景:解决大量日志的传输 日志采集程序将程序写入消息队列,然后通过日志处理程序的订阅消费日志。
8.消息通讯 聊天室
9.常见消息队列产品 kafka,ActiveMQ,ZeroMQ,RabbitMQ,Redis等 php的异步 消息队列
10.接口的并发请求 curl_multi_init
1.什么是数据库缓存
mysql等一些常见的关系型数据库的数据都存储在磁盘当中,在高并发场景下,业务应用对mysql产生的增删,改,查的操作造成巨大的I/O开销和查询压力,这无疑对数据库和服务器都是一种巨大的压力,为了解决此类问题,缓存数据的概念应运而生。
极大的解决数据库服务器的压力
提高应用数据的响应速度
常见的缓存形式:内存缓存和文件缓存
2.为什么要使用数据库缓存
缓存数据是为了让客户端很少甚至不访问数据库服务器进行数据的查询,高并发下,能最大程序地降低对数据库服务器的访问压力。
用户请求-》数据查询-》连接数据库服务器并查询数据-》将数据缓存起来(html,内存,json,序列化数据)-》显示给客户端
缓存方式的选择
缓存场景的选择
缓存数据的实时性
缓存数据的稳定性
3.使用mysql查询缓存
启用mysql查询缓存
极大的降低cpu使用率
query_cache_type查询缓存类型,有0,1,2三个取值。0则不适用查询缓存。1表示始终使用查询缓存,2表示按需使用查询缓存。
query_cahce_type=1 select SQL_NO_CACHE * from my_table where condition; query_cache_type=2 select SQL_CACHE * from my_table where condition; query_cache_size
默认情况下query_cache_size为0,表示为查询缓存预留的内存为0,则无法使用查询缓存 SET GLOBAL query_cache_size = 134217728; 查询缓存可以看作是SQL文本和查询结果的映射 第二次查询的SQL和第一次查询的SQL完全相同,则会使用缓 SHOW STATUS LIKE ‘Qcache_hits’查看命中次数 表的结构和数据发生改变时,查询缓存中的数据不再有效
情理缓存:
FLUSH QUERY CACHE;//清理查询缓存内存碎片
RESET QUERY CACHE;//从查询缓存中移出所有查询
FLUSH TABLES;//关闭所有打开的表,同时该操作将会清空查询缓存中的内容
4.使用Memcache缓存
对于大型站点,如果没有中间缓存层,当流量打入数据库层时,即便有之前的几层为我们挡住一部分流量,但是在大并发的情况下,还是会有大量请求涌入数据库层,这样对于数据库服务器的压力冲击很大,响应速度也会下降,因此添加中间缓存层很有必要。
memcache是一套分布式的高速缓存系统,由liveJournal的BrandFitzpatrick开发,但目前被许多网站使用以提升网站的访问速度,尤其对于一些大型的、需要频繁访问数据库的网站访问速度提升效果十分显著。 memcache是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像,视频、文件以及数据库检索的结果等。简单的说就是将数据调用到内存,然后从内存中读取,从而大大提高读取速度。
工作流程:先检查客户端的请求数据是否在memcache中,如有,直接把请求数据返回,不再对数据库进行任何操作;如果请求的数据不在memcache中,就去查数据库,把从数据库中获取的数据返回给客户端,同时把数据缓存一份到memcached中。
通用缓存机制:用查询的方法名+参数作为查询时的key,value对中的key值
5.使用Redis缓存
与memcache的区别:
性能相差不大
redis在2.0版本后增加了自己的VM特性,突破物理内存的限制,memcache可以修改最大可用内存,采用LRU算法
redis依赖客户端来实现分布式读写
memcache本身没有数据冗余机制
redis支持(快照,aof)依赖快照进行持久化aof增强了可靠性的同时,对性能有所影响
redis用户数据量较小的高性能操作和运算上
memcache用于在动态系统中减少数据库负载,提升性能;适合做缓存提高性能。
可用于存储其他数据:session,session_set_save_handler
데이터 테이블 데이터 유형 최적화: int, smallint., bigint, enum, ip 저장소는 int 유형 ip2long 변환 및 저장을 사용합니다.
인덱스가 많을수록 좋습니다. , 해당 필드에 적절한 인덱스를 생성합니다
인덱스의 접두사 원칙을 준수합니다
질의% 문제
전체 테이블 스캔 최적화
또는 조건부 인덱스 사용
문자 문자열형 인덱스 실패 문제
데이터를 쿼리하는 과정에서 데이터 접근 최적화, 제한 사용, * 사용 안함, 단순 쿼리, 분할 쿼리로 복잡화, 관련 쿼리 분해*
특정 유형의 쿼리 최적화 쿼리 문, 개수 최적화(), 관련 쿼리 문 최적화, 하위 쿼리 최적화, 그룹별 및 구분 최적화, 제한 및 결합 최적화
스토리지 엔진 최적화: innodb 사용해 보세요
데이터베이스 테이블 구조 최적화: 파티션 운영(사용자 투명) 파티션, 하위 데이터베이스 및 하위 테이블(수평 분할, 보조 테이블로 수직 분할)
데이터베이스 서버 아키텍처 최적화: 마스터-슬레이브 복제, 읽기-쓰기 분리, 듀얼 마스터 상시 대기 , 로드 밸런싱(로드 밸런싱을 달성하기 위해 MyCat 데이터베이스 미들웨어가 로드 밸런싱을 구현함)