5 minute read

온프레미스 환경에서 3티어 아키텍처 구현

3계층 아키텍쳐

아키텍쳐 종류

  • 수직 분할형 아키텍쳐 : 역활별로 나눔
  • 수평 분할형 아키텍쳐 : 같은 역할끼리 모아놓음
  • 지리 분할형 아키텍쳐

실습

가상머신 생성

  1. haproxy 192.168.197.100
  2. httpd1 192.168.197.10
  3. httpd2 192.168.197.20
  4. was1 192.168.197.30
  5. was2 192.168.197.40
  6. db1 192.168.197.50
  7. db2 192.168.197.60

백업용 스냅샷 만들기

image

실습

아파치, 아파치 톰캣, DB 연동하기

아파치 서버 설정(http1 사용)

  1. 웹서버 설치
    yum -y install httpd
    
  2. 방화벽 해제
    systemctl stop firewalld
    systemctl disable firewalld
    setenforce 0
    
  3. 관련 패키지 및 모듈 설치
    yum install -y httpd httpd-devel gcc gcc-c++
    yum install -y wget
    wget https://dlcdn.apache.org/tomcat/tomcat-connectors/jk/tomcat-connectors-1.2.48-src.tar.gz
    
  4. 모듈 설치 ```shell tar zxvf tomcat-connectors-1.2.48-src.tar.gz 압축 풀고 cd tomcat-connectors-1.2.48-src/native/ 이동하고 ./configure –with-apxs=/usr/bin/apxs yum install -y make yum install -y redhat-rpm-config make

# tomcat-connectors-1.2.48-src/native/apache-2.0 밑에 mod_jk.so 생성됨

cd /apache-2.0

cp mod_jk.so /usr/lib64/httpd/modules/mod_jk.so

chmod 755 /usr/lib64/httpd/modules/mod_jk.so


4. 서버에서 모듈 적용 설정
``` shell
vi /etc/httpd/conf/httpd.conf	파일 60번 라인에 다음 내용 추가
LoadModule jk_module /usr/lib64/httpd/modules/mod_jk.so
	
