# pcs resource group add WebSite VirtualIP ldirectord
- Constraint
■ Constraint 란?
- Pacemaker 를 통해 리소스 위치나 순서, 동거 조건을 제약하는 설정.
- Score 점수를 통해 여러 설정이 가능하므로, 설정 방법에 대해서는 알고 있어야 함.
1) Constraint 값 확인.
# crm_simulate -sL
- Pacemaker를 시작할 때 리소스가 어느 node에서 설정을 가져갈지 예상하는 시뮬레이션 값.
# pcs constraint show
- constraint 설정 값 확인하는 명령어.
2) Location 설정 추가 - Locaiton : 시작 노드를 제약하는 명령으로, 해당 노드의 상태를 평가하고 그것에 매치하였을 경우 점수 값을 부여. [ex] pcs constraint location [Resource Name] prefers <[Node Name]=Score 값> ※ 주의사항 : Score값을 지정하지 않을 경우 가장 높은 우선순위인 'INFINITY' 값을 부여.
- Master 서버의 장애로 인해 변경하는 것이 아닌 경우 데이터 변경을 막기 위해 LOCK을 걸고 진행
- 기존 Matser 서버에서 실행
mysql>FLUSH TABLES WITH READ LOCK;
2. Slave → Master 설정
1) replication 계정 생성
- Slave 서버를 Master 로 변경하기 위해 Slave 서버에도 replication 계정 생성
mysql>grant replication slave on *.* to repl_user@'121.000.000.000' identified by 'test!@#$';
2) Slave 종료
mysql> stop slave;
mysql> show slave status\G → 정상 종료 확인
3) master 설정 추가
# vi /etc/my.cnf
---------------------------------------------------------------------------------------------- [mysqld] server-id=2 log-bin=mysql-bin → binary log 파일 경로 설정 추가 binlog-do-db='repltestdb' → replicate-do-db 에서 binlog-do-db로 변경 binlog-ignore-db='testdb' → replicate-ignore-db 에서 binlog-ignore-db로 변경 #read_only → read_only 설정 주석 또는 제거 ----------------------------------------------------------------------------------------------
* 만약 log-bin=mysql-bin 설정이 이미 되어있는 경우에는 삭제 (재구동시 자동으로 생성)
# rm -f mysql-bin.*
# /etc/init.d/mysql.server restart → 재구동하여 적용
4) Master 서버 정보 확인
mysql> show master status;
3. Master -> Slave 설정
1) slave 설정 추가
---------------------------------------------------------------------------------------------- [mysqld] server-id=1 replicate-do-db='repltestdb' → binlog-do-db 에서 replicate-do-db 로 변경 replicate-ignore-db='testdb' → binlog-ignore-db 에서 replicate-ignore-db 로 변경 skip-slave-start read_only → DB 데이터가 변경되는 것을 막기 위해 추가 ----------------------------------------------------------------------------------------------
# /etc/init.d/mysql.server restart → 재구동하여 적용
2) master 연결 설정
mysql> change master to master_host='121.000.000.000', master_user='repl_user', master_password='test!@#$', master_log_file='mysql-bin.000001', master_log_pos=154;
3) Slave 시작
mysql> start slave;
mysql> show processlist\G → 연결 확인
4. replication 구성 확인
1) Master 서버에서 프로세스 연결 확인
mysql>show processlist\G
* State 에서 binlog를 slave로 전송하였으며 업데이트 대기중인 상태 확인
2) Slave 서버에서 확인
mysql>show processlist\G
* State 에서 log를 읽었으며 업데이트 대기중인 상태 확인
mysql> show slave status\G
3) replication 확인
1) Master 서버 DB 데이터 입력
mysql>insert into user(no,name,det,tel) values(9,'Css','Lang'.'070-1234-1234');
- 통신오류는 연결이 비정상적인 상태이기에 Error정보와 Error코드가 에러원인과 다른 경우가 많이 있다. - 오류가 발생할 수 있는 경우의 수를 하나씩 체크
- mysql 상태 확인
* Master / Slave 서버 모두 mysql이 정상 실행중인지 확인
# ps -ef | grep mysql → 프로세스 동작 확인
# netstat -tnlp | grep 3306(포트번호) → 실행 포트 확인
# mysql -u root -p → 접속가능 여부 확인
# tail -f /usr/local/mysql/data/error.log → mysql 에러로그 확인
- 네트워크 상태 확인
* Master / Slave 서버 모두 네트워크 통신에 이상이 없는지 방화벽 허용이 되어있는지 확인
# iptables -nL → 방화벽 허용 확인
# ifconfig, ethtool, ping → 네트워크 상태 확인
- replication 계정 확인
* Slave 서버에서 Master 서버 replication 계정에 접속가능 하도록 허용되어 있는지 확인
mysql > show grants for repl_user;
- max_allowed_packet 문제 확인
* Master 서버의 허용패킷이 작아서 Slave 서버로 데이터가 정상 전달되지 못하여 에러발생
mysql> show variables like 'max_allowed_packet'; -> 현재 설정값 확인(byte 단위)
2. SQL 오류
- SQL 오류는 master 서버에서 실행된 쿼리가 slave 서버에서 실행이 불가능한 경우 발생 - Error정보와 Error코드 확인이 중요
- 에러코드로 확인시 없는 테이블에 쿼리를 날린경우 발생하는 오류로 확인
Error number 1146; Symbol: ER_NO_SUCH_TABLE; SQLSATATE:42s02
Message: Table '$s.$s' doesn't exist
5) 오류 복구
1. mysql 프로세스 문제, 네트워크 문제
Replicaiton 자체 오류가 아닌 외부 요인으로 인한 오류로 문제 원인 해결시 대부분 자동으로 복구가 된다. 정상화 되었음에도 복구가 되지 않을 경우 slave 를 재시작하여 다시 적용 mysql> stop slave; mysql> show slave status\G → 정상 종료 확인 mysql> start slave; mysql> show slave status\G → 정상 연결 확인
Slave_IO_Running 상태가 Yes 로 복구되면 정상 연결된 상태
2.max_allowed_packet 문제
허용 값이 작아 에러가 발생한 경우 max_allowed_packet 크기를 올려준다. mysql> SET GLOBAL max_allowed_packet = 1024 * 1024 * 16; mysql> SET SESSION max_allowed_packet = 1024 * 1024 * 16; mysql> show variables like 'max_allowed_packet'; → 설정값 다시 확인
일시적으로 허용 값을 올린 상태로 지속적인 적용을 위해 my.cnf 에 설정 변경 # vi /etc/my.cnf
3. 일시적으로 발생한 SQL 오류
- 일시적으로 발생한 오류로 데이터에 영향을 주지않는 경우 skip 하여 오류 복구
mysql> stop slave; mysql> show slave status\G → 정상 종료 확인 mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; → 1개의 쿼리를 건너뛰고 replication 진행 mysql> start slave; mysql> show slave status\G → 상태 확인
※ 동일한 에러가 자주 발생하거나 여러번 발생하여 skip 이 어려운 경우 Errorno 를 기준으로 스킵하도록 설정 # vi /etc/my.cnf --------------------------------------------------------------------------------------------- [mysqld] slave-skip-errors=1146 → Errorno 를 입력 (여래개의 경우 , 로 구분. 전체는 all 입력) ---------------------------------------------------------------------------------------------- # /etc/init.d/mysql.server restart mysql> start slave; mysql> show slave status\G → 상태 확인
4. 지속적이거나 장기간 발생한 오류
(1) 오랜시간 에러 지속으로 DB 차이가 다량 발생한 경우 (2) replication 지연이 발생하여 Seconds_Behind_Maseter 가 많이 증가한 경우 (3) 일시적인 에러지만 데이터 정합성에 영향에 주는 경우 (4) binlog 파일이 깨진 경우
- 위 경우들은 skip 할 수 없거나 skip 하여도 재발생 가능성이 높은 경우로 master 서버에 데이터로 replication 재설정이 필요하다 ※ replication 재설정 - replication 설정할 DB를 master 서버에서 dump 생성
mysql> FLUSH TABLES WITH READ LOCK; → replication 구성간 데이터 변화를 막기 위해 Lock 상태로 전환
mysql> show master status; → slave 서버에 설정한 binary log 파일과 Position 확인
mysql ((none))>use mysql mysql (mysql)> grant replication slave on *.* to [Replication ID]@localhost identified by ‘[Replication PW]’; mysql (mysql)> grant replication slave on *.* to [Replication ID]@[Slave 서버 IP] identified by ‘[Replication PW]’;
2. my.cnf 수정 후 MySQL 재시작
# vi /etc/my.cnf =================================================== [mysqld] ~ log-bin=[바이너리로그 파일 이름]
# vi /etc/my.cnf =================================================== [mysqld] ~ replicate-do-db=’[복제하고자 하는 DB]’ server-id=[Master server-id 제외한 1 ~ 2^32-1 내의 숫자] relay-log=[릴레이 로그 이름 및 위치] expire_logs_days=[로그 파일 보관 일수] slave-skip-errors=all read_only ===================================================
* slave-skip-errors=all
Last_Error: Error 'Can't create database 'repl_db'; database exists' on query. Default database: 'repl_db'. Query: 'create database repl_db default character set utf8'
에러 발생하며 Slave 서버가 정상작동하지 않는경우가 발생
에러 발생시점부터 Master 서버로 부터 갱신된 쿼리를 실행하지 않게되므로 이에러를 skip 할수 있도록 옵션추가
# /etc/init.d/mysql.server restart
1-2. Replication Slave 설정 (mysql 들어가 설정하는 방법)
mysql ((none))> change master to MASTER_HOST='[Master 서버 IP]', MASTER_USER='[Replication ID]', MASTER_PASSWORD='[Replication PW]', MASTER_PORT=[MySQL Port], MASTER_LOG_FILE='[Master File]', MASTER_LOG_POS=[Master Position];
2. Slave 정보 확인
mysql ((none))>show slave status\G; Slave_IO_State: Waiting for master to send event Master_Host: [Master IP] Master_User: [Replication ID] Master_Port: [MySQL Port] Connect_Retry: 60 Master_Log_File: [Master File] Read_Master_Log_Pos: [Master Postion] Relay_Log_File: [Relay File] Relay_Log_Pos: [Master Position] Relay_Master_Log_File: [Master File] Slave_IO_Running: Yes Slave_SQL_Running: Yes ~ Slave_SQL_Running_State: Reading event from the relay log
* sharedscripts : postrotate / endscript 스크립트 한번 실행
* postrotate / endscript : 순환작업 후 실행할 작업 설정
* dateext : 로그파일에 YYYYMMDD 형식의 확장자 추가
테스트
# /usr/sbin/logrotate -d /etc/logrotate.conf
실행
# /usr/sbin/logrotate /etc/logrotate.conf
logrotate 정상실행 되지 않을 경우 (로그디렉토리가 /usr 일 경우)
logrotate 테스트시 정상적으로 실행되었다고 나오나, 실질적으로 logrotate가 되지 않는경우가 있습니다.
* /var/log/syslog 에러로그
Aug 7 00:00:02 www systemd[1]: logrotate.service: Main process exited, code=exited, status=1/FAILURE Aug 7 00:00:02 www systemd[1]: logrotate.service: Failed with result 'exit-code'. Aug 7 00:00:02 www systemd[1]: Failed to start Rotate log files.