서버에 FTP 설정 중 갑자기 안되길래 서비스를 체크해보니 액티브가 failed 상태다.

 

netstat 한 결과 포트도 열려있지 않다.

 

무엇이 문제인지 결국 못 찾았다...

 

그래서 패키지 삭제하고 다시 설치하니 됐다... 

여윽시 만물재설치...

 

apt purge vsftpd 사용하면 설정 파일들도 같이 삭제한다.

패키지 목록을 갱신합니다

apt update

모든 패키지를 최신 버전으로 업그레이드합니다.

apt upgrade

abc 패키지를 설치합니다. 의존성있는 패키지도 함께 설치합니다.

apt install 패키지명

abc 패키지를 삭제합니다. 설정 파일 등은 삭제하지 않습니다.

apt remove 패키지명

더 이상 필요 없는 패키지들을 삭제합니다.

apt autoremove

설정 파일 등도 포함하여 abc 패키지를 삭제합니다.

apt purge 패키지명

abc와 관련된 패키지를 검색합니다.

apt search 패키지명

abc 패키지의 정보를 출력합니다.

apt show 패키지명

패키지 목록을 출력합니다.

apt list

설치된 패키지 목록을 출력합니다.

apt list --installed

업그레이드 가능한 패키지 목록을 출력합니다.

apt list --upgradable

DML(Data Maniplulation Language)는 데이터 조작어 즉 실제 코드에서 많이 다루는 부분이다.

어차피 문법은 다른 DB나 개발 언어에서 비슷하다. 그러니 일단 스탠다드한 형태만 알아두고 사용하고, 만약 에러가 난다면 그때 한번씩 해당 언어랑 DB를 검색해보면 된다.

우선 명령어 종류다.

명령어의 종류는 SELECT, INSERT, UPDATE, DELETE가 있다.

위에 명령어는 다양하게 사용할 수 있다. 내가 생각나는대로 쓰는 것보다 계속 다양한 쿼리를 쓸 때 업데이트 하는 게 좋을듯하다.

그리고 쿼리문은 줄바꿈을 해도 상관 없다. 그리고 대소문자도 상관 없다. 어쨋든 DB는 내장함수를 대소문자, 줄바꿈 상관 없이 구분한다. 물론 컬럼이나 테이블은 아니다. 그리고 한 쿼리문당 세미콜론으로 구분한다. 그래서 끝날 때엔 세미콜론을 붙여줘야한다. 

DB마다 내장함수들도 다양하니 한번 검색해보길 바란다.


Select 명령어

Select 명령어는 생성되어 있는 테이블에서 데이터를 가져오는 명령어다.

자연스럽게 조건에 맞는 데이터라는 말이 따라 붙을 것이다. 

물론 조건문에 중첩 또한 가능하다. 다중 If 문 또는 다중 For 문 처럼 말이다. 그러니 좀 더 유연하게 사용하길 바란다.기본 형태는 아래와 같다.

Select 추출할 컬럼  From 해당 테이블  Where 조건문

예를 하나 들어보겠다.

SELECT * FROM table WHERE id = 'user';

table 테이블에서 id가 user의 컬럼 데이터를 모두 가져온다는 뜻이다.

Select문은 나의 경우는 조건문에서 많이 갈린다. 예를 들어 AND 나 OR 그리고 다중 Select 문을 사용하여 데이터를 추출한다.


Insert 명령어

Insert는 명령어는 이미 생성된 테이블에 데이터를 삽입하는 명령어다.

이 명령어는 해당 테이블에 필요한 컬럼의 데이터만 넣을 것인지 아니면 해당 테이블의 모든 컬럼 데이터를 넣을 것인지 쿼리문에서 구별할 수 있다. 모든 컬럼 데이터를 삽입할 경우 컬럼의 순서에 맞게 모든 데이터를 입력해야한다. 특정 컬럼의 데이터만 넣을 시에는 Into 부분에서 컬럼을 같이 써줘야한다.

