라우팅이란?

  • 클라이언트에서 url 주소에 따라 페이지가 전환 되는것
  • Vue 프로젝트 내부에서 미리 url 주소를 정의하고, 각 주소마다 Vue 페이지를 연결해놓음

Vue-Rounter 설치

  • vue 에서 제공하는 공식 플러그인 vue-router를 이용해 라우팅을 쉽게 구현 가능
kalva@RT-PC:~/vue-project$ vue add router
 WARN  There are uncommitted changes in the current repository, it's recommended to commit or stash them first.
? Still proceed? Yes
  • @vue/cli-plugin-router 가 설치됨
    • src 폴더에 router, views 폴더와 파일이 생성됨

App.vue 파일

kalva@RT-PC:~/vue-project$ cat src/App.vue
<template>
  <nav>
    <router-link to="/">Home</router-link> |
    <router-link to="/about">About</router-link>
  </nav>
  <router-view/>
</template>
...

router/index.js 파일

kalva@RT-PC:~/vue-project$ cat src/router/index.js
import { createRouter, createWebHistory } from 'vue-router'
import HomeView from '../views/HomeView.vue'

const routes = [
  {
    path: '/',
    name: 'home',
    component: HomeView
  },
  {
    path: '/about',
    name: 'about',
    // route level code-splitting
    // this generates a separate chunk (about.[hash].js) for this route
    // which is lazy-loaded when the route is visited.
    component: () => import(/* webpackChunkName: "about" */ '../views/AboutView.vue')
  }
]

const router = createRouter({
  history: createWebHistory(process.env.BASE_URL),
  routes
})

export default router
  • routes 배열에 2개의 라우트가 등록되어 있다.
    • Home 컴포넌트
    • About 컴포넌트
  {
    path: '/',
    name: 'home',
    component: HomeView
  },
  • path : 브라우저에서 접속하는 url 주소
  • component : 지정된 path 로 접속했을때 보여줄 vue 컴포넌트
    • component: HomeView => import HomeView from '../views/HomeView.vue'
  {
    path: '/about',
    name: 'about',
    // route level code-splitting
    // this generates a separate chunk (about.[hash].js) for this route
    // which is lazy-loaded when the route is visited.
    component: () => import(/* webpackChunkName: "about" */ '../views/AboutView.vue')
  }
  • // route level code-splitting
    • 라우트 레벨에서 코드를 분할하는 방법
  • // this generates a separate chunk (about.[hash].js) for this route
    • 이 라우트에 대한 chunk 파일이 분리되어 생성됨
  • // which is lazy-loaded when the route is visited.
    • 이 라우트에 방문했을때 lazy-load(자연 로드) 됨
  • component: () => import(/* webpackChunkName: "about" */ '../views/AboutView.vue')
    • 라우트 레벨에서 코드를 분할한 후 별도의 chunk 파일을 생성하고, 이 라우트를 방문했을때 리소스를 로드함, 컴포넌트 import 시 /* webpackChunkName: "about" */ 라는 주석으로 chunk 파일 이름을 정의해서 chunk 파일은 about 이라는 이름으로 생성된다.
  • 두가지 방식의 차이
    • 첫번째 : 사용자가 해당 path에 접근하지 않더라도 이미 vue 파일을 import
    • 두번째 : path에 접근해야 vue 파일을 import

Lazy Load 적용

Lazy Load

  • 리소스를 컴포넌트 단위로 분리하여 컴포넌트, 라우터 단위로 필요한 것들만 다운 받을 수 있게 하는 방법

Vue 에서 Lazy Load 사용시 주의사항

  • Vue CLI3 부터 prefetch 기능 추가됨
  • prefetch 기능
    • 미래에 사용될수 있는 리소스를 캐시에 저장해서 사용자 접속시 빠르게 리소스 제공
    • 비동기 컴포넌트로 정의된 모든 리소스를 캐시에 담아두는 비용 발생
      • 분리된 chunk 파일 각각에 대한 request 가 발생, 각각의 파일을 다운로드 받아서 캐시에 저장함
    • prefetch 기능은 랜더링 시간을 줄여주는데, 잘못 사용시 랜더링 시간이 늘어남
    • Vue CLI 에서 prefetch 기능은 기본값으로 true 설정, Lazy Load가 적용된 컴포넌트는 모두 prefetch 기능이 적용되어 캐시에 저장됨
    • prefetch 기능 사용시
      • request 요청수 증가됨, 비동기 컴포넌트로 정의돈 모든 리소스를 캐시에 담기위해 Request 요청 수가 많아짐
      • 애플리케이션의 첫화면 접속시 랜더링 속도가 느려질 수 있음
        • 첫 화면에서 사용되는 리소스를 가장 나중에 다운받음, 다른 화면에 대한 리소스를 모두 내려받고 나서야 첫 화면에서 사용되는 리소스를 내려 받음
    • prefetch 기능 미사용시
      • 요청 수 prefetch 사용시보다 줄어듬
      • 라우터가 이동될 때마다 해당 라우터에서 필요한 리소스를 가져옴
        • 한번 가져온 리소스는 다시 요청하지 않음
    • 초기 랜더링은 prefetch 미사용시 더 빠르게 로딩됨
    • prefetch 기능은 다른 화면에서 사용될 리소스를 미리 내려 받아서, 애플리케이션에서 화면 전환시 빠른 성능을 가져온다는 장점을 이용하기 위해서 사용함
      • 필요한 컴포넌트에 대해서 prefetch 기능 적용 권장
    • 라우터를 통해 이동되는 컴포넌트에서 사용되는 리소스가 크지 않을 경우 prefetch 기능을 사용하지 않더라도 사용자 접속 시점에 다운받도 충분히 매끄럽게 동작함

prefetch 기능을 끄는 방법

  • Vue.config.js 파일을 생성하고 다음 코드 추가
vi vue-project/vue.config.js
module.exports={
  chainWebpack: config=>{
    config.plugins.delete('prefetch'); //prefetch 삭제
  }
};

※ vue 가 업데이트 되면서 기본 값이 prefetch를 사용하지 않는것으로 변경됨

prefetch를 사용하고 싶은 경우

  • 라우터에 webpachPrefetch:true를 넣어준다.
component: () => import(/* webpackChunkName: "about"*/ /* webpackPrefetch: true */ '../views/AboutView.vue')

routes/index.js, main.js 파일

  • routes/index.js 의 첫 번째 줄에는 라우팅을 처리하기 위해 vue-router를 import 한다.
# routes/index.js
import { createRouter, createWebHistory } from 'vue-router'
  • 이렇게 정의된 router 는 main.js 에 등록해서 사용함
# main.js
import { createApp } from 'vue'
import App from './App.vue'
import router from './router'

