Rocky Linux 8 에서 Ceph 17 (Quincy) 설치하기

리눅스/Ceph|2023. 5. 15. 17:02
반응형

여기에서는 Rocky Linux 8 환경에서 Ceph 17.x (Quincy) 버전을 설치하는 방법을 기술하였습니다.

Ceph 는 역할에 따라 MON, OSD, MDS 서버 등 여러대로 나뉘어 운영되므로, 각각의 역할이 이해 된다면 프로젝트에 맞는 적절한 구성을 직접 구현하는것이 좋습니다. 서비스에 적용하실 분은 데이터 망실 방지 또는 무정지 시스템 구축을 목적으로 반드시 이중화 구성을 권장합니다.

 

- MON (Ceph monitor) : 클러스터의 모든 노드 상태를 추적하는 클러스터 모니터 서버입니다.
- OSD (Object Storage Device) : 데이터를 저장하고 클라이언트 요청을 처리하는 서버입니다.
- MDS (Metadata Server Daemon) : 메타데이터 서버입니다. CephFS 파일 시스템 작동에 사용됩니다.

 

 

[테스트 환경]

- H/W : CPU 2 Core & 메모리 4GB

- OS : Rocky Linux 8

- 추가 Disk : 50GB

* 이 구성으로 서버 3대를 준비하였습니다.

 

 

1. 설치

 

1) 환경 업데이트

(모든 서버에서)

# dnf -y update

# dnf -y upgrade

 

2) 호스트명 설정

서버에서 사용할 호스트명을 설정해줍니다.

(모든 서버에서)

# vi /etc/hosts

127.0.0.1 localhost
10.101.0.8 ceph-1
10.101.0.12 ceph-2
10.101.0.22 ceph-3

 

# hostnamectl set-hostname ceph-1    // ceph-1 서버에서

# hostnamectl set-hostname ceph-2    // ceph-2 서버에서

# hostnamectl set-hostname ceph-3    // ceph-3 서버에서

 

3) SSH key copy

(ceph-1 서버에서)

# ssh-keygen    // 패스워드 없이 생성

# ssh-copy-id ceph-1

# ssh-copy-id ceph-2

# ssh-copy-id ceph-3

 

4) chrony 설치

(모든 서버에서)

# dnf -y install chrony

# systemctl enable --now chronyd

 

5) Python 설치

(모든 서버에서)

# dnf -y install python39
# python3 --version

Python 3.9.16

 

6) Podman 설치

(모든 서버에서)

# dnf -y install podman
# podman -v

podman version 4.4.1

 

7) cephadm 설치
클러스터를 생성하고 구성하는데 사용할 cephadm 도구를 설치합니다.

(모든 서버에서)
# curl --silent --remote-name --location https://github.com/ceph/ceph/raw/quincy/src/cephadm/cephadm
# chmod +x cephadm
# ./cephadm add-repo --release quincy
# ./cephadm install

Ceph 클러스터를 만들기 위해 cephadm 부트스트랩이 사용됩니다.

이 명령어는 지정된 노드에서 Ceph 서비스와 첫 번째 모니터를 시작하고 클러스터를 만들고 키, 구성 파일 등을 생성합니다.

 

모니터 데몬을 생성합니다. 명령 실행시 모니터 데몬이 생성될 서버의 IP 를 기입해줍니다.

만약, OSD 간 복제 트래픽을 위해 별도의 네트워크를 사용하고자 하는 경우 아래와 같은 옵션을 같이 사용하시기 바랍니다.

--cluster-network 192.168.1.0/24

(ceph-1 서버에서)

# cephadm bootstrap --mon-ip 10.101.0.8

...

Ceph Dashboard is now available at:
      URL: https://ceph-1:8443/
      User: admin
      Password: vqyeyu0il6

...

 

설치가 완료되면 위와 같이 Ceph 대시보드 접속 정보가 출력됩니다.

웹브라우저를 이용하여 접속, 로그인을 하면 관리 페이지가 잘 출력되는 것을 확인할 수 있습니다.

처음 로그인시 패스워드를 변경하는 절차가 있고, 로그인을 다시 하면 대시보드에 접속 됩니다.

대시보드가 설치 되었지만 앞으로의 설정과 사용 방법은 CLI 환경에서 이어 나가도록 하겠습니다.

 

8) ceph-common 설치

설치된 cephadm 파일로 ceph-common 패키지 설치를 이어갑니다.

(모든 서버에서)

# cephadm install ceph-common

 

설치된 버전을 확인합니다.

# ceph -v
ceph version 17.2.6 (d7ff0d10654d2280e08f1ab989c7cdf3064446a5) quincy (stable)

 

관리 작업에 첫 번째 노드를 사용하므로 SSH 키를 설치하고 나머지 노드의 /etc/ceph 에 배치해야 합니다.

(ceph-1 서버에서)
# ssh-copy-id -f -i /etc/ceph/ceph.pub root@ceph-2
# ssh-copy-id -f -i /etc/ceph/ceph.pub root@ceph-3

 

Ceph 클러스터에 호스트를 추가 합니다.
# ceph orch host add ceph-2

Added host 'ceph-2' with addr '10.101.0.12'
# ceph orch host add ceph-3

Added host 'ceph-3' with addr '10.101.0.22'

 

호스트 목록을 확인합니다.
# ceph orch host ls

HOST    ADDR         LABELS  STATUS  
ceph-1  10.101.0.8   _admin          
ceph-2  10.101.0.12                  
ceph-3  10.101.0.22                  
3 hosts in cluster

 

Ceph Monitor 데몬은 클러스터 구성원 자격, 구성 및 상태에 대한 매우 안정적이고 지속적인 저장을 제공하기 위하여 모든 노드에 MON 역할을 부여합니다.

# ceph orch apply mon --placement="ceph-1,ceph-2,ceph-3"

 

Ceph Manager 데몬은 모니터 데몬과 함께 실행되어 외부 모니터링 및 관리 시스템에 추가적인 모니터링 및 인터페이스를 제공합니다.

역시 모든 노드에 MGR 역할을 부여합니다.

# ceph orch apply mgr --placement="ceph-1,ceph-2,ceph-3"

 