INSERT INTO 테이블(컬럼1, 컬럼2, ... )
        VALUES (컬럼1 데이터, 컬럼2 데이터, … )

INSERT INTO 테이블
        VALUES (컬럼1 데이터, 컬럼2 데이터, … )

첫번 째 Insert문은 바로 특정 컬럼의 데이터만 넣고 싶을 때이다.

두번 째 Insert문은 해당 테이블에 모든 컬럼에 데이터를 삽입하고 싶을 때 쓰는 경우다.

아래 예시를 한번 보자.

INSERT INTO table (id, name) VALUES ('user', '홍길동');

Update 명령어

Update 명령어는 이미 들어가 있는 데이터를 수정하는 명령어다.

조건식을 통해 구분하여 데이터를 수정한다.

* 이 부분에서는 조건문을 사용하지 않으면 그 테이블에 해당 컬럼이 모두 바뀌니 주의하자.

UPDATE  테이블명
SET     컬럼1 = 컬럼1의 데이터, 컬럼2 = 컬럼2의 데이터, ...
WHERE   조건식

예를 한번 들어보겠다. 아래는 name이 홍길동인 사람의 id를 모두 400으로 수정하는 쿼리다.

UPDATE  table
SET     id = '200'
WHERE   name = '홍길동';

주의할 점은 조건문에 기본키가 아닌 다른 컬럼일 경우 적어도 1개 이상의 데이터가 변경될 수 있다. 

그러니깐 이름이 홍길동인 사람들의 id가 다 바뀐다.


Delete 명령어

Delete 명령어는 특정 데이터나 아니면 테이블에 있는 데이터를 삭제할 수 있다.

이 명령어도 주의해야 할 점은 조건문이 잘못될 경우 상관 없는 데이터가 삭제될 수 있다. 그리고 조건문이 없으면 모든 데이터가 삭제된다.

DELETE FROM 테이블 WHERE 조건문

예를 한번 들어보겠다. 아래는 name이 '홍길동'인 사람의 데이터를 삭제하는 쿼리다.

DELETE FROM table WHERE name = '홍길동';    

Update 문 처럼 조건문에 기본키가 아닌 다른 컬럼일 경우 적어도 1개 이상의 데이터가 삭제될 수 있다.

그러니깐 이름이 홍길동인 사람들의 데이터는 다 삭제된다.

 

* 저는 현재 Mysql을 사용하고 있습니다.

#mysql dml

구글에 올라온 건 대부분 VMWare 통해서 가상장치에서 설정하는게 대부분이었다. 나는 공부하는게 아니라 로컬 서버를 구성해야 하기 때문에 대부분 자료들은 걸러졌다. 

우선 시도하다가 의문점이 생겼다. 

1. Hardware RAID 

이건 메인보드에서 지원을 하는지가 중요하다. 우선 내가 지금 하고 있는 서버는 지원이 가능한데 RAID 레벨이랑 디스크 설정이 어떻게 하는지가 없다... 이부분은 서버 제조사에 문의를 해봐야한다. 우선 BIOS에서 RAID를 하였지만 리눅스 계열 OS 설치과정에서 RAID 한 것 처럼 보이지가 않고 각각 HDD가 따로 보인다. 이대로 OS를 설치하면 error가 발생하면서 설치가 되지 않았다.

2. Software RAID

(1) OS 설치할 때 RAID 하거나 (2) ubuntu OS 설치 이후에 명령어를 통해서 하는 방법이다.

3. 파일시스템 디스크를 포함한 RAID 구성 - 이 부분은 궁금증이다.

OS 설치할 때 RAID 구성은 아주 간단했다. 디스크 설정만 하면 됐다. 그런데 문제는 boot 디스크는 남겨야한다. 즉 디스크가 8개가 있으면 1개는 파일시스템을 받아야하기 때문에 남기고 나머지 7개만 RAID 구성을 한다는 얘기다. /boot, / , SWAP 은 1개의 디스크에만 설치하고 나머지 7개만 RAID 구성을 하였다. 이게 맞는지 잘 모르겠다. 지인은 이게 맞다고 하는데...