createApp(App).use(router).mount('#app')
  • import router from './router' 를 통해 router/index.js 파일이 import 됨
  • createApp(App).use(router).mount('#app')
    • createApp(App) 최상위 컴포넌트인 App.vue 로 app를 생성하고, use(router) 코드를 추가하여 App.vue에서 router가 사용될 수 있도록 추가하고 App.vue 를 public 폴더의 index.html 에 정의되어 있는 id="app"인 htmlelement 에 마운트시킴

컴포넌트

  • 조합하여 화면을 구성할 수 있는 블록

'Dev' 카테고리의 다른 글

Vue 컨포넌트 - 데이터 바인딩 (2)  (0) 2023.07.01
Vue 컨포넌트 - 데이터 바인딩 (1)  (0) 2023.06.27
Vue 컴포넌트  (0) 2023.06.26
Vue CLI 설치, 프로젝트 생성  (0) 2023.06.25
# 윈도우 11 WSL2 설치  (0) 2023.06.18

Vue CLI 설치

npm install -g @vue/cli
  • npm install 패키지명 을 통해 NPM 에 등록된 패키지 설치 가능

-g(global)

npm install -g 패키지명
  • -g 옵션 사용시 설치하는 패키지는 모든 프로젝트에서 사용할 수 있는 global 패키지로 등록됨

--save

npm install 패키지명 --save
  • 작업중인 디렉토리 내에 있는 ./nonde_modules 에 패키지 설치
  • package.jon 파일의 dependencies 객체에 설치한 패키지 정보 추가
  • ./node_modules
    • 설치되는 모든 패키지가 설치되는 디렉토리
    • 사용하고 있는 모든 패키지 확인 가능
  • package.jon 을 공유하여 "npm install" 명령어로 프로젝트 디렉토리에 없는 패키지를 한번에 설치 가능
    • 코드 레피지토리(ex github)에 패키지 파일 업로드 필요 없음

Vue 프로젝트 생성

vue create vue-procject 

# Default ([Vue 3] 을 선택하고 엔터 
Vue CLI v5.0.8
? Please pick a preset: (Use arrow keys)
❯ Default ([Vue 3] babel, eslint)
  Default ([Vue 2] babel, eslint)
  Manually select features

Vue 프로젝트 실행

cd vue-project 
npm run serve

Vue 프로젝트 파일 구조

  • node_modules : npm 으로 설치된 패키지 파일들이 모여 있는 디렉토리
  • public : webpack 을 통해 관리되지 않는 정적 리소스가 모여 있는 디렉토리
  • src/assets : 이미지, css, 폰트 등을 관리하는 디렉토리
  • src/components : Vue 컴포넌트 파일이 모여 있는 디렉토리
  • App.vue : 최상위(Root) 컴포넌트
  • main.js : 가장 먼저 실행되는 자바스크립트 파일, Vue 인스턴스를 생성하는 역할
  • .gitnore : github에 업로드시 제외할 파일 설정
  • babel.config.js : Babel 설정 파일
  • package-lock.json : 설치된 package의 dependency 정보를 관리하는 파일
  • package.json : 프로젝트에 필요한 package를 정의하고 관리하는 파일
  • README.md : 프로젝트 정보를 기록하는 파일

package.js 파일

kalva@RT-PC:~/vue-project$ cat package.json
{
  "name": "vue-project",
  "version": "0.1.0",
  "private": true,
  "scripts": {
    "serve": "vue-cli-service serve",
    "build": "vue-cli-service build",
    "lint": "vue-cli-service lint"
  },
  "dependencies": {
    "core-js": "^3.8.3",
    "vue": "^3.2.13"
  },
  "devDependencies": {
    "@babel/core": "^7.12.16",
    "@babel/eslint-parser": "^7.12.16",
    "@vue/cli-plugin-babel": "~5.0.0",
    "@vue/cli-plugin-eslint": "~5.0.0",
    "@vue/cli-service": "~5.0.0",
    "eslint": "^7.32.0",
    "eslint-plugin-vue": "^8.0.3"
  },
  "eslintConfig": {
    "root": true,
    "env": {
      "node": true
    },
    "extends": [
      "plugin:vue/vue3-essential",
      "eslint:recommended"
    ],
    "parserOptions": {
      "parser": "@babel/eslint-parser"
    },
    "rules": {}
  },
  "browserslist": [
    "> 1%",
    "last 2 versions",
    "not dead",
    "not ie 11"
  ]
}
  • name : 프로젝트 이름
  • version : 프로젝트 버전
  • private : true 로 설정시 프로젝트를 npm 으로 올릴수 없다.
    • 실수로 프로젝트를 npm 에 올리더라도 private: true 인 경우 배포를 막을 수 있다.
  • scripts : 프로젝트 실행과 관련된 명령어 등록
    • 개발자가 정의한 script는 npm run 명령어 사용
    • npm 에서 제공되는 명령어는 npm 명령어 사용
  • dependencies : 사용중인 패키지 정보
  • devDependencies : 개발시에만 필요한 패캐지 정보
  • eslnitConfig : ESLint 는 일괄성 있게 코드를 작성하고 버그를 회피할 목적으로 ECMAScript/Javascript 코드에서 발견된 패턴을 개발자에게 알려주는 플러그인
    • 구문 분석을 위해서 bael-eslint 를 파서로 사용
  • browserslist : 전 세계 사용 통계 속에서 상위 1%이상 사용된 브라우저, 각 브라우저의 최신 버전 2개를 지원

패키지 설치시 dependencies, devDependencies, eslintConfig 등은 자동으로 등록됨, name, version, private 등은 사용자가 직접 등록

'Dev' 카테고리의 다른 글

Vue 컨포넌트 - 데이터 바인딩 (2)  (0) 2023.07.01
Vue 컨포넌트 - 데이터 바인딩 (1)  (0) 2023.06.27
Vue 컴포넌트  (0) 2023.06.26
Vue Router 설정  (0) 2023.06.26
# 윈도우 11 WSL2 설치  (0) 2023.06.18

0. 테스트 환경

  • OS : ubuntu 22.04
  • kminion
    • hostname : kminion
    • ip : 192.168.137.31
  • kafka
    • hostname : kafka
    • ip : 192.168.137.32

1. kafka 설치

1.1 jdk 설치

sudo apt-get update
sudo apt install default-jdk 

1.2 kafka 설치

wget https://dlcdn.apache.org/kafka/3.5.0/kafka_2.13-3.5.0.tgz 
tar xvzf kafka_2.13-3.5.0.tgz 
sudo mv kafka_2.13-3.5.0 /usr/local/kafka

1.3 systemctl 에 zookeeper, kafka 등록

echo "[Unit]
Description=Apache Zookeeper server
Documentation=http://zookeeper.apache.org
Requires=network.target remote-fs.target
After=network.target remote-fs.target

