사이트 내 전체검색
[linux] 대용량 싸이트에서의 MySQL
로빈아빠
https://cmd.kr/server/276 URL이 복사되었습니다.

본문

대용량 싸이트에서의 MySQL
 
출처 : 모름
 
하루 평균 이용자는 잘 모르겠구....
하루 페이지 뷰가 600만 페이지 뷰 입니다...
서버는 달랑 4대...
웹 서버 3대와 db 서버 1대...
우선 웹서버의 튜닝은 여기선 집어치우죠...
일단.....
처음에 너무 황당했고.. 어쩔줄 몰랐습니다..

그놈의 mysql 연결 에러 때문에...
사용자가 너무 많아짐에 따라서
mysql 접속 또한 폭발적으로 증가했기 때문에...
더 이상 연결을 시키질 못하더군요...

그래서... 날밤 까면서... 이것 저것 찾아보고 물어보면서... ㅠ.ㅠ...
결국은 현재의 db 서버를 완전히 통째로 엎어버렸습니다...
RedHat 7.0 을 사용하고 있었는데....
운영체제는 FreeBSD 4.2 로 바꿨습니다...
또한 Mysql 설치시... 당근 소스 컴파일을 했지요...
이번엔 확실히 하기 위해서 아예... pgcc 를 이용해서
정적 컴파일 했습니다...

그래서..... 그다음... 전 이렇게 Mysql 을 설정했습니다...
이 부분이 핵심이겠지요...

서버는...

Intel P-III 600Mhz Dual
Ram : 1GB
I/O : 스카시
NetWork : 100M Shared
입니다...
우선...

/etc/my.cnf

라는 파일을 만드세요.. vi /etc/my.cnf
이 파일은 mysql 데몬이 실행될때 가장 먼저 찾는 파일입니다..
일반적으로 여러분들의 서버에는 이 파일이 당연히 없을겁니다..
그럼 mysql 은 디폴트 옵션으로 데몬을 시작합니다...

/usr/local/mysql/shar/mysql 디렉토리에
my-*.cnf 와 같은 형태로 my.cnf 파일의 예제가 존재 합니다


지금 부터 위 파일을 작성하겠습니다..

#======================================================= # /etc/my.cnf [client] port = 3306 socket = /tmp/mysql.sock [mysqld] port = 3306 socket = /tmp/mysql.sock skip-locking set-variable = key_buffer=384M set-variable = max_allowed_packet=1M set-variable = table_cache=512 set-variable = sort_buffer=4M set-variable = record_buffer=4M set-variable = thread_cache=8 set-variable = thread_concurrency=4 # CPU 갯수의 2배를 적으세요 set-variable = myisam_sort_buffer_size=64M set-variable = max_connections=400 log-update [mysqldump] quick set-variable = max_allowed_packet=16M [mysql] no-auto-rehash [isamchk] set-variable = key_buffer=256M set-variable = sort_buffer=256M set-variable = read-buffer=2M set-variable = write-buffer=2M [myisamchk] set-variable = key_buffer=256M set-variable = sort_buffer=256M set-variable = read-buffer=2M set-variable = write-buffer=2M

이렇게 작성하시고 저장하세요...
참고로... 메모리가 최소한 1G 이상은 된다는
가정하에 적는 옵션입니다...
그 다음에...
여러분들의 /etc/rc.d/rc.local 파일에
다음과 같이 적어주세요...
bin/sh -c 'cd /mysql패스 ; ./bin/safe_mysqld &'
~~~~~~~~~~
(예.. /usr/local/mysql )

참고로 전 위와 같이 하지 않았습니다...
전 FreeBSD 이기 때문에...
위의 것은 레드햇 계열일때의 적용되는 것입니다...
그럼.. 이제 셧다운 시키고 다시 safe_mysqld 를 할때에도
자동으로 /etc/my.cnf 파일을 읽어드릴 것입니다..

그 다음...

이건 뭐.. 어쩔 수 없는 것인데...
현재 저희 웹 프로그램의 모든 php 프로그램에서...
select 나.. 기타 등등.... 약간 복잡한것은 모두 UDF 로 바꾸었습니다...
일일히 UDF 로 바꾼다는것은 굉장히 고통스럽고 어려운 작업이었으나..
성능은 거의 환상적이더군요...

어쨌든.... 이렇게 해서...

현재 600만 페이지 뷰가 일어날때...(db 접속 부분이 아주 많습니다,,)
아무런 문제가 없습니다...
새벽 4시 정도에 순간적으로 다시 디비를 리로드 시키고 있습니다..
어쨌든..... 지금까지 아무런 문제없이 정말 잘 돌아가고 있습니다..

현재 DB 서버에는

5개의 database 가 있으며
그중의 4개는 60개 정도의 테이블이 있으며 나머지 1개는 400개의 테이블이 있습니다....
모든 데이타 베이스의 총 레코드 수는....
현재 약 1200만개 정도가 있습니다...
서버는 현재 미국에 있습니다..

한가지 놀라운것은 UDF 의 사용으로 정말 놀랍도록 좋아진 성능 입니다.... 다행히 가까운곳에 C 언어를 아주 잘 하는 사람이 있어서 많은 도움을 받았지요...

휴~~~ 한가지 절실히 느낀것은.....

PHP 로 웹 프로그램을 했는데.... 결국은 C 언어가 아니었으면...
더이상의 서비스는 불가능 했을 것이라는 점 입니다...
물론 이밖에... 큰 단일 파일의 처리와... db 파일 하나가 4G..ㅠ.ㅠ...
기타 중요한 문제들이 많이 있습니다...
이것은... 우리 엔지니어가 해결한 문제이기 때문에...
전 무식해서 잘 모르겠네요.... 한번 물어볼께요.....

다음에는 myisam 사용과 다른 팁들을 올리도록 하겠습니다...
그럼.... 약간의 도움이 되었기를 빌며..

댓글목록

등록된 댓글이 없습니다.

1,139 (13/23P)

Search

Copyright © Cmd 명령어 3.15.6.140