EC2에서 insert 700만 건

하고 싶은 일

  • EC2의 mysql(RDS)에 700만 장의 음반을 넣고 싶다
  • 최대한 짧게 넣어주시기 바랍니다
  • 한 번에 넣고 싶어
  • 컨디션

  • docker-compose
  • rails(6.1)
  • local기계: mbp16GB
  • EC2계획:t3.smmall(메모리 2GB), DB는 RDS
  • 미리 준비하다


    docker-compose.내용변경↓
    version: '3'
    services:
      db:
        image: mysql:5.7.34
        command: --max_allowed_packet=536870912
        environment:
          MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
        ports:
          - "4306:3306"
      web:
        build: .
        command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
        environment:
          TZ: Asia/Tokyo
        volumes:
          - .:/test
        ports:
          - "3000:3000"
        depends_on:
          - db
    
  • 요점: 위에서 5행까지 mysql의 패키지를 512MB
  • 로 증가
    docker의setting↓ 변경
  • 점: 리소스 메모리를 8GB
  • 로 증가

    local 방식으로 실행

  • 우선 local이 수백만 insert
  • 를 실현할 수 있는지 확인한다
  • seeds.rb내용변경↓
  • (예를 들어 insert csv 데이터의 경우)
  • # frozen_string_literal: true
    
    require "csv"
    
    def insert_all_test
      array = []
      CSV.foreach("db/test1.csv", headers: true) do |row|
        array << {
            name: row["name"],
            created_at: Time.current,
            updated_at: Time.current
        }
      end
      User.insert_all array
    
      array = []
      CSV.foreach("db/test2.csv", headers: true) do |row|
        array << {
            name: row["name"],
            created_at: Time.current,
            updated_at: Time.current
        }
      end
      User.insert_all array
    end
    
    insert_all_test
    
  • 점: 오류가 발생하지 않는 양의 데이터를 한 번에 insert_allDB에 순환
  • 반복
  • 마지막 줄insert_all_test에서 이 def$ rails db:seed
  • 를 실행합니다
  • 이렇게 한 번만 하면 insert.local 700만 개 insert 약 15분 완료
  • (insert all 방법은cread at와 업데이트 at를 자동으로 삽입할 수 없기 때문에 위와 같이 명시해야 함)
  • EC2 사전 준비

  • mysql 환경 변경
  • DB가 RDS인 경우

  • 매개변수 그룹에서 변경max_allowed_packet(이번에는 512MB)
  • 기본 매개 변수 그룹의 내용을 변경할 수 없기 때문에 다시 만들어야 한다
  • 점: 새 매개변수 그룹을 생성한 후 EC2 인스턴스에 해당 그룹을 적용
  • EC2 실행

  • $ rails db:seed RAILS_ENV=production
  • 계획:t3.smill의 경우

  • csv 1개 약 50만건
  • insert 700만개 약 50분
  • 계획:t2.마이크로의 경우

  • csv 한 개에 약 30만 건(50만 건의 오류.broken pipe)
  • 미크로 계획이라도 한 번 시간을 써도 돼요.

    좋은 웹페이지 즐겨찾기