CephRBD 뿐 아니라 CephFS 도 사용하기 위해 MDS 를 생성합니다. 미리 모든 노드에 MDS 역할을 부여 합니다.

여기에서는 파일시스템을 식별하기 위해 myfs 라는 이름으로 생성 하였습니다.

# ceph orch apply mds myfs --placement="ceph-1,ceph-2,ceph-3"

 

OSD 저장소를 추가 합니다. Ceph 저장에 사용할 수 있는 디스크를 하나씩 추가해 줍니다.

형식) # ceph orch daemon add osd {호스트명}:{디스크},{디스크},...

# ceph orch daemon add osd ceph-1:/dev/vdb
# ceph orch daemon add osd ceph-2:/dev/vdb
# ceph orch daemon add osd ceph-3:/dev/vdb

 

Ceph 및 OSD 상태를 확인합니다.

# ceph -s

  cluster:
    id:     17bddd2a-5b78-11ee-b774-fa163ed3a133
    health: HEALTH_OK
 
  services:
    mon: 3 daemons, quorum ceph-1,ceph-3,ceph-2 (age 14h)
    mgr: ceph-1.ieznfl(active, since 14h), standbys: ceph-3.hfrlpp, ceph-2.vgyqhd
    osd: 3 osds: 3 up (since 13h), 3 in (since 13h)
 
  data:
    pools:   1 pools, 1 pgs
    objects: 2 objects, 449 KiB
    usage:   63 MiB used, 150 GiB / 150 GiB avail
    pgs:     1 active+clean

 

# ceph osd tree

ID  CLASS  WEIGHT   TYPE NAME        STATUS  REWEIGHT  PRI-AFF
-1         0.14639  root default                              
-3         0.04880      host ceph-1                           
 0    hdd  0.04880          osd.0        up   1.00000  1.00000
-5         0.04880      host ceph-2                           
 1    hdd  0.04880          osd.1        up   1.00000  1.00000
-7         0.04880      host ceph-3                           
 2    hdd  0.04880          osd.2        up   1.00000  1.00000

 

9) 라벨링

호스트에 라벨 할당하는 것을 지원합니다. 라벨은 자유 형식이며 그 자체로는 특별한 의미가 없습니다.

각 호스트는 여러 개의 라벨을 가질 수 있으므로 데몬의 배치를 기록해 두는데 사용하면 편리합니다.
# ceph orch host label add ceph-1 osd
# ceph orch host label add ceph-2 osd
# ceph orch host label add ceph-3 osd
# ceph orch host label add ceph-1 mon
# ceph orch host label add ceph-2 mon
# ceph orch host label add ceph-3 mon
# ceph orch host label add ceph-1 mgr
# ceph orch host label add ceph-2 mgr
# ceph orch host label add ceph-3 mgr

 

* 참고 : 라벨 삭제는 add 대신 rm 옵션 사용

 

전체 라벨을 확인합니다.

# ceph orch host ls
HOST    ADDR         LABELS              STATUS  
ceph-1  10.101.0.8   _admin osd mon mgr          
ceph-2  10.101.0.12  osd mon mgr                 
ceph-3  10.101.0.22  osd mon mgr                 
3 hosts in cluster

 

 

2. 설정

 

1) Pool 생성

Pool 은 데이터를 저장하고 관리하는 논리적인 저장 공간을 나타내며, Pool 안에 여러개의 블록 레벨 스토리지 이미지를 생성할 수 있으므로 그룹이라고 생각해도 좋습니다. Pool 생성 및 삭제에 관한 기본 명령은 아래와 같습니다.

- 생성 : ceph osd pool create {pool-name} {pg-num} {pgp-num}

- 확인 : ceph osd lspools

- 데이터 복사 : rados cppool {old-pool-name} {new-pool-name}    // 새로운 Pool 생성 후 데이터 복사 가능

- 삭제 : ceph osd pool delete {pool-name} {pool-name} --yes-i-really-really-mean-it    // 하단 선행작업 필요

- 이름 변경 : ceph osd pool rename {old-pool-name} {new-pool-name}

- 제한 : ceph osd pool set-quota {pool-name} max_bytes {limit-size}    // 예 : 10G (제한 해제값 : 0)

- 제한 확인 : ceph osd pool get-quota {pool-name}

 

* 삭제시 선행작업

pool 삭제시 그 안에 생성한 여러 volume 들은 함께 삭제가 됩니다.

이와 같이 실수로 삭제하는것을 방지하기 위하여 pool 이름을 두 번 쓰고, 명령을 인지하고 있다는 옵션 (문장) 도 적어줘야 합니다. 그리고 사전 작업으로 아래 옵션을 적용하고 삭제 명령을 실행해야 합니다.

# ceph config set mon mon_allow_pool_delete true

삭제 이후에는 다른 실수가 없도록 다시 delete 명령을 비활성화 합니다.

# ceph config set mon mon_allow_pool_delete false

 

Pool 생성시 기본 pg_num 을 정하는 기준은 아래를 권장합니다.

(참고 : 2016년도에 기록한 내용으로 사용)
- OSD 가 5개 미만일 경우 pg_num 128
- 5~10 개는 pg_num 512
- 10~50 개는 pg_num 4096 이 적절 합니다.
- 50개 이상은 pgcalc 계산을 참조하여 설정하면 됩니다.

Pool 이름은 sysdocu 로 하고, 준비된 OSD 개수가 3개 였으므로, pg_num 을 128 로 설정하여 진행할 것입니다.

pgp-num 은 생략하겠습니다.
# ceph osd pool create sysdocu 128
pool 'sysdocu' created

 

2) CephRBD 이미지 생성

블록 레벨 스토리지 이미지를 생성합니다.

# rbd create sysdocu/volume01 --size 1G --image-feature layering

 

생성된 볼륨 리스트를 확인합니다.

# rbd ls sysdocu
volume01

 

하나의 볼륨 정보를 확인하는 방법은 아래와 같습니다.

# rbd info sysdocu/volume01
rbd image 'volume01':
size 1 GiB in 256 objects
order 22 (4 MiB objects)
snapshot_count: 0
id: 5e94b120cbea
block_name_prefix: rbd_data.5e94b120cbea
format: 2
features: layering
op_features: 
flags: 
create_timestamp: Tue Sep 26 07:40:53 2023
access_timestamp: Tue Sep 26 07:40:53 2023
modify_timestamp: Tue Sep 26 07:40:53 2023

 

