• Global privileges : 전역 권한은 서버의 모든 데이터베이스에 적용됩니다. 관리 권한은 사용자가 MySQL 서버의 작업을 관리할 수 있게 하고 특정 데이터베이스에만 국한되지 않기 때문에 글로벌 그룹에 속합니다.(mysql.user, information_schema.user_privileges)
  • Database privileges : 데이터베이스 권한은 MySQL 인스턴스의 특정 데이터베이스와 해당 데이터베이스 내의 모든 개체(예: 테이블, 컬럼, 뷰)에 적용됩니다. 데이터베이스 권한을 전역적으로 부여할 수도 있습니다. (mysql.db)
  • Proxy privileges : 프록시 권한을 사용하면 사용자는 다른 사용자에게 부여된 권한을 갖고 있는 것처럼 행동할 수 있습니다.
  • Privileges for database objects : 데이터베이스 개체(테이블, 열, 저장 루틴, 뷰 등)에 대한 권한은 특정 데이터베이스 내의 한 유형의 모든 개체 또는 특정 테이블이나 뷰와 같은 특정 개체에 적용될 수 있습니다. 데이터베이스 개체 권한을 전역적으로 부여할 수도 있습니다.

 

테이블이나 컬럼의 character set 이 상이한 경우 인덱스가 존재하더라도, Full Table Scan으로 수행될 수 있다.

 

1) character set이 다른 2개의 테이블 생성

country와 city라는 2개의 테이블을 생성한다. city의 CountryCode는 country 테이블의 Code값을 가지고 있다.

 CREATE TABLE `country` (
   `Code` char(3) NOT NULL DEFAULT '',
   `Name` char(52) NOT NULL DEFAULT '',
   `Continent` enum('Asia','Europe','North America','Africa','Oceania','Antarctica','South America') NOT NULL DEFAULT 'Asia',
   `Region` char(26) NOT NULL DEFAULT '',
    PRIMARY KEY (`Code`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ;

 

 CREATE TABLE `city` (
   `ID` int NOT NULL AUTO_INCREMENT,
   `Name` char(35) NOT NULL DEFAULT '',
   `CountryCode` char(3) NOT NULL DEFAULT '',
   `District` char(20) NOT NULL DEFAULT '',
   `Population` int NOT NULL DEFAULT '0',
   PRIMARY KEY (`ID`),
   KEY `CountryCode` (`CountryCode`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;

 

2) JOIN

country와 city 테이블을 JOIN하여 조회한다.

 select *
 from country a, city b
 where a.code = b.CountryCode
 and a.code = 'AFG';

 

3) 실행계획 보기

MySQL Workbench 로 실행계획을 확인한다.

character set이 상이한 테이블을 join한 결과 인덱스가 존재함에도 Full Table Scan 하는 것을 볼 수 있다.

4) character set 변경

city 테이블의 character set을 country 테이블의 character set과 동일하게 변경한다.

 alter table city convert to character set utf8mb4;

 

5) 실행계획 확인

MySQL Workbench 로 실행계획을 확인한다.

정상적으로 인덱스 Scan을 확인할 수 있다.

6) 결론

Character Set이 상이한 경우에 정상적으로 인덱스를 타지 않을 수 있으므로, 특별한 경우가 아니라면 동일한 character set을 설정하도록 한다.

OS 환경

- Ubuntu  20.04 LTS- 4 vCPU, 8GB- Cloudera Manager  7(설치되는 OS에 맞게 설치)

- 30GB SSD Disk

- OS 버전에 따라 설치가 잘 안될 수 있으니 OS 선택 시 주의 필요.

 

1. 개요

2. SW, HW 환경

3. 설치

  . java 

sudo apt-get update
sudo apt-get install openjdk-8-jdk

  . python3 설치

sudo apt update
sudo apt install python3

  . eclipse

  . virtual Box

  . puTTy

  . Fileziller

  . Chrome

  . NTP 설치

  . 실습예제 및 소스 다운로드 : 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 은 등록하지 않아도 된다.

