Forum Discussion

manoj_0911's avatar
manoj_0911
Icon for Kudo Commander rankKudo Commander
1 month ago
Solved

Best Practices for On-premises Data Gateway with Snowflake (Network Policy) and Power BI Fabric

Enterprise Best Practices for On-premises Data Gateway with Snowflake (Network Policy) and Power BI Fabric

Hi Community,

We're designing a production Power BI environment and would appreciate recommendations from Microsoft MVPs or anyone who has implemented a similar architecture in production.

Current Architecture

  • Power BI Tenant: our company

  • Microsoft Fabric Capacity: Planning to use F8

  • Data Source: Snowflake

  • Storage Mode: Import

  • Scheduled Refresh: Every 2 hours

  • Semantic Models: 30 production models

  • Report Users: 50+ (approximately 10 concurrent users)

  • External Users: Customer users access reports using Microsoft Entra B2B Guest accounts

Snowflake Connectivity

Our Snowflake account is protected by a Snowflake Network Policy, so direct connectivity from the Power BI Service is not allowed.

Because of this, we are using the On-premises Data Gateway (standard mode) for scheduled refreshes.

Currently, the gateway is used only for Import mode scheduled refreshes, but we may introduce DirectQuery reports against Snowflake in the future.

Questions

  1. For this production architecture, would you recommend a single gateway server or a gateway cluster with multiple gateway servers?

  2. If multiple gateways are recommended, what is the minimum number of gateway servers you would deploy for a production environment, and why?

  3. How does Power BI distribute scheduled refresh requests across a gateway cluster? Is it primarily for high availability, load balancing, or both?

  4. If one gateway server becomes unavailable during a scheduled refresh, does Power BI automatically fail over to another gateway in the cluster?

  5. Are there any Microsoft recommendations or best practices regarding:

    • Gateway server sizing (CPU, Memory)

    • Dedicated gateway servers vs shared servers

    • Service accounts

    • Monitoring gateway health

    • Gateway updates and maintenance

  6. If we later introduce DirectQuery reports against Snowflake, would your gateway architecture recommendation change?

  7. Has anyone implemented a similar production environment (Snowflake + Power BI + Enterprise Gateway + Microsoft Fabric)? If so, what operational challenges or lessons learned would you share?

We're looking for Microsoft's recommended enterprise architecture and real-world production experience before finalizing our gateway design.

Thank you!

  • Hi manoj_0911​,

    For the production setup you described, I would use a gateway cluster rather than a single gateway server.

    Microsoft specifically recommends gateway clusters for business-critical workloads because they remove the gateway VM as a single point of failure and also give you additional capacity when several refreshes or queries run concurrently.

    For production I would normally start with two gateway members on separate VMs. That gives you basic high availability while keeping the design manageable. I would then size and scale from actual gateway telemetry rather than trying to derive VM size purely from the number of semantic models.

    For your questions specifically:

    1. Single server or cluster?
      I would use a cluster. With around 30 production models and scheduled refresh every two hours, a single server would make the entire refresh path dependent on one VM.
    2. Minimum number of nodes?
      Two is the practical minimum for high availability. If workload grows, additional members can be added to the same cluster. Microsoft supports up to 10 members per cluster.
    3. How is work distributed?
      The gateway cluster can distribute requests between members. It is not just passive disaster recovery. Microsoft documents both high availability and load balancing for gateway clusters.
    4. What happens if one gateway goes down?
      Requests can be routed to another available member in the cluster. That is one of the main reasons I would not deploy production on a single node.

    For sizing, I would treat Microsoft’s published figures as a starting point rather than a target. Their gateway sizing guidance suggests starting with at least 8 CPU cores and 8 GB RAM, then monitoring CPU, memory, disk and concurrency under your actual refresh workload.

    Import and DirectQuery also stress the gateway differently. Import refreshes tend to be more memory-heavy, while DirectQuery tends to be more CPU-sensitive. So if DirectQuery is introduced later, I would reassess the gateway rather than assuming the current Import sizing will still be sufficient.

    For the servers themselves, I would keep both nodes as identical as possible: same gateway version, Snowflake driver/connector configuration, network path and security rules. I would also keep the gateway machines dedicated rather than colocating unrelated application workloads on them.

    On the Windows service identity, I would not change the default gateway service account unless you have a specific requirement. The gateway service account is separate from the credentials used to authenticate to Snowflake, so changing that Windows account does not by itself improve Snowflake authentication.

    For maintenance, I would update cluster members one at a time. Microsoft’s current gateway update guidance recommends disabling one member, allowing active work to drain, updating it, re-enabling it, then repeating the process on the next node. That lets the other member continue serving requests while maintenance is taking place.

    The Snowflake network policy is also an important part of the design. I would make sure every gateway node has a predictable outbound network identity that Snowflake permits. Once you add a second node, it needs the same permitted route to Snowflake as the first one.

    If you later introduce DirectQuery, I would be more conservative with sizing and monitoring because report interaction will now depend on the gateway path in real time. I would watch gateway CPU, query concurrency and Snowflake/network latency closely before putting large DirectQuery workloads through the same cluster.

    For the environment you described, my starting architecture would therefore be:

    Power BI / Fabric → 2-node production gateway cluster → Snowflake

    with a separate non-production gateway or cluster if dev/test workloads are significant enough to interfere with production.

    I would start there, monitor it under your real two-hour refresh cycle, and only add nodes once the telemetry tells you where the pressure actually is.

    AI-assisted drafting: AI was used to help structure and phrase this response. I reviewed and validated the technical content before posting.