참고로, 아래는 볼륨 삭제하는 명령 형식입니다.

# rbd rm {pool-name}/{volume-name}

 

3) CephFS 생성

파일시스템으로 사용 가능한 CephFS 를 생성합니다.

아래와 같이 실행시 자동으로 MDS 가 구동됩니다.

# ceph fs volume create myfs

* MDS 상태 확인
# ceph -s
또는
# ceph orch ls

* CephFS 리스트 확인
# ceph fs ls
name: myfs, metadata pool: cephfs.myfs.meta, data pools: [cephfs.myfs.data ]
또는
# ceph mds stat
myfs:1 {0=myfs.ceph-2.bmzpdd=up:active} 1 up:standby

 

반응형

댓글()

이미지 업로드 에러발생시

리눅스/Ceph|2017. 8. 7. 09:51
반응형
원인 : token id 인증유효기간
ImageNotAuthorized: Not authorized for image 9caecc4e-eaf0-48c6-aebe-04581707ff2b.

기본값은 3600초 (1시간)
이미지를 Upload 시점부터 주기적으로 image 상태를 체크하게 되는데 완료된 시점에 처음시점에 발급받은 토큰 유효기간이 지나면서 인증에 오류발생 


# cat /etc/keystone/keystone.conf
..............
[token]
provider = fernet
expiration =9000 
 :: 2시간 30분
 
# service apache2 restart
# date
2017. 08. 01. (화) 11:34:42 KST

# openstack token issue -c expires
+---------+-----------------------------+
| Field   | Value                       |
+---------+-----------------------------+
| expires | 2017-08-01T12:34:50.751559Z |
+---------+-----------------------------+

# service apache2 restart
# openstack token issue -c expires
+---------+-----------------------------+
| Field   | Value                       |
+---------+-----------------------------+
| expires | 2017-08-01T14:05:06.677567Z |
+---------+-----------------------------+



# cat /var/log/cinder/cinder-volume.log
..........................................
2017-07-18 17:40:23.130 24165 INFO cinder.volume.manager [req-ce23ac35-f334-43f0-909a-4b89cd47c5c7 21600390e35444bb989d79b4bc4ca15f 07edea9946d84472b2dfd8214c39bfb0 - - -] Created volume successfully.
2017-07-18 17:40:26.067 24165 INFO cinder.volume.manager [req-05c9cc61-a77f-410e-a481-770ab11659a9 21600390e35444bb989d79b4bc4ca15f 07edea9946d84472b2dfd8214c39bfb0 - - -] Initialize volume connection completed successfully.
2017-07-18 17:40:27.880 24165 INFO cinder.volume.manager [req-7526c5c2-50ea-458e-90b7-3718f6c26bee 21600390e35444bb989d79b4bc4ca15f 07edea9946d84472b2dfd8214c39bfb0 - - -] Attach volume completed successfully.
2017-07-18 17:52:08.341 24165 INFO cinder.image.image_utils [req-067b3d37-01ec-42b7-b178-547670a0c029 0989cabab0124d578b69f1e4aa9a1841 7d5a2d6a87b7425b84a23a673a1a530d - - -] Converted 153600.00 MB image at 83.71 MB/s