다른 글에서 RAID를 하는 과정을 포스팅할 예정이다. Hardware RAID는 해봤는데 해당 메인보드 버전에 따른 문제가 생겨서 복잡했고 이 회사 메인보드가 아니라면 해당사항 또한 없기 때문에 불필요할거라 생각된다.

그렇기 때문에 Software RAID 만 할 쓸 예정이다. 우선 OS 설치시 IP 설정 또한 같이 다루면 편할 듯 싶다.

복수 배열 독립 디스크(Redundant Array of Independent Disks 혹은 Redundant Array of Inexpensive Disks)는 여러 개의 하드디스크에 일부 중복된 데이터를 나눠서 저장하는 기술이다. 

여러 개의 디스크를 하나로 묶어 하나의 논리적 디스크로 작동하게 하는데, 하드웨어적인 방법과 소프트웨어적인 방법이 있다. 하드웨어적인 방법은 운영체제에 이 디스크가 하나의 디스크처럼 보이게 한다. 소프트웨어적인 방법은 주로 운영체제 안에서 구현되며, 사용자에게 디스크를 하나의 디스크처럼 보이게 한다.

초기에는 HDD 업그레이드 후 폐기하기엔 아깝고 그렇다고 쓰기에는 성능이 떨어져서 계륵과 같은 HDD를 재활용할 목적으로 사용했다. 그래서 초기에는 Inexpensive로 사용하였는데 현재는 Independent 의미로 사용한다.

RAID는 저장장치의 가용성과 성능 향상에 의미를 두고 있다. 단순히 데이터 백업의 용도로 사용되는 기술이 아니다. 디스크의 고장나도 고장난 디스크만 교체해주면 서버 정지 하지 않아도 복구가 가능하다. 이런 기능을 보고 백업에 의미만 생각하지 않았으면 좋겠다. 요즘 같은 경우는 미러링 서버나 다른 데이터 백업 솔루션을 마련해 둔다.


1. RAID 0 - Striping, 스트라이핑(부르는 사람 맘인듯하다...난 스트리핑이라고 부름...)

여러 개의 멤버 하드디스크를 병렬로 배치하여 거대한 하나의 디스크처럼 사용한다. 데이터 입출력이 각 멤버 디스크에 공평하게 분배되며, 디스크의 수가 N개라면 입출력 속도 및 저장 공간은 이론상 N배가 된다. 다만 멤버 디스크 중 하나만 손상 또는 분실되어도 전체 데이터가 파손되며, 오류검출 기능이 없어 멤버 디스크를 늘릴수록 안정성이 떨어지는 문제가 있다. 따라서 장착된 하드디스크의 개수가 RAID-5 구성 조건에 충족되지 않는 등의 불가피한 경우가 아니라면 절대로 RAID 0으로 구성하지 않는 걸 추천한다.

 

2. RAID 2 - Mirroring

RAID로 묶인 디스크끼리 같은 데이터를 기록한다. RAID로 묶인 디스크 중 하나만 살아남으면 데이터는 보존되며 복원도 1:1 복사로 매우 간단하기 때문에, 서버에서 끊김 없이 지속적으로 서비스를 제공하기 위해 사용한다.

디스크를 늘리더라도 저장 공간은 증가하지 않으며, 대신 가용성이 크게 증가하게 된다. 상용 환경에서는 디스크를 2개를 초과해서 쓰는 경우가 드물지만, 극한 환경에서는 3개 이상의 디스크를 사용하기도 한다. 읽기 성능이 향상되기도 하지만 쓰기를 시도할 때에는 약간의 성능 저하가 뒤따른다.

 

3. RAID 2~4

