Docker를 활용한 AirComix 서버 설치


Synology NAS - Docker를 활용한 AirComix 서버 설치


나스시장의 최강자! 시놀로지!

그동안 저는 DS-215j 모델을 사용해오고 있어서 몰랐는데 새로나온 고사양급 모델들은 요즘 IT인프라에서 가장 핫한 아이템인 Docker를 사용 할 수 있도록 업데이트가 되었더군요! 이번에 신형 NAS로 교체한 기념으로 포스팅 해봅니다.

그 Docker로 무얼 할 수 있는가? 고민하다가 예전 버전에서는 어렵게 아파치 서버를 띄워서 구성했던.. 근데 DSM이 버전업 해버리면서 아파치의 경로가 바뀌어서 서버가 깨져서 내부에서 꼬여버려 사용하지 못했던 슬픈 역사가 있던.. AirComix 서버 설치를 해보려고 합니다. AirComix 서버를 설치하면 막대한 용량의 압축 파일들을 앱에 넣지 않고, 통신망을 사용하여 어디에서든 스트리밍으로 구독이 가능합니다. 그래서 이번엔 아파치가 아닌 Nginx를 가지고 AirComix 서버를 구성해보고자 합니다.


설치과정에 있어서 pagein.net의 글을 많이 참고 했습니다.

설치하면서 제가 답답했던 부분이나 추가적인 부분을 더 포스팅 하려고 합니다.


Nginix PHP 설치


레지스트리를 선택한다음, 검색창에 nginx php 라고 검색을 한 후 나오는 목록에서 richarvey/nginx-php-fpm를 선택합니다.

더블 클릭하면 설치할 버전을 물어봅니다.

이미지에 richarvey/nginx-php-fpm:lastest 라고 생성 되는데, 다운이 완료 되면 304MB 용량 표시가 뜨고, 실행 버튼이 활성화 됩니다.

실행을 누르면 컨테이너 생성을 할 수 있습니다.

컨테이너 이름에 저는 aircomix-server 라고 넣었습니다. 원하는 이름으로 서버를 생성하시면 됩니다.

고급 설정을 누르면

자동 재시작 활성화에 체크 해주시고

볼륨 탭에서 폴더 추가를 해줍니다.

파일/폴더 있는 곳은 실제 NAS에 만화책들의 압축파일이 있는 경로를 지정해주시고, 마운트 경로는 Docker에 올라간 컨테이너 내에서 실제 책이 있는 경로가 마운트 되어 표현되어지는 경로입니다.

이게 무슨 소리냐? 하실 수도 있는데, 쉽게 말하자면,

만약에 실제 NAS의 /volume2/coimx 경로에 책 파일 있습니다. 하지만 docker로 컨테이너가 구성 되면 나스 안에 새로운 OS가 생성된것 같이 보이는데, 그안에는 실제 경로인 /volume2/coimx는 보이지 않고, 그 볼륨 구성안에서 /volume1/books 라는 경로로 실제 NAS의 경로가 연결된다는 뜻입니다. (실제 /volume2/comix => 컨테이너 /volume1/books) 윈도우의 바로가기나 리눅스의 ln 링크처럼 말이죠. 저는 만화책 뿐만 아니라 다른 책들도 같이 넣을것이기 때문에 books라고 지정 했습니다. 마운트에 volume1은 바꾸지 마세요.

포트 설정입니다. 다른 포트 다 지우셔도 상관 없습니다.

자동으로 되어 있는 로컬 포트도 31257로 고정하고, 컨테이너 포트도 31257로 설정해 줍니다. TCP, UDP 다 설정 해줍니다.

그러면 비디오 형식에 다음과 같이 컨테이너가 실행되고 있음을 확인 할 수 있습니다.

세부사항을 누르고, 터미널 탭으로 가서 생성을 누르면 bash 쉘이 뜹니다.

pwd를 치면 컨테이너 안에서 현재 경로가 보이는데, /var/www/html 이 곳이 nginx의 웹을 구동하기 위해 파일을 넣어두는 디렉토리입니다. 이 곳에서 github에 있는 AirComix 파일을 내려받습니다.

bash-4.4# wget https://github.com/song31/comix-server/archive/master.tar.gz

그리고 다운로드가 완료 되면 압축을 풉니다.

bash-4.4# tar -zxvf master.tar.gz

압축을 풀면 /var/www/html/ 아래에 comix-server-master 라는 디렉토리가 생성됩니다.

bash-4.4# cd comix-server-master

comix-server-master 디렉토리에 가서 몇가지 설정파일을 편집 해줍니다.

우선 index.php를 수정해줍니다.

기본 값은 manga 라고 되어 있는데, 아까 위에서 /volume1/books로 지정했던 부분의 books를 넣어줍니다. 만약 /volume1/comics 로 지정 했다면 comics를 넣으면 됩니다.

그 다음에 /etc/nginx/sites-enabled 로 이동을 합니다.

bash-4.4# cd /etc/nginx/sites-enabled

