노트장으로 my.ini 열어서 옵션 수정하고 컨트롤 + s 로 저장한 뒤 서비스에서 mysql 서비스 재시작하면 
서비스가 로컬 컴퓨터에서 시작했다가 중지되었습니다

라는 에러 발생

 

인코딩 문제로 컨트롤 + s 로 그냥 저장하면 utf8로 저장돼기 때문에 mysql server 가 my.ini 불러올 때 에러나서 실행 안됨

따라서 인코딩을 ansi 로 저장해야합니다.

크롬은 2020-01월부터 파폭이나 익스등은 2020-03월부터 tls 1.1 지원 중단
어차피 apache의 경우 거의 대부분 디폴트 설정이 tls 1.1 과 tls 1.2가 같이 포함돼있기 때문에 브라우저에서 지원 종료해도 실제 서비스에는 문제가 없을것이다.(SSLProtocol all -SSLv2 -SSLv3 이렇게 설정 돼 있음)

PS.
tls 1.3 지원 : openssl 1.1.1 이상 / nginx 1.13.0 이상 / apache 2.4.37 이상
ㄴ따라서 아직 tls 1.3 안되는서버도 적잖이 있다.

하지만 오래된 서버의 경우 openssl 버전이 낮아서 tls 1.2가 지원하지 않을 수 있다.

 

현재 도메인의 TLS 지원 여부 확인 사이트에서 확인 가능
https://www.ssllabs.com/ssltest/

 

 

좀 더 도메인 자체의 보안등급을 올리고자 한다면 아래와 같이 설정하여 tls 1.1을 제외해주면 됩니다.
(tls 1.1 제외되는 이유는 poodle 이라는 공격기법 때문이라한다. tls 1.1 tls 1.2 가 아파치에 동시 적용 돼 있으면 브라우저에서 tls 1.1을 지원 중단하여도 무슨 다운그레이드 협약? 뭐 그런거 때문에 tls 1.1로 사용 할 수 있다고 한다. 즉 보안에 취약)

아파치 서버의 경우 위와 같이 설정법을 통해 TLS 1.2(아파치 2.4.37 이상이면 tls 1.3까지)만 적용되도록 하면 될 듯

아파치 2.2 면 SSLProtocol -all +TLSv1.2  이런식으로 전부 빼버리고 TLS v1.2만 추가해주고

아파치 2.4.37 이상이면 SSLProtocol -all +TLSv1.2 +TLSv1.3 이런식으로 전부 빼버리고 +TLSv1.2 +TLSv1.3 만 추가
(엔진엑스나 java등은 그에 맞게 구글링하면 될듯합니다.)

 

 

만약 openssl 버전이 낮아서 tls 1.2 지원이 안되면

1.취약점 해결된 openssl 버전 새롭게 설치(기존 openssl 건들면 안되고 추가로 설치 해줘야 함)
2.새로 설치한 openssl을 참조하는 apache를 새로 설치
3.새로 설치된 mod_ssl.so 를 기존에 사용하던 mod_ssl.so 에 복사하던가 & 아니면 기존에 사용하던 apache 설정파일을 새로 설치한 apache에 넣어주던가 하면 됩니다.
(기왕이면 apache 버전도 같이 올려주는게 좋긴 할 듯)

 

 

요약하자면
1.2020년부터 tls 1.1 지원 중단(tls 1.1로만 사용되던 구버전의 apache등은 사이트 안나올 가능성 있음)
ㄴtls 1.2 지원 여부 확인 사이트 https://www.ssllabs.com/ssltest/

2.적잖이 옛날버전의 아파치도 tls 1.2 는 지원함(따라서 왠만하면 사이트 장애는 안날듯)
ㄴ하지만 보안에 취약(poodle)

3.따라서 관리 서버면 tls 1.1을 빼주는게 좋다.
ㄴtls 1.1까지만 지원되는 환경이라면 업그레이드 필요

'job > linux' 카테고리의 다른 글

centos 5 iptables에 geoip 올리기(2020-03-05)  (0) 2020.03.05
pgsql 해킹 프로세스  (0) 2019.12.30
nginx + php-fpm 취약점  (0) 2019.10.29
sysdig 로 해킹당한 서버 분석해보기  (0) 2019.06.20
서버 점검..  (0) 2019.06.11

'job > linux' 카테고리의 다른 글

pgsql 해킹 프로세스  (0) 2019.12.30
tls 1.1 지원 중단  (0) 2019.12.09
sysdig 로 해킹당한 서버 분석해보기  (0) 2019.06.20
서버 점검..  (0) 2019.06.11
centos 5 yum error  (0) 2019.04.29

마스터1대, 슬레이브 3대로 구성된 디비 서버들인데     

 

          Slave_IO_State: Waiting for master to send event
                   Master_Host: 192.168.0.212
                   Master_User: slave1
                   Master_Port: 3813
                 Connect_Retry: 60
               Master_Log_File: mariadb-bin.602137
           Read_Master_Log_Pos: 163251227
                Relay_Log_File: localhost-relay-bin.013096
                 Relay_Log_Pos: 100492948
         Relay_Master_Log_File: mariadb-bin.602137
              Slave_IO_Running: Yes
             Slave_SQL_Running: No
               Replicate_Do_DB: 
           Replicate_Ignore_DB: 
            Replicate_Do_Table: 
        Replicate_Ignore_Table: 
       Replicate_Wild_Do_Table: 
   Replicate_Wild_Ignore_Table: 
                    Last_Errno: 1032
                    Last_Error: Could not execute Delete_rows_v1 event on table gameworkr.offer_account; Can't find record in 'offer_account', Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event's master log mariadb-bin.602137, end_log_pos 101337573
                  Skip_Counter: 0
           Exec_Master_Log_Pos: 100492647
               Relay_Log_Space: 700123700
               Until_Condition: None
                Until_Log_File: 
                 Until_Log_Pos: 0
            Master_SSL_Allowed: No
            Master_SSL_CA_File: 
            Master_SSL_CA_Path: 
               Master_SSL_Cert: 
             Master_SSL_Cipher: 
                Master_SSL_Key: 
         Seconds_Behind_Master: NULL
 Master_SSL_Verify_Server_Cert: No
                 Last_IO_Errno: 0
                 Last_IO_Error: 
                Last_SQL_Errno: 1032
                Last_SQL_Error: Could not execute Delete_rows_v1 event on table gameworkr.offer_account; Can't find record in 'offer_account', Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event's master log mariadb-bin.602137, end_log_pos 101337573
   Replicate_Ignore_Server_Ids: 
              Master_Server_Id: 1
                Master_SSL_Crl: 
            Master_SSL_Crlpath: 
                    Using_Gtid: No
                   Gtid_IO_Pos: 
       Replicate_Do_Domain_Ids: 
   Replicate_Ignore_Domain_Ids: 
                 Parallel_Mode: conservative
                     SQL_Delay: 0
           SQL_Remaining_Delay: NULL
       Slave_SQL_Running_State: 
              Slave_DDL_Groups: 552
Slave_Non_Transactional_Groups: 0
    Slave_Transactional_Groups: 2545153712

 

위와같이 1032 에러 발생, 리플리케이션 장애발생

 

 

먼저
STOP SLAVE; SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;START SLAVE;
슬레이브 1번서버 에러 스킵후 데이터를 확인해보니 에러 난 슬레이브1번 서버의 데이터가 정상이고 나머지가 비정상임을 확인

 


마스터, 슬레이브2,3 의 데이터는 비정상이고 슬레이브1의 데이터가 정상이기에 슬레이브 1의 데이터를 마스터, 슬레이브2,3에 옮겨야 한다.

 

아래와 같이 작업 진행

1.모든 디비서버들 외부에서의 접속 차단(iptables로 디비 서버끼리는 통신되도록 하고 나머지 외부에서 들어오는건 차단) 그리고 한 1~2분정도 기다려서 리플리케이션 확인

2.슬레이브1 서버에서 정상 테이블 덤프 - drop table이나 no create 옵션 사용하여 insert 구문만 들어가도록 덤프

3.마스터 서버에서 문제있는 테이블 트렁케이트 후 기달려서 동기화 까지 확인
4.마스터 서버에 덤프받은 디비 복원 후 동기화 확인

 

 

ps.

디비 차단 안한상태에서, 즉 서비스에 최대한 문제 없이 진행하고자 한다면 아래와 같이 했으면 됐을듯싶다.

1.문제있는 테이블 수정권한이 있는 계정의 수정권한을 빼서 해당 테이블 변경되지 않도록 설정
2.나머지는 기존처럼 정상 테이블 백업 후 마스터에서 truncate 한 뒤 복원하기

 

물리적인 박스형 스위치 2대 또는 그 이상을 하나의 논리적인 스위치로 구성하는것, 명칭은 벤더마다 다르다.

제조사명칭

화웨이 istack
주니퍼 VC(버츄얼샤시)
익스트림 stack
시스코 stack



 

stack 구성도
2대로 스택 구성
두대의 장비가 stack 구성, prio 숫자 높을수록 우선순위 높음(prio 를 1,2 등으로 설정하면 1이 더 우선순위 높다고 헷갈릴 수 있음)

 

 

stack과 별개로 cascade 라는게 있는데 이건 |스위치1 <-> 스위치2 <-> 스위치 3| 이런식으로 연결된다.

차이점은
1.루프가 날 수 있다.
2.스택은 대역폭이 증가, cascade 는 대역폭 증가 없음
3.스택은 마스터 하나에서만 설정 변경, cascade 은 각각 관리
4.스택은 대부분 동일 제조사,모델로만 가능(스택 전용 케이블)


http://www.fiber-optic-equipment.com/differentiate-3-technologies-switch-stacking-vs-cascading-vs-clustering.html

'job > etc' 카테고리의 다른 글

k8s  (0) 2023.01.10
소프트웨어 공부  (0) 2021.01.30
L4 알테온 설정중 metric rmetric  (0) 2019.02.13
그누보드 디렉토리 설명  (0) 2018.09.03
서버 이전시 mysql 4 to 5 password 함수 안맞아서 php 에러 날때  (0) 2018.09.03

[root@localhost ~]# /opt/mysql/bin/mysql -uroot -p'123123' -e 'SHOW SLAVE STATUS \G' | egrep "Master_Log_Pos"
           Read_Master_Log_Pos: 478353559
           Exec_Master_Log_Pos: 452076624

 

         Seconds_Behind_Master: 3971

 

위와같이 싱크가 잘 안맞는다.

 

bin 로그 확인시 지연될만한 쿼리가 아니고 개발자에게 문의해봐도 따로 쿼리 업데이트가 된건 없다고 한다.

 