[Service]
Type=simple
ExecStart=/usr/local/kafka/bin/zookeeper-server-start.sh /usr/local/kafka/config/zookeeper.properties
ExecStop=/usr/local/kafka/bin/zookeeper-server-stop.sh
Restart=on-abnormal

[Install]
WantedBy=multi-user.target" | sudo tee /etc/systemd/system/zookeeper.service 

echo "[Unit]
Description=Apache Kafka Server
Documentation=http://kafka.apache.org/documentation.html
Requires=zookeeper.service

[Service]
Type=simple
Environment="JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64"
ExecStart=/usr/local/kafka/bin/kafka-server-start.sh /usr/local/kafka/config/server.properties
ExecStop=/usr/local/kafka/bin/kafka-server-stop.sh

[Install]
WantedBy=multi-user.target" | sudo tee /etc/systemd/system/kafka.service 

sudo systemctl daemon-reload 
sudo systemctl start zookeeper 
sudo systemctl start kafka 
sudo systemctl status zookeeper

1.4. 테스트용 토픽 생성

/usr/local/kafka/bin/kafka-topics.sh --create --bootstrap-server localhost:9092 --replication-factor 1 --partitions 1 --topic testTopic 
/usr/local/kafka/bin/kafka-topics.sh --list --bootstrap-server localhost:9092 

2. kminion 설치

2-1. apt 로 docker 를 설치하기 위한 필요 패키지 설치

sudo apt-get update
sudo apt-get install ca-certificates curl gnupg

2-2. Docker 공식 GPC 키 추가

sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

2-3. 저장소 설정

echo   "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" |   sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

2-4. Docker 엔진 설치

sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

2-5. docker-compose 설치

sudo apt-get install docker-compose

2-6. kminion 설정

  • docker-compose.yml 파일 생성시 extra_hosts 으로 kafka 의 호스트 정보를 지정해준다.
  • kminion 에서 브로커에 접속할때 호스트명으로 접속하는 경우가 있는데 이때 호스트명으로 서버 정보 확인이 안되면 오류가 발생한다.
mkdir kminion
cd kminion/

# kminion.yml 파일 생성 
echo "logger:
  level: info