172.31.5.7	aiserver01.domain.com	aiserver01
172.31.3.242	aiserver02.domain.com	aiserver02
172.31.3.225	aiserver03.domain.com	aiserver03

 

1) Cloudera Manager Server 설치

Cloudera Manager를 다운로드하고 CDP Private Cloud Base 클러스터를 설정한다.

아래의 명령어로 cloudera Manger 를 설치한다.

$ wget https://archive.cloudera.com/cm7/7.4.4/cloudera-manager-installer.bin
$ chmod u+x cloudera-manager-installer.bin
$ sudo ./cloudera-manager-installer.bin

설치 시 계속이어지는 화면이다. 화면이 길어서 2개의 화면으로 캡쳐했다.

설치가 완료되면 7180 포트로 브라우저에서 접속할 있다. 

http://localhost:7180/ 또는 localhost 대신 접속할 수 있는 IP로 접속해 보면 아래와 같은 로그인 화면을 볼 수 있다.

로그인 화면에 설치시에 화면에 보여진 admin 계정에 admin 패스워드를 입력하여 접속한다.

 

설치된 Cloudera manager는 60일 데모 버전이다. 로그인하면 아래와 같이 license file을 업로드 하거나
60일 trial 버전을 사용하거나 하는 선택화면이 나온다. 본 문서에서는 60일 trial 을 선택한다.

아래와 같은 화면이 나오는데 [계속] 버튼을 클릭한다.

 

클러스터 이름을 입력한다.

 

 

Agent를 설치할 Hosts를 네트워크 상에서 검색한다. 22번 Port로 검색하니 22번 Port로 통신이 되어야 한다.

/etc/hosts 파일에 등록한 hostname을 콤마로 구분하여 입력한 후 [검색] 버튼을 클릭한다.

 

리포지토리 선택

 

JDK 선택

JDK는 OpenJDK 8 버전을 설치하였으므로 "Manually manage JDK" 를 선택한다.

SSH 로그인 정보 설정

Agent가 설치될 서버에 접근할 수 있는 사용자 계정과 인증방법을 선택한다. 본문서에서는 인증키를 이용한다.

Private Key를 선택해 준다.

 

 

 

2) Cloudera Manager Agent 설치

- Cloudera Manager  서버의 7182 port와 agent가 통신하므로 port가 오픈되어 있어야 한다.

아래 화면은 Agent가 설치 완료된 화면이다.

 

 

Parcels 설치

다음 단계로 Parcels 가 설치되는 화면이다. 설치 시간이 오래 걸린다.

클러스터 인스펙트

클러스터 구성이 잘 되었는지 검사하는 과정이다.

네트워크 성능 검사는 ping 테스트를 수행하는데 방화벽이 설정되어 있을 경우, ICMP 프로토콜을  허용해 준다.

Network Performance 수행 시 Error가 발생했는데 확인해 보니 Cloudera Manager 에서 Python2 를 사용하고 있고, 이 부분에서 오류가 발생했다. Host 검사도 warning이 발생했는데 해결방법을 찾지 못해 무시하고 진행했다. 

 

설치할 서비스를 선택하는 화면이다.

본 문서에서는 "Data Engineering"을 선택했다. 각자의 사용 목적에 따라 설치하면 된다.

 

역할 할당

서버별로 서비스할 역할을 할당해 주는 화면이다.

kafka,Atlas, Data Analytics Studio, HBase, HDFS, Hive, Hive on Tez, Hue, Cloudera Management Service, Oozie, Ranger, Solr, Tez, YARN (MR2 Included), ZooKeeper 서비스에 대한 각 서버의 역할을 할당한다.

 

아래는 본 문서에서 할당한 역할들이다.

 

데이터베이스 설정

본 문서에서는 "내장된 데이터베이스 사용 "을 선택했다. 화면에 제시된대로 패스워드는 따로 저장해 둔다.

 

 

 

 

 

 

1)  /etc/apt/sources.list.d/cloudera.manager 파일을 생성한 후 아래 내용을 입력한다.

    내용 중 /myUsername:myPassword 부분은 본의의 https://www.cloudera.com/ 의 계정과 패스워드를 입력한다.

    단, 주의할 점은 계정과 패스워드에 특수문자는 반드시 퍼센트 인코딩(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):