iostat 
Linux 2.6.32-754.17.1.el6.x86_64 ()       08/05/2019      _x86_64_        (24 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           6.77    0.00    0.55    3.28    0.00   89.40

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sda               1.04         7.48        24.84    3539870   11757640
sdb               2.26         0.15      2158.02      70244 1021591088
sdc               0.00         0.01         0.00       6378          8
sdd             694.72      2571.53     18588.32 1217341239 8799565808

(sdd 디스크가 mysql data 디렉토리)

 

디스크 i/o가 높긴한데... 예전부터 높았다. 디스크 문제도 아닌것으로 보이고..

 

커널업데이트 한 이후부터 싱크가 안맞고 있음

 

i/o 스케쥴링이 cfg 로 설정돼있는 상태여서 noop(ssd 디스크임)으로 변경해봤으나 큰 차이가 없음

 

commitinnodb_flush_log_at_trx_commit = 2 으로 설정(기본 1)
https://santander.co.kr/151 참고

 

         Seconds_Behind_Master: 0

 

우선 조치완료.. 했으나 개운치않다. 추가 점검할 예정

 

우선 구글에다가 ansible awx 설치 하면 거의 99프로는 https://github.com/ansible/awx.git 요거 설치하는게 나온다.

저걸로 설치하면 에러가 발생한다. 아래처럼..

 

TASK [local_docker : Start the containers] *********************************************************************************************************************************************************
fatal: [localhost]: FAILED! => {"changed": false, "msg": "Failed to import docker or docker-py - cannot import name __version__. Try `pip install docker` or `pip install docker-py` (Python 2.6)"}

 

이런 에러가 난다.

 

구글링 해보면 많이 나온다. 뭐 pip install docker 해보고 언인스톨 했다가 yum 으로 다시 설치 해보고 compose 버전 지정해서 설치 해보고.... 계속 에러가 난다.

 

ansible 에러가 아니고 docker 컨테이너 실행이 안되는거니까.. 하나하나 찾아보면

 

우선.. 에러나는 task가 

- name: Start the containers
  docker_service:
    project_src: "{{ docker_compose_dir }}"
    restarted: "{{ awx_compose_config is changed or awx_secret_key is changed }}"
  register: awx_compose_start

 

위 부분이다. 

 

docker_service 라는 모듈은 말 그대로 docker 서비스, 컨테이너를 관리하는 모듈인데 뭐 최신버전(ansible 2.8)은 docker_service라는 모듈 대신에 docker_compose를 사용하라고 한다. 

(https://docs.ansible.com/ansible/latest/modules/docker_service_module.html 참고)

하... 설치 잘된다..

 

이렇게 쉬운거였다니 ;;;;;; 어이가 없네 진자............ 역시 구글링 백날 해봐야 공식 docs 가 최고인것같다.

'job > ansible' 카테고리의 다른 글

ansible - windows Win32ErrorCode 1058  (0) 2019.05.23
windows host에서 ansible 실행하는법  (0) 2019.05.23
ansible 공부한 모듈들 정리  (0) 2019.05.02
ansible - 디렉토리 구조  (0) 2019.05.02
ansible- error  (0) 2019.04.26

190329 19:47:38  InnoDB: ERROR: the age of the last checkpoint is 13637149,
InnoDB: which exceeds the log group capacity 9433498.
InnoDB: If you are using big BLOB or TEXT rows, you must set the
InnoDB: combined size of log files at least 10 times bigger than the
InnoDB: largest such row.

 

 

참고

https://dba.stackexchange.com/questions/16510/mysql-innodb-innodb-error-the-age-of-the-last-checkpoint-is-innodb-which-exc

 

 

 

 

iib_logfiib_logfile 0이랑 1 mv로 옮겨두고 

innodb_log_file_size = 52428800  (my.cnf에는 아무 설정 안돼있고 디폴트는 5242880 인데 0 하나 더 줌)

 

그리고 mysql 재시작

서버에서 설정하는건 구글링하면 워낙 많이 나오고 쉽다. 근데 스위치에서 설정하는건 네트워크엔지니어가 아니라 굉장히 어색하고 무섭다. 돌아가고 있는 스위치 괜히 잘못건드리면 안되니까.

 

 

스위치 설정부분
ㄴ스위치 밴더별로 다르겠지만 어떤식으로 구성하는건지 이해한다면 뭐 크게 어렵진 않을듯...

ㄴport-채널 인터페이스를 먼저 만드는 밴더도 있다고 함 아래의 경우는 port-채널 인터페이스 안만들고 range 포트 해서 port-채널 인터페이스를 생성하는 경우이다.

 

1.티밍 구성할 포트들의 channel-group 을 지정해준다.
#interface range gi 0/1-0/3     ##스위치의 1~3 포트를 묶을경우
ㄴ스위치의 1~3 기가이더넷 포트의 인터페이스를 수정하겠다.
#channel-group 1 mode active   
ㄴ서버간 티밍 설정은 왠만하면 lacp로 구성(스위치가 lacp를 지원하면.. 대부분 지원하는듯?) 본딩도 마찬가지임
ㄴlacp중에서도 3가지 모드가 있는데.. active로 하면 되는듯

ㄴ위에 1~3 포트들의 채널 그룹 1을 액티브 모드로 설정
#show eternet summaryshow etherchannel summary 
ㄴ 잘 구성돼있나 확인

#show lacp-counter

ㄴ 잘 구성돼있나 확인

 

 

 

구성 삭제는 역순으로 진행하면 됨

1.갑자기 cpu 사용률이 높아짐
2.실행하지 않은 프로세스가 구동되는것을 발견

3.그 프로그램은 채굴 프로그램이였음

4.설치한적이 없으니 서버가 해킹당한것으로 판단

5./tmp/javax 라는 디렉토리에서 sshd2 라는 프로그램이 실행됐고 이 프로그램이 채굴 프로그램임

 

strace는 이미 실행됐을 때 그 프로세스를 디버깅 하는거기 때문에 strace로는 분석이 불가능한것으로 판단

 

따라서 sysdig로 어떤 경로로 들어온건지 침해사고 분석을 해보자.

 

1./tmp/javax 디렉토리에 악성파일이 생성/실행 되는거니까 이 디렉토리를 기준으로 sysdig

ㄴ또는 /tmp/javax/sshd2 가 실행되는거니까 이 파일을 기준으로 하는것도 도움이 될듯하다. 하지만 sshd2가 실행되면 cpu 자원을 거의 다 잡아먹기 때문에 sshd2는 퍼미션 000으로 주고 수정도 안되게끔 immutable 해놓은 상태이다. 

 

[root@localhost ~]# sysdig fd.name contains /tmp/javax -w /root/sysdig.txt &
[1] 15994
[root@localhost ~]# 
[root@localhost ~]# 
[root@localhost ~]# ps -ef | grep 15994

root     15994 15215 15 14:10 pts/1    00:00:00 sysdig fd.name contains /tmp/javax -w /root/sysdig.txt

 

좀 있다 확인해보니 아래와 같은 로그들이 쌓여있다.

 

8526754 16:30:01.519760827 7  (24369) < open fd=5 name=javax(javax) flags=5185(O_DIRECTORY|O_NONBLOCK|O_RDONLY|O_CLOEXEC) mode=0 dev=802 
8526755 16:30:01.519764268 7  (24369) > fchdir fd=5 
8526756 16:30:01.519764853 7  (24369) < fchdir res=0 
8526757 16:30:01.519765611 7  (24369) > getdents fd=5 
8526758 16:30:01.519769890 7  (24369) < getdents res=160 
8526759 16:30:01.519771972 7  (24369) > getdents fd=5 
8526760 16:30:01.519772426 7  (24369) < getdents res=0 
8526761 16:30:01.519773239 7  (24369) > close fd=5 
8526762 16:30:01.519774769 7  (24369) < close res=0 
10671620 17:00:01.782017001 12 sshd (24528) < open fd=5(

pipe:[29129900]) name=javax(/javax) flags=5185(O_DIRECTORY|O_NONBLOCK|O_RDONLY|O_CLOEXEC) mode=0 dev=802 
10671621 17:00:01.782019569 12 sshd (24528) > fchdir fd=5(

pipe:[29129900]) 
10671622 17:00:01.782019965 12 sshd (24528) < fchdir res=0 
10671623 17:00:01.782020603 12 sshd (24528) > getdents fd=5(

pipe:[29129900]) 
10671624 17:00:01.782023743 12 sshd (24528) < getdents res=160 
10671625 17:00:01.782025437 12 sshd (24528) > getdents fd=5(

pipe:[29129900]) 
10671626 17:00:01.782025746 12 sshd (24528) < getdents res=0 
10671627 17:00:01.782026366 12 sshd (24528) > close fd=5(

pipe:[29129900]) 
10671628 17:00:01.782027341 12 sshd (24528) < close res=0 
12728508 17:30:01.294747116 2  (2681) < open fd=5 name=javax(javax) flags=5185(O_DIRECTORY|O_NONBLOCK|O_RDONLY|O_CLOEXEC) mode=0 dev=802 
12728509 17:30:01.294750623 2  (2681) > fchdir fd=5 
12728510 17:30:01.294751237 2  (2681) < fchdir res=0 
12728511 17:30:01.294751981 2  (2681) > getdents fd=5 
12728512 17:30:01.294756100 2  (2681) < getdents res=160 
12728513 17:30:01.294758160 2  (2681) > getdents fd=5 
12728514 17:30:01.294758765 2  (2681) < getdents res=0 
12728515 17:30:01.294759540 2  (2681) > close fd=5 
12728516 17:30:01.294760864 2  (2681) < close res=0 

 

 

 

 

'job > linux' 카테고리의 다른 글

tls 1.1 지원 중단  (0) 2019.12.09
nginx + php-fpm 취약점  (0) 2019.10.29
서버 점검..  (0) 2019.06.11
centos 5 yum error  (0) 2019.04.29
nodejs npm , socket.io 설치  (0) 2019.04.10

Jun 101. 서버의 crontab이 삭제 돼있는것을 확인

2. 당시 등록해줬으나 또다시 삭제됨, 1분간격으로 삭제되는것을 확인

3.message 로그에는 
Jun 10 06:53:54 cobuy-0952 init: Re-executing /sbin/init 
Jun 10 06:54:55 cobuy-0952 init: Re-executing /sbin/init 
Jun 10 06:55:55 cobuy-0952 init: Re-executing /sbin/init 
Jun 10 06:56:56 cobuy-0952 init: Re-executing /sbin/init 
Jun 10 06:57:56 cobuy-0952 init: Re-executing /sbin/init 
Jun 10 06:58:57 cobuy-0952 init: Re-executing /sbin/init 
Jun 10 06:59:58 cobuy-0952 init: Re-executing /sbin/init
라는 메세지가 1분간격으로 쌓여있음, tail -f 로 확인해보면 위 메세지가 로깅될때마다 crontab에 삭제됨

##참고로 Re-executing /sbin/init  메세지는 init 6 해서 보면 서버 재부티될 때 올라오는 메세지


4.strace -s 65535 -f -t -o log.txt -p 1 으로 init(pid : 1) 프로세스를 확인해보면 1분간격으로 init restart가 확인됨

strace 내용
1     17:21:46 --- SIGTERM {si_signo=SIGTERM, si_code=SI_USER, si_pid=4316, si_uid=0} ---
1     17:21:46 write(4, "\0", 1)        = 1
1     17:21:46 rt_sigreturn()           = -1 EINTR (Interrupted system call)
1     17:21:46 read(3, "\0", 1)         = 1
1     17:21:46 read(3, 0x7fff9a1c07df, 1) = -1 EAGAIN (Resource temporarily unavailable)    ###7fff9a1c07df 이메모리주소를 찾을려고 했는데 못찾았다.
1     17:21:46 open("/etc/localtime", O_RDONLY) = 9   ####여기서부터 
1     17:21:46 fstat(9, {st_mode=S_IFREG|0644, st_size=517, ...}) = 0
1     17:21:46 fstat(9, {st_mode=S_IFREG|0644, st_size=517, ...}) = 0
1     17:21:46 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f95b8be1000
1     17:21:46 read(9, "TZif2\0\0\중략\0\0\0\0\0\0\0\0\0\0\0\0\nKST-9\n", 4096) = 517
1     17:21:46 lseek(9, -304, SEEK_CUR) = 213
1     17:21:46 read(9, "TZif2\0\중략\0\0\0\0\0\0\nKST-9\n", 4096) = 304
1     17:21:46 close(9)                 = 0       #####여기까지는 localtime 불러오는거니까 무시해도 될듯
1     17:21:46 munmap(0x7f95b8be1000, 4096) = 0
1     17:21:46 socket(PF_LOCAL, SOCK_DGRAM|SOCK_CLOEXEC, 0) = 9
1     17:21:46 connect(9, {sa_family=AF_LOCAL, sun_path="/dev/log"}, 110) = 0
1     17:21:46 sendto(9, "<28>May 31 17:21:46 init: Re-executing /sbin/init", 49, MSG_NOSIGNAL, NULL, 0) = 49  ###메세지 로그에 로깅되는 부분..
1     17:21:46 rt_sigprocmask(SIG_BLOCK, ~[RTMIN RT_1], [], 8) = 0
1     17:21:46 execve("/sbin/init", ["/sbin/init", "--restart"], [/* 3 vars */]) = 0     여기서 아마 crontab이 초기화되는것같다...
1     17:21:46 brk(0)                   = 0x560480f31000
등등... 약 360줄

strace를 토대로 어느 프로세스(혹은 데몬)때문에 crontab이 초기화 되는지 찾아보려했는데 결국은 실패
ㄴ/proc/*/map/ 에는 뒤에 몇자리 때봐도 안나
애초에 어느 프로세스로 인해 실행됐다 라는 기록이 안된다면 찾는건 거의 불가능하다고 판단
처음에는 시스템이 올라오면서 init 데몬이 뭔가 문제가 생겼나.. 싶어서 os 재부팅도 해보고 메모리에 Resource temporarily unavailable 에러가 나오니 메모리 불량인가... 싶어 메모리 교체도 해봤으나 하루정도 괜찮고 동일증상 발생
crontab도 안돌고 있는데 1분간격으로 위와같이 init 프로세스에서 뭔가 작동하는걸로보아 현재 실행돼있는 프로세스중 하나에 문제가 있다고 판단
수상한 프로세스를 찾아보니 서버가 해킹당해있었음
/tmp/javax 에 해킹 프로그램 실행돼있었음 많이 보던 해킹프로그램이였는데 이걸로 인해 crontab이 삭제(init 프로세스에 뭔가 작동)되는건 첨보는 경우였습니다.

'job > linux' 카테고리의 다른 글

nginx + php-fpm 취약점  (0) 2019.10.29
sysdig 로 해킹당한 서버 분석해보기  (0) 2019.06.20
centos 5 yum error  (0) 2019.04.29
nodejs npm , socket.io 설치  (0) 2019.04.10
ionice  (1) 2019.04.09

TASK [Running Windows Update] **********************************************************************************************************
task path: /root/ansible/dhsa/winu.yml:5
win_updates: running win_updates module
Using module file /usr/lib/python2.7/site-packages/ansible/modules/windows/win_updates.ps1
<123.123.123.123> ESTABLISH WINRM CONNECTION FOR USER: test01 on PORT 5986 TO 123.123.123.123 
EXEC (via pipeline wrapper)
The full traceback is:
Exception calling "RunAsUser" with "7" argument(s): "Failed to start become pro
cess (The service cannot be started, either because it is disabled or because i
t has no enabled devices associated with it, Win32ErrorCode 1058)"
At line:907 char:9
+         $result = [AnsibleBecome.BecomeUtil]::RunAsUser($username, $password,
 $l ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : Win32Exception
 

fatal: [123.123.123.123  ]: FAILED! => {
    "changed": false, 
    "msg": "Failed to become user SYSTEM: Exception calling \"RunAsUser\" with \"7\" argument(s): \"Failed to start become process (The service cannot be started, either because it is disabled or because it has no enabled devices associated with it, Win32ErrorCode 1058)\""
}
        to retry, use: --limit @/root/ansible/dhsa/winu.retry

PLAY RECAP *****************************************************************************************************************************
123.123.123.123       : ok=0    changed=0    unreachable=0    failed=1    skipped=0  

 

 

윈도우 보안업데이트 하려고 하는데 위와같이 에러 발생

 

이럴경우에는 윈도우 서비스중 secondary logon  서비스가 사용안함으로 돼 있을경우 에러가 난다. 원래는 윈도우 보안업데이트 실행시 이게 종료돼있어도 자동으로 실행되야하는데 아에 사용안함으로 돼 있으니까 에러 난다.

 

secondary logon 이게 원래 디폴트는 사용안함이 아니다. 근데 보안상 취약한 서비스라 사용안함을 권고하고 있다. 

 

대부분 서비스 사용중이라 이런 에러 자체가 없어서 찾느라 드럽게 힘들었다. 

'job > ansible' 카테고리의 다른 글

ansible git으로 받은 awx 설치시 에러  (1) 2019.07.10
windows host에서 ansible 실행하는법  (0) 2019.05.23
ansible 공부한 모듈들 정리  (0) 2019.05.02
ansible - 디렉토리 구조  (0) 2019.05.02
ansible- error  (0) 2019.04.26

리눅스 서버는 ssh를 통해서 ansible이 통신하는데 윈도우 서버는 winrm 이라는 윈도우 리모트 매니져를 통한다.

winrm 은 윈2012 는 기본적으로 실행이 돼 있다. 5985 포트로 올라와있음

근데 ansible은 기본적으로 winrm의 ssl 5986 포트를 통해서 통신을 해야 한다.(5985로도 할 수는 있는데 보안 뭐 실행안되고 뭐 그런게 있는듯)

 

 

[root@master ~]# ansible -i /etc/ansible/hosts win -m win_ping
123.123.123.123 | UNREACHABLE! => {
    "changed": false, 
    "msg": "ssl: HTTPSConnectionPool(host='123.123.123.123', port=5986): Max retries exceeded with url: /wsman (Caused by ConnectTimeoutError(, 'Connection to 123.123.123.123 timed out. (connect timeout=30)'))", 
    "unreachable": true
}

 

위와같이 에러가 나는 이유는 windows hosts 서버에 winrm 5986 포트 리슨이 안돼있어서(즉 winrm ssl 실행이 안돼있어서) 이다.

 

 

그전에 winrm no module 없다고 뜨면

pip pywinrm 으로 pywinrm 설치해줘야 한다.

 

windows 2012 의 경우 파워쉘 실행후
$url = "https://raw.githubusercontent.com/ansible/ansible/devel/examples/scripts/ConfigureRemotingForAnsible.ps1"

$file = "$env:temp\ConfigureRemotingForAnsible.ps1"

(New-Object -TypeName System.Net.WebClient).DownloadFile($url, $file)

powershell.exe -ExecutionPolicy ByPass -File $file

 

 

위와 같이 실행

 

위 구문을 실행하면 된다.

 

[root@master ~]# ansible -i /etc/ansible/hosts win -m win_ping
123.123.123.123 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}

잘된다.

 

hosts 파일 내용은

[win]
123.123.123.123 
[win:vars]
ansible_password='123123123'
ansible_connection=winrm
ansible_winrm_server_cert_validation=ignore
ansible_user=administrator
ansible_port=5986

'job > ansible' 카테고리의 다른 글

ansible git으로 받은 awx 설치시 에러  (1) 2019.07.10
ansible - windows Win32ErrorCode 1058  (0) 2019.05.23
ansible 공부한 모듈들 정리  (0) 2019.05.02
ansible - 디렉토리 구조  (0) 2019.05.02
ansible- error  (0) 2019.04.26

 maxminddb 라는걸로 올릴 수 있는데 그거 하려면 뭐 gcc 랑 c++ 버전 이런게 centos 5버전에는 안맞는 버전들이다.

어쨋든 centos5 버전은 아래와 같이 하면 된다.

 

 

https://dev.maxmind.com/geoip/legacy/mod_geoip2/ 참고

 

GeoIP Legacy Apache Module « MaxMind Developer Site

GeoIP Legacy Apache Module New Apache Module Available: This module is for the GeoIP Legacy format (dat). To read the MaxMind DB format (mmdb) used by GeoIP2, please see mod_maxminddb Description The mod_geoip2 module embeds GeoIP Legacy database lookups i

dev.maxmind.com

 

설치순서는 대략적으로

1.geoip를 서버에 설치하고

2.geoip의 데이터를 넣어주고

3.설치된 geoip를 가지고 아파치용 geoip 모듈을 설치한다.

 

 

1.geoip-api-c-master.zip 다운로드 & 설치 

https://github.com/maxmind/geoip-api-c

geoip-api-c-master.zip
0.18MB

1-1. 파일 다운로드

1-2. 압축풀고 들어가서 ./bootstrap

ㄴ여기서 

~/src/apache_sadong/geoip-api-c-master]# /usr/local/bin/autoreconf -fiv
autoreconf: Entering directory `.'
autoreconf: configure.ac: not using Gettext
autoreconf: running: aclocal --force -I m4
autoreconf: configure.ac: tracing
autoreconf: configure.ac: not using Libtool
autoreconf: running: /usr/local/bin/autoconf --force
configure.ac:14: error: possibly undefined macro: AC_PROG_LIBTOOL
      If this token and others are legitimate, please use m4_pattern_allow.
      See the Autoconf documentation.
autoreconf: /usr/local/bin/autoconf failed with exit status: 1

위와같이 libtool 관련 에러 발생하면 libtool 이거 받아서 압축풀고 ./configure make make install 해서 설치

libtool-2.4.2.tar.gz
2.51MB

 

1-3./configure --prefix=/usr/local/geoip ;make ;make install

 

2.geoip 컨츄리 파일 받고 넣기
https://dev.maxmind.com/geoip/geoip2/geolite2/

ㄴ용량이 커서 업로드가 안됨, GeoLite2-City-CSV_날짜 파일 받으면됩니다.

2-1.일전에 geoip iptalbles 에 올리는걸로 컨버팅하는 스크립트 했었는데 이번 스크립트는 또 다른거다.

이번 버전은 파이썬 2.7버전에서 실행되는 스크립트다.(2.7 미만의 버전은 해당 스크립트 에러남)

# git clone https://github.com/sherpya/geolite2legacy

# cd geolite2legacy

# curl -O https://geolite.maxmind.com/download/geoip/database/GeoLite2-Country-CSV.zip

# ./geolite2legacy.py -i GeoLite2-Country-CSV.zip -f geoname2fips.csv -o GeoIP.dat

ㄴ이거 할 때 ipaddr 모듈 없다하면 pip install ipaddr 명령어로 설치해야한다.

깔끔하게 GEOIP.dat 파일이 생겼다.
geoip.dat 파일은 여기다가 한달에 한번정도 주기적으로 업로드를 해야겠다. 

 

GeoIP.dat
1.88MB

2-2.geoip.dat 파일을 /usr/local/GeoIP/share/GeoIP 여따가 넣어준다.

 

 

3.geoip-api-mod_geoip2-1.2.10.tar.gz 다운로드

geoip-api-mod_geoip2-1.2.10.tar.gz
0.01MB

3-1. 파일 다운로드 받고 압축풀고 해당 디렉토리로 들어가면 mod_geoip.c 가 있다. 해당 경로에서

[root@localhost ~/src/apache_sadong/geoip-api-mod_geoip2-1.2.10]# /home/apache/bin/apxs  -i -a -L /usr/local/GeoIP/lib -I /usr/local/GeoIP/include -l GeoIP -c ./mod_geoip.c 

이렇게 하면 아파치에 geoip 모듈 탑재 완료.

 

3-2. 이제 다 됐으면 특정 국가만 허용예시

GeoIPDBFile 이부분은 geoip db 파일을 뭘로 할꺼냐고 그 뒤에 flag 는 Standard  만 있는게 아니다.
MemoryCache / Standard / CheckCache / IndexCache 요렇게 4개가 있다.
메뉴얼에는 전부 MemoryCache 로 돼 있으니까 나도 MemoryCache  로 

각 플래그에 대한 설명은 https://dev.maxmind.com/geoip/legacy/mod_geoip2/ 참고

 

 

특정 국가에만 접근 허용

          <Directory /home>                  
                Options FollowSymLinks MultiViews
                AllowOverride FileInfo
                Order deny,allow  
                SetEnvIf GEOIP_COUNTRY_CODE KR AllowCountry
                Deny from all
                Allow from env=AllowCountry

</Directory>

 

 

ps.

아파치 어쎄스 로그에 국가코드 남기고 싶으면 로그 포멧을 아래로 하면됨
LogFormat “%V [%h] %u %t %D \”%r\” %>s %b \”%{Referer}i\” \”%{User-Agent}i\”   GeoIP_Address=\”%{GEOIP_ADDR}e\” Country_Code=\”%{GEOIP_COUNTRY_CODE}e\” Country_Name=\”{GEOIP_COUNTRY_NAME}e\”” vcommon

mysql 리플리케이션 운영중 슬레이브 서버에 문제가 발생

 

mysql 리플리케이션 구동방식이

 

데이터 업데이트 > master에서 업데이트된 쿼리를 bin로그에 기록 > slave의 io쓰레드에서 bin log를 토대로 relay  로그를 작성 > sql쓰레드에서 relay 로그를 토대로 slave의 DB 업데이트 > relay 로그 쓸모가 없어지면(master의 bin log가 삭제되면) relay 퍼지 옵션 디폴트가 on이기 때문에 자동으로 삭제됨

 

근데... slave서버에서 상태를 보면 

                Relay_Log_File: localhost-relay-bin.999999

위와같이 릴레이 로그-999999 를 보고 있따. 

[root@localhost data]# ls -lat localhost-relay-bin.11* | more
-rw-rw---- 1 mysql mysql  2891938 May  3 09:35 localhost-relay-bin.1157093

실제로는 위 파일을 바라봐야 한다.

 

order by limit 1 주고 계속 확인해보면 다행히도 실시간으로 동기화는 잘 되고 있다..
select count(*) from table 같은걸로 레코드 수 새보면 좋겠찌만... 실서비스중인데 부하 생길포인트 만드는건 쫌 아닌것같다.

 

여튼 상황 정리하면 아래와 같다.
1.디비 동기화는 잘 되고 있음
2.마스터 서버의 bin 로그는 잘 삭제되고 있음
3.슬레이브 서버의 relay bin 로그를 999999를 바라보고 있음
ㄴ실제로는 1157093 을 봐야함

4.relay 로그 삭제가 안되고 있음
5.error log는 없음

 

inc_group_relay_log_pos() 이 함수에 문제가 있다고 한다.
strcmp() 라는 함수를 통해 전/후 두개의 relay log를 비교하는데 이때 둘다 6자리까지는 정상적으로 비교가 되는데 6자리에서 7자리로 바뀔 때 즉, 999999 => 1000000 이때 문제가 있다고 한다.

추가로 handle_queued_pos_update() 라는 함수에서도 7자리로 변경될 때 parallel replication 이슈가 발생할 수 있다고 한다.

https://jira.mariadb.org/browse/MDEV-8134

 

패치는 뭐... 재컴파일하기엔 좀 무리가 있으니... 일단 relaylog 전부 reset으로 날리고 다시 맞춰준다음 relay log 용량을 10M(디폴트)에서 512M로 바꿔야겠다. 그럼 그렇게 많이 차진 않겠찌...
그래도 많이 차면 패치하고 재컴파일 해야할듯

 

----조치 한 사항---

1.우선 데이터 백업 한번 해주고

2.새벽에(접속자 최대한 없을 때)웹페이지 공지 띄우고 디비서버로의 접근 차단(마스터 서버 업데이트 없도록)
ㄴiptables 에서 마스터-슬레이브만 3306 포트 통신하도록 변경하고 나머지는 전체 차단, 웹에서도 차단
ㄴ마스터서버 binlog 파일 넘버랑 로그 포지션 안바뀌는거 확인

3.stop slave

4.reset slave
ㄴreset slave 하니까 삭제되지 않던 relay log 파일도 전부 삭제됨

5.start slave

6.CHANGE MASTER TO MASTER_LOG_FILE='<master-bin.number>', MASTER_LOG_POS=;

7.위와같이 작업하고 bin 로그파일 넘버랑 로그 포지션 넘버 동일한지 확인

 

위와같이 슬레이브 서버들 전부 진행하니까 잘 해결됐다.

추가로 10MB씩 쌓이던 relay 로그 파일 512MB로 변경함

gather_facts // 우선 엔서블에서의 facts 란 클라이언트 서버 정보(OS버전같은거)다.  gather는 모으다. 즉 클라이언트 서버의 정보들(os 버전이나 이런것들)을 가져올꺼냐 안가져올꺼냐.. 정보가 필요하면 당연히 가져와야하고 필요없는 작업이면 안가져와도 된다. 속도차이가 있음


delegate_to // 인벤토리에 없는 호스트를 작업할 때 사용, 127.0.0.1(로컬)이 들어가있음 로컬 서버에 있는 쉘을 실행한다거나 그럴때 쓰임
run_once  // 위에 delegate_to 와 같이 자주 사용된다. delegate_to와 자주 사용되는이유는 실제 실행되는 서버에서 변수 한번 뽑으면 되는거니까
- name: test_delegate
  delegate_to: 127.0.0.1
  run_once: true
  command: /root/bin/tast_string
  register: test_exe


when   // if문같은거 옵션이 여러가지 많음
shell  // 쉘 실행
ignore_errors  // 에러나도 다음작업을 진행(ex. 백업해야할 때 mv로 파일을 옮겨야하는데 서버에 파일이 없으면 에러남, 이경우 백업할께 없으면 에러나도 상관없는거니까 mv로 진행)
  - name: centos 5 version mv test1sh cmd_test1.sh_date
    shell: mv /root/test1.sh /root/test1.sh_{{ansible_date_time.date}}
    when: ansible_distribution == "CentOS" and ansible_distribution_major_version == '5'
    ignore_errors: True

set_fact  // 변수 설정하는거임
- name: cur_time_var
  delegate_to: 127.0.0.1
  run_once: true
  set_fact: date_time="{{lookup('pipe','date \"+%Y%m%d\"')}}"


local_action // 로컬 서버에서 작업을 실행하겠다. delegate_to=127.0.0.1 이랑 같은건데 딜리게이트를 더 권장한다. 왜냐하면 로컬액션으로 처리가 안되는 것들이 많음
- name: cat ip
  local_action: shell cat /root/ip
  register: sip

register // task 실행 결과를 저장하고자 할 때에는 register 지시어를 사용하면 됨.
- name: IP check.
  shell: ip addr show eth0 | grep inet | grep -v inet6 | awk '{print $2}' | cut -d/ -f1
  register: real_ip

copy  //  말그대로 복사

lineinfile  // 이 모듈은 echo "문구" >> 파일.txt 와 같이 파일에 내용을 추가하는 모듈인데...ansible -m lineinfile "path=test.txt line=test11" 이런식으로 애드혹를 입력할경우 test.txt 하단에 test11이라는 구문이 추가된다.  근데 사람이 실수로 ansible -m lineinfile "path=test.txt line=test11" 이런 명령어를 두번 넣었을경우 lineinfile은 멱등성을 지원하기 때문에 해당 파일에 test11 이 두줄 추가 되지 않고 한줄만 추가된다. 
- name: password to /root/test
  lineinfile: dest=/root/test mode=0600 create=yes line="{{test.stdout}}"

with_items  // 반복처리할때 사용함, slave_ip.stdout_lines 리스트들

replace // 말그대로 단어교체 파일안의 내용들만 되는듯(mv 이름 이름.old 처럼 파일도 가능하진 않음)



debug // 말그대로 디버그, 이거는 status를 보기위한 용도로 한듯



'job > ansible' 카테고리의 다른 글

ansible - windows Win32ErrorCode 1058  (0) 2019.05.23
windows host에서 ansible 실행하는법  (0) 2019.05.23
ansible - 디렉토리 구조  (0) 2019.05.02
ansible- error  (0) 2019.04.26
ansible-3 playbook  (0) 2019.04.25

데몬의 실행여부를 체크하는 플레이북 짤건데 디렉토리 구조는 아래와 같다

데몬실행여부 체크 플레이북이니까 디렉토리명은 daemon_check로 주고
[root@localhost daemon_check]# pwd
/root/ansible/test/daemon_check

구조,간략설명

ll[root@q352-3552 daemon_check]# ll
total 4
drwxr-xr-x. 2 root root 66 May  2 13:38 group_vars   ##hosts에 지정되는 그룹들의 변수를 지정하는 디렉토리

-rw-r--r--. 1 root root  0 May  2 10:37 hosts    ###/etc/ansible/hosts와 동일한 기능이다.
drwxr-xr-x. 6 root root 82 May  2 13:32 roles   ### site.yml 에 들어가는 roles 
-rw-r--r--. 1 root root 90 May  2 10:48 site.yml

 

먼저 group_vars는 를들어 엔서블을 사용하려면 클라이언트에 파이썬 2.6버전이상이 설치 돼 있어야 하는데 클라이언트 centos5버전이라면 기본적으로 파이썬 2.4가 설치돼있다. 따라서 파이썬 2.6을 따로 설치해주고 인터럽트를 직접 지정해줘야 하는데 

이런식으로 centos5 서버들154,155,156,157,158에 하나하나 인터럽터를 지정해줘야 한다. 근데 group_vars에 centos5 라는 파일 만들고 그 안에 ansible_python_interpreter=/usr/bin/python2.6 를 적어주거나 하면 된다.

hosts 파일에

[centos5:vars]

ansible_python_interpreter=/usr/bin/python2.6

이런식으로 직접 지정해줘도 된다.

 

그다음 hosts는 클라이언트 서버 리스트고... 그룹으로 지정할 수 있고 위에 사진처럼

roles랑 site.yml 이 중요하다.

먼저 site.yml 의 내용을 보면

site.yml

crond_check 는 모든 서버가 다 실행돼야하니까 hosts 대상은 all , roles는 crond_check
마찬가지로 httpd는 방화벽도 체크해야하니까 iptables_open롤도 추가, mysql 은 mysql_check 롤만 들어간다.

우리가 실행하는건 site.yml 이다. ansible-playbook site.yml 명령어로 실행해주면 
  roles:
    - crond_check
여기에 적어준 roles들이 차례대로 실행되는데 적어준 roles 이름과 디렉토리 이름은 꼭 같아야 한다. 

[root@q352-3552 roles]# ll
total 0
drwxr-xr-x. 5 root root 52 May  2 12:57 crond_check
drwxr-xr-x. 5 root root 52 May  2 12:57 httpd_check
drwxr-xr-x. 5 root root 52 May  2 12:57 iptables_open
drwxr-xr-x. 5 root root 52 May  2 12:57 mysql_check
drwxr-xr-x. 5 root root 52 May  2 12:57 nginx_check

 

roles 디렉토리 안에 crond_check 들어가보면
[root@q352-3552 crond_check]# ll
total 0
drwxr-xr-x. 2 root root  6 May  2 15:37 defaults
drwxr-xr-x. 2 root root  6 May  2 15:37 files
drwxr-xr-x. 2 root root 22 May  2 13:01 handlers
drwxr-xr-x. 2 root root 22 May  2 13:12 tasks
drwxr-xr-x. 2 root root 21 May  2 13:23 templates
내용은 위와같은데 tasks안에 있는 main.yml(실행되는 roles들의 야믈 파일은 무조건 파일명이 main.yml 이어야 함) 파일이 가장 먼저 실행하는데 main.yml 이 실행시 templates 모듈을 사용할 때 필요한 파일은 templates 안에 있어야 하고 마찬가지로 files 모듈을 사용할 때의 파일은 files 안에 있어야 한다. defaults는 변수설정(vars보다 순쉬 높음) meta같은것도 있다는데 잘 모르겠음.. 하여튼 모든 작업이 완료되면 마지막으로 handlers가 진행된다.(이거는 보통 시작,재시작만 들어감)
ㄴ왜 시작,재시작만 들어가느냐? 모르겠음.... 대충 생각해본다면... handlers는 무조건 tasks다음 즉 마지막에 실행이 되니까 예를들어 뭐... httpd.conf 수정후 마지막에 해야할 작업이 서비스 재시작밖에 더 있을까 ?싶다.

 

 

여튼 정리하자면..

site.yml 실행 > 그안에 있는 role들이 차례대로 실행 > ./roles 디렉토리에 roles와 동일한 이름 디렉토리가 있음 > 디렉토리 안에 ./tasks/main.yml 을 실행 > 실행되면서 탬플릿,파일들의 모듈 사용시 templates, files 디렉토리가 있고 그안에 파일을 사용 > 마지막에 ./handlers/main.yml 실행 

'job > ansible' 카테고리의 다른 글

windows host에서 ansible 실행하는법  (0) 2019.05.23
ansible 공부한 모듈들 정리  (0) 2019.05.02
ansible- error  (0) 2019.04.26
ansible-3 playbook  (0) 2019.04.25
ansible-2 hosts(그룹), 멱등성  (0) 2019.04.22

엘라스틱서치랑 rdb 비교

http://blog.naver.com/PostView.nhn?blogId=indy9052&logNo=220940682941&parentCategoryNo=&categoryNo=66&viewDate=&isShowPopularPosts=false&from=postView

 

[Elasticsearch] RDB VS Elasticsearch

일단 기존에 RDB와 비교해서 차이점이나 개념 등을 잡으면 더 효율적인 면이 있을 것으로 보여진다.기존...

blog.naver.com

https://hsp1116.tistory.com/62

 

엘라스틱서치 정리

Elasticsearch Elasticsearch와 RDBMS의 데이터구조 비교 Elasticsearch RDBMS 인덱스 데이터베이스 타입 테이블 도큐먼트 로우 필드 컬럼 매핑 스키마 클러스터 엘라스틱서치의 가장 큰 시스템 단위. 하나의 클러..

hsp1116.tistory.com

 

 

예제

https://12bme.tistory.com/171

 

[ELK] 엘라스틱서치(ElasticSearch) 시작하기

ELK스택 ElasticSearch를 실습하기 전에 ELK스택에 대해 알아보겠습니다. 데이터과학은 깊고 넓은 분야입니다. 분야가 다양하기때문에 데이터과학은 각 분야의 팀워크가 생명입니다. 아래는 데이터 과학을 구성하..

12bme.tistory.com

 

 

 

 

 

 

 

 

 

 

 

 

 

 

yum.repos.d]# yum list | grep python
Traceback (most recent call last):
  File "/usr/bin/yum", line 29, in ?
    yummain.user_main(sys.argv[1:], exit_code=True)
  File "/usr/share/yum-cli/yummain.py", line 309, in user_main
    errcode = main(args)
  File "/usr/share/yum-cli/yummain.py", line 178, in main
    result, resultmsgs = base.doCommands()
  File "/usr/share/yum-cli/cli.py", line 345, in doCommands
    self._getTs(needTsRemove)
  File "/usr/lib/python2.4/site-packages/yum/depsolve.py", line 101, in _getTs
    self._getTsInfo(remove_only)
  File "/usr/lib/python2.4/site-packages/yum/depsolve.py", line 112, in _getTsInfo
    pkgSack = self.pkgSack
  File "/usr/lib/python2.4/site-packages/yum/__init__.py", line 662, in 
    pkgSack = property(fget=lambda self: self._getSacks(),
  File "/usr/lib/python2.4/site-packages/yum/__init__.py", line 502, in _getSacks
    self.repos.populateSack(which=repos)
  File "/usr/lib/python2.4/site-packages/yum/repos.py", line 260, in populateSack
    sack.populate(repo, mdtype, callback, cacheonly)
  File "/usr/lib/python2.4/site-packages/yum/yumRepo.py", line 168, in populate
    if self._check_db_version(repo, mydbtype):
  File "/usr/lib/python2.4/site-packages/yum/yumRepo.py", line 226, in _check_db_version
    return repo._check_db_version(mdtype)
  File "/usr/lib/python2.4/site-packages/yum/yumRepo.py", line 1226, in _check_db_version
    repoXML = self.repoXML
  File "/usr/lib/python2.4/site-packages/yum/yumRepo.py", line 1399, in 
    repoXML = property(fget=lambda self: self._getRepoXML(),
  File "/usr/lib/python2.4/site-packages/yum/yumRepo.py", line 1391, in _getRepoXML
    self._loadRepoXML(text=self)
  File "/usr/lib/python2.4/site-packages/yum/yumRepo.py", line 1381, in _loadRepoXML
    return self._groupLoadRepoXML(text, ["primary"])
  File "/usr/lib/python2.4/site-packages/yum/yumRepo.py", line 1365, in _groupLoadRepoXML
    if self._commonLoadRepoXML(text):
  File "/usr/lib/python2.4/site-packages/yum/yumRepo.py", line 1201, in _commonLoadRepoXML
    result = self._getFileRepoXML(local, text)
  File "/usr/lib/python2.4/site-packages/yum/yumRepo.py", line 974, in _getFileRepoXML
    cache=self.http_caching == 'all')
  File "/usr/lib/python2.4/site-packages/yum/yumRepo.py", line 811, in _getFile
    http_headers=headers,
  File "/usr/lib/python2.4/site-packages/urlgrabber/mirror.py", line 412, in urlgrab
    return self._mirror_try(func, url, kw)
  File "/usr/lib/python2.4/site-packages/urlgrabber/mirror.py", line 398, in _mirror_try
    return func_ref( *(fullurl,), **kwargs )
  File "/usr/lib/python2.4/site-packages/urlgrabber/grabber.py", line 936, in urlgrab
    return self._retry(opts, retryfunc, url, filename)
  File "/usr/lib/python2.4/site-packages/urlgrabber/grabber.py", line 854, in _retry
    r = apply(func, (opts,) + args, {})
  File "/usr/lib/python2.4/site-packages/urlgrabber/grabber.py", line 922, in retryfunc
    fo = URLGrabberFileObject(url, filename, opts)
  File "/usr/lib/python2.4/site-packages/urlgrabber/grabber.py", line 1010, in __init__
    self._do_open()
  File "/usr/lib/python2.4/site-packages/urlgrabber/grabber.py", line 1093, in _do_open
    fo, hdr = self._make_request(req, opener)
  File "/usr/lib/python2.4/site-packages/urlgrabber/grabber.py", line 1202, in _make_request
    fo = opener.open(req)
  File "/usr/lib64/python2.4/urllib2.py", line 358, in open
    response = self._open(req, data)
  File "/usr/lib64/python2.4/urllib2.py", line 376, in _open
    '_open', req)
  File "/usr/lib64/python2.4/urllib2.py", line 337, in _call_chain
    result = func(*args)
  File "/usr/lib64/python2.4/site-packages/M2Crypto/m2urllib2.py", line 82, in https_open
    h.request(req.get_method(), req.get_selector(), req.data, headers)
  File "/usr/lib64/python2.4/httplib.py", line 810, in request
    self._send_request(method, url, body, headers)
  File "/usr/lib64/python2.4/httplib.py", line 833, in _send_request
    self.endheaders()
  File "/usr/lib64/python2.4/httplib.py", line 804, in endheaders
    self._send_output()
  File "/usr/lib64/python2.4/httplib.py", line 685, in _send_output
    self.send(msg)
  File "/usr/lib64/python2.4/httplib.py", line 652, in send
    self.connect()
  File "/usr/lib64/python2.4/site-packages/M2Crypto/httpslib.py", line 55, in connect
    sock.connect((self.host, self.port))
  File "/usr/lib64/python2.4/site-packages/M2Crypto/SSL/Connection.py", line 174, in connect
    ret = self.connect_ssl()
  File "/usr/lib64/python2.4/site-packages/M2Crypto/SSL/Connection.py", line 167, in connect_ssl
    return m2.ssl_connect(self.ssl, self._timeout)
M2Crypto.SSL.SSLError: tlsv1 alert protocol version

 

 

repo 등록돼있는 URL중 지원하지않는 centos5의 ssl 버전때문이다.

설치해야하는 레포때문에 문제가 나는거라면 ssl 새로 설치해서 yum을 새로 설치한 ssl을 참조하도록 하거나(당연히 yum을 컴파일 설치해야함)

설치에 필요하지 않는 레포때문에 문제가 나는거라면 그냥 그 레포 삭제해버리면 된다.
ㄴ나는 dell 레포때문에 문제가 났었는데 dell 레포 필요하지 않아서 삭제해버림

'job > linux' 카테고리의 다른 글

sysdig 로 해킹당한 서버 분석해보기  (0) 2019.06.20
서버 점검..  (0) 2019.06.11
nodejs npm , socket.io 설치  (0) 2019.04.10
ionice  (1) 2019.04.09
strace debug  (0) 2019.02.21

scrtipt_dist]# ansible-playbook dist.yml

PLAY [all] ******************************************************************************************************************************************************************

TASK [Gathering Facts] ******************************************************************************************************************************************************
fatal: [서버 아이피 ]: FAILED! => {"changed": false, "module_stderr": "Shared connection to 서버 아이피closed.\r\n", "module_stdout": "  File \"/root/.ansible/tmp/ansible-tmp-1556259206.06-242213350336107/AnsiballZ_setup.py\", line 39\r\n    with open(module, 'wb') as f:\r\n            ^\r\nSyntaxError: invalid syntax\r\n", "msg": "MODULE FAILURE\nSee stdout/stderr for the exact error", "rc": 1}
        to retry, use: --limit @/root/ansible/scrtipt_dist/dist.retry

PLAY RECAP ******************************************************************************************************************************************************************
1.234.83.50                : ok=0    changed=0    unreachable=0    failed=1    skipped=0  

 

 

위와같은 에러가 발생

 

원인은 파이썬 버전이 낮아서 그렇다고 한다.

엔서블 2.4 버전부터는 파이썬 2.4/2.5 버전에 대한 지원을 하지 않는다고 한다. 따라서 파이썬 2.6버전 이상으로 올려야 된다.

 

위의 내용까지가 구글링하면 깃헙이나 스택오버플로우에 나왔던 내용이다... 한글문서로도 있었고...

근데 클라이언트의 파이썬 버전까지 맞춰야하는줄은 몰랐다.

 

엔써블 처음 접할 때 클라이언트는 ssh 접속만 되면 된다했건만... 여튼...

클라이언트(cent5버전)에 yum 으로 파이썬 2.6 설치(기존 파이썬은 냅두고...)후

엔써블 옵션을 ansible_python_interpreter=/usr/bin/python2.6 추가하였더니 잘 된다.

'job > ansible' 카테고리의 다른 글

ansible 공부한 모듈들 정리  (0) 2019.05.02
ansible - 디렉토리 구조  (0) 2019.05.02
ansible-3 playbook  (0) 2019.04.25
ansible-2 hosts(그룹), 멱등성  (0) 2019.04.22
ansible-1  (0) 2019.04.10

playbook 이란

각본이라고 나오는데 작업계획서 ??같은거다.

예를들어 서버에 apache를 설치할 때

1.아파치를 다운로드 받고

2.압축풀고

3.소스설치하고 등등

작업들을 나열한 파일(이름.yml)을 플레이북이라 하고 playbook에 입력돼있는 모듈, 작업들을 순차적으로 진행한다.

yaml로 짜여져있어서 첫줄에는 --- 을 적어야한다.

 

그리고 -name: 작업이름을 적어준다. 여기서 : 이거 뒤에 스페이스로 한칸 뛰어야한다. 야믈 문법은 계속 공부하면서 읶혀야할듯

##name은 필수가 아니다. 다만 무조건 적는 습관을 들이자. playbook 실행시 어느 구간이 작업되고 있는지 확인할 수 있고 다른사람이 볼때도 쉽게 알아야 하니까.

 

 

아래는 /root/test.txt 라는 파일을 /root/test.txt_ori로 옮기고(만약 /root/test.txt가 없을경우는 무시)

/root/ansible/template/test.j2를 /root/test.txt로 업로드하는 플레이북이다.

 

--- ## 첫줄은 무조건 --- 적어줘야한다. yml 명시
- hosts: all ## 작업 대상은 /etc/ansible/hosts에 적혀있는 모든 서버들, : 땡땡 뒤에는 므조건 스페이스로 한칸 띄어줘야 한다. 
  remote_user: root  ##맨앞에는 스페이스로 두칸 띄어주고
  tasks: ##마찬가지로 여기도 맨앞에는 스페이스로 두칸 띄어주고
  - name: centos 5 version mv test.txt test.txt_ori   
    shell: bash -c 'mv /root/test.txt /root/test.txt_ori'   ###이번에는 4칸. 들여쓰기 해줘야됨. / root/test.txt 라는 파일을 /root/test.txt_ori로 옮긴다.
    when: ansible_distribution == "CentOS" and ansible_distribution_major_version == '6' ###서버 os가 centos 6버전일때만
    ignore_errors: True ###/root/test.txt 가 서버에 없으면 에러발생하고 그다음작업 진행을 안한다. ignore_errors:True 해야지 /root/test.txt 가 없어도 무시하고 다음작업을 진행한다.
  - name: centos 5 version new test.txt upload | Template test.txt
    template: src="/root/ansible/template/test.j2" dest="/root/test.txt" force=yes owner=root group=root mode="0644" ##test.txt 새로 업로드

'job > ansible' 카테고리의 다른 글

ansible - 디렉토리 구조  (0) 2019.05.02
ansible- error  (0) 2019.04.26
ansible-2 hosts(그룹), 멱등성  (0) 2019.04.22
ansible-1  (0) 2019.04.10
ansible 공부  (0) 2018.10.10

그룹관리

/etc/ansible/group_vars 하위에다가 그룹-그룹 그룹-변수 지정도 가능하다.

ansible]# cat /etc/ansible/hosts              
[nginx]
1.1.1.1         ansible_user=root       ansible_ssh_pass='qlqjs'
[apache]
2.2.2.2         ansible_user=root       ansible_ssh_pass='qlqjs'

파일 내용은 위와같고

ansible]# ansible all -m shell -a "df -h" --list-hosts
  hosts (2):
    1.1.1.1 
    2.2.2.2

 

ansible]# ansible nginx -m shell -a "df -h"   
1.1.1.1 | CHANGED | rc=0 >>
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3       235G   37G  187G  17% /
tmpfs           3.9G     0  3.9G   0% /dev/shm
/dev/sda1       200M  120M   70M  64% /boot

 

ansible]# ansible all -m shell -a "df -h"     
2.2.2.2 | FAILED | rc=-1 >>
Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this.  Please add this host's fingerprint to your known_hosts file to manage this host.

1.1.1.1 | CHANGED | rc=0 >>
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3       235G   37G  187G  17% /
tmpfs           3.9G     0  3.9G   0% /dev/shm
/dev/sda1       200M  120M   70M  64% /boot

 

##
-m 옵션은 어떤 모듈을 선택할지..

yum, service, shell등 많다. -m 옵션의 기본값은 shell 이다. 다만 남들이 좀 더 보기 편하게 shell도 써주기

다만 위 명령들은 ansible 단일명령? 뭐 그런느낌이다. 에드혹이라고 하는듯. 대부분 플레이북을 이용해 사용한다.

-------여기까지가 가장 기본적인 ansible 사용법------------

 

----멱등성-----

엔서블하면 멱등성이 꼭 나온다.
멱등성이란 연산을 여러번 적용해도 결과가 달라지지 않는 성질인데 엔서블이 멱등성을 지원한다.
난 이부분이 처음에 굉장히 헷갈렸다. 도대체 어떻게 무조건 값이 같을 수 있지 ??근데 최대한 멱등성을 지원하려고 노력한다는거지(대부분의 모듈들이) 멱등성을 지원하지 않을수도 있다. 

여튼.. 멱등성이 뭔지 예를들자면 lineinfile 이란 모듈이 있다. 이 모듈은 echo "문구" >> 파일.txt 와 같이 파일에 내용을 추가하는 모듈인데...ansible -m lineinfile "path=test.txt line=test11" 이런식으로 애드혹를 입력할경우 test.txt 하단에 test11이라는 구문이 추가된다.  근데 사람이 실수로 ansible -m lineinfile "path=test.txt line=test11" 이런 명령어를 두번 넣었을경우 lineinfile은 멱등성을 지원하기 때문에 해당 파일에 test11 이 두줄 추가 되지 않고 한줄만 추가된다. 

반대로 shell 이라는 모듈을 통해 입력을 하면 당연히 test11이 두줄 추가 돼겠지. 이경우는 멱등성이 지원되지 않은거다.

'job > ansible' 카테고리의 다른 글

ansible - 디렉토리 구조  (0) 2019.05.02
ansible- error  (0) 2019.04.26
ansible-3 playbook  (0) 2019.04.25
ansible-1  (0) 2019.04.10
ansible 공부  (0) 2018.10.10

innodb 의 경우 instert 속도가 myisam에 비해 느리다.

 

이경우 여러가지 튜닝을 할 수 있는데 대표적인것만 몇개 수정, 비교 해보려고 한다.

1.innodb_flush_log_at_trx_commit 를 0으로 변경하면 속도를 많이 올릴 수 있다고 한다.
innodb_flush_log_at_trx_commit 란...
https://dev.mysql.com/doc/refman/8.0/en/innodb-parameters.html

 

MySQL :: MySQL 8.0 Reference Manual :: 15.13 InnoDB Startup Options and System Variables

MySQL 8.0 Reference Manual  /  The InnoDB Storage Engine  /  InnoDB Startup Options and System Variables 15.13 InnoDB Startup Options and System Variables System variables that are true or false can be enabled at server startup by naming them, or disabled

dev.mysql.com

요약하자면

innodb_flush_log_at_trx_commit 이란 쿼리 요청이 디스크에 저장되는 방법이 지정된 변수이다. 즉 이 값을 변경하면 트랜잭션 방법을 수정해서 insert 속도를 올릴 수 있따.

##트랜잭션, commit이란

먼저 DB에서의 트랜잭션이란 정상적으로 완료된 일련의 작업들이라고 생각하면된다. 예를들어 insert , update , delete가 순차적으로 일어나고 그후 commit을 하게되면 트랜잭션이 정상적으로 완료됐다할 수 있다. 즉 commit이란 저장되지 않은(메모리에 적혀있는)데이터를 디비에 저장 후 트랜잭션을 종료한다.

 

innodb_flush_log_at_trx_commit  값이 디폴트일때의 과정(즉 1일 때)은 아래 처럼 진행된다.

쿼리 하나당 [log buffer(메모리 영역)를 거쳐서 >os buffer/cache(메모리 영역)를 거쳐서  > 마지막으로 ib_logfile(디스크영역)에 저장(flush) 된다.] 즉 1회 요청당 1회 commit - 한번의 요청때마다 매번 commit을 진행한다. - (요게 핵심임)


0 또는 2로 바꾼다면 저 과정이 간략해진다.

innodb_flush_log_at_trx_commit  =0
쿼리 하나당 [log buffer(메모리 영역)저장]하고 1초에 한번씩 나머지 commit을 수행(os buffer/cache(메모리 영역)를 거쳐서  > 마지막으로 ib_logfile(디스크영역)에 저장(flush)])

innodb_flush_log_at_trx_commit  = 2

쿼리 하나당 [log buffer(메모리 영역)를 거쳐서 >os buffer/cache(메모리 영역)에 저장] 후 1초에 한번씩 나머지 commit을 수행ib_logfile(디스크영역)에 저장(flush)])

 

즉 0과 2의 차이는 쿼리하나당 log buffer까지 저장하느냐 os buffer/cache 까지 저장하느냐의 차이임

 

(혹시 이글을 읽으시는 분들중 틀린 내용이 있다면 제발 코멘트 부탁드립니다. 구글링하면서 다른 내용이 적잖이 보여서 사실 저도 좀 헷갈립니다.)

 

이론적으로 보면 속도 순서는 0 - 2 -1 순으로 빨라야 한다. 

비교를 해보자.

파일용량(각각 실 사용 데이터) 0일때 1일때 2일때
12GB 45분 60분 50분
10GB 40분 50분 45분
15GB 65분 80분 65분
18GB 75분 95분 75분
14GB 테스트 안함 75분 60분
19GB 테스트 안함 105분 85분
19GB 테스트 안함 105분 85분

0이랑 2랑 거의 비슷하고(0이쫌더 빠르긴함) 확실히 1로 줬을때보단 빠르긴 한듯합니다. 용량 작으면 그냥 하고 용량 크면 데이터 유실될 가능성이 좀 더 적은 2로 주고 하는게 좋겠네요. 

 

 

2.innodb buffer pool size 

아마 이게 가장 대표적이고 또 확실히 눈에 보이게 성능 향상이 이루어질걸로 판단한다.

극단적으로 보기위해 기존에는 디폴트 값(128MB)과 서버 메모리(32GB)에 맞게끔 변경해서 비교했는데

7GB 짜리 덤프파일 복원 하는데 3시간 쫌 넘게 걸렸고
real    187m17.825s 
user    2m21.802s 
sys     0m6.869s

 

이번에는 innodb buffer pool size = 20GB로 변경하고 .sql 용량 =8GB 짜리 복원시(키 버퍼랑 등등 추가로 알맞게 진행)

real    40m44.386s
user    2m21.319s
sys     0m8.349s

역시... innodb buffer pool size 는 튜닝 필수다.

 

 

내용 요약.

1.innodb buffer pool size 수정은 필수(그에따른 키 버퍼나 솔트 버퍼등도 구글링해서 알맞게 수정)

2.용량이 큰 dump파일 복원시 innodb_flush_log_at_trx_commit 는 2로 변경
ㄴ실제 사용시 상황에 맞게(안전성이냐 속도냐) 1또는 2로 사용

'job > mysql' 카테고리의 다른 글

mysql log file size error  (0) 2019.06.26
mysql replication relay log relay-bin.999999 bug  (0) 2019.05.03
mysql 대용량 DB 백업 구성  (0) 2019.04.09
mysql dead lock 확인하기  (0) 2019.01.24
mysql innodb buffer pool size  (0) 2019.01.24

엔서블 특징

1.에이전트 설치 필요없음 - 이게 제일 장점인듯 호스트서버에만 엔서블 설치하면되니까
ㄴ다만 클라이언트에도 2.6 이상의 파이썬이 설치돼있어야한다. centos5 버전은 파이썬2.4 설치돼있어서 중복으로 설치해야함
2.yaml 로 저장돼있어서 많은 사람들(운영, 관리, 개발팀등)이 쉽게 알아볼 수 있음
3.대부분의 OS에 사용가능(윈도우도 가능하고 네트워크 장비들까지도 됨)
4.멱등성
5.모듈 많음
6.쉬움
7.오픈소스

 

 

엔서블 vi 탭을 띄어쓰기 2개로 변경하는법

- vi 에서 yaml 작성할때 탭으로 가능하도록 설정

$HOME/.vimrc 파일안에 아래 입력 .vimrc 파일 없으면 만들어주면 된다.
autocmd FileType yaml setlocal ai ts=2 sw=2 et

'job > ansible' 카테고리의 다른 글

ansible - 디렉토리 구조  (0) 2019.05.02
ansible- error  (0) 2019.04.26
ansible-3 playbook  (0) 2019.04.25
ansible-2 hosts(그룹), 멱등성  (0) 2019.04.22
ansible 공부  (0) 2018.10.10

yum install -y nodejs 한 다음 yum install -y npm 하면 npm 패키지 설치하면서 기존에 설치된 nodejs 패키지랑 충돌나서 npm 설치가 안됨

 

  file /usr/lib/node_modules/npm/node_modules/ini from install of npm-1.3.6-5.el6.noarch conflicts with file from package nodejs-2:9.11.2-1nodesource.x86_64
  file /usr/lib/node_modules/npm/node_modules/init-package-json from install of npm-1.3.6-5.el6.noarch conflicts with file from package nodejs-2:9.11.2-1nodesource.x86_64
  file /usr/lib/node_modules/npm/node_modules/lockfile from install of npm-1.3.6-5.el6.noarch conflicts with file from package nodejs-2:9.11.2-1nodesource.x86_64
  file /usr/lib/node_modules/npm/node_modules/npm-user-validate from install of npm-1.3.6-5.el6.noarch conflicts with file from package nodejs-2:9.11.2-1nodesource.x86_64
  file /usr/lib/node_modules/npm/node_modules/once from install of npm-1.3.6-5.el6.noarch conflicts with file from package nodejs-2:9.11.2-1nodesource.x86_64
  file /usr/lib/node_modules/npm/node_modules/opener from install of npm-1.3.6-5.el6.noarch conflicts with file from package nodejs-2:9.11.2-1nodesource.x86_64
  file /usr/lib/node_modules/npm/node_modules/read from install of npm-1.3.6-5.el6.noarch conflicts with file from package nodejs-2:9.11.2-1nodesource.x86_64
  file /usr/lib/node_modules/npm/node_modules/sha from install of npm-1.3.6-5.el6.noarch conflicts with file from package nodejs-2:9.11.2-1nodesource.x86_64

 

  file /usr/lib/node_modules/npm/node_modules/retry conflicts between attempted installs of npm-1.3.6-5.el6.noarch and nodejs-2:9.11.2-1nodesource.x86_64
  file /usr/lib/node_modules/npm/node_modules/rimraf conflicts between attempted installs of npm-1.3.6-5.el6.noarch and nodejs-2:9.11.2-1nodesource.x86_64
  file /usr/lib/node_modules/npm/node_modules/semver conflicts between attempted installs of npm-1.3.6-5.el6.noarch and nodejs-2:9.11.2-1nodesource.x86_64
  file /usr/lib/node_modules/npm/node_modules/sha conflicts between attempted installs of npm-1.3.6-5.el6.noarch and nodejs-2:9.11.2-1nodesource.x86_64
  file /usr/lib/node_modules/npm/node_modules/slide conflicts between attempted installs of npm-1.3.6-5.el6.noarch and nodejs-2:9.11.2-1nodesource.x86_64
  file /usr/lib/node_modules/npm/node_modules/tar conflicts between attempted installs of npm-1.3.6-5.el6.noarch and nodejs-2:9.11.2-1nodesource.x86_64
  file /usr/lib/node_modules/npm/node_modules/uid-number conflicts between attempted installs of npm-1.3.6-5.el6.noarch and nodejs-2:9.11.2-1nodesource.x86_64
  file /usr/lib/node_modules/npm/node_modules/which conflicts between attempted installs of npm-1.3.6-5.el6.noarch and nodejs-2:9.11.2-1nodesource.x86_64
  file /usr/lib/node_modules/npm/package.json conflicts between attempted installs of npm-1.3.6-5.el6.noarch and nodejs-2:9.11.2-1nodesource.x86_64

 

이런식으로 충돌납니다. 위와같이 충돌나면 rpm -qa | grep node 해서 나온거 삭제해주고

 

npm 패키지 안에 nodejs 도 들어있으니까 nodejs 설치할필요없이 npm만 yum으로 설치해주면 됨

 

 

그다음 npm install socket.io 하면 

npm http GET https://registry.npmjs.org/socket.io
npm http GET https://registry.npmjs.org/socket.io

npm ERR! Error: CERT_UNTRUSTED
npm ERR!     at SecurePair. (tls.js:1370:32)
npm ERR!     at SecurePair.EventEmitter.emit (events.js:92:17)
npm ERR!     at SecurePair.maybeInitFinished (tls.js:982:10)
npm ERR!     at CleartextStream.read [as _read] (tls.js:469:13)
npm ERR!     at CleartextStream.Readable.read (_stream_readable.js:320:10)ㄴ

 

이런식으로 에러 난다.

 

https 인증 어쩌구 저쩌구 하는데 

npm config set strict-ssl false

인증 우회 하고 다시 npm install socket.io 설치하면 

/usr/lib/node_modules/socket.io/usr/lib/node_modules/socket.io]# pwd 
/usr/lib/node_modules/
socket.io

 

 

/usr/lib/node_modules/socket.io]# ll
total 48
drwxr-xr-x 2 root root  4096 2019-04-10 09:50 lib
drwxr-xr-x 8 root root  4096 2019-04-10 09:50 node_modules
-rw-r--r-- 1 root root 18733 2019-04-10 09:50 package.json
-rw-r--r-- 1 root root 16588 1985-10-26 17:15 Readme.md

 

잘 설치됐다.

'job > linux' 카테고리의 다른 글

서버 점검..  (0) 2019.06.11
centos 5 yum error  (0) 2019.04.29
ionice  (1) 2019.04.09
strace debug  (0) 2019.02.21
php-fpm 메모리 사용률 확인하고 튜닝하기  (2) 2019.02.20

ionice란...

 

말그대로 io 우선순위 정하는거인데

 

나같은경우는 백업시 실 서비스에 영향을 주지 않게하기위해서 우선순위를 가장 마지막으로 하기 위해 ionice란 명령어를 사용한다.

 

보통 ionice -c2 -n 7 옵션으로 사용하는데

 

-n 옵션은 우선순위를 0~7 까지 지정한다. 7이 제일 꼴찌 0이 가장 우선


0 for none, 1 for realtime, 2 for best-effort, 3 for idle.

위와같이 설명 돼 있다.

 

 

0은 말그대로 none  스케쥴링을 없게끔 하는듯 하고...

1 rt(real time)는 우선순위를 지정할 순 있는데 rt가 best-effort보다 우선이다. 즉 best-effort 보다 rt가 우선순위가 더 빠르고 rt중에서도 우선순위를 정할 수 있다.

 

2 는 best-effort 로 
이것은 특정 io 우선 순위를 요구하지 않은 프로세스에 대한 효과적인 스케줄링 클래스다. 이 세분류는 0-7에서 우선 순위 논쟁을 하며, 낮은 숫자는 우선 순위가 더 높다. 동일한 최상의 작업 우선순위로 실행하는 프로그램은 라운드 로빈 방식으로 제공된다.
번역기 돌리면 위와같다. 

-n 옵션을 사용하기위해서는 -c2 로 설정해야하는듯 하다. 그래야 0~7까지 분류를 하니까

 

마지막으로 3은 idle 다른 작업이 없을때 실행한다는 뜻이다.

 

idle로 하면 아마도 디스크가 아무것도 사용이 안될때만 실행하는듯하고...

 

1(rt)은 우선순위를 높게 정할때 사용해야할듯, 너무 우선순위가 높아버리면 또 문제가 있으려나. 2(best effort)로 하고 우선순위를 0으로 정해주는게 좋을듯도 싶다.

 

나는 우선순위를 늦추는게 목적이니 2(best effort)로하고 우선순위도 7로 지정

'job > linux' 카테고리의 다른 글

centos 5 yum error  (0) 2019.04.29
nodejs npm , socket.io 설치  (0) 2019.04.10
strace debug  (0) 2019.02.21
php-fpm 메모리 사용률 확인하고 튜닝하기  (2) 2019.02.20
geoip iptables 설치  (2) 2019.02.15

master 서버 1대/ slave 서버 3대 리플리케이션 구성

CPU : E5-2620 v3 @ 2.40GHz, 24core / RAM : 96GB 4대 모두 동일사양 / 디비 용량 1.1TB / 테이블 약 220개, 그중 용량 큰 테이블은 약 40개정도(개당 10~40GB)

사양은 4대 모두 동일

 

 

관리 방법 정리
1.mysqldump
장점 : 간편하다.. 가장 기본적인 방법
(디비 용량이 작다면 심플하게 table 단위로 mysqldump 백업이 가장 좋다고 본다.)

단점 : 백업 시간이 오래걸리고 복원하는데도 오래걸린다. 

약 500GB 테이블단위로 백업하는데 약 2시간 30분 걸리고 377GB로 백업됨


1-1.mysqldump후 .sql 파일을 한번더 tar로 압축하여 보관

약 20GB 짜리 덤프파일 하나를 tar -cvzf 로 압축할경우 약 2.6GB로 압축됨, 압축하는데 걸리는 시간은 8분~8분30초

약 40GB 짜리 덤프파일 하나를 tar -cvzf 로 압축할경우 약 5.7GB로 압축됨, 압축하는데 걸리는 시간은 약 25분소요
ㄴ이 파일 압축 푸는데 걸리는 시간은 약 10분인데 400기가 데이터 날리면 약 100분동안 압축 푸는시간 날리는거

 

장점 : 용량을 많이 줄일 수 있으니까(상황에 따라 다르겠지만 실 데이터에 약 8분의1정도 압축됨) 그만큼 보관 주기도 길게 잡을 수 있다.

단점 : 백업하고 복원하는데 시간 더럽게 오래 걸린다.용량 큰 디비에 이거 하나만 가지고 운영하는건 거의 도라이짓임(누가 디비를 잘못 삭제해서 장애 한번나면... 복원하는데 시간 더럽게 오래걸림)

 

 

2.xtrabackup

장점 : 속도가 빠르다. 증분백업도 된다.
단점 : 용량이 크다. 추가로 설치해야한다.(ibdata나 디렉토리등 데이터를 복사하는 방식이라 실제 데이터와 용량이 거의 같다. 즉 1TB짜리 실 데이터 백업하려면 1TB가 필요, 증분 백업이 가능하기에 어느정도 커버 가능하다본다.)

 

 

xtrabackup

500GB 백업하는데 약 2시간 40분
덤브백업하는데 
real    165m33.431s
user    77m40.210s
sys     8m34.757s

 

netstat -nlp 하면 가끔가다가 멈췄다가? 지연된건가 ? 하여튼 동영상 보면 알겠찌만 저런 서버들이 간혹있다.


동영상 처음올려보는데 뭔가 되게 더럽다 이상하게. 하여튼 보면 알겠지만
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      2983/sshd           

여기서 한번

tcp        0      0 :::22                       :::*                        LISTEN      2983/sshd           

여기서 한번 멈춘다.


이 다음껄 불러오는데 느려지는건가 아니면 저 ssh 를 불러오고난뒤?(혹은 불러오는과정이라 봐도 되나 ?)에서 느려지는건지 알아볼꺼다. strace를 이용해서 한번 찾아보자.


strace란     ##https://brunch.co.kr/@alden/12

시스템콜 시그널등을 추적하는 디버깅 툴

시스템콜이란    ##https://luckyyowu.tistory.com/133

커널단의기능을 사용자(os)가 사용할 수있게 해준다.


시그널이란   ##http://blog.naver.com/PostView.nhn?blogId=guy2648&logNo=10103891030

프로세스 구동중 예외상황(ex 컨트롤 씨로 멈춘다던가)에 발생하는 신호


주요 옵션이나 사용법등은 저기 위에 브런치 사이트에 다 있으니까 생략

-c 옵션 줘서 내용 보면

% time     seconds  usecs/call     calls    errors syscall

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

 99.97    8.969419        2159      4154       377 read


리드하면서 시간도 오래걸리고 에러도 난다.



우선 netestat 명령어에 사용되는 C 함수들이 뭐뭐 있는지

~]# cat strace_netstat2  | awk '{print $3}' | awk -F "(" '{print $1}' | sort | uniq -c | sort -n

      1 +++

      1 access 파일 존재나 접근 권한을 확인

      1 arch_prctl

      1 execve 다른프로그램을 실행

      1 exit_group 프로세스 내의 모든 스레드 끝내기

      1 fcntl 파일을 전체나 파일의 일부를 다른 프로세스에서 사용하는 것을 제한

      1 statfs 파일시스템 정보 

      3 brk 데이터 세그먼트의 영역을 넓혀준다.

      7 mprotect 주어진 메모리 영역의 권한을 변경

      9 munmap 메모리 맵핑 제거

     13 fstat 열린 파일의 상태 및 정보 보기

     15 write 말그대로 write

     21 mmap 메모리매핑

   1082 close 말그대로 닫기

   1089 open 말그대로 열기

   1114 getdents 디렉토리 엔트리 불러오기

   1353 readlink 심볼릭링크된 파일을 읽기

   4308 read 일기



strace -s 65535 -f -t -o strace_netstat nestat -nlp



7127 12443 15:30:58 open("/proc/net/x25", O_RDONLY) = -1 ENOENT (No such file or directory)

7128 12443 15:30:58 open("/proc/net/nr", O_RDONLY) = -1 ENOENT (No such file or directory)

7129 12443 15:30:58 exit_group(0)            = ?

7130 12443 15:30:58 +++ exited with 0 +++


겁내 길다 하지만 진득하게 해보자


첫줄부터


   1 12443 15:30:53 execve("/bin/netstat", ["netstat", "-nlp"], [/* 23 vars */]) = 0

   2 12443 15:30:53 brk(0)                   = 0x1994000

   3 12443 15:30:53 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fc359886000

   4 12443 15:30:53 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)

   5 12443 15:30:53 open("/etc/ld.so.cache", O_RDONLY) = 3

   6 12443 15:30:53 fstat(3, {st_mode=S_IFREG|0644, st_size=30677, ...}) = 0


