Zabbix 에 대해 설치해 보았다.

마음 같아서는 개발 서버에(mysql 이 멀티로 엄청 올라가 있기에 테스트가 좋음...) 올리고 싶었지만 안올라가더군...


가장 찾기 힘들다고 생각하는 rpm 호환성에서...


그래서 설치가 제 1차 목적이기에 VM에 설치하여 보았다.


정말 yum으로 설치하니....너무 편했다....소스로 설치하고 싶지만...정보가 부족하기에...ㅠ


여기에 문제가 발생하였다.


Zabbix Server is running 에서 Value 값이 No라고 나온 것을 확인 가능하다


검색해 보니 conf 파일들에 대해서 127.0.0.1 로 변경하라고 해서 해 봤지만, 전혀 해결이 되지 않았다.


혹시 나처럼 문제가 있는 사람들은 conf 파일들을 수정하기 전에 먼저 방화벽 을 확인해 보기 바란다.


vi /etc/sysconfig/iptables


-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 10051 -j ACCEPT


를 우리는 가장 많이 확인한다.


물론 여기에도 추가를 해 놔야 하지만..(난 이미 추가를 해 봤지만 안되었다.)


여기서 우리는 웹페이지를 제공받고 그 해당 웹페이지를 통해서 본다.


즉, 웹페이지 관련 방화벽도 확인해 봐야 한다!


vi /etc/sysconfig/ip6tables


-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 10051 -j ACCEPT


service ip6tables restart


를 한 후 확인하면 어느새 아래와 같이 Yes 가 된 것을 확인 할 수 있다.



이제 이것저것 확인해 봐야겠다.

반응형

이주일 넘게 야근에 주말 출근에 많이 바빴다.

파이썬 스크립트 대공사 / Php 스크립트 대공사...


하아....먼저 이 모든걸 6개월에 만든 DBA 분께 존경심과 함께 그 분이 신경 못쓰고

하드 코딩들을 많이 바꿨다.


이제는 거의(완벽하다고는 할수 없겠지..누군가 보면 욕할수도 있기에) 수정할 일 없도록 내가 전체적으로

다 변경했다....


대략적으로 DB에 기본적인 정보들을 저장할 수 있도록 테이블을 구성했다.

하지만 기본적으로 머리에 있었던 부분의 정리와, 앞으로 공유되어야 할 데이터들이 있어야 하기에 테이블을 하나 구성하더라도

많은 부분 정리가 필요하다.


공부하다 보면, 제1 ,2 정규화..반정규화 등등...정규화 과정이라고 거창하게 쓰고 최대한 내 입맛과 스크립트 입맛에 맞춰 구성...!!!


이후에 스크립트들에 대해서 수정을 진행한다.


물론 수정전에 수정되어야 하는 스크립트에 대한 분석들이 필요하겠지만...


필요한 데이터들을 내가 구성한 테이블에서 읽어들여 for문을 이용하여 list로 된 것들을 하나씩 호출하여

진행....이 것이 내가 수정한 것의 핵심이자 전체이다.


이렇게 파이썬 스크립트 10개 정도 수정..


이 후 Php로 만들어진 웹페이지도 이렇게 수정을 진행했다.


비록 간단한거지만 이렇게 안하면 하나의 신규 또는 수정이 진행되면 전체 다 수정을 해야되는 불상사가 발생하기 때문에

이렇게 내가 바꾼거다...


하지만 회사 사람들은 잘 모르겠지....씨밤바


누굴 위해서 한건 아니지만 적어도 이렇게 리뉴얼 한 거를 간단히 보는게 짜증이 난다...


에휴///얼릉 그동안 계획하고 못한 것들을 진행해야겠다. 

그래도 새로운 것을 배우면 즐겁긴 하다-ㅎㅎㅎㅎ

반응형

'Life' 카테고리의 다른 글

[20160927] 공부해야 될 내용  (0) 2016.09.27
지난 추석 인사  (0) 2016.09.20
필요 테스트 및 공부해야 될 내용  (0) 2016.07.04
누군가에게 제안하기 전에..  (0) 2016.07.01
블로그의 의미  (0) 2016.03.14

1. 모니터링 툴 사용

Cacti

https://www.percona.com/doc/percona-monitoring-plugins/1.0/cacti/mysql-templates.html


Cacti를 이용한 MariaDB/SkySQL/MySQL 모니터링 서버 구축

http://www.openseed.co.kr/14


모니터링 및 튜닝 포인트

http://www.mimul.com/pebble/default/2012/05/16/1337154545185.html


Zabbix

https://www.zabbix.com/documentation/2.2/manual/installation/install_from_packages


여러 템플릿 유명 Percona


https://www.percona.com/doc/percona-monitoring-plugins/LATEST/zabbix/index.html


한글문서(블로그)

잘 정리 되어있음

http://zabbix.dothome.co.kr/doku.php/manual


https://www.3rabbitz.com/f01c33e7d8367da2#3120fd12b877e962

http://www.joinc.co.kr/w/Site/QOS/Monitering_Tool/zabbix


http://www.programkr.com/blog/MkDMwEDMwYT3.html


http://oops-myblog.blogspot.kr/2015/04/zabbix.html


http://www.slideshare.net/ienvyou/zabbix-installation-configurationguide


정리되어 있지않지만 많은 정보

http://blog.naver.com/PostView.nhn?blogId=junix&logNo=80192164926




2. 빅데이터 관련하여 참고

Memcached

http://php.net/manual/kr/book.memcached.php