wget https://[username]:[password]@archive.cloudera.com/p/cm7/[**Cloudera Manager version**]/ubuntu2004/apt/archive.key
sudo apt-key add archive.key

 

- 위의 명령어에서 username, password, [**Cloudera Manager version**] 부분은 위와 동일하게 Cloudera URL의 계정과 패스워드 그리고 설치할 Cloudera Mnager 버전을 기입한다. 본 문서에서는 7.11.3 버전을 설치한다.

 

 

https://www.cloudera.com/downloads/cdp-private-cloud-trial/cdp-private-cloud-base-trial.html

--> 

--

 

 

 


wget https://gosea01%40naver.com:%21Gosea0070@archive.cloudera.com/p/cm7/7.11.3/ubuntu2004/apt/archive.key

 

 

 

Ubuntu 20 Repository:
https://username:password@archive.cloudera.com/p/cm7/7.11.3/ubuntu2004/apt
Repository file:
https://username:password@archive.cloudera.com/p/cm7/7.11.3/ubuntu2004/apt/cloudera-manager.list

환경

서버 : 2 vCPU, 4G Memory, 30G Disk 마스터 3대

OS : Ubuntu 24.04 LTS

Redis : redis-cli 7.0.15 ( redis-cli -v 또는 redis-cli 로 접속 후 info 명령어 수행후 redis_server 확인)

 

Redis 설치

각각의 서버에 Redis server를 설치한다.

$ sudo apt upgrade
$ sudo apt install redis-server

 

 redis.conf 파일 수정

각 서버의 /etc/redis/redis.conf 파일을 아래와 같이 수정한다. <master_IP> 와 <redis_password> 부분은 각자의 IP와 패스워드를 입력한다.

port 7000
bind <master_IP> -::1
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
requirepass <redis_password>
appendonly yes

 

Create a Redis Cluster

아래 명령어 수행 시 

redis-cli --cluster create master01_ip:7000 master02_ip:7000 master03_ip:7000

 

" [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를 재기동해야 한다.

 

"[ERR] Node ip_addr:7000 NOAUTH Authentication required.

  • 원인 : redis-cli 수행 시 패스워드가 설정되어 있지 않음.
  • 조치 :   -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}")

 

 

 

설명

구성환경

- 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

 

 

구성 환경

- Window 11

- jmeter 5.6.3

- influxDB2 2.7.6

- grafana : 

 

구성도

본 문서에서는 jmeter가 설치된 상황에서 influxDB와 grafana 설정에 대해 설명한다.

 

1. influxDB2 설치

InfluxDB는 Time Series Database(시계열 데이터베이스) 이다.

 

- window 버전 download

https://docs.influxdata.com/influxdb/v2/install/ 에서 window 버전 다운로드

다운로드한 파일을 원하는 디렉토리에 압축을 푼다.

본 문서에서는 "C:\Program Files\influxdb2-2.7.6-windows" 위치에 압축을 해제했다.

 

InfluxDB 기동

Powershell에서 C:\Program Files\InfluxData\influxdb로 이동하고 influxd 데몬을 실행하여 InfluxDB를 시작한다.

cd -Path 'C:\Program Files\InfluxData\influxdb'
./influxd
 

 

설치 후 정상적으로 DB가 기동되었으면

http://localhost:8086 에서 InfluxDB 를 볼 수 있으며, c:\Users\.influxdbv2 디렉토가 생성된다.

Windows 에서는 데이터가 c:\Users\.influxdbv2\engine\data\ 디렉토리에 저장된다.

 

브라우저로 http://localhost:8086 접속하면 아래와 같은 화면을 볼 수 있다.

 

"GET STARTED" 버튼을 클릭하면 초기사용자 생성에 관한 화면이 보여진다.

 

  • Username : 계정명( InfluxDB 인스턴스의 모든 리소스에 대한 읽기-쓰기 권한 계정)
  • Password : 패스워드
  • Initial Organization Name : 조직명( InfluxDB를 사용하는 사용자 그룹을 위한 작업공간, 그룹 관리 기능 )
  • Initial Bucket Name : 버킷명(  시계열 데이터가 저장되는 공간, 데이터베이스와 리텐션 폴리시의 조합 ) 

