

| hostname | IP주소 | DNS |
|---|---|---|
| web1 | 192.168.10.10/24 | web1.sckwon.com |
| web2 | 192.168.10.20/24 | web2.sckwon.com |
| masterdb | 192.168.10.30/24 | masterdb.sckwon.com |
| slavedb | 192.168.10.40/24 | slavedb.sckwon.com |
| nfs | 192.168.10.50/24 | nfs.sckwon.com |
| dnsserver | 192.168.10.60/24 | ns.sckwon.com |
| iscsi | 192.168.10.70/24 | iscsi.sckwon.com |
| weblb | 192.168.10.100/24 | lb-web.sckwon.com |
| dblb | 192.168.10.200/24 | lb-db.sckwon.com |
$ dnf install bind
$ systemctl enable --now named.service
$ vi /etc/named.conf
# option 수정
options {
listen-on port 53 { any; };
listen-on-v6 port 53 { none; };
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
secroots-file "/var/named/data/named.secroots";
recursing-file "/var/named/data/named.recursing";
allow-query { any; };
# zone 추가
zone "sckwon.com." IN {
type master;
file "data/sckwon.zone";
};
zone "10.168.192.in-addr.arpa" IN {
type master;
file "data/10.168.192.in-addr.arpa";
};
$TTL 3D
@ IN SOA ns.sckwon.com. root. (
20240613 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
@ IN NS ns.sckwon.com.
ns IN A 192.168.10.60
@ IN NS web1.sckwon.com.
web1 IN A 192.168.10.10
@ IN NS web2.sckwon.com.
web2 IN A 192.168.10.20
@ IN NS masterdb.sckwon.com.
masterdb IN A 192.168.10.30
@ IN NS slavedb.sckwon.com.
slavedb IN A 192.168.10.40
@ IN NS nfs.sckwon.com.
nfs IN A 192.168.10.50
@ IN NS iscsi.sckwon.com.
iscsi IN A 192.168.10.70
@ IN NS lb-web.sckwon.com.
lb-web IN A 192.168.10.100
@ IN NS lb-db.sckwon.com.
lb-db IN A 192.168.10.200
$TTL 3D
@ IN SOA ns.sckwon.com. root. (
20240613 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
@ IN NS ns.sckwon.com.
60 IN PTR ns.sckwon.com.
10 IN PTR web1.sckwon.com.
20 IN PTR web2.sckwon.com.
30 IN PTR masterdb.sckwon.com.
40 IN PTR slavedb.sckwon.com.
50 IN PTR nfs.sckwon.com.
70 IN PTR iscsi.sckwon.com.
100 IN PTR lb-web.sckwon.com.
200 IN PTR lb-db.sckwon.com.
$ firewall-cmd --add-service=dns
$ dnf install mariadb-server
# 다음 접속 시에도 사용 가능 및 심볼릭 링크 생성
$ systemctl enable --now mariadb
$ firewall-cmd --add-service=mysql
$ mysql_secure_installation
$ mysql -u root -p

MariaDB [(none)]> create database sckwon;
MariaDB [(none)]> use sckwon;
MariaDB [sckwon]> create table student(
-> id INT AUTO_INCREMENT PRIMARY KEY,
-> name VARCHAR(10) NOT NULL,
-> age INT,
-> address VARCHAR(255) NOT NULL
-> );

$ vi /etc/my.cnf.d/mariadb-server.cnf
[mysqld]
autocommit=0
server-id=100
log-bin=mysql-bin
$ systemctl restart mariadb.service
# 다른 호스트에서도 접근 가능한 web_user 생성
$ MariaDB [(none)]> create user web_user@'%' IDENTIFIED BY '1234';
# master와 slave를 연결하기 위한 계정으로 설정
MariaDB [(none)]> grant replication slave ON *.* TO web_user@'%';
Query OK, 0 rows affected (0.001 sec)
# master 파일 정보 확인
MariaDB [(none)]> SHOW master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 645 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.000 sec)
# DB 복제를 위한 dump 파일 생성
$ mysqldump --all-databases -u root -p > web.dump
# scp 복제
$ scp web.dump vagrant@slavedb.sckwon.com:/tmp
$ mysql_secure_installation
$ vi /etc/my.cnf.d/mariadb-server.cnf [mysqld]
autocommit=0
server-id=101
log-bin=mysql-bin
read-only=0
$ systemctl restart mariadb.service
# masterdb 내용 덮어쓰기
$ mysql -u root -p < /tmp/web.dump
# master status에 맞게 CHANGE MASTER
> CHANGE MASTER TO master_host='masterdb.sckwon.com',master_user='web_user',master_password='1234',master_log_file='mysql-bin.000001',master_log_pos=645;
> START SLAVE;
slavedb에서 web.dump파일로 덮어씌움
이중화 정상 완료된 것을 SLAVE STATUS에서 확인
MasterDB에 데이터를 입력하고 commit 하면 SlaveDB에도 같은 데이터가 삽입 되는 것을 확인
selinux가 설정되어 웹 서버에서 데이터를 불러오지 못할 수 있어 다음 명령어로 해결함.
$ setsebool httpd_can_network_connect_db on
$ dnf install httpd
$ systemctl enable --now httpd
$ dnf install -y php php-mysqlnd
$ systemctl enable --now php-fpm.service
$ dnf install -y mariadb-server
$ firewall-cmd --list-all
services: cockpit dhcpv6-client dns http https mysql ssh
# php 파일에 아래와 같이 db에 접근하기 위한 정보를 입력하고, 쿼리문, 틀을 짜주면 데이터를 불러올 수 있다.
$servername = "masterdb.sckwon.com";
$username = "web_user";
$password = "1234";
$dbname = "sckwon";
.
.
$query = "SELECT * FROM web_tab";
.
.
if (mysqli_num_rows($rst) > 0) {
while($i = mysqli_fetch_assoc($rst)) {
echo "id : " . $i["id"] . " | name : " . $i["name"] . "<br>" ;
}
}
..생략..

$ dnf install haproxy
$ vi /etc/haproxy/haproxy.cfg
frontend main
bind *:80
.
.
.
backend app
balance roundrobin
server app1 web1.sckwon.com:80 check
server app2 web2.sckwon.com:80 check
$ firewall-cmd --add-service=http

proxy 서버에서 localhost로 조회
client 서버에서 도메인으로 조회
$ vi /etc/haproxy/haproxy.cfg
defaults
mode tcp
log global
option tcplog
.
.
frontend main
bind *:3306
.
.
backend app
balance roundrobin
server app1 masterdb.sckwon.com:3306 check
server app2 slavedb.sckwon.com:3306 check
$ setsebool haproxy_connect_any on
$ firewall-cmd --add-service=mysql

정상 작동 확인
$ dnf install nfs-utils
# web서버에 작성한 파일을 nsf서버로 복제
[root@web1 ~]# scp /var/www/html/* nfs.sckwon.com:/share_php
root@nfs.sckwon.com's password:
get_student_data.php 100% 1546 2.6MB/s 00:00
index.html 100% 13 28.1KB/s 00:00
index.php 100% 5079 10.9MB/s 00:00
$ cat /etc/exports
/share_php web1.sckwon.com(rw,sync)
/share_php web2.sckwon.com(rw,sync)
$ exportfs -r
$ dnf install nfs-utils
$ dnf install autofs
$ systemctl enable --now autofs
$ vi /etc/auto.master.d/direct.autofs
/- /etc/auto.direct
$ vi /etc/auto.direct
/var/www/html -rw,sync nfs.sckwon.com:/share_php
$ ls /var/www/html/
get_student_data.php index.html index.php
$ firewall-cmd --add-service=nfs
$ setsebool httpd_use_nfs on


기존에는 web2 서버에 웹 코드 파일이 없었기 때문에 로드밸런서의 ip로 접근했을 때 정상 페이지(web1)와 File not found.(web2)가 번갈아가며 출력되었다.


현재는 웹 브라우저에서 새로고침을 하면 haproxy에 설정한 대로 roundrobin방식으로 번갈아가며 페이지가 출력된다
아직 web1에는 nfs 마운트를 하지 않아 기존 페이지가 출력되는 상태로 web1 서버에도 같은 작업을 해주면 같은 페이지가 두 서버를 번갈아가며 출력된다.

iscsi 서버의 /dev/sdb를 이용하여 iscsi 서버에서 원격으로 db 서버 두 개의 db 저장소 제공 목적

fdisk 명령을 이용, sdb에 논리볼륨 두 개를 생성
$ dnf install targetcli-2.1.57-2.el9.noarch
$ systemctl enable --now targetclid.service
$ targetcli
# 블록 생성
/> /backstores/block create name=masterdb-block dev=/dev/sdb5
/> /backstores/block create name=slavedb-block dev=/dev/sdb6
# iqn 주소 생성
/iscsi> create iqn.2024-06.com.sckwon.iscsi:target
# LUN 각각 생성
/> iscsi/iqn.2024-06.com.sckwon.iscsi:target/tpg1/luns create /backstores/block/masterdb-block
/> iscsi/iqn.2024-06.com.sckwon.iscsi:target/tpg1/luns create /backstores/block/slavedb-block
# acl 각각 생성
/> iscsi/iqn.2024-06.com.sckwon.iscsi:target/tpg1/acls create iqn.2024-06.com.sckwon.masterdb:initiator
/> iscsi/iqn.2024-06.com.sckwon.iscsi:target/tpg1/acls create iqn.2024-06.com.sckwon.slavedb:initiator
$ systemctl enable target.service
$ firewall-cmd --add-service=iscsi-target
$ dnf install -y iscsi-initiator-utils
$ systemctl enable --now iscsi
$ vi /etc/iscsi/initiatorname.iscsi
# masterdb
InitiatorName=iqn.2024-06.com.sckwon.masterdb:initiator
# slavedb
InitiatorName=iqn.2024-06.com.sckwon.slavedb:initiator
$ iscsiadm -m discovery -t st -p iscsi.sckwon.com
$ iscsiadm -m node -T iqn.2024-06.com.sckwon.iscsi:target -l
$ mkfs -t xfs /dev/sdb
$ vi /etc/fstab
/dev/sdb /var/lib/mysql xfs _netdev 0 0

마운트 후에도 db 정상작동 확인
$ ls -ldZ /var/lib/mysql/
drwxr-xr-x. 5 root root system_u:object_r:unlabeled_t:s0 4096 Jun 14 02:01 /var/lib/mysql/
$ restorecon -Rv /var/lib/mysql/
$ ls -ldZ /var/lib/mysql/
drwxr-xr-x. 5 root root system_u:object_r:mysqld_db_t:s0 4096 Jun 14 02:01 /var/lib/mysql/
[root@MasterDB ~]# mysql
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (111)
마운트 후 복원 파일에 대해 mysql에 접근할 수 없는 오류 발생
$ systemctl stop mysqld
$ restorecon -Rv /var/lib/mysql/
$ chmod -R 755 /var/lib/mysql/
$ chown -R mysql:mysql /var/lib/mysql/
$ systemctl start mysqld
권한 및 소유그룹을 수정하여 해결
오류 메시지
해결 후 정상 작동 중

masterdb에서 데이터 삽입 후 slavedb에서 생성된 것 까지 확인
인증 관련 파일은 vi /etc/httpd/conf.d/ssl.conf의 내용과 위치가 일치해야한다.
# 개인 키 생성
$ openssl genrsa -out /etc/pki/tls/private/private.key 2048
# csr 생성
$ openssl req -new -key /etc/pki/tls/private/private.key -out /etc/pki/tls/private/private.csr
# x.509표준을 따르는 인증서 생성
$ openssl x509 -req -signkey /etc/pki/tls/private/private.key -in /etc/pki/tls/private/private.csr -out /etc/pki/tls/private/cert.crt
$ bash -c 'cat /etc/pki/tls/private/private.key /etc/pki/tls/private/cert.crt >> /etc/haproxy/certs/private.pem
'
$ vi /etc/haproxy/haproxy.cfg
frontend main
bind *:80
bind *:443 ssl crt /etc/haproxy/certs/private.pem
$ systemctl restart haproxy.service
$ firewall-cmd --add-service=https