맨앞에필드는 12443는 PID다. netstat -nlp 입력했을 때의 PID 

[root@test ~]# ps -ef | grep netstat

root      9157 12279 23 14:30 pts/4    00:00:00 strace -s 65535 -f -t -o strace_netstat2 netstat -nlp

root      12443  9157  8 14:30 pts/4    00:00:00 netstat -nlp


세번째부터가 이제 어떤 시스템콜(C 함수들)이 이용됐는지가 나온다. execve brk mmap access open fstat 등등 각 함수들마다 구글링해보면 다 뭐 나온다. 뭐 변수가 어쩌고 확장이 어쩌고 저쩌고 ... 하여튼

execve 함수는 다른 프로그램을 실행하고 자신은 종료한댄다. 즉 netstat 명령어를 실행하면 execve 함수로 netstat를 실행하는듯~?

brk는 데이터 세그먼트의 영역을 넓혀준다.  라고 한다.


뭐 netstat 가 어떤식으로 구동되는지까지 알필요는 없으니까... 느려지는 부분부터 한번 봐보자.


우선 netstat에 필요한 라이브러리들

~]# ldd /bin/netstat

        linux-vdso.so.1 =>  (0x00007ffc5d6f0000)

        libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f4021263000)

        libc.so.6 => /lib64/libc.so.6 (0x00007f4020ecf000)

        libdl.so.2 => /lib64/libdl.so.2 (0x00007f4020cca000)

        /lib64/ld-linux-x86-64.so.2 (0x0000562a176ac000)


   1 21682 14:52:28 execve("/bin/netstat", ["netstat", "-nlp"], [/* 24 vars */]) = 0

   2 21682 14:52:28 brk(0)                   = 0x1914000

   3 21682 14:52:28 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fc716503000

   4 21682 14:52:28 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)

   5 21682 14:52:28 open("/etc/ld.so.cache", O_RDONLY) = 3

   6 21682 14:52:28 fstat(3, {st_mode=S_IFREG|0644, st_size=30677, ...}) = 0

   7 21682 14:52:28 mmap(NULL, 30677, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fc7164fb000

   8 21682 14:52:28 close(3)                 = 0

   9 21682 14:52:28 open("/lib64/libselinux.so.1", O_RDONLY) = 3


ldd로 나온 라이브러리들 순서대로 불러온다. libselinux.so.1 부터 llibdl.so.2 


근데 보는것처럼 linux-vdso.so.1 이건 없다. 아마 4번째 라인에 노써치파일이 아마 이게 아닐까 ?

그리고 /lib64/ld-linux-x86-64.so.2 이것도 없다.  근데 이건 no such file  에러도 없다.  아유 어쨋든..


대충 1~50라인까지는 라이브러리 불러오는거고 60라인쯤부터 1800 라인까지는 centos 구동시 기본으로 실행되는 데몬들 open 한다.

root      1986     2  0  2018 ?        00:01:26 [edac-poller]

root      2156     2  0  2018 ?        00:00:00 [kipmi0]

root      2684     2  0  2018 ?        00:00:00 [jbd2/sda1-8]

root      2685     2  0  2018 ?        00:00:00 [ext4-dio-unwrit]

root      2717     2  0  2018 ?        00:00:00 [kauditd]

root      2893  1787  0  2018 ?        00:00:00 /sbin/udevd -d

root      2894  1787  0  2018 ?        00:00:00 /sbin/udevd -d

root      2898     2  0  2018 ?        00:10:10 [flush-8:0]

root      2963     1  0  2018 ?        00:01:01 /sbin/rsyslogd -i /var/run/syslogd.pid -c 5

root      2983     1  0  2018 ?        00:00:25 /usr/sbin/sshd

root      2997     1  0  2018 ?        00:00:00 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf

root      3009     1  0  2018 ?        00:01:46 crond

nobody    3278     1  0  2018 ?        00:03:04 /usr/local/checker/sbin/thttpd -C /usr/local/checker/etc/thttpd.conf

root      3561     1  0  2018 ?        00:34:50 /opt/apache/bin/httpd -k start

root      4103     1  0  2018 tty1     00:00:00 /sbin/mingetty /dev/tty1

root      4105     1  0  2018 tty2     00:00:00 /sbin/mingetty /dev/tty2

root      4107     1  0  2018 tty3     00:00:00 /sbin/mingetty /dev/tty3

root      4109     1  0  2018 tty4     00:00:00 /sbin/mingetty /dev/tty4

root      4111     1  0  2018 tty5     00:00:00 /sbin/mingetty /dev/tty5

root      4113     1  0  2018 tty6     00:00:00 /sbin/mingetty /dev/tty6

daemon   11230  3561 36 15:29 ?        00:02:33 /opt/apache/bin/httpd -k start

root     11938     1  0 15:30 ?        00:00:00 /usr/bin/python -Es /usr/bin/fail2ban-server -s /var/run/fail2ban/fail2ban.sock -p /var/run/fail2ban/fail2ban.pid -x -b

daemon   12878  3561 36 15:31 ?        00:01:42 /opt/apache/bin/httpd -k start

daemon   12900  3561 35 15:31 ?        00:01:37 /opt/apache/bin/httpd -k start

daemon   12902  3561 36 15:31 ?        00:01:42 /opt/apache/bin/httpd -k start

daemon   13409  3561 36 15:32 ?        00:01:24 /opt/apache/bin/httpd -k start

daemon   13411  3561 37 15:32 ?        00:01:26 /opt/apache/bin/httpd -k start


위와같이 실행돼있는 프로세스들중

root      2894  1787  0  2018 ?        00:00:00 /sbin/udevd -d

root      2898     2  0  2018 ?        00:10:10 [flush-8:0]

root      2963     1  0  2018 ?        00:01:01 /sbin/rsyslogd -i /var/run/syslogd.pid -c 5

root      2983     1  0  2018 ?        00:00:25 /usr/sbin/sshd

여기까지가 아마 os 구동시 기본으로 구동되는 데몬이라고 생각할 수 있을것같다.


strace 파일 보면

1992 12443 15:30:53 open("/proc/2983/attr/current", O_RDONLY) = 5

1993 12443 15:30:53 read(5, 0x19a53e0, 4095) = -1 EINVAL (Invalid argument)

1994 12443 15:30:53 close(5)                 = 0

1995 12443 15:30:53 readlink("/proc/2983/fd/4", "socket:[12960]", 29) = 14

1996 12443 15:30:53 open("/proc/2983/attr/current", O_RDONLY) = 5

1997 12443 15:30:53 read(5, 0x19a5440, 4095) = -1 EINVAL (Invalid argument)

1998 12443 15:30:53 close(5)                 = 0

1999 12443 15:30:53 getdents(4, /* 0 entries */, 32768) = 0

2000 12443 15:30:53 close(4)                 = 0

2001 12443 15:30:53 open("/proc/2997/fd", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 4

2002 12443 15:30:53 getdents(4, /* 3 entries */, 32768) = 72

2003 12443 15:30:53 readlink("/proc/2997/fd/3", "socket:[12989]", 29) = 14

2004 12443 15:30:53 open("/proc/2997/cmdline", O_RDONLY) = 5

2005 12443 15:30:53 read(5, "/usr/sbin/vsftpd\0/etc/vsftpd/vsftpd.conf\0", 511) = 41

2006 12443 15:30:53 close(5)                 = 0

2007 12443 15:30:53 open("/proc/2997/attr/current", O_RDONLY) = 5

이제 대충 어떤느낌인지 알겠다. 

netstat -nlp 하면 모든 프로세스들 불러오고 그중에 데몬 리스트를 pid랑 port랑 이런식으로 출력해주는거니까


1.netstat -nlp 입력시 netstat에 사용되는 라이브러리를 open mmap read close등을 진행 - 50라인쯤

2.OS에 올라와있는 모든 프로세스를 pid순으로 open/작업(getdents,read,readlink등)/close 진행 - 5400라인쯤

ㄴnetstat -nlp는 정보를 보는거니까 당연히 위와같은 디렉토리엔트리를 불러오거나 뭘 읽거나 하겠죠?

3.5400라인쯤부터 이제 netstat -nlp했을 때 나오는 문장들을 write 함수로 쓴다.

정확히는 12443 15:30:56 open("/proc/net/tcp6", O_RDONLY) = 3 이런식으로 /proc/net/tcp6 을 불러와서

12443 15:30:56 read(3, "  sl  local_address                         remote_address                        st tx_queue

위와같이 읽은다음 

12443 15:30:56 write(1, "tcp        0      0 :::5000                     :::*                        LISTEN      3278/thttpd         \n", 109) = 109

이렇게 실제로 write를 한다.



##########

여담

5392 12443 15:30:54 open("/usr/share/locale/locale.alias", O_RDONLY|O_CLOEXEC) = 3

5393 12443 15:30:54 fstat(3, {st_mode=S_IFREG|0644, st_size=2512, ...}) = 0

5394 12443 15:30:54 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fc359885000

5395 12443 15:30:54 read(3 어쩌구 저쩌구 /usr/share/locale/locale.alias 내용 나옴)

netstat -nlp 했는데 위 파일을 왜 열지 ? 궁금해서 이 파일 삭제하고서 netstat -nlp 실행해봤다.

1044 29673 16:02:34 open("/usr/share/locale/locale.alias", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)

1045 29673 16:02:34 open("/usr/share/locale/en_US.UTF-8/LC_MESSAGES/net-tools.mo", O_RDONLY) = -1 ENOENT (No such file or directory)

1046 29673 16:02:34 open("/usr/share/locale/en_US.utf8/LC_MESSAGES/net-tools.mo", O_RDONLY) = -1 ENOENT (No such file or directory)

1047 29673 16:02:34 open("/usr/share/locale/en_US/LC_MESSAGES/net-tools.mo", O_RDONLY) = -1 ENOENT (No such file or directory)

그냥 에러나고 끝이다. 실행도 잘된다. 근데 내가 에러를 못찾은거일수도있다. 하고자 하는 말이뭐냐면... 그냥 뭐랄까 별에 별파일을 다 쓰는구나. 함부로 지우지말자.

#######

4.그리고 exit_group 끝





자 이글의 목적인 netstat -nlp 시 왜 특정구간(sshd 데몬쪽)에서 느려지는건지 이제 이유가 보인다.


6270 12443 15:30:56 write(1, "tcp        0      0 :::5000                     :::*                        LISTEN      3278/thttpd         \n", 109) = 109

6271 12443 15:30:56 write(1, "tcp        0      0 :::81                       :::*                        LISTEN      3561/httpd          \n", 109) = 109

6272 12443 15:30:56 write(1, "tcp        0      0 :::22                       :::*                        LISTEN      2983/sshd           \n", 109) = 109

6273 12443 15:30:56 read(3, "00000000000000FFFF00006F7926DA:0051 0000000000000000FFFF00006F7926DA:B4EE 06 00000000:00000000 03:00000000 00000000     0        0 0 3 ffff880c74c5a940\n   6: 0000000000000000FFFF00

     006F7926DA:0051 0000000000000000FFFF00006F7926DA:CFA8 06 00000000:00000000 03:0000115F 00000000     0        0 0 3 ffff880939ba0580\n   7: 0000000000000000FFFF00006F7926DA:0051 0000000000000000FFFF00006F79

     26DA:D73A 06 00000000:00000000 03:000016E8 00000000     0        0 0 3 ffff880814409840\n   8: 0000000000000000FFFF00006F7926DA:0051 0000000000000000FFFF00006F7926DA:A626 06 00000000:00000000 03:00000000 0

     0000000     0        0 0 3 ffff880c76532440\n   9: 0000000000000000FFFF00006F7926DA:0051 0000000000000000FFFF00006F7926DA:A708 06 00000000:00000000 03:00000000 00000000     0        0 0 3 ffff88086fff6200\

     n  10: 0000000000000000FFFF00006F7926DA:0051 0000000000000000FFFF00006F7926DA:D7A6 06 00000000:00000000 03:00001730 00000000     0        0 0 3 ffff880927c64200\n  11: 0000000000000000FFFF00006F7926DA:0051

      0000000000000000FFFF00006F79", 1024) = 1024




이런식으로 6273 같은 라인이 진짜 어~~~마무시하게 read가 많이 이루어진다.

거의 800라인 가까이 위와같은 read작업이 이루어진다. 다른 정상인 서버들은 저러지 않는다. 저 read작업이 뭔지 알면되겠다.


5418 12443 15:30:54 read(3, "                         \n   6: 6F7926DA:C56A 6F7926DA:0051 06 00000000:00000000 03:00000B1B 00000000     0        0 0 3 

ffff8808728b24c0                                      \n   7: 6F7926DA:0050 9158E6C0:A773 06 00000000:00000000 03:00000000 00000000     0        0 0 3 

ffff88086f41e280                                      \n   8: 6F7926DA:0050 2158E6C0:     E732 06 00000000:00000000 03:00000000 00000000     0        0 0 3 

ffff880871e65dc0                                      \n   9: 6F7926DA:D3A8 6F7926DA:0051 06 00000000:00000000 03:00001533 00000000     0        0 0 3 

ffff880c77a5bdc0                                      \n  10: 6F7926DA:C4D6 6F7926DA:0051 06 00000000:00000000 03:00000AB8 00000000     0        0 0 3 

ffff880c751e3cc0                                      \n  11: 6F7926DA:0050 0158E6C0:92FB 06 00000000:00000000 03:00000000 00000000     0        0 0 3 

ffff88087048b580                                      \n  12: 6F7926DA:CF10 6F7926DA:0051 06 00000000:00000000 03:00001205 00000000     0        0 0 3 fff", 1024) = 1024


netstat -nlp 했을 때/proc/net/tcp /proc/net/tcp6 두 파일을 베이스로 netstat는 출력하는 명령어다. (자세한건 https://www.joinc.co.kr/w/Site/system_programing/proc/NetState)

/proc/net/tcp 는 tcp 정보를 아스키형태로 저장된 파일임

netstat -nlp 했을 때 출력되는건 TIME_WAIT이 배제된채로 출력되지만 실제로는 /proc/net/tcp 이거를 전부 read 하게 된다.  /proc/net/tcp여기에는 TIME_WAIT 관련 정보까지 전부 저장되기 때문에 TIME_WAIT이 많은 서버들에서 대체로 netstat -nlp 가 오래걸린다.


처음에는 sshd 명령어 이후에 딜레이 되니까 ssh쪽이 뭐 문제인가 아니면 thttpd를 불러오는데 뭐가 문제인가 싶었는데 완전 틀렸다.









'job > linux' 카테고리의 다른 글

nodejs npm , socket.io 설치  (0) 2019.04.10
ionice  (1) 2019.04.09
php-fpm 메모리 사용률 확인하고 튜닝하기  (2) 2019.02.20
geoip iptables 설치  (2) 2019.02.15
rsync를 통한 파일 전송시 속도 테스트  (0) 2018.12.06

php-fpm 메모리 누수, 사용률 확인하기


현재상황
서버 메모리 16GB

php memory limit 기본 설정(128MB)
ㄴ)메모리 리밋은 말그대로 php에서 어떤 작업을 할 때 사용할 수 있는 최대 메모리양이다. 

(예를들어 php를 통해 파일을 업로드할경우 메모리에 먼저 적재가 되기 때문에 memory_limit 값보다 높은파일은 업로드가 안됨)

pm.max_children = 50
ㄴphp-fpm의 자식프로세스 최대 갯수

pm.start_servers = 5

ㄴphp-fpm 실행하면 처음부터 실행돼잇는 자식 프로세스 갯수

pm.min_spare_servers = 5

pm.max_spare_servers = 35

ㄴmin/max값을 벗어나면 서버에서 최대한 저 값을 맞추려고 노력함


엔진엑스-php-fpm 사용중

 ~]# netstat -nlp

Active Internet connections (only servers)

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    

tcp        0      0 127.0.0.1:9000          0.0.0.0:*               LISTEN      6374/php-fpm: pool  

tcp        0      0 0.0.0.0:2221            0.0.0.0:*               LISTEN      3162/sshd           

tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      7420/nginx: master  



~]# sar -r | awk '{print $1"  "$5}'

12:00:01  %memused

12:10:02  48.52

12:20:01  49.46

12:30:01  50.59

12:40:01  51.56

12:50:01  52.74

중략

03:00:01  61.27

03:10:01  61.64

03:20:01  62.09

03:30:01  62.62

03:40:02  62.73

03:50:01  63.13

04:00:01  63.26

04:10:01  63.74

중략

09:10:01  78.38

09:20:01  78.95

09:30:01  79.87

09:40:01  80.27

09:50:01  81.05


[root@ ~]# ps -ef | grep php-fpm | wc -l

37


[root@ ~]# ps -aux | grep php-fpm | awk '{print $1"  " $6/1024" MB"}'

php-fpm  342.27 MB

php-fpm  340.383 MB

php-fpm  302.711 MB

php-fpm  284.441 MB

php-fpm  227.84 MB

php-fpm  227.137 MB

root  30.1016 MB

php-fpm  561.434 MB

php-fpm  562.66 MB

php-fpm  561.309 MB

php-fpm  561.824 MB

php-fpm  561.129 MB

php-fpm  561.129 MB

php-fpm  561.176 MB

php-fpm  562.145 MB

php-fpm  561.16 MB

php-fpm  558.332 MB

php-fpm  221.172 MB

php-fpm  213.012 MB

php-fpm  213.227 MB

php-fpm  212.008 MB

php-fpm  212.664 MB

php-fpm  212.996 MB

php-fpm  213.375 MB

php-fpm  207.363 MB

php-fpm  511.531 MB

php-fpm  509.504 MB

php-fpm  509.344 MB

root  0.953125 MB

php-fpm  182.289 MB

php-fpm  181.621 MB

php-fpm  181.457 MB

php-fpm  176.219 MB

php-fpm  175.359 MB

php-fpm  174.516 MB

php-fpm  172.77 MB

php-fpm  169.117 MB


]# php test.php

echo memory_get_usage(); 349976

echo memory_get_peak_usage(); 384968





현재상황은 위와같이

1.시간이 지날수록 메모리 점유율이 올라간다. 그러다 마지막에는 oom 발생
2.php-fpm 에서의 메모리 사용률이 너무 높다. 처음에는 100MB에서 200MB 300MB 지금처럼 500MB이상까지도 차다가 마지막에 oom 발생
3.php-fpm 자식프로세스의 갯수는 37개로 pm.max_children 수치에는 못미친다. 따라서 해당 설정의 수치를 변경한다해서 해결이되지 않는다. 

4.php 에서 사용한 최대 메모리가 1메가도 안된다. 

ㄴmemory_get_peak_usage(); 384968 바이트 단위임, 메가로 환산하면 0.4메가도 안됨


궁금한점

Q)1.php.ini 의 memory_limit 이랑 php-fpm.conf 의 memory_limit 설정은 같은거고 우선순위가 있는건가 ?? 아니면 다른개념인가 ?

A)같은개념이고 우선순위는 php-fpm.conf가 먼저.. 서버 / htaccess / 소스 순인것처럼 