이 곳에다 aircomix-server.conf 파일을 만들어 줄것인데, 아래 명령으로 설정 파일을 받아 압축을 풀어도 되고,

bash-4.4# wget https://pagein.net/wp-content/uploads/2018/01/aircomix-server.tar.gz

아니면 vi 로 직접 생성해줘도 됩니다.

bash-4.4# vi aircomix-server.conf

아래와 같이 설정 해줍니다.

server {
    listen 31257;
    server_name 192.168.xxx.xxx;
    charset UTF-8;
    root /var/www/html/comix-server-master;
    location / {
        autoindex on;
        index index.php;
        #auth_basic "Restricted Access";
        #auth_basic_user_file /var/www/html/comix-server-master/.htpasswd;
    }
    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
    location ~ ^/manga(.*)$ {
        include fastcgi_params;
        fastcgi_pass unix:/var/run/php-fpm.sock;
        fastcgi_param SCRIPT_FILENAME /var/www/html/comix-server-master/handler.php;
    }
}

NAS-IP에는 실제 시놀로지 NAS가 공유기에서 받은 IP를 넣어주는 겁니다.

편집이 끝났으면 저장. (vi 편집기 사용에 관한 부분은 다른 사이트를 참고하셔서 알아두시는 편이 좋습니다.)

그리고 비디오 형식에 작업 버튼에 다시 시작을 누르거나 오른버튼을 클릭해서 다시 시작을 하거나 오른쪽 버튼을 클릭해서 껐다 키거나 해서 컨테이너를 재시작 해주면 실행이 됩니다.


웹 브라우저를 열고 http://NAS IP:31257 쳐서 books 라고 나오면 성공한겁니다.

제어판에 외부엑세스에서 DDNS 서비스를 이용하고 계시다면 http://해당 도메인:31257 으로 외부에서도 접속이 가능한데, 이건 공유기에서 DMZ 설정이나 포트포워딩 설정이 NAS로 연결되어 있어야지만 가능한 겁니다. 구글에서 포트포워딩 혹은 공유기 DMZ설정을 찾아보세요. 공유기 제조사 마다 설정 방법이 모두 다릅니다.


AirComix 암호설정하기


코믹스 서버 디렉토리로 이동합니다.

bash-4.4# cd /var/www/html/comix-server-master

여기에서 .htpasswd 파일을 생성합니다.

bash-4.4# printf "AirComix:$(openssl passwd -crypt 패스워드)\n" >> .htpasswd
bash-4.4# chown nginx:nginx .htpasswd
bash-4.4# chmod 640 .htpasswd

그리고 다시 aircomix-server.conf 파일을 수정합니다.

bash-4.4# vi /etc/nginx/sites-enabled/aircomix-server.conf