위 항목들을 입력한 후 "CONTINUE" 버튼을 클릭하면 아래와 같은 화면이 나오는데 여기에서

"QUICK START" 버튼을 클릭한다. API token은 따로 보관하는 것이 좋다. 물론, influxdb UI에서 다시 확인할 수도 있다.

이렇게 생성한 버킷에는 약 100 여개의 measurement( 테이블) 가 생성된다.

 

- linux 버전(rocky Linux 9.4) 설치

 influxdb repository to your Rocky Linux system.

cat <<EOF | sudo tee /etc/yum.repos.d/influxdb.repo
[influxdb]
name = influxdb Repository - RHEL \$releasever
baseurl = https://repos.influxdata.com/rhel/\$releasever/\$basearch/stable
enabled = 1
gpgcheck = 1
gpgkey = https://repos.influxdata.com/influxdata-arvhive_compat.key
EOF

verify the list of available repositories on your system

sudo dnf repolist

 

Installing InfluxDB

sudo dnf install influxdb2

After influxdb is installed, run the below systemctl command to start and enable the influxdb service.

sudo systemctl start influxdb
sudo systemctl enable influxdb

 

 

 

 

2. influx CLI 설치

InfluxDB 2.7과 상호작용하는 데 아래와 같이 여러 도구가 있다. 본 문서에서는 Influx CLI에 대해 설명한다.

  • InfluxDB user interface (UI)
  • Influx CLI
  • InfluxDB HTTP API

Influx CLI를 사용하여 InfluxDB 를 관리한다. Influx CLI를 통해 데이터 쓰기 및 쿼리, InfluxDB 템플릿 생성, 데이터 내보내기 등을 수행한다.

https://docs.influxdata.com/influxdb/v2/tools/influx-cli/?t=Windows 에서 window 버전의 influx CLI 를 다운로드 한 후, 압축을 해제한 후 influxDB를 설치한 디렉토리에 influx.exe 파일을 복사한다.

 

Installing influxdb CLI for rocky Linux

sudo dnf install influxdb2-cli

 

 

 

2.1 influx CLI 설정

Provide required authentication credentials

InfluxDB 명령어 수행시 마다 호스트, API 토큰 및 조직을 전송하지 않으려면 influx CLI config에 저장한다. 자격 증명이 필요한 influx 명령은 config에서 자격 증명을 자동으로 검색한다.

influx CLI config를 생성하고 이를 활성화하기 위해  influx config create 명령을 사용한다.

 

influx CLI 명령어

influx config create --config-name CONFIG_NAME \
  --host-url http://localhost:8086 \
  --org ORG \
  --token API_TOKEN \
  --active

 

  • CONFIG_NAME: 접속환경이름
  • ORG: InfluxDB 조직명
  • API_TOKEN: API_TOKEN(influxDB 계정 생성 시 생성된 token)

<예시>

influx config create --config-name ADMIN_CONFIG \
  --host-url http://localhost:8086 \
  --org ORG \
  --token nLP1HFHoLmDd8fXzYUgo2BnQaTv6t9ENMvedHQUIKt-Ad72mYzNf45jQFz1gBIZwVXB463m4iUrmcW_R4EJw== \
  --active

 

 

계정 생성

> influx user create -n user01 -p qwer1234% -o ORG

 

계정/패스워드 인증

influx CLI 2.4.0+를 사용하면 InfluxDB 에 로그인하는 데 사용자 이름과 비밀번호를 사용하여 InfluxDB OSS 2.4+로 인증하는 연결 구성을 생성할 수 있다. CLI는 세션 쿠키를 검색하여 암호화되지 않은 상태로 구성 경로에 저장합니다.

influx config create \
  -n CONFIG_NAME \
  -u http://localhost:8086 \
  -p USERNAME:PASSWORD \
  -o ORG

 

  • CONFIG_NAME: 접속환경이름
  • USERNAME:PASSWORD : InfluxDB 계정/패스워드
  • ORG: InfluxDB 조직명