해당 서버의 php에서 사용된 최대 메모리는 1메가도 안되니까 memory_limit은 튜닝할필요가 없는거고. 또 추가로 자잘자잘한 엄청 수많은 작업이 종료되지않고 계속 사용하고 있따고 봐야할듯


2.php-fpm의 자식프로세스가 사용하는 memory limit은 설정이 없나 ? 


3.php-fpm의 자식프로세스들은 어떡하다가 500MB 이상씩의 메모리를 사용하게 됐지 ? 이걸 확인하는 방법은 ?(누수인지 아닌지 확인하고싶다.)

ㄴphp-fpm 자식프로세스들의 PID를 엔진엑스 어세스 로그에 남겨보는방법 ?

ㄴ아니면 php-fpm status 볼 수 있는 툴이 있나 ?






이제부터 지금 상황이 정말 메모리 누수가 맞는지. 맞다면 왜 누수가 일어나는지 알아보자.

1.netstat -an | grep -v TIME_WAIT 했을 때 수상한거 없이 소켓잘 닫히고 있음.

2.keep alive 65로 설정돼있음



으악 생각보다 너무 쉽게 원인을 찾은것같다.
https://xetown.com/tips/1171902

php-fpm 자체가 기본설정시 메모리 사용 누적이랜다...;; 