주석(#)처리된 부분을 지워주고 저장.

이렇게 하면 앱에서 AirComix 서버로 접속하기 위해서는 반드시 패스워드가 필요합니다.

설정 완료!

'Operating System > Synology NAS' 카테고리의 다른 글

Docker를 활용한 AirComix 서버 설치  (2) 2019.01.29
  1. 맨 끝에 주석(#) 있는 부분을 지우고 저장 하라 했는데 어디를 지워야 하는건가요?? 동그란 원에 있는 auth로 된 곳 2줄 다 지웠는데 암호 설정이 안됐고, 그냥 암호 없이 들어가지네요,

오픈스택 수동 설치 실습 #.14


오픈스택 수동 설치 실습 #.14 - Cinder block storage 서비스 설치


Cinder - LVM을 이용한 스토리지 노드 구성

오픈스택 블록 스토리지(Cinder)는 오픈스택 컴퓨트 인스턴스에 사용할 지속적인 블록 레벨 스토리지 장치들을 제공합니다. 블록 스토리지 시스템은 블록 장치들을 서버에 작성, 부착, 제거하는 일을 관리하며, 블록 스토리지 볼륨들은 클라우드 사용자들이 자신만의 스토리지의 필요한 부분을 관리하기 위한 대시보드 및 오픈스택 컴퓨트와 완전히 연동됩니다. 로컬 리눅스 서버 스토리지뿐 아니라 Ceph, 클라우드바이트, Coraid, EMC(ScaleIO, VMAX, VNX and XtremIO), GlusterFS, 히타치 데이터 시스템, IBM 스토리지(IBM DS8000, Storwize 계열, SAN 볼륨 컨트롤러, XIV 스토리지 시스템, GPFS), 리눅스 LIO, 넷앱, 넥센타, 님블 스토리지, Scality, 솔리드파이어, HP (스토어버추얼, 3PAR 스토어서브 계열), 퓨어 스토리지를 포함한 스토리지 플랫폼들을 사용합니다. 블록 스토리지는 데이터베이스 스토리지, 확장 가능 파일 시스템과 같은 성능에 민감한 시나리오에 적절하며, 서버에 로우 블록 레벨 스토리지에 대한 접근을 제공합니다. 스냅샷 관리는 블록 스토리지 볼륨에 저장된 데이터를 백업하는 강력한 기능을 제공하며, 스냅샷들은 새로운 블록 스토리지 볼륨들을 만들기 위해 사용하거나 복원할 수 있습니다.


Controller 노드 설치

# su - postgres
$ psql
postgres=# create role cinder with login;
postgres=# create database cinder;
postgres=# grant ALL PRIVILEGES ON DATABASE cinder TO cinder;
postgres=# alter user cinder with encrypted password 'cinder';

# . admin-openrc


cinder 유저 생성 및 admin 권한 추가

# openstack user create --domain default --password-prompt cinder
# openstack role add --project service --user cinder admin
cinderv2 와 cinderv3 서비스 생성
# openstack service create --name cinderv2 \
  --description "OpenStack Block Storage" volumev2
 
# openstack service create --name cinderv3 \
  --description "OpenStack Block Storage" volumev3
endpoint 생성
# openstack endpoint create --region RegionOne \
  volumev2 public http://controller:8776/v2/%\(project_id\)s
 
# openstack endpoint create --region RegionOne \
  volumev2 internal http://controller:8776/v2/%\(project_id\)s
 
# openstack endpoint create --region RegionOne \
  volumev2 admin http://controller:8776/v2/%\(project_id\)s
 
# openstack endpoint create --region RegionOne \
  volumev3 public http://controller:8776/v3/%\(project_id\)s
 
# openstack endpoint create --region RegionOne \
  volumev3 internal http://controller:8776/v3/%\(project_id\)s
 
# openstack endpoint create --region RegionOne \
  volumev3 admin http://controller:8776/v3/%\(project_id\)s
cinder 패키지 설치
# yum -y install openstack-cinder 
cinder.conf 파일 수정
# vi /etc/cinder/cinder.conf 
[database]
connection = postgresql://cinder:cinder@controller/cinder

[DEFAULT]
transport_url = rabbit://openstack:RABBIT_PASS@controller
auth_strategy = keystone
my_ip = 10.0.0.11
enable_v3_api = True

[keystone_authtoken]
auth_uri = http://controller:5000
auth_url = http://controller:5000
memcached_servers = controller:11211
auth_type = password
project_domain_id = default
user_domain_id = default
project_name = service
username = cinder
password = CINDER_PASS

[oslo_concurrency]
lock_path = /var/lib/cinder/tmp
블록 스토리지 데이터베이스 배포

# su -s /bin/sh -c "cinder-manage db sync" cinder
Compute 노드에서

nova.conf 파일수정
# vi /etc/nova/nova.conf
[cinder]
os_region_name = RegionOne
nova 서비스 재시작

# systemctl restart openstack-nova-api.service

다시 Controller 노드에서

keystone에 Volume API 버전 추가
# echo "export OS_VOLUME_API_VERSION=3" >> ~/admin-openrc
cinder 서비스 등록 및 시작
# systemctl enable openstack-cinder-api.service openstack-cinder-scheduler.service
# systemctl start openstack-cinder-api.service openstack-cinder-scheduler.service



Storage 노드 설치 (LVM 이용)


storage 노드는 다양한 스토리지로 설치가 가능하지만 VM환경에서는 LVM으로 진행을 합니다.


필요 패키지 설치

# yum -y install centos-release-openstack-rocky
# yum -y upgrade
# yum -y install python-openstackclient
# yum -y install openstack-selinux
# yum -y install python-psycopg2
lvm 패키지 설치
# yum install lvm2 device-mapper-persistent-data

lvm 서비스 등록 및 시작

# systemctl enable lvm2-lvmetad.service
# systemctl start lvm2-lvmetad.service

pv 볼륨 설정

# pvcreate /dev/sdb

Physical volume "/dev/sdb" successfully created

vg 볼륨 설정

# vgcreate cinder-volumes /dev/sdb

Volume group "cinder-volumes" successfully created

lvm.conf 수정

# vi /etc/lvm/lvm.conf
devices {
...
filter = [ "a/sdb/", "r/.*/"]

cinder 패키지 설치
# yum -y install openstack-cinder targetcli python-keystone python2-crypto

cinder.conf 파일 수정

# vi /etc/cinder/cinder.conf
[database]
connection = postgresql://cinder:cinder@controller/cinder

[DEFAULT]
transport_url = rabbit://openstack:RABBIT_PASS@controller
auth_strategy = keystone
my_ip = 10.0.0.41
enabled_backends = lvm

glance_api_servers = http://controller:9292

enable_v3_api = True


[keystone_authtoken]
auth_uri = http://controller:5000
auth_url = http://controller:5000
memcached_servers = controller:11211
auth_type = password
project_domain_id = default
user_domain_id = default
project_name = service
username = cinder
password = CINDER_PASS

[lvm]
volume_driver = cinder.volume.drivers.lvm.LVMVolumeDriver
volume_group = cinder-volumes
iscsi_protocol = iscsi

iscsi_helper = lioadm

target_ip_address = 10.0.0.41
volumes_dir = $state_path/volumes


[oslo_concurrency]
lock_path = /var/lib/cinder/tmp

※ [lvm] 부분은 없으니 만들어 줍니다.

cinder 서비스 등록 및 시작

# systemctl enable openstack-cinder-volume.service target.service
# systemctl start openstack-cinder-volume.service target.service
controller 노드에서 서비스 확인


볼륨 설정이 완료 되었습니다.

Cinder 까지 설치가 완료되어 코어 부분은 다 설치가 완료 되었습니다.


PostgreSQL 시간 조회



현재 시간 조회
 postgres=# select now();
현재 타임존 조회
 postgres=# show timezone;
타임존 변경 방법
 postgres=# SET TIME ZONE 'Asia/Seoul';
시스템 일자
 postgres=# select current_date, current_time, timeofday();
postgres=# select now(), current_timestamp, timestamp 'now';
년도 추출
 postgres=# select date_part('year', current_timestamp);
월 추출
 postgres=# select date_part('month', current_timestamp);
일 추출
 postgres=# select date_part('day', current_timestamp);
분 추출
postgres=# select date_part('minute', current_timestamp);
초 추출
 postgres=# select date_part('second', current_timestamp);
요일/일차 추출
 postgres=# select extract('dow' from timestamp '2013-07-30 20:38:40');    -- 일요일(0), 토요일(6)
result: 5
 postgres=# select extract('isodow' from timestamp '2013-07-30 20:38:40'); -- 월요일(1), 일요일(7)
result: 5
 postgres=# select extract('doy' from timestamp '2013-07-30 20:38:40');


오픈스택 수동 설치 실습 #.13



오픈스택 수동 설치 실습 #.13 - Horizon 대시보드 설치


Horizon 대시보드 설치


오픈스택 대시보드(Horizon)는 관리자와 사용자들에게 클라우드 기반 자원 배치의 접근, 제공, 자동화를 위한 그래픽 인터페이스를 제공합니다. 과금, 모니터링, 추가 관리 도구와 같은 서드파티 제품과 서비스들을 수용합니다. 대시보드는 또한 이용하기 원하는 서비스 제공자 및 기타 상용 벤더들을 위해 브랜드화가 가능하며, 대시보드는 사용자들이 오픈스택 자원들과 상호작용할 수 있는 여러 방법 가운데 하나입니다. 개발자들은 네이티브 오픈스택 API나 EC2 호환 API를 사용하여 자원을 관리하기 위해 액세스를 자동화하거나 도구를 빌드할 수 있습니다.



Horizon 대시보드 패키지 설치

# yum -y install openstack-dashboard

local_setting 파일 수정

# vi /etc/openstack-dashboard/local_settings
# 대시보드 호스트를 추가합니다.
ALLOWED_HOSTS = ['*']

# 오픈스택 API의 버전들을 설정 합니다.
OPENSTACK_API_VERSIONS = {
#    "data-processing": 1.1,
    "identity": 3,
    "image": 2,
    "volume": 2,
}

# 오픈스택의 멀티 도메인을 사용가능하게 합니다.
OPENSTACK_KEYSTONE_MULTIDOMAIN_SUPPORT = True

# Keystone의 기본 도메인을 'Default'로 설정합니다.
OPENSTACK_KEYSTONE_DEFAULT_DOMAIN = 'Default'


# SESSION_ENGINE을 설정합니다.
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'

# Memcached 정보를 설정합니다.
CACHES = {
    'default': {
         'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
         'LOCATION': 'controller:11211',
    }
}


# 오픈스택 대시보드를 실행할 컨트롤러 노드의 관리용 IP를 OPENSTACK_HOST에 설정합니다.
OPENSTACK_HOST = "controller"

# 오픈스택의 Keystone URL을 설정합니다.
OPENSTACK_KEYSTONE_URL = "http://%s:5000/v3" % OPENSTACK_HOST

# 오픈스택의 Keystone 기본권한을 설정합니다.
OPENSTACK_KEYSTONE_DEFAULT_ROLE = "_member_"

# Provider 네트워크를 선택하여 linuxbridge를 이용한다면 l3 네트워킹 서비스 지원을 사용안함으로 설정합니다.
OPENSTACK_NEUTRON_NETWORK = {
    ...
    'enable_router': False,
    'enable_quotas': False,
    'enable_distributed_router': False,
    'enable_ha_router': False,
    'enable_lb': False,
    'enable_firewall': False,
    'enable_vpn': False,
    'enable_fip_topology_check': False,
}

# 타임존을 설정합니다.
TIME_ZONE = "Asia/Seoul"

openstack-dashboard.conf 파일 수정

# vi /etc/httpd/conf.d/openstack-dashboard.conf 
WSGIDaemonProcess dashboard
WSGIProcessGroup dashboard
WSGISocketPrefix run/wsgi
WSGIApplicationGroup %{GLOBAL}

Httpd 재시작

# systemctl restart httpd.service memcached.service

인터넷 브라우저에서 http://10.0.0.11/dashboard 로 접속하면 로그인 화면이 뜹니다.

admin 계정으로 로그인을 해보면,

개요 화면이 보이고, 내부 정보가 보입니다.

이러면 설치가 완료된 것입니다.



오픈스택 수동 설치 실습 #.12

오픈스택 수동 설치 실습 #.12 - Neutron 네트워크 설치 :



Linux Bridge를 이용한 Provider 네트워크 구성

Compute 노드


Neutron 패키지 설치

# yum -y install openstack-neutron-linuxbridge ebtables ipset
neutron.conf 파일 수정
# vi /etc/neutron/neutron.conf
[DEFAULT]
# ...
transport_url = rabbit://openstack:RABBIT_PASS@controller

[DEFAULT]
# ...
auth_strategy = keystone

[keystone_authtoken]
# ...
www_authenticate_uri = http://controller:5000
auth_url = http://controller:5000
memcached_servers = controller:11211
auth_type = password
project_domain_name = Default
user_domain_name = Default
project_name = service
username = neutron
password = NEUTRON_PASS

[oslo_concurrency]
# ...
lock_path = /var/lib/neutron/tmp

linuxbridge_agent.ini 파일 수정

# vi /etc/neutron/plugins/ml2/linuxbridge_agent.ini
[linux_bridge]
physical_interface_mappings = provider:PROVIDER_INTERFACE_NAME

[vxlan]
enable_vxlan = false

[securitygroup]
# ...
enable_security_group = true
firewall_driver = neutron.agent.linux.iptables_firewall.IptablesFirewallDriver
nova.conf
# vi /etc/nova/nova.conf
[neutron]
# ...
url = http://controller:9696
auth_url = http://controller:5000
auth_type = password
project_domain_name = Default
user_domain_name = Default
region_name = RegionOne
project_name = service
username = neutron
password = NEUTRON_PASS

Nova-compute 재시작

# systemctl restart openstack-nova-compute.service
neutron 서비스 설정 및 시작
# systemctl enable neutron-linuxbridge-agent.service
# systemctl start neutron-linuxbridge-agent.service
Neutron 설치가 완료 되었습니다.

Controller 노드에서 확인

Compute 노드에도 Keystone 인증 파일(admin-openrc)을 만들고 openstack network agent list


PostgreSQL 주기적인 유지관리 Vacuuming



주기적인 유지관리 Vacuuming

Vacuum 기초

 - PostgreSQL의 Vacuum 명령은 다음과 같은 이유로 각 테이블마다 정기적으로 프로세스 해야합니다.

 a. 업데이트 또는 삭제된 행이 점유한 디스크 공간의 복구 또는 재사용.
 b. PostgreSQL 쿼리 플래너가 사용하는 데이터 통계 업데이트 (DB통계정보)
 c. 인덱스 전용 스캔 속도를 높이는 가시도 맵(visibility map) 업데이트
 d. 트랜잭션 ID 랩어라운드 또는 multixact ID 랩어라운드에 의한 아주 오래된 데이터가 손실되지 않도록 보호
 
 Vacuum에는 두가지 변이인 표준 Vacuum과 Vacuum Full이 있습니다. Vacuum Full은 디스크 공간을 더 많이 회수하는 대신 실행이 느립니다. 또한, 표준형 Vacuum은 데이터베이스 작업과 병렬로 실행할 수 있습니다. (Vacuum 진행중에 DDL (alter) 명령은 안되나 DML (select,insert,delete,update) 명령은 정상 작동함)
 Vacuum Full 작업은 작업중인 테이블에 대해 배타적 잠금이 필수이므로, 테이블의 다른 작업과 병렬로 사용할 수 없습니다.
 Vacuum은 상당한 I/O 트래픽이 발생되며, 다른 활성 세션의 성능을 저하시키는 원인이 됩니다.
 
1) 디스크 공간 복구

 - PostgreSQL에서 행의 UPDATE 또는 DELETE는 행의 오래된 버전을 즉각 제거하지 않습니다. 이러한 접근법은 MVCC의 장점을 누리기 위한것으로, 다른 트랜잭션에서 계속 확인될 가능성이 있을 경우에는 행 버전을 삭제해서는 안됩니다. 그러나 오래되었거나 삭제된 행 버전은 트랜잭션 대상이 아니기 때문에 Vacuum으로 회수 가능합니다.
 - 표준형 Vacuum은 테이블과 인덱스에서 Deed row 버전을 삭제하고, 나중에 재사용할 수 있도록 가용 공간으로 표시합니다. 하지만 테이블에 쓸수 있는 공간이 있는 경우는 오래된 공간을 반환하지 않습니다.
 - Vacuum Full은 Dead space가 일절 없도록 모든 공간을 반환합며, 테이블을 새버전으로 작성함으로 테이블이 최소화되지만, 시간이 오래걸리는 단점이 있습니다.
 - 일상적인 Vacuuming의 목표는 Vacuum Full이 불필요 하도록 표준형 Vacuum을 충분히 실행하는 것입니다. autovacuum데몬은 이와 같은 방식을 작동 되며, 사실상 Vacuum Full을 절대 수행하지 않습니다.
 
2) 실행 계획 통계 업데이트

 - PostgreSQL 쿼리 플래너는 쿼리에 대해 괜찮은 플랜을 생성하기 위해, 테이블 내용에 대한 통계정보에 의존합니다. 이러한 통계는 자체적으로 호출하거나 Vacuum에서 옵션으로 처리하거나 ANALYZE 명령으로 생성됩니다.
 - autovacuum 데몬이 활성화 되면 테이블 내용이 바뀔때마다 ANALYZE 명령이 자동으로 실행됩니다. 업데이트가 빈번하더라도, 데이터의 통계적 분포가 많이 바뀌지 않을때는 통계를 업데이트를 할 필요가 없습니다.

3) visibility map 업데이트

 - Vacuum은 모든 활성 트랜잭션에 보이는 것으로 알려진 튜플만 포함된 페이지를 추적하기 위하여 각 테이블에 대한 visibility map을 관리합니다.
 - 첫번째 목적은 Vacuum 자체는 cleanup 할 것이 없으므로 다음 실행에서 해당 페이지를 스킵합니다.
 - 두번째 목적은 기저 테이블을 참조하지 않고 인덱스만 이용하여 PostgreSQL이 일부 쿼리에 응답할 수 있게 합니다. 테이블을 참조 하지 않고 인덱스만 스캔하는 경우 visibility map을 먼저 확인하기 때문에 페이지에 튜플이 보이는 경우 heep fetch를 스킵할 수 있습니다. 거대 데이터 세트에서는 visibility map이 디스크 액세스를 막을 수 있는 가장 확실한 방법입니다. visibility map은 heep 보다 훨씬 작기때문에 heep이 매우 클 경우에도 쉽게 캐쉬 됩니다.

