MongoDB Trasaction 지원 때문에 꽤나 시간을 썻다. 이게 replica set이랑 무슨 상관이 있나?

Spring - mongodb transaction을 하기 위해서는 replica set 구성이 필요하다고 한다.

관련해서 까먹지 않으려면 정보를 남겨야 할 것 같다.

아래 정리는 MongoDB는 설치되어 있다는 가정하에 진행하겠다.

1. 디비 저장할 폴더 2개 만들기.

MongoDB는 실행 시 데이터 저장할 곳을 정할 수 있다. 나는

위 처럼 mst(Master DB 저장될 곳) / sla(Slave DB 저장될 곳) 두 개의 폴더를 만들어서 구성하려고 했다.

2. MongoDB 실행하기

로그를 보기 위해서 nohup 없이 실행(나중에 정상적으로 된 후, nohup을 맨 앞에 붙여서 실행 해주면 됨)

[Master 실행]

nohup mongod --bind_ip 0.0.0.0 --port 27017 --dbpath /home/kaonsoft/push/mongoDB/mst -replSet rs0 --smallfiles --oplogSize 128 > /dev/null &

[Slave 실행]

nohup mongod --bind_ip 0.0.0.0 --port 27018 --dbpath /home/kaonsoft/push/mongoDB/sla -replSet rs0 --smallfiles --oplogSize 128 > /dev/null &

*참고 : 포트 27017 / 27018 은 다 열려있어야 한다.

3. 콘솔에 접속 해서 initiate 하기.

나는 Robo 3T 1.3.1 를 이용해서 접속했다.

우선 Master로 쓸 DB Console에 접속 해 rs.initiate() 실행한다.

그러면 replica value가 setting 되는데, rs.status() 로 확인 해 보면

Master mongoDB 에 primary 로 나타나는 것을 확인할 수 있다.

그 후 Master mongoDB shall 에 Secondary 로 쓸 mongoDB 정보를 추가한다.

rs.add("hostName:port")

* 나는 VM 하나에서 Replica Set을 구성한 것이기 때문에 hostName은 마스터에 등록되어있는 name의 ip영역 혹은 hostname으로 등록해줘야 한다.

이러면 기본적인 replica set이 완성된다.

추가적으로 아비터 붙이는 것은 다음에...

현재 MongoDB 공홈에 접속하면 Linux cent os 관련 버전은 찾을 수 없다. (사실 RHEL 버전 깔면 상관없긴하다.)

그래서 리눅스 커맨드 이용을 Putty 로 하고 파일 업로드를 FileZilla 로 하는 사람은 난감할 수 있다. (사실 RHEL 버전 업로드 하면 상관없긴하다.)

하지만 Cent OS 에서는 파일을 따로 업로드 받아서 푸는 형태로 하지 않아도 MongoDB를 설치 할 수 있다.

[1단계 – 몽고DB 리포지토리(repository) 추가하기]

mongodb-org 패키지가 CentOS의 기본 리포지토리에 포함되어 있지 않기 때문에 리포지토리 파일을 생성하여 추가해 주어야 한다.

$ sudo vi /etc/yum.repos.d/mongodb-org.repo

다음의 내용을 작성 후 저장한다. 이 때 몽고DB 문서 혹은 웹 사이트를 참조하여 적절한 버전을 기술해 준다.

[mongodb-org-3.4]

name=MongoDB Repository

baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.4/x86_64/

gpgcheck=1

enabled=1

gpgkey=https://www.mongodb.org/static/pgp/server-3.4.asc

------------------------------------------------------------------------------------------------------------------------------------------------------------------

[추가!!]

MongoDB 4.0 이상 버전부터 Spring Transaction 기능을 사용할 수 있게됨으로써 위의 설정 정보를 4.0으로 올리고 몽고DB 설치를 해야 yum에서 4.0 버전을 설치 할 수 있다.

[mongodb-org-4.0]

name=MongoDB Repository

baseurl=https://repo.mongodb.org/yum/redhat/7/mongodb-org/4.0/x86_64/

gpgcheck=1

enabled=1

gpgkey=https://www.mongodb.org/static/pgp/server-4.0.asc

Transaction이 필요하다면 위 설정 적용 필요

------------------------------------------------------------------------------------------------------------------------------------------------------------------

다음의 명령어를 이용하여 생성한 파일이 올바로 존재하는지 확인한다.

$ yum repolist

[2단계 – 몽고DB 설치하기]

앞서 작성한 mongodb-org 패키지를 yum을 이용해 실행한다.