2017-07-18 18:58:50.151 24165 ERROR cinder.volume.manager [req-067b3d37-01ec-42b7-b178-547670a0c029 0989cabab0124d578b69f1e4aa9a1841 7d5a2d6a87b7425b84a23a673a1a530d - - -] Upload volume to image encountered an error (image-id: 9caecc4e-eaf0-48c6-aebe-04581707ff2b).
2017-07-18 18:58:53.549 24165 WARNING cinder.volume.manager [req-067b3d37-01ec-42b7-b178-547670a0c029 0989cabab0124d578b69f1e4aa9a1841 7d5a2d6a87b7425b84a23a673a1a530d - - -] Image delete encountered an error.
2017-07-18 18:58:53.549 24165 ERROR cinder.volume.manager Traceback (most recent call last):
2017-07-18 18:58:53.549 24165 ERROR cinder.volume.manager   File "/usr/lib/python2.7/dist-packages/cinder/volume/manager.py", line 1330, in _delete_image
2017-07-18 18:58:53.549 24165 ERROR cinder.volume.manager     image_meta = image_service.show(context, image_id)
2017-07-18 18:58:53.549 24165 ERROR cinder.volume.manager   File "/usr/lib/python2.7/dist-packages/cinder/image/glance.py", line 245, in show
2017-07-18 18:58:53.549 24165 ERROR cinder.volume.manager     _reraise_translated_image_exception(image_id)
2017-07-18 18:58:53.549 24165 ERROR cinder.volume.manager   File "/usr/lib/python2.7/dist-packages/cinder/image/glance.py", line 555, in _reraise_translated_image_exception
2017-07-18 18:58:53.549 24165 ERROR cinder.volume.manager     six.reraise(type(new_exc), new_exc, exc_trace)
2017-07-18 18:58:53.549 24165 ERROR cinder.volume.manager   File "/usr/lib/python2.7/dist-packages/cinder/image/glance.py", line 243, in show
2017-07-18 18:58:53.549 24165 ERROR cinder.volume.manager     image = self._client.call(context, 'get', image_id)
2017-07-18 18:58:53.549 24165 ERROR cinder.volume.manager   File "/usr/lib/python2.7/dist-packages/cinder/image/glance.py", line 177, in call
2017-07-18 18:58:53.549 24165 ERROR cinder.volume.manager     return getattr(controller, method)(*args, **kwargs)
2017-07-18 18:58:53.549 24165 ERROR cinder.volume.manager   File "/usr/lib/python2.7/dist-packages/glanceclient/v1/images.py", line 132, in get
2017-07-18 18:58:53.549 24165 ERROR cinder.volume.manager     % urlparse.quote(str(image_id)))
2017-07-18 18:58:53.549 24165 ERROR cinder.volume.manager   File "/usr/lib/python2.7/dist-packages/glanceclient/common/http.py", line 272, in head
2017-07-18 18:58:53.549 24165 ERROR cinder.volume.manager     return self._request('HEAD', url, **kwargs)
2017-07-18 18:58:53.549 24165 ERROR cinder.volume.manager   File "/usr/lib/python2.7/dist-packages/glanceclient/common/http.py", line 267, in _request
2017-07-18 18:58:53.549 24165 ERROR cinder.volume.manager     resp, body_iter = self._handle_response(resp)
2017-07-18 18:58:53.549 24165 ERROR cinder.volume.manager   File "/usr/lib/python2.7/dist-packages/glanceclient/common/http.py", line 83, in _handle_response
2017-07-18 18:58:53.549 24165 ERROR cinder.volume.manager     raise exc.from_response(resp, resp.content)
2017-07-18 18:58:53.549 24165 ERROR cinder.volume.manager ImageNotAuthorized: Not authorized for image 9caecc4e-eaf0-48c6-aebe-04581707ff2b.
2017-07-18 18:58:53.549 24165 ERROR cinder.volume.manager
2017-07-18 18:58:53.615 24165 ERROR oslo_messaging.rpc.dispatcher [req-067b3d37-01ec-42b7-b178-547670a0c029 0989cabab0124d578b69f1e4aa9a1841 7d5a2d6a87b7425b84a23a673a1a530d - - -] Exception during message handling: Not authorized for image 9caecc4e-eaf0-48c6-aebe-04581707ff2b.
2017-07-18 18:58:53.615 24165 ERROR oslo_messaging.rpc.dispatcher Traceback (most recent call last):
2017-07-18 18:58:53.615 24165 ERROR oslo_messaging.rpc.dispatcher   File "/usr/lib/python2.7/dist-packages/oslo_messaging/rpc/dispatcher.py", line 138, in _dispatch_and_reply
2017-07-18 18:58:53.615 24165 ERROR oslo_messaging.rpc.dispatcher     incoming.message))
2017-07-18 18:58:53.615 24165 ERROR oslo_messaging.rpc.dispatcher   File "/usr/lib/python2.7/dist-packages/oslo_messaging/rpc/dispatcher.py", line 185, in _dispatch
2017-07-18 18:58:53.615 24165 ERROR oslo_messaging.rpc.dispatcher     return self._do_dispatch(endpoint, method, ctxt, args)
2017-07-18 18:58:53.615 24165 ERROR oslo_messaging.rpc.dispatcher   File "/usr/lib/python2.7/dist-packages/oslo_messaging/rpc/dispatcher.py", line 127, in _do_dispatch
2017-07-18 18:58:53.615 24165 ERROR oslo_messaging.rpc.dispatcher     result = func(ctxt, **new_args)
2017-07-18 18:58:53.615 24165 ERROR oslo_messaging.rpc.dispatcher   File "/usr/lib/python2.7/dist-packages/cinder/volume/manager.py", line 1320, in copy_volume_to_image
2017-07-18 18:58:53.615 24165 ERROR oslo_messaging.rpc.dispatcher     payload['message'] = six.text_type(error)
2017-07-18 18:58:53.615 24165 ERROR oslo_messaging.rpc.dispatcher   File "/usr/lib/python2.7/dist-packages/oslo_utils/excutils.py", line 220, in __exit__
2017-07-18 18:58:53.615 24165 ERROR oslo_messaging.rpc.dispatcher     self.force_reraise()
2017-07-18 18:58:53.615 24165 ERROR oslo_messaging.rpc.dispatcher   File "/usr/lib/python2.7/dist-packages/oslo_utils/excutils.py", line 196, in force_reraise
2017-07-18 18:58:53.615 24165 ERROR oslo_messaging.rpc.dispatcher     six.reraise(self.type_, self.value, self.tb)
2017-07-18 18:58:53.615 24165 ERROR oslo_messaging.rpc.dispatcher   File "/usr/lib/python2.7/dist-packages/cinder/volume/manager.py", line 1306, in copy_volume_to_image
2017-07-18 18:58:53.615 24165 ERROR oslo_messaging.rpc.dispatcher     image_service, image_meta)
2017-07-18 18:58:53.615 24165 ERROR oslo_messaging.rpc.dispatcher   File "/usr/lib/python2.7/dist-packages/cinder/volume/drivers/rbd.py", line 961, in copy_volume_to_image
2017-07-18 18:58:53.615 24165 ERROR oslo_messaging.rpc.dispatcher     image_meta, tmp_file)
2017-07-18 18:58:53.615 24165 ERROR oslo_messaging.rpc.dispatcher   File "/usr/lib/python2.7/dist-packages/cinder/image/image_utils.py", line 414, in upload_volume
2017-07-18 18:58:53.615 24165 ERROR oslo_messaging.rpc.dispatcher     image_service.update(context, image_id, {}, image_file)
2017-07-18 18:58:53.615 24165 ERROR oslo_messaging.rpc.dispatcher   File "/usr/lib/python2.7/dist-packages/cinder/image/glance.py", line 364, in update
2017-07-18 18:58:53.615 24165 ERROR oslo_messaging.rpc.dispatcher     _reraise_translated_image_exception(image_id)
2017-07-18 18:58:53.615 24165 ERROR oslo_messaging.rpc.dispatcher   File "/usr/lib/python2.7/dist-packages/cinder/image/glance.py", line 555, in _reraise_translated_image_exception
2017-07-18 18:58:53.615 24165 ERROR oslo_messaging.rpc.dispatcher     six.reraise(type(new_exc), new_exc, exc_trace)
2017-07-18 18:58:53.615 24165 ERROR oslo_messaging.rpc.dispatcher   File "/usr/lib/python2.7/dist-packages/cinder/image/glance.py", line 362, in update
2017-07-18 18:58:53.615 24165 ERROR oslo_messaging.rpc.dispatcher     **image_meta)
2017-07-18 18:58:53.615 24165 ERROR oslo_messaging.rpc.dispatcher   File "/usr/lib/python2.7/dist-packages/cinder/image/glance.py", line 177, in call
2017-07-18 18:58:53.615 24165 ERROR oslo_messaging.rpc.dispatcher     return getattr(controller, method)(*args, **kwargs)
2017-07-18 18:58:53.615 24165 ERROR oslo_messaging.rpc.dispatcher   File "/usr/lib/python2.7/dist-packages/glanceclient/v1/images.py", line 365, in update
2017-07-18 18:58:53.615 24165 ERROR oslo_messaging.rpc.dispatcher     resp, body = self.client.put(url, headers=hdrs, data=image_data)
2017-07-18 18:58:53.615 24165 ERROR oslo_messaging.rpc.dispatcher   File "/usr/lib/python2.7/dist-packages/glanceclient/common/http.py", line 281, in put
2017-07-18 18:58:53.615 24165 ERROR oslo_messaging.rpc.dispatcher     return self._request('PUT', url, **kwargs)
2017-07-18 18:58:53.615 24165 ERROR oslo_messaging.rpc.dispatcher   File "/usr/lib/python2.7/dist-packages/glanceclient/v1/images.py", line 365, in update
2017-07-18 18:58:53.615 24165 ERROR oslo_messaging.rpc.dispatcher     resp, body = self.client.put(url, headers=hdrs, data=image_data)
2017-07-18 18:58:53.615 24165 ERROR oslo_messaging.rpc.dispatcher   File "/usr/lib/python2.7/dist-packages/glanceclient/common/http.py", line 281, in put
2017-07-18 18:58:53.615 24165 ERROR oslo_messaging.rpc.dispatcher     return self._request('PUT', url, **kwargs)
2017-07-18 18:58:53.615 24165 ERROR oslo_messaging.rpc.dispatcher   File "/usr/lib/python2.7/dist-packages/glanceclient/common/http.py", line 267, in _request
2017-07-18 18:58:53.615 24165 ERROR oslo_messaging.rpc.dispatcher     resp, body_iter = self._handle_response(resp)
2017-07-18 18:58:53.615 24165 ERROR oslo_messaging.rpc.dispatcher   File "/usr/lib/python2.7/dist-packages/glanceclient/common/http.py", line 83, in _handle_response
2017-07-18 18:58:53.615 24165 ERROR oslo_messaging.rpc.dispatcher     raise exc.from_response(resp, resp.content)
2017-07-18 18:58:53.615 24165 ERROR oslo_messaging.rpc.dispatcher ImageNotAuthorized: Not authorized for image 9caecc4e-eaf0-48c6-aebe-04581707ff2b.
2017-07-18 18:58:53.615 24165 ERROR oslo_messaging.rpc.dispatcher