http://www.solanara.net/solanara/memcached

http://dev.mysql.com/doc/refman/5.7/en/ha-memcached.html

http://d2.naver.com/helloworld/151047


Redis


Redis 가 Memcached 보다 더 좋다는 비교글

http://blog.leekyoungil.com/?p=200


Redis Cluster 

http://cafe.naver.com/mysqlpg/1143


RedisConf 2016

https://www.youtube.com/playlist?list=PL83Wfqi-zYZHtHoGv3PcGQA3lvE9p1eRl


http://ojava.tistory.com/70


공부해야 될게 많구나-ㅋㅋ

반응형

'Life' 카테고리의 다른 글

지난 추석 인사  (0) 2016.09.20
요즘 근황 16.07.15  (0) 2016.07.15
누군가에게 제안하기 전에..  (0) 2016.07.01
블로그의 의미  (0) 2016.03.14
[16.01.12] 뭐가 더 옳은 걸까..  (0) 2016.01.12
MySQL Replication(복제)

MySQL Replication(복제)  개나 2 이상의 MySQL database server(slave) 하나의 MySQL database server(master) 부터 데이터를 복제해   있는 기능을 제공한다.

MySQL Replication 비동기 방식으로 처리된다 slave master로부터 데이터를 받아 복제하기 위해 항상 master 연결되어 있을 필요가 없다.

 

MySQL Replication Binary logging mechanism 사용하여 이뤄진다.

Master 서버는(MySQL 인스턴스) binary log 변경된 데이터 정보를 기록하며  log slave 읽어서 실행함으로써 복제가 된다.

 

Master에서 binary logging 활성화되면 Master 모든 데이터 구문이 bindary log 저장되며 slave bindary log 모든 내용을 복사해서 읽어온다.

따라서 slave log 파일내의 position 유지할 필요가 있다그래야 로그파일 전체를 처음

부터 읽지 않고 효과적으로 로그 파일을 운영할  있다.

여기서 position 로그파일내 위치를 의미하며 어느 부분부터 읽겠다는 것을 의미 한다.

 

Configuration 따라 다음과 같은 단위로 복제가 이뤄질  있다.

l  all database

l  selected database

l  selected tables within a database

 

 

 

Replication 구성  – Appendix A.


 

Replication Configuration

 

[ Master Configuration ]

1.  Replication User 생성
slave
 master 접속하여 데이터를 복제하기 위한 MySQL 계정이 필요하다. root 사용해도 상관 없지만 slave Replication 설정을 하면(slave configureation 참조) 계정 정보가 암호화되지 않은 텍스트 형태로 slave 서버의 master.info(mysql\data) 파일에 기록이 되기 때문에 보안상 root 기타 계정을 사용하는 것을 권하지 않는다따라서 복제를 위한 계정을 하나 생성한다.
 계정은 단지 REPLICATION SLAVE Privilege 있으면 되므로 다음과 같이 계정을 생성한다.(REPLICATION SLAVE Privilege 있으면 된다는 의미는 INSERT/UPDATE 등과 같은 Privilege 필요 없다는 의미이다따라서 복제 계정은 mysql query실행을  없다.)

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

è  repl 계정이며 slavepass 계정의 비밀번호 이다.

è  %대신 IP주소를 넣으면  IP로부터 접속하는 slave 대해서만 접속을 허용하겠다는 의미(그냥 % 사용하자..!)

n  ) ….. ON *.* TO 'repl'@'1.1.1.2' IDENTIFIED BY 'slavepass';

 

2.  Configuration 설정(my.ini 또는 my.cfg)

[mysqld]

log-bin=mysql-bin

server-id=1

è  server-id 1~(2^32)-1내의 숫자중 아무것이나 설정해도 된다.

è  log-bin=mysql-bin는 바이너리 로그파일의 생성경로이며 log-bin만 기입시 기본 디렉토리에 생성된다.

3.  MySQL 데몬 재시작

 

4.  Master 정보 보기

mysql> FLSUSH TABLES WITH READ LOCCK;

mysql> SHOW MASTER STATUS;

+------------------+----------+--------------+------------------+

| File                | Position | Binlog_Do_DB | Binlog_Ignore_DB |

+------------------+----------+--------------+------------------+

| mysql-bin.000001 |       98   |                 |                     |

+------------------+----------+--------------+------------------+

è  File : 로그 파일을 의미한다.

è  Position : 로그 파일내 읽을 위치

è  Binlog_Do_DB : binary log 파일(변경된 이벤트 정보가 쌓이는 파일)

è  Binlog_Ignore_DB : 복제 제외 정보

n  Binlog_Do_DB Binlog_Ignore_DB Slave 시작하기 전까지는 나타나지 않는다.


 

[ Slave Configuration ]

1.  Configuration 설정

[mysqld]

server-id=2

replicate-do-db=’database name’


# master-host=xxx.xxx.xxx.xxx  --> 마스터의 IP

 master-user=xxxx  --> 리플리케이션용 ID

 master-password=xxxx  --> 패스워드

 master-port=3306  --> 접속할 포트번호 (일반적인 포트 3306)

è  slave server-id 정의한다 1~(2^32)-1내의 숫자중 아무것이나 설정해도 되나 Master와는 다르게 한다.

è  replicate-do-db: 복제할 데이터베이스를 의미한다.

n  2 이상의 데이터 베이스 복제를 원하면 replicate-do-db  추가한다.

 

2.  database dump