6 Replies

  • Hi manoj_0911 ,

     

    Here are my findings with my exp. 

     

    Introducing DirectQuery against Snowflake would not significantly change the overall gateway architecture, but it does increase the importance of operational monitoring and performance management. Gateway clusters are effective for load balancing and scalability, and I have successfully implemented clustered Enterprise Gateways across multiple regions/data centers (for example, East US and East US 2) to improve resiliency.

    A key lesson learned is that gateway clustering provides load distribution, but not seamless failover in all scenarios. If a gateway node becomes unhealthy, requests may continue to be routed to that node until administrators disable or remove it from the cluster. For this reason, proactive monitoring, alerting, and documented operational procedures are critical.

    In a production environment using:

    • Snowflake
    • Power BI / Microsoft Fabric
    • Enterprise Data Gateway clusters
    • Azure infrastructure
    • SSO-enabled connectivity

    we supported approximately:

    • 60% DirectQuery
    • 40% Import
    • 500+ data source connections

    using a two-node dedicated gateway cluster. Despite the large scale, gateway performance remained stable due to proper sizing, workload distribution, and continuous monitoring.

    Key Recommendations

    • Deploy a minimum of two gateway nodes in a cluster.
    • Use dedicated gateway VMs rather than shared infrastructure.
    • Implement active monitoring and alerting for gateway health and performance.
    • Establish clear procedures for disabling unhealthy nodes during outages.
    • Optimize Snowflake performance before scaling gateway resources.
    • Prefer Direct Lake for Fabric-native workloads where possible.
    • Use Import mode for heavily consumed datasets when latency requirements allow.
    • Reserve DirectQuery for near real-time reporting or extremely large datasets.

    This approach has proven successful in large-scale enterprise environments, delivering reliable performance and manageable operational overhead while supporting hundreds of data sources and mixed Import/DirectQuery workloads.

  • ShahRukhSameer's avatar
    ShahRukhSameer
    Icon for Continued Contributor rankContinued Contributor

    Hi,

     

    For your scenario, I would recommend going with a gateway cluster instead of a single gateway server. With 30 production semantic models and scheduled refreshes every couple of hours, a single gateway becomes a potential single point of failure.

     

    A 2-node gateway cluster is usually a good starting point. The main benefit is high availability — if one gateway node is unavailable, Power BI can use the other node in the cluster for refresh operations.

     

    Since you are currently using Import mode, I would focus more on reliability and refresh stability rather than adding too many gateway servers upfront. Keep the gateway machines dedicated, monitor refresh failures and resource usage, and scale only if you see bottlenecks.

     

    If you later move to DirectQuery with Snowflake, I would revisit the design because the gateway will then become part of the live query path and concurrency/performance considerations will be different.

     

    For the current architecture, I would start with a 2-node cluster and grow from there based on actual workload.

  • ShivekMaharaj's avatar
    ShivekMaharaj
    Icon for Memorable Member rankMemorable Member

    Hi manoj_0911​,

    For the production setup you described, I would use a gateway cluster rather than a single gateway server.

    Microsoft specifically recommends gateway clusters for business-critical workloads because they remove the gateway VM as a single point of failure and also give you additional capacity when several refreshes or queries run concurrently.

    For production I would normally start with two gateway members on separate VMs. That gives you basic high availability while keeping the design manageable. I would then size and scale from actual gateway telemetry rather than trying to derive VM size purely from the number of semantic models.

    For your questions specifically:

    1. Single server or cluster?
      I would use a cluster. With around 30 production models and scheduled refresh every two hours, a single server would make the entire refresh path dependent on one VM.
    2. Minimum number of nodes?
      Two is the practical minimum for high availability. If workload grows, additional members can be added to the same cluster. Microsoft supports up to 10 members per cluster.
    3. How is work distributed?
      The gateway cluster can distribute requests between members. It is not just passive disaster recovery. Microsoft documents both high availability and load balancing for gateway clusters.
    4. What happens if one gateway goes down?
      Requests can be routed to another available member in the cluster. That is one of the main reasons I would not deploy production on a single node.

    For sizing, I would treat Microsoft’s published figures as a starting point rather than a target. Their gateway sizing guidance suggests starting with at least 8 CPU cores and 8 GB RAM, then monitoring CPU, memory, disk and concurrency under your actual refresh workload.

    Import and DirectQuery also stress the gateway differently. Import refreshes tend to be more memory-heavy, while DirectQuery tends to be more CPU-sensitive. So if DirectQuery is introduced later, I would reassess the gateway rather than assuming the current Import sizing will still be sufficient.

    For the servers themselves, I would keep both nodes as identical as possible: same gateway version, Snowflake driver/connector configuration, network path and security rules. I would also keep the gateway machines dedicated rather than colocating unrelated application workloads on them.

    On the Windows service identity, I would not change the default gateway service account unless you have a specific requirement. The gateway service account is separate from the credentials used to authenticate to Snowflake, so changing that Windows account does not by itself improve Snowflake authentication.

    For maintenance, I would update cluster members one at a time. Microsoft’s current gateway update guidance recommends disabling one member, allowing active work to drain, updating it, re-enabling it, then repeating the process on the next node. That lets the other member continue serving requests while maintenance is taking place.

    The Snowflake network policy is also an important part of the design. I would make sure every gateway node has a predictable outbound network identity that Snowflake permits. Once you add a second node, it needs the same permitted route to Snowflake as the first one.

    If you later introduce DirectQuery, I would be more conservative with sizing and monitoring because report interaction will now depend on the gateway path in real time. I would watch gateway CPU, query concurrency and Snowflake/network latency closely before putting large DirectQuery workloads through the same cluster.

    For the environment you described, my starting architecture would therefore be:

    Power BI / Fabric → 2-node production gateway cluster → Snowflake

    with a separate non-production gateway or cluster if dev/test workloads are significant enough to interfere with production.

    I would start there, monitor it under your real two-hour refresh cycle, and only add nodes once the telemetry tells you where the pressure actually is.

    AI-assisted drafting: AI was used to help structure and phrase this response. I reviewed and validated the technical content before posting.

  • Kagiyama_yutaka's avatar
    Kagiyama_yutaka
    Icon for Continued Contributor rankContinued Contributor

    The gateway can run as a cluster only when all nodes share the same recovery key, and each node has to be on a supported version and able to reach Snowflake through the allowed network path.
    Recovery key is what keeps the cluster consistent, so keeping it stored safely and using it when adding nodes is what keeps production stable. Safe operation is checking refresh logs, checking each node’s network path to Snowflake, and keeping the gateway updated.

  • manoj_0911 The two-node starting point you've been given is sound and I'd build the same thing. One correction on your question 3 though, because it changes what you get for the second VM.

     

    A gateway cluster does not spread work across its members by default. Microsoft's page on gateway high availability and load balancing is unambiguous on this one: "All requests are routed to the primary instance of a gateway cluster. If the primary gateway instance isn't online, the request is routed to another gateway instance in the cluster." Out of the box a cluster is failover, full stop. Distributing requests is a separate setting and "Distribute requests across all active gateways in this cluster" that you turn on under Manage connections and gateways, and until you do, node two is an expensive standby.

     

    That matters for you specifically rather than in general. Thirty models refreshing every two hours is a real concurrency profile, and if you stand the cluster up and assume it's balancing, you'll be pushing all of it through one machine while looking at a monitoring graph on the other one that stays flat and reading that as headroom. Turn the setting on deliberately and verify it, don't assume the cluster did it for you. In fairness to the docs, that page is a bit muddled about which algorithm applies when it describes the disabled state as round-robin in one sentence while stating plainly elsewhere that everything goes to the primary. The setting is the part I'd trust and act on; the algorithm underneath it is not worth planning around.

     

    Second thing, and it comes straight out of your own constraint rather than from general advice. The only reason you're running a gateway at all is the Snowflake network policy. That policy allows egress IPs, and a cluster has one per node. Add the second node without adding its IP and you get failures that look random and intermittent, because they aren't random at all, they're every request that happened to land on the node Snowflake doesn't know about. Worth putting both IPs in the policy before the second node ever takes traffic, and worth writing down somewhere that adding a node means editing the policy, because it's exactly the kind of step that gets skipped at 2am eighteen months from now.

     

    Third, on limits, since you asked about monitoring. Concurrency throttling on the gateway is enabled by default, while the CPU and memory thresholds both default to 0, which means disabled. So the first ceiling you meet in production is the concurrency one, not the sizing one, and it announces itself with its own message rather than as a generic refresh failure and the wording is "the gateway you selected can't establish data source connections because it's exceeded the concurrency limit set by your gateway admin". Knowing that string in advance saves you a couple of hours of blaming Snowflake the first time it appears.

     

    Last one is free and isn't about hardware at all: with thirty models on a two-hour cycle, check they aren't all scheduled on the hour. Staggering them across the window costs nothing and does more for refresh reliability than the second node will.

     

    Are both node IPs going into the Snowflake network policy, or is the plan to add the second one later?

  • v-achippa's avatar
    v-achippa
    Icon for Community Support rankCommunity Support

    Hi manoj_0911,

     

    Thank you for reaching out to Microsoft Fabric Community.

     

    Thank you ShahRukhSameerShivekMaharajKagiyama_yutaka and PauReis for the prompt response.

     

    As we haven’t heard back from you, we wanted to kindly follow up to check if the solution provided by the user's for the issue worked?  or let us know if you need any further assistance.

     

    Thanks and regards,

    Anjan Kumar Chippa