[출처] https://chonnom.com/bbs/board.php?bo_table=OpenStack&wr_id=524

반응형

댓글()

Ceph qcow2 실제 디스크 사용량으로 변환 (zero-fill)

리눅스/Ceph|2017. 7. 7. 11:14
반응형
qcow2 이미지는 동적이미지로 할당된 이미지사이즈에서 실제 디스크 사용량만큼 증가하게 되는데....일정수치만큼 증가후에 실데이타를 삭제하게 되었을경우 비어있는(지워버린) 데이타를 감지하지 못합니다.
이럴경우 비어있는(zero area or zero-fill) 데이터를 삭제하여 이미지 크기를 실싸이즈로 변환해주는 방법입니다.


VM 실제 사용용량
[root@CHONNOM ~]# df -Th
Filesystem     Type   Size  Used Avail Use% Mounted on
/dev/vda1      ext3    99G   23G   71G  25% /
tmpfs          tmpfs  499M     0  499M   0% /dev/shm


HOST 내에서 확인해보는 디스크사용량
# qemu-img info 192.168.30.193.qcow2 
image: 192.168.30.193.qcow2
file format: qcow2
virtual size: 100G (107374182400 bytes)
disk size: 41G
cluster_size: 65536
==>> VM내에서 사용되고 있는 디스크량(23G)과 HOST에서 확인하는 디스크 싸이즈 차이남!


ZERO AREA 삭제방법
방법1) VM에서 남은공간을 zero 파일로 만들고 삭제후 컨버팅
VM
# dd if=/dev/zero of=file.zeros
dd: writing to `file.zeros': 장치에 남은 공간이 없음
158729705+0 records in
158729704+0 records out
81269608448 bytes (81 GB) copied, 735.199 s, 111 MB/s
# rm -rf file.zeros
# shutdown -h now

HOST
# qemu-img convert 192.168.30.193.qcow2 -O qcow2 convert_192.168.30.193.qcow2
# qemu-img info convert_192.168.30.193.qcow2 
image: convert_192.168.30.193.qcow2
file format: qcow2
virtual size: 100G (107374182400 bytes)
disk size: 23G
cluster_size: 65536
# rm -rf 192.168.30.193.qcow2
# mv convert_192.168.30.193.qcow2 192.168.30.193.qcow2
qemu 시작


방법2) 압축옵션으로 컨버팅
HOST
# qemu-img convert -c 192.168.30.193_7250_vm04020.qcow2 -O qcow2 chk.qcow2
단점) -c 옵션없이 convert 할때에 비해 시간이 4~5배 오래걸림
장점) 좀더 확인해봐야되나....작업시 시스템 로드는 반으로 줄어듬

# qemu-img info chk.qcow2 
image: chk.qcow2
file format: qcow2
virtual size: 100G (107374182400 bytes)
disk size: 13G   -->> 원래싸이즈보다도 줄어듬
cluster_size: 65536


※ qemu-img convert
'-c' indicates that target image must be compressed (qcow format only
'-S' indicates the consecutive number of bytes that must contain only zeros
       for qemu-img to create a sparse image during conversion


[출처] https://chonnom.com/bbs/board.php?bo_table=B19&wr_id=627&sca=&sfl=wr_subject%7C%7Cwr_content&stx=zero+fill&sop=and

반응형

댓글()

Ceph qemu-nbd and zerofill 사용하고 다시 줄어든 용량 적용해주기

리눅스/Ceph|2017. 7. 7. 11:13
반응형
블록 스토리지를 사용하는 사람이 용량을 많이 사용했다 줄여도
백업은 최대로 사용했던 용량만큼 진행되게 됩니다.
고객이 왜이렇게 오래 걸리는지 문의를 해오면 해당내용 설명하고
고객 동의 얻고 서버에 로그인하여 아래처럼 최대 사용량을 조정해주는 방법이 있습니다.


동적으로 확장된 이미지 크기 변환 (zero-fill)

:: HOST 내에서 인식중인 디스크 크기확인 (동적으로 확장된 이미지)
qemu-img info disk
image: disk
file format: qcow2
virtual size: 160G (171798691840 bytes)
disk size: 7.2G
cluster_size: 65536
backing file: /var/lib/nova/instances/_base/xxxxxe63f446daf1f5522
Format specific information:
    compat: 1.1
    lazy refcounts: false
    corrupt: false

:: 이미지 마운트
# qemu-nbd -c /dev/nbd0 disk
kpartx  -a /dev/nbd0
mount /dev/mapper/nbd0p1 /mnt

:: 실제 사용중인 디스크 크기 (VM에서 인식되는)
df -Th |grep mnt
/dev/mapper/nbd0p1 ext4      7.8G  766M  6.6G  11% /mnt

dd if=/dev/zero of=/mnt/file.zeros
dd: `/mnt/file.zeros' 로 쓰는 중: 장치에 남은 공간이 없음
14606969+0 레코드 들어옴
14606968+0 레코드 나감
7478767616 바이트 (7.5 GB) 복사됨, 550.691 초, 13.6 MB/초