복제할 데이터베이스를 master로부터 dump하여 넣는다.

 

3.  CHANGE MASTER TO

Master 연결하기 위한 정보를 다음과 같이 설정한다.

mysql> CHANGE MASTER TO

MASTER_HOST='Master server host name or Master server IP',

MASTER_USER='replication user',

MASTER_PASSWORD='replication password',

MASTER_LOG_FILE='Log File name',

MASTER_LOG_POS=position;

è  MASTER_HOST: Master 서버의 정보를 입력한다.

è  MASTER_USER: replication 위해 생성한 계정 ID

è  MASTER_PASSWORD: replication 위해 생성한 계정 비밀번호

è  MASTER_LOG_FILE: SHOW MASTER STATUS에서 보이는 로그 파일 

è  MASTER_LOG_POS: SHOW MASTER STATUS에서 보이는 position

n  SHOW MASTER STATUS master에서 실행해야 한다.(master 설정 참고)

 

4.  MySQL 데몬 재시작

 

 Slave 실행이 되면(MySQL 데몬 시작 또는 slave start) master 접속하기 위한 정보를 master.info(mysql\data)에서 읽어 온다만일 master.info 아무런 정보가 없으면 my.ini 참고하여 master.info 연결정보를 기록한다.

여기서 주의할 점은 이미 master.info 정보가 있으면 my.ini 참조하지 않으므로 my.ini정보를 수정해도 master 연결시 반영되지 않는다.

그러나 CHANGE MASTER TO 이용하면 master.info 바로 변경한다.

따라서 master 연결정보는 my.ini 설정하는  보다는 CHANGE MASTER TO 이용하여 설정하는게 낫다.

 

다음과 같은 option CHANGE MASTER TO에서 사용된다.

master-host

master-user

master-password

master-port

master-connect-retry

master-ssl

master-ssl-ca

master-ssl-capath

master-ssl-cert

master-ssl-cipher

master-ssl-key

 

 

 

[양방향 동기화 처리]

Master서버에서 Slave 구현하고자 한다면 다음과 같은 방법으로 처리

1. 현재 Slave서버에 replication 계정 생성

2. 현재 Slave my.ini 변경

log-bin=mysql-bin 추가

3. 현재 SLAVE 서버 데몬 재시작

4. 현재 Master my.ini 변경

replicate-do-db=’database name’추가

4. 현재 Master에서 CHANGE MASTER TO 실행

5. 현재 Master 서버 데몬 재시작

 

 


 

Replication Monitoring

//ON Master

mysql> SHOW PROCESSLIST\G

*************************** 1. row ***************************

Id: 11

User: repl

Host: 192.168.1.22:3556

db: NULL

Command: Binlog Dump

Time: 21960

State: Has sent all binlog to slave; waiting for binlog to be updated

Info: NULL

Slave 192.168.1.22 repl계정으로 thread11 연결되어 있음을 보여준다.

 

 

//On Slave

mysql> show processlist\G

*************************** 1. row ***************************

     Id: 1

   User: system user

   Host:

     db: NULL

Command: Connect

   Time: 23049

  State: Waiting for master to send event

   Info: NULL

*************************** 2. row ***************************

     Id: 2

   User: system user

   Host:

     db: NULL

Command: Connect

   Time: 4294967289

  State: Has read all relay log; waiting for the slave I/O thread to update it

   Info: NULL

Id 1: Master 서버와 통신하기 위한 I/O Thread

Id 2: update 내용을 처리하기 위한 SQL Thread

 2개의 Thread 오류가 발생하면 안된다.

 

 

mysql> show slave status\G;

*************************** 1. row ***************************

             Slave_IO_State: Waiting for master to send event

                Master_Host: 192.168.1.14

                Master_User: repl

                Master_Port: 3306

              Connect_Retry: 60

            Master_Log_File: mysql-bin.000004

        Read_Master_Log_Pos: 9187563

             Relay_Log_File: shin-relay-bin.000013

              Relay_Log_Pos: 9187700

      Relay_Master_Log_File: mysql-bin.000004

           Slave_IO_Running: Yes

          Slave_SQL_Running: Yes

            Replicate_Do_DB: ipm3

        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: 9187563

            Relay_Log_Space: 9187700

            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

Slave_IO_State: 현재 Slave 상태를 나타낸다.(Appendix B 참고)

Slave_IO_Running: I/O Thread 상태

Slave_SQL_Running: SQL Thread 상태

Last Error: 최근에 발생한 오류정상인 경우  값은 없다.

Seconds_BeHind_Master:  값이 크면 클수록 Master로부터 복제할  없는 데이터가 많음을 나타낸다.

 

 

mysql> stop slave

mysql> start slave

MySQL 데몬(서비스)  시작하면 slave 자동으로 시작된다.(my.ini 옵션 skip-slave-start 있으면 자동 시작 안한다.)



[기타 알아두어야 할 내용]

1. 안정성을 위해서 두대의 DB서버의 버전을 동일하게 맞추어 주는것이 좋다.

2. 버전이 다른경우 높은 버전은 Slave 만 가능하다.

3. 서버는 Master 를 먼저 시작한 후 Slave를 시작시킨다.

4. Master의 status 에 지정된 File 이외의 로그파일은 삭제해도 무방하다.

5. Master의 status의 Position과 Slave status의 Read_Master_Log_Pos는 동일해야 한다.

6. 서버환경, 계정이 바뀐후에는 데이터 디렉토리안의 master.info를 변경하거나 제거한 후 재시작을 해야한다.