<예시>

influx config create \
  -n CONFIG_NAME \
  -u http://localhost:8086 \
  -p USERNAME:PASSWORD \
  -o ORG

위 명령어를 수행하면 윈도우의 경우 c:\users\사용자\.influxdb2\configs 라는 파일이 생성된다.

파일에는 url, token, org가 기록된다.

influx cli 명령어를 수행할 때 이 config 파일을 참조한다.

 

CLI로 DB 접속

influx v1 shell명령은 InfluxQL 셸(REPL)을 시작한다

show databases 명령어로 현재의 bucket(database)를 조회한다.

 

2. Jmeter 설정

- jmeter-plugins-influxdb2-listener-2.7.jar 파일을  jmeter가 설치된 lib/ext 폴더로 다운로드 한다.

- jmeter를 실행한다.

- Thread Group 에 Backend Listener를 선택한다.

 

Backend Listener 의 각 항목에 값을 입력한다.

  • Backend Listener :  implementation:org.apache.jmeter.visualizers.backend.influxdb.influxdbBackendListenerClient 선택
  • influxdbUrl : http://127.0.0.1:8086/api/v2/write?org=ORG&bucket=jmeter(조직명과 버킷명을 입력한다)
  • application : application명을 입력
  • testTitle : 테스트 제목 입력
  • influxdbPort : influxdbPort default port 인 8086 입력
  • influxdbToken : influxDB 최초 접속 시 생성한 api token을 입력

본 문서에서는 web page를 단순 호출하는 Sampler를 작성해서 수행했다.

Test Plan를 수행한다.

Test Plan를 수행한 후 jmeter 버킷을 확인해 보면 위에서 설정한 measurement인 jmeter와 event measurement가 생성된 것을 확인할 수 있다.

 

 

 



<username>:<password> 구문을 통해 사용자 이름과 비밀번호를 제공하려면 --username-password, -p 옵션을 사용하세요. 암호가 제공되지 않으면 CLI는 인증이 필요한 각 명령 후에 암호를 묻는 메시지를 표시합니다.

 

 

 

 JMeter InfluxDB v2.0 listener plugin 설치

- download 후 jmeter/lib/ext 폴더에 다운로드한 influxdb jar 파일을 넣는다.

 

2. grafana 설치

2. grafana 설치

https://grafana.com/grafana/download?platform=windows 에서 자신의 OS에 맞는 버전을 다운로드 한후, 설치한다.

설치 완료 후 설치된 디렉토리(Windows 는 C:\Program Files\GrafanaLabs\grafana 에 설치됨)에서 start grafana-server 명령어로 grafana 서버를 실행한다.

 

grafana-server 실행 후 브라우저로 http://localhost:3000/login 접속한다.

 최초 접속 시 화면이고 계정은 admin 패스워드는 admin을 입력하여 Log in 한다.

admin 계정의 패스워드 변경화면이 뜨는데 원하는 패스워드로 변경한다.

Data Source 추가

"Go to connections" 버튼을 클릭한다. 또는 좌측의 "Connection" 메뉴

 

"Add data source" 버튼을 클릭한다.

 

InfluxDB 를 클릭한다.

 

설정 페이지가 나오면 각 항목을 입력한다.

 

 

 

1. JMeter 란

Apache JMeter™ 애플리케이션은 기능을 부하 테스트하고 성능을 측정는 100% 순수 Java 오픈 소스 소프트웨어입니다. 원래 웹 애플리케이션 테스트용으로 설계되었지만 이후 다른 테스트 기능으로 확장되었습니다.

 

2. JMeter 설치

1) 설치환경

  • OS : Window11
  • JAVA : 17.0.6
  • Apache JMeter 5.6.3 (Requires Java 8+)

2) 다운로드

https://jmeter.apache.org/download_jmeter.cgi 페이지에서 apache-jmeter-5.6.3.zip 다운로드

 

3) 설치

다운받은 파일을 압축 해제한 후

