The Pursuit of Happyness

반응형

SSH 서버에 접속할 때, 비밀번호 입력 모드가 매우 늦게 뜨거나, 입력 후에도 로그인까지 상당히 오랜 시간이 걸리는 경우가 있습니다.

(30초에서 2분정도 걸리는 경우도 있다고 하네요..)


원인을 파악하기 위해서 ssh 접속시 "-vvv" 옵션을 추가하면 ssh 접속을 위해서 주고 받는 정보들이 자세히 나오게 됩니다.

내용을 살펴보면 ssh 접속이 느린 이유가 나오는데요, 대표적인 케이스 두 가지에 대한 해결책을 정리해 보았습니다.


1. GSSAPI 인증문제

SSH 로그인 시에 SSH 클라이언트는 몇 가지 인증 과정을 거치는데요, 그 중에 GSSAPI 인증이라는 단계가 있습니다. 이 과정은 SSH 서버가 GSSAPI 서버에 접속해서 클라이언트의 유효성을 인증받는 과정이 들어가 있는데, 이 과정이 실패할 때 SSH 세션이 시작되는 것이 상당히 지연되기도 합니다. 

해결책은 SSH 설정에서 GSSAPI 인증을 사용하지 않게 해 주는 것입니다.

SSH 설정 파일을 열어서 GSSAPIAuthentication 을 검색합니다.


$ vi /etc/ssh/sshd_config 


해당 항목의 값을 "no" 로 설정합니다.


GSSAPIAuthentication no

 

SSH 서버를 재시작 합니다.


$ systemctl restart sshd


2. 역방향 DNS 조회 문제

SSH 접속이 느려지는 다른 문제로는 역방향 DNS 조희 입니다. SSH 서버가 클라이언트로부터 로그인 요청을 받으면, 서버는 보안상의 이유로 클라이언트의 IP에 대해서 역방향 DNS를 조회합니다. 만약 역방향 조회가 실패하면 timeout 시간 만큼 접속이 늦어집니다.


역방향 DNS 조회 기능을 사용하지 않게 해주기 위해서 설정 파일을 엽니다.


$ vi /etc/ssh/sshd_config 


UseDNS 라는 항목을 검색해서 아래와 같이 해당 항목의 값을 "no"로 설정합니다.


UseDNS no


참고로 제가 설치한 CentOS에서는 "UseDNS yes" 가 주석처리 되어 있었는데, 주석을 풀고 값을 no로 설정했을 때 문제가 해결되었습니다.


SSH 서버를 재시작 합니다.


$ systemctl restart sshd






반응형

반응형

실제 MySQL을 운영할 때는 replication을 많이 구성하게 됩니다.

Replication 은 목적에 따라 다양한 형태로 구성될 수 있는데, 여기서는 기본적인 Master - Slave 구조를 설정해 보겠습니다.

MySQL의 복제 방식은 Master서버에서 bin_log 를 생성한 후에 Slave 서버가 bin_log 내용을 받아와서 query를 재생하는 방식으로 처리됩니다.


0. Master - Slave Replication 구성을 위해서 DB 로 사용할 서버를 두 대 준비합니다.

편의상 Master 서버의 Private IP 는 10.0.0.51, Slave 서버의 Private IP는 10.0.0.61 이라고 하겠습니다.


1. [Master] 먼저 Master 서버의 my.cnf 설정에 다음의 내용을 추가하여 bin 로그를 활성화 합니다.


[mysqld]

log-bin=mysql-bin

server-id=51


log-bin 에는 bin 로그가 생성될 파일 이름을 지정해 줍니다. 서버의 default 값을 사용하고 싶다면 "log-bin" 이라고만 적어줘도 됩니다.

그리고 server-id는 replication 구성 내에서 unique 한 값을 적어줘야 합니다. DB가 많지 않다면 Private IP 마지막 자리를 적어주면 겹치지 않습니다.


그리고 MySQL을 재시작하여 bin 로그가 생성되는지 확인합니다.


# systemctl restart mysqld


bin 로그는 MySQL 데이터베이스 경로에 생성되며 위에서 지정한 파일 명으로 생성됩니다. (mysql-bin.000001, mysql-bin.000002, ...)