:: 삭제 & umount 
rm -rf /mnt/file.zero
umount  /mnt 
kpartx  -d /dev/nbd0
qemu-nbd -d /dev/nbd0
/dev/nbd0 disconnected

:: 이미지 convert
qemu-img convert  disk -O qcow2 disk_resize.qcow2
qemu-img info disk_resize.qcow2 
image: disk_resize.qcow2
file format: qcow2
virtual size: 160G (171798691840 bytes)
disk size: 832M
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: false
    corrupt: false



[출처] https://chonnom.com/bbs/board.php?bo_table=B19&wr_id=813&sca=&sfl=wr_subject%7C%7Cwr_content&stx=zero&sop=and


반응형

댓글()

Ceph 실제 고객이 사용하는 블록스토리지 1개 사용량 확인하기

리눅스/Ceph|2017. 7. 7. 10:59
반응형
rbd Block 정보확인 
# rbd info volumes/volume-955805cb-6e7f-4b99-b4a8-01a1c7b904a8
rbd image 'volume-955805cb-6e7f-4b99-b4a8-01a1c7b904a8':
size 102400 MB in 25600 objects
order 22 (4096 kB objects)
block_name_prefix: rbd_data.8fbe513dd09102
format: 2
features: layering
flags: 


# rbd diff volumes/volume-955805cb-6e7f-4b99-b4a8-01a1c7b904a8
Offset       Length  Type 
0            4194304 data 
4194304      4194304 data 
8388608      4194304 data 
12582912     4194304 data 
16777216     4194304 data 
20971520     4194304 data 
25165824     4194304 data 
........................


# rbd diff volumes/volume-955805cb-6e7f-4b99-b4a8-01a1c7b904a8 | awk '{ SUM += $2 } END { print SUM/1024/1024 " MB" }'
3085.72 MB


Instance 내에서 Block Storage 확인 
# df -Th |grep vdb1
/dev/vdb1      ext4       99G  1.2G   93G   2% /Block_Storage

* 사용했다 줄어든 부분은 적용되지 않음


반응형

댓글()

Ceph mount 명령어 스크립트를 암호화 하여 (부팅시) 다른 데몬 보다 먼저 구동하기

리눅스/Ceph|2016. 9. 2. 13:03
반응형

Ceph client 가 mount 를 하려면 /etc/ceph/ 디렉토리 안에 키파일을 넣어놓던가

마운트 명령줄에 키를 옵션으로 넣어 암호화 스크립트로 만들고, rc.local 에 등록하여 구동 합니다.



[문제점]


전자의 경우, ceph 설정파일 안에 계정과 키가 보이기 때문에, client 가 마음만 먹으면 언제든 rbd 명령을 수행할 수 있게 됩니다. (pool 생성, 이미지 생성, 용량 증가, 사용자 정보보기)


후자의 경우 ceph 스토리지 마운트보다 mysql 의 데몬 구동 시도가 우선되므로, ceph 스토리지 안에 DATA 디렉토리를 넣고 사용할 경우 mysql 이 정상 구동되지 못합니다. (mysql 데몬 구동시 ceph 스토리지가 마운트 되어있지 않으므로)



[해결책]


이 문제를 해결하기 위해서 아래와 같은 절차를 따릅니다.


1. ceph 스토리지 mount 스크립트 작성


#!/bin/bash

rbd --mon_host 192.168.10.2 --conf /dev/null --keyring /dev/null --name client.sysdocu --key AQC9IMVX7npVIRAAnhDCmV7BGgIwFG1tBPyeAA== --pool sysdocu-pool map vda

mount /dev/rbd0 /DATA


2. 위 스크립트 파일을 shc 명령으로 암호화 합니다.


3. /etc/ceph/ 디렉토리에 cfs_mount 이름으로 가져다 놓습니다. (파일명 상관없음)


4. /etc/init.d/rbdmap 파일을 열어 start 부분에 스크립트를 추가합니다.


(생략)

  start)

        /etc/ceph/cfs_mount    // 스크립트를 추가합니다.

        rbdmap map

        ;;

(생략)


5. 부팅시 rbdmap 데몬이 구동되도록 합니다.


- CentOS : ntsysv 실행

- Ubuntu : sysv-rc-conf 실행



rc3.d 디렉토리에서 보면 알 수 있듯 ceph 스토리지 마운트 데몬이 다른 데몬보다 구동 우선순위가 높습니다.

이렇게 보안상 문제 (마운트 스크립트 암호화) 와 서비스 문제 (mysql 등의 데몬 구동) 를 해결하였습니다.



반응형

댓글()

Ceph image 파일 내용 보기 (마운트)

리눅스/Ceph|2016. 9. 1. 08:24
반응형

1. 이미지 파일 속성 확인하기


본 매뉴얼에서의 테스트 파일은 test.img 이며, raw 포맷 파일입니다.

파일 속성 확인 하는 방법 은 아래와 같습니다.