4) 트랜잭션 ID 랩어라운드 실패 방지

 - PostgreSQL의 MVCC 트랜잭션 시멘틱은 트랜잭션 ID(XID) 번호의 비교 가능 여부에 달려있습니다. 트랜잭션 ID의 크기는 제한되어 있으므로(32비트) 장시간 (40억 트랜잭션 이상) 동안 실행되는 클러스터는 트랜잭션 ID 랩어라운드가 발생합니다. XID 카운트가 0으로 랩어라운드 되고 과거에 있었던 모든 트랜잭션이 미래에 나타나게 됩니다. 즉 데이터의 소실이 발생합니다. 이 것을 피하려면 피하려면 20억 트랜잭션마다 모든 데이터베이스의 모든 케이블을 Vacuum해야 합니다.
 - 주기적으로 Vacuuming으로 문제가 해결되는 이유는 이 행이 과거에 커밋된 트랜잭션에 의해 삽입되었고 삽입 트랜잭션의 결과로 MVCC 관점으로 부터 현재와 미래 트랜잭션에서 모두 보이는 것이 확실하도록 Vacuum이 행에 동결 표시를 한다는 것입니다.
 
5) Multixact 및 랩어라운드

 - Multixact ID는 복수 트랜잭션에 의한 행 잠금을 지원할 때 사용됩니다.
 - Vacuum 테이블 스캔 중에, 테이블 부분적으로 또는 전체적으로 vacuum_multixact_freeze_min_age보다 오래된 multixact ID는 서로 다른 값으로 교체되는데, 이 값은 0, 단일 트랜잭션ID 또는 신규 multixact ID일 수 있습니다. 테이블 별로 pg_class.relminmxid는 해당 테이블에 계속 나타날 가능성이 있고 가장 오래된 multixact ID를 저장합니다. 이 값이 vacuum_multixact_freeze_min_age보다 오래된 경우 전체 테이블 스캔이 강제됩니다.
 - 전체 테이블 Vacuum 스캔은 사용된 멤버 저장소 공간이 할당된 저장소 공간의 50%를 초과 할 경우 multixact 연령이 가장 오래된 것을 시작으로 모든 테이블에 대해 순처적으로 일어납니다.
 