나는 소스단에서 뭔가 잘못짜여져 있어서 메모리 누수가 있는줄알았는데.. 


일단 php-fpm 아무설정도 안하면 pm.max_requests 값은 무한대라서 메모리 누수가 계속 쌓이다. 따라서 pm.max_requests 500 으로 설정해주고 한번 지켜보자.


'job > linux' 카테고리의 다른 글

ionice  (1) 2019.04.09
strace debug  (0) 2019.02.21
geoip iptables 설치  (2) 2019.02.15
rsync를 통한 파일 전송시 속도 테스트  (0) 2018.12.06
hpssacli 설치했는데 잘 안됨  (1) 2018.12.05

기존에 geoip iptables 설치하려면



./geoip/xt_geoip_dl"


./geoip/xt_geoip_build GeoIPCountryWhois.csv"


이부분 진행했었는데 이중에서 ./geoip/xt_geoip_dl" 요거 이제 에러난다.


~/geoip/xtables-addons-1.47.1/geoip]# ./xt_geoip_dl  

--2019-02-15 10:45:49--  http://geolite.maxmind.com/download/geoip/database/GeoIPv6.csv.gz

Resolving geolite.maxmind.com... 104.16.37.47, 104.16.38.47, 2606:4700::6810:262f, ...

Connecting to geolite.maxmind.com|104.16.37.47|:80... connected.