또한 mysql-bin.index 라는 파일이 생성되어 bin 로그를 생성한 시점부터의 로그 파일 리스트가 기록됩니다.


2. [Master] Replication 에서 사용할 계정을 생성합니다.

MySQL을 실행해서 Replication 에서 사용할 계정을 아래와 같이 생성합니다.


# GRANT REPLICATION SLAVE ON *.* TO 'repl'@'10.0.0.%' IDENTIFIED BY 'password';


Private IP 대역 10.0.0.x 에 대해 "repl" 이라는 계정으로 비밀번호 "password" 로 replication 을 허용하겠다는 의미 입니다.


3. [Master] Replication 시작 위치를 확인합니다.

Replication 위치를 제대로 맞춰주기 위해서 지금부터 Master DB의 백업이 완료될 때 까지 DB 접속을 차단하는 것이 좋습니다. query가 실행되면 replication 지점이 변경될 수 있습니다.

다음의 명령어로 replication 위치를 확인합니다.


mysql> show master status\G


만약을 대비하여 File 과 Position 값을 기록해 둡니다.


4. [Master] DB를 백업합니다.

# mysqldump --all-databases --master-data -u root -p > dbdump.db

--master-data 라는 옵션을 주게되면 dbdump.db 파일에 replication 지점이 같이 저장됩니다.

Master DB에서의 할일은 끝났습니다. 


5. [Slave] my.cnf에 다음의 내용을 추가합니다.


[mysqld]

server-id=61


slave 서버에서의 데이터 변경 방지를 위해서 read_only 를 추가할 수 있습니다.


[mysqld]

read_only


Slave 에서도 relay 로그 외에 별도의 bin 로그가 필요하다면 log-bin 옵션을 추가해도 됩니다.

MySQL을 재시작하여 설정을 반영 시킵니다.


# systemctl restart mysqld


6. [Slave] DB 리스토어

Master에서 백업한 데이터를 복사해서 restore 합니다.


# mysql -u root -p < dbdump.db


7. [Slave] Slave DB에서 Master DB의 Replication 지점을 설정합니다.


mysql> CHANGE MASTER TO 

        ->      MASTER_HOST='10.0.0.51'

        ->      , MASTER_USER='repl'

        ->      , MASTER_PASSWORD='password'

        ->      , MASTER_LOG_FILE='mysql-bin.000004'

        ->      , MASTER_LOG_POS=120;


MASTER_LOG_FILE 과  MASTER_LOG_POS는 dbdump.db 파일에서 읽어도 되고, 3번에서 기록해 둔 값을 적어줘도 됩니다.

그리고 Slave 를 시작합니다.


mysql> start slave;


Slave DB의 상태를 확인합니다.


mysql> show slave status\G



8. 기타

* MySQL에서의 DB 백업과 리스토어는 데이터베이스를 그대로 이미지 떠서 rsync 시키는 방법을 사용하실 수 있습니다. InnoDB 엔진을 사용하는 경우에는 반드시 MySQL 서비스를 중지시키고 하는 것을 권장하고 그 외의 기본 엔진에 대해서는 서비스 중지 없이 Lock을 걸고 진행할 수 있습니다.


* 하나의 bin 로그 파일이 너무 커지는 것을 막기 위해서 bin 로그 파일 사이즈를 제한할 수 있습니다. 

최소값은 4096이며 최대값은 1073741824 (1GB) 입니다. default 설정은 1073741824 입니다.


[mysqld]

max_binlog_size=1G



* bin 로그가 서버에 무한히 쌓이는 것을 방지하기 위해서 다음의 옵션을 통해서 일정 기간이 지나면 삭제되도록 설정할 수 있습니다.

아래는 7일 (일주일) 이 지난 로그를 삭제하는 옵션입니다. 최대 99일까지 설정이 가능하며 0을 쓰면 삭제하지 않습니다.


[mysqld]

expire_logs_days=7







반응형

반응형

이전 포스팅에서 CentOS 7.x 서버에 MySQL 5.6 을 설치해 보았습니다.  [MySQL 설치 다시보기]