# qemu-img info test.img

image: test.img

file format: raw

virtual size: 200M (209715200 bytes)

disk size: 200M    // 용량이 제대로 표시되지 않음


* 용량이 제대로 표시되지 않는 경우
이미지를 생성하면 용량이 정상적으로 출력되지만, 이미지 파일을 복사 (예: ftp 전송) 하였을 경우
용량 정보가 삭제 되는것으로 예상됩니다.

이럴 경우 아래와 같이 용량이 올바른 값으로 출력되게 할 수 있습니다. (그러나 별 의미 없음)


# qemu-img convert test.img -O raw tmp.img


# qemu-img info tmp.img

image: tmp.img

file format: raw

virtual size: 200M (209715200 bytes)

disk size: 2.6M    // 용량이 제대로 표시 되었음



2. XFS 파티션 이미지 마운트하기


# mkdir /sysdocu_test


# mount -o loop test.img /sysdocu_test


# df -h

Filesystem     Type      Size  Used Avail Use% Mounted on

devtmpfs       devtmpfs  3.9G     0  3.9G   0% /dev

tmpfs          tmpfs     3.9G   36M  3.9G   1% /dev/shm

tmpfs          tmpfs     3.9G  1.5M  3.9G   1% /run

tmpfs          tmpfs     3.9G     0  3.9G   0% /sys/fs/cgroup

/dev/sda2      ext4      110G   62G   43G  60% /

tmpfs          tmpfs     3.9G   64K  3.9G   1% /tmp

/dev/sdb1      ext4       74G  3.4G   67G   5% /2ND-DISK

tmpfs          tmpfs     799M   12K  799M   1% /run/user/42

tmpfs          tmpfs     799M   32K  799M   1% /run/user/1000

/dev/loop0     xfs       190M   88M  102M  47% /sysdocu_test


# ll /sysdocu_test

합계 70000

-rw-r--r-- 1 root root 10240000  8월 31 16:08 testfile

-rw-r--r-- 1 root root 10240000  8월 31 16:09 testfile2

-rw-r--r-- 1 root root 10240000  8월 31 16:17 testfile3

-rw-r--r-- 1 root root 10240000  8월 31 16:30 testfile4

-rw-r--r-- 1 root root 10240000  8월 31 16:41 testfile5

-rw-r--r-- 1 root root 10240000  8월 31 17:05 testfile6

-rw-r--r-- 1 root root 10240000  8월 31 17:06 testfile7



3. EXT4 파티션 이미지 마운트하기


(ext4 테스트 파일명 : 215_43_snap.img / raw 포맷)


# mkdir /sysdocu_test2

# mount -o loop 215_43_snap.img /sysdocu_test2    // -t ext4 옵션을 추가해 주어도 마찬가지
mount: wrong fs type, bad option, bad superblock on /dev/loop1,
       missing codepage or helper program, or other error

       In some cases useful info is found in syslog - try
       dmesg | tail or so.

# fdisk -u -l 215_43_snap.img
Disk 215_43_snap.img: 200 MiB, 209715200 bytes, 409600 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xcc803d7c

Device           Boot Start    End Sectors   Size Id Type
215_43_snap.img1         63 401624  401562 196.1M 83 Linux

위에서 출력되는 sector 값과 Start 값을 곱합니다.

512 * 63 = 32256    // 결과값 32256 확인 (offset 옵션으로 사용)

* 참고
이미지안에 파티션이 1개일경우 대부분 offset 값이 32256 이나,
파티션이 여러개일 경우, 반드시 확인하고 계산해야 마운트가 가능합니다.

# mount -o loop,offset=32256 215_43_snap.img /sysdocu_test2

# df -Th
Filesystem     Type      Size  Used Avail Use% Mounted on
devtmpfs       devtmpfs  3.9G     0  3.9G   0% /dev
tmpfs          tmpfs     3.9G   93M  3.9G   3% /dev/shm
tmpfs          tmpfs     3.9G  1.5M  3.9G   1% /run
tmpfs          tmpfs     3.9G     0  3.9G   0% /sys/fs/cgroup
/dev/sda2      ext4      110G   60G   45G  58% /
tmpfs          tmpfs     3.9G   76K  3.9G   1% /tmp
/dev/sdb1      ext4       74G  3.4G   67G   5% /2ND-DISK
tmpfs          tmpfs     799M   12K  799M   1% /run/user/42
tmpfs          tmpfs     799M   24K  799M   1% /run/user/1000
/dev/loop0     xfs       190M   98M   92M  52% /sysdocu_test
/dev/loop1     ext4      186M  146M   27M  85% /sysdocu_test2


※ loop device 를 내 마음대로 지정하고 싶은 경우

# mount -o loop=/dev/loop7,offset=32256 215_43_snap.img /sysdocu_test2

혹시 시스템에 /dev/loop7 이름의 loop device 가 없을 경우 아래와 같이 생성해주면 됩니다.

# mknod -m 660 /dev/loop7 b 7 7
(설명)
-m 660 : 권한 (permission) 설정
/dev/loop8 : 생성할 특수 파일명
b : block device                            // 고정
7 : device type(7 is loop device)    // 고정
7 : id                                            // 장치명(파일명)과 id 만 신경써서 바꿔주면 됩니다.
                                                       (장치명 loop 숫자와 동일하게 하면 깔끔)
                                                       # mknod -m 660 /dev/loop8 b 7 8
                                                       # mknod -m 660 /dev/loop9 b 7 9

# ll /dev/loop*
crw-rw---- 1 root disk 10, 237  9월  1 09:28 /dev/loop-control
brw-rw---- 1 root disk  7,   0  9월  1 09:39 /dev/loop0
brw-rw---- 1 root disk  7,   1  9월  1 11:21 /dev/loop1
brw-rw---- 1 root root  7,   7  9월  1 11:31 /dev/loop7

# mount -o loop=/dev/loop7,offset=32256 215_43_snap.img /sysdocu_test2

