A configured cluster proves nothing until a node has actually been taken away from it. Split-brain, a truncated auth_pass, a health check that never drops priority. Every one of these looks correct in the configuration file and fails only under the condition the cluster exists for.Test it deliberately, on a schedule, and keep the output.
Confirm the address is Keepalived-owned, not statically assigned:
ip a show INTERFACE | grep VIP-ADDRESS
Expected output on the Master only:
inet VIP-ADDRESS/32 scope global proto keepalived INTERFACE
The proto keepalived tag confirms Keepalived owns the address and will withdraw it automatically on failover. An address without that tag was assigned statically and will not move.
# Master node: trigger the failuresudo systemctl stop safesquid
Within 10–15 seconds the log shows the handover:
(SAFESQUID_VIP) Changing effective priority from 101 to 0(SAFESQUID_VIP) Master received advert from BACKUP-IP with higher priority 100(SAFESQUID_VIP) Entering BACKUP STATE(SAFESQUID_VIP) Transition to MASTER STATESending gratuitous ARP on INTERFACE for VIP-ADDRESS
Confirm the VIP moved:
ip a show INTERFACE | grep VIP-ADDRESS
Expected result: the address now appears on the Backup and is gone from the Master.Prove it from a client, not only from the nodes. Browse through the VIP and confirm the request appears in the surviving node’s access log. A VIP that moved but carries no traffic is a half-successful failover.
nopreempt keeps the VIP on the Backup after the Master recovers. This avoids a second interruption during business hours. To move the VIP back deliberately, restart Keepalived on the Master: sudo systemctl restart keepalived.
journalctl -u keepalived extract covering the tested failover, showing the state transition and gratuitous ARP.
ip a output before and after failover, showing VIP ownership on each node.
/var/log/keepalived_check.log and /var/log/monit.log for the test window.
Client-side proof that browsing resumed through the VIP, plus the access-log entries from the surviving node.
The date of the last tested failover and the named owner of the next test.
Schedule a failover test on the same cadence as your disaster-recovery restore test. A cluster that has not failed over in a year is a configuration file, not a control.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"SafeSquid Documentation","description":"Deploy Zero-Trust Web Security — SafeSquid Secure Web Gateway documentation.","colors":{"primary":"#0066CC","light":"#3B82F6","dark":"#0F172A"},"logo":{"light":"https://mintcdn.com/safe-squid-labs-12a0916f/WapkOaLV2w2WE_m9/images/logos/safesquid/safesquid-mark-blue.png?fit=max\u0026auto=format\u0026n=WapkOaLV2w2WE_m9\u0026q=85\u0026s=b7b9c81a4dfce86823f854d9510e5cec","dark":"https://mintcdn.com/safe-squid-labs-12a0916f/PZ5D4OEI8Q1II8co/images/safesquidWhite.png?fit=max\u0026auto=format\u0026n=PZ5D4OEI8Q1II8co\u0026q=85\u0026s=149dccbc6157c7707f7edba211ae87b3","href":"/getting_started/welcome"},"favicon":"https://mintcdn.com/safe-squid-labs-12a0916f/WapkOaLV2w2WE_m9/images/favicon.ico?fit=max\u0026auto=format\u0026n=WapkOaLV2w2WE_m9\u0026q=85\u0026s=7a799a5cc14069284c934d5f83717827","navbar":{"links":[{"href":"/blog","label":"Blog"},{"href":"https://help.safesquid.com/portal/en/community/safesquid-labs","label":"Forum"},{"icon":{"style":"brands","name":"github"},"href":"https://github.com/SafeSquid-Labs","label":""}],"primary":{"type":"button","label":"Get Started","href":"https://key.safesquid.com"}},"footer":{"socials":{"website":"https://www.safesquid.com/","github":"https://github.com/SafeSquid-Labs","x":"https://x.com/safesquid","linkedin":"https://in.linkedin.com/company/safesquid","youtube":"https://www.youtube.com/@securewebgateway"}},"icons":{"library":"fontawesome"},"integrations":{"ga4":{"measurementId":"G-ZVZHSKFGQF"}},"banner":{"content":"[Join our Blue Team for a live layer 7 mitigation workshop](https://meet.safesquid.com)","dismissible":true,"type":"info"},"styling":{"latex":false},"navigation":{"global":{"languages":[{"language":"en","default":true,"href":"/getting_started/welcome"},{"language":"es","href":"/?lang=es"}],"versions":[{"version":"v2026.0312.1923","default":true,"href":"/getting_started/welcome"},{"version":"v2024.0315.1413","href":"/?version=legacy"}]},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"safe-squid-labs-12a0916f","hasAudioNarration":false,"actualSubdomain":"safe-squid-labs-12a0916f","customDomains":["docs.safesquid.com"],"gitSource":{"type":"github","owner":"safesquid-labs","repo":"safesquid-docs","deployBranch":"main","contentDirectory":"public","isPrivate":false,"mountPath":"","label":""},"chroma":{"latestBuiltDeploymentHistoryId":"6ac7bb6e8abd6d065dca7197","collectionId":"b29c1b41-a582-4821-ad5d-0d649bd041a3","liveDeploymentHistoryId":"6ac7bb6e8abd6d065dca7197","schemaVersion":"v3"},"feedback":{"thumbs":true,"edits":true,"issues":true},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6ac7bb6e8abd6d065dca7197","clientVersion":"0.0.3990","searchFilterCounts":[{"language":"default","tag":"Use Cases","count":86},{"language":"default","tag":"Configuration","count":44},{"language":"default","tag":"Deployment","count":43},{"language":"default","tag":"Architecture","count":24},{"language":"default","tag":"Troubleshooting","count":20},{"language":"default","tag":"Access Restriction","count":17},{"language":"default","tag":"Authentication","count":17},{"language":"default","tag":"Application Setup","count":10},{"language":"default","tag":"Real Time Content Security","count":10},{"language":"default","tag":"Application Ecosystem","count":9}],"searchSettings":{"isFiltersEnabled":true}},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true,"deflection":{"enabled":true,"email":"support@safesquid.net"}},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-v7-file-tree","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-nav-generations","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-agent-model-picker","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"privacy":{"consentBanner":{"enabled":true}},"isAtlas":false,"googleFontsInlined":false},"customCss":[{"filePath":"custom.css","content":"a:has(>img.nav-logo){flex-shrink:0!important}#sidebar-content li[data-active]>a{color:#16191d!important}.dark #sidebar-content li[data-active]>a{background-color:#3b82f6!important;color:#16191d!important}"}],"page":{"pagePath":"deployment/verify_failover","slug":"/deployment/verify_failover","pageMetadata":{"title":"Verify Failover","description":"Test SafeSquid high-availability failover deliberately, confirm the VIP moves, and keep the evidence that proves the control survived a node loss.","keywords":["SafeSquid failover test","Keepalived VRRP failover","VIP handover verification","HA evidence","failover testing cadence"],"href":"/deployment/verify_failover"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Test SafeSquid high-availability failover deliberately, confirm the VIP moves, and keep the evidence that proves the control survived a node loss.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,p:`p`,pre:`pre`,span:`span`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,Note,Table,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Note)_missingMdxReference(`Note`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(Heading,{level:`1`,id:`untested-failover-is-not-high-availability`,children:`Untested Failover Is Not High Availability`}),`\n`,_jsxs(_components.p,{children:[`A configured cluster proves nothing until a node has actually been taken away from it. Split-brain, a truncated `,_jsx(_components.code,{children:`auth_pass`}),`, a health check that never drops priority. Every one of these looks correct in the configuration file and fails only under the condition the cluster exists for.`]}),`\n`,_jsx(_components.p,{children:`Test it deliberately, on a schedule, and keep the output.`}),`\n`,_jsx(Heading,{level:`2`,id:`validate-prerequisites`,children:`Validate prerequisites`}),`\n`,_jsx(_components.p,{children:`Confirm:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`An active-passive pair is configured. See `,_jsx(_components.a,{href:`/use_cases/scaling_and_high_availability/ha_monit_keepalived`,children:`Monit and Keepalived`}),`.`]}),`\n`,_jsx(_components.li,{children:`Both nodes are healthy and the VIP is currently held by the Master.`}),`\n`,_jsx(_components.li,{children:`The test window is approved, and clients affected by a brief handover are known.`}),`\n`,_jsx(_components.li,{children:`You have shell access to both nodes.`}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`confirm-the-starting-state`,children:`Confirm the starting state`}),`\n`,_jsx(_components.p,{children:`On the Master, confirm Keepalived owns the VIP and the health check passes:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`2`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`sudo`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` systemctl`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` status`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` keepalived`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`sudo`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` journalctl`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -u`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` keepalived`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -n`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 30`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --no-pager`})]}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`Expected output on the Master includes:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`3`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`3`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`(SAFESQUID_VIP) Entering MASTER STATE`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`VRRP_Script(check_safesquid) succeeded`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(_components.p,{children:`Confirm the address is Keepalived-owned, not statically assigned:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`ip`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` a`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` show`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` INTERFACE`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` |`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:` grep`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` VIP-ADDRESS`})]}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`Expected output on the Master only:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`inet VIP-ADDRESS/32 scope global proto keepalived INTERFACE`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsxs(_components.p,{children:[`The `,_jsx(_components.code,{children:`proto keepalived`}),` tag confirms Keepalived owns the address and will withdraw it automatically on failover. An address without that tag was assigned statically and will not move.`]}),`\n`,_jsx(Heading,{level:`2`,id:`trigger-the-failover`,children:`Trigger the failover`}),`\n`,_jsx(_components.p,{children:`Open two terminals. Watch the log on the Backup while you stop SafeSquid on the Master.`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# Backup node: follow the Keepalived log`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`sudo`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` journalctl`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -u`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` keepalived`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -f`})]}),`\n`]})})}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# Master node: trigger the failure`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`sudo`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` systemctl`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` stop`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` safesquid`})]}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`Within 10–15 seconds the log shows the handover:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`6`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`6`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`(SAFESQUID_VIP) Changing effective priority from 101 to 0`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`(SAFESQUID_VIP) Master received advert from BACKUP-IP with higher priority 100`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`(SAFESQUID_VIP) Entering BACKUP STATE`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`(SAFESQUID_VIP) Transition to MASTER STATE`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`Sending gratuitous ARP on INTERFACE for VIP-ADDRESS`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(_components.p,{children:`Confirm the VIP moved:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`ip`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` a`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` show`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` INTERFACE`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` |`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:` grep`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` VIP-ADDRESS`})]}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`Expected result: the address now appears on the Backup and is gone from the Master.`}),`\n`,_jsx(_components.p,{children:`Prove it from a client, not only from the nodes. Browse through the VIP and confirm the request appears in the surviving node’s access log. A VIP that moved but carries no traffic is a half-successful failover.`}),`\n`,_jsx(Heading,{level:`2`,id:`restore-the-master`,children:`Restore the Master`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`sudo`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` systemctl`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` start`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` safesquid`})]}),`\n`]})})}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[_jsx(_components.code,{children:`nopreempt`}),` keeps the VIP on the Backup after the Master recovers. This avoids a second interruption during business hours. To move the VIP back deliberately, restart Keepalived on the Master: `,_jsx(_components.code,{children:`sudo systemctl restart keepalived`}),`.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`capture-failover-evidence`,children:`Capture failover evidence`}),`\n`,_jsx(_components.p,{children:`Store these artifacts with the change record:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`journalctl -u keepalived`}),` extract covering the tested failover, showing the state transition and gratuitous ARP.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`ip a`}),` output before and after failover, showing VIP ownership on each node.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`/var/log/keepalived_check.log`}),` and `,_jsx(_components.code,{children:`/var/log/monit.log`}),` for the test window.`]}),`\n`,_jsx(_components.li,{children:`Client-side proof that browsing resumed through the VIP, plus the access-log entries from the surviving node.`}),`\n`,_jsx(_components.li,{children:`The date of the last tested failover and the named owner of the next test.`}),`\n`]}),`\n`,_jsx(Warning,{children:_jsx(_components.p,{children:`Schedule a failover test on the same cadence as your disaster-recovery restore test. A cluster that has not failed over in a year is a configuration file, not a control.`})}),`\n`,_jsx(Heading,{level:`2`,id:`troubleshoot-failover-tests`,children:`Troubleshoot failover tests`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Symptom`}),_jsx(_components.th,{children:`Likely cause`}),_jsx(_components.th,{children:`Fix`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Both nodes report MASTER`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`virtual_router_id`}),` or `,_jsx(_components.code,{children:`auth_pass`}),` mismatch`]}),_jsxs(_components.td,{children:[`Set an identical `,_jsx(_components.code,{children:`virtual_router_id`}),` and `,_jsx(_components.code,{children:`auth_pass`}),` on both nodes; `,_jsx(_components.code,{children:`auth_pass`}),` must be 8 characters or fewer`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`VIP does not move on failure`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`weight`}),` does not drop priority below the Backup`]}),_jsxs(_components.td,{children:[`Use `,_jsx(_components.code,{children:`weight -101`}),` so the effective priority reaches 0`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`VIP moves but clients still fail`}),_jsx(_components.td,{children:`Clients point at a node address, not the VIP`}),_jsx(_components.td,{children:`Repoint PAC, GPO, or MDM at the VIP; a profile naming the Master will not fail over`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`VIP present but tagged differently`}),_jsx(_components.td,{children:`Address was assigned statically`}),_jsxs(_components.td,{children:[`Remove the static assignment; only a `,_jsx(_components.code,{children:`proto keepalived`}),` address will move`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Handover works, logs are empty on the survivor`}),_jsx(_components.td,{children:`Traffic is not reaching the surviving node`}),_jsx(_components.td,{children:`Confirm firewall rules permit the client network to both nodes, not just the Master`})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`next-steps`,children:`Next steps`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/use_cases/scaling_and_high_availability/ha_monit_keepalived`,children:`Monit and Keepalived`}),` - review or correct the cluster configuration.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/use_cases/scaling_and_high_availability/disaster_recovery`,children:`Backup Strategy`}),` - pair failover testing with a restore test.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/use_cases/customisation/configuration_sync`,children:`Configuration Sync`}),` - keep policy identical on both nodes.`]}),`\n`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Verify Failover","description":"Test SafeSquid high-availability failover deliberately, confirm the VIP moves, and keep the evidence that proves the control survived a node loss.","keywords":["SafeSquid failover test","Keepalived VRRP failover","VIP handover verification","HA evidence","failover testing cadence"],"href":"/deployment/verify_failover"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Untested Failover Is Not High Availability","slug":"untested-failover-is-not-high-availability","depth":1,"children":[]},{"title":"Validate prerequisites","slug":"validate-prerequisites","depth":2,"children":[]},{"title":"Confirm the starting state","slug":"confirm-the-starting-state","depth":2,"children":[]},{"title":"Trigger the failover","slug":"trigger-the-failover","depth":2,"children":[]},{"title":"Restore the Master","slug":"restore-the-master","depth":2,"children":[]},{"title":"Capture failover evidence","slug":"capture-failover-evidence","depth":2,"children":[]},{"title":"Troubleshoot failover tests","slug":"troubleshoot-failover-tests","depth":2,"children":[]},{"title":"Next steps","slug":"next-steps","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"safe-squid-labs-12a0916f","siteName":"SafeSquid Documentation","title":"Verify Failover - SafeSquid Documentation","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-08T15:49:30.553Z","originalFileLocation":"deployment/verify_failover.md","locale":"en"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Test SafeSquid high-availability failover deliberately, confirm the VIP moves, and keep the evidence that proves the control survived a node loss.\">\u003cmeta data-mint-head name=\"application-name\" content=\"SafeSquid Documentation\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/safe-squid-labs-12a0916f/dNzFC4OIOBxe5Jm_/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/safe-squid-labs-12a0916f/dNzFC4OIOBxe5Jm_/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/safe-squid-labs-12a0916f/dNzFC4OIOBxe5Jm_/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/safe-squid-labs-12a0916f/dNzFC4OIOBxe5Jm_/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/safe-squid-labs-12a0916f/dNzFC4OIOBxe5Jm_/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/safe-squid-labs-12a0916f/dNzFC4OIOBxe5Jm_/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/safe-squid-labs-12a0916f/dNzFC4OIOBxe5Jm_/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/safe-squid-labs-12a0916f/dNzFC4OIOBxe5Jm_/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/safe-squid-labs-12a0916f/dNzFC4OIOBxe5Jm_/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Verify Failover - SafeSquid Documentation\">\u003cmeta data-mint-head property=\"og:description\" content=\"Test SafeSquid high-availability failover deliberately, confirm the VIP moves, and keep the evidence that proves the control survived a node loss.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"SafeSquid Documentation\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.safesquid.com/deployment/verify_failover\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://safe-squid-labs-12a0916f.mintlify.app/_mintlify/api/og/v2?division=Scaling+and+high+availability\u0026amp;title=Verify+Failover\u0026amp;description=Test+SafeSquid+high-availability+failover+deliberately%2C+confirm+the+VIP+moves%2C+and+keep+the+evidence+that+proves+the+control+survived+a+node+loss.\u0026amp;theme=4ec1e09f5eab69716f172ff1\u0026amp;signature=cfb1baa5e8761955f2db02cfc0de9af004d68bf14342cee3471d66e1ba04eebc\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Verify Failover - SafeSquid Documentation\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Test SafeSquid high-availability failover deliberately, confirm the VIP moves, and keep the evidence that proves the control survived a node loss.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://safe-squid-labs-12a0916f.mintlify.app/_mintlify/api/og/v2?division=Scaling+and+high+availability\u0026amp;title=Verify+Failover\u0026amp;description=Test+SafeSquid+high-availability+failover+deliberately%2C+confirm+the+VIP+moves%2C+and+keep+the+evidence+that+proves+the+control+survived+a+node+loss.\u0026amp;theme=4ec1e09f5eab69716f172ff1\u0026amp;signature=cfb1baa5e8761955f2db02cfc0de9af004d68bf14342cee3471d66e1ba04eebc\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/safe-squid-labs-12a0916f/dNzFC4OIOBxe5Jm_/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"SafeSquid Documentation\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#0066CC\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.safesquid.com/deployment/verify_failover\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/deployment/verify_failover.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.safesquid.com/#organization\",\"name\":\"SafeSquid Documentation\",\"url\":\"https://docs.safesquid.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/safe-squid-labs-12a0916f/WapkOaLV2w2WE_m9/images/logos/safesquid/safesquid-mark-blue.png?fit=max\u0026auto=format\u0026n=WapkOaLV2w2WE_m9\u0026q=85\u0026s=b7b9c81a4dfce86823f854d9510e5cec\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.safesquid.com#website\",\"name\":\"SafeSquid Documentation\",\"url\":\"https://docs.safesquid.com\",\"publisher\":{\"@id\":\"https://docs.safesquid.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.safesquid.com/deployment/verify_failover#webpage\",\"url\":\"https://docs.safesquid.com/deployment/verify_failover\",\"name\":\"Verify Failover\",\"description\":\"Test SafeSquid high-availability failover deliberately, confirm the VIP moves, and keep the evidence that proves the control survived a node loss.\",\"dateModified\":\"2026-10-08T15:49:30.553Z\",\"isPartOf\":{\"@id\":\"https://docs.safesquid.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.safesquid.com/deployment/verify_failover#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.safesquid.com/deployment/verify_failover#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Scaling and high availability\",\"item\":\"https://docs.safesquid.com/use_cases/scaling_and_high_availability/proxy_clustering\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Verify Failover\",\"item\":\"https://docs.safesquid.com/deployment/verify_failover\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.safesquid.com/deployment/verify_failover#article\",\"headline\":\"Verify Failover\",\"name\":\"Verify Failover\",\"description\":\"Test SafeSquid high-availability failover deliberately, confirm the VIP moves, and keep the evidence that proves the control survived a node loss.\",\"url\":\"https://docs.safesquid.com/deployment/verify_failover\",\"mainEntityOfPage\":{\"@id\":\"https://docs.safesquid.com/deployment/verify_failover#webpage\"},\"dateModified\":\"2026-10-08T15:49:30.553Z\",\"keywords\":\"SafeSquid failover test, Keepalived VRRP failover, VIP handover verification, HA evidence, failover testing cadence\",\"publisher\":{\"@id\":\"https://docs.safesquid.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.safesquid.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"SafeSquid Documentation\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"SafeSquid Documentation","nav":{"global":{"languages":[{"language":"en","default":true,"href":"/getting_started/welcome"},{"language":"es","href":"/?lang=es"}],"versions":[{"version":"v2026.0312.1923","default":true,"href":"/getting_started/welcome"},{"version":"v2024.0315.1413","href":"/?version=legacy"}]},"tabs":[{"tab":"Get Started","icon":"compass","pages":[{"title":"Get Started","href":"/getting_started/welcome"}]},{"tab":"Architecture","icon":"sitemap","pages":[{"title":"Architecture","href":"/architecture/application_ecosystem/main"}]},{"tab":"Deployment","icon":"server","groups":[{"group":"Plan and prepare","pages":[{"title":"Licensing Requirements","href":"/deployment/licensing_requirements"},{"title":"Register Your Key","href":"/getting_started/register"},{"title":"Hardware Sizing","href":"/deployment/hardware_sizing"},{"title":"Ports and Firewall Rules","href":"/deployment/ports_and_firewall_rules"}]},{"group":"Install SafeSquid","pages":[{"title":"Install SafeSquid","href":"/getting_started/install_safesquid/main"}]},{"group":"Deploy locally","pages":[{"title":"SafeSquid Appliance Builder","href":"/getting_started/install_safesquid/safesquid_appliance_builder"},{"title":"Linux Server Install","href":"/getting_started/install_safesquid/linux_server"}]},{"group":"Deploy on cloud","pages":[{"title":"Cloud Deployment","href":"/getting_started/install_safesquid/cloud_deployment"},{"title":"Cloud Image or Cloud-Init","href":"/deployment/cloud_image_or_cloud_init"}]},{"group":"Connect clients","pages":[{"title":"Connect Your Client","href":"/getting_started/client_configuration/connect_your_client"},{"title":"Explicit Proxy Configuration","href":"/getting_started/client_configuration/explicit_proxy"},{"title":"PAC File Configuration","href":"/getting_started/client_configuration/pac_file"},{"title":"System-Wide Proxy Settings","href":"/getting_started/client_configuration/system_wide_proxy"},{"title":"Enterprise Deployment","href":"/getting_started/client_configuration/enterprise_deployment"},{"title":"Application-Specific Configuration","href":"/getting_started/client_configuration/application_specific_configuration"}]},{"group":"Activate your license","pages":[{"title":"Activate Your License","href":"/getting_started/activate"},{"title":"Manage Subscription State","href":"/deployment/manage_subscription_state"}]},{"group":"Deployment modes","pages":[{"title":"Choose an Architecture","href":"/deployment/choose_an_architecture"},{"title":"Forward Proxy","href":"/use_cases/scaling_and_high_availability/forward_proxy"},{"title":"Transparent Proxy","href":"/use_cases/scaling_and_high_availability/transparent_proxy"},{"title":"WCCP","href":"/use_cases/scaling_and_high_availability/wccp"},{"title":"TCP Proxy","href":"/use_cases/scaling_and_high_availability/tcp_proxy"},{"title":"Reverse Proxy","href":"/use_cases/scaling_and_high_availability/reverse_proxy"},{"title":"Proxy Chain","href":"/use_cases/scaling_and_high_availability/proxy_chain"},{"title":"Deployment Checklist","href":"/getting_started/install_safesquid/prerequisites"}]},{"group":"Scaling and high availability","pages":[{"title":"Proxy Clustering","href":"/use_cases/scaling_and_high_availability/proxy_clustering"},{"title":"Master-Slave","href":"/use_cases/scaling_and_high_availability/master_slave"},{"title":"Configuration Sync","href":"/use_cases/customisation/configuration_sync"},{"title":"High Availability with Monit and Keepalived","description":"Build active-passive SafeSquid high availability using Keepalived for VIP failover and Monit for process supervision, with split-brain protection and tested failover.","href":"/use_cases/scaling_and_high_availability/ha_monit_keepalived"},{"title":"Verify Failover","href":"/deployment/verify_failover"}]},{"group":"Backup and disaster recovery","pages":[{"title":"Backup Strategy","description":"Decide what SafeSquid backs up, what it does not, and what the disaster-recovery plan must cover separately before the deployment depends on Cloud Restore.","href":"/use_cases/scaling_and_high_availability/disaster_recovery"},{"title":"Configure Cloud Restore","href":"/use_cases/customisation/configure_cloud_restore"},{"title":"Restore Configuration and Certificates","href":"/deployment/restore_configuration_and_certificates"}]},{"group":"Performance and capacity","pages":[{"title":"Caching and Prefetching","href":"/use_cases/performance_acceleration/caching"},{"title":"Bandwidth Management","href":"/use_cases/performance_acceleration/manage_bandwidth"},{"title":"Performance Plot","href":"/use_cases/performance_acceleration/performance_plot"}]},{"group":"Validate the deployment","pages":[{"title":"Service Health","href":"/deployment/service_health"},{"title":"Proxy Connectivity","href":"/deployment/proxy_connectivity"},{"title":"HTTPS Inspection Validation","href":"/deployment/https_inspection_validation"},{"title":"Policy Enforcement","href":"/getting_started/configure_web_security_policies"},{"title":"Production-Readiness Checklist","href":"/getting_started/verify_your_setup"}]},{"group":"Upgrade SafeSquid","pages":[{"title":"Upgrade SafeSquid","href":"/use_cases/upgrade/version_upgrade"},{"title":"Upgrade Ubuntu","href":"/use_cases/upgrade/os_upgrade"}]}]},{"tab":"Configuration","icon":"sliders","pages":[{"title":"Configuration","href":"/configuration/start_here/first_configuration"}]},{"tab":"Use Cases","icon":"lightbulb","pages":[{"title":"Use Cases","href":"/use_cases/use_cases"}]},{"tab":"Reporting","icon":"chart-line","pages":[{"title":"Reporting","href":"/reporting/reporting"}]},{"tab":"Troubleshooting","icon":"wrench","pages":[{"title":"Troubleshooting","href":"/troubleshooting/troubleshooting"}]},{"tab":"FAQs","icon":"circle-question","pages":[{"title":"FAQs","href":"/faqs/faqs"}]}]},"title":"Verify Failover - SafeSquid Documentation","buildId":"dpl_2oYXwqkEXirXBPk8wV1FtM5USFWi","deploymentId":"dpl_2oYXwqkEXirXBPk8wV1FtM5USFWi","dynamics":["10e4515597"],"chunks":["BannerMarkdown-CJDb0dYK.js","dist-Cv_O2fky.js","lib--scc4DXi.js","lib-B8HbPgcC.js","clsx-BGBGWFTt.js","html-void-elements-mCSPHezU.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js"]}