HTTP request sent, awaiting response... 404 Not Found

2019-02-15 10:45:50 ERROR 404: Not Found.


--2019-02-15 10:45:50--  http://geolite.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip

Connecting to geolite.maxmind.com|104.16.37.47|:80... connected.

HTTP request sent, awaiting response... 404 Not Found

2019-02-15 10:45:50 ERROR 404: Not Found.


gzip: GeoIPv6.csv.gz: No such file or directory

unzip:  cannot find or open GeoIPCountryCSV.zip, GeoIPCountryCSV.zip.zip or GeoIPCountryCSV.zip.ZIP.




http://geolite.maxmind.com/download/geoip/database/GeoIPv6.csv.gz

http://geolite.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip


위 두 파일이 없다고 한다. 실제로 홈페이지 들어가보면 not found 뜬다. 파일이 없다.

http://geolite.maxmind.com/download/geoip/database/ 여기까지만 들어가보면 홈페이지가 바꼈다.

https://dev.maxmind.com/geoip/geoip2/geolite2/ 여기로 들어가진다.


geolite2가 나오면서 저 파일들도 없어지고 뭐 이것저것 한것같다.


그럼 어떡해야할까 우리는 설치하고싶은데 


http://geolite.maxmind.com/download/geoip/database/GeoIPv6.csv.gz

