RHEL 8.8 에 PGDG 저장소로 PostgreSQL 16 을 설치하면서 실제로 막힌 두 지점(PGDG 최신 repo RPM 이 16 저장소를 비활성 상태로 넣는 것, AppStream 의 postgresql 모듈이 PGDG 패키지를 필터링하는 것) 과, Cloudera Manager · Hue · Hive Metastore · Oozie · Ranger 용 DB 와 계정을 만드는 SQL 을 정리한다.
dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm
# 최근 pgdg-redhat-repo-latest 는 최신 메이저(18)만 활성이고 16·17 은 disabled 로 들어온다
dnf repolist --all | grep pgdg
dnf config-manager --set-enabled pgdg16
# AppStream 의 postgresql 모듈이 켜져 있으면 "All matches were filtered out by modular filtering" 로 설치가 막힌다
dnf -qy module disable postgresql
dnf module list postgresql # [e] 표시가 없어야 한다. 남아 있으면 dnf module reset postgresql
dnf clean all && dnf makecache
dnf install -y postgresql16-server postgresql16-contrib
/usr/pgsql-16/bin/postgresql-16-setup initdb
systemctl enable --now postgresql-16
sudo -u postgres psql -c "SELECT version();"
"This system is not registered with an entitlement server" 경고는 PGDG 설치와 무관하다. 다만 BaseOS/AppStream 미러가 없으면 libicu, lz4-libs 같은 의존성 해결에 실패할 수 있다. 사내 postgresql-16 이라는 별도 저장소가 함께 잡혀 있으면 모듈 메타데이터 충돌을 피하기 위해 비활성화한다.
바이너리는 /usr/pgsql-16/bin/, 데이터는 /var/lib/pgsql/16/data/ 다. 한국어 로케일로 초기화하려면 PGSETUP_INITDB_OPTIONS="--encoding=UTF8 --locale=ko_KR.UTF-8" 을 앞에 둔다.
ALTER ROLE postgres WITH PASSWORD '${PASSWORD}';
postgresql.conf 에 password_encryption = scram-sha-256, listen_addresses = '*' 를 두고 pg_hba.conf 의 ident/peer 를 scram-sha-256 으로 바꾼다. 방화벽은 firewall-cmd --permanent --add-service=postgresql. SELinux 는 표준 경로 · 포트면 추가 작업이 없고, 비표준 포트는 semanage port -a -t postgresql_port_t -p tcp <port>, 비표준 데이터 경로는 semanage fcontext -a -t postgresql_db_t "<path>(/.*)?" 후 restorecon -Rv 한다.
MySQL 의 create database ... utf8_general_ci + grant all on db.* to user@'%' 를 PostgreSQL 로 옮길 때 달라지는 점은 네 가지다. @'%' 호스트 매칭은 pg_hba.conf 가 대신하고, case-insensitive 콜레이션은 표준에 없으며(Cloudera 메타데이터 DB 에 필수는 아니다), Cloudera 서비스는 자기 DB 의 OWNER 를 요구하고, flush privileges 는 없다.
CREATE USER scm WITH LOGIN ENCRYPTED PASSWORD :'pw';
CREATE USER rman WITH LOGIN ENCRYPTED PASSWORD :'pw';
CREATE USER hue WITH LOGIN ENCRYPTED PASSWORD :'pw';
CREATE USER hive WITH LOGIN ENCRYPTED PASSWORD :'pw';
CREATE USER oozie WITH LOGIN ENCRYPTED PASSWORD :'pw';
CREATE USER rangeradmin WITH LOGIN ENCRYPTED PASSWORD :'pw';
CREATE USER rangerkms WITH LOGIN ENCRYPTED PASSWORD :'pw';
-- LC_COLLATE 를 명시할 때는 TEMPLATE template0 이 필수
CREATE DATABASE scm WITH OWNER = scm ENCODING = 'UTF8' LC_COLLATE = 'en_US.UTF-8' LC_CTYPE = 'en_US.UTF-8' TEMPLATE = template0;
CREATE DATABASE rman WITH OWNER = rman ENCODING = 'UTF8' LC_COLLATE = 'en_US.UTF-8' LC_CTYPE = 'en_US.UTF-8' TEMPLATE = template0;
CREATE DATABASE hue WITH OWNER = hue ENCODING = 'UTF8' LC_COLLATE = 'en_US.UTF-8' LC_CTYPE = 'en_US.UTF-8' TEMPLATE = template0;
CREATE DATABASE metastore WITH OWNER = hive ENCODING = 'UTF8' LC_COLLATE = 'en_US.UTF-8' LC_CTYPE = 'en_US.UTF-8' TEMPLATE = template0;
CREATE DATABASE oozie WITH OWNER = oozie ENCODING = 'UTF8' LC_COLLATE = 'en_US.UTF-8' LC_CTYPE = 'en_US.UTF-8' TEMPLATE = template0;
CREATE DATABASE ranger WITH OWNER = rangeradmin ENCODING = 'UTF8' LC_COLLATE = 'en_US.UTF-8' LC_CTYPE = 'en_US.UTF-8' TEMPLATE = template0;
CREATE DATABASE rangerkms WITH OWNER = rangerkms ENCODING = 'UTF8' LC_COLLATE = 'en_US.UTF-8' LC_CTYPE = 'en_US.UTF-8' TEMPLATE = template0;
GRANT ALL PRIVILEGES ON DATABASE scm TO scm;
GRANT ALL PRIVILEGES ON DATABASE rman TO rman;
GRANT ALL PRIVILEGES ON DATABASE hue TO hue;
GRANT ALL PRIVILEGES ON DATABASE metastore TO hive;
GRANT ALL PRIVILEGES ON DATABASE oozie TO oozie;
GRANT ALL PRIVILEGES ON DATABASE ranger TO rangeradmin;
GRANT ALL PRIVILEGES ON DATABASE rangerkms TO rangerkms;
-- Hive Metastore 권장
ALTER DATABASE metastore SET standard_conforming_strings = off;
비밀번호를 파일에 적지 않으려면 psql -v 변수로 넘긴다.
read -rs -p "DB user password: " DB_USER_PASSWORD; echo
sudo -u postgres psql -v pw="$DB_USER_PASSWORD" -f /tmp/cdp-init.sql
unset DB_USER_PASSWORD
pg_hba.conf 에는 클러스터 노드 대역만 허용한다.
host scm scm <CDP_NODES_CIDR> scram-sha-256
host rman rman <CDP_NODES_CIDR> scram-sha-256
host hue hue <CDP_NODES_CIDR> scram-sha-256
host metastore hive <CDP_NODES_CIDR> scram-sha-256
host oozie oozie <CDP_NODES_CIDR> scram-sha-256
host ranger rangeradmin <CDP_NODES_CIDR> scram-sha-256
host rangerkms rangerkms <CDP_NODES_CIDR> scram-sha-256
Cloudera 쪽에서는 PostgreSQL JDBC 드라이버(postgresql-42.x.jar) 배치, Hue 용 psycopg2 설치가 따로 필요하다. Ranger 는 일부 버전에서 setup.sh 가 SUPERUSER/CREATEDB 를 잠시 요구하므로 설치 후 ALTER USER rangeradmin NOSUPERUSER NOCREATEDB; 로 회수한다.