pg_리팩으로 데스크톱 공간 이동, 용량 위기 탈출 2018.5.23

published_at: 2018-05-28
이것은 자신의 당초Qiita 문장을 옮긴 것이다
상당한 업무량 증가로 DB 서버(※ 0)의 용량이 위기로 치달았다.
대책으로 세계에 남은 40장의 고속 시디 카드를 사들여 증설했다.
이 증설 구역에 대한 실체 이동 수단으로 pg리팩을 사용하여 현재 문제를 성공적으로 해결합니다.
활용 사례로 사회에 도움이 되려고 기고했습니다.
  • (※0)
  • PostgreSQL 계열의 RDBMS에서 제공된 GUI 도구가 있는 유상 제품
  • 개시하다


    테이블 공간 정보

  • 테이블 공간을 사용하여 PostgreSQL의 디스크 레이아웃을 제어할 수 있습니다.음량이 부족할 때 대책을 세울 수 있다.
  • (PostgreSQL9.4.5 파일 21.6. 테이블 스페이스)
    https://www.postgresql.jp/document/9.4/html/manage-ag-tablespaces.html

    pg_리패키지 정보

  • 온라인에서 조작할 수 있는 테이블이나 인덱스 재구성 도구입니다.
  • https://github.com/reorg/pg_repack

    조정 전 상태


    매우 궁핍한 상태
    용량(df-h)
    크기
    사용
    잉여
    % 1 사용하기
    마운트 위치
    /dev/fioa1
    2.2T
    1.7T
    464G
    79%
    /mnt/fio/(이하 생략)

    디스크 추가


    끄기 전에.


    증설 전에 컴퓨터를 꺼야 하며, 다음과 같은 사항을 실시할 준비를 해야 한다.
  • 외부 액세스를 제거하기 위해 서비스를 유지 관리 모드로 설정
  • 내부에서 정기적으로 실행되는 모든 배경 처리 중지
  • 이 시점에서 WAL 파일이 나오지 않는 상태로 가정하지만 autovacuum 회전으로 출력을 멈출 수 없어 DBMS
  • 를 멈춘다.
  • 이렇게 되면 WAL 파일의 출력이 완전히 멈추고, 신중을 기하기 위해 WAL 파일을 백업 서버(※ 1)로 복사하고 꺼집니다.
  • (※1)
  • 서버에 접속할 수 없는 경우에 대비합니다.
  • 카드 추가, 드라이버 및 펌웨어 업데이트


    (완전 업자가 해준 거야)
    (말은 그렇지만 실시 시기의 줄 서기는 하도급자의 지시이기 때문에 주동적으로 계획하고 구상해야 한다)
    (과정 중 원격 접속 컨트롤러에 로그인해야 할 경우 Windows PC를 가지고 조작하세요)(※ 2)
    (2회 정도 OS 협착 재부팅, 사용 가능)
  • (※2)
  • 새 버전이라 이 경우 문제가 없지만, 옛 iDRAC 등의 경우 가상 콘솔을 시작하려면 자바 버전에 유의해야 한다.
  • pg_리패키지로 표 공간 이동


    추가 후 (형식 마운트 명령 생략)
    용량(df-h)
    크기
    사용
    잉여
    % 1 사용하기
    마운트 위치
    /dev/fioa1
    2.2T
    1.7T
    464G
    79%
    /mnt/fio/(이하 생략)
    /dev/fiob
    3.0T
    33M
    3.0T
    1%
    /mnt/fio2/(이하 약)

    PostgreSQL 시작


    설정을 확인하고 조정한 후 시작합니다.

    테이블 공간 만들기

    /mnt/fio2 아래 표 공간에 사용할 디렉터리 만들기
    소유자 권한을 postgres:postgres 700로 설정한 후
    GUI를 통해 테이블 공간을 만듭니다space2.(※3)
    또한 복사된 목적지에서 같은 디렉터리 경로를 미리 정비하지 않으면 테이블 공간을 만들 때 복사가 끊깁니다.
  • (※3)
  • 유상 제품에만 적용되는 GUI를 활용합니다.참고로 다음과 같은 SQL에 해당합니다(아마)
  • CREATE TABLESPACE space2 LOCATION '/mnt/fio2/(以下略)';
  • 기본 테이블 공간 수정


    향후 쓰기 대상space2을 위해 다음 쿼리를 수행합니다.ALTER DATABASE large-db SET default_tablespace TO 'space2';현재 기본 테이블 공간을 확인하는 방법은 각 DB를 통해 다음 명령을 실행하는 것입니다SHOW default_tablespace;또는 테이블 단위로 테이블 공간을 확인할 수 있습니다. 새 테이블의 경우 다음 SQL
    SELECT
      u.relname AS table_name,
      current_database() AS database_name,
      t.tablespace AS tablespace_name
    FROM
      pg_stat_user_tables u
      JOIN pg_tables t ON u.relname = t.tablename
    WHERE
      relname = '(新規テーブル名)';
    

    테이블 공간 이동 스크립트


    첫 번째 매개변수에 테이블 리스트를 지정하고, 두 번째 매개변수에 DB 이름을 지정하며, 세 번째 매개변수에 이동할 테이블 공간을 지정하는 스크립트는 다음과 같습니다.
  • num는 진전을 파악하는 의도 변수, pgrepack 전후 pgsize_pretty 함수는 재구성 효과를 표시하는 명령입니다
  • pg_repack 이전time 명령은 컨트롤러에 표시되지만, 물이 너무 빨라서 일일이 확인할 수 없습니다
  • exec_repack_mv_space.sh
    # !/bin/bash
    tbl=$(cat $1)
    db=$2
    toSpace=$3
    
    num=0
    for t in ${tbl[@]}
    do
            num=$((num + 1))
            echo "----- [$num] ----- ${t}";
            psql -U postgres -h localhost -t -c"SELECT pg_size_pretty(pg_total_relation_size('${t}')) AS tbl_size" ${db}
            time pg_repack -U postgres -h localhost -d ${db} -t ${t} -s ${toSpace} -S
            psql -U postgres -h localhost -t -c"SELECT pg_size_pretty(pg_total_relation_size('${t}')) AS tbl_size" ${db}
            echo "";
    done
    
    이를 chmod +x exec_repack_mv_space.sh한 후 다음과 같이 집행한다../exec_repack_mv_space.sh tbl-list large-db space2

    조정 후의 상태


    나는 식탁 공간을 이동하는 것은 유지 보수 시간 내인 줄 알았지만 시간 내에 명세서는 아직 끝나지 않았다.
    그러나 스크립트 실행은 목록이 끝날 때까지 계속되었지만 서비스 영향은 보고되지 않았습니다.
    영향이 없다고 여기다sweat_smile:
    용량(df-h)
    크기
    사용
    잉여
    % 1 사용하기
    마운트 위치
    /dev/fioa1
    2.2T
    1.4T
    770G
    65%
    /mnt/fio/(이하 생략)
    /dev/fiob
    3.0T
    208G
    2.8T
    7%
    /mnt/fio2/(이하 약)

    끝말

  • 앞으로도 여유 용량 pg 확인리팩을 활용할 필요가 있지만 현재로서는 초과했다고 할 수 있다.
  • 는 상당히 강력하고 사용하기 어려운 운용 도구이다.
  • 용량이 팽창할 것 같은 DB라도 처음부터 표 공간을 활용하면 장기적인 가동을 예견할 수 있다.
  • 운용에 신경이 좀 필요한 것 같아요.
  • 느끼는 pgrepack의 경향 등(개인의 견해)
  • 실행 시 CPU 부하가 그에 상응하여 증가하는 느낌.역시 서비스의 영향에 적당히 주의하는 것이 좋다.
  • 대표의 pg리패키지가 오래 걸릴 것 같은데...
  • 처리는 하나의 핵심만 사용하는 것 같습니다.
  • 자원이 풍부하면 약간 병행 실행할 수 있다.PostgreSQL의 경향은?
  • 기타

  • 현재 테이블 공간을 파악하는 방법이 없는 것 같습니다. 메타 명령¥l+으로 표시된 모든 DB의 Tablespace가 최초인 것 같습니다.
  • 테이블 공간을 이동하지 않는 pg리팩을 실행하는 경우 exec_repack_mv_space.sh 에서 제외-s ${toSpace} -S할 수 있습니다.
  • pg_리패키지 설치 방법은 다른 글에서(또는 공식 참조)
  • 일부 증설·이동에 성공했지만, 사전 검증과 파악을 충분히 한 결과라고 본다.
  • 예행연습, 소규모 집행이 효과가 있다.역시 준비는 중요하다.
  • 좋은 웹페이지 즐겨찾기