이번 포스팅에서는 MySQL 설치 후에 필요한 세팅에 대해서 알아보도록 하겠습니다.


MySQL은 시작할 때 /etc/my.cnf 파일을 읽어서 필요할 설정을 하게 됩니다.


아래 명령으로 해당 파일을 열어서 편집합니다.


vi /etc/my.cnf


파일을 열어보면 [mysqld], [mysqld_safe] 와 같이 설정 영역이 나뉘어져 있습니다. 설정은 반드시 필요한 영역에 적어줘야 합니다.


1. DB 경로 설정

- [mysqld] 에 있는 datadir 의 경로를 변경해 줍니다. datadir을 변경할 때는 변경할 datadir의 context를 같이 변경해 주어야 합니다.


[mysqld]

datadir=/var/lib/mysql


- context 변경 (mysql DB 경로를 /datadir 로 변경했다고 가정) 

다음 중 하나만 실행해 주면 됩니다.


  • selinux 상에서 context 변경


- semanage 설치


yum install policycoreutils-python


- context 설정 변경


semanage fcontext -a -t mysqld_db_t "/datadir(/.*)?"


- 변경된 설정 적용


restorecon -Rv /datadir


  • chcon 을 이용해서 context 직접 변경


chcon --reference=/var/lib/mysql /datadir


    2. 기본 DB 엔진 설정

    - 테이블을 생성할 때 기본으로 사용할 DB 엔진을 설정할 수 있습니다. 트랜젝션을 지원하는 InnoDB 엔진을 기본으로 설정하려면 다음을 추가해 주면 됩니다.


    [mysqld]

    default-storage-engine=InnoDB


    MySQL 4.x 버전에서는 default-storage-engine 대신 default-table-type 이라는 옵션을 사용했었는데, 5.x 버전에서는 이 설정이 있으면 에러가 나면서 MySQL이 실행되지 않습니다.


    3. 인코딩 설정

    - 한글이나 일본어 중국어 등의 문자를 사용하는 경우 utf8 방식으로 인코딩을 하여 저장하는 것이 편리합니다.

    인코딩에 대해서는 데이터가 저장될 때의 인코딩과 클라이언트와 서버간의 주고 받는 데이터의 인코딩 등이 다르게 설정될 수 있으므로, 데이터 저장에 대한 것은 [mysqld] 영역에 클라이언트 접속시의 기본 인코딩은 [client] 영역에 다음과 같이 적어 주면 됩니다.


    [mysqld]

    character-set-server=utf8

    collation-server=utf8_general_ci


    [client]

    default-character-set=utf8


    MySQL에서는 서버, 데이터베이스, 테이블, 컬럼에 대해서 각각의 인코딩 방식을 적용할 수 있습니다. 이미 생성된 데이터베이스나 테이블 등은 백업 / 리스토어 시에 해당 인코딩 설정이 붙어서 오기 때문에 기존에 생성된 데이터베이스, 테이블, 컬럼에 대해서는 alter 명령어로 변경해 주는 작업이 필요할 수 있습니다.


    4. Slow Query 로그 설정

     - MySQL의 성능을 모니터링 하기 위해서 필요한 설정입니다. MySQL 서버에서 처리하는 query 중에 지나치게 오랜 시간이 소요되어 퍼포먼스에 영향을 주는 query가 없는지 혹은 index를 타지 않아 문제의 소지가 될 만한 query가 있는지를 로그에 남기는 작업입니다.

    slow-query-log 는 Slow Query 로그를 남긴다는 설정입니다. slow-query-log=1 과 같은 의미 입니다.

    long_query_time은 Slow Query 로그에 남길 기준 시간을 초단위로 설정합니다.

    log_queries_not_using_indexes 는 index를 타지 않는 Query를 로그에 기록합니다.


    [mysqld]

    slow-query-log

    long_query_time=2

    log_queries_not_using_indexes



    slow_query_log_file 옵션으로 파일명을 별도로 설정을 하지 않았다면, MySQL DB가 설치된 경로에 localhost-slow.log 파일에 Slow Query 로그가 생성됩니다.


    5. Max Connections 설정

    최대 접속 가능 클라이언트 숫자 지정 (default 151)


    [mysqld]

    max_connections=500



    6. Timeout 시간 지정

    default 28800


    [mysqld]

    wait_timeout=60











    반응형

    반응형

    CentOS7에서는 기본으로 firewalld 라는 방화벽 솔루션이 제공됩니다.

    기존의 iptables의 경우 룰 변경시 서비스를 중지해야 하는데, OpenStack이나 KVM 같은 가상화 호스트 환경에서는 네트워크 변화가 수시로 발생되어 필터링 정책 변경이 빈번해서 iptables 정책과 충돌되는 문제점 들이 발생했습니다. 이러한 문제점을 보완하기 위해서 firewalld 서비스가 활성화 되고 있는 것으로 볼 수 있습니다.

    이 포스팅에서는 firewall-cmd를 이용해서 방확벽을 구성하는 간략한 방법을 정리해 보았습니다.


    firewalld 에는 신뢰 수준에 따라 다음의 zone들이 미리 준비되어 있습니다.

    drop - block - public - external - internal - dmz - work - home - trusted


    firewall-cmd 를 이용해서 설정 변경시에는 --permanent 옵션을 사용하면, firewalld 서비스를 재시작해도 설정을 유지할 수 있습니다. 그렇지 않으면 firewalld 서비스를 재시작하면 설정이 사라집니다.


    @ firewalld 서비스가 작동하고 있는지 확인하기

    $ firewall-cmd --state


    서비스가 작동하고 있다면 콘솔에 "running" 이라고 나올 것입니다.


    @ active zone을 확인하기


    $ firewall-cmd --get-active-zones


    그리고 --list-all 옵션을 이용해서 각 zone 별로 구성되어 있는 firewalld 설정을 확인합니다. (public 자리에 위에서 확인한 zone 이름을 입력하면 됩니다.)


    $ firewall-cmd --zone=public --list-all


    앞서 이야기했던 zone들로 zone을 바꿔가며 입력해보면 각 zone 별로 어떤 서비스들을 이용할 수 있는지 확인할 수 있습니다.


    @ 특정 (네트워크) 인터페이스의 zone을 변경하기


    $ firewall-cmd --zone=internal --change-interface=enp0s3


    enp0s3 인터페이스를 internal zone으로 설정하는 명령이었습니다.

    참고로 /etc/sysconfig/network-scripts/ifcfg-enp0s3 파일을 편집해서 zone을 설정할 수도 있습니다.


    $ vi /etc/sysconfig/network-scripts/ifcfg-enp0s3


    다음 라인을 추가합니다.


    ZONE=internal


    @ 새로운 zone을 추가하기


    $ firewall-cmd --new-zone=newzonename


    새로 추가한 zone을 인식할 수 있게 재로딩 합니다.


    $ firewall-cmd --reload


    @ zone에 서비스 추가하기

    firewalld에서는 IP나 Port를 추가할 수도 있지만, 이미 잘 알려진, 많이 사용되고 있는 서비스에 대해서는 서비스 이름으로 추가가 가능합니다.

    추가 가능한 서비스 목록은 다음의 명령어로 확인이 가능합니다.


    $ firewall-cmd --get-services


    public zone에 http 서비스를 추가해 보겠습니다.


    $ firewall-cmd --zone=public --add-service=http --permanent


    firewalld 서비스를 재시작해도 public zone에서는 http 서비스를 이용 가능하게 됩니다.


    @ zone에 특정 IP 추가하기


    $ firewall-cmd --zone=public --add-source=192.168.100.0/24


    @ zone에 포트 추가하기

    아래 명령어로 public zone에 tcp 방식의 5000번 포트를 추가합니다.


    $ firewall-cmd --zone=public --add-port=5000/tcp


    열려 있는 포트를 확인합니다.


    $ firewall-cmd --zone=public --list-ports


    포트 대역을 추가할 때는 "-" 를 이용해서 대역을 지정할 수 있습니다.


    $ firewall-cmd --zone=public --add-port=5001-9999/utp


    @ 서비스 지정하기

    위에서 언급된 잘 알려진 서비스 이외에 특정 포트에 해당하는 서비스를 등록할 수 있습니다.

    /usr/lib/firewalld/services 폴더에 있는 잘 알려진 서비스들 중에 하나를 선택해서 /etc/firewalld/services로 복사합니다. (확장자를 제외한 파일명이 서비스명이 되므로 기존의 서비스들과 이름이 겹치지 않게 해줍니다.)


    $ cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/custom_service.xml


    복사한 파일을 엽니다.


    $ vi /etc/firewalld/services/custom_service.xml


    아래와 같이 내용을 편집합니다.  (tcp 방식으로 9999 포트를 사용하는 서비스로 custom_service가 등록됩니다.)


    <?xml version="1.0" encoding="utf-8"?>

    <service>

        <short>Custom Service</short>

        <port protocol="tcp" port="9999"/>

    </service>


    firewalld 서비스가 새로 추가한 서비스가 사용하는 프로토콜과 포트를 인식할 수 있게 재로딩 합니다.


    $ firewall-cmd --reload


    새로 추가한 서비스를 public zone에 추가합니다.


    $ firewall-cmd --zone=public --add-service=custom_service



    반응형

    반응형

    CentOS 7 (Minimal) 설치 후 네트워크 설정


    Network 설정

    기존에는 Ethernet ID가 eth0, eth1 이런식으로 설정되었는데, CentOS 7 에서는 Ethernet ID 기본 이름 체계가 변경되었다.

    /etc/sysconfig/network-scripts 디렉터리에 가보면 ifcfg 로 시작하는 파일들을 검색해 보면 대략적인 것을 알 수 있으며, 정확하게 알기 위해서는 "nmcli d" 커맨드를 이용하면 된다.

    # nmcli d


    TYPE이 ethernet 인 것을 찾아서 DEVICE 이름을 확인한다. 

    (여기서는 enp0s3 이었으며, 서버 환경에 따라 다른 값이 나올 수 있다.)

    /etc/sysconfig/network-scripts/ifcfg-[DEVICE] 파일을 편집한다. (nmtui 커맨드를 이용하면 GUI 모드에서 설정이 가능하다.)

    # vi /etc/sysconfig/network-scripts/ifcfg-enp0s3


    --------------------

    a. DHCP로 설정하는 경우

    아래 두 가지 값만 설정 해주면 된다. (기존에 적혀있던 나머지 내용들은 그대로 둔다)

    BOOTPROTO=dhcp

    ONBOOT=yes


    b. 고정IP로 설정하는 경우, BOOTPROTO, ONBOOT, IPADDR, NETMASK, GATEWAY, DNS 등을 설정해 주면 된다. 

    (기존에 적혀있던 나머지 내용들은 그대로 둔다)

    BOOTPROTO=static

    ONBOOT=yes

    IPADDR=192.168.1.201

    NETMASK=255.255.255.0

    GATEWAY=192.168.1.1

    DNS1=8.8.8.8

    DNS2=8.8.4.4

    --------------------


    설정이 끝났으면 ifdown 과 ifup 을 이용해서 해당 네트워크 디바이스를 리스타트 해주면 변경된 내용이 적용된다.

    # ifdown enp0s3

    # ifup enp0s3


    네트워크 서비스를 이용하면 전체 네트워크 디바이스를 리스타트 해준다. 네트워크 디바이스가 하나 밖에 없거나 전체 네트워크 디바이스를 리스타트해도 상관 없는 경우 아래 명령어를 이용한다.(혹은 service network restart 라고 해도 된다.)

    # systemctl restart network



    --------------------

    참고로 gateway나 nameserver는 다른 파일에서 global하게 설정할 수도 있다.

    /etc/sysconfig/network 파일에서도 hostname 이나 DNS 를 설정할수 있으며, (DNS)

    /etc/resolv.conf 에서 DNS를 설정하기도 한다. (nameserver)


    --------------------

    현재 설정된 IP 주소 확인

    # ip addr


    이전 버전처럼 ifconfig를 사용하고 싶다면, net-tools를 설치하면 된다.

    # yum install net-tools




    반응형