7. Master의 Replication로그나 Slave의 relay-bin로그는 vi로는 읽을수 없으며 아래와 같은 방법으로 변환후에 읽을 수 있다.


# mysqlbinlog KRDAC1FLD001-relay-bin.000002 > log.sql

8. Insert 이후 Slave 동기화 도중 데이터 조회가 이루어 져야 하는 상황에는 해당 경우만 Master DB에서 보게 하거나 process 종료 후 sleep 타임을 잠시주어 해결하면 된다



1. 구성도



MySQL 리플리케이션은 이중화의 역할 보다는 부하 분산의 역할을 한다고 볼 수 있다. 이 구성은 데이터베이스의 데이터를 갱신(입력/수정/삭제 등) 및 조회(검색 등)하는 비율에 따라 도입 유무를 판단 할 수 있다. 물론, MySQL 리플리케이션 도입에 가장 이상적인 서비스는 대형 포털 사이트와 같은 조회형 서비스에 적합하다.


2. 슬레이브 서버 별로 데이터 분산



MySQL 리플리케이션에서 슬레이브 서버마다 데이터를 동일하게 가져갈 수 있지만 이처럼 각각의 데이타를 가지고 있을 수 있다. 이와 같이 데이터를 나눠 주는 이유는 부하 분산의 차원이다.


3. 이중마스터 서버



MySQL 리플리케이션에 이중 마스터 서버 구성으로 하는 이유는 슬레이브 서버로 인한 마스터의 서버의 부하를 분산하는 차원이다. 여기서 마스터2 서버는 각 슬레이브에 대해서 마스터 서버의 역할을 수행하긴 하나 마스터1 서버에 대해서는 슬레이블 서버의 역할을 하고 있다.


4. 장애 대처



MySQL 정상적인 서비스가 진행 중이다. 평시에는 슬레이브 서버 중 하나를 백업용으로 활용하는 것도 좋다.


5. 장애복구



MySQL 리플리케이션 서비스 중에 마스터 서버에 장애가 발생하였다면, 슬레이브 서버 중 하나를 마스터 서버로 전환을 하여 서비스를 정상적으로 복구 할 수 있다. 추후 장애가난 마스터 서버가 정상화 되면 슬레이브 서버 중 하나로 역할을 수행하게 만든다.



출처 : http://hanaduri.egloos.com/2389708



반응형

어쩌면 당연한 말일 수 도 있지만..


어느 누군가에게(여기서는 직장 상사) 좋은 성능을 낼 수 있는 방안 등을 제안하기 전에,


해당 부분을 미리 진행한 후 그것을 토대로 성능 비교 등의 문서와 함께


제안을 하는 것이다.



그 동안 나는 주로 제안하기 전에 제안서? 문서 등을 만든 후 여기에는 여러 공식 자료 또는 테스트 결과서들 (내가 테스트한 자료가 아닌)

등을 첨부하여 제공하였다....


하지만 이런 부분이 잘못됬다는 것은 아니지만,

그래도!!!먼저 현재 우리 시스템에 대해 테스트한 결과를 제공한다며...


그것이 더 효율적이다 라는 것이다....


습관이 중요한 듯 하다.

습관으로 만들자...

반응형

'Life' 카테고리의 다른 글

요즘 근황 16.07.15  (0) 2016.07.15
필요 테스트 및 공부해야 될 내용  (0) 2016.07.04
블로그의 의미  (0) 2016.03.14
[16.01.12] 뭐가 더 옳은 걸까..  (0) 2016.01.12
2016 병신년 늦은 새해 인사  (0) 2016.01.06

우연히 NGinX 에 대해 잠시 접할 기회가 생겼다.


물론 이제는 조금씩 블로그에 포워딩이 될 듯 하고 나 또한 이번 기회에 견문을 넓힐 수 있는 기회가 되었으면 좋겠다.

(이정해 과장님 감사요..!!)


아래는 나무위키에서 소개하는 내용이다.



2002년부터 러시아의 프로그래머 이고르 시쇼브(Игорь Сысоев)가 Apache(아파치)를 코딩하다 Apache의 C10K 문제[1]를 보고 이를 극복하면서 네이티브 Win32환경에도 돌아갈 무설치 웹 서버 프로그램에 대한 개발을 시작하여 2004년 스푸트니크 1호 발사일에 발표한 오픈소스 서버 프로그램. 현재 이고르 시쇼브와 그가 설립한 회사인 Nginx Inc.가 이 프로젝트를 운영중에 있다. 목표는 가벼우면서도 강력한 프로그램이라고... HTTP와 리버스 프록시, IMAP/POP3등의 서버를 구동가능하다. 


읽을때는 엔진엑스라고 읽는다. 역사가 그렇게까진 오래되진 않아서 점유율 면에서 Apache에게 많이 밀린다. 하지만 신규서비스를 중심으로 점유율에 가속이 붙는 중이며, 이미 Apache가 여러가지면에 한계를 많이 보였으므로 특별히 큰 사유가 없다면 nginx로 갈아타는 추세다. 다만 확장 모듈이 Apache에 비해 적다는 것이 흠인데, 어차피 Apache의 이 많은 확장 모듈을 제대로 쓰는 사람은 드물다. 오히려 쓰지도 않으면서 괜히 덕지덕지 리소스만 낭비하는 모듈이 대부분이다. 따라서 호환성 확인 후 별다른 문제가 없다면 Nginx로 갈아타는 것이 현추세. 이미 필수적인 모듈은 Nginx에도 존재하고 그중 몇개는 Apache보다 50배 이상 빠르다(...) 마이크로소프트에게는 GUI관리가 쉬운 IIS에 밀리지만, 이쪽은 취향과 돈의 문제라서 1:1 비교가 힘들다.


