구성환경

- Rocky 9 Linux

 

동시 접속자가 150만명인 시스템에 MySQL DB를 사용중인데,

입력/수정에 대한 부하가 DB가 감당하지 못하는 상황이 발생.

 

데이터 입력은 log 성이라 kafka로 비동기식으로 처리하고

데이터 UPDATE는 REDIS cache를 사용해서 처리 성능을 향상시키고자 함.

 

Redis 와 MySQL INSERT/UPDATE 성능 비교

 

환경구성

MySQL 설치 및 구성

mysql DB 서버 설치

$ sudo dnf install mysql-server

 

서버 재기동 시 mysql 자동 기동 설정

 $ sudo systemctl start mysqld.service

 

데이터베이스 보안 설정 

최초 설치 시 root 계정에 대한 암호가 설정되어 있지 않음.

mysql_secure_installation 으로

root 계정에 대한 강력한 암호 설정.

anonymous 계정 삭제.

원격 root 접속 차단 등을 설정함.

 

 $ sudo mysql_secure_installation

 

데이터베이스 계정 생성

root 계정으로 DB 접속(여기서 root는 linux의 root 계정이 아닌 MySQL 의 DB 계정임)

$ mysql -u root -p -h localhost

DB 계정 생성

mysql> CREATE USER 'dbuser'@'%' IDENTIFIED BY 'Dbuser123!';

 

Database(=Schema) 생성

mysql> CREATE DATABASE user_database;

 

계정 권한 부여

위에서 생성한 데이터베이스(스키마) 에 모든 권한을 부여한다.

mysql> GRANT ALL PRIVILEGES ON user_database.* TO 'dbuser'@'%';

 

 

REDIS 설치 및 구성

redis 설치

$ sudo dnf install redis

 

cofig 파일 수정

파일 내에서 supervised  라는 지시어를 찾아서  행의 주석(#)을 제거하고 auto 값을 systemd로 변경해 준다.  이 지시문을 사용하여 Redis를 서비스로 관리한다.

sudo vi /etc/redis/redis.conf

 

Redis service 시작

sudo systemctl start redis.service

 

Redis service 자동 시작 설정

$ sudo systemctl enable redis

 

다음 명령을 사용하여 Redis가 실제로 실행되고 있는지 테스트할 수 있다. 결과과 PONG 이 나오면 정상 실행 중이다.

$ redis-cli ping

 

 

Redis 구성으로 보안 설정

Redis가 localhost 또는 개인 IP 주소에만 바인딩되어 있는지 확인하고 서버에 방화벽이 실행되고 있는지 확인하면 이를 수행할 수 있습니다.

Redis 구성 파일을 편집한다.

$ sudo vi /etc/redis/redis.conf

바인딩으로 시작하는 줄을 찾아 주석처리가 되어 있을 경우 시작 부분의 # 기호를 제거한다.

/etc/redis/redis.conf
. . .
bind 127.0.0.1 -::1

 

Redis를 다른 IP 주소에 바인딩해야 하는 경우(별도의 호스트에서 Redis에 액세스하는 경우와 같이) 개인 IP 주소에 바인딩하는 것을 고려해야 한다. 공용 IP 주소에 바인딩하면 Redis 인터페이스가 외부 당사자에게 노출될 가능성이 높아진다.

 

 

Redis Password 설정

Redis 비밀번호를 구성하면 내장된 보안 기능 중 하나인 auth 명령이 활성화됩니다. 이 기능을 사용하려면 클라이언트가 데이터베이스에 대한 액세스를 허용하기 전에 인증을 받아야 합니다. 바인드 설정과 마찬가지로 비밀번호는 Redis의 구성 파일 /etc/redis/redis.conf에서 직접 구성됩니다. 

/etc/redis/redis.conf 파일을 열어

SECURITY 섹션으로 스크롤하여 다음과 같은 주석이 달린 requirepass 지시어를 찾아 주석을 해제합니다.

requirepass foobared

 

 

비밀번호를 직접 만드는 대신 apg 또는 pwgen과 같은 도구를 사용하여 비밀번호를 생성할 수 있습니다. 단지 비밀번호를 생성하기 위해 애플리케이션을 설치하고 싶지 않다면 아래 명령을 사용할 수 있습니다. 이 명령은 문자열 값을 에코하고 이를 다음 sha256sum 명령으로 파이프하여 문자열의 SHA256 체크섬을 표시합니다.

작성된 대로 이 명령을 입력하면 매번 동일한 비밀번호가 생성된다는 점에 유의해야 한다.. 고유한 비밀번호를 생성하려면 따옴표로 묶인 문자열을 다른 단어나 문구로 변경해야 한다.

echo "digital-ocean" | sha256sum

 

해당 명령의 출력을 복사하여 requirepass의 값으로 붙여넣는다.

requirepass <password_copied_from_output>

 

패스워드를 설정한 후 redis 를 재기동한다.

sudo systemctl restart redis

 

비밀번호가 작동하는지 테스트하려면 Redis 클라이언트를 연다.

redis-cli

다음은 인증 전에 키에 값을 설정하는 명령어이다.

set key1 10

(error) NOAUTH Authentication required.

아직 인증하지 않았으므로 Redis는 오류를 반환합니다.

 

다음 명령은 Redis 구성 파일에 지정된 비밀번호로 인증합니다.

auth <your_redis_password>

인증 후 다시 아래 명령어를 수행하면 정상 수행된다.

set key1 10
OK

 

아래 명령어로 인증 암호를 확인할 수도 있다.

> config get requirepass

 

전체 키 갯수 확인 

> dbsize 
# 아래 명령어로 key 개수, expires 등 확인
> info keyspace

 

REDIS에 대한 상세 정보 확인(CPU, Memory, Module, Cluster, Keyspace, Server, Client 등에 대한 정보)

> info

 

 

 

 

 

 

 

 

 

Python 으로 MySQL과 redis UPDATE 성능 비교 --> 보완중

 

 

pip redis 모듈 설치(redis server)

$ pip3 install redis

 

 

 

 

 

 

 

 

 

 

MySQL connection driver 설치

$ pip install mysql-connector-python

 

 

+ Recent posts