http://geolite.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip

위 두파일이 뭐로 대체됐는지 찾으면 되겠찌 ?

사실 가장 정확한 방법은 새로 변경된 geolite2 를 이용해 iptables에 적용을 해야하는데... 모르겠다. 어렵다


하여튼 다운로드 경로 들어가보면 아래 파일들이 보인다.


GeoLite2 City

GeoLite2 Country

GeoLite2 ASN (Autonomous System Number)


이중에서 시티는 말그대로 도시일꺼고 컨츄리는 나라일꺼고 ASN은 들어가보니까 sk 브로드밴드도 있고 kt도 있고한거보니까 통신사 넘버인듯


하여튼 GeoLite2 Country 이거 csv로 다운받는다.


-rw-r--r-- 1 root root 11734000 2019-02-13 07:08 GeoLite2-Country-Blocks-IPv4.csv

-rw-r--r-- 1 root root  3464092 2019-02-13 07:08 GeoLite2-Country-Blocks-IPv6.csv

-rw-r--r-- 1 root root     9864 2019-02-13 07:08 GeoLite2-Country-Locations-de.csv

-rw-r--r-- 1 root root     9937 2019-02-13 07:08 GeoLite2-Country-Locations-en.csv

-rw-r--r-- 1 root root     9992 2019-02-13 07:08 GeoLite2-Country-Locations-es.csv