구조적으로는 Apache에서 사용하는 스레드/프로세스 기반 구조 대신 비동기 이벤트 기반 구조를 가진다. 이로 인해서 서버 부하시 성능 예측이 쉽다. 덤으로 이로 인하여 10000개의 동시 접속을 하면 그 10000개에 드는 메모리 점유는 2.5MB다(....) 사용하는 리눅스 웹서버의 경우 LAMP(Linux + Apache + MySQL + PHP or Python or Perl)대신 LEMP를 쓴다. Nginx는 여러 서드파티 기능들(SSL, GeoIP등)을 모듈로 덧 붙이는 방식을 쓰고 있으며, 그래서 모듈을 쓰지 않을 경우 제외해 놓을 수 있다, 단, 소스 컴파일시 모듈을 추가하지 않으면, 그 이후에 추가가 안되지만...


Nginx는 현재 HTTP/2.0을 발빠르게 지원하려고 하고 있다. 아마 HTTP/2.0 보급화를 계기로 콩라인 획득(2등 위치)을 목표로 하는 듯하다. 그동안 콩라인은 IIS. 


Nginx를 사용하면서 conf 설정[2]을 바꿀때는 재시작 할필요 없이 reload를 하면 된다. 즉, 프로세스를 재시작 할 필요가 없다는 점이 있다.


넷크래프트의 2013년 1월 웹서버 조사에서, 조사한 사이트중 점유율 3위를 차지[3]하였으며, 아마존닷컴 웹 서비스(AWS)에서는 44%이상의 점유율로 1위, 활동적인 웹 서버중 3위[4]를 차지했으며, 이 속도라면 잘 나가는 사이트쪽에선 콩라인 획득 가능할듯 보여진다.

출처 : https://namu.wiki/w/Nginx#fn-6



다음은 NGinX 에 대한 설명해주는 곳이다.

앞으로 여기서 참고하면서 설치 및 간단한 예제를 만들어 볼 예정이다.


https://opentutorials.org/module/384/3462


그리고 여기는 간단하게 Apach와 NGINX 에서 php 사용 벤치 마크한 소개글이다

http://www.theorganicagency.com/blog/apache-vs-nginx-performance-comparison/


출처 : http://www.theorganicagency.com/blog/apache-vs-nginx-performance-comparison/


더 많은 정보는 아래에서 확인해 보면 좋을 듯 싶다.


http://openwiki.kr/tech/nginx


http://dkatlf900.tistory.com/32


http://blog.grotesq.com/post/414

반응형

'NGINX' 카테고리의 다른 글

[NGINX] php 연동 (Access denied.) & mysql 연동  (0) 2016.08.12
[NGinx] 설치 간단 정리  (0) 2016.08.05

점검하면서 쿼리를 작성 중 재밌는 일이 생겨서 공유해 본다.


select gender from employees group by gender;

select distinct(gender) from employees;


둘 다 gender의 상태(??갑자기 설명이 안되네;;;) 를 확인하기 위해서 동료가 group by로 작성하는 것을 보았다.


순간...왜 저렇게 해야되는 걸까? 간단하게 distinct 를 하면 되지 않느냐로 내가 질문하면서 궁금해서 찾아보게 되었다.


난 성능적인 차이가 더 궁금해서 찾아본 결과 다음과 같이 확인할 수 있었다.


동일한 로직을 이용하기에 성능의 차이는 없을 거지만,

group by는 정렬를 하기에 distinct가 조금 더 성능적으로 빠르다.


라는 결과를 얻을 수 있었다.

하지만 이거는 어디까지나 사람들의 의견만 보았다.


그래서 간단하게 테스트를 아래와 같이 진행 하였다.

아직 MySQL 의 쿼리 튜닝할 정도의 실력이 아니기에..간단하게 explain 으로 확인 하였다.



보는바와 같이 동일한 건수를 참조하며, 마지막에 Using filesort 라는 것을 확인할 수 있다.


Using filesort


쿼리에 ORDER BY가 포함되어있는 경우 DBMS 내부적으로 sort를 한다.(MySQL의 경우 퀵소트 알고리즘을 사용)

소트를 처리하기 위해서 메모리공간을 사용하며, 메모리가 부족할 경우 임시파일을 사용한다.

(임시파일은 HDD등의 저장장치에 생성되며 PC에서 가장 느린 성능을 보여주는 부분이다. 

-> 결과적으로 EXPLAIN시 Extra필드에 Using filesort가 표시된다면 이는 파일을 사용할 가능성이 크다는 것이며, 

가장 느린성능을 보여줄것이다.)


하지만 인덱스 순으로 행을 fetch할수 있으면 Filesort는 필요없게된다. 

이런경우 당연히 Extra필드에도 Using Filesort가 표시되지 않는다.

ORDER BY 구문에 인덱스가 사용되도록 쿼리나 테이블을 튜닝하자.


여기까지는 하나의 테이블에서 ORDER BY를 사용한 경우이다.


2개 이상의 테이블을 JOIN해야 하며 결과는 정렬되어 있어야 하는경우엔 어떻게 될까?

이경우엔 3가지 유형이 있다.


1. 첫 테이블을 인덱스를 이용하여 정렬하고, JOIN하는 경우