$ sudo yum install mongodb-org

위의 명령을 입력하면 몽고DB 패키지를 설치할 것인지, 그리고 GPG 키를 임포트(imprt)할 것인지에 관련된 질문이 나타나며 수락하면 설치가 진행된다. 해당 프로세스가 끝나면 몽고DB의 설치는 완료된 것이며, 다음과 같은 명령어를 이용해 실행할 수 있다.

$ sudo systemctl start mongod

몽고DB를 중지하고자 할 경우 다음과 같은 명령어를 입력하면 된다.

$ sudo systemctl stop mongod

몽고DB 실행과 관련된 로그를 확인하고 싶을 경우에는 다음의 명령어를 이용한다.

$ sudo tail /var/log/mongodb/mongod.log

이와 같은 명령어들을 이용하여 몽고DB를 실행할 수 있다.

[3. 외부 접속 허용]

먼저 /etc/mongod.conf 파일에 접근하여 수정.

vi /etc/mongod.conf

맨 처음에는 기본 포트로 127.0.0.1 로 설정이 되어 있을 것인데, 이를 0.0.0.0으로 변경해야 함.

그리고 방화벽을 사용한다면 관련 Port 역시 오픈 시켜야 한다.

firewall-cmd --zone=public --permanent --add-port=27017/tcp

만약 Azure VM 혹은 Amazon 클라우드 사용하고 있다면 관련해서 Open처리를 해줘야 한다. Azure은 해봤는데 Amazon은 안 해 봤음...

(설치폴더는 다를 수 있음) E:\app\Administrator\diag\tnslsnr\WIN-KHF7ST29O0R\listener\trace

로그 4기가 넘는지 확인

listener status 에서 살아 있는 SID 보고

set ORACLE_SID = 살아 있는 SID

cmd -> sqlplus /nolog

sql -> connect /as sysdba

이 후 동작 하면 됨

'프로그래밍 > SQL' 카테고리의 다른 글

MongoDB 설치 및 외부접속 한방에 끝내기 -> Linux 편(Cent OS 8)  (0) 2022.05.12
잘 되던 Oracle 이 안될때  (0) 2022.05.12
Oracle 외부접속 허용  (0) 2022.05.12
Schema란?  (0) 2022.05.12
MYSQL 외부접속 허용  (0) 2022.05.12

프로세스는 운영체제로부터 자원을 할당 받는 작업의 단위이고 스레드는 프로세스가 할당 받는 자원을 이용하는 실행의 단위.

프로세스는 실행될 때 운영체제로부터 프로세서를 할당 받고, 운영되기 위해 필요한 주소 공간 , 메모리 등 자원을 할당 받음.

스레드는 한 프로세스 내에서 동작 되는 여러 실행의 흐름으로, 프로세스 내의 주소 공간이나 자원들을 같은 프로세스 내에 스레드 끼리 공유하면서 실행.

즉 프로세스와 스레드에 대한 질문 -> 운영체제가 시스템의 자원을 어떤 단위로 할당하고, 프로세스와 스레드는 이 자원을 어떻게 사용하느냐를 알고 있냐에 대한 질문

멀티 프로세스로 가능한 작업을 굳이 하나의 프로세스에서 스레드로 나눠서 하는 이유 -> 운영체제는 시스템 작업을 효율적으로 관리하기 위한 것이므로 이 목적을 더 크게 달성하기 위해서 스레드를 사용하는 것.

멀티 프로세스로 실행되는 작업을 멀티 스레드로 실행할 경우, 프로세스를 생성해 자원을 할당하는 시스템 콜이 줄어들어 자원을 효율적으로 관리할 수 있다. 뿐만 아니라 프로세스 간의 통신보다 스레드 간의 통신이 비용이 적으므로 작업들 간의 통신의 부담이 줄어들게 됨.

스레드 간의 자원 공유는 전역 변수를 이용하므로 동기화 문제 조심.

아래는 참고할 만한 설명 가져와 붙인 것...

리눅스 등의 멀티 프로세싱 운영체제에서는 동시에 여러 프로그램을 실행할 수 있다.

그때 실행 중인 프로그램에 대한 인스턴스를 프로세스라고 한다.

프로세스는 프로그램에 대한 각각의 인스턴스를 의미하므로,같은 프로그램을 여러개 띄웠다고 해서 하나의 프로세스를 공유하는 것은 아니다.프로세스는 운영체제로부터 주소공간, 파일, 메모리 등을 할당받는다.

