{"id":9745,"date":"2017-01-31T21:56:49","date_gmt":"2017-01-31T20:56:49","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/introducing-high-availability-and-multi-subnet-scenarios-with-sql-server-on-linux\/"},"modified":"2023-07-18T07:38:04","modified_gmt":"2023-07-18T05:38:04","slug":"introducing-high-availability-and-multi-subnet-scenarios-with-sql-server-on-linux","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/introducing-high-availability-and-multi-subnet-scenarios-with-sql-server-on-linux\/","title":{"rendered":"Introducing high-availability and multi-subnet scenarios with SQL Server on Linux"},"content":{"rendered":"<p><span style=\"color: #000000; font-family: Calibri;\">On my first <\/span><a href=\"http:\/\/dbi-services.com\/blog\/introducing-high-availability-with-sql-server-on-linux\/\" target=\"_blank\" rel=\"noopener noreferrer\"><span style=\"color: #0563c1; font-family: Calibri;\">blog<\/span><\/a><span style=\"font-family: Calibri;\"><span style=\"color: #000000;\"> about SQL Server on Linux, I introduced the <\/span>new<span style=\"color: #000000;\"> high availability feature which concerns only SQL Server failover cluster instances so far. During this discovery time, I had the support of Mihaela Blendea (<a class=\"ProfileHeaderCard-screennameLink u-linkComplex js-nav\" href=\"https:\/\/twitter.com\/MihaelaBlendea\" target=\"_blank\" rel=\"noopener noreferrer\"><span style=\"color: #0084b4;\">@<span class=\"u-linkComplex-target\">MihaelaBlendea<\/span><\/span><\/a>)\u00a0at <\/span>Microsoft <span style=\"color: #000000;\">to clarify some architecture aspects about this new kind of<\/span> <span style=\"color: #000000;\">architecture. Firstly, I would like to thank her. <\/span>It\u2019s <span style=\"color: #000000;\">always a big pleasure to get the availability of the Microsoft team in this case. But after achieving the installation of my SQL Server FCI environment on Linux, I was interested in performing the same in a more complex scenario like multi-subnets failover clusters as I may <\/span>notice <span style=\"color: #000000;\">at some customer shops. The installation process will surely change over the time and it is not intended as an official documentation of course. This is only an exercise which is part of my Linux immersion experience.<\/span><\/span><\/p>\n<p><span style=\"color: #000000; font-family: Calibri;\">So I decided to evolve my current architecture (two clusters nodes with PaceMaker on the same subnet) by introducing a third one on a different subnet. Here a picture of the architecture I wanted to install.<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-14649 size-full\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/blog-115-1-sqlfci-multisubnet-architecture-e1485901442194.jpg\" alt=\"blog 115 - 1 - sqlfci multisubnet architecture\" width=\"700\" height=\"515\" \/><\/p>\n<p>So basically, referring to my previous architecture, the task to perform was as follows:<\/p>\n<ul>\n<li>Make the initial heartbeat configuration redundant. Even if nowadays having redundant network paths is mostly handled by modern infrastructures and virtualization layers as well, I still believe it is always a best practice to make the heartbeat redundant at the cluster level in order to avoid unexpected behaviors like split brains (for instance with two nodes in this case). I will have the opportunity to talk about quorum stuff in a next post.<\/li>\n<li>Introduce a third node on a different subnet to the existing architecture and then adding it to the cluster. You may follow the <a href=\"https:\/\/docs.microsoft.com\/en-us\/sql\/linux\/sql-server-linux-shared-disk-cluster-red-hat-7-operate\">Microsoft documentation<\/a> to perform this task. The main challenge here was to add the third node in the context of multi-subnet scenario and to ensure the communication path is working well between cluster nodes for both networks (public and private).<\/li>\n<li>Find a way to make the existing SQL Server FCI resource multi-subnet compliant. I mean to get the same kind of behavior we may have with WSFC on Windows when the resource fails over nodes on different subnets. In this case, we have to configure an OR based resource dependency which includes second virtual address IP.<\/li>\n<li>Check if applications are able to connect in the context of multi-subnet failover event.<\/li>\n<\/ul>\n<p>You may notice that I didn\u2019t introduce redundancy at the storage layer. Indeed, the NFS server becomes the SPOF but I didn\u2019t want to make my architecture more complex at all for the moment. In a more realistic scenario at customer shops, this aspect would be probably covered by other storage vendor solutions.<\/p>\n<p>So let\u2019s begin by the heartbeat configuration. According to my existing infrastructure, only one ring was configured and ran on the top of my eth0 interfaces on both nodes ((respectively 192.168.5.17 for the linux01 node and 192.168.5.18 for the linux02 node).<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\"> [mikedavem@linux01 ~]$ sudo pcs cluster corosync\n\u2026\nnodelist {\n    node {\n        ring0_addr: linux01.dbi-services.test\n        nodeid: 1\n    }\n\n    node {\n        ring0_addr: linux02.dbi-services.test\n        nodeid: 2\n    }\n}\n\u2026<\/pre>\n<p>So I added one another network interface (eth1) on each cluster node with a different subnet (192.168.20.0). Those interfaces will be dedicated on running the second Corosync link (ring 2).<\/p>\n<ul>\n<li>Linux01<\/li>\n<\/ul>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">[mikedavem@linux01 ~]$ ip addr show eth1\neth1: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu 1500 qdisc mq state UP qlen 1000\n    link\/ether 00:15:5d:00:2b:d4 brd ff:ff:ff:ff:ff:ff\n    inet 192.168.20.17\/24 brd 192.168.20.255 scope global eth1\n       valid_lft forever preferred_lft forever\n    inet6 fe80::215:5dff:fe00:2bd4\/64 scope link\n       valid_lft forever preferred_lft forever<\/pre>\n<ul>\n<li>Linux02<\/li>\n<\/ul>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">[mikedavem@linux01 ~]$ sudo ssh linux02 ip addr show eth1\n\u2026\n3: eth1: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu 1500 qdisc mq state UP qlen 1000\n    link\/ether 00:15:5d:00:2b:d5 brd ff:ff:ff:ff:ff:ff\n    inet 192.168.20.18\/24 brd 192.168.20.255 scope global eth1\n       valid_lft forever preferred_lft forever\n    inet6 fe80::36d8:d6f9:1b7a:cebd\/64 scope link\n       valid_lft forever preferred_lft forever<\/pre>\n<p>At this point\u00a0I\u00a0binded each new IP address with\u00a0a corresponding hostname. We may either store the new configuration in the\u00a0\/etc\/hosts file or in the DNS server(s).<\/p>\n<p>Then I updated the Corosync.conf on both nodes by adding the new ring configuration as follows. The point here is that configuration changes are not synchronized automatically across nodes like Windows Failover clusters. To allow redundant ring protocol, I added the <em>rrp_mode<\/em> parameter to be active on both network interfaces (eth0 and eth1) and a new ring section for each node (<em>ring1_addr<\/em>).<\/p>\n<pre class=\"brush: shell; gutter: true; first-line: 1\">totem {\n    version: 2\n    secauth: off\n    cluster_name: linux_cluster\n    transport: udpu\n    rrp_mode: active\n}\nnodelist {\n    node {\n        ring0_addr: linux01.dbi-services.test\n        ring1_addr: linux01H2.dbi-services.test\n        nodeid: 1\n    }\n    node {\n        ring0_addr: linux02.dbi-services.test\n        ring1_addr: linux02H2.dbi-services.test\n        nodeid: 2\n    }\n}<\/pre>\n<p><span style=\"color: #000000; font-family: Calibri;\">After restarting the Corosync service on both nodes, I checked the new ring status on both nodes<\/span><\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\"> [mikedavem@linux01 ~]# sudo corosync-cfgtool -s\nPrinting ring status.\nLocal node ID 1\nRING ID 0\n        id      = 192.168.5.17\n        status  = ring 0 active with no faults\nRING ID 1\n        id      = 192.168.20.17\n        status  = Marking seqid 23 ringid 1 interface 192.168.20.17 FAULTY\n[root@linux01 ~]#\n [root@linux01 ~]# ssh linux02 corosync-cfgtool -s\nPrinting ring status.\nLocal node ID 2\nRING ID 0\n        id      = 192.168.5.18\n        status  = ring 0 active with no faults\nRING ID 1\n        id      = 192.168.20.18\n        status  = ring 1 active with no faults<\/pre>\n<p><span style=\"color: #000000; font-family: Calibri;\">At this point, my pacemaker cluster was able to use all the network interfaces to execute heartbeat.<\/span><\/p>\n<p><span style=\"color: #000000; font-family: Calibri;\">In the respect of the <\/span><a href=\"https:\/\/docs.microsoft.com\/en-us\/sql\/linux\/sql-server-linux-shared-disk-cluster-red-hat-7-operate\" target=\"_blank\" rel=\"noopener noreferrer\"><span style=\"color: #0563c1; font-family: Calibri;\">Microsoft documentation<\/span><\/a><span style=\"color: #000000; font-family: Calibri;\">, I added a new node LINUX03 with the same heartbeat configuration and the general Corosync configuration was updated as follows:<\/span><\/p>\n<pre class=\"brush: shell; gutter: true; first-line: 1\">[mikedavem@linux01 ~]# sudo pcs cluster node add linux03.dbi-services.test,linux03H2.dbi-services.testnodelist \n\u2026\n    node {\n        ring0_addr: linux01.dbi-services.test\n        ring1_addr: linux01H2.dbi-services.test\n        nodeid: 1\n    }\n    node {\n        ring0_addr: linux02.dbi-services.test\n        ring1_addr: linux02H2.dbi-services.test\n        nodeid: 2\n    }\n    node {\n        ring0_addr: linux03.dbi-services.test\n        ring1_addr: linux03H2.dbi-services.test\n        nodeid: 3\n    }\n}<\/pre>\n<p>Obviously, communication paths were done successfully after configuring correctly the routes between nodes on different subnets. Corresponding default gateways are already configured for eth0 interfaces but we have to add static routes for eth1 interfaces as shown below:<\/p>\n<ul>\n<li>LINUX01 and LINUX02 (eth0 &#8211; subnet 192.168.5.0 \u2013 default gateway 192.168.5.10 \/ eth1 &#8211; subnet 192.168.20.0 \u2013 static route to 192.168.30.0 subnet by using 192.168.20.10).<\/li>\n<\/ul>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">[mikedavem@linux01 ~]$ route -n\nKernel IP routing table\nDestination     Gateway         Genmask         Flags Metric Ref    Use Iface\n0.0.0.0         192.168.5.10    0.0.0.0         UG    0      0        0 eth0\n169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 eth0\n169.254.0.0     0.0.0.0         255.255.0.0     U     1003   0        0 eth1\n192.168.5.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0\n192.168.20.0    0.0.0.0         255.255.255.0   U     0      0        0 eth1\n192.168.30.0    192.168.20.10   255.255.255.0   UG    0      0        0 eth1<\/pre>\n<ul>\n<li>LINUX03 (eth0 &#8211; subnet 192.168.50.0 \u2013 default gateway 192.168.50.10 \/ eth1 &#8211; subnet 192.168.30.0 \u2013 static route to 192.168.20.0 subnet by using 192.168.30.10).<\/li>\n<\/ul>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">[mikedavem@linux03 ~]$ route -n\nKernel IP routing table\nDestination     Gateway         Genmask         Flags Metric Ref    Use Iface\n0.0.0.0         192.168.50.10   0.0.0.0         UG    0      0        0 eth0\n0.0.0.0         192.168.50.10   0.0.0.0         UG    100    0        0 eth0\n169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 eth0\n192.168.20.0    192.168.30.10   255.255.255.0   UG    100    0        0 eth1\n192.168.30.0    0.0.0.0         255.255.255.0   U     100    0        0 eth1\n192.168.50.0    0.0.0.0         255.255.255.0   U     100    0        0 eth0<\/pre>\n<p><span style=\"color: #000000; font-family: Calibri;\">Let\u2019s have a look at the cluster status:<\/span><\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">[root@linux01 ~]# pcs cluster status\nCluster Status:\n Stack: corosync\n Current DC: linux01.dbi-services.test (version 1.1.15-11.el7_3.2-e174ec8) - partition with quorum\n Last updated: Mon Jan 30 12:47:00 2017         Last change: Mon Jan 30 12:45:01 2017 by hacluster via crmd on linux01.dbi-services.test\n 3 nodes and 3 resources configured\n\nPCSD Status:\n  linux01.dbi-services.test: Online\n  linux03.dbi-services.test: Online\n  linux02.dbi-services.test: Online<\/pre>\n<p>To enable NFS share to be mounted from the new cluster node LINUX03 on the 192.168.50.0 subnet, we have to add the new configuration in the <em>\/etc\/exports<\/em> file and export it afterwards.<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">[root@nfs ~]# exportfs -rav\nexporting 192.168.5.0\/24:\/mnt\/sql_log_nfs\nexporting 192.168.5.0\/24:\/mnt\/sql_data_nfs\nexporting 192.168.50.0\/24:\/mnt\/sql_data_nfs\n\n[root@nfs ~]# showmount -e\nExport list for nfs.dbi-services.com:\n\/mnt\/sql_log_nfs  192.168.5.0\/24\n\/mnt\/sql_data_nfs 192.168.50.0\/24,192.168.5.0\/24<\/pre>\n<p>Well, after checking everything is ok from the cluster side, the next challenge was to find a way to configure the SQL Server FCI resource to be multi-subnet compliant. As stated by Microsoft, the SQL Server FCI is not as coupled with Pacemaker add-on as the Windows Failover Cluster. Based on my Windows Failover experience, I wondered if I had to go to the same way with the pacemaker cluster on Linux and I tried to find out a way to add a second VIP and then to include it as part of the OR dependency but I found nothing on this field. But Pacemaker offers concepts which include location \/ collocation and scores in order to behave on the resources during failover events. My intention is not to go into details trough the pacemaker documentation but by playing with the 3 concepts\u00a0I was able to\u00a0address our need. Again please feel free to comments if you have a better method to meet my requirement.<\/p>\n<p>Let\u2019s first add a second virtual IP address for the 192.168.50.0 subnet (<em>virtualipdr<\/em>) and then let\u2019s add a new dependency \/ colocation between for SQL Server resource (<em>sqllinuxfci<\/em>)<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">[mikedavem@linux01 ~]$sudo pcs cluster cib cfg\n[mikedavem@linux01 ~]$sudo pcs -f cfg resource create virtualipdr ocf:heartbeat:IPaddr2 ip=192.168.50.20\n[mikedavem@linux01 ~]$sudo pcs -f cfg constraint colocation add virtualipdr sqlinuxfci\n[mikedavem@linux01 ~]$sudo pcs cluster cib-push cfg\n[mikedavem@linux01 ~]$sudo pcs constraint location<\/pre>\n<p>Now to avoid starting <em>virtualip<\/em> or <em>virtualipdr<\/em> resources on the wrong subnet, let\u2019s configure an \u201copt-out\u201d scenario which includes symmetric cluster to allow resources to run everywhere and location constraints to avoid running a resource on a specified location \/ node.<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">[mikedavem@linux01 ~]$sudo pcs property set symmetric-cluster=true\n[mikedavem@linux01 ~]$pcs constraint location virtualipdr avoids linux01.dbi-services.test=-1\n[mikedavem@linux01 ~]$pcs constraint location virtualipdr avoids linux02.dbi-services.test=-1\n[mikedavem@linux01 ~]$pcs constraint location virtualip avoids linux03.dbi-services.test=-1<\/pre>\n<p><span style=\"color: #000000; font-family: Calibri;\">The new constraint\u00a0topology is as follows <\/span><\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">[mikedavem@linux01 ~]$ sudo pcs constraint\nLocation Constraints:\n  Resource: sqllinuxfci\n    Enabled on: linux01.dbi-services.test (score:INFINITY) (role: Started)\n  Resource: virtualip\n    Disabled on: linux03.dbi-services.test (score:-1)\n  Resource: virtualipdr\n    Disabled on: linux01.dbi-services.test (score:-1)\n    Disabled on: linux02.dbi-services.test (score:-1)\nOrdering Constraints:\nColocation Constraints:\n  FS with sqllinuxfci (score:INFINITY)\n  virtualip with sqllinuxfci (score:INFINITY)\n  virtualipdr with sqllinuxfci (score:INFINITY)\nTicket Constraints:<\/pre>\n<p>Let\u2019s have a look at the pacemaker status. At this point all SQL Server resources are running on the LINUX01 on the 192.168.5.0 subnet. We may notice the virtualipdr is in stopped state in this case.<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">[mikedavem@linux01 ~]$ sudo pcs status\nCluster name: linux_cluster\nStack: corosync\nCurrent DC: linux02.dbi-services.test (version 1.1.15-11.el7_3.2-e174ec8) - partition with quorum\nLast updated: Tue Jan 31 22:28:57 2017          Last change: Mon Jan 30 16:57:10 2017 by root via crm_resource on linux01.dbi-services.test\n\n3 nodes and 4 resources configured\n\nOnline: [ linux01.dbi-services.test linux02.dbi-services.test linux03.dbi-services.test ]\n\nFull list of resources:\n\n sqllinuxfci    (ocf::mssql:fci):       Started linux01.dbi-services.test\n FS     (ocf::heartbeat:Filesystem):    Started linux01.dbi-services.test\n virtualip      (ocf::heartbeat:IPaddr2):       Started linux01.dbi-services.test\n virtualipdr    (ocf::heartbeat:IPaddr2):       Stopped\n\nDaemon Status:\n  corosync: active\/enabled\n  pacemaker: active\/enabled\n  pcsd: active\/enabled<\/pre>\n<p><span style=\"color: #000000; font-family: Calibri;\">Go ahead and let\u2019s try to move the resources on the LINUX03 node \u2013 192.168.50.0 subnet<\/span><\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">[mikedavem@linux01 ~]$ sudo pcs resource move sqllinuxfci linux03.dbi-services.test<\/pre>\n<p><span style=\"color: #000000; font-family: Calibri;\">The new Pacemarker status becomes<\/span><\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1\">[mikedavem@linux01 ~]$ sudo pcs status\nCluster name: linux_cluster\nStack: corosync\nCurrent DC: linux02.dbi-services.test (version 1.1.15-11.el7_3.2-e174ec8) - partition with quorum\nLast updated: Tue Jan 31 22:33:21 2017          Last change: Tue Jan 31 22:32:53 2017 by root via crm_resource on linux01.dbi-services.test\n\n3 nodes and 4 resources configured\n\nOnline: [ linux01.dbi-services.test linux02.dbi-services.test linux03.dbi-services.test ]\n\nFull list of resources:\n\n sqllinuxfci    (ocf::mssql:fci):       Stopped\n FS     (ocf::heartbeat:Filesystem):    Started linux03.dbi-services.test\n virtualip      (ocf::heartbeat:IPaddr2):       Stopped\n virtualipdr    (ocf::heartbeat:IPaddr2):       Started linux03.dbi-services.test\n\nDaemon Status:\n  corosync: active\/enabled\n  pacemaker: active\/enabled\n  pcsd: active\/enabled<\/pre>\n<p>In turn, the virtualipdr brought online and virtualip brought offline as well because we are now located on the 192.168.50.0 subnet. Here we go!<\/p>\n<p>Ok at this point our SQL Server Failover Cluster Instance seems to behave as expected but how to deal with client connections in this case? If I refer to previous Windows Failover Cluster experiences, I may think about two scenarios by using DNS servers.<\/p>\n<ul>\n<li>We are able to use SqlClient \/ JAVA \/ ODBC support for HA with MultiSubnetFailover parameter on the connection string. In this case good news, we may simply put the both different addresses for the corresponding DNS record and the magic will operate by itself (similar to <a href=\"https:\/\/blogs.msdn.microsoft.com\/alwaysonpro\/2014\/06\/03\/connection-timeouts-in-multi-subnet-availability-group\/\" target=\"_blank\" rel=\"noopener noreferrer\">RegisterAllProvidersIP<\/a> property with availability groups). The client will reach out automatically the first available address and everything should be fine.<\/li>\n<li>We cannot modify or use the MultiSubnetFailover and in this case we may\u00a0setup the TTL value manually\u00a0for the corresponding DNS record (similar to\u00a0the <a href=\"https:\/\/blogs.msdn.microsoft.com\/alwaysonpro\/2014\/06\/03\/connection-timeouts-in-multi-subnet-availability-group\/\" target=\"_blank\" rel=\"noopener noreferrer\">HostRecordTTL<\/a> parameters with availability groups). We will experience timeout issues for the first connection attempt but the second one should work.<\/li>\n<li>Other scenarios?? Please feel free to comment<\/li>\n<\/ul>\n<p>In my lab environnement using SqlClient based connections seem to work well in\u00a0the aforementioned cases. I will perform further tests in a near feature and update this blog accordingly with the results.<\/p>\n<p>I\u2019m looking forward to see other improvements \/ features with the next SQL Server CTPs<\/p>\n<p>Happy clustering on Linux!<\/p>\n<p>By David Barbarin<\/p>\n","protected":false},"excerpt":{"rendered":"<p>On my first blog about SQL Server on Linux, I introduced the new high availability feature which concerns only SQL Server failover cluster instances so far. During this discovery time, I had the support of Mihaela Blendea (@MihaelaBlendea)\u00a0at Microsoft to clarify some architecture aspects about this new kind of architecture. Firstly, I would like to [&hellip;]<\/p>\n","protected":false},"author":26,"featured_media":9747,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[229],"tags":[38,1017,790,464,1027,84,73,1018,1019],"type_dbi":[],"class_list":["post-9745","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-database-administration-monitoring","tag-cluster","tag-corosync","tag-disaster-recovery","tag-failover-cluster","tag-heartbeat","tag-high-availability","tag-linux","tag-pacemaker","tag-sql-server-vnext"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.2 (Yoast SEO v27.2) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Introducing high-availability and multi-subnet scenarios with SQL Server on Linux<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.dbi-services.com\/blog\/introducing-high-availability-and-multi-subnet-scenarios-with-sql-server-on-linux\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Introducing high-availability and multi-subnet scenarios with SQL Server on Linux\" \/>\n<meta property=\"og:description\" content=\"On my first blog about SQL Server on Linux, I introduced the new high availability feature which concerns only SQL Server failover cluster instances so far. During this discovery time, I had the support of Mihaela Blendea (@MihaelaBlendea)\u00a0at Microsoft to clarify some architecture aspects about this new kind of architecture. Firstly, I would like to [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/introducing-high-availability-and-multi-subnet-scenarios-with-sql-server-on-linux\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2017-01-31T20:56:49+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-07-18T05:38:04+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/blog-115-1-sqlfci-multisubnet-architecture-e1485901442194-1.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"700\" \/>\n\t<meta property=\"og:image:height\" content=\"515\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Microsoft Team\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Microsoft Team\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/introducing-high-availability-and-multi-subnet-scenarios-with-sql-server-on-linux\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/introducing-high-availability-and-multi-subnet-scenarios-with-sql-server-on-linux\/\"},\"author\":{\"name\":\"Microsoft Team\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/bfab48333280d616e1170e7369df90a4\"},\"headline\":\"Introducing high-availability and multi-subnet scenarios with SQL Server on Linux\",\"datePublished\":\"2017-01-31T20:56:49+00:00\",\"dateModified\":\"2023-07-18T05:38:04+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/introducing-high-availability-and-multi-subnet-scenarios-with-sql-server-on-linux\/\"},\"wordCount\":1341,\"commentCount\":0,\"image\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/introducing-high-availability-and-multi-subnet-scenarios-with-sql-server-on-linux\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/blog-115-1-sqlfci-multisubnet-architecture-e1485901442194-1.jpg\",\"keywords\":[\"Cluster\",\"CoroSync\",\"disaster recovery\",\"Failover cluster\",\"heartbeat\",\"High availability\",\"Linux\",\"PaceMaker\",\"SQL Server vNext\"],\"articleSection\":[\"Database Administration &amp; Monitoring\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/introducing-high-availability-and-multi-subnet-scenarios-with-sql-server-on-linux\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/introducing-high-availability-and-multi-subnet-scenarios-with-sql-server-on-linux\/\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/introducing-high-availability-and-multi-subnet-scenarios-with-sql-server-on-linux\/\",\"name\":\"Introducing high-availability and multi-subnet scenarios with SQL Server on Linux\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/introducing-high-availability-and-multi-subnet-scenarios-with-sql-server-on-linux\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/introducing-high-availability-and-multi-subnet-scenarios-with-sql-server-on-linux\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/blog-115-1-sqlfci-multisubnet-architecture-e1485901442194-1.jpg\",\"datePublished\":\"2017-01-31T20:56:49+00:00\",\"dateModified\":\"2023-07-18T05:38:04+00:00\",\"author\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/bfab48333280d616e1170e7369df90a4\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/introducing-high-availability-and-multi-subnet-scenarios-with-sql-server-on-linux\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/introducing-high-availability-and-multi-subnet-scenarios-with-sql-server-on-linux\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/introducing-high-availability-and-multi-subnet-scenarios-with-sql-server-on-linux\/#primaryimage\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/blog-115-1-sqlfci-multisubnet-architecture-e1485901442194-1.jpg\",\"contentUrl\":\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/blog-115-1-sqlfci-multisubnet-architecture-e1485901442194-1.jpg\",\"width\":700,\"height\":515},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/introducing-high-availability-and-multi-subnet-scenarios-with-sql-server-on-linux\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/www.dbi-services.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Introducing high-availability and multi-subnet scenarios with SQL Server on Linux\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#website\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/\",\"name\":\"dbi Blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.dbi-services.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/bfab48333280d616e1170e7369df90a4\",\"name\":\"Microsoft Team\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/secure.gravatar.com\/avatar\/c44a1a792c059f24055763aa77d80a244467f6eef724a8bd13db8d4a350b7a4c?s=96&d=mm&r=g\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/c44a1a792c059f24055763aa77d80a244467f6eef724a8bd13db8d4a350b7a4c?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/c44a1a792c059f24055763aa77d80a244467f6eef724a8bd13db8d4a350b7a4c?s=96&d=mm&r=g\",\"caption\":\"Microsoft Team\"},\"url\":\"https:\/\/www.dbi-services.com\/blog\/author\/microsoft-team\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Introducing high-availability and multi-subnet scenarios with SQL Server on Linux","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.dbi-services.com\/blog\/introducing-high-availability-and-multi-subnet-scenarios-with-sql-server-on-linux\/","og_locale":"en_US","og_type":"article","og_title":"Introducing high-availability and multi-subnet scenarios with SQL Server on Linux","og_description":"On my first blog about SQL Server on Linux, I introduced the new high availability feature which concerns only SQL Server failover cluster instances so far. During this discovery time, I had the support of Mihaela Blendea (@MihaelaBlendea)\u00a0at Microsoft to clarify some architecture aspects about this new kind of architecture. Firstly, I would like to [&hellip;]","og_url":"https:\/\/www.dbi-services.com\/blog\/introducing-high-availability-and-multi-subnet-scenarios-with-sql-server-on-linux\/","og_site_name":"dbi Blog","article_published_time":"2017-01-31T20:56:49+00:00","article_modified_time":"2023-07-18T05:38:04+00:00","og_image":[{"width":700,"height":515,"url":"http:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/blog-115-1-sqlfci-multisubnet-architecture-e1485901442194-1.jpg","type":"image\/jpeg"}],"author":"Microsoft Team","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Microsoft Team","Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dbi-services.com\/blog\/introducing-high-availability-and-multi-subnet-scenarios-with-sql-server-on-linux\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/introducing-high-availability-and-multi-subnet-scenarios-with-sql-server-on-linux\/"},"author":{"name":"Microsoft Team","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/bfab48333280d616e1170e7369df90a4"},"headline":"Introducing high-availability and multi-subnet scenarios with SQL Server on Linux","datePublished":"2017-01-31T20:56:49+00:00","dateModified":"2023-07-18T05:38:04+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/introducing-high-availability-and-multi-subnet-scenarios-with-sql-server-on-linux\/"},"wordCount":1341,"commentCount":0,"image":{"@id":"https:\/\/www.dbi-services.com\/blog\/introducing-high-availability-and-multi-subnet-scenarios-with-sql-server-on-linux\/#primaryimage"},"thumbnailUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/blog-115-1-sqlfci-multisubnet-architecture-e1485901442194-1.jpg","keywords":["Cluster","CoroSync","disaster recovery","Failover cluster","heartbeat","High availability","Linux","PaceMaker","SQL Server vNext"],"articleSection":["Database Administration &amp; Monitoring"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/introducing-high-availability-and-multi-subnet-scenarios-with-sql-server-on-linux\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/introducing-high-availability-and-multi-subnet-scenarios-with-sql-server-on-linux\/","url":"https:\/\/www.dbi-services.com\/blog\/introducing-high-availability-and-multi-subnet-scenarios-with-sql-server-on-linux\/","name":"Introducing high-availability and multi-subnet scenarios with SQL Server on Linux","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/introducing-high-availability-and-multi-subnet-scenarios-with-sql-server-on-linux\/#primaryimage"},"image":{"@id":"https:\/\/www.dbi-services.com\/blog\/introducing-high-availability-and-multi-subnet-scenarios-with-sql-server-on-linux\/#primaryimage"},"thumbnailUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/blog-115-1-sqlfci-multisubnet-architecture-e1485901442194-1.jpg","datePublished":"2017-01-31T20:56:49+00:00","dateModified":"2023-07-18T05:38:04+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/bfab48333280d616e1170e7369df90a4"},"breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/introducing-high-availability-and-multi-subnet-scenarios-with-sql-server-on-linux\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/introducing-high-availability-and-multi-subnet-scenarios-with-sql-server-on-linux\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.dbi-services.com\/blog\/introducing-high-availability-and-multi-subnet-scenarios-with-sql-server-on-linux\/#primaryimage","url":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/blog-115-1-sqlfci-multisubnet-architecture-e1485901442194-1.jpg","contentUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/blog-115-1-sqlfci-multisubnet-architecture-e1485901442194-1.jpg","width":700,"height":515},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/introducing-high-availability-and-multi-subnet-scenarios-with-sql-server-on-linux\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Introducing high-availability and multi-subnet scenarios with SQL Server on Linux"}]},{"@type":"WebSite","@id":"https:\/\/www.dbi-services.com\/blog\/#website","url":"https:\/\/www.dbi-services.com\/blog\/","name":"dbi Blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.dbi-services.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/bfab48333280d616e1170e7369df90a4","name":"Microsoft Team","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/c44a1a792c059f24055763aa77d80a244467f6eef724a8bd13db8d4a350b7a4c?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/c44a1a792c059f24055763aa77d80a244467f6eef724a8bd13db8d4a350b7a4c?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/c44a1a792c059f24055763aa77d80a244467f6eef724a8bd13db8d4a350b7a4c?s=96&d=mm&r=g","caption":"Microsoft Team"},"url":"https:\/\/www.dbi-services.com\/blog\/author\/microsoft-team\/"}]}},"_links":{"self":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/9745","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/users\/26"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/comments?post=9745"}],"version-history":[{"count":1,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/9745\/revisions"}],"predecessor-version":[{"id":26799,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/9745\/revisions\/26799"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media\/9747"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=9745"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=9745"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=9745"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=9745"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}