<IfModule jk_module>
	JkWorkersFile /etc/httpd/conf/workers.properties
	JkLogFile /var/log/httpd/mod_jk.log
	JkLogLevel info
	JkLogStampFormat "[%a %b %d %H:%M:%S %Y]"
	JkMount /*.jsp worker1
</IfModule>
  1. 워커 파일 생성
     vi /etc/httpd/conf/workers.properties
     파일 안에 다음 내용 작성
     worker.list=worker1
    
     worker.worker1.type=ajp13
     worker.worker1.host=[톰캣의 IP] #지금 같은 경우는 was1의 아이피인 192.168.197.30
     worker.worker1.port=8009
    
  2. 테스트 파일 생성 ``` shell vi /var/www/html/index.html

apache1 입력


7. 톰캣 설정 후 재시작.


#### 톰캣 서버 설정(was1 사용)
1. 방화벽 해제
```shell
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
  1. 설치
  • JDK 설치 ```shell yum -y install java-1.8.0-openjdk-devel.x86_64

버전 확인

java -version


- 톰캣
``` shell
yum install -y wget 
wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.65/bin/apache-tomcat-9.0.65.tar.gz
tar zxvf apache-tomcat-9.0.65.tar.gz

mv apache-tomcat-9.0.65 /usr/local/tomcat9
  1. 톰캣 설정 ```shell vi /usr/local/tomcat9/conf/server.xml # 파일에서 153번 줄에 다음 내용 추가

121번 라인에 다음 내용 추가

<Connector protocol=”AJP/1.3” address=”0.0.0.0”| secretRequired=”false” port=”8009” redirectPort=”8443” />

/usr/local/tomcat9/webapps # 디렉토리 밑에 [이니셜] 디렉토리 생성

/usr/local/tomcat9/webapps/[이니셜] # 디렉토리 밑에 index.jsp 파일 생성

vi /usr/local/tomcat9/webapps/[이니셜]/index.jsp

파일에 다음 내용 작성 : test


4. 톰캣 서버 실행
```shell
/usr/local/tomcat9/bin/shutdown.sh
/usr/local/tomcat9/bin/startup.sh
  1. 톰캣 실행 확인 ```shell yum -y install net-tools netstat -anlp | grep :8080 netstat -anlp | grep :8009

6. 확인
내 아파치 서버 192.168.197.10/index.jsp에 들어갔을때, 톰캣에서 만든 index.jsp내용이 출력되어야 함

![image](/assets/img/image/aws3/2.png)
- httpd의 아이피를 입력했는데 was1의 있는 jsp파일의 내용이 나온다.
http에 jsp를 찾으면 jsp를 담당하는 곳으로 안내해준다.


#### DB 서버 설정(db1 사용)
1. 방화벽 해제
```shell
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
  1. mysql 설치 및 초기 설정 ```shell yum install -y mysql-server

systemctl restart mysqld

mysql_secure_installation

mysql -u root -p #mysql접속

```mysql
CREATE DATABASE [이니셜_db];				ex)CREATE DATABASE kjh_db;
CREATE USER '[이니셜]'@'%' IDENTIFIED BY '[DB 계정 패스워드]';	ex) CREATE USER 'kjh'@'%' IDENTIFIED BY 'qwer1234';
GRANT ALL PRIVILEGES ON [이니셜_db].* TO '[이니셜]'@'%';		ex) GRANT ALL PRIVILEGES ON kjh_db.* TO 'kjh'@'%';
FLUSH PRIVILEGES;
EXIT;
  1. DB 테이블 생성 ```mysql use kjh_db; CREATE TABLE student (sname VARCHAR(10), sage INT);

데이터 몇 개 넣기

INSERT INTO student VALUES(‘kim’,10); INSERT INTO student VALUES(‘lee’,20); INSERT INTO student VALUES(‘park’,30); INSERT INTO student VALUES(‘sim’,40);

4. 톰캣이랑 DB연동하기
- 톰캣서버(was1)에서
```shell
wget https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-8.0.19.tar.gz

# 압축, 아카이브 해제
tar zxvf mysql-connector-java-8.0.19.tar.gz

# 내용물 복사
cd mysql-connector-java-8.0.19
cp mysql-connector-java-8.0.19.jar /usr/local/tomcat9/lib/

#톰캣 재시작
/usr/local/tomcat9/bin/shutdown.sh
/usr/local/tomcat9/bin/startup.sh
  1. 최종 확인
    • 톰캣서버(was1)에 JSP생성
      vi /usr/local/tomcat9/webapps/kjh/kjh_db.jsp
      
<%@page import="java.sql.*"%>

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%
		Connection conn = null;
		ResultSet rs = null;
	      
		String url = "jdbc:mysql://[DB 서버 IP]:3306/[이니셜_db]?serverTimezone=UTC";
		String id = "[이니셜]";
		String pwd = "[DB 비번]";


		try {
			Class.forName("com.mysql.jdbc.Driver");
			conn = DriverManager.getConnection(url, id, pwd);
			Statement stmt = conn.createStatement();
     
	
			String sql = "SELECT sname FROM student";
			rs = stmt.executeQuery(sql);
			
			while(rs.next()) {
				out.println(rs.getString("sname"));
			}


			conn.close();
		} catch (Exception e) {

			e.printStackTrace();
		}	
	%>
</body>
</html>

image 다음과 같이 DB내용이 출력된다.

톰캣 여러대 쓰기(was2 사용)

  1. 톰캣 설정 was1과 같이 준비를한다.

  2. 아파치 서버 설정(http1)

    • 워커 파일 설정 수정
      vi /etc/httpd/conf/httpd.conf
      

      image 다음과 같이 파일내용을 worker1에서 loadbalace로 변경한다.

  • 워커 파일 변경 ```shell vi /etc/httpd/conf/workers.properties

worker.list=tomcat1,tomcat2,loadbalance

worker.tomcat1.type=ajp13 worker.tomcat1.host=[톰캣1의 IP] worker.tomcat1.port=8009 worker.tomcat1.lbfactor=1

worker.tomcat2.type=ajp13 worker.tomcat2.host=[톰캣2의 IP] worker.tomcat2.port=8009 worker.tomcat2.lbfactor=1

worker.loadbalance.type=lb worker.loadbalance.balance_workers=tomcat1,tomcat2

2. 톰캣 설정
- 웹페이지 설정 (was1,was2)
```shell
vi /usr/local/tomcat9/webapps/kjh/test.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>

<%@ page import="java.net.InetAddress" %>


클라이언트 IP <%=request.getRemoteAddr()%><br>
요청URI <%=request.getRequestURI()%><br>
요청URL: <%=request.getRequestURL()%><br>
서버이름 <%=request.getServerName()%><br>
<%
InetAddress inet= InetAddress.getLocalHost();
%>
동작 서버 IP <%=inet.getHostAddress()%><br>
서버포트 <%=request.getServerPort()%><br>

DB여러대 쓰기(db2 이용)

  1. DB서버 이중화
    • 보조 DB설정 (db2)
#방화벽 제거
systemctl stop firewalld
systemctl disable firewalld
setenforce 0

#mysql다운
yum install -y mysql-server
systemctl restart mysqld

mysql_secure_installation

  1. 마스터 DB설정(db1)
    /etc/my.cnf.d/mysql-server.cnf
    

    ```cnf

#내용 뒤에 추가 server-id = 1 log-bin = mysql-bin

systemctl restart mysqld


3. 마스터 상태 확인
```shell
mysql -u root -p #로그인
show master status;
CREATE USER 'slave_user'@'%' IDENTIFIED BY 'qwer1234';
GRANT REPLICATION SLAVE ON *.*  TO 'slave_user'@'%';
select * from mysql.user where user='slave_user'\G

image

  1. 데이터 백업(db1) ```shell mysql -u root -p mysqldump -u root -p –databases [이니셜_db] #현재 데이터를 슬레이브에 옮긴다.

scp back.sql [slave db 서버 ip]:/root/back.sql #백업파일을 db2에 옮긴다.

5. 슬레이브 DB설정이 끝나면
```shell
mysql -u root -p
UNLOCK TABLES;
  1. 슬레이브 DB설정
    • 파일설정 ```shell /etc/my.cnf.d/mysql-server.cnf #파일 설정

server-id = 2 # 내용 추가 systemctl restart mysqld


- 데이터복구
```shell
mysql -u root -p < back.sql
  • MASTER지정
    change master to
    master_host='192.168.197.50',
    master_user='slave_user',
    master_password='qwer1234',
    master_log_file='binlog.000001',
    master_log_pos=4165;
    
  • master_log_file, master_log_pos 확인
    show master status;	#master_log_pos는 쓸때마다 바뀌니 MASTER지정할때 해주자
    

    image

  • 동기화 시작
    start slave;
    
  • 슬레이브 상태 확인
    show slave status\G
    
  • 확인
    1. 마스터 DB에 정보 저장
      mysql -u root -p
      use [이니셜_db];
      INSERT INTO student VALUES('abcd',123); #데이터 아무거나 입력
      
    2. 슬레이브에서 데이터 확인
      mysql -u root -p
      use [이니셜_db];
      SELECT * FROM student;
      

      최종확인

  • 정보를 입력하면 db에 저장되는 웹사이트를 만들어보자
  1. http 웹서버 만들기(http1)
    vi /var/www/html/insert.html
    

    ```html <!DOCTYPE html>

입력

학생 정보 입력

이름:
나이:


2. jsp에 웹서버를 만들어 준다.(was1, was2)
```shell
vi /usr/local/tomcat9/webapps/kjh/insert.jsp
<%@page import="java.sql.*"%>

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
        <%
                Connection conn = null;

	  String url = "jdbc:mysql://[DB 서버 IP]:3306/[이니셜_db]?serverTimezone=UTC";
	  String id = "[이니셜]";
	  String pwd = "[DB 비번]";


                try {
                        Class.forName("com.mysql.jdbc.Driver");
                        conn = DriverManager.getConnection(url, id, pwd);
                        Statement stmt = conn.createStatement();

	          request.setCharacterEncoding("utf-8"); 
                        String sname = request.getParameter("sname");
                        String sage = request.getParameter("sage");

                        String sql = "INSERT INTO student VALUES('"+sname+"',"+sage+")";
                        int result = stmt.executeUpdate(sql);
                        if (result == 1) {
                                out.println("성공");
                        } else {
                                out.println("실패");
                        }
                        stmt.close();
                        conn.close();
                } catch (Exception e) {

                        e.printStackTrace();
                }
        %>
</body>
  1. 확인
    http://192.168.197.10/insert.html 접속
    image
    저장을 눌러본다.

image
정보가 입력되면 안에 입력해 놓은 코드가 작동되기 때문에 jsp파일로 전환이 된다.

image
slave 서버인 db2에서 입력한 결과 성공적으로 입력이 된걸 확인 할 수 있다.