그래프 노드에서 손쉬운 설정 확장

10778 단어 blockchainsubgraph
Japanese version

어떤 이유로 graph-node과 같은 호스팅 서비스를 사용하지 않고 고유한 The Graph을 구축하는 경우 그래프 노드의 확장도 올바르게 고려해야 합니다. 확장을 허용하는 구성을 구축하지 않으면 사용자는 종종 Web3 클라이언트에서 504(게이트웨이 시간 초과) 요청으로 끝납니다. 이 기사에서는 손쉬운 그래프 노드 확장 방법을 소개합니다.

TL; DR



official docker-compose.yml을 다음과 같이 다시 작성하십시오(설명은 다음과 같음).

version: '3'
services:
  graph-node-index:
    image: graphprotocol/graph-node
    ports:
      - '8020:8020'
    depends_on:
      - ipfs
      - postgres
    extra_hosts:
      - host.docker.internal:host-gateway
    environment:
      postgres_host: postgres
      postgres_user: graph-node
      postgres_pass: let-me-in
      postgres_db: graph-node
      ipfs: 'ipfs:5001'
      ethereum: 'mainnet:http://host.docker.internal:8545'
      GRAPH_LOG: info
      node_role: index-node
      node_id: index-node
      BLOCK_INGESTOR: index-node

  graph-node-query:
    image: graphprotocol/graph-node
    ports:
      - '8000:8000'
      - '8001:8001'
    depends_on:
      - ipfs
      - postgres
    extra_hosts:
      - host.docker.internal:host-gateway
    environment:
      postgres_host: postgres
      postgres_user: graph-node
      postgres_pass: let-me-in
      postgres_db: graph-node
      ipfs: 'ipfs:5001'
      ethereum: 'mainnet:http://host.docker.internal:8545'
      GRAPH_LOG: info
      node_role: query-node
  ipfs:
    image: ipfs/go-ipfs:v0.4.23
    ports:
      - '5001:5001'
    volumes:
      - ./data/ipfs:/data/ipfs
  postgres:
    image: postgres
    ports:
      - '5432:5432'
    command:
      [
        "postgres",
        "-cshared_preload_libraries=pg_stat_statements",
        "-cmax_connections=100"
      ]
    environment:
      POSTGRES_USER: graph-node
      POSTGRES_PASSWORD: let-me-in
      POSTGRES_DB: graph-node
    volumes:
      - ./data/postgres:/var/lib/postgresql/data


그런 다음 다음과 같이 노드를 실행합니다.

docker-compose up -d --scale graph-node-query=5


다음은 설명입니다

확장 그래프 노드



그래프 노드를 확장할 수 있도록 docker-compose 구성을 수정하고 있습니다. 제가 하고 있는 일은 크게 두 가지입니다
  • 그래프 노드를 두 개의 인덱스 노드와 쿼리 노드로 분할
  • 동시 PostgreSQL 연결 수 증가

  • 동시 PostgreSQL 연결 수 늘리기



    쉬운 것부터 시작합시다. 동시 PostgreSQL 연결 수를 늘리는 시작 옵션을 추가합니다.

    @@ -34,7 +53,8 @@
         command:
           [
             "postgres",
    - "-cshared_preload_libraries=pg_stat_statements"
    + "-cshared_preload_libraries=pg_stat_statements",
    + "-cmax_connections=100"
           ]
         environment:
           POSTGRES_USER: graph-node
    


    확장을 위해 그래프 노드 수를 늘리고 있으므로 PostgreSQL 측에서 대기 중인 연결 수도 늘려야 합니다. 여기서는 100으로 설정했습니다.

    그래프 노드를 인덱스 노드와 쿼리 노드의 두 가지 역할로 분할



    다음으로 그래프 노드는 인덱스 전용 노드와 쿼리 전용 노드의 두 가지 역할로 나뉩니다. 쿼리 전용 노드 수를 늘려 확장합니다. 이러한 역할 분리 없이 scale-out을 수행하면 인덱스 작업을 위해 경쟁하는 인덱스 노드가 여러 개 있을 것입니다. 다른 방법은 고유한 node_id를 사용하는 것이지만 이번에는 이 방법을 사용하지 않았습니다(이유는 후기 참조).

    인덱스 및 쿼리 노드는 그래프 노드 시작 시 DISABLE_BLOCK_INGESTOR 환경 변수에 의해 전환됩니다. DISABLE_BLOCK_INGESTOR=false 이면 쿼리 노드가 되고 true 이면 인덱스 노드가 됩니다. 이것은 약간 복잡하지만 node_role 에 의해 Dockerfile 내부의 start 스크립트에서 전환됩니다.

    graph-node-index:
        environment:
          node_role: index-node
          node_id: index-node
          BLOCK_INGESTOR: index-node
    



      graph-node-query:
        environment:
          node_role: query-node
    


    이것만으로도 호스트 측 포트 충돌이 발생하므로 호스트 측 포트 충돌을 방지하기 위해 인덱스 노드(graph-node-index)는 API 포트(8020)만 수신하고 쿼리 노드(graph-node-query)는 HTTP(8000) 및 Websocket(8001)만 수신합니다.

      graph-node-index:
        image: graphprotocol/graph-node
        ports:
          # - '8000:8000'
          # - '8001:8001'
          - '8020:8020'
          #- '8030:8030'
          #- '8040:8040'
    



      graph-node-query:
        image: graphprotocol/graph-node
        ports:
          - '8000:8000'
          - '8001:8001'
          #- '8020:8020'
          #- '8030:8030'
          #- '8040:8040'
    


    이 위치에서 쿼리 노드를 확장하면 좋습니다.

    docker-compose up -d --scale graph-node-query=5
    


    그래 잘했어!!!


    (Postscript) node_id를 고유하게 만들어서 충돌을 피하지 않은 이유는 무엇입니까?



    첫 번째 접근 방식은 node_id를 고유하게 만드는 것이었습니다. 그러나 다음 두 가지 이유로 접근 방식을 변경했습니다.

    API 노드 엔드포인트 숨기기



    낯선 사람이 허가 없이 API에 액세스할 가능성을 줄이기 위해 일반 대중이 액세스하는 쿼리 노드에서 API 노드를 완전히 격리하고 싶었습니다.

    공식 Dockerfile을 있는 그대로 사용하고 싶습니다.



    고유하게 만들기 위해 node_id를 $HOSTNAME로 설정하는 것이 가장 쉬울 수 있지만 이렇게 하려면 start 스크립트를 수정해야 합니다.

    좋은 웹페이지 즐겨찾기