반응형
소켓 생성
socket( ${family}, SOCK_RAW, ${protocol});

family : IPv4 - AF_INET
          IPv6 - AF_INET6

protocol : /usr/include/netinet/in.h 참조


protocol을 IPPROTO_RAW를 사용할 경우 ip헤더도 직접 조작하여 패킷을 전송할 수 있다.

IPv4에서는 ip헤더를 직접 조작한다는 옵션을 필히 주어야 한다.

int on = 1;
...
setsockopt( raw_socket, IPPROTO_IP, IP_HDRINCL, (char *)&on, sizeof(on) );


IPv4에서는 IPPROTO_RAW로 생성한 소켓끼리 통신이 가능하다.
IPv6에서는 IPPROTO_RAW로 생성한 소켓을 전송할 때 받는 쪽에서는 전송하는 패킷의 페이로드에 해당하는 protocol로 생성한 소켓이어야 받을 수 있다.

반응형

=== 1일 이내에 수정된 파일

find ./* -mtime -1 (현재 폴더 미포함)
find . -mtime -1 (현재 폴더 포함)


=== 1일 이내에 접근된 파일

find ./* -atime -1


=== 1일 이내에 상태가 변경된 파일

find ./* -ctime -1



=== man 페이지 내용 ===

-atime n

              File  was  last  accessed n*24 hours ago.  When find figures out how many 24-hour periods ago

              the file was last accessed, any fractional part is ignored, so to match -atime +1, a file has

              to have been accessed at least two days ago.


-ctime n

              File's status was last changed n*24 hours ago.  See the comments for -atime to understand how

              rounding affects the interpretation of file status change times.


-mtime n

              File's  data was last modified n*24 hours ago.  See the comments for -atime to understand how

              rounding affects the interpretation of file modification times.

반응형

참조
    1. http://sidharthdeshpande.blogspot.kr/2011/08/postgresql-904-streaming-replication.html
    2. http://wiki.postgresql.org/wiki/Streaming_Replication


2번 참조가 공식 사이트의 사용방법이고, 1번 참조가 좀 더 자세하게 나온 것이다.


PostgreSQL은 9.1버전의 deb파일을 구해서 ubuntu 10.0.4에 설치하여 테스트했다.
    - PostgreSQL 9.1 설치 : http://wiki.openscg.com/index.php/Postgres_9.1_DEB
    - PostgreSQL 9.1 deb 및 rpm 파일 : http://www.openscg.com/se/postgresql/packages.jsp


설정은 master를 먼저 하고, slave를 실행한다.
ubuntu 기준으로 설치 시 /opt/postgresql/9.1/ 폴더에 설치가 되었다.
설정 중 경로가 없는것들이 몇 개 있는데 mkdir로 만들어 준다.


=== Master 설치 ===

1. PostgreSQL 9.1 설치 및 초기화
    # dpkg -i postgresql...deb
    # /etc/init.d/postgres-9.1-openscg start

2. 환경설정파일 수정
    # cd /opt/postgres/9.1/data
    - postgresql.conf파일과 pg_hba.conf파일을 수정해야 하는데, 수정하는 내용은 위의 참조 사이트를 참고한다.

3. DB 및 테이블 생성
    - 실제 데이터가 들어갈 DB 및 테이블을 생성
    - DB 생성은 createdb 를 사용하면 된다.

4. DB 데이터 백업
    - 2번 참조 사이트의 How to Use섹션 5번, 6번 항목을 참고한다.
    - rsync는 scp를 내부적으로 사용한다. 따라서 파라미터도 scp에 들어가는 것과 같다.

5. 4번까지 끝나면 slave의 /srv/pgsql/standby 폴더에 /opt/postgres/9.1/data의 파일들이 전부 복사되어 있다.


=== Slave 설치 ===

6. PostgreSQL 9.1 설치
    # dpkg -i postgresql....db
    - slave에서는 초기화를 하지 않는다.

7. DB 데이터 파일 복사
    - 4번에서 복사한 /srv/pgsql/standby의 모든 파일을 /opt/postgres/9.1/data 폴더에 복사한다.
    - 그 후 권한과 사용자를 변경한다.
    # cd /opt/postgres/9.1/data
    # chmod 700 .
    # chown -R postgres:postgres .

8. 환경 설정파일 수정
    - data폴더의 모든 파일을 복사 하였기 때문에 master와 똑같은 설정이 몇가지 있어서 수정한다.
    - postgresql.conf 파일의 master설정 부분을 주석처리한다.
    # vi postgresql.conf
    max_wal_senders = 5 -> #max_wal_senders = 5
    
wal_keep_segments = 32 -> #wal_keep_segments = 32
    - slave라는것을 알 수 있도록 hot_standby 항목의 값을 변경한다
    #hot_standby = off -> hot_standby = on

    # vi pg_hba.conf
    - replication으로 설정된 항목 삭제

9. 환경설정 파일 추가
    - 2번 참조 사이트의 How to Use섹션 9번을 참고한다.

10. 마무리
    - 1번 참조 사이트에서 slave의 recovery.conf파일을 생성 한 후 하는 명령어를 실행한다.
        - initdb 실행
        - DB 시작

    - 정상적으로 replication이 설정되었다면 1번 참조 사이트의 로그 내용이 출력된다. 로그는 pg_log 폴더에 있다.

11. 테스트
    - master에서 DB에 아무 값이나 넣어본 후 slave에서 정상적으로 데이터가 복제되나 확인해본다.


※ 에러 사항

1. slave를 시작하는데 시작하는 시간이 오래 걸리고, 로그 내용중 "database system identifier differs between the primary and standby" 이란 에러가 있다면, slave에서 DB초기화를 해서 생긴 에러다.
    ==> data폴더를 삭제 후 다시 slave 설정을 하거나, 그래도 안되면 slave에서 PostgreSQL 9.1을 삭제한 후 다시 설치한다.

2. FATAL:  data directory "/opt/postgres/9.1/data" has group or world access
DETAIL:  Permissions should be u=rwx (0700).
    ==> 말 그대로 data폴더의 권한을 700 으로 주란 소리다.



반응형

참조 : http://slony.info/documentation/1.2/firstdb.html

replication의 초기화는 master에서 설정하고, replication 동작은 slave에서 실행한다. 참조의 쉘 스크립트 자체가 master->slave로 되어 있다.


master에서 초기화 쉘 스크립트를 만든다. 파일명은 맘대로....
참조 웹 페이지의 2.3.1 섹션의 쉘 스크립트를 가져다가 적당히 수정한다. 테이블이라던가.... 패스워드라던가...
참조에는 없는 부분인데... store path 아래에 아래 두줄을 넣어준다.

store listen (origin=1, provider = 1, receiver =2);
store listen (origin=2, provider = 2, receiver =1);


만든 쉘 스크립트를 실행 한 후 참조에 있는대로 master와 slave에서 slon데몬을 실행한다.

slon $CLUSTERNAME "dbname=$MASTERDBNAME user=$REPLICATIONUSER host=$MASTERHOST" -> master

slon $CLUSTERNAME "dbname=$SLAVEDBNAME user=$REPLICATIONUSER host=$SLAVEHOST" -> slave

정상적으로 설정이 되었다면 master(node에서 id를 1로 지정)의 로그 중 slave(node에서 id를 2로 지정)와의 싱크중이라는 뜻으로 대략 아래와 같은 메세지가 출력된다. slave의 로그는 id에 해당하는 부분만 1로 출력된다.

remoteListenThread_2: LISTEN
remoteWorkerThread_2: Received event 2,nnn SYNC


만약 db_getLocalNodeId() returned 2 - wrong database? 이런 에러가 뜨면 ip문제일 수도 있다. (테스트 시 localhost로 지정했더니 이같은 에러가 나타나 localhost의 실제 ip주소를 적어주었다. (1) 초기 설정 편의 예시를 보면 된다)

이 에러가 떴다면 master와 slave에서 일단 이전에 만든 정보를 삭제해준다.
psql -h localhost -U postgres -d test_db -c "drop schema _$CLUSTERNAME cascade"

그 후에 다시 초기화 스크립트를 실행해준다.


싱크가 잘 된다면, slave에서 데이터를 받아오도록 하는 스크립트를 실행한다. 역시나 마찬가지로 참조의 스크립트를 가져다가 적당히 수정해서 사용하면 된다.

데이터 가져오는 스크립트를 한번 실행하면 그 후로는 pc가 껐다 켜져도 데몬만 실행하면 된다.


테스트를 해본다. 잘 된다. 끗! 

반응형

참고 : http://slony.info/documentation/1.2/firstdb.html

Ubuntu 10.0.4에서 설치하였기 때문에 PostgreSQL 9.0 미만의 버전에서 사용하는 방법이다.
PostgreSQL 9.0 이상은 Streaming Replication이라는 방법을 지원한다.(http://wiki.postgresql.org/wiki/Streaming_Replication)


계정은 기본 계정인 postgres를 그냥 사용했다.
어차피 계정을 새로 만들어도 slave에서 password 설정을 해줘야 한다. (master에서 연결하기 위해서)

계정의 password 설정하는것을 제외한 모든 작업은 master에서 진행한다.


postgres 계정의 비번 변경 방법.

# sudo su - postgres
# psql template1
# alter user postgres with password '1234';


- Replication에 필요한 프로그램 목록
    - postgresql-8.4
    - postgresql-8.4-slony1
    - slony1-bin


- .bashrc 설정(master, slave 전부 설정)

CLUSTERNAME=slony_example
MASTERDBNAME=test_db
SLAVEDBNAME=test_db
MASTERHOST=192.168.0.71
SLAVEHOST=192.168.0.72
REPLICATIONUSER=postgres

- 재부팅 하지 않고 계속 작업할 경우 export로 환경변수 셋팅을 해준다.
- 만약 서로 다른 PC에서 작업할 경우 host의 ip주소 중 localhost가 입력되면 안된다.


밑의 작업은 master에서 postgres 계정으로 전환한 후 작업한다.


- DB 생성

      # createdb -O $REPLICATIONUSER -h $MASTERHOST $MASTERDBNAME
      # createdb -O $REPLICATIONUSER -h $SLAVEHOST $SLAVEDBNAME


- Password 설정 (master, slave 전부 설정한다)


- table 생성
      # psql -U $REPLICATIONUSER -h $MASTERHOST -c "create table history();"
      # psql -U $REPLICATIONUSER -h $MASTERHOST -d $MASTERDBNAME -c "begin; alter table
      history add column id serial; update history set id =
      nextval('history_id_seq'); alter table history add primary key(id); commit"


- pl/pgSQL
    # createlang -h $MASTERHOST plpgsql $MASTERDBNAME


- schema 복제
    # pg_dump -s -U $REPLICATIONUSER -h $MASTERHOST $MASTERDBNAME | psql -U $REPLICATIONUSER -h $SLAVEHOST $SLAVEDBNAME

반응형

에러라고 생각할 수도 있고 아닐 수도 있지만...

jsp에서 커넥션을 하나만 생성하고 생성된 커넥션으로만 Read, Write를 했는데...

Write하는동안 read를 할 수 없도록 lock이 걸려 있다..

lock때문에 동시 접속시 tomcat이 뻗어버리는 상황까지 발생...


ab에서 concurrency를 10개 이상을 셋팅하면 무조건 뻗는다... ㅋㅋㅋㅋ


결국 sqlite는 동시접근을 하면 안되는구나 라는 판단이 들고.. 다른 DB로 바꿔 버렸다 ;;

반응형

* spin_lock_irqsave()와 spin_lock_irq()
둘다 interrupt를 disable 시킨 이후에 spin lock을 획득하는 것은 동일하지만,
spin_lock_irqsave()는 CPU의 flag 레지스터를 보관했다가
spin_unlock_irqrestore()로 복구할 수 있다.

* spin_lock()과 spin_lock_irq()의 차이는
spin_lock()은 interrupt를 disable하지 않기 때문에
interrupt handler(top half)에서는 사용할 수 없다.
대신 이때는 spin_lock_irq()나 spin_lock_irqsave()를 사용해야 한다.

* spin_lock_bh()
같은 종류의 softirq는 여려 CPU에서 동시에 실행될 수 있기 때문에
([ksoftirqd/CPUn] 커널 쓰레드가 softirq의 실행을 담당한다.)
softirq를 disable한 이후에 spin lock을 획득한다.
원래 이 함수의 이름은 spin_lock_softirq() 정도가 되어야 맞겠지만
예전 커널의 흔적이 아직 남아있다.

* 그리고, spin_lock()은
spin lock으로 보호해야 할 데이터가
interrupt handler(top half)에서도, softirq handler에서도 접근하지 않고
단지 그 외의 일반적인 커널 코드에서만 접근한다면
interrupt disable, softirq disable 같은 overhead 없이 spin lock을 얻을때 사용한다.



http://kldp.org/node/54671 답글에서 발췌

반응형

처음 테스트 할 때에는 분명 windows건 linux건 mysql서버가 다운되면 mysql_ping과 insert query가 약 15초 정도 멈춘 후 프로세스가 다시 정상적으로 진행됐었는데...
오늘 linux에서 타이머를 테스트 하려고 하니 15분간 멈춰 있었다...;;

덕분에 하루종일 인터넷을 검색했다.

키워드로 검색되는 거의 모든 페이지를 본 듯하다.. 하지만 해결을 하지 못했다.


windows에서는 간단히 

mysql_option(..., MYSQL_OPT_READ_TIMEOUT, ...);
mysql_option(..., MYSQL_OPT_WRITE_TIMEOUT, ...);

두개만 설정하면 된다.


하지만 linux에서는 저 방법도 안되고.. 꼼수로 CONNECT_TIMEOUT을 설정한 후 쿼리 전에 항상 재접속을 하는 방법을 해봤는데.. 뭐.. 역시나 안된다..(아마 insert query를 하면서 멈추지 않았을까 생각된다... 아니면 조건을 잘 못 했다거나 ;;)
된다고 해도 이 방법을 쓰면 안되겠지만;;


결국 mysql 소스를 이리저리 까뒤집어서 socket에 option을 설정하는 것으로 해결했다.

소켓이 생성되는 시기는 connect류의 함수가 호출되는 시기이므로 connect함수가 호출 된 후 설정하였다.

struct timeval tv;
tv.tv_sec = 1;
setsockopt(obj->net.fd, SOL_SOCKET, SO_SNDTIMEO,(struct timeval *)&tv,sizeof(struct timeval));
setsockopt(obj->net.fd, SOL_SOCKET, SO_RCVTIMEO,(struct timeval *)&tv,sizeof(struct timeval));


대충 10여회 테스트 한 결과 아무리 오래 걸려도 1분은 걸리지 않았는데.. 이번엔 처음보는 에러가 나온다. 에러번호는  2013인데 에러 내용이 달라졌다..

2013, Lost connection to MySQL server at 'reading initial communication packet', system error: 111

음 -_-;;

일단 예상은... timeout 시간을 설정함으로써 DB와 연결이 되지 않으니 접속 권한이 없는것으로 판단되어 나타나는 에러 같은데...


약 10여회 테스트 결과는 정상 동작했다.

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

sqlite 동시 접근시 에러??  (0) 2012.08.11
spin_lock, spin_lock_irq, spin_lock_bh  (0) 2012.06.28
ssh 접속시 증명서 변경됐다고 나올 때  (0) 2012.05.31
ubuntu 기본 설정  (0) 2012.05.30
segment fault 지점 찾기  (0) 2012.04.06
반응형

WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!

ssh  root@[IP]

이렇게 쳤을뿐인데... 




이런 무시무시한놈이 나와서 놀라게 할때가 있다.

저도 그래서 개깜놀해서 네이년에 잽싸게 검색해봤더니.

금방 답을 찾았네요.

제가 접속한 상태에서 그쪽 리눅스를 다시 깔았었거든요.

그래서 이전에 접속한 RSA 키 값으로 자꾸 접속하려니까 맞지 않았던거에요.

결론은 지우면 된다는거.



ssh-keygen -R [ IP or DomainName]

ex) ssh-keygen -R 123.123.123.123
 

 


터미널에 저거 치면 된다. 

아 쉽다.-_- 

그리고 다시 ssh root@[IP]

하면 이제 될꺼에요^^ 



혹시 그래도 안된다면

find / -name known_hosts 을 통해 해당파일을 찾아 지우면 된데요.
root계정이면 /root/.ssh/known_hosts 에 있고,
일반계정이면 /home/username/.ssh/known_hosts 에 있답니다.

그럼 즐거운 리눅스 생활! 


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

sqlite 동시 접근시 에러??  (0) 2012.08.11
spin_lock, spin_lock_irq, spin_lock_bh  (0) 2012.06.28
mysql_ping 15분 hang 해결방안  (0) 2012.06.28
ubuntu 기본 설정  (0) 2012.05.30
segment fault 지점 찾기  (0) 2012.04.06
반응형

.bashrc (혹은 쉘 종류별 파일)

alias ll='ls -al'

alias grep='grep --color=auto'


.vimrc

set ts=4

set number


부트로그 활성화

# vi /etc/default/bootlogd

BOOTLOGD_ENABLE=Yes

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

sqlite 동시 접근시 에러??  (0) 2012.08.11
spin_lock, spin_lock_irq, spin_lock_bh  (0) 2012.06.28
mysql_ping 15분 hang 해결방안  (0) 2012.06.28
ssh 접속시 증명서 변경됐다고 나올 때  (0) 2012.05.31
segment fault 지점 찾기  (0) 2012.04.06

+ Recent posts