2. 첫 테이블을 FileSort해서 Join하는 경우 -> Using filesort

3. JOIN후 Filesort하는 경우(JOIN한 결과는 인덱스가 없으므로 JOIN후 Sort할때는 항상 Filesort이다.) -> Using Temporary, Using filesort

 

뒤로 갈수록 처리가 무거워 지므로 1,2번의 실행계획이 잡히도록 유도하는 것이 좋다.

1번을 유도하는 방법 -> WHERE절의 검색조건과 ORDER BY절의 소트조건을 하나의 테이블에 집중시킨다.

출처 : http://blog.daum.net/billbo/11


비록 적은 중복값에 대해서는 차이가 없을지 모르겠으나 그 값이 많아 진다면 group by로 해서 확인하는 것은 부하를 줄 수도 있을 것 같다.


자세한 Filesort 내용은 아래의 위치에서 확인해 보자

http://www.mysqlkorea.com/sub.html?mcode=manual&scode=01_1&m_no=22505&cat1=827&cat2=963&cat3=980&lang=k


sort를 하는 부분은 tmep를 사용하기에 가급적 sort할 필요가 없다면 distinct 를 사용해서 확인하는 것이 좋을 듯 싶다.


오랜만에 아키텍처까지 한번 더 볼 수 있는 좋은 기회였다.


반응형

Bin Log가 쌓이게 되면 디스크가 증가하기에 이에 대해서 방안을 파이썬으로 지우는 스크립트를 분석하면서

이와 관련된 블로그 찾아서 포워딩해 본다


우리 회사에서는 아래와 같은 쿼리를 사용한다


PURGE MASTER LOGS TO '%s'


%s 에는 binlog의 번호를 확인한다.(파일에서 ls 로 확인)


하지만 서버에서도 확인이 가능하다.


show master logs;


알아서 정렬되어 나오며, 특정 번호를 선정하면 그 하위 번호까지 모두 삭제가 된다.


ex) mysql> purge master logs to 'mysql-bin.001000';

지정된 바이너리 로그 이하의 파일이 삭제됨.
mysql-bin.000001~0000999 까지 삭제됨.


참조 : http://www.ischo.net/mysql/2875


  MySQL Binary Log 는 add, delete, insert, update 등의 query 가 저장되어 있는 파일로서 MySQL 을  설치하게 되면 기본적으로 MySQL Binary Log 가 생성됩니다.
 Binary Log 를 쌓지 않아도 되는 MySQL 구동 환경에서는 Binary Log 를 삭제하므로, 디스크 공간
 여유 공간을 확보할 수 있는데, MySQL Binary Log 를 지우는 방법에 대해서 알아보겠습니다.

1. MySQL Replication 환경에서 지우기

  - MySQL Replication MASTER 서버
    shell> mysql -u root -p
    mysql> RESET MASTER;

  - MySQL Replication SLAVE 서버
    shell> mysql -u root -p
    mysql> RESET MASTER;

2. MySQL Binary Log sequence number 또는 특정 일자로 지우기

  shell> mysql -u root -p
  mysql> PURGE BINARY LOGS TO 'mysql-bin.000015';
  shell> mysql -u root -p
  mysql> PURGE BINARY LOGS BEFORE '2009-05-01 00:00:00';

3. mysqladmin flush-logs 명령어를 통해서 MySQL Binary Log 지우기

   shell> mysqladmin -u root -p flush-logs

4. MySQL Binary Log 생성을 방지하는 방법

  /etc/my.cnf 파일에서 아래 라인을 주석 처리
  log-bin

5. MySQL Binary Log 를 특정 1주일까지만 생성 및 보관하기
  /etc/my.cnf 파일에서 아래 라인을 추가

  expire_logs_days = 7


출처 : http://faq.hostway.co.kr/Linux_DB/1307

반응형
업무를 하고 중간에 내가 하고 싶었던 일을 하다 보니 한번에 모든 것이 정리되는 것이 아니라

띄엄띄엄 정리를 하게 된다.


그러다 보니 어제는 분명히 완벽히 되던 것이 오늘 진행하다 보면 진행이 안되는 경우가 생긴다


어제까지 완벽히 Install 이 진행 되었었는데, MySQL 에 로그인까지 되는 것을 확인 했다.


하지만 다음날 DB를 내렸다가 다시 올리게 되면 로그인은 커녕 MySQL 이 시작도 안되는 현상이 발생 되었다.



맨 처음에 언급했듯이 해당 서버는 많으 사람들이 이용하는 개발 DB이다.

물론 개발자들을 위해서 멀티로 DB를 설치해 주고 또한 나도 여기서 필요시에 다른 버전을 설치한다.


그러다보니 3.x 버전부터 5.0x 버전 지금의 5.6.31까지 몇개의 MySQL 엔진이 설치되어 있다.


당연히 my.cnf 도 몇개가 있다.


참조 : http://jmkjb.tistory.com/entry/MySQL5621SetupSourceCompile


여기서 보면 service를 등록하는 부분이 있다.


나 또한 등록하여 진행을 하는데,

- cp /usr/local/rmysql/support-files/mysql.server /etc/init.d/mysqld


- vi /etc/init.d/mysqld

아래 내용수정

basedir=/usr/local/rmysql

datadir=/usr/local/rmysql/DB/data


- chkconfig mysqld on

- chkconfig --list mysqld

 

6. MySQL 서비스 시작


- service mysqld start


