Mysql Master-Master Replication 설정하기
(Dual-Master replication)
: Master-Slave의 설정을 역으로 동일하게 한다고 생각하면 된다.

0. Master-Slave Replication이 설정되어 있다고 가정한다.
  설정이 끝날때 까지 기존 Master, Slave 명칭을 유지한다. 
 
1. Slave에 Master로의 replication을 위한 'repl' 계정을 만들고 권한을 준다.

mysql> GRANT REPLICATION SLAVE ON . TO 'repl'@'%.dsphome.net' IDENTIFIED BY '****';

2. Master에서 Slave를 master로 여기도록 설정한다.

mysql> CHANGE MASTER TO
-> MASTER_HOST='slave hostname/ip',
-> MASTER_USER='repl',
-> MASTER_PASSWORD='****',
-> MASTER_LOG_FILE='mysql-bin.000027',
-> MASTER_LOG_POS=9080;
 
물론 이 설정을 위해서는 Slave의 master_log 정보를 적어놔야한다.
( 기본 replication 설정 참고 )

3. master의 slave를 재시작시킨다.

mysql> START SLAVE;

4. 양쪽 모두 작동하는지 확인.

mysql> SHOW SLAVE STATUS\G


AND

0. START/STOP : 말그대로 start, stop 시킨다.

mysql> START SLAVE;
mysql> STOP SLAVE;

1. RESET Syntax : binary log를 리셋시킨다.

mysql> RESET MASTER;
mysql> RESET SLAVE;

2. SHOW Syntax : 여러가지 상태들을 보여준다.

mysql> SHOW MASTER STATUS;
mysql> SHOW SLAVE STATUS;

mysql> SHOW PROCESSLIST\G

*************************** 1. row ***************************
    Id: 35
  User: root
  Host: localhost
    db: NULL
Command: Query
  Time: 0
  State: NULL
  Info: show processlist
*************************** 2. row ***************************
    Id: 37
  User: repl
  Host: blog2.local:55297
    db: NULL
Command: Binlog Dump
  Time: 306
  State: Has sent all binlog to slave; waiting for binlog to be updated
  Info: NULL
2 rows in set (0.00 sec)


cf. \G는 vertical로 결과를 표시해준다.
AND


기본적인 방법은 "Mysql Replication 설정하기"와 동일하며,
해당글의 '6번 Slave'를 시작하기 전에 다음의 작업을 추가로 하면 된다.

1. Master에서 모든 테이블을 flush.

mysql> FLUSH TABLES WITH READ LOCK;

2. mysqldump를 이용해서 Master의 내용을 dump.

shell> mysqldump --all-databases --lock-all-tables >dbdump.db

권한이 모자라면 -u root -p 등의 옵션을 추가로 주면 된다.

3. Slave를 잠시 멈춘다.

기존에 돌아가던 slave가 있는 경우에만 해당된다.

mysql> STOP SLAVE;

4. Master로부터 dump한 dbdump.db 파일을 rsync등으로 가져와서, Import 시킨다.
   
shell> mysql < dbdump.db

이번에도 역시 권한이 모자라면 -u root -p 등의 옵션을 추가로 주면 된다.

5. Slave를 재시작.

mysql> START SLAVE;

Slave의 db를 select해보면 정상적으로 동기화 된 것을 확인할 수 있을 것이다.

AND

Replication 설정

0) Slave, Master 서버 설정 변경
Master의 /etc/mysql/my.cnf에서
아래와 같이 binary logging과 server-id를 체크한다.

[mysql]
log-bin=mysql-bin
server-id=1

Slave의 /etc/mysql/my.cnf에서
아래와 같이server-id가 겹치지 않도록 수정한다.

[mysql]
server-id=2

1) master와 slave에 동일한 버전의 mysql 설치( 본인의 경우에는 5.0 설치 )

2) replication용 user 추가( 여기서는 repl로 설정 )

mysql> CREATE USER userid IDENTIFIED BY 'password';

3) replication slave용 user를 master에서 권한 설정.

mysql> grant replication slave on *.* to 'repl'@'%.dsphome.net' identified by '****';

4) Slave의 설정을 위해서 Master의 binary log 정보를 보자.

mysql> FLUSH TABLES WITH READ LOCK;
mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000027 |     9080 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

mysql> UNLOCK TABLES;

5) Slave에서 Master 세팅 설정.
/etc/mysql/my.cnf를 수정해도 되며, 아래와 같이 명령을 날려도 된다.
아래 각 항목의 값들 중, log_file과 log_pos는 위의 master status의 값을 적는다.