6) Autovacuum 데몬
 
 - Autovacuum 데몬의 목적은 Vacuum과 ANALYZE 명령의 실행을 자동화하는 것입니다.
 - autovacuum이 활성화 되면 다수의 튜플이 삽입, 업데이트 또는 삭제된 테이블을 검사합니다. 이 검사는 통계 수집 기능을 사용합니다. 따라서 track_counts가 true로 설정되지 않으면 사용할 수 없습니다.
 

오픈스택 수동 설치 실습 #.11

오픈스택 수동 설치 실습 #.11 - Neutron 네트워크 설치 :



Linux Bridge를 이용한 Provider 네트워크 구성


Controller 노드



OpenStack 네트워킹 (neutron)은 가상 네트워킹 인프라 (VNI)에 대한 모든 네트워킹 측면과 OpenStack 환경에서 물리 네트워킹 인프라 (PNI)의 접근 레이어 측면에서 관리합니다. OpenStack 네트워킹은 firewall, load balancer, virtual private network (VPN) 같은 서비스를 포함할수 있으며, 진보한 가상 네트워크 토폴리지를 생성하여 tenant를 활성화 합니다.


네트워킹에서는 객체 추상화를 통해 네트워크, 서브넷, 라우터를 제공합니다. 각 추상화는 물리적인 구성에 대응하여 모방하는 기능이 들어있습니다: 네트워크는 서브넷이 포함되어 있고, 다른 서브넷과 네트워크 간의 트레픽은 라이터를 통하여 나눠집니다.