apache-jmeter-5.6.3\bin 디렉토리에 있는 jmeter.bat 파일을 실행시킨다.

jmeter.bat 파일을 실행하면 아래와 같은 화면이 나타난다.

3. JMeter 사용법

테스트 계획은 JMeter 스크립트이며, 부하 테스트의 흐름을 결정한다.

이 JMeter 튜토리얼에서는 BlazeMeter에서  사용하는 데모를 로드 테스트하여 Simple이라는 모의 여행사를 시뮬레이션한다. Simple Travel Agency를 사용하면 항공편을 검색하고 선택할 수 있으며 JMeter를 통해 시뮬레이션한다.

 

첫 번째 스크립트 : 이용 가능한 항공편을 검색 시나리오

 

Thread Groups :

테스트 스크립트 작성을 시작하려면 테스트 계획에 스레드 그룹을 추가한다.
스레드 그룹은 사용자 흐름을 결정하고 사용자가 앱에서 행동하는 방식을 시뮬레이션한다.

각 스레드는 사용자를 나타낸다.
테스트 계획을 마우스 오른쪽 버튼으로 클릭하고 "Threads(Users)"를 선택한 다음 "Thread Group"을 선택한다.

 

- Configure the Thread Group by setting:

  • Name: 사용자 정의 이름을 제공하거나 원하는 경우 기본 이름을 "Thread Group"으로 둔다.
  • Number of Threads: 테스트 사용자(스레드) 수
  • Ramp-up Period: 사용자를 추가하는 속도(초). 예를 들어 0으로 설정하면 모든 사용자가 즉시 시작다.  쓰레드가 10개이고 Ramp-up Period가 50이면 Thread를 50초 동안 차례대로 생성하라'는 의미이다. 즉, 5초(50초/10개)마다 Thread를 하나씩 생성하는 것과 같은 의미이다.

  • Loop Count: 테스트를 반복하는 횟수

Samplers

데모 사이트에 HTTP 요청을 보내려고 하므로 HTTP 요청 샘플러를 추가한다.
스레드 그룹을 마우스 오른쪽 버튼으로 클릭하고 "추가"를 선택한 다음 "샘플러"를 선택한 다음 "HTTP 요청"을 선택다.

 

아래와 같이 샘플러를 구성한다.

  • Name: 사용자가 정한 이름을 입력하거나 기본 "HTTP Request "라는 이름을 그대로 사용 
  • Server Name or IP: 서버의 DNS 이름 또는 IP 주소입니다. 본문에서는 blazedemo.com 입력
  • HTTP를 통해서만 접속할 수 있는 웹사이트는 브라우저에서 안전하지 않은 것으로 표시되고 검색 엔진 결과에서 제외되므로 프로토콜을 "https"로 설정 

 

Timers

사용자가 웹사이트나 앱을 클릭하면 일시 중지와 지연이 발생한다. 이는 타이머를 사용하여 시뮬레이션할 수 있다.
상수 타이머가 가장 일반적이다. 요청 사이에 대기할 시간(밀리초)을 결정한한다.
"HTTP Request" 마우스 오른쪽 버튼으로 클릭하고 "Add"를 선택한 다음 "Timer"를 선택한 다음 "Constant Timer"를 선택한다.

본 문성에서는 300 miliseconds 를 입력한다.

 

Listeners

로깅 및 디버깅 정보를 포함하여 결과를 표시하는 기록 메커니즘인 리스너를 통해 테스트를 실행한 후 결과를 확인한다.

View Results Tree는 가장 일반적인 리스너다.
"Thread Group"을 마우스 오른쪽 버튼으로 클릭하고 "Add"를 선택한 다음 "Listener"를 선택한
다음 "View Results Tree"를 선택한다.

 

이제 파일을 저장한다. 본 문서에서는 "Test Plan.jmx" 파일명으로 저장하였다.

 

테스트를 실행하려면 상단의 녹색 화살표를 클릭한다. 테스트 실행이 완료되면 리스너에서 결과를 볼 수 있다.
분 문서에서는 결과에 녹색 아이콘이 표시되므로 테스트가 성공한 것을 확인할 수 있다. 오른쪽 창에서는 로드 시간, 연결 시간, 오류, 요청 데이터, 응답 데이터 등과 같은 더 자세한 결과를 볼 수 있고, 결과를 저장할 수도 있다.

 