mysql> CHANGE MASTER TO
   -> MASTER_HOST='hostname/ip',
   -> MASTER_USER='repl',
   -> MASTER_PASSWORD='****',
   -> MASTER_LOG_FILE='mysql-bin.000027',
   -> MASTER_LOG_POS=9080;

6) Slave 시작.

mysql> START SLAVE;

7) Slave 상태 확인.

mysql> show slave status \G;
*************************** 1. row ***************************
            Slave_IO_State: Waiting for master to send event
               Master_Host: blog1.naver.com (예입니다)
               Master_User: repl
               Master_Port: 3306
             Connect_Retry: 60
           Master_Log_File: mysql-bin.000027
       Read_Master_Log_Pos: 9080
            Relay_Log_File: mysqld-relay-bin.000022
             Relay_Log_Pos: 235
     Relay_Master_Log_File: mysql-bin.000027
          Slave_IO_Running: Yes
         Slave_SQL_Running: Yes
           Replicate_Do_DB:
       Replicate_Ignore_DB:
        Replicate_Do_Table:
    Replicate_Ignore_Table:
   Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
                Last_Errno: 0
                Last_Error:
              Skip_Counter: 0
       Exec_Master_Log_Pos: 169
           Relay_Log_Space: 235
           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: 0
1 row in set (0.00 sec)

Slave_IO_State가 위와 같이 나오지 않고,
'Connecting to master' 등 다른 상태이면 network상태를 의심해봐야 한다.
ping으로 network 연결 상태를 보고,

이도 정상적인 경우에는 skip-networking 옵션이 켜 있는 경우일 것이다.

# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
bind-address       = 127.0.0.1

이 부분의 주소를 수정하고 재시작하도록 한다.

MySQL 재 시작
$ sudo /etc/init.d/mysql restart


이제 master의 변화가 slave에 반영되는 것을 확인할 수 있다.
AND

기본적인 mysql의 명령어들 정리.

1. 사용자 추가하기
1) root로 접속.
mysql> mysql -u root -p
Enter Password : ****

2) 사용자 추가.
mysql> USE mysql;
mysql> INSERT INTO user (host,user,password) VALUES('localhost','username',password('****'));

3) sudo /etc/init.d/mysql restart 혹은
mysql> FLUSH PRIVILEGES;

4) 사용자 삭제.
mysql>DELETE FROM user WHERE user='username';

2. DB 추가하기
1) root로 접속.
mysql> mysql -u root -p
Enter Password : ****

2) database 추가
mysql> CREATE DATABASE dbname;
mysql> GRANT ALL PRIVILEGES ON dbname.* TO username@localhost IDENTIFIED BY '****';


물론 mysql-query-browser를 설치했다면 gui상에서 해도 크게 무방함.
AND

Google Chart API

개발/기타 2007. 12. 7. 13:46
구글이 chart api도 open 했습니다.

그동안은 그래프를 그리려면 포토샵으로 저장한 다음에 파일을 올리고 그담에 링크를 걸어야 했는데...

이제는 그냥 이 api를 이용하면 되겠네요.



http://code.google.com/apis/chart/

데이터의 길이 제한과 크기에 대한 제한이 있어서 좀 불편한 점이 있습니다만,
없는거 보다야 훠~얼씬 낫겠습니다.

이 api를 이용해서 아래 글인 [Python] 웹페이지 내에서 원하는 부분 가져오기.의 차트를
얼추 비슷하게 그려보자면 다음과 같이 나옵니다.



데이터 크기에 대한 제한이 있어서 다음과 같이 값을 좀 수정해야 했습니다...
http://chart.apis.google.com/chart?cht=lc&chs=300x100&chf=bg,s,efefef&chco=0000ff&chd=t:28,12,10,80,80,80,82,72,62,66,25,15,19,17,37,47,51,51,51,65,49,43,47,61,51,31,45
AND

daum에 보면 트렌드 차트라는 서비스를 하고 있다.
왠만한 것들의 트렌드를 알 수 있는 서비스인데,
불행히도 인기가 많은 것들에 대해서만 데이터를 제공해준다.

나는 내 책이 어느 정도 팔렸는지 동향을 알고 싶은데,
이런 정보를 제공해 주는 곳이 없으니 어쩔수 없이 간단하게 스크립트를 짜 돌려보았다.



위의 도표는 아래의 python 코드를 2주일간 돌린 결과를 엑셀로 뿌린 것이다.
아래의 코드는 단순히 파일에 내가 원하는 부분을 덮어쓰는 역할을 하는데,
매일 실행시키려면 linux의 crontab이나, windows의 예약작업을 이용하면 된다.

