MySQL의 메타 정보를 BigQuery에 모아 시각적으로 표시

이 기사는 OPENLOGI Advent Calendar 2020 23일째 보도다.
https://qiita.com/advent-calendar/2020/openlogi
...응?
투고 날짜 안 썼어요?
괜찮아, 그렇게 사소한 일.
일부러 지적하지 않으면 아무도 눈치채지 못할 텐데..
"나는 직감이 좋은 아이를 싫어한다."
(이미지 생략)

순서


수년 단위로 장기적으로 활용되는 서비스는 데이터베이스의 데이터량에 점점 신경을 쓴다.
디스크 용량 부족, 메모리 부족으로 성능 저하
MySQL에서 AutoIncreament 열의 데이터 형식이 부주의로 32비트 int로 바뀌었습니다
눈치채면 상한선(signed면 약 21억, unsigned면 약 42억)이 가까워진다.
그런 데이터의 양을 신경 쓸 때 MySQL이면SHOW TABLE STATUS;표별 기록수(매뉴얼에도 있지만 이 값은 InnoDB 엔진의 근사값으로 정확한 값이 아니다), 데이터 용량, 현재의 AutoIncreament 값 등이다.
하지만
이 데이터는 단지 그 조회의 시간치를 두드리고 있을 뿐이다.
DB를 활용하는 입장에서.
"이 책상은 어떤 속도로 데이터를 늘립니까?"
나는 이 점이 매우 마음에 든다.
이걸 알면 언제쯤 메모리 증설 같은 게 필요할까
이 시계는 비대하게 발전하려고 하기 때문에 약간의 처리가 필요하다
이렇게 하면 어느 정도 읽을 수 있다.
이렇게 되면 정기적으로 두드려서SHOW TABLE STATUS; 결과를 어딘가에 두면 된다.
그럼, 여기까지라면 사실 계발된 기사가 있어요
MySQL 근처에 익숙한 Yooku0825의 항목:
https://yoku0825.blogspot.com/2020/06/informationschematables-ascii.html
상기 보도에서 저장된 데이터를 다른 MySQL DB에 넣고 ASCII 도표를 만든다
볼륨 데이터 로더의 Embulk
DWHBigQuery로 많이 쓰니까요.
이 프로세스에 MySQL의 메타데이터를 추가하여 수집하는 것도 좋지 않습니까?내 생각엔

MySQL에서 BigQuery로 메타데이터를 전송하는 Embalk 설정 파일


프로필은 이런 느낌입니다.
SQL 조회는 거의 Yooku0825의 글입니다.
저도 AutoIncreament 값을 원해서 그걸 추가했어요.
mysql_meta_tables.yml
in:
  type: mysql
  host: somehost
  user: someuser
  password: somepassword
  database: information_schema
  options:
    useLegacyDatetimeCode: false
    serverTimezone: Asia/Tokyo
    characterEncoding: utf8mb4
  query: |
    SELECT
      table_schema,
      table_name,
      table_rows,
      data_length,
      index_length,
      data_free,
      auto_increment,
      NOW() AS last_update
    FROM
      tables
    WHERE
      table_schema NOT IN ('mysql', 'information_schema', 'performance_schema', 'sys') AND
      table_type = 'BASE TABLE'
out:
  type: bigquery
#  auth_method: 認証情報なのでブログ上では省略
  location: asia-northeast1
  compression: GZIP
  default_timezone: Asia/Tokyo
  project: awesome_project
  dataset: mysql_meta
  mode: append
  table: i_s_tables
  column_options:
  - name: table_schema
    type: STRING
  - name: table_name
    type: STRING
  - name: table_rows
    type: INTEGER
  - name: data_length
    type: INTEGER
  - name: index_length
    type: INTEGER
  - name: data_free
    type: INTEGER
  - name: auto_increment
    type: INTEGER
  - name: last_update
    type: TIMESTAMP
crontab에서 매일 정기적으로 실행됩니다.
0 4 * * * cd /path/to/project; embulk run mysql_meta_tables.yml
이렇게 하면 데이터를 얻을 수 있다.

시각화


그리고 빅Query이기 때문에 데이터 포털과 쉽게 협업할 수 있기 때문에 시각적으로 만들어 보려고 한다.
일단 Table Rows의 TOP20입니다.

Auto Increament의 TOP20

이렇게 되면'매일 얼마나 늘었는지'몰라요.
나는 매일의 추이를 보고 싶다
직접 실수로 도표를 만들면 도표가 잘 보이지 않기 때문에'전날과의 차이점'값을 도표화한다.
이렇게 하려면 BigQuery 옆에 View를 만듭니다.
윈도 함수를 사용하면 데이터에도 전날과의 차이가 포함되어 있다.
SELECT 
  DATE_SUB(DATE(last_update, 'Asia/Tokyo'), INTERVAL 1 DAY) AS target_date,
  table_schema,
  table_name,
  table_rows,
  table_rows - LAG(table_rows) OVER (PARTITION BY table_schema, table_name ORDER BY last_update) AS table_rows_delta,
  data_length,
  data_length - LAG(data_length) OVER (PARTITION BY table_schema, table_name ORDER BY last_update) AS data_length_delta,
  index_length,
  index_length - LAG(index_length) OVER (PARTITION BY table_schema, table_name ORDER BY last_update) AS index_length_delta,
  data_free,
  auto_increment,
  auto_increment - LAG(auto_increment) OVER (PARTITION BY table_schema, table_name ORDER BY last_update) AS auto_increment_delta
FROM `mysql_meta.i_s_tables` 
이 AutoIncreament 값의 매일 증가량을 이용한 도표가 여기에 있다.

'증가량'의 도표이기 때문에 이 도표가 상승세를 보이면 데이터 양이 급격히 증가한다.
변하지 않는다면 기본적으로 일정한 속도다.
12월 20일 데이터 증가량이 적은 것은 일요일에 창고가 출고하지 않았기 때문이다.

총결산


MySQLSHOW TABLE STATUS; 정보를 Embalk에서 BigQuery로 이동
데이터 포털 사이트에서 시각화된 곳을 소개했다.
그리고 이 정보를 정기적으로 슬랙에게 전달하는 거예요.
기타 정보 -schema와performanceschema의 정보
왜냐하면 시간 순서가 있으면 유용한 정보가 있을 거예요.
나는 나를 충실하게 하고 싶다.

좋은 웹페이지 즐겨찾기