각 라우터는 네트워크에 연결하는 하나의 게이트웨이를 갖고, 많은 인터페이스들이 서브넷에 연결됩니다. 서브넷은 같은 라우터 내에 연결된 다른 서브넷 상의 머신에 액세스 가능합니다.


임의로 주어진 네트워킹 셋업은 하나 이상의 외부 네트워크를 갖습니다. 다른 네트워크와 달리, 외부 네트워크는 단지 가상으로 정의된 네트워크를 의미하지 않습니다. 이 대신, OpenStack 설치 바깥으로 접근 가능한 뷰의 물리, 외부 네트워크에 대한 슬라이스를 나타냅니다. 외부 네트워크의 IP 주소는 바깥 네트워크 상의 임의의 물리적인 객체에서 액세스 가능합니다. 외부 네트워크가 바깥 네트워크로의 뷰를 나타내기에, DHCP가 해당 네트워크에서는 비활성화됩니다.


외부 네트워크 뿐만 아니라, 임의의 네트워킹 셋업은 하나 이상의 내부 네트워크를 갖습니다. 이러한 소프트웨어 정의 네트워크들은 VM에 직접 연결됩니다. 임의의 주어진 내부 네트워크, 또는 인터페이스를 통해 비슷한 라우터에 연결된 서브넷 상의 VM에서만 대상 네트워크에 직접 연결된 VM에 액세스 가능합니다.