리눅스 시스템에서는 코드 영역과 라이브러리를 프로세스 간에 공유하므로, 메모리 내에 코드와 라이브러리는 하나만 존재한다. 변수에 할당되는 공간으로 데이터 세그먼트와 스택 세그먼트는 프로세스 각각 가지고 있다. 그리고 각 프로세스 마다 실행 위치를 나타내는 PC(Program Counter)도 프로세스별로 관리한다.

스레드란 한 프로세스 내에서 동작되는 여러 실행의 흐름으로, 프로세스 내의 주소 공간이나 자원들을 대부분 공유하면서 실행된다.

기본적으로 하나의 프로세스가 생성되면 하나의 스레드가 같이 생성된다.이를 메인 스레드라고 부르며, 스레드를 추가로 생성하지 않는 한모든 프로그램 코드는 메인 스레드에서 실행된다.또한 프로세스는 여러개의 스레드를 가질 수 있으며 이를 멀티 스레드라고 한다.

프로세스는 자신만의 고유 공간과 자원을 할당 받아 사용하는데 비해 스레드는 다른 스레드와 공간과 자원을 공유하여 사용한다.

스레드는 프로세스 내에서 각각의 스택 공간을 제외한 나머지 공간과 시스템 자원을 공유한다.그러므로 프로세스를 이용하여 동시에 처리하던 일을 스레드로 구현할 경우 메모리 공간은 물론 시스템 자원 소모도 현격히 줄어든다.. 이와 같이 프로세스를 생성하는 것보다 스레드를 생성하는 것이 효율적이다. 특히 멀티 프로세서 환경에서는 더욱 효과가 탁월하다. 스레드 간의 통신이 필요한 경우 별도의 자원을 이용하는 것이 아니라 전역 변수의 공간을 이용하여 데이터를 주고받을 수 있다.

스레드의 장점을 정리하면 다음과 같다.

- 시스템의 throughput이 향상된다.

- 시스템의 자원 소모가 줄어든다

- 프로그램의 응답 시간이 단축된다.

- 프로세스 간 통신 방법에 비해 스레드 간의 통신 방법이 훨씬 간단하다.

마지막에 언급한 스레드 간의 통신시 데이터를 주고받는 방법은 메모리 공간을 공유하므로 데이터 세그먼트, 즉 전역 변수를 이용하여 규현한다. 그런데 공유하는 전역 변수를 여러 스레드가 함께 사용하려면 어떤 문제가 생길까? 바로 충돌이다. 따라서 스레드 간에 통신할 경우에는 충돌 문제가 발생하지 않도록 동기화 문제를 해결해야 한다.

스레드는 장점만 갖고 있는 것이 아니라 다음과 같은 단점도 지니고 있다.

- 여러 개의 스레드를 이용하는 프로그램을 작성하는 경우에는 주의 깊게 설계해야 한다. 미묘한 시간 차나 잘못된 변수를 공유함으로써 오류가 발생할수 있다.

- 프로그램 디버깅이 어렵다.

- 단일 프로세서 시스템에서는 효과를 기대하기 어렵다.

스레드는 POSIX 위원회가 표준을 정하기 전에는 각 운영체제 벤더에서 각각의 구조를 갖고 구현되어 왔다. POSIX 1003.1c 스레드 표준안이 마련되면서 비로소 동일한 방법으로 스레드를 구현할 수 있게 되었다. 리눅스의 스레드도 이 표준안을 거의 수용하고 있어 공통된 POSIX 스레드 라이브러리 함수들을 통해 스레드를 구현할 수 있다

방화벽 포트 설정 -> 인바운드 규칙으로 포트 열기.

기본 포트 1521

설치된 곳의 listener.ora / tnsnames.ora 설정

listener.ora

SID_LIST_LISTENER =

(SID_LIST =

(SID_DESC =

(SID_NAME = 설정된 sid id)

(ORACLE_HOME = 설치된 경로) ex -> D:\app\kaonsoft\product\11.2.0\dbhome_3

(PROGRAM = extproc)

(ENVS = "EXTPROC_DLLS=ONLY:D:\app\kaonsoft\product\11.2.0\dbhome_3\bin\oraclr11.dll")

)

)

LISTENER =

(DESCRIPTION_LIST =

(DESCRIPTION =

(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))

(ADDRESS = (PROTOCOL = TCP)(HOST = MeerueJP)(PORT = 포트)) -> defualt는 1521

)

)

ADR_BASE_LISTENER = D:\app\kaonsoft