kafka:
  brokers: [\"192.168.137.32:9092\"]" | tee kminion.yml

# docker-compose.yml 파일 생성 
echo "version: '3'

services:
  kminion:
    container_name: kminion
    image: vectorized/kminion:latest
    restart: unless-stopped
    environment:
      CONFIG_FILEPATH: /app/kminion.yml
    ports:
      - 8080:8080
    volumes:
      - ./kminion.yml:/app/kminion.yml
    extra_hosts:
      - 'kafka:192.168.137.32'" | tee docker-compose.yml

2-7. kminion 구동

sudo docker-compose up

2-8. metrics 확인

grafana 에 연동하는건 다음에.. ^^

'KAFKA' 카테고리의 다른 글

kafka, zookeeper 설치  (0) 2023.03.17

그동안 맥북을 써오다. 윈도우 노트북을 쓰게되어 Vue.js, Django 개발 환경 세팅을 하기 위해 WSL 로 Ubuntu를 설치하게 되었다.

DISM(배포 이미지 서비스 및 관리) 명령어로 Microsoft-Windows-Subsystem-Linux 기능 활성화

PS C:\Users\kalva> dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart

DISM 명령어로 VirtualMachinePlatform 기능을 활성화

PS C:\Users\kalva> dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

x64 머신용 최신 WSL2 Linux 커널 업데이트 패키지 설치

WSL 기본 버전 2로 변경

PS C:\Users\kalva> wsl --set-default-version 2

설치 가능한 리눅스 배포판 확인

PS C:\Users\kalva> wsl --list --online
다음은 설치할 수 있는 유효한 배포판 목록입니다.
'wsl.exe --install <Distro>'를 사용하여 설치합니다.

NAME                                   FRIENDLY NAME
Ubuntu                                 Ubuntu
Debian                                 Debian GNU/Linux
kali-linux                             Kali Linux Rolling
Ubuntu-18.04                           Ubuntu 18.04 LTS
Ubuntu-20.04                           Ubuntu 20.04 LTS
Ubuntu-22.04                           Ubuntu 22.04 LTS
OracleLinux_7_9                        Oracle Linux 7.9
OracleLinux_8_7                        Oracle Linux 8.7
OracleLinux_9_1                        Oracle Linux 9.1
SUSE-Linux-Enterprise-Server-15-SP4    SUSE Linux Enterprise Server 15 SP4
openSUSE-Leap-15.4                     openSUSE Leap 15.4
openSUSE-Tumbleweed                    openSUSE Tumbleweed

Ubuntu-22.04 설치

PS C:\Users\kalva> wsl --install Ubuntu-22.04

설치된 Ubuntu-22.04 확인

PS C:\Users\kalva> wsl -l -v
  NAME            STATE           VERSION
* Ubuntu-22.04    Stopped         2
  Ubuntu          Stopped         2

PS C:\Users\kalva> wsl cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=22.04
DISTRIB_CODENAME=jammy
DISTRIB_DESCRIPTION="Ubuntu 22.04.2 LTS"

PS C:\Users\kalva> wsl bash
kalva@RT-PC:/mnt/c/Users/kalva$

터미널로 Ubuntu-22.04 에 접속

'Dev' 카테고리의 다른 글

Vue 컨포넌트 - 데이터 바인딩 (2)  (0) 2023.07.01
Vue 컨포넌트 - 데이터 바인딩 (1)  (0) 2023.06.27
Vue 컴포넌트  (0) 2023.06.26
Vue Router 설정  (0) 2023.06.26
Vue CLI 설치, 프로젝트 생성  (0) 2023.06.25

zookeeper 설치

# zookeeper 설치 파일 다운로드 
[kalva@kalva-zk01 ~]$ wget https://dlcdn.apache.org/zookeeper/zookeeper-3.8.1/apache-zookeeper-3.8.1-bin.tar.gz

# zookeeper 설치 파일 압축해제 
[kalva@kalva-zk01 ~]$ sudo tar xvzf apache-zookeeper-3.8.1-bin.tar.gz -C /usr/local/

# zookeeper 설치파일 /usr/local/zookeeper 로 경로 설정 
[kalva@kalva-zk01 ~]$ cd /usr/local
[kalva@kalva-zk01 local]$ sudo ln -s ./apache-zookeeper-3.8.1-bin ./zookeeper

# zookeeper logs 디렉토리 생성 
[kalva@kalva-zk01 local]$ sudo mkdir -p /usr/local/zookeeper/logs

# zookeeper 데이터 디렉토리 생성 
[kalva@kalva-zk01 local]$ mkdir -p /data/zk

# zookeeper 구분 id 파일 생성 (각 서버에 맞게 생성)
## kalva-zk01 : 1
## kalva-zk02 : 2
## kalva-zk03 : 3
[kalva@kalva-zk01 local]$ echo 1 | sudo tee /data/zk/myid

# zookeeper Configuration 파일 설정
[kalva@kalva-zk01 local]$ echo "tickTime=2000
initLimit=10
syncLimit=5
dataDir=/data/zk
clientPort=2181
autopurge.snapRetainCount=3
autopurge.purgeInterval=1
server.1=kalva-zk01:2888:3888;2181
server.2=kalva-zk02:2888:3888;2181
server.3=kalva-zk03:2888:3888;2181" | sudo tee /usr/local/zookeeper/conf/zoo.cfg

# systemctl zookeeper-server.service 파일 생성 
[kalva@kalva-zk01 local]$ echo "[Unit]
Description=zookeeper-server
After=network.target

[Service]
Type=forking
User=zookeeper
Group=zookeeper
SyslogIdentifier=zookeeper-server
WorkingDirectory=/usr/local/zookeeper
Restart=always
RestartSec=0s
ExecStart=/usr/local/zookeeper/bin/zkServer.sh start
ExecStop=/usr/local/zookeeper/bin/zkServer.sh stop
ExecReload=/usr/local/zookeeper/bin/zkServer.sh restart

[Install]
WantedBy=multi-user.target" | sudo tee /etc/systemd/system/zookeeper-server.service

# systemctl daemon-reload, zookeeper-server 사용설정 
[kalva@kalva-zk01 local]$ sudo systemctl daemon-reload
[kalva@kalva-zk01 local]$ sudo systemctl enable zookeeper-server

# zookeeper 디렉토리 owner 변경 
[kalva@kalva-zk01 local]$ sudo chown -R zookeeper:zookeeper /usr/local/apache-zookeeper-3.8.1-bin
[kalva@kalva-zk01 local]$ sudo chown -R zookeeper:zookeeper /usr/local/zookeeper
[kalva@kalva-zk01 local]$ sudo chown -R zookeeper:zookeeper /data

# zookeeper-server 구동, 상태 확인 
[kalva@kalva-zk01 local]$ sudo systemctl start zookeeper-server
[kalva@kalva-zk01 local]$ sudo systemctl status zookeeper-server
● zookeeper-server.service - zookeeper-server
   Loaded: loaded (/etc/systemd/system/zookeeper-server.service; enabled; vendor preset: disabled)
   Active: active (running) since Fri 2023-03-17 00:18:57 KST; 37s ago
  Process: 2264 ExecStart=/usr/local/zookeeper/bin/zkServer.sh start (code=exited, status=0/SUCCESS)
 Main PID: 2281 (java)
   CGroup: /system.slice/zookeeper-server.service
           └─2281 java -Dzookeeper.log.dir=/usr/local/zookeeper/bin/../logs -Dzookeeper.log.file=zookeeper-zookeeper-server-kalva-zk01.log -XX:+HeapDumpOnOutOfMemoryError -XX:OnOutOfMemoryEr...

Mar 17 00:18:56 kalva-zk01 systemd[1]: Starting zookeeper-server...
Mar 17 00:18:56 kalva-zk01 zookeeper-server[2264]: /usr/bin/java
Mar 17 00:18:56 kalva-zk01 zookeeper-server[2264]: ZooKeeper JMX enabled by default
Mar 17 00:18:56 kalva-zk01 zookeeper-server[2264]: Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mar 17 00:18:57 kalva-zk01 systemd[1]: Started zookeeper-server.

kafka 설치

# kafka 설치파일 다운로드 
[kalva@kalva-kafka01 ~]$ wget https://downloads.apache.org/kafka/3.4.0/kafka_2.13-3.4.0.tgz

# kafka 설치파일 압축해제
[kalva@kalva-kafka01 ~]$ tar xzf kafka_2.13-3.4.0.tgz

# kafka 디렉토리 설정 
[kalva@kalva-kafka01 ~]$ sudo mv kafka_2.13-3.4.0 /usr/local/
[kalva@kalva-kafka01 ~]$ sudo ln -s /usr/local/kafka_2.13-3.4.0 /usr/local/kafka

# kafka Configuration 파일 설정 (각 서버에 맞게 설정)
## kalva-kafka01 : broker.id=1, PLAINTEXT://kalva-kafka01:9092
## kalva-kafka02 : broker.id=3, PLAINTEXT://kalva-kafka02:9092
## kalva-kafka03 : broker.id=3, PLAINTEXT://kalva-kafka03:9092
[kalva@kalva-kafka01 ~]$ echo "broker.id=1
listeners=PLAINTEXT://0.0.0.0:9092
advertised.listeners=PLAINTEXT://kalva-kafka01:9092
num.network.threads=4
num.io.threads=8
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
log.dirs=/data/kafka-logs
num.partitions=1
num.recovery.threads.per.data.dir=1
offsets.topic.replication.factor=3
transaction.state.log.replication.factor=3
transaction.state.log.min.isr=2
log.retention.hours=72
log.segment.bytes=1073741824
log.retention.check.interval.ms=300000
zookeeper.connect=kalva-zk01:2181,kalva-zk02:2181,kalva-zk03:2181
zookeeper.connection.timeout.ms=6000
group.initial.rebalance.delay.ms=3000" | sudo tee /usr/local/kafka/config/server.properties

# jmx 설정 파일 설정 
[kalva@kalva-kafka01 ~]$ echo "JMX_PORT=9999" | sudo tee /usr/local/kafka/config/jmx

# systemctl kafka-server.service 파일 생성 
[kalva@kalva-kafka01 ~]$ echo "[Unit]
Description=kafka-server
After=network.target

[Service]
Type=simple
SyslogIdentifier=kafka-server
WorkingDirectory=/usr/local/kafka
EnvironmentFile=/usr/local/kafka/config/jmx
Restart=always
ExecStart=/usr/local/kafka/bin/kafka-server-start.sh /usr/local/kafka/config/server.properties
ExecStop=/usr/local/kafka/bin/kafka-server-stop.sh

[Install]
WantedBy=multi-user.target" | sudo tee /etc/systemd/system/kafka-server.service

# systemctl daemon-reload, kafka-server 사용설정 
[kalva@kalva-kafka01 ~]$ sudo systemctl daemon-reload
[kalva@kalva-kafka01 ~]$ sudo systemctl enable kafka-server

# kafka-server 구동, 상태 확인 
[kalva@kalva-kafka01 ~]$ sudo systemctl start kafka-server
[kalva@kalva-kafka01 ~]$ sudo systemctl status kafka-server
● kafka-server.service - kafka-server
   Loaded: loaded (/etc/systemd/system/kafka-server.service; enabled; vendor preset: disabled)
   Active: active (running) since Fri 2023-03-17 21:51:39 KST; 1s ago
 Main PID: 15487 (java)
   CGroup: /system.slice/kafka-server.service
           └─15487 java -Xmx1G -Xms1G -server -XX:+UseG1GC -XX:MaxGCPauseMillis=20 -XX:InitiatingHeapOccupancyPercent=35 -XX:+ExplicitGCInvokesConcurrent -XX:MaxInlineLevel=15 -Djava.awt.headless=tr...

Mar 17 21:51:41 kalva-kafka01 kafka-server[15487]: at kafka.server.KafkaServer.startup(KafkaServer.scala:234)
Mar 17 21:51:41 kalva-kafka01 kafka-server[15487]: at kafka.Kafka$.main(Kafka.scala:115)
Mar 17 21:51:41 kalva-kafka01 kafka-server[15487]: at kafka.Kafka.main(Kafka.scala)
Mar 17 21:51:41 kalva-kafka01 kafka-server[15487]: [2023-03-17 21:51:41,575] INFO shutting down (kafka.server.KafkaServer)
Mar 17 21:51:41 kalva-kafka01 kafka-server[15487]: [2023-03-17 21:51:41,577] INFO [ZooKeeperClient Kafka server] Closing. (kafka.zookeeper.ZooKeeperClient)
Mar 17 21:51:41 kalva-kafka01 kafka-server[15487]: [2023-03-17 21:51:41,597] WARN An exception was thrown while closing send thread for session 0x300000075ce0002. (org.apache.zoo....ClientCnxn)
Mar 17 21:51:41 kalva-kafka01 kafka-server[15487]: EndOfStreamException: Unable to read additional data from server sessionid 0x300000075ce0002, likely server has closed socket
Mar 17 21:51:41 kalva-kafka01 kafka-server[15487]: at org.apache.zookeeper.ClientCnxnSocketNIO.doIO(ClientCnxnSocketNIO.java:77)
Mar 17 21:51:41 kalva-kafka01 kafka-server[15487]: at org.apache.zookeeper.ClientCnxnSocketNIO.doTransport(ClientCnxnSocketNIO.java:350)
Mar 17 21:51:41 kalva-kafka01 kafka-server[15487]: at org.apache.zookeeper.ClientCnxn$SendThread.run(ClientCnxn.java:1290)
Hint: Some lines were ellipsized, use -l to show in full.

# 토픽 생성 
[kalva@kalva-kafka01 ~]$ /usr/local/kafka/bin/kafka-topics.sh --bootstrap-server kalva-kafka01:9092 --replication-factor 1 --partitions 1 --create --topic test01
Created topic test01.

# 메시지 전송 
[kalva@kalva-kafka01 ~]$ /usr/local/kafka/bin/kafka-console-producer.sh --broker-list kalva-kafka01:9092,kalva-kafka02:9092,kalva-kafka03:9092 --topic test01
>hi! hi! hi!

# 메시지 읽어오기 
[kalva@kalva-kafka01 ~]$ /usr/local/kafka/bin/kafka-console-consumer.sh --bootstrap-server kalva-kafka01:9092 --topic test01 --from-beginning
hi! hi! hi!

'KAFKA' 카테고리의 다른 글

kminion 설치 (docker)  (0) 2023.06.22

Full Text Catalog 의 변경 내용 추적을 AUTO 로 운영중인데 서버 재기동 이후 채우기가 동작하지 않는 상황 발생 하였다.

 

검색해서 찾은 해결 방법은 

1. rebuild

2. 변경 내용 추적을 MANUAL 로 변경했다 AUTO 로 변경

3. 서버 재기동 

 

rebuild 는 시간 및 부하 이슈가 있으니 변경 내용 추적을 MANUAL 로 변경했다 AUTO 로 변경했다.

이후 주기적으로 잘 수집되는것을 확인하였다.

# Full Text Catalog 상태 확인 
declare @id int
select @id = id FROM sys.sysobjects where [Name] = 'TableName'
select 'TableFullTextBackgroundUpdateIndexOn' as 'Property', objectpropertyex(@id, 'TableFullTextBackgroundUpdateIndexOn') as 'Value'
union 
select 'TableFullTextChangeTrackingOn', objectpropertyex(@id, 'TableFullTextChangeTrackingOn')
union 
select 'TableFulltextDocsProcessed', objectpropertyex(@id, 'TableFulltextDocsProcessed') 
union 
select 'TableFulltextFailCount', objectpropertyex(@id, 'TableFulltextFailCount') 
union 
select 'TableFulltextItemCount', objectpropertyex(@id, 'TableFulltextItemCount') 
union 
select 'TableFulltextKeyColumn', objectpropertyex(@id, 'TableFulltextKeyColumn') 
union 
select 'TableFulltextPendingChanges', objectpropertyex(@id, 'TableFulltextPendingChanges') 
union 
select 'TableHasActiveFulltextIndex', objectpropertyex(@id, 'TableHasActiveFulltextIndex') 
union 
select 'TableFulltextPopulateStatus', objectpropertyex(@id, 'TableFulltextPopulateStatus') 

# 아래 쿼리의 Command 에서 생성된 쿼리로 변경 내용 추적을 MANUAL 로 변경했다 AUTO 로 변경한다.
# 주의할 점은 crawl_end_date가 없는 경우 전체를 다시 수집한다. 
SELECT [t].[name] [table_name], 
       [i].[name] [index_name],
       [fi].[change_tracking_state_desc], 
       [fi].[has_crawl_completed], 
       [fi].[crawl_type_desc], 
       [fi].[crawl_end_date],
       [ius].[last_user_update], 
       [ius].[last_user_seek],
       (SELECT [name]+',' FROM [sys].[fulltext_index_columns] [fc] INNER JOIN [sys].[columns] [c] ON [c].[object_id] = [fc].[object_id] AND [c].[column_id] = [fc].[column_id] WHERE [fc].[object_id] = [fi].[object_id] FOR XML PATH('')) [columns],
       (CASE WHEN [fi].[crawl_end_date] < ISNULL([ius].[last_user_update], [ius].[last_user_seek]) THEN 'ALTER FULLTEXT INDEX ON ['+[t].[name]+'] SET CHANGE_TRACKING MANUAL; ALTER FULLTEXT INDEX ON ['+[t].[name]+'] SET CHANGE_TRACKING AUTO' ELSE '' END) [Command]
FROM [sys].[fulltext_indexes] [fi]
INNER JOIN [sys].[indexes] [i] ON [i].[index_id] = [fi].[unique_index_id] AND [i].[object_id] = [fi].[object_id]
INNER JOIN [sys].[tables] [t] ON [t].[object_id] = [fi].[object_id]
LEFT JOIN [sys].[dm_db_index_usage_stats] [ius] ON [ius].[index_id] = [fi].[unique_index_id] AND [ius].[object_id] = [fi].[object_id] AND [ius].[database_id] = DB_ID()
ORDER BY [table_name], [index_name]

 

 

참고 : 

https://stackoverflow.com/questions/36329633/updating-fulltextsearch-index-immediately-sql-server-2012

https://www.mssqltips.com/sqlservertip/5996/tsql-script-to-correct-sql-server-full-text-indexes-not-updating/

'SQL Server' 카테고리의 다른 글

Always Encrypted char, nchar 데이터 타입 공백 검색 이슈  (0) 2022.09.02
Always Encrypted  (0) 2022.09.02
set ansi_padding off  (0) 2022.09.02

MySQL 서버의 CPU를 알뜰하게 다 사용해서 사용률이 100% 를 친다면?

MySQL은 쓰레드로 동작한다. CPU 사용률이 가장 높은 쓰레드를 찾아서 performance_schema.threads  에서 THREAD_OS_ID로 조회할 수 있다. 

 

pidstat 를 사용해서 CPU 사용률이 높은 쓰레드를 찾아본다. 

pidstat -t -p <mysqld_pid> 1  # 1 은 1초 간격으로 실행 

-- mysqld 의 pid 확인 
# ps -ef |grep mysqld
mysql        955       1  0 22:21 ?        00:00:00 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid
root        1622    1573  0 22:22 pts/1    00:00:00 grep --color=auto mysqld

# pidstat -t -p 955 1
-bash: pidstat: command not found

-- pidstat가 없을 경우 sysstat를 설치한다. 
# yum -y install sysstat

-- CPU 사용률이 가장 높은 TID 확인 
# pidstat -t -p 955 1
Linux 4.18.0-305.19.1.el8_4.x86_64 (localhost.localdomain) 	10/05/2022 	_x86_64_	(1 CPU)

10:24:46 PM   UID      TGID       TID    %usr %system  %guest   %wait    %CPU   CPU  Command
10:24:47 PM    27       955         -    1.98    0.99    0.00    0.00    2.97     0  mysqld
10:24:47 PM    27         -       955    0.00    0.00    0.00    0.00    0.00     0  |__mysqld
10:24:47 PM    27         -       959    0.00    0.00    0.00    0.00    0.00     0  |__mysqld
10:24:47 PM    27         -       963    0.00    0.00    0.00    0.00    0.00     0  |__mysqld
10:24:47 PM    27         -       965    0.00    0.00    0.00    0.00    0.00     0  |__mysqld
10:24:47 PM    27         -       966    0.00    0.00    0.00    0.00    0.00     0  |__mysqld
10:24:47 PM    27         -       967    0.00    0.00    0.00    0.00    0.00     0  |__mysqld
10:24:47 PM    27         -       968    0.00    0.00    0.00    0.00    0.00     0  |__mysqld
10:24:47 PM    27         -       969    0.00    0.00    0.00    0.00    0.00     0  |__mysqld
10:24:47 PM    27         -       970    0.00    0.00    0.00    0.00    0.00     0  |__mysqld
10:24:47 PM    27         -       971    0.00    0.00    0.00    0.00    0.00     0  |__mysqld
10:24:47 PM    27         -       972    0.00    0.00    0.00    0.00    0.00     0  |__mysqld
10:24:47 PM    27         -       973    0.00    0.00    0.00    0.00    0.00     0  |__mysqld
10:24:47 PM    27         -       974    0.00    0.00    0.00    0.00    0.00     0  |__mysqld
10:24:47 PM    27         -       994    0.00    0.00    0.00    0.00    0.00     0  |__mysqld
10:24:47 PM    27         -       995    0.00    0.00    0.00    0.00    0.00     0  |__mysqld
10:24:47 PM    27         -       996    0.00    0.00    0.00    0.00    0.00     0  |__mysqld
10:24:47 PM    27         -       997    0.00    0.00    0.00    0.00    0.00     0  |__mysqld
10:24:47 PM    27         -       998    0.00    0.00    0.00    0.00    0.00     0  |__mysqld
10:24:47 PM    27         -       999    0.00    0.00    0.00    0.00    0.00     0  |__mysqld
10:24:47 PM    27         -      1000    0.00    0.00    0.00    0.00    0.00     0  |__mysqld
10:24:47 PM    27         -      1001    0.00    0.00    0.00    0.00    0.00     0  |__mysqld
10:24:47 PM    27         -      1015    0.00    0.00    0.00    0.00    0.00     0  |__mysqld
10:24:47 PM    27         -      1016    0.00    0.00    0.00    0.00    0.00     0  |__mysqld
10:24:47 PM    27         -      1017    0.00    0.00    0.00    0.00    0.00     0  |__mysqld
10:24:47 PM    27         -      1018    0.00    0.00    0.00    0.00    0.00     0  |__mysqld
10:24:47 PM    27         -      1053    0.00    0.00    0.00    0.00    0.00     0  |__mysqld
10:24:47 PM    27         -      1057    0.00    0.00    0.00    0.00    0.00     0  |__mysqld
10:24:47 PM    27         -      1564    2.97    0.99    0.00    0.99    3.96     0  |__mysqld

 

CPU 사용률이 가장 높은 TID 1565 번을 확인한다. 

-- THREAD_OS_ID = 1564 확인 
mysql> select * from performance_schema.threads where THREAD_OS_ID=1564\G;
*************************** 1. row ***************************
          THREAD_ID: 28
               NAME: thread/sql/one_connection
               TYPE: FOREGROUND
     PROCESSLIST_ID: 3
   PROCESSLIST_USER: root
   PROCESSLIST_HOST: localhost
     PROCESSLIST_DB: test
PROCESSLIST_COMMAND: Query
   PROCESSLIST_TIME: 101
  PROCESSLIST_STATE: query end
   PROCESSLIST_INFO: select * from tb_test where col1 = 'aaaa'
   PARENT_THREAD_ID: NULL
               ROLE: NULL
       INSTRUMENTED: YES
            HISTORY: YES
    CONNECTION_TYPE: Socket
       THREAD_OS_ID: 1564
1 row in set (0.00 sec)

ERROR: 
No query specified

-- PROCESSLIST_ID = 3 kill 
mysql> kill 3;
Query OK, 0 rows affected (0.01 sec)

'MySQL' 카테고리의 다른 글

xtrabackup 옵션  (1) 2023.11.30
lock session 찾기  (0) 2022.10.01
auto_increment 값 모니터링  (0) 2022.09.28
Query Cache  (0) 2022.09.24
Index Hint  (0) 2022.09.22

show engine innodb status 의 TRANSACTIONS 부분에서 ACTIVE TRANSACTION 으로 Lock 을 잡고 있는 쿼리를 찾아야될때가 있다. 

회사에서 가장 많이 사용중인 5.7 버전부터 테스트해 본다. 

MySQL 5.7 테스트

mysql> create table tb_test (
    -> col1 int not null primary key,
    -> col2 varchar(10) not null
    -> );
Query OK, 0 rows affected (0.03 sec)

mysql> insert into tb_test values (1, 'aaa');
Query OK, 1 row affected (0.03 sec)

mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> update tb_test set col2 = 'bbb' where col1 = 1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

ACTIVE TRANSACTION은 확인되지만 어떤 쿼리인지는 확인이 안된다. 

mysql> show engine innodb status;
...
------------
TRANSACTIONS
------------
Trx id counter 1289
Purge done for trx's n:o < 0 undo n:o < 0 state: running but idle
History list length 0
LIST OF TRANSACTIONS FOR EACH SESSION:
---TRANSACTION 421405712030432, not started
0 lock struct(s), heap size 1136, 0 row lock(s)
---TRANSACTION 1288, ACTIVE 80 sec
2 lock struct(s), heap size 1136, 1 row lock(s), undo log entries 1
MySQL thread id 8, OS thread handle 139930706618112, query id 65 localhost root

mysql> select * from information_schema.innodb_locks;
Empty set, 1 warning (0.00 sec)

mysql> select * from information_schema.innodb_lock_waits;
Empty set, 1 warning (0.00 sec)

mysql> SELECT 
    ->   straight_join
    ->   w.trx_mysql_thread_id waiting_thread,w.trx_id waiting_trx_id,w.trx_query waiting_query,b.trx_mysql_thread_id blocking_thread,
    ->   b.trx_id blocking_trx_id,b.trx_query blocking_query,bl.lock_id blocking_lock_id,bl.lock_mode blocking_lock_mode,
    ->   bl.lock_type blocking_lock_type,bl.lock_table blocking_lock_table,bl.lock_index blocking_lock_index,wl.lock_id waiting_lock_id,
    ->   wl.lock_mode waiting_lock_mode,wl.lock_type waiting_lock_type,wl.lock_table waiting_lock_table,wl.lock_index waiting_lock_index
    -> FROM information_schema.INNODB_LOCK_WAITS ilw
    -> INNER JOIN information_schema.INNODB_TRX b ON b.trx_id = ilw.blocking_trx_id
    -> INNER JOIN information_schema.INNODB_TRX w ON w.trx_id = ilw.requesting_trx_id
    -> INNER JOIN information_schema.INNODB_LOCKS bl ON bl.lock_id = ilw.blocking_lock_id
    -> INNER JOIN information_schema.INNODB_LOCKS wl ON wl.lock_id = ilw.requested_lock_id;
Empty set, 3 warnings (0.00 sec)

다른 세션에서 Lock Wait 상황을 발생시키면?

mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> update tb_test set col2 = 'bbb' where col1 = 1;

Lock Wait 가 발생하면 확인이 된다.

mysql> select * from information_schema.INNODB_LOCK_WAITS;
+-------------------+-------------------+-----------------+------------------+
| requesting_trx_id | requested_lock_id | blocking_trx_id | blocking_lock_id |
+-------------------+-------------------+-----------------+------------------+
| 1289              | 1289:23:3:2       | 1288            | 1288:23:3:2      |
+-------------------+-------------------+-----------------+------------------+
1 row in set, 1 warning (0.00 sec)

mysql> select * from information_schema.INNODB_TRX;
+--------+-----------+---------------------+-----------------------+---------------------+------------+---------------------+------------------------------------------------+---------------------+-------------------+-------------------+------------------+-----------------------+-----------------+-------------------+-------------------------+---------------------+-------------------+------------------------+----------------------------+---------------------------+---------------------------+------------------+----------------------------+
| trx_id | trx_state | trx_started         | trx_requested_lock_id | trx_wait_started    | trx_weight | trx_mysql_thread_id | trx_query                                      | trx_operation_state | trx_tables_in_use | trx_tables_locked | trx_lock_structs | trx_lock_memory_bytes | trx_rows_locked | trx_rows_modified | trx_concurrency_tickets | trx_isolation_level | trx_unique_checks | trx_foreign_key_checks | trx_last_foreign_key_error | trx_adaptive_hash_latched | trx_adaptive_hash_timeout | trx_is_read_only | trx_autocommit_non_locking |
+--------+-----------+---------------------+-----------------------+---------------------+------------+---------------------+------------------------------------------------+---------------------+-------------------+-------------------+------------------+-----------------------+-----------------+-------------------+-------------------------+---------------------+-------------------+------------------------+----------------------------+---------------------------+---------------------------+------------------+----------------------------+
| 1289   | LOCK WAIT | 2022-10-01 15:39:28 | 1289:23:3:2           | 2022-10-01 15:40:35 |          2 |                  10 | update tb_test set col2 = 'bbb' where col1 = 1 | starting index read |                 1 |                 1 |                2 |                  1136 |               2 |                 0 |                       0 | REPEATABLE READ     |                 1 |                      1 | NULL                       |                         0 |                         0 |                0 |                          0 |
| 1288   | RUNNING   | 2022-10-01 15:31:45 | NULL                  | NULL                |          3 |                   8 | NULL                                           | NULL                |                 0 |                 1 |                2 |                  1136 |               1 |                 1 |                       0 | REPEATABLE READ     |                 1 |                      1 | NULL                       |                         0 |                         0 |                0 |                          0 |
+--------+-----------+---------------------+-----------------------+---------------------+------------+---------------------+------------------------------------------------+---------------------+-------------------+-------------------+------------------+-----------------------+-----------------+-------------------+-------------------------+---------------------+-------------------+------------------------+----------------------------+---------------------------+---------------------------+------------------+----------------------------+
2 rows in set (0.00 sec)

mysql> SELECT 
    ->   straight_join
    ->   w.trx_mysql_thread_id waiting_thread,w.trx_id waiting_trx_id,w.trx_query waiting_query,b.trx_mysql_thread_id blocking_thread,
    ->   b.trx_id blocking_trx_id,b.trx_query blocking_query,bl.lock_id blocking_lock_id,bl.lock_mode blocking_lock_mode,
    ->   bl.lock_type blocking_lock_type,bl.lock_table blocking_lock_table,bl.lock_index blocking_lock_index,wl.lock_id waiting_lock_id,
    ->   wl.lock_mode waiting_lock_mode,wl.lock_type waiting_lock_type,wl.lock_table waiting_lock_table,wl.lock_index waiting_lock_index
    -> FROM information_schema.INNODB_LOCK_WAITS ilw
    -> INNER JOIN information_schema.INNODB_TRX b ON b.trx_id = ilw.blocking_trx_id
    -> INNER JOIN information_schema.INNODB_TRX w ON w.trx_id = ilw.requesting_trx_id
    -> INNER JOIN information_schema.INNODB_LOCKS bl ON bl.lock_id = ilw.blocking_lock_id
    -> INNER JOIN information_schema.INNODB_LOCKS wl ON wl.lock_id = ilw.requested_lock_id;
+----------------+----------------+------------------------------------------------+-----------------+-----------------+----------------+------------------+--------------------+--------------------+---------------------+---------------------+-----------------+-------------------+-------------------+--------------------+--------------------+
| waiting_thread | waiting_trx_id | waiting_query                                  | blocking_thread | blocking_trx_id | blocking_query | blocking_lock_id | blocking_lock_mode | blocking_lock_type | blocking_lock_table | blocking_lock_index | waiting_lock_id | waiting_lock_mode | waiting_lock_type | waiting_lock_table | waiting_lock_index |
+----------------+----------------+------------------------------------------------+-----------------+-----------------+----------------+------------------+--------------------+--------------------+---------------------+---------------------+-----------------+-------------------+-------------------+--------------------+--------------------+
|             10 | 1289           | update tb_test set col2 = 'bbb' where col1 = 1 |               8 | 1288            | NULL           | 1288:23:3:2      | X                  | RECORD             | `test`.`tb_test`    | PRIMARY             | 1289:23:3:2     | X                 | RECORD            | `test`.`tb_test`   | PRIMARY            |
+----------------+----------------+------------------------------------------------+-----------------+-----------------+----------------+------------------+--------------------+--------------------+---------------------+---------------------+-----------------+-------------------+-------------------+--------------------+--------------------+
1 row in set, 3 warnings (0.00 sec)

5.7 에서는 Lock Wait 이 발생해야 Lock 정보 확인이 가능하다.

즉 Lock 경합이 없으면 어떤 쿼리가 Lock 잡고 있는지 확인이 안된다. 

아하하하 미친다. (왜 미치냐면 이게 문제가 되고 있어서.)

 

MySQL 8.0 테스트

mysql> create table tb_test (
    -> col1 int not null primary key,
    -> col2 varchar(10) not null
    -> );
Query OK, 0 rows affected (0.03 sec)

mysql> insert into tb_test values (1, 'aaa');
Query OK, 1 row affected (0.03 sec)

mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> update tb_test set col2 = 'bbb' where col1 = 1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

ACTIVE TRANSACTION, Lock 쿼리 확인 

mysql> show engine innodb status;
------------
TRANSACTIONS
------------
Trx id counter 7713
Purge done for trx's n:o < 7710 undo n:o < 0 state: running but idle
History list length 0
LIST OF TRANSACTIONS FOR EACH SESSION:
---TRANSACTION 422006973530112, not started
0 lock struct(s), heap size 1128, 0 row lock(s)
---TRANSACTION 422006973528496, not started
0 lock struct(s), heap size 1128, 0 row lock(s)
---TRANSACTION 422006973527688, not started
0 lock struct(s), heap size 1128, 0 row lock(s)
---TRANSACTION 7712, ACTIVE 26 sec
2 lock struct(s), heap size 1128, 1 row lock(s), undo log entries 1
MySQL thread id 9, OS thread handle 140531536729856, query id 26 localhost root

mysql> select * from performance_schema.data_locks;
+--------+----------------------------------------+-----------------------+-----------+----------+---------------+-------------+----------------+-------------------+------------+-----------------------+-----------+---------------+-------------+-----------+
| ENGINE | ENGINE_LOCK_ID                         | ENGINE_TRANSACTION_ID | THREAD_ID | EVENT_ID | OBJECT_SCHEMA | OBJECT_NAME | PARTITION_NAME | SUBPARTITION_NAME | INDEX_NAME | OBJECT_INSTANCE_BEGIN | LOCK_TYPE | LOCK_MODE     | LOCK_STATUS | LOCK_DATA |
+--------+----------------------------------------+-----------------------+-----------+----------+---------------+-------------+----------------+-------------------+------------+-----------------------+-----------+---------------+-------------+-----------+
| INNODB | 140531996818648:1083:140532001090368   |                  7712 |        48 |       32 | test          | tb_test     | NULL           | NULL              | NULL       |       140532001090368 | TABLE     | IX            | GRANTED     | NULL      |
| INNODB | 140531996818648:22:4:2:140532001087456 |                  7712 |        48 |       32 | test          | tb_test     | NULL           | NULL              | PRIMARY    |       140532001087456 | RECORD    | X,REC_NOT_GAP | GRANTED     | 1         |
+--------+----------------------------------------+-----------------------+-----------+----------+---------------+-------------+----------------+-------------------+------------+-----------------------+-----------+---------------+-------------+-----------+
2 rows in set (0.01 sec)

mysql> SELECT straight_join
    ->   dl.thread_id,est.sql_text,dl.object_schema,dl.object_name,dl.index_name,
    ->   dl.lock_type,dl.lock_mode,dl.lock_status,dl.lock_data
    -> FROM performance_schema.data_locks dl 
    -> INNER JOIN performance_schema.events_statements_current est ON dl.thread_id = est.thread_id
    -> ORDER BY est.timer_start,dl.object_instance_begin;
+-----------+------------------------------------------------+---------------+-------------+------------+-----------+---------------+-------------+-----------+
| thread_id | sql_text                                       | object_schema | object_name | index_name | lock_type | lock_mode     | lock_status | lock_data |
+-----------+------------------------------------------------+---------------+-------------+------------+-----------+---------------+-------------+-----------+
|        48 | update tb_test set col2 = 'bbb' where col1 = 1 | test          | tb_test     | PRIMARY    | RECORD    | X,REC_NOT_GAP | GRANTED     | 1         |
|        48 | update tb_test set col2 = 'bbb' where col1 = 1 | test          | tb_test     | NULL       | TABLE     | IX            | GRANTED     | NULL      |
+-----------+------------------------------------------------+---------------+-------------+------------+-----------+---------------+-------------+-----------+
2 rows in set (0.00 sec)

8.0 에서는 Lock Wait 이 발생하지 않아도 Lock 을 잡고 있는 쿼리 확인이 잘된다. 

 

'MySQL' 카테고리의 다른 글

xtrabackup 옵션  (1) 2023.11.30
CPU 사용률 높은 Thread (세션) 확인  (0) 2022.10.05
auto_increment 값 모니터링  (0) 2022.09.28
Query Cache  (0) 2022.09.24
Index Hint  (0) 2022.09.22

+ Recent posts