오류정정부호(ECC)를 기록하는 전용의 하드디스크를 이용해서 안정성을 확보한다. RAID 2는 비트 단위에 Hamming code를 적용하며, RAID 3, 4는 각각 바이트, 워드 단위로 패리티를 저장한다. 하나의 멤버 디스크가 고장나도 ECC를 이용하여 정상적으로 작동할 수 있지만, 추가적인 연산이 필요하여 입출력 속도가 매우 떨어진다. 예를 들어서 디스크 1에 3, 디스크 2에 6을 저장하면 디스크 3에는 1+2의 값인 9를 저장한다. 이렇게 저장하면 디스크 1이 사라지더라도 디스크 2의 6의 값을 읽고, 디스크 3의 9의 값에서부터 디스크 1의 값 3을 읽을 수 있기 때문에 저장소 하나가 파손되더라도 데이터를 읽을 수 있는 것이다. 용량을 약간 희생하지만 하드 하나만 뻑가도 망할 수 있는 일부 레이드 시스템에 비해 매우 높은 가용성과 저장용량 효율을 보인다.

모든 I/O에서 ECC 계산이 필요하므로 입출력 병목 현상이 발생하며, ECC 기록용으로 쓰이는 디스크의 수명이 다른 디스크들에 비해 짧아지는 문제가 있어 현재는 사용하지 않는다.

 

4. RAID 5 

 

RAID 0처럼 데이터를 블록 단위로 디스크에 저장을 하는데 에러로 인한 손실 방지 패리티가 같이 저장된다, RAID 1처럼 디스크 1개가 고장이나도 고장난 디스크만 교체하면된다. 그런데 디스크가 두 개 이상 고장 나면 데이터가 모두 손실된다. 데이터베이스 서버 등 큰 용량과 무정지 복구 기능을 동시에 필요로 하는 환경에서 주로 쓰인다.

주의할점

(1) RAID 0보단 안전하다는 인식과 달리 오히려 많은 량(보통 8개 이상)의 디스크를 스토리지로 묶으면, 패리티 연산오류 발생 확률이 높아져서 인해 RAID 0으로 묶은 것보다 깨질 확률이 높아진다고 한다. 그러므로 대단위로 스토리지를 만드려면 RAID 6 또는 RAID 1+0을 권한다. 다만, 이는 레이드 대상 HDD가 7개 이하일 경우에는 해당되지 않는다.

(2) 고장난 장비를 교체하려다 고장 없는 하드디스크를 뽑는다면 RAID 전체가 망가진다. 동일 상황에서 RAID 6는 문제가 없다.

(3) 한 개의 디스크가 고장 났을 경우 고장난 하드를 교체하면 복구가 가능하지만 2개 이상의 디스크 고장이 나면 복구가 불가능하다.

즉 RAID 0에서 성능과 용량을 조금씩 줄이는 대신 안정성을 높인 레벨이라고 볼 수 있다.

 

RAID 6

RAID 5와 원리는 같다. 서로 다른 방식의 패리티 2개를 동시에 사용한다. 성능과 용량을 희생해서 가용성을 높인 셈. N개의 디스크를 사용하면 (N-2)배의 저장 공간을 사용할 수 있다. 비용이 RAID 5보다 더 비싸고, 디스크도 기본 4개 이상 확보해야 하므로 초기 구축 비용이 비싸다. 하드디스크를 대단위로 물려야 하고, 가용성의 필요성이 RAID 5보다 높아야 하는 상황에서 쓰인다.

 

6. Nested RAID

(1) RAID 0+1 

RAID 0로 구성된 하드디스크들을 RAID 1로 미러링 한다. 하드디스크 2개를 RAID 0로 구성 한 후 다른 하드디스크 2개에 RAID 1 미러링을 합니다. 이럴 경우 같은 데이터가 저장된 디스크 0 , 2 또는 디스크 1 , 3 가 같이 고장 또는 다운이 된다면 복구 할 수 없다. 

 