두 번째 스크립트 : 항공편 검색 후 항공편 선택 시나리오

두 번째는 매개변수를 추가한 JMeter 시나리오입니다.

첫 번째 스크립트는 단순히 항공편을 검색한 반면, 두 번째 스크립트는 항공편을 검색한 후 항공편을 선택하는 시나리오입니다.

 

웹 브라우저에서 항공편을 검색하고 선택한 항공편 옆에 있는 "Find Flights" 버튼을 클릭하면 "/reserve.php"가 호출됩니다.

JMeterd에서 HTTP 샘플러를 추가합니다. 본 문서에서는 "reserve" HTTP 샘플러를 추가했습니다. Server Name or IP란에 "blazedemo.com"을 입력하고, "Path" 필드에 "reserve.php"를 추가한다. 이렇게 하면 샘플러가 "blazedemo.com/reserve.php"의 전체 URL을 구축하도록 지시하게 된다. 

다음으로 선택에 필요한 매개변수를 추가한다. (웹 브라우저의 개발자 도구(크롬 브라우저 : F12)를 사용하여 파라미터명을 찾을 수 있다.) 이 페이지에서 "fromPort" 및 "toPort"를 지정하고, 각각 "Boston"과 "London"으로 입력한다.

 

추가적인 정보를 보기 위해 "View Results in Table" 리스너를 추가한다.
이는 홈 페이지를 방문한 다음 두 개의 매개변수를 예약 페이지로 보내는 Test Plan 이다.

저장 후 실행하면 아래와 같은 결과 화면을 볼 수 있다.

 

 세 번째 스크립트 : 항공편 검색 후 항공편 선택 시나리오

긴 사용자 사용 흐름을 생성해야 한다면 시간이 오래 걸릴 수 있습니다.

따라서 스크립트를 작성하는 것보다 더 좋은 방법은 스크립트를 녹음하는 것입니다. JMeter 레코더 또는 BlazeMeter Chrome 확장 프로그램으로 녹음을 할 수 있습니다. Chrome 스토어에서 무료로 사용할 수 있는 BlazeMeter 확장 프로그램은 트래픽을 리디렉션하기 위해 프록시를 설정해야 하는 JMeter 확장 프로그램보다 사용자 친화적입니다.

Chrome을 통해 녹음을 시작하고 클릭하여 테스트하려는 사용자 시나리오를 시뮬레이션합니다. 완료되면 녹음을 중지하고 필요에 따라 편집을 할 수 있습니다.

 

크롬 확장 설치

BlazeMeter 확장 프로그램을 설치한 후, 크롬 브라우저의 우측 상단에 BlazeMeter를 클릭한다.

 

https://blazedemo.com/ 에 접속하여, 비행편을 검색하고 검색된 비행편을 선택한 후 예약 정보를 입력한 다음,

녹음 중지 버튼을 클릭한다.

녹음을 완료한 후 "Save ..." 버튼을 클릭하여 "Jmeter(JMX)" 선택한 다음 "Save"한다.

 

Now add a listener and run the test.

 

 

환경

- window10

- MySQL version : 8.0.32

 

The Binary Log

바이너리 로그에는 테이블 생성 작업이나 테이블 데이터 변경과 같은 데이터베이스 변경을 설명하는 "이벤트"가 포함되어 있습니다. 또한 행 기반 로깅을 사용하지 않는 한 잠재적으로 변경했을 수 있는 명령문(예: 행과 일치하지 않는 DELETE)에 대한 이벤트도 포함됩니다. 바이너리 로그에는 각 명령문이 업데이트된 데이터에 소요된 시간에 대한 정보도 포함되어 있습니다. 바이너리 로그에는 두 가지 중요한 목적이 있습니다.

  • 복제의 경우 복제 소스 서버의 바이너리 로그는 복제본으로 전송될 데이터 변경 사항에 대한 기록을 제공합니다. 소스는 바이너리 로그에 포함된 정보를 복제본으로 전송하며, 복제본은 해당 트랜잭션을 재현하여 소스에서 수행된 것과 동일한 데이터 변경을 수행합니다.
  • 특정 데이터 복구 작업에는 바이너리 로그를 사용해야 합니다. 백업이 복원된 후에는 백업 이후에 기록된 바이너리 로그의 이벤트가 다시 실행됩니다. 이러한 이벤트는 백업 시점부터 데이터베이스를 최신 상태로 유지합니다. 

