개발계에서 export 한 플로우를 운영계에 올리면 DBCP 풀을 비롯한 컨트롤러 서비스가 DISABLED 상태로 들어온다. 이를 모른 채 프로세서를 시작하면 "시작은 됐는데 FlowFile 을 안 집어간다" 는 상태가 된다. DB 프로세스 그룹의 Controller Services 목록에서 Enable All 로 한 번에 켠다.
에러 메시지에 찍힌 컨트롤러 서비스 ID 로 배포용 JSON 을 검색하면 안 나온다. 그 ID 는 운영 NiFi 인스턴스의 런타임 ID 이고 JSON 의 설계 시점 identifier 와는 값이 다르기 때문이다. JSON 에서는 이름과 참조 관계로 어떤 서비스인지 특정해야 한다.
ExecuteScript 의 Groovy 코드가 FlowFile 속성에서 UUID 를 읽어 그 ID 로 컨트롤러 서비스를 조회하는 구조라면, 그 풀이 꺼져 있을 때 스크립트 안에서 에러가 난다. 이 경우도 원인은 같다.
Enable 이 안 되고 invalid 로 남는다면 URL · 드라이버 경로 · 계정을 확인한다.
PutHDFS 등의 설정 파일을 고친 경우에는 그 프로세서와 관련 컨트롤러 서비스(KerberosUserService 등) 를 중지했다가 다시 시작해야 새 설정을 다시 읽는다. config 는 프로세서 시작 시점에 로딩된다.
개발은 원천 DB 가 한 대인데 운영은 세 대인 경우가 있다. 세 대가 서로 복제본이라 아무 데나 읽으면 되는 상황이라면 컨트롤러 서비스를 세 개로 늘리지 말고 멀티호스트 URL 하나로 처리한다. 그러면 환경 차이가 컨트롤러 구조가 아니라 파라미터 값 하나로만 남는다.
MySQL Connector/J 에는 jdbc:mysql:sequential:// 같은 스킴 키워드가 없다. 그것은 MariaDB 전용이다. MySQL 에서는 호스트를 콤마로 나열하는 것 자체가 순차 페일오버다. 드라이버는 항상 맨 앞 호스트에 먼저 붙고 통신 문제가 생기면 다음 호스트로 넘어간다.
jdbc:mysql://host1:1690,host2:1731,host3:1731/OSMDB?useUnicode=true&characterEncoding=UTF-8
MariaDB 드라이버라면 스킴에 모드를 적는다.
jdbc:mariadb:sequential://host1,host2,host3/DB?options 순차 페일오버
jdbc:mariadb:loadbalance://host1,host2,host3/DB?options 읽기 분산
배치성 단순 수집이면 페일오버가 무난하고, 읽기를 세 대에 흩고 싶을 때 loadbalance 를 쓴다. 정확한 키워드는 쓰는 드라이버 버전 기준으로 확인한다.
호스트와 IP 는 URL 에 직접 박지 말고 파라미터 컨텍스트(#{jdbc_url_...}) 로 관리한다. 그래야 같은 플로우를 환경별로 값만 바꿔 배포할 수 있다.