tnsnames.ora

LISTENER_ORCL =

(ADDRESS = (PROTOCOL = TCP)(HOST = 해당 서버의 url )(PORT = 포트))

ORACLR_CONNECTION_DATA =

(DESCRIPTION =

(ADDRESS_LIST =

(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))

)

(CONNECT_DATA =

(SID = 설정된 sid id )

(PRESENTATION = RO)

)

)

ORCL =

(DESCRIPTION =

(ADDRESS = (PROTOCOL = TCP)(HOST = 해당 서버의 url )(PORT = 포트 ))

(CONNECT_DATA =

(SERVER = DEDICATED)

(SERVICE_NAME = ORCL)

)

)

이것으로 mssql / mysql / oracle 다 외부접속은 해본 것 같다

데이터베이스 스키마(database schema)는 데이터베이스에서 자료의 구조, 자료의 표현 방법, 자료 간의 관계를 형식 언어로 정의한 구조이다. 데이터베이스 관리 시스템(DBMS)이 주어진 설정에 따라 데이터베이스 스키마를 생성하며, 데이터베이스 사용자가 자료를 저장, 조회, 삭제, 변경할 때 DBMS는 자신이 생성한 데이터베이스 스키마를 참조하여 명령을 수행한다.

 

 

스키마는 3층 구조로 되어있다.

 

 

- 외부 스키마(External Schema) : 프로그래머나 사용자의 입장에서 데이터베이스의 모습으로 조직의 일부분을 정의한 것

- 개념 스키마(Conceptual Schema) : 모든 응용 시스템과 사용자들이 필요로하는 데이터를 통합한 조직 전체의 데이터베이스 구조를 논리적으로 정의한 것

- 내부 스키마(Internal Schema) : 전체 데이터베이스의 물리적 저장 형태를 기술하는 것

 

 

출처는 역시 위키피디아~

 

특정 사용자 계정의 외부접속 허용하기 - 여기서는 root 를 예로 든다.

1. mysql 접속 후 mysql database 선택

mysql> use mysql;

2. user 테이블 살펴보기

mysql> select host, user, password from user;

root 의 host 값들은 localhost, 127.0.0.1 등으로 기본 등록되어 있지만, 외부접속을 나타내는 값이 없다. 특정 아이피로 지정할 수도 있지만 여기선 % 기호로 어디서든 접속 가능하게 만든다.

3. 권한 설정

mysql> grant all privileges on *.* to 'root'@'%' identified by 'root의 패스워드';

Query OK, 0 rows affected (0.03 sec)

4. 등록확인하기

mysql> select host, user, password from user;

root 계정의 host 필드에 % 가 등록되었는지 확인한다.

5. refrash

mysql> flush privileges;

Query OK, 0 rows affected (0.00 sec)

1 . 방화벽에서 SQL 포트 허용인지 확인 -> 기본포트 보통 1433

2 . SQL 에 대한 프로토콜 확인 -> SQL 서버 구성 관리자 -> 네트워크 구성에서 TCP/IP가 사용으로 되어있나 확인

-> TCP/IP 우 클릭후 속성 클릭, 프로토콜 탭에서 모두 수신 예, 사용 예

-> IP 주소 탭에서 TCP 포트가 1433으로 되어있는지 확인, IP ALL 이라는 것에서 TCP 포트가 1433으로 되어있는지 확인.

3 . SQL Server 구성관리자(Configuration Manager) 에서 SQL Server 서비스 클릭하여 현재 실행중인 프로세스 중 SQL SERVER 가 실행되어 있는 것 중지시키고 다시 시작시켜봄.

-> This account is disabled error 해결법

로그인 후 계정에서 Security > Logins 에서 Properties 에 status -> Grant / Enabled 에 체크

다시 해보면 될 듯

참고할만한 사이트

http://egloos.zum.com/judgement/v/5178776

https://sqlandme.com/2013/06/24/sql-server-how-to-enable-a-disabled-sql-server-login/

http://blog.naver.com/PostView.nhn?blogId=dbekfk&logNo=10097594195

'프로그래밍 > SQL' 카테고리의 다른 글

Oracle 서버가 갑자기 죽어서 Service 와 Listener 를 살려도 먹통일 때  (0) 2022.05.12
Oracle 외부접속 허용  (0) 2022.05.12
Schema란?  (0) 2022.05.12
MYSQL 외부접속 허용  (0) 2022.05.12
MSSQL 외부접속 허용  (0) 2022.05.05

+ Recent posts