본문 바로가기

Linux is..../Knowledge

cmirror는 무엇인가. 그리고 어디에 쓰일 것인가.

요즘 고객사다니면서 cmirrord가 무엇이냐 질문을 조금 받았다. 
대표적으로 cx와 skxx다. 요즘은 어드민들이 관련자료를 많이 찾고 자기 인프라구성에 알맞는 메카니즘을 찾고자 더욱 많이 뛰는것 같다. 
(필드엔지니어들은 더욱 긴장!!) 
그래서 약 1주동안 테스트및 몇가지알아보던중 얻은 지식을 포스팅하려한다~!


Mirrored 이라는것은 같은 data들을 다른 device로 저장하여 data의 안전성을 보장하고 

또 device failure를 방지하는 mechanism이다. 
가장 기본적인 Mirrored Logical Volumes은 
Mirror leg1(Physical Volume), Mirror Leg2(Physical Volume),log(physical Volume)으로 구성되어있고, 
Mirror leg1이 fail할때 Mirror Leg2는 여전히 접속가능하다.

LVM에서 multiple mirror를 생성해서 mirrored logical volumes를 구성할수 있다.

LVM에서 log로 mirror들의 sync상황을 track하고 기록한다. 
이 log는 일반적으로 Physical Volume에 저장되어있지만 memory으로 저장할수도 있다. 
다만 Physical Volume에 저장된 log는 reboot하셔도 지워지지 않고 memory에 저장된 log는 reboot 후에 지워진다.

Clustered LVM Mirror라는 것은 cluster에서 사용되는 Mirrored Logical Volumes이다.

cmirror는 cluster가 Mirrored Logical Volume기능을 지원하는 daemon이다. 
clvmd daemon이 시작하면 cluster의 모든 node는 volume group의 mirror들을 rsync하는 작업을 한다.

cluster에서 Mirrored Logical Volume을 구성할때 http://docs.redhat.com/docs/en-US/Red_Hat_Enterprise_Linux/… 와https://access.redhat.com/knowledge/solutions/21046 를 참고바람!


# fail 테스트를 원한다면,
fail test부분에서 echo offline > /sys/block/sdX/device/state를 실행해서, mirror와의 연결을 fail할수 있다. 
multipath를 구성했다면 multipath.conf에서 no_path_retry의 값을 "fail"으로 설정. 
no_path_retry의 값이 "fail" 아닌 값으로 설정하면 I/O가 fail할때 바로 fail이 반환하는것이 아니라 
I/O지령들을 설정한 값 만큼 queue에 저장. Mirrored Logical Volume를 구성했다면 storage상에서는 
여러개 Volume으로 나타나지만 OS level에서는 하나의 Volume으로 인식하고 동작한다. 
Mirrored Logical Volume 2개인 경우 안내해드린 명령어로 lv1_mimage_0와의 연결을 끊고 
OS의 IO작업이 계속 진행 된다면 mirror가 작업하고 있다는것을 알린다. 

그리고 lv1_mimage_0와의 연결을 해주고 lv1_mimage_0와 lv1_mimage_1의 data가 동기화 되면 mirror가 정삭적으로 동작하고 있다는 것을 알린다.


추가적으로:
cmirror는 mirror지간에 sync동작을 하거나 또는 storage에 대한 IO작업이 할때 동시에 여러 device로 동작을 하기 때문에 많은 traffic와 I/O를 생성한다. 
이는 cluster지간의 interconnect를 과다 점유하여 업무상 영향을 주거나 또는 traffic load의 증가로 IO request에 unresponsiveness하는 상황이 발행할 우려가 있다는 말할수 있다