여기까지 따라한 후 service 를 시작하면 다음과 같은 에러를 발견할 수 있다.



ㅎㅎㅎㅎㅎㅎ여기에 보면 이상한 숫자들과 경로들을 볼 수 있다.

이 부분들은 내가 mysqld 파일을 디버깅하면서 적어 놓은 것들이다....ㅠㅠ


다음은 실행하면서 떨어진 devDB.err 이다



전의 포스팅한 내용에는 분명 rmy.cnf 에는 해당 skip-locking 이라는 설정이 전혀 있지 않다.


상사의 말 한마디에 my.cnf (3버전에서 쓰는 것) 을 확인해 보았다.



ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

나랑 장난치냐 지금 너!!!!!!!

ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ


 vi /etc/init.d/mysqld


그래......여기를 수정하면 가능하겠다 싶어 수정하였다.


 echo $echo_n "Starting MySQL"

    if test -x $bindir/mysqld_safe

    then

      # Give extra arguments to mysqld with the my.cnf file. This script

      # may be overwritten at next upgrade.

      $bindir/mysqld_safe --defaults-file=/etc/rmy.cnf --datadir="$datadir" --pid-file="$mysqld_pid_file_path" $other_args >/dev/null 2>&1 &

      wait_for_pid created "$!" "$mysqld_pid_file_path"; return_value=$?


빨간색으로 수정해 주었다.

이것을 처음부터 알았다면 고생 안했을 일을....


친구야...우리 앞으로 잘 지내자....ㅠ


나처럼 my.cnf 위치를 수정해서 쓰는 분들은 꼭 확인해 보세요....


이로써 나는 또 초급이란 것을 티내고 있다.....


이제는 3버전에서 5.6으로 Migration 하는 부분을 올릴 예정이다.

테스트는 금방 할 것 같지만...테스트 데이터는 3버전에서 사용하는 것들이라 많은 부분을 수정해 줘야 할 듯 싶다.


Oracle에서 심심하면 했던 Migration.....새삼 그립다....ㅎㅎ

여기서도 패러럴이 먹히면 좋겠지만.....

반응형

DB 를 설치해 보자.


먼저 설치를 하기 전에 현재 개발 서버에는 Mysql 3.2X 가 무수히 멀티로 운영중이며, 또한 MySQL 5.0x 버전 또한 설치가 되어 있다.


그렇기에 나는 기존 설치 방식이 아닌 다른 방식으로 설치를 진행할 수 밖에 없었다.



1. my.cnf 생성


이 부분은 앞으로 수정되어야 할 듯싶다.


#my.cnf 를 읽는 순서

#1. /etc/my.cnf파일

#2. /etc/mysql/my.cnf

#3. /usr/local/mysql/etc/my.cnf

#4. ~/.my.cnf


[client]

default-character-set = euckr

#default-collaction-set = euckr_korean_ci #euckr_bin

[mysqld]

user = mysql

port            = 4958

basedir = /usr/local/rmysql

datadir = /usr/local/rmysql/data

tmpdir = /usr/local/rmysql/tmp

socket          = /tmp/rmysql.sock

default-storage-engine = MyIsam

event-scheduler = ON

sysdate-is-now


#######

back_log = 100

max_connections = 300

max_connect_errors = 999999

thread_cache_size = 50

table_open_cache = 400

wait_timeout = 28800


max_allowed_packet = 32M

max_help_table_size = 32M

tmp_table_size = 512K


sort_buffer_size = 128K

join_buffer_size = 128K

read_buffer_size = 128K

read_rnd_buffer_size = 128K


query_cache_size = 32M

query_cache_limit = 2M


group_concat_max_len = 1024


########

######### MyISAM Option

## InnoDB를 사용하지 않고 MyISAM만 사용한다면 key_buffer_size 를 4GB까지 설정

key_buffer_size = 32M

bulk_insert_buffer_size = 32M

myisam_sort_buffer_size = 1M

myisam_max_sort_file_size = 2G

myisam_repair_threads = 1

myisam_recover

ft_min_word_len = 3


##로깅 옵션

pid-file = /usr/local/rmysql/logs/mysqld.pid

log-warnings = 1

log-error = /usr/local/rmysql/logs/mysqld


##General log 사용

general_log = 0

general_log_file = /usr/local/rmysql/logs/general_query.log


log_slow_admin_statements

slow-query-log = 1

long_query_time = 1

slow_query_log_file = /usr/local/rmysql/logs/slow_query.log


##replication option

##if this DB is Master DB then you need to remove #

log-bin = /usr/local/mysql/logs/binary_log

binlog_cache_size = 128K

max_binlog_size = 512M

expire_logs_days = 14

log-bin-trust-function-creators = 1

sync_binlog = 1


##if this DB is Slave DB then you need to remove #

#relay-log = /usr/local/rmysql/logs/relay_log

#relay_log_purge = TRUE

#read_only


##현재 서버가 슬레이브이면서 마스터 MySQL인 경우

##현재 MySQL 서버로 복제되는 쿼리를 바이너리 로그에 저장하려면 아래 주석을 해제

#log-slave-updates


위와 같이 작성 하였지만, 설치가 되지 않았다.


 - ...../rmysql/scripts 에서 처음 DB생성을 시도하였지만 아래와 같은 에러가 발생하였다.

FATAL ERROR: Could not find .//usr/local/rmysql/bin/my_print_defaults


If you compiled from source, you need to run 'make install' to

copy the software into the correct location ready for operation.


If you are using a binary release, you must either be at the top

