概述目标:以逻辑复制实现读写分离或数据下游同步,并用RLS隔离多租户访问,确保一致性与安全合规。适用:交易主库→报表库同步、多区域数据复制、SaaS多租户隔离访问。核心与实战开启逻辑复制(主库):-- pg_hba.conf 与 postgresql.conf 需允许逻辑复制(wal_level=logical)
ALTER SYSTEM SET wal_level = logical;
SELECT pg_reload_conf();
CREATE PUBLICATION pub_orders FOR TABLE public.orders, public.users;
订阅(从库):CREATE SUBSCRIPTION sub_orders CONNECTION 'host=primary dbname=app user=replicator password=secret' PUBLICATION pub_orders WITH (copy_data = true);
RLS多租户隔离:ALTER TABLE public.orders ENABLE ROW LEVEL SECURITY;
ALTER TABLE public.users ENABLE ROW LEVEL SECURITY;
-- 会话设定当前租户
SET app.tenant_id = '11111111-1111-1111-1111-111111111111';
-- 策略:仅允许访问自身租户数据
CREATE POLICY orders_tenant_isolation ON public.orders
USING (tenant_id = current_setting('app.tenant_id')::uuid)
WITH CHECK (tenant_id = current_setting('app.tenant_id')::uuid);
CREATE POLICY users_tenant_isolation ON public.users
USING (tenant_id = current_setting('app.tenant_id')::uuid)
WITH CHECK (tenant_id = current_setting('app.tenant_id')::uuid);
示例验证RLS隔离:SET app.tenant_id = '22222222-2222-2222-2222-222222222222';
SELECT COUNT(*) FROM public.orders; -- 仅返回该租户记录计数
复制状态与延迟:SELECT * FROM pg_stat_replication; -- 主库查看同步状态
SELECT * FROM pg_stat_subscription; -- 从库查看订阅状态
SELECT * FROM pg_publication_tables; -- 发布的表列表
DDL变更治理:ALTER PUBLICATION pub_orders ADD TABLE public.invoices;
验证与监控逻辑复制槽与WAL:SELECT * FROM pg_replication_slots;
SELECT pg_size_pretty(pg_current_wal_lsn()::text::pg_lsn - restart_lsn) AS wal_pending FROM pg_replication_slots;
RLS生效性:SELECT relrowsecurity, relforcerowsecurity FROM pg_class WHERE relname='orders';
-- relrowsecurity=t 表示启用;如需强制超类也受RLS,设置 relforcerowsecurity
连接与延迟:SELECT * FROM pg_stat_activity WHERE application_name LIKE 'sub_orders%';
常见误区忽视DDL同步,新增表未加入publication导致数据缺失;需变更时维护publication。RLS依赖会话变量,超级用户或绕过策略可能泄露数据;生产环境需最小权限与避免绕过。未清理复制槽导致WAL积压占满磁盘;需监控并定期清理不再使用的订阅。结语结合逻辑复制与RLS可实现安全的多租户治理与读写解耦,通过系统视图与复制槽监控保障可用与一致性。

发表评论 取消回复