간단한 코드이므로 자세한 설명은 생략하고 간단하게 설명을 하자면,
해당 url의 페이지를 읽어와서, 내가 원하는 판매지수가 있는 위치의 정보를 what_i_want에 긁어온다.
그리고 그 결과는 'score.txt'에 append한다.

자, 이제 코드 나간다.


import urllib2, time

def getContent( url ):
        req = urllib2.Request( url )
        response = urllib2.urlopen(req)
        return response.read()

if __name__ == "__main__":
        curtime = time.localtime()
        curday = "%d/%02d/%02d"%(curtime[0],curtime[1],curtime[2])
        
        url = 'http://www.yes24.com/Goods/FTGoodsView.aspx?goodsNo=2549646&CategoryNumber=001001003011016'
        content = getContent( url )
        
        startword = '<font color=\'#AFAFAF\'> / </font>'
        endword = '<a'
        startpoint = content.find(startword)
        
        startpoint += len(startword)
        endpoint = content[startpoint:].find(endword)
        
        what_i_want = content[startpoint:startpoint+endpoint]
        score = what_i_want[-5:]
        
        f = open('score.txt','a')
        f.write("%s\t%s\n"%(curday, score))
        
        print "%s\t%s\n"%(curday, score)


BeautifulSoup 등을 사용해서 보다 고상하게 가져올 수도 있지만,
이 경우에는 별로 그럴 필요가 없으므로 무식하게 find를 사용했다. --;


태그 : python, crawl
AND

바로 아래 포스팅한 python 시뮬레이션 코드입니다.
아이템의 스펙을 그대로 따르려고 노력했구요...
그림 그리기는 matplotlib(http://matplotlib.sourceforge.net)를 사용했습니다.
초간단코드이므로, 설명은 없습니다... ㅋㅎ

이 코드에 대한 개요와 결과를 보시려면, 아래 글을 참조하세요.
[WOW] 다크문 진노카드 치명타율 실험 (시뮬레이션)

--- 여기서부터 코드입니다 ---

from pylab import *

def getCriticalStrikeRate( default_critical_strike_percent ):
        nAttCount=0
        nCriCount=0
        pCri = default_critical_strike_percent
        
        while( nAttCount < 10000 ):
                if (rand()*10000)%100 <= pCri:
                        nCriCount+=1
                        pCri = default_critical_strike_percent
                else:
                        pCri += 17/22.1
                nAttCount+=1
        
        return nCriCount/100

if __name__ == "__main__":
        x = arange( 0, 50, 0.1 )
        Z = x
        y=[]
        
        for ax in x:
                y.append( getCriticalStrikeRate( ax ) )

        plot(x,y, color='red',lw=1)
        plot(x,Z, color='green',lw=2)
        xlabel('Before')
        ylabel('After')
        show()


태그 : python, matplotlib

        
AND

리눅스 환경은 너무나도 익숙치 않아서,
그때그때 쓸일이 있을 때 마다 정리해 노코 있는 중...
금새 까먹을게 뻔하니 ㅠㅜ;


ps : process statistics. 실행 중인 process들을 보여줌.
     ps ax를 일반적으로 쓰며, grep으로 특정 process만을 출력함.
ex. ps ax | grep python


top : 사용중인 process들의 cpu 사용률을 계속적으로 보여줌


nice : process의 우선 순위 변경,
       -20 ~ + 20까지의 우선 순위 설정 가능
Usage: nice [OPTION] [COMMAND [ARG]...]


renice : 실행 중인 process의 우선 순위 변경
usage: renice priority [ [ -p ] pids ] [ [ -g ] pgrps ] [ [ -u ] users ]
ex. renice -19 24785


sudo : 임시로 루트 권한으로 작업.
위의 명령 중, process의 권한을 바꾸는 작업은 관리자만 가능한 작업이므로
매번 로긴하는 귀차니즘으로 피하기 위하여 sudo 명령을 써서 관리자 권한으로 작업을 한다.
ex. sudo renice -19 24785
AND


Programming in Lua
http://www.lua.org/pil/

위의 PIL을 redwiki 님께서 번역하셨네요.
( PIL2지만... http://www.redwiki.net/wiki/wiki.php/Lua )

저도 물론 며칠 전 질렀습니다~
위의 PIL이 공개되어서 사실 필요 없긴 하지만,
역시 인쇄된 한글판을 소장하고 싶어서 ㅠㅠ;
AND