level of the extracted archive, or pass the --basedir option

pointing to that location.


검색하였더니 scripts 폴더가 아닌 mysql base 위치에서 진행하라고 나와 있었다.(외국 블로그)


그래서 다시 base위치에서 진행을 시도 하였지만...아래와 같이 진행되고 stop 되었다.


Installing MySQL system tables...2016-06-14 15:11:49 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --ex                                                                                       plicit_defaults_for_timestamp server option (see documentation for more details).

2016-06-14 15:11:49 0 [Note] ./bin/mysqld (mysqld 5.6.31-log) starting as process 13591 ...


결국 찾지 못하고 base에 my.cnf 를 설정하기로 했다.(최대한 my.cnf 내용은 간소하게..설치가 목적이라..)


# For advice on how to change settings please see

# http://dev.mysql.com/doc/refman/5.6/en/server-configuration-defaults.html


[mysqld]


# Remove leading # and set to the amount of RAM for the most important data

# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.

# innodb_buffer_pool_size = 128M


# Remove leading # to turn on a very important data integrity option: logging

# changes to the binary log between backups.

# log_bin


# These are commonly set, remove the # and set as required.

# basedir = .....

# datadir = .....

# port = .....

# server_id = .....

# socket = .....


# Remove leading # to set options mainly useful for reporting servers.

# The server defaults are faster for transactions and fast SELECTs.

# Adjust sizes as needed, experiment to find the optimal values.

# join_buffer_size = 128M

# sort_buffer_size = 2M

# read_rnd_buffer_size = 2M


sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

#default-character-set = euckr  이게 문제였다...

character-set-server = euckr   이렇게 작성해 주었다.


user            = mysql

port            = 4958

socket          = /tmp/rmysql.sock

default-storage-engine  = myisam

event-scheduler = ON

sysdate-is-now


key_buffer_size                 = 32M

bulk_insert_buffer_size = 32M

myisam_sort_buffer_size = 1M

myisam_max_sort_file_size       =       2G

myisam_repair_threads                   =       1

myisam_recover

ft_min_word_len                                         = 3



[root@devDB:/usr/local/rmysql]# ./scripts/mysql_install_db --defaults-file=/usr/local/rmysql/my.cnf --basedir=/usr/local/rmysql --datadir=/usr/local/rmysql/data --explicit_defaults_for_timestamp=on


또 에러 발생...



...

2016-06-14 15:40:33 13684 [Note] InnoDB: 5.6.31 started; log sequence number 0

2016-06-14 15:40:33 13684 [ERROR] /usr/local/rmysql/bin/mysqld: unknown variable 'default-character-set=euckr'

2016-06-14 15:40:33 13684 [ERROR] Aborting


2016-06-14 15:40:33 13684 [Note] Binlog end

2016-06-14 15:40:33 13684 [Note] InnoDB: FTS optimize thread exiting.

2016-06-14 15:40:33 13684 [Note] InnoDB: Starting shutdown...

2016-06-14 15:40:34 13684 [Note] InnoDB: Shutdown completed; log sequence number 1600607

2016-06-14 15:40:34 13684 [Note] /usr/local/rmysql/bin/mysqld: Shutdown complete

OK


To start mysqld at boot time you have to copy

support-files/mysql.server to the right place for your system


PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !

To do so, start the server, then issue the following commands:


  /usr/local/rmysql/bin/mysqladmin -u root password 'new-password'

  /usr/local/rmysql/bin/mysqladmin -u root -h devDB password 'new-password'


Alternatively you can run:


  /usr/local/rmysql/bin/mysql_secure_installation


which will also give you the option of removing the test

databases and anonymous user created by default.  This is

strongly recommended for production servers.


See the manual for more instructions.


You can start the MySQL daemon with:


  cd . ; /usr/local/rmysql/bin/mysqld_safe &


You can test the MySQL daemon with mysql-test-run.pl


  cd mysql-test ; perl mysql-test-run.pl


Please report any problems at http://bugs.mysql.com/


The latest information about MySQL is available on the web at


  http://www.mysql.com


Support MySQL by buying support/licenses at http://shop.mysql.com


WARNING: Found existing config file /usr/local/rmysql/my.cnf on the system.

Because this file might be in use, it was not replaced,

but was used in bootstrap (unless you used --defaults-file)

and when you later start the server.

The new default config file was created as /usr/local/rmysql/my-new.cnf,

please compare it with your file and take the changes you need.


WARNING: Default config file /etc/my.cnf exists on the system

This file will be read by default by the MySQL server

If you do not want to use this, either remove it, or use the

--defaults-file argument to mysqld_safe when starting the server



- 이 부분은 위에서 수정해 주었다. #default-character-set = euckr  이게 문제였다...


이 후 다시 진행을 했더니 제대로 설치가 된 것 같았다.

이제 MySQL 를 실행해 보자


여기서는 아래 사이트를 참고하면서 진행 하였다.

참조 : http://jmkjb.tistory.com/entry/MySQL5621SetupSourceCompile

반응형

'MySQL' 카테고리의 다른 글

[MySQL] 빈로그 지우기 [펌]  (0) 2016.06.16
[MySQL]5.6.31 source 설치 (3) - 완료  (0) 2016.06.15
[MySQL]5.6.31 source 설치  (0) 2016.06.13
[MySQL] Federated Engine (Table) (2) - 마무리  (0) 2016.06.09
[MySQL] Federated Engine (Table)  (1) 2016.06.09

+ Recent posts