(2) RAID 1+0

 RAID 1로 미러링 된 디스크를 RAID 0으로 구성한다. RAID 0+1에 비해 디스크 장애 발생 시 복구가 수월하다.

 

더 많은 Nested RAID 가 있지만 그 부분은 내가 하지 않을 것 같아 직접 찾아보기 바란다.

우분투서버에서 Redis 설치를 진행했다.

서버 개발하다보니 세션키나 인증키를 보관할 일이 생겼다.

그래서 Redis를 사용해보기로 했다.

우선 설치다.

# apt-get install redis-server

설치가 다 됐으면 Redis 설정을 할 차례다.

# vi /etc/redis/redis.conf

주석처리되어 있어서 찾기 힘드니 검색하면 쉽게 찾을 수 있습니다.(vi 기준 /찾을단어 입력 > 엔터 > n키로 다음 넘기기)

메모리 할당

maxmemory 우선 1G로 바꿔줍니다. 

메모리 정책 - maxmemory-policy 

allkeys-lru : lru 알고리즘(오래도안 사용하지 않은 데이터를 제거하는 알고리즘)을 기반으로 키를 삭제하는 정책으로 수정.

외부접속 - bind

외부접속을 허용하려면 이 부분을 수정하면된다. 만약 외부접속을 허용했다면 PW를 필히 설정해야겠습니다.

PW - requirepass

foobared 부분을 지우시고 사용할 비밀번호를 입력합니다.

 

마지막으로 변경을 다 했다면 redis-server를 재시작 해줍시다.

sudo systemctl restart redis-server.service

'IT > Linux Server' 카테고리의 다른 글

[Ubuntu Server 20.04 LTS] RAID 6 구성  (0) 2021.02.24
[Linux] RAID  (0) 2021.02.22
[Ubuntu Server 20.04 LTS] MySQL 삭제  (0) 2021.02.02
[ubuntu server 20.04 LTS] MySQL 외부 접속 문제  (1) 2021.02.02
[ubuntu server 20.04 LTS] MySQL 설치  (0) 2021.02.01

DB 때문에 이렇게 고생을 해야한다는게 화가난다...

Error fetching schema list: Error executing 'SHOW DATABASES' Lost connection to MySQL server during query. SQL Error: 2013

이 에러는 workbench에서 실행한 쿼리에 걸리는 시간이 길어져서 정해진 제한시간 동안 쿼리가 종료되지 못해서 발생한 에러다.

나의 경우는 import하는데 특정 테이블이 커서 오래걸려서 동안 발생했다.

해결방법은 쿼리 제한 시간을 늘려주면 된다.

workbench 탭에서 edit > Preferences >SQL Editor

DBMS connection keep-alive interval : 연결 유지 시간 간격
DBMS connection read timeout interval : 읽기 시간 초과 간격
DBMS connection timeout interval 연결 시간 초과 간격 

이 3개를 늘려주면 해결됩니다.

Dump 파일을 다시 import 했는데 대충 그냥 게이지만 보고 됐겠네 하고 스키마 탭 보니깐 DB가 안생겨져있었다.

다시 import 하고 log를 보니 에러가 있었다.

ERROR 1049 (42000): Unknown database 'DB명'

참 어처구니가 없었다.

MySQL에서 DB 백업 후 복원 할 때 자주 생긴다고 한다.

당연히 내가 DBA가 아닌 이상 왜 그런지는 잘 몰랐다. 당연히 나는 import하는데 DB도 생성해주는 줄 알았기 때문이다.

에러 메세지 그대로 DB를 알 수 없다는 의미다.

create database DB;

이거 한 줄 이면 해결된다.

DB import 시 해당 DB와 동일한 DB가 생성 되어 있어야 한다고 한다.

이제야 Default Target Schema 의미를 알게된듯...?

+ Recent posts