-rw-r--r-- 1 root root    10230 2019-02-13 07:08 GeoLite2-Country-Locations-fr.csv

-rw-r--r-- 1 root root    14998 2019-02-13 07:08 GeoLite2-Country-Locations-ja.csv

-rw-r--r-- 1 root root    11422 2019-02-13 07:08 GeoLite2-Country-Locations-pt-BR.csv

-rw-r--r-- 1 root root    14932 2019-02-13 07:08 GeoLite2-Country-Locations-ru.csv

-rw-r--r-- 1 root root    11732 2019-02-13 07:08 GeoLite2-Country-Locations-zh-CN.csv


압축 풀어보면 이런식으로 나온다........... 안에 들어가보면 csv 양식이 바꼈따 ...... 흠


https://github.com/mschmitt/GeoLite2xtables

여기에 geolite2 를 기존 geolite .csv 로 컨버팅하는 스크립트가 있다. 요걸로 하면 잘된다 ㅋㅋ


하는방법은 아래와같다.

xt_geoip_dl 파일안의 내용을 
#########

#!/bin/bash


rm -rf GeoLite2-Country-CSV*


wget https://geolite.maxmind.com/download/geoip/database/GeoLite2-Country-CSV.zip

unzip -o -j GeoLite2-Country-CSV.zip '*/GeoLite2-Country-Blocks*'


wget http://download.geonames.org/export/dump/countryInfo.txt


cat GeoLite2-Country-Blocks-IPv{4,6}.csv | ./20_convert_geolite2 CountryInfo.txt > GeoIPCountry.csv

######

20_convert_geolite2 요것만 다운받아주고

ㄴperl 모듈 설치하라고 나오면 cpan -i NetAddr::IP 이거 하면된다.

위와같이 바꿔준다. 그리고 실행하면 된다.

나머지부터는 

check_function "./geoip/xt_geoip_build GeoIPCountry.csv"



mkdir -p /usr/share/xt_geoip

cp -r {BE,LE} /usr/share/xt_geoip/


이거 동일하게 하면됨


ps1.

"perl-Text-CSV_XS"는 쉼표(,)로 이루어진 값들을 구성하고, 분해하는 역할을 하는 패키지입니다. 엑셀 비슷하다고 보시면 됩니다.

"xtables-addons"는 커널/IPTables에서 제공하지 않는 기능을 추가적으로 지원해주는 Addons<확장팩(?) 비슷한 개념>입니다.


출처: https://sata.kr/entry/IPTables-12-IPTables에-GeoIP를-설치해보자-GeoIP-CentOS-6CentOS-7 [SATAz BLOG]

+ Recent posts