performance_schema.global_status 의 Uptime 값은 초로 표시되기 때문에 초를 시분으로 변환하여 조회
-- Uptime 을 시분 형식으로 표시 SELECT TIME_FORMAT(SEC_TO_TIME(variable_value ),'%H시간 %i분') as Uptime FROM performance_schema.global_status WHERE variable_name='Uptime'; [결과값] 40시간 16분
--Uptime 을 datetime 형식으로 표시 SELECT FROM_UNIXTIME(UNIX_TIMESTAMP() - variable_value) as Uptime FROM performance_schema.global_status WHERE variable_name='Uptime'; [결과값] 2025-03-25 07:31:29.000000
3) mysql 명령어로 확인
# mysql -u<user> -p<password> -e "status;" | grep -i "uptime" [결과값] Uptime: 2 days 26 min 56 sec
<user>, <password> 는 각자의 DB에서 사용하는 user와 패스워드를 입력
3) mysqladmin status 명령어로 확인
# mysqladmin status -u<user> -p<password> [결과값] Uptime: 145329 Threads: 9 Questions: 46314 Slow queries: 0 Opens: 478 Flush tables: 3 Open tables: 399 Queries per second avg: 0.318
<user>, <password> 는 각자의 DB에서 사용하는 user와 패스워드를 입력
4) mysqladmin version 명령어로 확인
# mysqladmin version -u<user> -p<password> | grep -i "uptime" [결과값] Uptime: 1 day 16 hours 24 min 51 sec
MySQL 이벤트는 일정에 따라 실행되는 작업입니다. 예약된 이벤트라고 합니다. 이벤트를 만들면 주기적인 간격으로 실행할 SQL 문이 포함된 데이터베이스 객체를 만들고, 특정 시간에 시작합니다. Unix crontab (일명 " cron job " ) 또는 Windows 작업 스케줄러와 유사합니다.
Event 관리 - 생성/수정/삭제
1) Event Scheduler 활성화
이벤트를 실행하려면 Event Scheduler가 활성화되어 있어야 합니다. Event Scheduler가 활성화되어 있지 않다면 아래 명령어로 활성화시킵니다.
SET GLOBAL event_scheduler = ON;
2) Event 생성 권한
이벤트가 생성될 스키마에 대한 권한이 필요합니다. Event 생성 권한이 없다면 아래와 같이 EVENT 권한을 부여합니다. 이벤트는 schema 레벨의 권한이므로 테이블 레벨로 권한을 부여할 수 없습니다.
GRANT EVENT ON schemaname.* TO username@'%";
3) Event 생성
아래는 Event 생성 예시입니다.
CREATE EVENT myevent
ON SCHEDULE AT TIMESTAMP(CURRENT_DATE) + INTERVAL 1 HOUR
DO
UPDATE myschema.mytable SET mycol = mycol + 1;
myevent라는 이름의 이벤트를 생성합니다 .
이 이벤트는1시간에 한 번씩 mytable 테이블의 mycol 컬럼값을1씩 증가시키는 SQL 명령문을 실행합니다.
4) 이벤트 수정
이벤트를 수정하려면 'ALTER EVENT' 명령을 사용합니다.
이벤트의 여러 특성을 변경할 수 있습니다.
이 예제에서는 에서 실행되는 SQL 명령문을 myevent에서 모든 레코드를 삭제하고 하루에 한 번(01 시) 실행되도록 변경합니다.
ALTER EVENT myevent
ON SCHEDULE
AT TIMESTAMP(CURRENT_DATE) + INTERVAL 1 DAY + INTERVAL 1 HOUR
DO
TRUNCATE TABLE myschema.mytable;
Global privileges: 전역 권한은 서버의 모든 데이터베이스에 적용됩니다. 관리 권한은 사용자가 MySQL 서버의 작업을 관리할 수 있게 하고 특정 데이터베이스에만 국한되지 않기 때문에 글로벌 그룹에 속합니다.(mysql.user, information_schema.user_privileges)
Database privileges : 데이터베이스 권한은 MySQL 인스턴스의 특정 데이터베이스와 해당 데이터베이스 내의 모든 개체(예: 테이블, 컬럼, 뷰)에 적용됩니다. 데이터베이스 권한을 전역적으로 부여할 수도 있습니다. (mysql.db)
Proxy privileges: 프록시 권한을 사용하면 사용자는 다른 사용자에게 부여된 권한을 갖고 있는 것처럼 행동할 수 있습니다.
Privileges for database objects: 데이터베이스 개체(테이블, 열, 저장 루틴, 뷰 등)에 대한 권한은 특정 데이터베이스 내의 한 유형의 모든 개체 또는 특정 테이블이나 뷰와 같은 특정 개체에 적용될 수 있습니다. 데이터베이스 개체 권한을 전역적으로 부여할 수도 있습니다.
. 실습예제 및 소스 다운로드 : https://github.com/wikibook/bigdata2nd/archive/master.zip
*** 최초 Ubuntu 24.04 LTS 에 설치하려니 지원하지 않는다는 메시지 출력. Ubuntu 20.04 LTS로 변경
*** 아래는 Cloudera Manager 7 이 설치되는 OS 버전임.
Cloudera Manager supports the following 64-bit operating systems:
* Red Hat Enterprise Linux 7 (Update 6 or later recommended)
* Red Hat Enterprise Linux 8 (Update 2 or later recommended)
* Oracle Enterprise Linux 7 (Update 4 or later recommended)
* CentOS 7 (Update 4 or later recommended)
* CentOS 8 (Update 2 or later recommended)
* Ubuntu 18.04 LTS
* Ubuntu 20.04 LTSType 'back' to go back.
4. VM 에 cloudera Manager 설치
1) /etc/hosts 파일에 서버 등록
각자의 서버 IP에 대한 hostname을 /etc/hosts 파일에 등록해 준다. FQDN 은 등록하지 않아도 된다.
단, 주의할 점은 계정과 패스워드에 특수문자는 반드시 퍼센트 인코딩(percent encoding) 문자로 변경해야 한다.
예를 들면, 계정이름이 name@email.com 이라면 '@' 특수문자는 '%40' 으로 퍼센트 인코딩 문자로 변경해야 한다.
# Cloudera Manager 7.11.3
# Changeme: change username and password below to match your license
deb [arch=amd64] https://myUsername:myPassword@archive.cloudera.com/p/cm7/7.11.3/ubuntu2004/apt bionic-cm7.11.3 contrib
Import the repository signing GPG key (substitute the correct URL):
- 위의 명령어에서 username, password, [**Cloudera Manager version**] 부분은 위와 동일하게 Cloudera URL의 계정과 패스워드 그리고 설치할 Cloudera Mnager 버전을 기입한다. 본 문서에서는 7.11.3 버전을 설치한다.
" [ERR] Node ip_addr:7000 DENIED Redis is running in protected mode ... " 오류가 발생했다.
원인 : 호스트를 개방해줘도 redis에 protected mode가 가동중이기때문에 외부 접속이 안된다
조치 :
1. redis가 설치된 우분투 사용 곧 외부접속이 아닌 내부접속 사용 : 물리적으로 다른 서버를 사용하므로 해당없음 2. 보호모드 사용 중지 : /etc/redis/redis.conf 파일의 protecte mode yes를 protecte mode no로 변경 3. redis 비밀번호를 설정하여 외부접속 : /etc/redis/redis.conf 의 requirepass <password> 설정
본 문서에서는 3번째 방법을 사용했다. 위에 redis.conf 파일 수정 부분에 requirepass <redis_password> 이 부분을 먼저 설정한 경우에는 이 오류가 발생하지 않는다. 단 수정 후 redis-server를 재기동해야 한다.
조치 : -a 'redis_password' 처럼 -a 옵션으로 패스워드 입력후 명령어 수행
의문점 : 각각의 master에서 수행해야 하는 것인지? 하나의 마스터에서만 수행하면 되는지? 일단, 하나의 마스터에서 수행하였다.
그리고 각각의 redis-server 정보를 info cluster 명령어로 확인해 보니 cluster_enabled:1 로 설정되었다.
하나의 마스터에서만 수행하면 된다.
아래 화면은 cluster가 구성된 화면인다. Master 3대가 조인되었고 각 서버당 대략 5461개의 slot이 할당되었다.
" Waiting for the cluster to join" 메시지가 출력된 상태로 진행이 되지 않을 경우
Every Redis Cluster node requires two TCP connections open. The normal Redis TCP port used to serve clients, for example 6379, plus the port obtained by adding 10000 to the data port, so 16379 in the example.
--> 방화벽 OPEN. 만약 다른 포트(7000)를 사용했다면 앞에 1을 붙여(17000) port가 오픈되어 있어야 한다.
테스트
set 테스트
redis-server -h [서버IP] -p 7000 -c -a [비밀번호] 를 입력하여 redis-server 에 클러스터 모드로 접속한다. (-c 입력 필수)
클러스터 모드로 접속하지 않으면 key setting 할 경우 아래처럼 오류가 발생한다.
[master01_ip]:7000> set id "hi. nice to meet you"
(error) MOVED 7568 [master02_ip]:7000
set id "hi. nice to meet you"는 key slot이 7568번이라서 2번 노드에 할당되어야 하는데, 클러스터 모드로 접근하지 않아 redis-cli 가 다른 노드에 접속하지 못하여 발생하는 오류이다.
아래처럼 -c 옵션으로 클러스터 모드로 접속한다.
redis-cli -h <master01_ip> -p 7000 -a <redis_password> -c
클러스터 모드로 redis-cli 접속한 후 아래와 같이 set 명령어를 수행하면 redis 프롬프트가 할당된 슬롯이 있는 해당 서버로 접속되는 것을 볼 수 있다. 아래 예제는 master02 서버로 접속하여 get 하는 명령어이다.
[master01_ip]:7000> set id "hi. nice to meet you"
-> Redirected to slot [7568] located at [master02_ip]:7000
OK
[master02_ip]:7000> get id
"hi. nice to meet you"
--> sharding 으로 데이터를 관리하므로 데이터가 있는 서버로 접속한다.
Redis Cluster 에 데이터를 저장하고 불러오는 Python 프로그램
1) redis-py-cluster 라이브러리를 설치
pip install redis-py-cluster
오류 : rediscluster 모듈 실치 시 아래와 같은 오류가 발생했는데,
pip install rediscluster 명령어가 아닌pip install redis-py-cluster 명령어를 수행했다.
python3.12 버전에 맞는 rediscluster 는pip install redis-py-cluster 명령어로 설치해야 한다.
ubuntu@ip-172-31-11-88:~$ pip install rediscluster
Defaulting to user installation because normal site-packages is not writeable
Collecting rediscluster
Using cached rediscluster-0.5.3.tar.gz (9.9 kB)
Preparing metadata (setup.py) ... error
error: subprocess-exited-with-error
× python setup.py egg_info did not run successfully.
│ exit code: 1
╰─> [10 lines of output]
.... 하략 ....
아래는 Redis 클러스터에 데이터를 설정하는 Python 예제 코드이다.
from rediscluster import RedisCluster
# Redis 클러스터 노드 구성
startup_nodes = [
{"host": "master01_ip", "port": "7000"},
{"host": "master02_ip", "port": "7000"},
{"host": "master03_ip", "port": "7000"}
]
# Redis 클러스터 초기화
try:
redis_cluster = RedisCluster(startup_nodes=startup_nodes, password=<redis_password>, decode_responses=True)
except Exception as e:
print(f"Could not connect to Redis cluster: {e}")
exit(1)
# 데이터 설정
key = "example_key"
value = "example_value"
try:
redis_cluster.set(key, value)
print(f"Key '{key}' set with value '{value}'")
except Exception as e:
print(f"Could not set data in Redis cluster: {e}")
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 등에 대한 정보)