외부 네트워크에서 VM에 접근하거나, 그 반대의 경우에도 네트워크 사이의 라우터가 필요합니다. 각 라우터는 네트워크에 연결된 하나의 게이트웨이와 많은 인터페이스에 연결된 서브넷으로 되어있습니다. 물리적 라우터와 같이 동일한 라우터에 연결된 다른 서브넷의 머신에 접근할 수 있고, 머신에서 라우터의 게이트웨이를 통하여 외부 네트워크에 접근할 수 있습니다.


또한, 외부 네트워크를 내부 네트워크와 연결하도록 IP 주소를 할당할 수 있습니다. 하위 네트워크에 어떤 포트가 연결되든 이 연결을 포트라고 합니다. 외부 네트워크 IP 주소를 가상 머신에 포트와 할당할 수 있습니다. 이 방법을 통해 외부 네트워크의 실체가 가상 머신에 접근할 수 있습니다.


네트워킹은 시큐리티 그룹 을 지원합니다. 시큐리티 그룹은 그룹내에서 방화벽 규칙을 정의하여 관리자를 활성화합니다. VM은 하나에서 여러 시큐리티 그룹을 가질 수 있으며, 시큐리티 그룹에서 포트를 막거나 열고, 포트 범위, VM에 대한 트래픽 타입 등의 규칙을 적용할 수 있습니다.


네트워킹에서 사용하는 각 플러그인은 각자의 개념을 갖고 있습니다. VNI 및 OpenStack 환경을 운영하는데 필수는 아니지만, 이러한 개념에 대한 이해는 네트워킹 셋업을 도와줍니다. 모든 네트워킹 설치는 코어 플러그인과 보안 그룹 플러그인 (또는 단순히 No-Op 보안 그룹 플러그인)을 사용합니다. 부가적으로, Firewall-as-a-Service (FWaaS) 및 Load-Balancer-as-a-Service (LBaaS)이 사용 가능합니다.



Neutron 설치 : Controller 노드

# su - postgres

$ psql

Neutron 데이터베이스 생성

postgres=# create role neutron with login;

postgres=# create database neutron;

postgres=# grant ALL PRIVILEGES ON DATABASE neutron TO neutron;

postgres=# alter user neutron with encrypted password 'neutron';

Keystone 인증 불러오기

# . admin-openrc

Neutron 계정 생성 및 admin 권한 부여

# openstack user create --domain Default --password-prompt neutron

# openstack role add --project service --user neutron admin


Neutron 서비스 생성

# openstack service create --name neutron \

  --description "OpenStack Networking" network

# export controller=10.0.0.11 

Neutron 엔드포인트 생성 

# openstack endpoint create --region RegionOne \

  network public http://controller:9696


# openstack endpoint create --region RegionOne \

  network internal http://controller:9696


# openstack endpoint create --region RegionOne \

  network admin http://controller:9696


Neutron 패키지 설치

# yum install openstack-neutron openstack-neutron-ml2 \

  openstack-neutron-linuxbridge ebtables

