다운 타임 제로 구축 달성 에도 동일한 문제가 있었지만 고려중인 전략에 대한 조언이 필요합니다.
문맥
서버 측 처리를위한 Apache / PHP 및 지속성을위한 MySQL DB / 파일 시스템을 갖춘 웹 기반 애플리케이션.
우리는 현재 인프라를 구축하고 있습니다. 모든 네트워킹 하드웨어에는 중복성이 있으며 모든 기본 네트워크 케이블은 내결함성을 위해 본드 쌍으로 사용됩니다. 서버는 하드웨어 내결함성을 위해 고 가용성 쌍으로 구성되며 가상 시스템 내결함성과 일반 성능 모두에 대해로드 밸런싱됩니다.
다운 타임없이 애플리케이션에 업데이트를 적용 할 수있는 것이 나의 의도입니다. 인프라를 설계 할 때 100 % 가동 시간을 제공 할 수 있도록 큰 어려움을 겪었습니다. 업데이트가 적용될 때마다 10-15 분의 다운 타임을 갖는 것은 매우 실망 스러울 것입니다. 릴리스주기가 매우 빠를 때 특히 중요합니다 (때로는 하루에 하나 이상의 릴리스에 도달 할 수 있음).
네트워크 토폴로지
이것은 네트워크의 요약입니다 :
Load Balancer
|----------------------------|
/ / \ \
/ / \ \
| Web Server | DB Server | Web Server | DB Server |
|-------------------------|-------------------------|
| Host-1 | Host-2 | Host-1 | Host-2 |
|-------------------------|-------------------------|
Node A \ / Node B
| / |
| / \ |
|---------------------| |---------------------|
Switch 1 Switch 2
And onward to VRRP enabled routers and the internet
참고 : DB 서버는 마스터-마스터 복제를 사용합니다
제안 된 전략
이를 위해 현재 DB 스키마 업그레이드 스크립트를 두 부분으로 나눌 생각입니다. 업그레이드는 다음과 같습니다.
- 노드 A의 웹 서버는 오프라인 상태입니다. 노드 B의 웹 서버에서 트래픽을 계속 처리합니다.
- 전환 스키마 변경 사항이 DB 서버에 적용됩니다.
- 웹 서버 코드베이스가 업데이트되고 캐시가 지워지며 다른 업그레이드 작업이 수행됩니다.
- 웹 서버 A가 온라인 상태가되고 웹 서버 B가 오프라인 상태가됩니다.
- 웹 서버 B 코드베이스가 업데이트되고 캐시가 지워지며 다른 업그레이드 작업이 수행됩니다.
- 웹 서버 B가 온라인 상태가됩니다.
- 최종 스키마 변경 사항이 DB에 적용됩니다
'Transitional Schema'는 버전 간 호환 가능한 DB를 구축하도록 설계되었습니다. 이것은 대부분 이전 버전 스키마를 시뮬레이션하는 테이블 뷰를 사용하는 반면 테이블 자체는 새로운 스키마로 변경됩니다. 이를 통해 이전 버전이 정상적으로 DB와 상호 작용할 수 있습니다. 테이블 이름에는 어떤 테이블에 쓸지 혼동하지 않도록 스키마 버전 번호가 포함됩니다.
'최종 스키마'는 이전 버전과의 호환성을 제거하고 스키마를 정리합니다.
질문
요컨대, 이것이 효과가 있습니까?
더 구체적으로:
전환 스키마 변경의 특정 시점에서 동시 쓰기 가능성으로 인해 문제가 발생합니까? 테이블을 수정하고 이전 버전과 호환되는보기를 만드는 쿼리 그룹이 연속적으로 실행되도록하는 방법이 있습니까? 즉, 스키마 변경이 완료 될 때까지 다른 쿼리가 버퍼에 유지됩니다. 일반적으로 밀리 초입니다.
다운 타임없이 업데이트를 허용하면서 이러한 정도의 안정성을 제공하는 더 간단한 방법이 있습니까? 이전 버전과의 스키마 호환성에 얽매이지 않기 위해 '진화적인'스키마 전략을 피하는 것이 좋습니다.