웹사이트 사업 규모와 방문자 수가 점진적으로 발전함에 따라 단일 서버와 단일 도메인 이름의 원래 미니 웹사이트 구조는 더 이상 개발 요구를 충족할 수 없습니다.
현재 당사는 비즈니스 기능에 따라 웹사이트를 독립 서버에 배포 및 배포하기 위해 더 많은 서버를 구매하고 여러 개의 2차 하위 도메인을 채널화된 방식으로 활성화하거나 로드 밸런싱 기술(예: DNS 라운드 로빈)을 사용할 수 있습니다. , Radware, F5, LVS 등)을 사용하면 여러 채널이 서버 세트를 공유할 수 있습니다.
좋습니다. 우리는 이미 그러한 솔루션을 구상했지만 심층적인 개발에 들어간 후 새로운 기술적 문제가 발생했습니다.
우리는 웹 사이트 프로그램을 여러 서버에 배포하고 배포하며, 구현 원칙에 따라 Session이 제한되기 때문에 여러 개의 2차 도메인 이름으로 독립적으로 나누어집니다. (PHP의 Session은 파일 형식으로 저장됩니다.) 기본적으로 로컬 서버의 하드 디스크), 우리 웹 사이트 사용자는 로그인하기 위해 여러 채널 사이에 사용자 이름과 비밀번호를 입력해야 하는 경우가 많으며 이는 사용자 경험을 크게 감소시킵니다. 또한 원본 프로그램은 데이터를 직접 읽을 수 있습니다. 사용자의 세션 변수(예: 닉네임, 포인트, 로그인 시간 등). 세션 변수는 서버 간에 동기적으로 업데이트될 수 없기 때문에 개발자는 실시간으로 데이터베이스를 읽고 써야 하므로 데이터베이스에 대한 부담이 증가합니다.
결과적으로 서버 간 웹사이트 간의 세션 공유 문제를 해결해야 할 필요성이 시급해졌고, 결국 다양한 솔루션이 탄생했습니다. 비교 및 논의를 위한 4가지 실현 가능한 솔루션이 더 있습니다.
1. NFS 기반 세션 공유
NFS는 Net FileSystem의 약어로, Sun이 Unix 네트워크 호스트 간의 디렉토리 공유 문제를 해결하기 위해 처음 개발했습니다.
이 솔루션은 구현하기가 가장 간단합니다. 공유 디렉터리 서버를 각 채널 서버의 로컬 세션 디렉터리에 마운트하기만 하면 됩니다. 단점은 NFS가 복잡한 보안 메커니즘에 의존한다는 것입니다. 파일 시스템이므로 동시성 효율성이 높지 않습니다. 특히 세션과 같이 동시 읽기 및 쓰기가 많은 작은 파일의 경우 공유 디렉터리 서버의 io-wait가 너무 높아 결국 프런트의 실행 효율성이 저하됩니다. -WEB 신청을 종료합니다.
2. 데이터베이스 기반 세션 공유
첫 번째 선택은 물론 유명한 Mysql 데이터베이스이며, 세션 작업의 읽기 및 쓰기 효율성을 높이기 위해 메모리 테이블 Heap을 사용하는 것이 좋습니다. 이 솔루션은 매우 실용적이며 모든 사람이 일반적으로 사용한다고 생각합니다. 이 솔루션의 단점은 세션의 동시 읽기 및 쓰기 기능이 Mysql 데이터베이스의 성능에 따라 달라지는 동시에 세션 제거 논리를 구현해야 한다는 것입니다. 데이터 테이블에서 세션 레코드를 정기적으로 업데이트하고 삭제하려면 동시성이 너무 높을 때 테이블 잠금이 발생하기 쉽습니다. 행 수준 잠금이 있는 테이블 엔진을 선택할 수 있지만 데이터베이스를 사용하여 이를 거부해야 합니다. store Sessions는 여전히 약간 과잉입니다.
3. 쿠키 기반 세션 공유
이 솔루션이 낯설 수도 있지만, 여전히 대규모 웹사이트에서 흔히 사용됩니다. 원칙은 사이트의 모든 사용자의 세션 정보를 암호화하고 직렬화한 다음 이를 쿠키로 사용하여 브라우저를 사용하여 모든 초에 액세스할 때 루트 도메인 이름(예: .host.com)에 균일하게 심는 것입니다. 루트 도메인 이름 아래의 레벨 도메인 이름 사이트, 도메인 이름에 해당하는 모든 쿠키 콘텐츠의 특성이 전달되므로 여러 서비스 간에 사용자의 쿠키 기반 세션에 대한 공유 액세스가 실현됩니다.
이 솔루션의 장점은 추가 서버 리소스가 필요하지 않다는 것입니다. 단점은 http 프로토콜 헤더 신뢰 길이의 제한으로 인해 사용자 정보의 일부만 저장할 수 있고 쿠키에 포함된 세션 콘텐츠가 있다는 것입니다. 안전하게 암호화하고 해독해야 합니다(예: 일반 텍스트 암호화 및 해독을 위해 DES, RSA 등을 사용하고 위조 방지 인증을 위해 MD5, SHA-1 및 기타 알고리즘 사용). 서버에 전달된 현재 도메인 이름 아래의 리소스를 요청할 때 브라우저가 로컬 쿠키를 http에 연결하기 때문입니다.
4. Memcache 기반 세션 공유
Memcache는 Libevent 다중 채널 비동기 I/O 기술을 기반으로 한 메모리 공유 시스템이므로 간단한 Key + Value 데이터 저장 모드로 인해 코드 로직이 간결하고 효율적이므로 동시 처리 능력에 절대적인 이점이 있습니다. , I 경험한 프로젝트는 평균 쿼리 속도가 2000/초에 도달했으며 서버 CPU 소비는 여전히 10% 미만이었습니다.
또한 Memcache의 메모리 해시 테이블 고유의 Expires 데이터 만료 및 제거 메커니즘이 세션 만료 메커니즘과 일치하여 만료된 세션 데이터를 삭제하는 코드 복잡성을 줄여준다는 점도 언급할 가치가 있습니다. 이 논리만으로도 데이터 테이블에 엄청난 쿼리 압력이 발생합니다.
솔루션 중 Memcache 기반 스토리지를 추천합니다!
다른 솔루션에는 여전히 용도가 있습니다. 현재 서버 리소스, 웹 사이트 동시성 압력 등을 기반으로 개발자가 종합적으로 평가해야 하는 특정 선택이 있습니다.