# binlog 관련 변수

  • log_bin : 서버의 바이너리 로깅 상태를 활성화(ON) 또는 비활성화(OFF)로 표시. 바이너리 로깅이 활성화되면 서버는 데이터를 변경하는 모든 명령문을 백업 및 복제에 사용되는 바이너리 로그에 기록. ON은 바이너리 로그를 사용할 수 있음을 의미하고, OFF는 사용 중이 아님을 의미
  • log_bin_basename : 바이너리 로그 파일의 경로와 기본 이름. 최대 변수 길이는 256. 기본 위치는 데이터 디렉터리
  • log_bin_index : binlog 파일의 이름을 저장하고 있는 파일
  • bin_log_format : ROW / MIXED / STATEMENT
  • max_binlog_size : 바이너리 로그에 쓰기로 인해 현재 로그 파일 크기가 이 변수의 값을 초과하는 경우 서버는 현재 파일을 닫고 다음 파일을 엽니다. 최소값은 4096바이트입니다. 최대값과 기본값은 1GB입니다. 
  • sql_log_bin : 현재 세션에 대해 바이너리 로그에 대한 로깅 활성화 여부를 제어(log_bin 은 활성화된 상태에서). 기본값은 ON. 현재 세션에 대해 로깅을 비활성화하거나 활성화하려면 sql_log_bin 변수를 OFF 또는 ON으로 설정

binary 로그 확인

mysqlbinlog 유틸리티로 binary log 파일을 텍스트 형식으로 확인할 수 있다.

 

[사용법]
mysqlbinlog "bin 로그경로\binlog 파일명" > binlog.sql

 

[예시] 아래 예시는 Window10에 설치된 MySQL의 binary log 내용을 확인하는 명령어이다.

mysqlbinlog C:\ProgramData\MySQL\MySQL Server 8.0\Data\DESKTOP-bin.000115 > binlog.sql

 

 

bin_log_format 비교

bin_log_format 설정에는 ROW, MIXED, STATEMENT 세가지가 있는데 각각의 차이점은 아래와 같다.

 

  • STATEMENT :  명령문 기반 로깅
  • ROW : 행 기반 로깅. (default)
  • MIXED : STATEMENT와 ROW 혼합 형식 로깅. 기본적으로 STATEMENT 기반 로깅이 사용되지만 특정 경우에는  ROW 기반으로 로깅.

STATEMENT와 ROW 기반 로깅.

1) STATEMENT기반 로깅

STATEMENT 기반의 로깅 설정 시 생성된 binary log 파일을 mysqlbinlog 명령어로 수행해 보면 아래와 같은 형식으로 저장되어 있는 것을 볼 수 있다.

 

 

2) ROW 기반 로깅

ROW 기반의 로깅 설정 시 생성된 binary log 파일을 mysqlbinlog 명령어로 수행해 보면 아래와 같은 형식으로 저장되어 있는 것을 볼 수 있다.

 

 

3) MIXED기반 로깅

기본적으로 Statement-Based Format으로 기록되나, 필요에 따라 Row-base Format으로 Binary Log에 기록된다.

UUID()함수, sysdate() 함수 등 사용 시에는 ROW 기반으로 수행된다.

now(), current_timestamp() 는 STATEMENT-Based Format으로 기록된다. Master와 Slave 간 데이터 차이가 발생하지 않는 것은 binlog의 TIMESTAMP 값으로 설정하는 것 같다.

 

[ sysdate() 함수 사용 시 binary log]

 

[ now() 함수 사용 시 binary log]

 

+ Recent posts