# df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        3.9G     0  3.9G   0% /dev
tmpfs           3.9G   38M  3.9G   1% /dev/shm
tmpfs           3.9G  1.5M  3.9G   1% /run
tmpfs           3.9G     0  3.9G   0% /sys/fs/cgroup
/dev/sda2       110G   60G   45G  58% /
tmpfs           3.9G   76K  3.9G   1% /tmp
/dev/sdb1        74G  3.4G   67G   5% /2ND-DISK
tmpfs           799M   12K  799M   1% /run/user/42
tmpfs           799M   24K  799M   1% /run/user/1000
/dev/loop0      190M   98M   92M  52% /sysdocu_test
/dev/loop7      186M  146M   27M  85% /sysdocu_test2


반응형

댓글()

[Ceph 에러] [osd-1][ERROR ] RuntimeError: command returned non-zero exit status: 1

리눅스/Ceph|2016. 8. 29. 15:24
반응형

(테스트 환경 : CentOS 7.0 64bit - ceph 10.2.2)

ceph-deploy osd prepare osd-1:sdb 와 같이 prepare 실행시 아래와 같은 에러가 뜰 때가 있습니다.

이전에 사용했던 적이 있는 디스크일 경우 주로 나타나는데, 이때의 해결 방법입니다.



[에러]

[osd-1][ERROR ] RuntimeError: command returned non-zero exit status: 1



[해결]

(osd-1 에서)

# dd if=/dev/zero of=/dev/sdb bs=512 count=1

# reboot


(ceph node 에서)

$ ceph-deploy disk zap osd-1:sdb          // 에러날 경우 한 번 더 반복 수행

$ ceph-deploy osd prepare osd-1:sdb    // 에러날 경우, 위 명령(disk zap)을 다시 수행하고, 본 명령을 수행 (반복)


반응형

댓글()

Ceph 이미지 실 사용 용량 확인

리눅스/Ceph|2016. 8. 26. 12:37
반응형

(형식)

$ rbd diff $POOL/$IMAGE | awk '{ SUM += $2 } END { print SUM/1024/1024/1024 " GB" }'


(사용예)

$ rbd diff sysdocu-pool/vda | awk '{ SUM += $2 } END { print SUM/1024/1024/1024 " GB" }'

0.0104294 GB


SUM 결과가 byte 단위 이므로, 10억 (1024의 3승) 으로 나누어 GB 단위를 붙인 것 입니다.


반응형

댓글()

Ceph osd 서버 교체

리눅스/Ceph|2016. 8. 18. 17:19
반응형

Ceph osd 서버를 교체하려면 서버를 물리적으로 적출하고 새 서버를 넣은 후, 새로 구성해야 합니다.



방법은  1) osd 제거  2) osd 키 제거  3) 서버 재구성  순으로 진행됩니다.



이 문서는 다른 게시글 'Ceph osd 추가 및 제거' 의 내용과 비슷합니다.

여러 문서를 동시에 찾아보기 번거로우므로 다시 적는것이므로 좀 더 간결한 애용만 기술하도록 하겠습니다.



[중요]

고장난 osd 서버의 호스트 명이 osd-1 이더라도, ceph 에서는 순번을 다르게 인식할 수 있어 확인해야 합니다.

- hostname : osd-1

- osd NAME : osd.0



(ceph node 에서)


$ ceph osd tree

ID WEIGHT  TYPE NAME      UP/DOWN REWEIGHT PRIMARY-AFFINITY 

-1 0.00980 root default                                     

-2 0.00490     host osd-1                                   

 0 0.00490         osd.0       up  1.00000          1.00000    // 이것을 교체해 보도록 하겠습니다. (osd.0 확인)

-3 0.00490     host osd-2                                   

 1 0.00490         osd.1       up  1.00000          1.00000 


이제 서버 교체를 위해서 osd.0 서버를 물리적으로 셧다운 합니다.
그리고 아래 명령을 실행 합니다.

$ ceph osd out osd.0


$ ceph osd down osd.0


$ ceph osd rm osd.0


ceph osd crush remove osd.0    // 'ceph osd tree' 명령으로 확인시 osd 가 제대로 제거가 안되고

                                                        DNE 문자가 출력될 경우에만 실행 합니다.


$ ceph auth del osd.0    // 키 삭제하는 부분입니다. 이것을 안하면 새 osd 서버 추가시 osd.2 로 생성됩니다.


이제 새 서버를 부팅합니다.

그리고 아래 명령을 실행 합니다.

osd 추가 방법과 같으며, 이제는 'hostname' 으로 실행한다는것에 주의합니다.


$ ssh-copy-id cephuser@osd-1    // osd-1 에 cephuser 계정이 있다는 전제하에 진행합니다.


$ ceph-deploy install osd-1


$ ceph-deploy admin osd-1


$ ceph-deploy disk zap osd-1:sdb


$ ceph-deploy osd prepare osd-1:sdb


$ ceph-deploy osd activate osd-1:sdb1


여기까지 입니다.


싱크는 자동으로 맞추어 집니다. 새로 추가한 osd-1 서버 서버에서 df -h 명령을 내려보면

osd-2 서버의 사용량 까지 디스크 사용량이 올라가는 것을 볼 수 있습니다. (자동 동기화)


반응형

댓글()

Ceph 10.2.0 설치 on CentOS 7 (jewel 버전)

리눅스/Ceph|2016. 8. 16. 17:25
반응형

# yum -y update


# vi /etc/yum.repos.d/ceph.repo


(centos 7 의 jewel 버전을 설치하기 위해 baseurl 부분을 아래와 같이 정해주었습니다.)


[ceph]

name=Ceph packages for $basearch
baseurl=http://download.ceph.com/rpm-jewel/el7/$basearch
enabled=1
priority=2
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc

[ceph-noarch]
name=Ceph noarch packages
baseurl=http://download.ceph.com/rpm-jewel/el7/noarch
enabled=1
priority=2
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc

[ceph-source]
name=Ceph source packages
baseurl=http://download.ceph.com/rpm-jewel/el7/SRPMS
enabled=0
priority=2
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc



# yum -y install ceph-deploy


# ceph-deploy new ceph    // 로컬 서버 호스트명이 ceph 일 경우


# ceph-deploy install ceph



설치를 마쳤습니다.


ceph 셋팅은 다른 문서를 참고합니다.


우분투에서 jewel 버전 (10.2) 설치 : http://sysdocu.tistory.com/987



반응형

댓글()