2014-06-10 3 views
2

우리 시스템의 사용자와 역할을 정의하는 기본 상태를 저장하기 위해 mnesia를 사용하는 erlang 응용 프로그램이 있습니다. 우리는 우리가 필요로하는 새로운 기능을 가지고 있습니다.이 기능은 우리의 mnesia 테이블에 저장된 레코드 스키마의 확장을 필요로합니다.mnesia 복제 일시 중지

배포 계획은 네트워크에서 제거하는 방법으로 하나의 노드를 클러스터 밖으로 가져 와서 코드를 배포하고 스크립트를 실행하여 해당 노드의 레코드 스키마를 업그레이드하는 것입니다. 다시 사용하십시오. 그러나 일단이 노드의 레코드를 업그레이드하면 다른 노드로 복제되고 잘못 일치하는 레코드 스키마로 인해 해당 노드에서 특정 작업이 실패하기 시작합니다. 분명히 제로 다운 타임 배치에 대한 큰 문제.

스키마 업그레이드가 업그레이드 될 때 각 노드에서 스키마 업그레이드를 실행할 수 있도록 스키마 변경을 분리하는 방법이 있습니까? 바람직하게는 업그레이드되는 테이블에 대해서만 다른 테이블을 계속 복제 할 수 있습니다. 그러나 모든 노드에 배포하는 데 몇 분이 걸리는 동안 모든 노드간에 복제를 종료 할 수 있습니다.

답변

0

이 정확한 문제가있었습니다. 내가 해결할 수 있었던 유일한 방법은 모든 노드를 클러스터 밖으로 가져 와서 하나만 라이브로 남겨두고 "마스터"노드의 스키마와 코드를 업그레이드하는 것입니다. 데이터베이스 파일을 만들고 코드를 업그레이드 한 다음 노드를 가져 와서 (올바른 새 스키마로 테이블을 만든 다음) 클러스터로 다시 가져옵니다.

내가 썼던 escript를 사용하여 노드를 클러스터에서 추가하고 노드를 제거하여보다 쉽게이 작업을 수행하고, Ansible 플레이 북으로 노드를 조정합니다. 나는 정말로 언제든지 그것을 다시하고 싶지 않습니다.

중요한 문제는 Mnesia에는 스키마 버전이 없다는 것입니다. 그렇지 않으면 훨씬 더 나은 방법으로 수행 할 수 있습니다.

관련 문제