neutron.conf 파일 수정

# vi /etc/neutron/neutron.conf

[DEFAULT]

# ...

transport_url = rabbit://openstack:open1234@controller

auth_strategy = keystone


[keystone_authtoken]

# ...

www_authenticate_uri = http://controller:5000

auth_url = http://controller:5000

memcached_servers = controller:11211

auth_type = password

project_domain_name = default

user_domain_name = default

project_name = service

username = neutron

password = open1234


[oslo_concurrency]

# ...

lock_path = /var/lib/neutron/tmp

linuxbridge-agent.ini 수정

# vi /etc/neutron/plugins/ml2/linuxbridge_agent.ini

[linux_bridge]

physical_interface_mappings = provider:ens33 <-- bridge로 설정했던 공유기에서 ip받아오는 NIC


[vxlan]

enable_vxlan = false


[securitygroup]

# ...

enable_security_group = true

firewall_driver = neutron.agent.linux.iptables_firewall.IptablesFirewallDriver

nova.conf 수정

# vi /etc/nova/nova.conf

[neutron]

# ...

url = http://controller:9696

auth_url = http://controller:5000

auth_type = password

project_domain_name = Default

user_domain_name = Default

region_name = RegionOne

project_name = service

username = neutron

password = open1234

ml2-conf.ini 링크

# ln -s /etc/neutron/plugins/ml2/ml2_conf.ini /etc/neutron/plugin.ini

Neutron DB Sync

# su -s /bin/sh -c "neutron-db-manage --config-file /etc/neutron/neutron.conf \

  --config-file /etc/neutron/plugins/ml2/ml2_conf.ini upgrade head" neutron

Nova 재시작

# systemctl restart openstack-nova-api.service

Neutron 서비스 등록 및 시작

# systemctl enable neutron-server.service \

  neutron-linuxbridge-agent.service neutron-dhcp-agent.service \

  neutron-metadata-agent.service

# systemctl start neutron-server.service \

  neutron-linuxbridge-agent.service neutron-dhcp-agent.service \

  neutron-metadata-agent.service

L3 에이전트 서비스 등록 및 시작

# systemctl enable neutron-l3-agent.service

# systemctl start neutron-l3-agent.service


확인 (DHCP나 Metadata 에이전트가 올라오는데 약간의 시간이 소요되니 잠깐 기다리면 올라옵니다.)



 

오픈스택 수동 설치 실습 #.10


오픈스택 수동 설치 실습 #.10 - Compute 노드에 Nova 설치



노바 패키지 설치

# yum -y install openstack-nova-compute

nova.conf 파일 수정

# vi /etc/nova/nova.conf

[DEFAULT] # define own IP address my_ip = 10.0.0.31 state_path = /var/lib/nova enabled_apis = osapi_compute,metadata log_dir = /var/log/nova # RabbitMQ connection info transport_url = rabbit://openstack:open1234@10.0.0.11 [api] auth_strategy = keystone # enable VNC [vnc] enabled = True server_listen = 0.0.0.0 server_proxyclient_address = 10.0.0.31 novncproxy_base_url = http://10.0.0.11:6080/vnc_auto.html # Glance connection info [glance] api_servers = http://10.0.0.11:9292 [oslo_concurrency] lock_path = $state_path/tmp # Keystone auth info [keystone_authtoken] www_authenticate_uri = http://10.0.0.11:5000 auth_url = http://10.0.0.11:5000/v3 memcached_servers = 10.0.0.11:11211 auth_type = password project_domain_name = Default user_domain_name = Default project_name = service username = nova password = NOVA_PASS [placement] auth_url = http://10.0.0.11:5000/v3 os_region_name = RegionOne auth_type = password project_domain_name = Default user_domain_name = Default project_name = service username = placement password = PLACEMENT_PASS [wsgi] api_paste_config = /etc/nova/api-paste.ini

nova.conf에 libvirt 라는 항목이 있습니다.


$ egrep -c '(vmx|svm)' /proc/cpuinfo


해당 명령을 실행 했을때, 0 (Zero)가 나온다면, qemu로 설정을 해줘야 합니다.

1 or 더 큰수가 나올 경우에는 다른 하이퍼바이저를 사용 할 수 있습니다. vm환경에다 설치할 경우 0 (Zero)가 나올겁니다.

[libvirt]

# ...

virt_type = qemu

※ Nova compute 서비스가 실패 하는 경우 /var/log/nova/nova-compute.log 를 체크 했을때, AMQP server on controller:5672 is unreachable 이 나온다면 방화벽 같은 항목에서 5672 포트가 막혀있는 것이니 확인 해주세요.




Nova 서비스 생성 및 자동실행 등록

# systemctl start openstack-nova-compute

# systemctl enable openstack-nova-compute


아래 항목은 Controller 노드에서 확인합니다.

$ . admin-openrc

Compute Host 찾기

# su -s /bin/bash nova -c "nova-manage cell_v2 discover_hosts"


compute 노드 설치가 완료 되었습니다.