Files
nexus/sreweekly/articles/135/02-how-to-set-up-high-availability-storage-with-glusterfs-on-ubuntu-18-04.html
2026-09-12 17:23:01 +08:00

2022 lines
261 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html><html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1"><link rel="icon" type="image/x-icon" href="https://www.techrepublic.com/favicon.ico"><link rel="icon" type="image/png" sizes="16x16" href="https://www.techrepublic.com/favicon-16x16.png"><link rel="icon" type="image/png" sizes="32x32" href="https://www.techrepublic.com/favicon-32x32.png"><link rel="icon" type="image/png" sizes="96x96" href="https://www.techrepublic.com/favicon-96x96.png"><link rel="icon" type="image/png" sizes="192x192" href="https://www.techrepublic.com/favicon-192x192.png"><link rel="preconnect" href="https://capi.connatix.com" crossorigin=""><link rel="preconnect" href="https://cd.connatix.com" crossorigin=""><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin=""><link rel="preconnect" href="https://cmp.inmobi.com"><link rel="preconnect" href="https://7K2PtPeYG9QYuDfTo.ay.delivery"><link rel="preconnect" href="https://securepubads.g.doubleclick.net"><link rel="preconnect" href="https://cdn.id5-sync.com" crossorigin=""><link rel="preconnect" href="https://c.amazon-adsystem.com" crossorigin=""><link rel="preconnect" href="https://pbs-us-east.ay.delivery" crossorigin=""><link rel="preload" as="image" fetchpriority="high" href="https://www.techrepublic.com/astrostatic/c733c3a8/_image/?href=%2F_astro%2Ftechrepublic.BQceyIVv.png&w=500&h=119&f=webp"><link rel="preload" href="https://cmp.inmobi.com/choice/vPn77x7pBG57Y/www.techrepublic.com/choice.js?tag_version=V3" as="script" data-no-early-hint=""><link rel="preload" href="https://securepubads.g.doubleclick.net/tag/js/gpt.js" as="script" data-no-early-hint=""><link rel="preload" href="https://7K2PtPeYG9QYuDfTo.ay.delivery/manager/7K2PtPeYG9QYuDfTo" as="script" data-no-early-hint=""><script type="module">const o=new WeakMap,r=new Set,h=10,f=t=>{let e=0;for(const n of t.children)e=Math.max(e,n.offsetHeight);return e},w=t=>{const e=f(t);e<h||e>(o.get(t)??0)&&(o.set(t,e),t.style.setProperty("min-height",`${e}px`,"important"))},u=1e3,i=new WeakMap,c=t=>{clearTimeout(i.get(t)),i.set(t,window.setTimeout(()=>w(t),u))},m=new ResizeObserver(t=>{for(const e of t)c(e.target)}),d=t=>{r.has(t)||(r.add(t),m.observe(t))},a=t=>{for(const e of t.querySelectorAll("[data-ad-slot]"))d(e)};a(document);new MutationObserver(t=>{for(const e of t)for(const n of e.addedNodes)n instanceof HTMLElement&&(n.matches("[data-ad-slot]")&&d(n),a(n))}).observe(document.body,{childList:!0,subtree:!0});let s=window.innerWidth;window.addEventListener("resize",()=>{if(window.innerWidth!==s){s=window.innerWidth;for(const t of r)o.delete(t),t.style.removeProperty("min-height"),c(t)}});</script> <script>(function(){const domain = "techrepublic.com";
const targeting = {"env":"prod","stage":"prod","url":"www.techrepublic.com/article/how-to-set-up-high-availability-storage-with-glusterfs-on-ubuntu-18-04/","hostname":"www.techrepublic.com","edge_country":"US","cid":"how-to-set-up-high-availability-storage-with-glusterfs-on-ubuntu-18-04","path":"sites,techrepublic.com,article,how-to-set-up-high-availability-storage-with-glusterfs-on-ubuntu-18-04","kw":"","category":"data-centers,open-source","topic":"data-centers,open-source","tax":"","ptype":"article","news":"no","author":"jack-wallen"};
window._vars = {
...(window?._vars ?? {}),
domain,
targeting,
}
})();</script> <script>
;(() => {
// The sweep runs once the AY manager loads — well after first paint,
// so yanking the boxes out of the layout right there registers as
// CLS. Blank each box immediately (visibility keeps its space), and
// drop the space on the next discrete input, when the shift falls in
// the CLS input-exclusion window. Below-viewport boxes could collapse
// immediately without penalty, but one code path is enough.
let lastInput = -Infinity
const noteInput = () => {
lastInput = performance.now()
}
document.addEventListener("pointerdown", noteInput, {
capture: true,
passive: true,
})
document.addEventListener("keydown", noteInput, { capture: true })
const pendingRelease = []
const releaseAll = () => {
for (const release of pendingRelease.splice(0)) release()
}
document.addEventListener(
"pointerdown",
() => requestAnimationFrame(releaseAll),
{ capture: true, passive: true },
)
document.addEventListener(
"keydown",
() => requestAnimationFrame(releaseAll),
{ capture: true },
)
const releaseOnInput = (release) => {
if (performance.now() - lastInput < 400) {
release()
} else {
pendingRelease.push(release)
}
}
// Same gate, published for the other code path that yanks a reserved
// box out of the layout: AssertiveYield's slotRenderEnded handler,
// which hides a slot the auction came back empty on. That collapse is
// worth as much CLS as the space the slot was holding, so it waits for
// an input too. Callers fall back to collapsing immediately if this is
// missing, which keeps packages/ads working without this script.
window.releaseAdSpaceOnInput = releaseOnInput
const collapse = () => {
const ay = window.ayManagerEnv
if (!ay?.settings?.placements || !ay.tools?.getEnabledPlacements) {
return
}
const enabled = ay.tools.getEnabledPlacements()
for (const entry of ay.settings.placements) {
// Only placements AY renders *inside* their target. For
// beforebegin/afterend the target is a sibling anchor — real
// content that must not be hidden.
if (!["afterbegin", "beforeend"].includes(entry.position)) {
continue
}
// Enabled: AY will request it and slotRenderEnded decides.
if (enabled.some(({ _id }) => _id === entry._id)) {
continue
}
for (const el of document.querySelectorAll(entry.placement)) {
// ...except when the wrapper _is_ the page
if (["body", "html"].includes(el.tagName.toLowerCase())) {
continue
}
if (el.hasAttribute("data-empty")) {
continue
}
el.style.visibility = "hidden"
releaseOnInput(() => {
el.style.display = "none"
el.setAttribute("data-empty", "")
// The AY selector can target a wrapper around the slot
// rather than the slot itself.
for (const slot of el.querySelectorAll(
"[data-ad-slot]",
)) {
slot.setAttribute("data-empty", "")
}
})
}
}
}
// Exposed so infinite scroll can re-sweep slots inserted after load.
window.collapseDisabledAdSlots = () =>
window.requestAnimationFrame(collapse)
window.ayManagerEnv = window.ayManagerEnv || { cmd: [] }
window.ayManagerEnv.cmd.push(() => window.collapseDisabledAdSlots())
})()
</script> <script src="https://7K2PtPeYG9QYuDfTo.ay.delivery/manager/7K2PtPeYG9QYuDfTo" type="text/javascript" referrerpolicy="no-referrer-when-downgrade" async>
</script><script>(function(){const targeting = {"env":"prod","stage":"prod","url":"www.techrepublic.com/article/how-to-set-up-high-availability-storage-with-glusterfs-on-ubuntu-18-04/","hostname":"www.techrepublic.com","edge_country":"US","cid":"how-to-set-up-high-availability-storage-with-glusterfs-on-ubuntu-18-04","path":"sites,techrepublic.com,article,how-to-set-up-high-availability-storage-with-glusterfs-on-ubuntu-18-04","kw":"","category":"data-centers,open-source","topic":"data-centers,open-source","tax":"","ptype":"article","news":"no","author":"jack-wallen"};
const debug = false;
window.googletag = window.googletag || { cmd: [] };
// A wrapper can opt out of the global marking below with
// `data-ad-self-managed` when it owns its own fill lifecycle
// (e.g. a reserved band that must not collapse the instant GPT
// reports a render). Marking it here as well would fight that
// component and undo whatever it is holding.
const selfManaged = (wrapper) =>
wrapper.hasAttribute('data-ad-self-managed');
document.addEventListener('ay-ads-disabled', () => {
const allAdElements = Array.from(
document.querySelectorAll('[data-ad-slot]')
).filter((element) => !selfManaged(element));
allAdElements.forEach(element => {
element.setAttribute('data-empty', '');
});
if (debug) {
console.log('[AY] ay-ads-disabled event: Marked ads as empty', {
count: allAdElements.length,
elements: allAdElements.map(el => ({
selector: `[data-ad-slot="${el.getAttribute('data-ad-slot')}"]`,
element: el
}))
});
}
});
googletag.cmd.push(() => {
// Initialize googletag for targeting API (AY uses GPT API for targeting)
Object.entries(targeting).forEach(([key, value]) => {
window.googletag.pubads().setTargeting(key, value);
});
// Global slotRenderEnded listener:
// All ad wrappers (AdSlot, SkyboxAd, CurtainAd) use `data-ad-slot` attribute.
// AY/GPT fires slotRenderEnded with slotElementId pointing at an AY-generated inner div.
// We walk up to our wrapper and mark it loaded or empty,
// unless the wrapper is self-managed (see above).
window.googletag
.pubads()
.addEventListener("slotRenderEnded", (event) => {
const slotElementId = event.slot.getSlotElementId();
const ayDiv = document.getElementById(slotElementId);
if (!ayDiv) return;
const wrapper = ayDiv.closest("[data-ad-slot]");
if (!wrapper) return;
if (selfManaged(wrapper)) return;
if (event.isEmpty) {
// Pulling a reserved box out of the layout mid-page
// costs exactly as much CLS as the space it was
// holding, and slots that reserve their creative's
// real height (the article natives) hold a lot.
// Blank it now — visibility keeps the space — and
// drop the space on the next discrete input, where
// the shift lands in the CLS input-exclusion
// window. `data-empty` goes on with the space so
// nothing reads the slot as collapsed early.
const collapse = () => {
// A refresh may have filled the slot while this
// release sat in the queue waiting for input.
if (wrapper.hasAttribute("data-loaded")) return;
wrapper.style.visibility = "";
wrapper.style.display = "none";
wrapper.setAttribute("data-empty", "");
};
wrapper.style.visibility = "hidden";
wrapper.removeAttribute("data-loaded");
if (window.releaseAdSpaceOnInput) {
window.releaseAdSpaceOnInput(collapse);
} else {
collapse();
}
} else {
// A refresh can fill a slot that came back empty
// last time, so undo the blanking above as well as
// the collapse — a queued release would otherwise
// hide a slot that now has an ad in it.
wrapper.style.visibility = "";
wrapper.style.display = "";
wrapper.setAttribute("data-loaded", "");
wrapper.removeAttribute("data-empty");
}
if (debug) {
console.log("[AY] slotRenderEnded", {
slotElementId,
adSlot: wrapper.getAttribute("data-ad-slot"),
isEmpty: event.isEmpty,
});
}
});
});
})();</script><style is:global="">
@media (max-width: 767px) {
.cnx-pinned-wrapper {
margin-top: 10px;
}
}
@media (min-width: 768px) {
.cnx-float.cnx-float-position-bottom {
transform: translate(0, -100px) !important;
}
}
.cnx-main-container.cnx-in-desktop {
max-width: 640px;
max-height: 360px;
}
</style><script>
(() => {
window.ngt = window.ngt || { cmd:[] };
window.ngt.cmd.push(function(){
window.googletag.cmd.push(() => {
window.googletag
.pubads()
.setTargeting(
"user_agent",
navigator?.userAgent ?? "Unknown User Agent",
)
.setTargeting(
"ngt_company_size",
(window.ngt.me.company?.company_size_range ?? "").replaceAll(
",",
"",
),
);
const tags =
window.ngt.me?.body?.me.tags?.map((tag) =>
tag.toLowerCase().replaceAll("site.", ""),
) ?? [];
[
["is_datacenter", ["is-datacenter"]],
["is_suspected_bot", ["suspected-bad-bot", "bad-bot"]],
["is_ta_user", ["ta-user-ip"]],
["is_crawler", ["user-agent-blocked"]],
["is_ad_blocked", ["ad-blocked-ip"]],
]
.filter(([tag, flags]) =>
flags.some((flag) => tags.includes(flag)),
)
.reduce((acc, [tag, flags]) => [...acc, tag], [])
.forEach((tag) =>
window.googletag.pubads().setTargeting(tag, "true"),
);
})
})
})();
</script><script async type="text/javascript" src="https://cmp.inmobi.com/choice/vPn77x7pBG57Y/www.techrepublic.com/choice.js?tag_version=V3"></script><script>(function(){const url = "https://cmp.inmobi.com/choice/vPn77x7pBG57Y/www.techrepublic.com/choice.js?tag_version=V3";
const iabVendorsUrl = "https://cmp.inmobi.com/GVL-v3/vendor-list.json";
const googleAtpUrl = "https://cmp.inmobi.com/tcfv2/google-atp-list.json";
(function() {
var uspTries = 0;
var uspTriesLimit = 3;
function makeStub() {
var TCF_LOCATOR_NAME = '__tcfapiLocator';
var queue = [];
var win = window;
var cmpFrame;
function addFrame() {
var doc = win.document;
var otherCMP = !!(win.frames[TCF_LOCATOR_NAME]);
if (!otherCMP) {
if (doc.body) {
var iframe = doc.createElement('iframe');
iframe.style.cssText = 'display:none';
iframe.name = TCF_LOCATOR_NAME;
doc.body.appendChild(iframe);
} else {
setTimeout(addFrame, 5);
}
}
return !otherCMP;
}
function tcfAPIHandler() {
var gdprApplies;
var args = arguments;
if (!args.length) {
return queue;
} else if (args[0] === 'setGdprApplies') {
if (
args.length > 3 &&
args[2] === 2 &&
typeof args[3] === 'boolean'
) {
gdprApplies = args[3];
if (typeof args[2] === 'function') {
args[2]('set', true);
}
}
} else if (args[0] === 'ping') {
var retr = {
gdprApplies: gdprApplies,
cmpLoaded: false,
cmpStatus: 'stub'
};
if (typeof args[2] === 'function') {
args[2](retr);
}
} else {
if(args[0] === 'init' && typeof args[3] === 'object') {
args[3] = Object.assign(args[3], { tag_version: 'V3' });
}
queue.push(args);
}
}
function postMessageEventHandler(event) {
var msgIsString = typeof event.data === 'string';
var json = {};
try {
if (msgIsString) {
json = JSON.parse(event.data);
} else {
json = event.data;
}
} catch (ignore) {}
var payload = json.__tcfapiCall;
if (payload) {
window.__tcfapi(
payload.command,
payload.version,
function(retValue, success) {
var returnMsg = {
__tcfapiReturn: {
returnValue: retValue,
success: success,
callId: payload.callId
}
};
if (msgIsString) {
returnMsg = JSON.stringify(returnMsg);
}
if (event && event.source && event.source.postMessage) {
event.source.postMessage(returnMsg, '*');
}
},
payload.parameter
);
}
}
while (win) {
try {
if (win.frames[TCF_LOCATOR_NAME]) {
cmpFrame = win;
break;
}
} catch (ignore) {}
if (win === window.top) {
break;
}
win = win.parent;
}
if (!cmpFrame) {
addFrame();
win.__tcfapi = tcfAPIHandler;
win.addEventListener('message', postMessageEventHandler, false);
}
};
makeStub();
function makeGppStub() {
const CMP_ID = 10;
const SUPPORTED_APIS = [
'2:tcfeuv2',
'6:uspv1',
'7:usnatv1',
'8:usca',
'9:usvav1',
'10:uscov1',
'11:usutv1',
'12:usctv1'
];
window.__gpp_addFrame = function (n) {
if (!window.frames[n]) {
if (document.body) {
var i = document.createElement("iframe");
i.style.cssText = "display:none";
i.name = n;
document.body.appendChild(i);
} else {
window.setTimeout(window.__gpp_addFrame, 10, n);
}
}
};
window.__gpp_stub = function () {
var b = arguments;
__gpp.queue = __gpp.queue || [];
__gpp.events = __gpp.events || [];
if (!b.length || (b.length == 1 && b[0] == "queue")) {
return __gpp.queue;
}
if (b.length == 1 && b[0] == "events") {
return __gpp.events;
}
var cmd = b[0];
var clb = b.length > 1 ? b[1] : null;
var par = b.length > 2 ? b[2] : null;
if (cmd === "ping") {
clb(
{
gppVersion: "1.1", // must be “Version.Subversion”, current: “1.1”
cmpStatus: "stub", // possible values: stub, loading, loaded, error
cmpDisplayStatus: "hidden", // possible values: hidden, visible, disabled
signalStatus: "not ready", // possible values: not ready, ready
supportedAPIs: SUPPORTED_APIS, // list of supported APIs
cmpId: CMP_ID, // IAB assigned CMP ID, may be 0 during stub/loading
sectionList: [],
applicableSections: [-1],
gppString: "",
parsedSections: {},
},
true
);
} else if (cmd === "addEventListener") {
if (!("lastId" in __gpp)) {
__gpp.lastId = 0;
}
__gpp.lastId++;
var lnr = __gpp.lastId;
__gpp.events.push({
id: lnr,
callback: clb,
parameter: par,
});
clb(
{
eventName: "listenerRegistered",
listenerId: lnr, // Registered ID of the listener
data: true, // positive signal
pingData: {
gppVersion: "1.1", // must be “Version.Subversion”, current: “1.1”
cmpStatus: "stub", // possible values: stub, loading, loaded, error
cmpDisplayStatus: "hidden", // possible values: hidden, visible, disabled
signalStatus: "not ready", // possible values: not ready, ready
supportedAPIs: SUPPORTED_APIS, // list of supported APIs
cmpId: CMP_ID, // list of supported APIs
sectionList: [],
applicableSections: [-1],
gppString: "",
parsedSections: {},
},
},
true
);
} else if (cmd === "removeEventListener") {
var success = false;
for (var i = 0; i < __gpp.events.length; i++) {
if (__gpp.events[i].id == par) {
__gpp.events.splice(i, 1);
success = true;
break;
}
}
clb(
{
eventName: "listenerRemoved",
listenerId: par, // Registered ID of the listener
data: success, // status info
pingData: {
gppVersion: "1.1", // must be “Version.Subversion”, current: “1.1”
cmpStatus: "stub", // possible values: stub, loading, loaded, error
cmpDisplayStatus: "hidden", // possible values: hidden, visible, disabled
signalStatus: "not ready", // possible values: not ready, ready
supportedAPIs: SUPPORTED_APIS, // list of supported APIs
cmpId: CMP_ID, // CMP ID
sectionList: [],
applicableSections: [-1],
gppString: "",
parsedSections: {},
},
},
true
);
} else if (cmd === "hasSection") {
clb(false, true);
} else if (cmd === "getSection" || cmd === "getField") {
clb(null, true);
}
//queue all other commands
else {
__gpp.queue.push([].slice.apply(b));
}
};
window.__gpp_msghandler = function (event) {
var msgIsString = typeof event.data === "string";
try {
var json = msgIsString ? JSON.parse(event.data) : event.data;
} catch (e) {
var json = null;
}
if (typeof json === "object" && json !== null && "__gppCall" in json) {
var i = json.__gppCall;
window.__gpp(
i.command,
function (retValue, success) {
var returnMsg = {
__gppReturn: {
returnValue: retValue,
success: success,
callId: i.callId,
},
};
event.source.postMessage(msgIsString ? JSON.stringify(returnMsg) : returnMsg, "*");
},
"parameter" in i ? i.parameter : null,
"version" in i ? i.version : "1.1"
);
}
};
if (!("__gpp" in window) || typeof window.__gpp !== "function") {
window.__gpp = window.__gpp_stub;
window.addEventListener("message", window.__gpp_msghandler, false);
window.__gpp_addFrame("__gppLocator");
}
};
makeGppStub();
var uspStubFunction = function() {
var arg = arguments;
if (typeof window.__uspapi !== uspStubFunction) {
setTimeout(function() {
if (typeof window.__uspapi !== 'undefined') {
window.__uspapi.apply(window.__uspapi, arg);
}
}, 500);
}
};
var checkIfUspIsReady = function() {
uspTries++;
if (window.__uspapi === uspStubFunction && uspTries < uspTriesLimit) {
console.warn('USP is not accessible');
} else {
clearInterval(uspInterval);
}
};
if (typeof window.__uspapi === 'undefined') {
window.__uspapi = uspStubFunction;
var uspInterval = setInterval(checkIfUspIsReady, 6000);
}
/**
* DataLayer Push & CCPA Support
*
* Version 2.0.7
*/
(async function () {
//URLs need to be externalized based on environments, during build update.
var get_iab_vendors_url = iabVendorsUrl;
var get_google_atp_url = googleAtpUrl;
var iab_vendors, iab_vendor_ids, iab_vendor_names;
var google_vendors, google_vendor_ids, google_vendor_names;
var google_vendors_arr = [],
google_vendor_ids_arr = [],
google_vendor_names_arr = [];
var iab_vendors_arr = [],
iab_vendor_ids_arr = [],
iab_vendor_names_arr = [];
var non_iab_vendors, non_iab_vendor_ids, non_iab_vendor_names;
var non_iab_vendors_arr = [],
non_iab_vendor_ids_arr = [],
non_iab_vendor_names_arr = [];
var publisher_consents, publisher_legitimate_interests;
var purpose_consents, purpose_legitimate_interests;
function resultToList(a) {
var b = ",";
if (a && typeof a === 'object') {
for (var i in a) {
if (a[i]) {
b += i + ",";
}
}
}
return b;
}
/**
* Get a full list of Non-IAB Vendors, specific to the Quantcast Universal Tag ID, using tcfapi
*/
function vendors_getNonIABVendorList() {
window.__tcfapi("getConfig", 2, function (retObj) {
if (retObj && retObj.hasOwnProperty("nonIabVendorsInfo")) {
if (
retObj.nonIabVendorsInfo && retObj.nonIabVendorsInfo.hasOwnProperty(
"nonIabVendorList",
)
) {
non_iab_vendors =
retObj.nonIabVendorsInfo.nonIabVendorList;
// Dont assume array key = vendor id, set key as vendor id with iab_vendors[i].id
Object.keys(non_iab_vendors).forEach(function (i) {
non_iab_vendors_arr[non_iab_vendors[i].vendorId] =
non_iab_vendors[i].name;
});
}
}
});
}
/**
* Get a full list of IAB Vendors.
*/
function vendors_getIABVendorList() {
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function () {
if (this.readyState == 4 && this.status == 200) {
var res = JSON.parse(this.responseText);
if (res && res.hasOwnProperty("vendors")) {
iab_vendors = res.vendors;
// Dont assume array key = vendor id, set key as vendor id with iab_vendors[i].id
Object.keys(iab_vendors).forEach(function (i) {
iab_vendors_arr[iab_vendors[i].id] =
iab_vendors[i].name;
});
}
}
};
xhttp.open("GET", get_iab_vendors_url, true);
xhttp.send();
}
/**
* Get a full list of google atp list
*/
function vendors_getGoogleVendorList() {
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function () {
if (this.readyState == 4 && this.status == 200) {
google_vendors = JSON.parse(this.responseText);
google_vendors.forEach(function (vendor) {
google_vendors_arr[vendor.provider_id] =
vendor.provider_name;
});
}
};
xhttp.open("GET", get_google_atp_url, true);
xhttp.send();
}
/**
* CMP Loaded.
*
* Push __cmpLoaded event to the data layer.
*/
function dlSend_tcLoaded(tcData) {
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({
event: "__cmpLoaded",
__cmpLoaded: true,
gdpr: tcData ? tcData.gdprApplies : false,
});
}
/**
* IAB Vendors.
*
* Push __cmpIABConsents event to the datalayer, along with iab vendor consent ids.
*/
function dlSend_consentData(tcData) {
window.dataLayer = window.dataLayer || [];
iab_vendor_names_arr = [];
iab_vendor_ids_arr = [];
non_iab_vendor_names_arr = [];
non_iab_vendor_ids_arr = [];
google_vendor_names_arr = [];
google_vendor_ids_arr = [];
if (tcData && tcData.hasOwnProperty("publisher")) {
if (tcData.publisher && tcData.publisher.hasOwnProperty("consents")) {
publisher_consents = resultToList(
tcData.publisher ? tcData.publisher.consents : null,
);
}
publisher_legitimate_interests = resultToList(
tcData.publisher ? tcData.publisher.legitimateInterests : null,
);
}
if (tcData && tcData.hasOwnProperty("purpose")) {
if (tcData.purpose && tcData.purpose.hasOwnProperty("consents")) {
purpose_consents = resultToList(tcData.purpose ? tcData.purpose.consents : null);
}
purpose_legitimate_interests = resultToList(
tcData.purpose ? tcData.purpose.legitimateInterests : null,
);
}
// Run this in an interval (every 0.1s) just in case we are still waiting
// on the return with our iab_vendors list calls, bail after 10 seconds
var cnt = 0;
var interval = setInterval(function () {
cnt += 1;
if (cnt === 100) {
clearInterval(interval);
}
if (iab_vendors) {
clearInterval(interval);
if (tcData ? tcData.gdprApplies : false) {
// Create name & id arrays of iab vendors with consent.
if (tcData && tcData.hasOwnProperty("vendor") && tcData.vendor && tcData.vendor.consents) {
Object.keys(tcData.vendor.consents).forEach(
function (vendorId) {
if (
(tcData.vendor && tcData.vendor.consents ? tcData.vendor.consents[vendorId] : false) ||
!tcData.gdprApplies
) {
iab_vendor_names_arr[vendorId] =
iab_vendors_arr[vendorId];
iab_vendor_ids_arr[vendorId] = vendorId;
}
},
);
}
} else {
// GDPR does not apply, add all vendor names/ids
iab_vendor_names_arr = iab_vendors_arr;
iab_vendors_arr.forEach(
function (vendorName, vendorId) {
iab_vendor_ids_arr[vendorId] = vendorId;
},
);
}
if (tcData && tcData.addtlConsent && google_vendors_arr) {
// Create name and id arrays of google vendors with consent.
// addtlConsent: "1~39.43.46.55.61.
// 1~ is the version and the rest are the decoded ids
var addtlConsentParts = (tcData.addtlConsent || "").split("1~");
if (addtlConsentParts.length > 1) {
google_vendor_ids_arr = addtlConsentParts[1].split(".");
}
google_vendor_ids_arr &&
google_vendor_ids_arr.forEach(function (google_id) {
google_vendor_names_arr.push(
google_vendors_arr[google_id],
);
});
}
// Non IAB Vendors
window.__tcfapi(
"getNonIABVendorConsents",
2,
function (nonIabConsent, nonIabSuccess) {
if (nonIabSuccess) {
if (nonIabConsent.gdprApplies) {
// Create name & id arrays of non iab vendors with consent.
nonIabConsent.nonIabVendorConsents &&
Object.keys(
nonIabConsent.nonIabVendorConsents,
).forEach(function (vendorId) {
if (
nonIabConsent
.nonIabVendorConsents[
vendorId
] ||
!nonIabConsent.gdprApplies
) {
non_iab_vendor_names_arr[
vendorId
] =
non_iab_vendors_arr[
vendorId
];
non_iab_vendor_ids_arr[
vendorId
] = vendorId;
}
});
} else {
// GDPR does not apply, add all non iab vendor names/ids
non_iab_vendor_names_arr =
non_iab_vendors_arr;
non_iab_vendors_arr.forEach(
function (vendorName, vendorId) {
non_iab_vendor_ids_arr[vendorId] =
vendorId;
},
);
}
}
// Join our array values, skipping empty items and joing them with a delimiter
iab_vendor_names = iab_vendor_names_arr
.filter(Boolean)
.join("|");
iab_vendor_ids = iab_vendor_ids_arr
.filter(Boolean)
.join(",");
google_vendor_names = google_vendor_names_arr
.filter(Boolean)
.join("|");
google_vendor_ids = google_vendor_ids_arr
.filter(Boolean)
.join("|");
non_iab_vendor_names = non_iab_vendor_names_arr
.filter(Boolean)
.join("|");
non_iab_vendor_ids = non_iab_vendor_ids_arr
.filter(Boolean)
.join(",");
// Push __cmpIABConsents signals to the data layer.
window.dataLayer.push({
event: "__cmpConsents",
__cmpConsents: {
iabVendorConsentIds: iab_vendor_ids,
iabVendorsWithConsent: iab_vendor_names,
nonIABVendorConsentIds: non_iab_vendor_ids,
nonIABVendorsWithConsent:
non_iab_vendor_names,
googleVendorConsentIds: google_vendor_ids,
googleVendorsWithConsent:
google_vendor_names,
gdpr: tcData ? tcData.gdprApplies : false,
publisherConsents: publisher_consents,
publisherLegitimateInterests:
publisher_legitimate_interests,
purposeConsents: purpose_consents,
purposeLegitimateInterests:
purpose_legitimate_interests,
},
});
},
);
}
}, 100);
}
/**
* CCPA footer message.
*/
function ccpa_footerMsg(tcData) {
window.__uspapi("uspPing", 1, function (obj, status) {
var footer_msg = document.getElementById("choice-footer-msg"); // get the footer container for our CCPA message
if (status && obj.mode.includes("USP") && footer_msg !== null) {
footer_msg.innerHTML =
footer_msg.innerHTML +
"We use cookies" +
" and other data collection technologies" +
" to provide the best experience for our customers. You may request" +
" that your data not be shared with third parties here: " +
'<a href="#" onclick="window.__uspapi(\'displayUspUi\');"' +
">Do Not Sell My Data</a>" +
".";
// Add the 'ccpa-msg-added' class to the container for post message add styling.
footer_msg.classList.add("ccpa-msg-added");
window.__uspapi("setUspDftData", 1, function (obj, status) {
if (!status) {
console.log("Error: USP string not updated!");
}
});
}
});
}
// Only get the IAB and Non-IAB vendor lists if the the Data layer push functionality
// is enabled, otherwise we do not need the vendor lists.
window.__tcfapi(
"addEventListener",
2,
function (getConfig, listenerSuccess) {
vendors_getIABVendorList(); // Get global IAB vendor list
vendors_getGoogleVendorList(); // Get google vendor list
vendors_getNonIABVendorList(); // Get UTID specific Non-IAB vendors
},
);
// CCPA
ccpa_footerMsg();
// Add our main listener.
window.__tcfapi(
"addEventListener",
2,
function (tcData, listenerSuccess) {
if (listenerSuccess) {
/**
* User Visits:
* 1st visit/no cookie = 'cmpuishown' called and then 'useractioncomplete' after user make their selection
* Repeat visit/has cookie = only 'tcloaded' is called as the UI does not show unless the user clicks to show
*/
switch (tcData ? tcData.eventStatus : null) {
case "cmpuishown":
// Data Layer
dlSend_tcLoaded(tcData);
break;
case "tcloaded":
// Data Layer
if (tcData ? tcData.gdprApplies : false) {
dlSend_tcLoaded(tcData);
dlSend_consentData(tcData);
}
break;
case "useractioncomplete":
// Data Layer
dlSend_consentData(tcData);
break;
}
}
},
);
})();
})();
})();</script> <link rel="apple-touch-icon" sizes="180x180" href="https://www.techrepublic.com/apple-touch-icon.png"> <link rel="manifest" href="https://www.techrepublic.com/site.webmanifest"> <link rel="alternate" type="application/rss+xml" title="TechRepublic » Feed" href="https://www.techrepublic.com/feed/"><link rel="alternate" type="application/rss+xml" title="TechRepublic » Comments Feed" href="https://www.techrepublic.com/comments/feed/"><style>:root {
--theme-primary: #086bdb;
--theme-secondary: #044997;
--theme-tertiary: #f54d16;
--theme-quaternary: #ffffff;
--theme-primary-foreground: #ffffff;
--theme-secondary-foreground: #ffffff;
--theme-tertiary-foreground: #ffffff;
--theme-quaternary-foreground: #044997;
--theme-foreground: black;
}</style> <script>window.__authProviders={"facebook":false,"linkedin":false}</script> <script type="application/ld+json">{"@context":"https://schema.org","@graph":[{"@type":"WebSite","@id":"https://www.techrepublic.com/#website","url":"https://www.techrepublic.com/","name":"TechRepublic","description":"Providing IT professionals with a unique blend of original content, peer-to-peer advice from the largest community of IT leaders on the Web.","publisher":{"@id":"https://www.techrepublic.com/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://www.techrepublic.com/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https://www.techrepublic.com/#organization","name":"TechRepublic","url":"https://www.techrepublic.com/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https://www.techrepublic.com/#/schema/logo/image/","url":"https://assets.techrepublic.com/uploads/2026/01/techrepublic.png","contentUrl":"https://assets.techrepublic.com/uploads/2026/01/techrepublic.png","width":512,"height":119,"caption":"TechRepublic"},"image":{"@id":"https://www.techrepublic.com/#/schema/logo/image/"},"sameAs":["https://www.facebook.com/TechRepublic","https://x.com/techrepublic","https://www.linkedin.com/company/techrepublic","https://www.youtube.com/techrepublic","https://www.pinterest.com/techrepublic/","/rssfeeds/"],"parentOrganization":{"@type":"Organization","name":"TechnologyAdvice","url":"https://technologyadvice.com/"}}]}</script><script>(function(){const targeting = {"env":"prod","stage":"prod","url":"www.techrepublic.com/article/how-to-set-up-high-availability-storage-with-glusterfs-on-ubuntu-18-04/","hostname":"www.techrepublic.com","edge_country":"US","cid":"how-to-set-up-high-availability-storage-with-glusterfs-on-ubuntu-18-04","path":"sites,techrepublic.com,article,how-to-set-up-high-availability-storage-with-glusterfs-on-ubuntu-18-04","kw":"","category":"data-centers,open-source","topic":"data-centers,open-source","tax":"","ptype":"article","news":"no","author":"jack-wallen"};
window.dataLayer = window.dataLayer || []
window.dataLayer.push(
Object.fromEntries(
Object.entries(targeting).map(([k, v]) => [`ad_${k}`, v]),
),
)
})();</script><script>
;(() => {
const campaign = new URLSearchParams(window.location.search).get(
"adTargeting_campaign",
)
if (!campaign) return
window.googletag = window.googletag || { cmd: [] }
window.googletag.cmd.push(() => {
window.googletag.setConfig({ targeting: { campaign } })
})
})()
</script><script>(function(){const sampleRate = 1;
const debug = false;
const targeting = {"env":"prod","stage":"prod","url":"www.techrepublic.com/article/how-to-set-up-high-availability-storage-with-glusterfs-on-ubuntu-18-04/","hostname":"www.techrepublic.com","edge_country":"US","cid":"how-to-set-up-high-availability-storage-with-glusterfs-on-ubuntu-18-04","path":"sites,techrepublic.com,article,how-to-set-up-high-availability-storage-with-glusterfs-on-ubuntu-18-04","kw":"","category":"data-centers,open-source","topic":"data-centers,open-source","tax":"","ptype":"article","news":"no","author":"jack-wallen"};
(() => {
// Same-origin, site-aware base (mirrors getSiteAwarePath): dev/preview
// serve sites under /sites/{domain}/…; prod serves each on its own host.
let base = "/api/ado";
if (location.pathname.startsWith("/sites/")) {
const p = location.pathname.split("/");
if (p.length >= 3) base = "/sites/" + p[2] + base;
}
const uuid = () =>
(crypto.randomUUID && crypto.randomUUID()) ||
String(Date.now()) + Math.random().toString(16).slice(2);
const pageviewId = uuid();
let sessionId;
try {
sessionId = sessionStorage.getItem("ado_sid");
if (!sessionId) {
sessionId = uuid();
sessionStorage.setItem("ado_sid", sessionId);
}
} catch (_) {
sessionId = "";
}
// --- Unified transport: buffer typed events, flush one batch. ---
// Trailing debounce: each event (re)arms a short idle timer, so a
// burst of N events coalesces into ONE sendBeacon fired shortly after
// the burst ends (e.g. 10 events over 5s → 1 request). A max-age cap
// guarantees a continuous stream still flushes at least every
// FLUSH_MAX_MS, a size cap guards the sendBeacon payload limit, and
// the buffer is always flushed on tab-hide/unload so nothing is lost.
const FLUSH_IDLE_MS = 1000; // flush this long after the last event
const FLUSH_MAX_MS = 5000; // never hold a buffered event longer
const MAX_BATCH = 20;
let buffer = [];
let timer = null;
let firstAt = 0;
const flush = () => {
if (timer) {
clearTimeout(timer);
timer = null;
}
firstAt = 0;
if (!buffer.length) return;
const events = buffer;
buffer = [];
try {
const body = new Blob([JSON.stringify({ events })], {
type: "text/plain",
});
navigator.sendBeacon(base + "/collect/", body);
if (debug) console.log("[ado] flush", events);
} catch (e) {
if (debug) console.warn("[ado] flush failed", e);
}
};
const push = (event) => {
buffer.push(event);
if (buffer.length >= MAX_BATCH) {
flush();
return;
}
const now = Date.now();
if (!firstAt) firstAt = now;
// Idle debounce, clamped so total hold never exceeds FLUSH_MAX_MS.
const delay = Math.max(
0,
Math.min(FLUSH_IDLE_MS, FLUSH_MAX_MS - (now - firstAt)),
);
if (timer) clearTimeout(timer);
timer = setTimeout(flush, delay);
};
window._ado = {
pageview_id: pageviewId,
session_id: sessionId,
push,
flush,
};
addEventListener("visibilitychange", () => {
if (document.visibilityState === "hidden") flush();
});
addEventListener("pagehide", flush);
const canonical =
document.querySelector('link[rel="canonical"]')?.href ||
location.href;
// --- Framing detection -------------------------------------------
// Who, if anyone, has this page in an iframe — used to spot third
// parties embedding our content.
//
// `location.ancestorOrigins` is the browser's own list of ancestor
// frame origins (parent first, outermost last; Chromium + Safari).
// Unlike `document.referrer` it can't be blanked by the framer's
// Referrer-Policy and it does NOT drift to our own previous URL when
// the framed page navigates inside the frame. The referrer is only
// used to add path detail on top of an origin the ancestor list has
// already confirmed, or as the sole signal on Firefox, which has no
// ancestorOrigins. Sandboxed/opaque ancestors report "null".
let iframeReferrer = "";
try {
if (window.top !== window.self) {
const ancestors = location.ancestorOrigins;
const outermost =
ancestors && ancestors.length
? ancestors[ancestors.length - 1]
: "";
const referrerOrigin = document.referrer
? new URL(document.referrer).origin
: "";
if (outermost && outermost !== "null") {
iframeReferrer =
referrerOrigin === outermost
? document.referrer
: outermost;
} else if (
referrerOrigin &&
referrerOrigin !== location.origin
) {
// A same-origin referrer inside a frame is our own
// previous page, not an embedder — never report it.
iframeReferrer = document.referrer;
}
// Our own frames (self-embeds, previews) aren't embedding.
if (iframeReferrer.indexOf(location.origin) === 0) {
iframeReferrer = "";
}
}
} catch (_) {
iframeReferrer = "";
}
// Same edge country the astro-proxy injected into the GPT
// `edge_country` targeting → keeps the event stream aligned with GAM.
let adoCountry = String(targeting.edge_country || "");
if (adoCountry.indexOf("{{") === 0) adoCountry = "";
const ctx = {
site: (window._vars && window._vars.domain) || location.hostname,
hostname: location.hostname,
path: location.pathname,
canonical_url: canonical,
post_id: String(targeting.post_id || ""),
category: String(targeting.category || ""),
country: adoCountry,
};
// Pageview (always sent).
push({
type: "pageview",
client_event_ts: Date.now(),
pageview_id: pageviewId,
session_id: sessionId,
page_type: String(targeting.ptype || ""),
referrer: document.referrer || "",
iframe_referrer: iframeReferrer,
...ctx,
});
// Per-slot refresh counter.
const refreshCount = Object.create(null);
const adEvent = (eventType, event) => {
if (sampleRate < 1 && Math.random() >= sampleRate) return;
const slot = event.slot;
const elId = slot.getSlotElementId();
const size = Array.isArray(event.size)
? event.size.join("x")
: event.size != null
? String(event.size)
: "";
const resp = slot.getResponseInformation
? slot.getResponseInformation()
: null;
const idx =
eventType === "slot_render_ended"
? (refreshCount[elId] = (refreshCount[elId] || 0) + 1) - 1
: refreshCount[elId]
? refreshCount[elId] - 1
: 0;
push({
type: "ad_event",
event_type: eventType,
client_event_ts: Date.now(),
pageview_id: pageviewId,
session_id: sessionId,
ad_unit_path: slot.getAdUnitPath(),
slot_element_id: elId,
slot_size: size,
is_empty: !!event.isEmpty,
refresh_index: idx,
line_item_id: resp ? String(resp.lineItemId ?? "") : "",
creative_id: resp ? String(resp.creativeId ?? "") : "",
advertiser_id: resp ? String(resp.advertiserId ?? "") : "",
campaign_id: resp ? String(resp.campaignId ?? "") : "",
...ctx,
});
};
window.googletag = window.googletag || { cmd: [] };
window.googletag.cmd.push(() => {
window.googletag
.pubads()
.addEventListener("slotRenderEnded", (e) =>
adEvent("slot_render_ended", e),
);
window.googletag
.pubads()
.addEventListener("impressionViewable", (e) =>
adEvent("impression_viewable", e),
);
});
})();
})();</script> <script>(function(){const heartbeatMs = 5000;
const idleMs = 30000;
const snapshotMs = 20000;
const targeting = {"env":"prod","stage":"prod","url":"www.techrepublic.com/article/how-to-set-up-high-availability-storage-with-glusterfs-on-ubuntu-18-04/","hostname":"www.techrepublic.com","edge_country":"US","cid":"how-to-set-up-high-availability-storage-with-glusterfs-on-ubuntu-18-04","path":"sites,techrepublic.com,article,how-to-set-up-high-availability-storage-with-glusterfs-on-ubuntu-18-04","kw":"","category":"data-centers,open-source","topic":"data-centers,open-source","tax":"","ptype":"article","news":"no","author":"jack-wallen"};
const debug = false;
(() => {
// Don't instrument headless/automation traffic.
if (navigator.webdriver) return;
// Requires the beacon's transport (same observability gate).
const ado = window._ado;
if (!ado || typeof ado.push !== "function") return;
const pageviewId = ado.pageview_id;
const sessionId = ado.session_id;
const uuid = () =>
(crypto.randomUUID && crypto.randomUUID()) ||
String(Date.now()) + Math.random().toString(16).slice(2);
const str = (v) => (v == null ? "" : String(v));
// --- Page context (stable for the pageview; per-segment path/post_id
// are tracked separately since they swap on infinite-scroll). ---
const canonical =
document.querySelector('link[rel="canonical"]')?.href ||
location.href;
let country = str(targeting.edge_country);
if (country.indexOf("{{") === 0) country = "";
const ctx = {
site: (window._vars && window._vars.domain) || location.hostname,
hostname: location.hostname,
canonical_url: canonical,
category: str(targeting.category),
country,
};
const referrer = document.referrer || "";
// --- Loyalty: durable, consent-gated visitor id. Respect Global
// Privacy Control; fall back to session-only when storage is blocked.
// (Wire to the site CMP here for finer-grained consent.) ---
let visitorId = "";
let isNewVisitor = 0;
try {
if (navigator.globalPrivacyControl !== true) {
visitorId = localStorage.getItem("ado_vid") || "";
if (!visitorId) {
visitorId = uuid();
localStorage.setItem("ado_vid", visitorId);
isNewVisitor = 1;
}
}
} catch (_) {
visitorId = "";
}
// --- Per-post segments. segment_id = `${pageview_id}:${post_id}`, so
// scrolling back into an earlier article RESUMES its segment. ---
const segments = new Map();
let activeSeg = null;
let activeSince = null; // ms timestamp while accruing, else null
let lastActivity = Date.now();
let sinceSnapshot = 0;
const accruing = () =>
document.visibilityState === "visible" &&
Date.now() - lastActivity < idleMs;
function flushAccrual() {
if (activeSince !== null && activeSeg) {
const now = Date.now();
activeSeg.engagedSeconds += (now - activeSince) / 1000;
activeSince = now;
}
}
function setAccruing(on) {
flushAccrual();
activeSince = on ? Date.now() : null;
}
function segFor(pid, category, path) {
let seg = segments.get(pid);
if (!seg) {
seg = {
post_id: pid,
segment_id: pageviewId + ":" + pid,
category: str(category) || ctx.category,
path: str(path) || location.pathname,
engagedSeconds: 0,
maxScrollPct: 0,
reachedEnd: 0,
seq: 0,
};
segments.set(pid, seg);
} else {
if (category != null && str(category)) seg.category = str(category);
if (path != null && str(path)) seg.path = str(path);
}
return seg;
}
// Deepest scroll into the active article + end detection, reusing the
// h1[infiniscroll-id] / [data-type='infiniscroll-break'] geometry.
function measureActive() {
if (!activeSeg) return;
const headers = Array.prototype.slice.call(
document.querySelectorAll("h1[infiniscroll-id]"),
);
const header =
document.querySelector(
'h1[infiniscroll-id="' + activeSeg.post_id + '"]',
) || headers[0];
if (!header) return;
const y = window.scrollY;
const toY = (el) => el.getBoundingClientRect().top + y;
const idx = headers.indexOf(header);
const breaks = document.querySelectorAll(
"[data-type='infiniscroll-break']",
);
const bottomEl = breaks[idx] || headers[idx + 1];
const top = toY(header);
const bottom = bottomEl
? toY(bottomEl)
: document.documentElement.scrollHeight;
let pct;
if (bottom - top <= window.innerHeight) {
// Article fits the viewport → readable without scrolling.
pct = 100;
} else {
pct = Math.round(
Math.min(Math.max((y - top) / (bottom - top), 0), 1) * 100,
);
}
if (pct > activeSeg.maxScrollPct) activeSeg.maxScrollPct = pct;
// End reached when the article's bottom boundary enters the viewport.
if (bottom <= y + window.innerHeight + 4) activeSeg.reachedEnd = 1;
}
function snapshot(seg) {
if (!seg) return;
seg.seq += 1;
ado.push({
type: "engagement",
client_event_ts: Date.now(),
pageview_id: pageviewId,
session_id: sessionId,
segment_id: seg.segment_id,
post_id: seg.post_id,
site: ctx.site,
hostname: ctx.hostname,
path: seg.path,
canonical_url: ctx.canonical_url,
category: seg.category,
country: ctx.country,
referrer: referrer,
visitor_id: visitorId,
is_new_visitor: isNewVisitor,
engaged_seconds: Math.round(seg.engagedSeconds),
max_scroll_pct: seg.maxScrollPct,
reached_end: seg.reachedEnd,
seq: seg.seq,
});
if (debug) console.log("[ado] engagement", seg.segment_id, seg);
}
function switchTo(pid, category, path) {
if (!pid) return;
if (activeSeg && activeSeg.post_id === pid) {
segFor(pid, category, path); // refresh path/category
return;
}
setAccruing(false); // bank time to the leaving segment
if (activeSeg) snapshot(activeSeg); // flush leaving segment state
activeSeg = segFor(pid, category, path);
lastActivity = Date.now(); // a transition counts as activity
setAccruing(accruing());
measureActive();
}
// Authoritative active-article signal from InfiniScroll transitions.
document.addEventListener("ado:article", (e) => {
const d = (e && e.detail) || {};
switchTo(str(d.post_id), d.category, d.path);
});
// Activity + scroll.
const bump = () => {
const wasAccruing = activeSince !== null;
lastActivity = Date.now();
if (!wasAccruing && document.visibilityState === "visible") {
setAccruing(true);
}
};
let scrollThrottled = false;
const onScroll = () => {
bump();
if (scrollThrottled) return;
scrollThrottled = true;
setTimeout(() => {
scrollThrottled = false;
measureActive();
}, 200);
};
addEventListener("scroll", onScroll, { passive: true });
["pointermove", "keydown", "touchstart", "click"].forEach((ev) =>
addEventListener(ev, bump, { passive: true }),
);
// Visibility + bfcache lifecycle. Beacon also flushes on hide; we push
// the final engagement snapshot then force a flush so it isn't stranded.
function finalizeAndFlush() {
setAccruing(false);
if (activeSeg) snapshot(activeSeg);
if (typeof ado.flush === "function") ado.flush();
}
addEventListener("visibilitychange", () => {
if (document.visibilityState === "hidden") {
finalizeAndFlush();
} else {
lastActivity = Date.now();
setAccruing(accruing());
}
});
addEventListener("pagehide", finalizeAndFlush);
addEventListener("pageshow", (e) => {
if (e.persisted) {
lastActivity = Date.now();
setAccruing(accruing());
}
});
// Heartbeat: re-evaluate idle, remeasure, and drop an insurance
// snapshot so long single-article reads / crashes aren't lost.
setInterval(() => {
setAccruing(accruing());
measureActive();
sinceSnapshot += heartbeatMs;
if (sinceSnapshot >= snapshotMs && activeSeg) {
sinceSnapshot = 0;
flushAccrual();
snapshot(activeSeg);
}
}, heartbeatMs);
// Seed the landing article's segment (post pages only).
const landingPid = str(targeting.post_id);
if (landingPid) {
switchTo(landingPid, ctx.category, location.pathname);
}
})();
})();</script> <title>How to set up high availability storage with GlusterFS on Ubuntu 18.04 - TechRepublic</title><meta name="title" content="How to set up high availability storage with GlusterFS on Ubuntu 18.04 - TechRepublic"><meta name="robots" content="index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1"><meta property="og:locale" content="en_US"><meta property="og:type" content="article"><meta property="og:title" content="How to set up high availability storage with GlusterFS on Ubuntu 18.04 - TechRepublic"><meta property="og:description" content="If you need to set up a distributed file system in your data center, you can't go wrong with GlusterFS. Jack Wallen shows you how."><meta property="og:url" content="https://www.techrepublic.com/article/how-to-set-up-high-availability-storage-with-glusterfs-on-ubuntu-18-04/"><meta property="og:site_name" content="TechRepublic"><meta property="article:publisher" content="https://www.facebook.com/TechRepublic/"><meta property="article:published_time" content="2018-08-08T20:40:00+00:00"><meta property="article:modified_time" content="2022-04-26T19:53:22+00:00"><meta name="author" content="Jack Wallen"><meta property="og:image" content="https://assets.techrepublic.com/uploads/2016/06/datacenterhero.jpg?f=jpeg"><meta property="og:image:width" content="620"><meta property="og:image:height" content="485"><meta property="og:image:type" content="image/jpeg"><meta name="twitter:card" content="summary_large_image"><meta name="twitter:title" content="How to set up high availability storage with GlusterFS on Ubuntu 18.04 - TechRepublic"><meta name="twitter:description" content="If you need to set up a distributed file system in your data center, you can't go wrong with GlusterFS. Jack Wallen shows you how."><meta name="twitter:image" content="https://assets.techrepublic.com/uploads/2016/06/datacenterhero.jpg?f=jpeg"><meta name="twitter:site" content="@techrepublic"><meta name="twitter:label1" content="Written by"><meta name="twitter:data1" content="Jack Wallen"><meta name="twitter:label2" content="Est. reading time"><meta name="twitter:data2" content="4 minutes"><link rel="canonical" href="https://www.techrepublic.com/article/how-to-set-up-high-availability-storage-with-glusterfs-on-ubuntu-18-04/"><script type="application/ld+json" class="yoast-schema-graph">{"@context":"https://schema.org","@graph":[{"@type":"WebPage","@id":"https://www.techrepublic.com/article/how-to-set-up-high-availability-storage-with-glusterfs-on-ubuntu-18-04/","url":"https://www.techrepublic.com/article/how-to-set-up-high-availability-storage-with-glusterfs-on-ubuntu-18-04/","name":"How to set up high availability storage with GlusterFS on Ubuntu 18.04 - TechRepublic","isPartOf":{"@id":"https://www.techrepublic.com/#website"},"primaryImageOfPage":{"@id":"https://www.techrepublic.com/article/how-to-set-up-high-availability-storage-with-glusterfs-on-ubuntu-18-04/#primaryimage"},"image":{"@id":"https://www.techrepublic.com/article/how-to-set-up-high-availability-storage-with-glusterfs-on-ubuntu-18-04/#primaryimage"},"thumbnailUrl":"https://assets.techrepublic.com/uploads/2016/06/datacenterhero.jpg","datePublished":"2018-08-08T20:40:00+00:00","dateModified":"2022-04-26T19:53:22+00:00","author":{"@id":"https://www.techrepublic.com/#/schema/person/4a9a6ef87291be6e75ad9b7f39463289"},"breadcrumb":{"@id":"https://www.techrepublic.com/article/how-to-set-up-high-availability-storage-with-glusterfs-on-ubuntu-18-04/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https://www.techrepublic.com/article/how-to-set-up-high-availability-storage-with-glusterfs-on-ubuntu-18-04/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https://www.techrepublic.com/article/how-to-set-up-high-availability-storage-with-glusterfs-on-ubuntu-18-04/#primaryimage","url":"https://assets.techrepublic.com/uploads/2016/06/datacenterhero.jpg","contentUrl":"https://assets.techrepublic.com/uploads/2016/06/datacenterhero.jpg","width":620,"height":485,"caption":"Image: Jack Wallen"},{"@type":"BreadcrumbList","@id":"https://www.techrepublic.com/article/how-to-set-up-high-availability-storage-with-glusterfs-on-ubuntu-18-04/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://www.techrepublic.com/"},{"@type":"ListItem","position":2,"name":"How to set up high availability storage with GlusterFS on Ubuntu 18.04"}]},{"@type":"WebSite","@id":"https://www.techrepublic.com/#website","url":"https://www.techrepublic.com/","name":"TechRepublic","description":"News, Tips, and Advice for Technology Professionals","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://www.techrepublic.com/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https://www.techrepublic.com/#/schema/person/4a9a6ef87291be6e75ad9b7f39463289","name":"Jack Wallen","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https://www.techrepublic.com/#/schema/person/image/","url":"https://secure.gravatar.com/avatar/26000e280009ee0577eaa3ae5aa88093?s=96&d=mm&r=g","contentUrl":"https://secure.gravatar.com/avatar/26000e280009ee0577eaa3ae5aa88093?s=96&d=mm&r=g","caption":"Jack Wallen"},"description":"Jack Wallen is an award-winning writer for TechRepublic, The New Stack, and Linux New Media. He's covered a variety of topics for over twenty years and is an avid promoter of open source. For more news about Jack Wallen, visit his website jackwallen.com.","url":"https://www.techrepublic.com/meet-the-team/us/jack-wallen/"}]}</script> <script type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://www.techrepublic.com/"},{"@type":"ListItem","position":2,"name":"Data Centers","item":"https://www.techrepublic.com/topic/data-centers/"}]}</script> <link rel="stylesheet" href="https://www.techrepublic.com/astrostatic/c733c3a8/_astro/index.xu0Y85Bc.css">
<style>@media(max-width:767px){.cnx-pinned-wrapper{margin-top:10px}}@media(min-width:768px){.cnx-float.cnx-float-position-bottom{transform:translateY(-100px)!important}}.cnx-main-container.cnx-in-desktop{max-width:640px;max-height:360px}.instaread-player-slot[data-astro-cid-5riuvn2h]{height:160px;width:100%}@media only screen and (max-width:650px){.instaread-player-slot[data-astro-cid-5riuvn2h]{height:236px}}.article-contents[data-astro-cid-7jion4xf].gated{overflow:hidden;position:relative;.toc-container{display:none}}/*! tailwindcss v4.3.0 | MIT License | https://tailwindcss.com */.video-transcript-body p{margin-bottom:1em;line-height:1.6}.video-transcript-body p:last-child{margin-bottom:0}.video-transcript-note{opacity:.7;font-size:.8125rem;font-style:italic}.featured-video iframe{width:100%;height:100%}.sponsored>p,.sponsored>h2,.sponsored>h3,.sponsored>h4,.sponsored>h5,.sponsored>h6,.sponsored>ul,.sponsored>ol,.sponsored>dl,.sponsored>pre{padding-left:calc(var(--spacing,.25rem) * 10)}@media(min-width:64rem){.sponsored>p,.sponsored>h2,.sponsored>h3,.sponsored>h4,.sponsored>h5,.sponsored>h6,.sponsored>ul,.sponsored>ol,.sponsored>dl,.sponsored>pre{padding-left:calc(var(--spacing,.25rem) * 24)}}
:root{--skybox-reserve: 18.75vw}@media(min-width:768px){:root{--skybox-reserve: 90px}}[data-ad-slot=skybox]{min-height:var(--skybox-reserve)}[data-ad-slot=skybox][data-loaded],[data-ad-slot=skybox][data-empty]{min-height:0}[data-ad-slot=skybox]:not([data-empty])~#main-navigation{top:var(--skybox-reserve)}
</style>
<style>/*! tailwindcss v4.3.0 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style:solid;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-font-weight:initial;--tw-content:"";--tw-tracking:initial}}}@layer components{.icp-widget .icp-product-card{gap:calc(var(--spacing,.25rem) * 4);border-radius:var(--radius-lg,.5rem);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-zinc-200,oklch(92% .004 286.32));padding:calc(var(--spacing,.25rem) * 4);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);background-color:var(--color-white,#fff);grid-template-columns:repeat(1,minmax(0,1fr));display:grid;container-type:inline-size}.icp-widget .icp-product-rank,.icp-widget .icp-product-name{--tw-font-weight:var(--font-weight-bold,700);font-weight:var(--font-weight-bold,700);color:var(--color-secondary)}.icp-widget .icp-product-rank:after{--tw-content:".";content:var(--tw-content)}.icp-widget .icp-link:hover .icp-product-rank,.icp-widget .icp-link:hover .icp-product-name{color:var(--color-primary)}.icp-widget .icp-product-logo{margin-inline:auto;margin-block:calc(var(--spacing,.25rem) * 2);border-radius:.25rem;justify-content:center;align-items:center;width:100%}.icp-widget .icp-product-logo.loaded{background-color:#0000;background-image:none;height:100px;display:flex}.icp-widget .icp-product-logo img{object-fit:contain;width:auto;height:100%}.icp-widget .icp-product-cta{justify-content:center;align-items:center;display:flex}.icp-widget .icp-product-cta .button{margin-block:calc(var(--spacing,.25rem) * 4);cursor:pointer;border-style:var(--tw-border-style);width:fit-content;height:min-content;min-height:30px;padding-inline:calc(var(--spacing,.25rem) * 4);padding-block:calc(var(--spacing,.25rem) * 2);font-family:var(--font-mono,"IBM Plex Mono", monospace);--tw-font-weight:var(--font-weight-semibold,600);font-size:12px;line-height:16px;font-weight:var(--font-weight-semibold,600);--tw-tracking:1.2px;letter-spacing:1.2px;text-transform:uppercase;transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function,cubic-bezier(.4, 0, .2, 1)));transition-duration:var(--tw-duration,var(--default-transition-duration,.15s));border-width:1px;border-color:var(--color-primary);background-color:var(--color-primary);color:var(--color-primary-foreground);border-radius:3.40282e38px;justify-content:center;align-items:center;gap:10px}.icp-widget .icp-product-cta .button:hover{border-color:var(--color-tertiary);background-color:var(--color-tertiary)}.icp-widget .icp-product-cta .button.outline{border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-primary);color:var(--color-primary);background-color:#0000}.icp-widget .icp-product-cta .button.outline:hover{border-color:var(--color-primary);background-color:var(--color-primary);color:var(--color-white,#fff)}.icp-widget .icp-product-attr{row-gap:calc(var(--spacing,.25rem) * 0);min-height:auto;font-size:var(--text-xs,.75em);line-height:var(--tw-leading,var(--text-xs--line-height,calc(1 / .75)));margin-top:auto}@media(min-width:48rem){.icp-widget .icp-product-attr{min-height:175px}}@container (min-width:600px){.icp-widget .icp-product-attr{min-height:calc(var(--spacing,.25rem) * 0)}}.icp-widget .icp-product-attr>div{column-gap:calc(var(--spacing,.25rem) * 2);border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--color-gray-200,oklch(92.8% .006 264.531));padding-block:calc(var(--spacing,.25rem) * 1)}.icp-widget .icp-product-attr>div:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.icp-widget .icp-product-attr>div dt{width:calc(var(--spacing,.25rem) * 26);--tw-font-weight:var(--font-weight-light,300);font-weight:var(--font-weight-light,300)}.icp-widget .icp-product-attr>div dd{color:var(--color-gray-700,oklch(37.3% .034 259.733))}.icp-widget .icp-widget-disclaimer .tooltip-label{margin-left:calc(var(--spacing,.25rem) * 2);font-size:var(--text-xs,.75em);line-height:var(--tw-leading,var(--text-xs--line-height,calc(1 / .75)));color:var(--color-gray-500,oklch(55.1% .027 264.364));flex-shrink:0}}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-content{syntax:"*";inherits:false;initial-value:""}@property --tw-tracking{syntax:"*";inherits:false}
</style>
<style>.checkbox input{margin-right:.75rem;cursor:pointer;-webkit-appearance:none;appearance:none;background-color:#fff;margin:2px;font:inherit;color:currentColor;width:1.5rem;height:1.5rem;min-width:1.5rem;min-height:1.5rem;border-radius:.4em;transform:translateY(-.075em);display:grid;place-content:center}.checkbox input:before{content:"";width:.65em;height:.65em;clip-path:polygon(14% 44%,0 65%,50% 100%,100% 16%,80% 0%,43% 62%);transform:scale(0);transform-origin:bottom left;transition:.12s transform ease-in-out;box-shadow:inset 1em 1em var(--color-primary);background-color:CanvasText}.checkbox input:checked:before{transform:scale(1)}.checkbox input:focus{outline:max(2px,.15em) solid var(--color-primary);outline-offset:max(2px,.15em)}.expand-enter-active,.expand-leave-active{transition:all .3s ease-in-out;max-height:200px}.expand-enter-from,.expand-leave-to{max-height:0;padding-top:0;padding-bottom:0;opacity:0}.expand-enter-to,.expand-leave-from{max-height:200px;opacity:1}
</style>
<style>@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-font-weight:initial;--tw-border-style:solid;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000}}}.icp-product-rank[data-astro-cid-574xbxas],.icp-product-name[data-astro-cid-574xbxas]{--tw-font-weight:var(--font-weight-normal,400);font-weight:var(--font-weight-normal,400);color:var(--color-primary)}.icp-product-rank[data-astro-cid-574xbxas]:after{display:none}.icp-link[data-astro-cid-574xbxas]:hover .icp-product-name{color:var(--color-tertiary)}.icp-product-card[data-astro-cid-574xbxas]{border-style:var(--tw-border-style);border-width:0;border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--color-zinc-200,oklch(92% .004 286.32));padding-inline:calc(var(--spacing,.25rem) * 0);padding-block:calc(var(--spacing,.25rem) * 2);--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);border-radius:0}.icp-product-card[data-astro-cid-574xbxas]:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.icp-product-card[data-astro-cid-574xbxas] a[data-astro-cid-574xbxas]{align-items:center;gap:calc(var(--spacing,.25rem) * 2);display:flex}.icp-product-logo[data-astro-cid-574xbxas]{margin:calc(var(--spacing,.25rem) * 0);background-color:#0000;width:64px;height:64px}.icp-product-rank[data-astro-cid-574xbxas]{background-color:var(--color-primary);width:24px;height:24px;color:var(--color-primary-foreground);border-radius:3.40282e38px;justify-content:center;align-items:center;display:flex}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}/*! tailwindcss v4.3.0 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial}}}.icp-widget-head[data-astro-cid-r2q5pr5m]{margin-bottom:calc(var(--spacing,.25rem) * 0);border-bottom:1px solid #0003;justify-content:space-between;align-items:center;position:relative}.icp-widget-headline[data-astro-cid-r2q5pr5m]{text-align:center;--tw-leading:var(--leading-normal,1.5);font-size:1rem;line-height:var(--leading-normal,1.5);--tw-font-weight:var(--font-weight-normal,400);font-weight:var(--font-weight-normal,400);--tw-tracking:1px;letter-spacing:1px;color:var(--color-primary-foreground);margin-inline:calc(var(--spacing,.25rem) * 4);margin-bottom:calc(var(--spacing,.25rem) * 0);border-top-left-radius:var(--radius-lg,.5rem);border-top-right-radius:var(--radius-lg,.5rem);background-color:var(--color-primary);width:100%;padding:calc(var(--spacing,.25rem) * 2);text-transform:capitalize}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}
</style>
<style>.slide-right-enter-active[data-v-1572bf39],.slide-right-leave-active[data-v-1572bf39]{transition:all .3s}.slide-right-enter-from[data-v-1572bf39],.slide-right-leave-to[data-v-1572bf39]{transform:translate(-100vw);opacity:0}.slide-left-enter-active[data-v-1572bf39],.slide-left-leave-active[data-v-1572bf39]{transition:all .3s}.slide-left-enter-from[data-v-1572bf39],.slide-left-leave-to[data-v-1572bf39]{transform:translate(100vw);opacity:0}.submenu-content [data-submenu][data-v-1572bf39]{display:none}.submenu-content [data-submenu].active[data-v-1572bf39]{display:block}#site-navigation:not([data-nav-computed]){visibility:hidden;animation:nav-fallback 0s 1.5s forwards}@keyframes nav-fallback{to{visibility:visible}}.slide-enter-active[data-v-53819b21],.slide-leave-active[data-v-53819b21]{transition:all .3s}.slide-enter-from[data-v-53819b21],.slide-leave-to[data-v-53819b21]{transform:translateY(20px);opacity:0}#main-navigation[data-astro-cid-sj5ssvhz]{transition:transform .3s ease-in-out,background-color .3s ease-in-out}[data-astro-cid-sj5ssvhz][data-rac-overlay] [data-astro-cid-sj5ssvhz]::-webkit-scrollbar{width:6px}[data-astro-cid-sj5ssvhz][data-rac-overlay] [data-astro-cid-sj5ssvhz]::-webkit-scrollbar-track{background:transparent}[data-astro-cid-sj5ssvhz][data-rac-overlay] [data-astro-cid-sj5ssvhz]::-webkit-scrollbar-thumb{background:#fff3;border-radius:3px}[data-astro-cid-sj5ssvhz][data-rac-overlay] [data-astro-cid-sj5ssvhz]::-webkit-scrollbar-thumb:hover{background:#fff6}[data-astro-cid-sj5ssvhz][data-rac-overlay]{scrollbar-color:rgba(255,255,255,.2) transparent;scrollbar-width:thin}
#choice-footer-msg a:hover{text-decoration:underline}.raconteur-net button,.raconteur-net button.rounded-none{border-radius:0}.raconteur-net button.rounded-sm{border-radius:var(--radius-sm, .125rem)}.raconteur-net button.rounded{border-radius:var(--radius, .25rem)}.raconteur-net button.rounded-md{border-radius:var(--radius-md, .375rem)}.raconteur-net button.rounded-lg{border-radius:var(--radius-lg, .5rem)}.raconteur-net button.rounded-xl{border-radius:var(--radius-xl, .75rem)}.raconteur-net button.rounded-2xl{border-radius:var(--radius-2xl, 1rem)}.raconteur-net button.rounded-3xl{border-radius:var(--radius-3xl, 1.5rem)}.raconteur-net button.rounded-full{border-radius:9999px}
</style>
<style>/*! tailwindcss v4.3.0 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-outline-style:solid;--tw-content:"";--tw-border-style:solid;--tw-font-weight:initial;--tw-leading:initial}}}a[data-astro-cid-tdou77qi]:hover,a[data-astro-cid-tdou77qi]:focus{color:#2a6496;text-decoration-line:underline}a[data-astro-cid-tdou77qi]:active,a[data-astro-cid-tdou77qi]:hover{outline-style:var(--tw-outline-style);outline-width:0}#ftl-footer[data-astro-cid-tdou77qi]{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:Helvetica Neue,Helvetica,Arial,sans-serif!important}@media(min-width:768px){.container1[data-astro-cid-tdou77qi]{width:750px}}@media(min-width:992px){.container1[data-astro-cid-tdou77qi]{width:970px}}@media(min-width:1200px){.container1[data-astro-cid-tdou77qi]{width:1170px}}.container1[data-astro-cid-tdou77qi]:before{--tw-content:"";content:var(--tw-content);display:table}.container1[data-astro-cid-tdou77qi],.container-fluid[data-astro-cid-tdou77qi]{margin-inline:auto;padding-inline:15px}.container-fluid[data-astro-cid-tdou77qi]:before,.row[data-astro-cid-tdou77qi]:before{--tw-content:"";content:var(--tw-content);display:table}.container-fluid[data-astro-cid-tdou77qi]:after,.row[data-astro-cid-tdou77qi]:after{clear:both;--tw-content:"";content:var(--tw-content);display:table}.col-xs-12[data-astro-cid-tdou77qi]{float:left;width:100%}@media(min-width:768px){.col-sm-5[data-astro-cid-tdou77qi]{float:left;width:41.6667%}.col-sm-6[data-astro-cid-tdou77qi]{float:left;width:50%}.col-sm-7[data-astro-cid-tdou77qi]{float:left;width:58.3333%}}.col-xs-12[data-astro-cid-tdou77qi],.col-sm-6[data-astro-cid-tdou77qi],.col-sm-7[data-astro-cid-tdou77qi],.col-md-12[data-astro-cid-tdou77qi]{min-height:1px;padding-inline:15px;position:relative}@media(min-width:992px){.col-md-12[data-astro-cid-tdou77qi]{float:left;width:100%}}#ftl-footer[data-astro-cid-tdou77qi]{width:100%;overflow-x:hidden}#ftl-footer[data-astro-cid-tdou77qi] .row[data-astro-cid-tdou77qi]{margin-inline:-15px}#ftl-footer[data-astro-cid-tdou77qi] .footerContainer[data-astro-cid-tdou77qi]{max-width:1230px;padding-top:25px;padding-bottom:20px}#ftl-footer[data-astro-cid-tdou77qi] .footerWidget[data-astro-cid-tdou77qi]{margin-left:calc(var(--spacing,.25rem) * 0);width:100%}#ftl-footer[data-astro-cid-tdou77qi] .footerOuter[data-astro-cid-tdou77qi]{border-top-style:var(--tw-border-style);background-color:#292b31;border-top-width:0}#ftl-footer[data-astro-cid-tdou77qi] .row[data-astro-cid-tdou77qi] .left[data-astro-cid-tdou77qi]{padding-left:calc(var(--spacing,.25rem) * 0)}#ftl-footer[data-astro-cid-tdou77qi] .row[data-astro-cid-tdou77qi] .top-section[data-astro-cid-tdou77qi]{padding-left:calc(var(--spacing,.25rem) * 0);margin-bottom:10px}#ftl-footer[data-astro-cid-tdou77qi] .row[data-astro-cid-tdou77qi] .top-section[data-astro-cid-tdou77qi] div[data-astro-cid-tdou77qi],#ftl-footer[data-astro-cid-tdou77qi] .row[data-astro-cid-tdou77qi] .bottom-section[data-astro-cid-tdou77qi],#ftl-footer[data-astro-cid-tdou77qi] .row[data-astro-cid-tdou77qi] .bottom-section[data-astro-cid-tdou77qi] div[data-astro-cid-tdou77qi]{padding-left:calc(var(--spacing,.25rem) * 0)}#ftl-footer[data-astro-cid-tdou77qi] .row[data-astro-cid-tdou77qi] div[data-astro-cid-tdou77qi] .section-header[data-astro-cid-tdou77qi]{margin-bottom:calc(var(--spacing,.25rem) * 0);--tw-font-weight:var(--font-weight-semibold,600);font-size:14px;font-weight:var(--font-weight-semibold,600);color:#737981;text-transform:none}#ftl-footer[data-astro-cid-tdou77qi] .row[data-astro-cid-tdou77qi] div[data-astro-cid-tdou77qi] ul[data-astro-cid-tdou77qi]{padding-left:calc(var(--spacing,.25rem) * 0);--tw-leading:1.5em;--tw-font-weight:var(--font-weight-semibold,600);font-size:13px;line-height:1.5em;font-weight:var(--font-weight-semibold,600);color:#e9ebee;list-style-type:none}#ftl-footer[data-astro-cid-tdou77qi] .row[data-astro-cid-tdou77qi] div[data-astro-cid-tdou77qi] ul[data-astro-cid-tdou77qi] li[data-astro-cid-tdou77qi] a[data-astro-cid-tdou77qi]{color:#e9ebee!important}#ftl-footer[data-astro-cid-tdou77qi] .row[data-astro-cid-tdou77qi] div[data-astro-cid-tdou77qi] .bottom-top-list[data-astro-cid-tdou77qi]{margin-bottom:20px}#ftl-footer[data-astro-cid-tdou77qi] .row[data-astro-cid-tdou77qi] .social-media-icons[data-astro-cid-tdou77qi]{float:left;width:auto;padding:calc(var(--spacing,.25rem) * 0);margin-top:-10px;margin-left:-4px;display:none}#ftl-footer[data-astro-cid-tdou77qi] .row[data-astro-cid-tdou77qi] .social-media-icons[data-astro-cid-tdou77qi] .icons-only[data-astro-cid-tdou77qi]{background-color:#0000;padding-block:20px;padding-inline:5px}#ftl-footer[data-astro-cid-tdou77qi] .row[data-astro-cid-tdou77qi] .social-media-icons[data-astro-cid-tdou77qi] .icons-only[data-astro-cid-tdou77qi] li[data-astro-cid-tdou77qi]{margin-right:3px}#ftl-footer[data-astro-cid-tdou77qi] .row[data-astro-cid-tdou77qi] .social-media-icons[data-astro-cid-tdou77qi] .icons-only[data-astro-cid-tdou77qi] li[data-astro-cid-tdou77qi]:last-of-type{margin-right:calc(var(--spacing,.25rem) * 0)}#ftl-footer[data-astro-cid-tdou77qi] .row[data-astro-cid-tdou77qi] .right[data-astro-cid-tdou77qi]{padding-inline:calc(var(--spacing,.25rem) * 0)}#ftl-footer[data-astro-cid-tdou77qi] .row[data-astro-cid-tdou77qi] .connect-text[data-astro-cid-tdou77qi]{float:left;--tw-font-weight:var(--font-weight-semibold,600);font-size:18px;font-weight:var(--font-weight-semibold,600);color:#29a8ff;text-transform:none;margin-right:10px;padding-top:10px;display:inline}#ftl-footer[data-astro-cid-tdou77qi] .footer-mobile[data-astro-cid-tdou77qi]{display:none!important}#ftl-footer[data-astro-cid-tdou77qi] .footer-wide[data-astro-cid-tdou77qi]{display:block!important}#ftl-footer[data-astro-cid-tdou77qi] .footer[data-astro-cid-tdou77qi]{border-top-style:var(--tw-border-style)!important;background-color:#292b31!important;border-top-width:0!important}#ftl-footer[data-astro-cid-tdou77qi] .icons-only[data-astro-cid-tdou77qi]{margin:calc(var(--spacing,.25rem) * 0);cursor:pointer;padding-inline:5px;padding-block:calc(var(--spacing,.25rem) * 0);display:inline-block;position:relative}#ftl-footer[data-astro-cid-tdou77qi] .icons-only[data-astro-cid-tdou77qi] li[data-astro-cid-tdou77qi]{text-align:center;--tw-leading:1.75;width:30px;height:30px;color:var(--color-white,#fff);border-radius:3.40282e38px;font-size:18px;line-height:1.75;list-style-type:none;display:inline-block}#ftl-footer[data-astro-cid-tdou77qi] .icons-only[data-astro-cid-tdou77qi] .rss-icon[data-astro-cid-tdou77qi]{background-color:#f60}#ftl-footer[data-astro-cid-tdou77qi] .icons-only[data-astro-cid-tdou77qi] .rss-icon[data-astro-cid-tdou77qi] a[data-astro-cid-tdou77qi]{color:var(--color-white,#fff)}#ftl-footer[data-astro-cid-tdou77qi] .icons-only[data-astro-cid-tdou77qi] .twitter-icon[data-astro-cid-tdou77qi]{background-color:#00acec!important}#ftl-footer[data-astro-cid-tdou77qi] .icons-only[data-astro-cid-tdou77qi] .facebook-icon[data-astro-cid-tdou77qi]{background-color:#3b5998!important}#ftl-footer[data-astro-cid-tdou77qi] .icons-only[data-astro-cid-tdou77qi] .linkedin-icon[data-astro-cid-tdou77qi]{background-color:#007bb5}@media screen and (max-width:400px){#ftl-footer[data-astro-cid-tdou77qi] .footer-mobile[data-astro-cid-tdou77qi]{display:block!important}#ftl-footer[data-astro-cid-tdou77qi] .footer-wide[data-astro-cid-tdou77qi]{display:none!important}#ftl-footer[data-astro-cid-tdou77qi] .social-media-icons[data-astro-cid-tdou77qi]{margin-bottom:20px}#ftl-footer[data-astro-cid-tdou77qi] .left[data-astro-cid-tdou77qi]{padding:calc(var(--spacing,.25rem) * 0)}}@media screen and (max-width:767px){#ftl-footer[data-astro-cid-tdou77qi] .connect-text[data-astro-cid-tdou77qi]{display:none!important}#ftl-footer[data-astro-cid-tdou77qi] .footerContainer[data-astro-cid-tdou77qi] .link-group[data-astro-cid-tdou77qi] li[data-astro-cid-tdou77qi]{margin-block:10px}}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-content{syntax:"*";inherits:false;initial-value:""}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-leading{syntax:"*";inherits:false}
</style>
<link rel="stylesheet" href="https://www.techrepublic.com/astrostatic/c733c3a8/_astro/_article_.CKPZ9sDH.css">
<link rel="stylesheet" href="https://www.techrepublic.com/astrostatic/c733c3a8/_astro/_article_.CeUMr0pY.css">
<style>.promo-banner[data-astro-cid-lroifm73]{background:linear-gradient(to right,#fdf3e7,#fbe3d4 50%,#fdf3e7)}@keyframes bell-ring{0%,to{transform:rotate(0)}8%{transform:rotate(14deg)}16%{transform:rotate(-12deg)}24%{transform:rotate(10deg)}32%{transform:rotate(-8deg)}40%{transform:rotate(4deg)}48%{transform:rotate(0)}}@keyframes push-ping{0%{transform:scale(1);opacity:.6}75%,to{transform:scale(2.2);opacity:0}}@media(any-pointer:coarse){#push-close-btn[data-astro-cid-w7xjyvkx]{display:none}}@media(prefers-reduced-motion:reduce){#push-notification-prompt[data-astro-cid-w7xjyvkx],#push-notification-prompt[data-astro-cid-w7xjyvkx] [data-astro-cid-w7xjyvkx]{animation:none!important;transition:none!important}}
.icp-product-card[data-astro-cid-wnzspaez]{container-type:inline-size}@container (min-width:600px){.icp-product-card[data-astro-cid-wnzspaez]{grid-template-columns:repeat(2,minmax(0,1fr))}}.icp-product-header[data-astro-cid-wnzspaez]{order:0}@container (min-width:600px){.icp-product-header[data-astro-cid-wnzspaez]{order:1}}.icp-product-rank[data-astro-cid-wnzspaez],.icp-product-name[data-astro-cid-wnzspaez]{min-height:56px}.icp-product-logo[data-astro-cid-wnzspaez]{order:0}@container (min-width:600px){.icp-product-logo[data-astro-cid-wnzspaez]{order:2;max-height:50px}}.icp-product-cta[data-astro-cid-wnzspaez]{flex-direction:column;order:0;display:flex}@container (min-width:600px){.icp-product-cta[data-astro-cid-wnzspaez]{order:4}}.icp-product-attr[data-astro-cid-wnzspaez]{order:0}@container (min-width:600px){.icp-product-attr[data-astro-cid-wnzspaez]{order:3}}.icp-product-logo[data-astro-cid-37va56x7]{justify-content:flex-start}.icp-product-logo[data-astro-cid-37va56x7] img{max-width:250px}.icp-product-cta[data-astro-cid-37va56x7]{justify-content:flex-start}/*! tailwindcss v4.3.0 | MIT License | https://tailwindcss.com */@media(min-width:48rem){.icp-product-rank[data-astro-cid-vqw45ux7],.icp-product-name[data-astro-cid-vqw45ux7]{min-height:56px}}.icp-link[data-astro-cid-vqw45ux7]:hover .icp-product-rank,.icp-link[data-astro-cid-vqw45ux7]:hover .icp-product-name{color:var(--color-secondary)}.icp-product-logo[data-astro-cid-vqw45ux7] img{max-width:200px}
.ticker-text[data-v-34ac2891]{transition:transform .2s ease}.ticker-text.ticker-scrolling[data-v-34ac2891]{animation:ticker-scroll-34ac2891 .4s ease-in-out;animation-fill-mode:forwards}@keyframes ticker-scroll-34ac2891{0%{transform:translate(0)}to{transform:translate(var(--scroll-distance, 0))}}
/*! tailwindcss v4.3.0 | MIT License | https://tailwindcss.com */.input{border:1px solid var(--color-zinc-300);border-radius:3.40282e38px}.input:focus{border-color:var(--color-primary)}html{scroll-padding-top:350px}@media(prefers-reduced-motion:no-preference){html{scroll-behavior:smooth}}
</style>
<style>/*! tailwindcss v4.3.0 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial}}}.review-widget-block{background-color:var(--color-white,#fff);border-bottom:1px solid #0f172a1f;position:relative;overflow:hidden}.review-widget-block:has(+astro-island){border-bottom:none}.review-widget-block+astro-island{margin-top:-1rem;display:block}.review-widget-block .rwb-accent{background-color:var(--color-tertiary);height:3px}.review-widget-block .rwb-header{align-items:flex-start;gap:calc(var(--spacing,.25rem) * 5);padding-block:calc(var(--spacing,.25rem) * 7);border-bottom:1px solid #0f172a14;display:flex}.review-widget-block .rwb-logo-frame{background-color:#0f172a05;border:1px solid #0f172a14;border-radius:2px;flex-shrink:0;justify-content:center;align-items:center;width:80px;height:80px;padding:12px;display:flex}.review-widget-block .rwb-logo-image{object-fit:contain;max-width:100%;max-height:100%;width:auto!important;height:auto!important}.review-widget-block .rwb-header-text{min-width:calc(var(--spacing,.25rem) * 0);flex:1}.review-widget-block .rwb-title{margin:calc(var(--spacing,.25rem) * 0);margin-bottom:calc(var(--spacing,.25rem) * 2);--tw-font-weight:var(--font-weight-bold,700);font-weight:var(--font-weight-bold,700);--tw-tracking:var(--tracking-tight,-.025em);letter-spacing:var(--tracking-tight,-.025em);color:var(--color-secondary);font-size:22px;line-height:28px}.review-widget-block .rwb-description{margin:calc(var(--spacing,.25rem) * 0);color:#71717a;font-size:14px;line-height:22px}.review-widget-block .rwb-price{margin-top:calc(var(--spacing,.25rem) * 3);align-items:center;gap:calc(var(--spacing,.25rem) * 2);flex-wrap:wrap;font-size:13px;display:flex}.review-widget-block .rwb-price-info{color:var(--color-secondary);font-weight:600}.review-widget-block .rwb-price-link{--tw-font-weight:var(--font-weight-semibold,600);font-size:11px;font-weight:var(--font-weight-semibold,600);text-transform:uppercase;letter-spacing:.12em;color:var(--color-tertiary);align-items:center;text-decoration-line:none;display:inline-flex;border:none!important}.review-widget-block .rwb-price-link:hover{text-decoration:underline;background:0 0!important}.review-widget-block .rwb-content-grid{grid-template-columns:1fr;display:grid}@media(min-width:768px){.review-widget-block .rwb-content-grid{grid-template-columns:1fr 1fr}.review-widget-block .rwb-ratings{border-right:1px solid #0f172a14}}.review-widget-block .rwb-ratings{padding-block:calc(var(--spacing,.25rem) * 6);padding-right:calc(var(--spacing,.25rem) * 6)}@media(min-width:48rem){.review-widget-block .rwb-ratings{padding-block:calc(var(--spacing,.25rem) * 7)}}.review-widget-block .rwb-ratings{border-bottom:1px solid #0f172a14}@media(min-width:768px){.review-widget-block .rwb-ratings{border-bottom:none}}.review-widget-block .rwb-overall{margin-bottom:calc(var(--spacing,.25rem) * 5);padding-bottom:calc(var(--spacing,.25rem) * 5);border-bottom:1px solid #0f172a0f;justify-content:space-between;align-items:baseline;display:flex}.review-widget-block .rwb-overall-label{--tw-font-weight:var(--font-weight-semibold,600);font-size:11px;font-weight:var(--font-weight-semibold,600);text-transform:uppercase;letter-spacing:.14em;color:#71717a}.review-widget-block .rwb-overall-value{align-items:baseline;gap:calc(var(--spacing,.25rem) * 3);display:flex}.review-widget-block .rwb-overall-number{--tw-font-weight:var(--font-weight-bold,700);font-weight:var(--font-weight-bold,700);--tw-tracking:var(--tracking-tight,-.025em);letter-spacing:var(--tracking-tight,-.025em);--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,);color:var(--color-tertiary);font-size:32px}.review-widget-block .rwb-overall-stars{align-items:center;gap:calc(var(--spacing,.25rem) * .5);color:var(--color-tertiary);display:flex}.review-widget-block .rwb-other-ratings{gap:calc(var(--spacing,.25rem) * 3);flex-direction:column;display:flex}.review-widget-block .rwb-rating-row{align-items:center;gap:calc(var(--spacing,.25rem) * 3);grid-template-columns:1fr 80px 32px;display:grid}.review-widget-block .rwb-rating-label{--tw-font-weight:var(--font-weight-medium,500);font-size:12px;font-weight:var(--font-weight-medium,500);color:var(--color-secondary)}.review-widget-block .rwb-rating-track{height:calc(var(--spacing,.25rem) * 1);background:#0f172a0f;position:relative}.review-widget-block .rwb-rating-fill{top:calc(var(--spacing,.25rem) * 0);left:calc(var(--spacing,.25rem) * 0);background-color:var(--color-tertiary);height:100%;position:absolute}.review-widget-block .rwb-rating-value{text-align:right;--tw-font-weight:var(--font-weight-semibold,600);font-size:12px;font-weight:var(--font-weight-semibold,600);--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,);color:var(--color-secondary)}.review-widget-block .rwb-proscons{gap:calc(var(--spacing,.25rem) * 6);padding-block:calc(var(--spacing,.25rem) * 6);padding-left:calc(var(--spacing,.25rem) * 6);flex-direction:column;display:flex}@media(min-width:48rem){.review-widget-block .rwb-proscons{padding-block:calc(var(--spacing,.25rem) * 7)}}.review-widget-block .rwb-procon{flex-direction:column;gap:12px;display:flex}.review-widget-block .rwb-procon-label{align-items:center;gap:calc(var(--spacing,.25rem) * 3);--tw-font-weight:var(--font-weight-semibold,600);font-size:11px;font-weight:var(--font-weight-semibold,600);text-transform:uppercase;letter-spacing:.18em;color:var(--color-secondary);display:flex}.review-widget-block .rwb-procon-rule{background-color:var(--color-tertiary);flex-shrink:0;width:18px;height:1px;display:block}.review-widget-block .rwb-procon-cons .rwb-procon-rule{background-color:#0f172a2e}.review-widget-block .rwb-procon-list{margin:calc(var(--spacing,.25rem) * 0);gap:calc(var(--spacing,.25rem) * 2);padding:calc(var(--spacing,.25rem) * 0);flex-direction:column;list-style-type:none;display:flex}.review-widget-block .rwb-procon-item{margin:calc(var(--spacing,.25rem) * 0);align-items:flex-start;gap:calc(var(--spacing,.25rem) * 3);padding:calc(var(--spacing,.25rem) * 0);color:var(--color-secondary);font-size:14px;line-height:20px;display:flex}.review-widget-block .rwb-procon-item:before{display:none!important}.review-widget-block .rwb-procon-icon{width:18px;height:18px;color:var(--color-tertiary);flex-shrink:0;justify-content:center;align-items:center;margin-top:1px;display:flex}.review-widget-block .rwb-procon-icon-cons{color:var(--color-gray-500)}.review-widget-block .rwb-body{padding-block:calc(var(--spacing,.25rem) * 6)}@media(min-width:48rem){.review-widget-block .rwb-body{padding-block:calc(var(--spacing,.25rem) * 7)}}.review-widget-block .rwb-body{border-top:1px solid #0f172a14}.review-widget-block .rwb-body-prose{color:var(--color-secondary);font-size:15px;line-height:24px}.review-widget-block .rwb-body-prose>:first-child{margin-top:0!important}.review-widget-block .rwb-body-prose>:last-child{margin-bottom:0!important}.review-widget-block .rwb-footer{align-items:center;gap:calc(var(--spacing,.25rem) * 3);padding-block:calc(var(--spacing,.25rem) * 4);border-top:1px solid #0f172a14;flex-direction:column;display:flex}.review-widget-block .rwb-footer-links{justify-content:center;align-items:center;gap:calc(var(--spacing,.25rem) * 3);flex-wrap:wrap;display:flex}@media(min-width:768px){.review-widget-block .rwb-footer{justify-content:space-between;align-items:center;gap:calc(var(--spacing,.25rem) * 4);flex-flow:wrap}.review-widget-block .rwb-footer:not(:has(.rwb-footer-links)){justify-content:flex-end}}.review-widget-block .rwb-link-divider{background:#0f172a2e;flex-shrink:0;align-self:center;width:1px;height:12px;display:block}.review-widget-block .rwb-additional-link{--tw-font-weight:var(--font-weight-semibold,600);font-size:11px;font-weight:var(--font-weight-semibold,600);text-transform:uppercase;letter-spacing:.12em;color:var(--color-tertiary);align-items:center;text-decoration-line:none;display:inline-flex;border:none!important}.review-widget-block .rwb-additional-link:hover{text-decoration:underline;background:0 0!important}.review-widget-block .rwb-footer-cta{align-items:center;gap:calc(var(--spacing,.25rem) * 1);flex-direction:column;display:flex}.review-widget-block .rwb-footer-note{text-align:center;color:#71717a;font-size:11px}@media(min-width:768px){.review-widget-block .rwb-footer-cta{align-items:flex-end;margin-left:auto}.review-widget-block .rwb-footer-note{text-align:right}}.review-widget-block .rwb-footer-link{align-items:center;gap:calc(var(--spacing,.25rem) * 2);--tw-font-weight:var(--font-weight-semibold,600);font-size:11px;font-weight:var(--font-weight-semibold,600);text-transform:uppercase;letter-spacing:.14em;color:var(--color-tertiary);text-decoration-line:none;transition:gap .15s;display:inline-flex;border:none!important}.review-widget-block .rwb-footer-link:hover{gap:12px;background:0 0!important}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}
</style>
<style>.glide{position:relative;width:100%;box-sizing:border-box}.glide *{box-sizing:inherit}.glide__track{overflow:hidden}.glide__slides{position:relative;width:100%;list-style:none;backface-visibility:hidden;transform-style:preserve-3d;touch-action:pan-Y;overflow:hidden;margin:0;padding:0;white-space:nowrap;display:flex;flex-wrap:nowrap;will-change:transform}.glide__slides--dragging{user-select:none}.glide__slide{width:100%;height:100%;flex-shrink:0;white-space:normal;user-select:none;-webkit-touch-callout:none;-webkit-tap-highlight-color:transparent}.glide__slide a{user-select:none;-webkit-user-drag:none;-moz-user-select:none;-ms-user-select:none}.glide__arrows,.glide__bullets{-webkit-touch-callout:none;user-select:none}.glide--rtl{direction:rtl}
.glide__arrow{position:absolute;display:block;top:50%;z-index:2;color:#fff;text-transform:uppercase;padding:9px 12px;background-color:transparent;border:2px solid rgba(255,255,255,.5);border-radius:4px;box-shadow:0 .25em .5em #0000001a;text-shadow:0 .25em .5em rgba(0,0,0,.1);opacity:1;cursor:pointer;transition:opacity .15s ease,border .3s ease-in-out;transform:translateY(-50%);line-height:1}.glide__arrow:focus{outline:none}.glide__arrow:hover{border-color:#fff}.glide__arrow--left{left:2em}.glide__arrow--right{right:2em}.glide__arrow--disabled{opacity:.33}.glide__bullets{position:absolute;z-index:2;bottom:2em;left:50%;display:inline-flex;list-style:none;transform:translate(-50%)}.glide__bullet{background-color:#ffffff80;width:9px;height:9px;padding:0;border-radius:50%;border:2px solid transparent;transition:all .3s ease-in-out;cursor:pointer;line-height:0;box-shadow:0 .25em .5em #0000001a;margin:0 .25em}.glide__bullet:focus{outline:none}.glide__bullet:hover,.glide__bullet:focus{border:2px solid #fff;background-color:#ffffff80}.glide__bullet--active{background-color:#fff}.glide--swipeable{cursor:grab;cursor:-moz-grab;cursor:-webkit-grab}.glide--dragging{cursor:grabbing;cursor:-moz-grabbing;cursor:-webkit-grabbing}/*! tailwindcss v4.3.0 | MIT License | https://tailwindcss.com */.glide[data-astro-cid-zs6k2ebs],.glide__track[data-astro-cid-zs6k2ebs]{width:100%}@media(prefers-reduced-motion:no-preference){.glide__track[data-astro-cid-zs6k2ebs]{transition:height .25s ease-out}}.glide__slide[data-astro-cid-zs6k2ebs]{flex:none!important;width:auto!important}.glide[data-astro-cid-zs6k2ebs] .glide__bullet--active[data-astro-cid-zs6k2ebs]>.bullet[data-astro-cid-zs6k2ebs]{background:var(--color-primary)}
/*! tailwindcss v4.3.0 | MIT License | https://tailwindcss.com */.tab-active[data-astro-cid-y26hj7yi]{color:var(--color-white,#fff);background-color:var(--color-secondary)}.item-hidden[data-astro-cid-y26hj7yi]{display:none}[data-astro-cid-y26hj7yi][data-category-item] img+[data-blur]{opacity:1!important}[data-astro-cid-y26hj7yi][data-category-item] [data-blur]+img{z-index:1;position:absolute}
.prose .sp-state{cursor:pointer}.prose .sp-state:hover :is(path,polygon),.prose .sp-state:focus-visible :is(path,polygon){fill:#1c7db1;transition:fill .15s ease}.prose .sp-state:focus-visible{outline:2px solid #1c7db1;outline-offset:2px}
/*! tailwindcss v4.3.0 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style:solid;--tw-font-weight:initial}}}.accordion-item[data-astro-cid-pjbldbwd]{border-top-style:var(--tw-border-style);border-top-width:1px;border-color:var(--color-gray-400,oklch(70.7% .022 261.325));align-self:center;width:100%}.accordion-summary[data-astro-cid-pjbldbwd]{cursor:pointer;justify-content:space-between;align-items:center;gap:calc(var(--spacing,.25rem) * 4);width:100%;padding-block:calc(var(--spacing,.25rem) * 6);-webkit-user-select:none;user-select:none;list-style:none;display:flex}.accordion-summary[data-astro-cid-pjbldbwd]::-webkit-details-marker{display:none}.accordion-summary[data-astro-cid-pjbldbwd]:focus-visible{outline:2px solid var(--color-primary);outline-offset:4px}.accordion-title[data-astro-cid-pjbldbwd]{text-align:left;--tw-font-weight:var(--font-weight-bold,700);font-size:20px;font-weight:var(--font-weight-bold,700);text-transform:uppercase;color:var(--color-secondary);flex:1}.accordion-toggle[data-astro-cid-pjbldbwd]{color:var(--color-gray-600,oklch(44.6% .03 256.802));flex-shrink:0;justify-content:center;align-items:center;display:inline-flex}.accordion-item[data-astro-cid-pjbldbwd][open] .accordion-toggle[data-astro-cid-pjbldbwd]{transform:rotate(180deg)}.accordion-item[data-astro-cid-pjbldbwd]::details-content{content-visibility:visible}.accordion-panel[data-astro-cid-pjbldbwd]{visibility:hidden;grid-template-rows:0fr;display:grid}.accordion-item[data-astro-cid-pjbldbwd][open] .accordion-panel[data-astro-cid-pjbldbwd]{visibility:visible;grid-template-rows:1fr}.accordion-panel-inner[data-astro-cid-pjbldbwd]{padding-right:calc(var(--spacing,.25rem) * 4);min-height:0;overflow:hidden}.accordion-panel-pad[data-astro-cid-pjbldbwd]{padding-bottom:calc(var(--spacing,.25rem) * 4)}@media(prefers-reduced-motion:no-preference){.accordion-panel[data-astro-cid-pjbldbwd]{transition:grid-template-rows .3s ease-in-out,visibility .3s}.accordion-toggle[data-astro-cid-pjbldbwd]{transition:transform .3s}}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}
.calc-label{font-family:var(--font-mono);font-size:11px;font-weight:600;line-height:1.4;text-transform:uppercase;letter-spacing:.09em;color:#71717a}.calc-field-label{font-family:var(--font-mono);font-size:13px;font-weight:600;line-height:1.4;color:#71717a}.calc-field{border-radius:8px;border:1px solid rgba(24,24,27,.14);background:#fff;padding:8px 12px;font-size:15px;color:var(--color-secondary);transition:border-color .15s ease,box-shadow .15s ease}.calc-field:focus{outline:none;border-color:var(--color-primary);box-shadow:0 0 0 2px color-mix(in srgb,var(--color-primary) 35%,transparent)}.calc-table{width:100%;font-size:14px;line-height:22px;font-variant-numeric:tabular-nums lining-nums;border-collapse:collapse;border-bottom:1px solid #18181b}.calc-table thead th{font-family:var(--font-mono);font-size:11px;font-weight:600;letter-spacing:.09em;text-transform:uppercase;color:#71717a;padding:12px 16px;text-align:right;border-top:2px solid #18181b;border-bottom:1px solid #d4d4d8}.calc-table thead th:first-child{text-align:left}.calc-table tbody td{padding:9px 16px;text-align:right;color:#1f1f23;border-top:1px solid #f0f0f1}.calc-table tbody td:first-child{text-align:left;color:#71717a}.calc-table tbody tr:nth-child(odd) td{background:#fafaf9}.calc-table tbody tr:hover td{background:color-mix(in srgb,var(--color-primary) 5%,transparent)}.calc-table tfoot td{padding:12px 16px;text-align:right;font-weight:700;color:var(--color-secondary);border-top:2px solid #18181b}.calc-table tfoot td:first-child{text-align:left}.calc-reset{cursor:pointer;border-radius:9999px;border:2px solid var(--color-primary);background:transparent;color:var(--color-primary);font-family:var(--font-mono);font-size:12px;font-weight:600;text-transform:uppercase;letter-spacing:.1em;padding:6px 16px;transition:background-color .15s ease,color .15s ease,transform .08s ease}.calc-reset:hover{background:var(--color-primary);color:var(--color-primary-foreground)}.calc-reset:active{transform:translateY(1px)}.calc-inputbox{transition:border-color .15s ease,box-shadow .15s ease}.calc-inputbox:focus-within{border-color:var(--color-primary);box-shadow:0 0 0 2px color-mix(in srgb,var(--color-primary) 35%,transparent)}@media(prefers-reduced-motion:reduce){.calc-reset{transition:background-color .15s ease,color .15s ease}.calc-reset:active{transform:none}}
</style>
<style>:root{--ta-violet: rgba(51, 47, 255, .6);--ta-cyan: rgba(46, 226, 226, .8);--ta-base: #141e2d;--ta-fluff-violet: radial-gradient( circle at 15% 90%, var(--ta-violet) -50%, rgba(51, 47, 255, 0) 40% );--ta-fluff-cyan: radial-gradient( circle at 105% -10%, var(--ta-cyan) -50%, rgba(46, 226, 226, 0) 30% );--ta-fill: radial-gradient(closest-side, var(--ta-base) 0%, var(--ta-base))}.ta-galaxy{background-color:transparent;background-image:url("data:image/svg+xml,%3csvg%20width='374'%20height='374'%20viewBox='0%200%20374%20374'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3ccircle%20cx='187'%20cy='187'%20r='186'%20stroke='%2328874B'%20opacity='0.4'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg%20width='374'%20height='374'%20viewBox='0%200%20374%20374'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3ccircle%20cx='187'%20cy='187'%20r='186'%20stroke='%2328874B'%20stroke-dasharray='16%2020'%20opacity='0.4'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg%20width='77'%20height='78'%20viewBox='0%200%2077%2078'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20opacity='0.2'%20d='M16.5%2045C25.3366%2045%2032.5%2052.1634%2032.5%2061C32.5%2069.8366%2025.3366%2077%2016.5%2077C7.66345%2077%200.5%2069.8366%200.499999%2061C0.499999%2052.1634%207.66345%2045%2016.5%2045ZM60.5%2045C69.3365%2045%2076.5%2052.1634%2076.5%2061C76.5%2069.8365%2069.3365%2077%2060.5%2077C51.6634%2077%2044.5%2069.8366%2044.5%2061C44.5%2052.1634%2051.6634%2045%2060.5%2045ZM16.5%200.999999C25.3366%200.999999%2032.5%208.16345%2032.5%2017C32.5%2025.8366%2025.3366%2033%2016.5%2033C7.66345%2033%200.499998%2025.8366%200.499997%2017C0.499997%208.16345%207.66344%201%2016.5%200.999999ZM60.5%200.999997C69.3365%200.999997%2076.5%208.16345%2076.5%2017C76.5%2025.8366%2069.3365%2033%2060.5%2033C51.6634%2033%2044.5%2025.8366%2044.5%2017C44.5%208.16345%2051.6634%200.999998%2060.5%200.999997Z'%20stroke='%2393C953'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg%20width='93'%20height='92'%20viewBox='0%200%2093%2092'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cg%20clip-path='url(%23clip0_6262_32725)'%20opacity='0.4'%3e%3ccircle%20cx='1.5'%20cy='1'%20r='1'%20fill='%2328874B'/%3e%3ccircle%20cx='27.5'%20cy='1'%20r='1'%20fill='%2328874B'/%3e%3ccircle%20cx='53.5'%20cy='1'%20r='1'%20fill='%2328874B'/%3e%3ccircle%20cx='79.5'%20cy='1'%20r='1'%20fill='%2328874B'/%3e%3ccircle%20cx='1.5'%20cy='27'%20r='1'%20fill='%2328874B'/%3e%3ccircle%20cx='27.5'%20cy='27'%20r='1'%20fill='%2328874B'/%3e%3ccircle%20cx='53.5'%20cy='27'%20r='1'%20fill='%2328874B'/%3e%3ccircle%20cx='79.5'%20cy='27'%20r='1'%20fill='%2328874B'/%3e%3ccircle%20cx='1.5'%20cy='53'%20r='1'%20fill='%2328874B'/%3e%3ccircle%20cx='27.5'%20cy='53'%20r='1'%20fill='%2328874B'/%3e%3ccircle%20cx='53.5'%20cy='53'%20r='1'%20fill='%2328874B'/%3e%3ccircle%20cx='79.5'%20cy='53'%20r='1'%20fill='%2328874B'/%3e%3ccircle%20cx='1.5'%20cy='79'%20r='1'%20fill='%2328874B'/%3e%3ccircle%20cx='27.5'%20cy='79'%20r='1'%20fill='%2328874B'/%3e%3ccircle%20cx='53.5'%20cy='79'%20r='1'%20fill='%2328874B'/%3e%3ccircle%20cx='79.5'%20cy='79'%20r='1'%20fill='%2328874B'/%3e%3c/g%3e%3cdefs%3e%3cclipPath%20id='clip0_6262_32725'%3e%3crect%20width='92'%20height='92'/%3e%3c/clipPath%3e%3c/defs%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg%20width='190'%20height='190'%20viewBox='0%200%20190%20190'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3ccircle%20cx='95'%20cy='95'%20r='95'%20stroke='%2328874B'%20opacity='0.4'/%3e%3c/svg%3e"),var(--ta-fluff-violet),var(--ta-fluff-cyan),var(--ta-fill);background-repeat:no-repeat;background-position:-35vh -30vh,80vw -15vh,78vw 104%,60% -4%,80vw 35%,center,center,center;background-blend-mode:exclusion}.ta-galaxy-inset{background-position:-15% 180%,980px -110px,78vw 104%,0% 0%,900px -150px,center,center,center}.ta-black-hole{background-color:transparent;background-image:var(--ta-fluff-violet),var(--ta-fluff-cyan),var(--ta-fill);background-repeat:no-repeat;background-blend-mode:exclusion}.ta-obsidian-cyan-offset{background-color:var(--ta-base);background-image:radial-gradient(circle at 70% 60%,var(--ta-cyan) 0%,rgba(46,226,226,0) 70%);background-repeat:no-repeat;background-blend-mode:soft-light}.ta-h1{font-size:clamp(40px,calc(2.5rem + (1vw - 3.6px)*.7407),48px);line-height:1.2}.ta-h2{font-size:clamp(34px,calc(2.25rem + (1vw - 3.6px)*.3704),38px);line-height:1.2}.ta-h3{font-size:clamp(24px,calc(1.5rem + (1vw - 3.6px)*.7407),32px);line-height:1.4}
</style>
<style>.slide-enter-active[data-v-53819b21],.slide-leave-active[data-v-53819b21]{transition:all .3s}.slide-enter-from[data-v-53819b21],.slide-leave-to[data-v-53819b21]{transform:translateY(20px);opacity:0}.slide-right-enter-active[data-v-1572bf39],.slide-right-leave-active[data-v-1572bf39]{transition:all .3s}.slide-right-enter-from[data-v-1572bf39],.slide-right-leave-to[data-v-1572bf39]{transform:translate(-100vw);opacity:0}.slide-left-enter-active[data-v-1572bf39],.slide-left-leave-active[data-v-1572bf39]{transition:all .3s}.slide-left-enter-from[data-v-1572bf39],.slide-left-leave-to[data-v-1572bf39]{transform:translate(100vw);opacity:0}.submenu-content [data-submenu][data-v-1572bf39]{display:none}.submenu-content [data-submenu].active[data-v-1572bf39]{display:block}
/*! tailwindcss v4.3.0 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){[data-v-65bb584b],[data-v-65bb584b]:before,[data-v-65bb584b]:after,[data-v-65bb584b]::backdrop{--tw-font-weight:initial;--tw-border-style:solid}}}label[data-v-65bb584b]{margin-bottom:calc(var(--spacing,.25rem) * 4);--tw-font-weight:var(--font-weight-medium,500);font-weight:var(--font-weight-medium,500)}input[data-v-65bb584b],select[data-v-65bb584b]{margin-bottom:calc(var(--spacing,.25rem) * 2);height:calc(var(--spacing,.25rem) * 10);border-radius:var(--radius-md,.375rem);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-gray-400,oklch(70.7% .022 261.325));padding-inline:calc(var(--spacing,.25rem) * 4)}input[data-v-65bb584b]:last-of-type{margin-bottom:calc(var(--spacing,.25rem) * 10)}p[data-v-65bb584b]{margin-bottom:calc(var(--spacing,.25rem) * 6)}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}
.message-enter-active[data-v-c9a6c818]{transition:all .3s ease-out}.message-enter-from[data-v-c9a6c818]{opacity:0;transform:translateY(20px)}.message-enter-to[data-v-c9a6c818]{opacity:1;transform:translateY(0)}.orb-enter-active[data-v-c9a6c818]{animation:orb-bounce-in-c9a6c818 .5s cubic-bezier(.34,1.56,.64,1)}.orb-leave-active[data-v-c9a6c818]{transition:all .2s ease-in}.orb-enter-from[data-v-c9a6c818],.orb-leave-to[data-v-c9a6c818]{opacity:0;transform:scale(0)}@keyframes orb-bounce-in-c9a6c818{0%{opacity:0;transform:scale(0)}50%{transform:scale(1.1)}to{opacity:1;transform:scale(1)}}.tooltip-enter-active[data-v-c9a6c818],.tooltip-leave-active[data-v-c9a6c818]{transition:all .2s ease-out}.tooltip-enter-from[data-v-c9a6c818],.tooltip-leave-to[data-v-c9a6c818]{opacity:0;transform:translateY(8px)}.chat-enter-active[data-v-c9a6c818]{animation:chat-expand-c9a6c818 .3s cubic-bezier(.34,1.56,.64,1)}.chat-leave-active[data-v-c9a6c818]{animation:chat-collapse-c9a6c818 .2s ease-in forwards}@keyframes chat-expand-c9a6c818{0%{opacity:0;transform:scale(.8) translateY(20px);transform-origin:bottom right}to{opacity:1;transform:scale(1) translateY(0)}}@keyframes chat-collapse-c9a6c818{0%{opacity:1;transform:scale(1) translateY(0)}to{opacity:0;transform:scale(.8) translateY(20px);transform-origin:bottom right}}
.debug-bar[data-v-fbe2a48f] ::-webkit-scrollbar{width:4px}.debug-bar[data-v-fbe2a48f] ::-webkit-scrollbar-track{background:#374151}.debug-bar[data-v-fbe2a48f] ::-webkit-scrollbar-thumb{background:#6b7280;border-radius:2px}.debug-bar[data-v-fbe2a48f] ::-webkit-scrollbar-thumb:hover{background:#9ca3af}
</style><style>astro-island,astro-slot,astro-static-slot{display:contents}</style><style type="text/css">.inline-top:not([data-loaded]) { min-width: 300px; max-width: 320px; min-height: 50px; max-height: 50px; }
@media screen and (min-width: 768px) { .inline-top:not([data-loaded]) { min-width: 728px; max-width: 728px; min-height: 90px; max-height: 90px; } }
@media screen and (min-width: 1240px) { .inline-top:not([data-loaded]) { min-width: 728px; max-width: 1000px; min-height: 90px; max-height: 250px; } }</style><style type="text/css">.inline-article-native:not([data-loaded]) { width: 100%; height: 100%; }</style><style type="text/css">.inline-article-display:not([data-loaded]) { min-width: 300px; max-width: 320px; min-height: 50px; max-height: 250px; }
@media screen and (min-width: 800px) { .inline-article-display:not([data-loaded]) { min-width: 728px; max-width: 728px; min-height: 90px; max-height: 90px; } }</style><style type="text/css">.inline-article-native:not([data-loaded]) { width: 100%; height: 100%; }</style><style type="text/css">.inline-article-display:not([data-loaded]) { min-width: 300px; max-width: 320px; min-height: 50px; max-height: 250px; }
@media screen and (min-width: 800px) { .inline-article-display:not([data-loaded]) { min-width: 728px; max-width: 728px; min-height: 90px; max-height: 90px; } }</style><style>
#ta-campaign-widget-6aa4926de29f4 .ta-campaign-widget__checkbox__label {
color: #7A7A7A;
}
</style><style>
#ta-campaign-widget-6aa4926de4e93 .ta-campaign-widget__checkbox__label {
color: #7A7A7A;
}
</style><style type="text/css">.right-rail:not([data-loaded]) { min-width: 300px; max-width: 320px; min-height: 50px; max-height: 250px; }
@media screen and (min-width: 768px) { .right-rail:not([data-loaded]) { min-width: 160px; max-width: 300px; min-height: 250px; max-height: 600px; } }</style><style type="text/css">.right-rail:not([data-loaded]) { min-width: 300px; max-width: 320px; min-height: 50px; max-height: 250px; }
@media screen and (min-width: 768px) { .right-rail:not([data-loaded]) { min-width: 160px; max-width: 300px; min-height: 250px; max-height: 600px; } }</style><style type="text/css">.right-rail:not([data-loaded]) { min-width: 300px; max-width: 320px; min-height: 50px; max-height: 250px; }
@media screen and (min-width: 768px) { .right-rail:not([data-loaded]) { min-width: 160px; max-width: 300px; min-height: 250px; max-height: 600px; } }</style><style type="text/css">.inline-bottom:not([data-loaded]) { min-width: 300px; max-width: 320px; min-height: 50px; max-height: 50px; }
@media screen and (min-width: 768px) { .inline-bottom:not([data-loaded]) { min-width: 728px; max-width: 728px; min-height: 90px; max-height: 90px; } }
@media screen and (min-width: 1240px) { .inline-bottom:not([data-loaded]) { min-width: 728px; max-width: 1000px; min-height: 90px; max-height: 250px; } }</style><style type="text/css">.sticky-footer:not([data-loaded]) { min-width: 300px; max-width: 320px; min-height: 50px; max-height: 50px; }
@media screen and (min-width: 768px) { .sticky-footer:not([data-loaded]) { min-width: 728px; max-width: 728px; min-height: 90px; max-height: 90px; } }
@media screen and (min-width: 1240px) { .sticky-footer:not([data-loaded]) { min-width: 728px; max-width: 1000px; min-height: 90px; max-height: 90px; } }</style></head> <body class="skybox-auto-collapse"> <script type="module">(()=>{const l=document.querySelector("[data-ad-slot='skybox']");if(!l)return;let m=-1/0;const p=()=>{m=performance.now()};document.addEventListener("pointerdown",p,{capture:!0,passive:!0}),document.addEventListener("keydown",p,{capture:!0});const w=a=>{if(performance.now()-m<400)return a(),()=>{};const s=()=>{i(),a()},i=()=>{document.removeEventListener("pointerdown",s,!0),document.removeEventListener("keydown",s,!0)};return document.addEventListener("pointerdown",s,{capture:!0,passive:!0}),document.addEventListener("keydown",s,{capture:!0}),i};let r=null;const c=()=>{r?.(),r=w(()=>{l.setAttribute("data-empty",""),document.dispatchEvent(new CustomEvent("skybox-ad-hidden"))})};setTimeout(()=>{!l.hasAttribute("data-loaded")&&!l.hasAttribute("data-empty")&&c()},4e3),window.googletag=window.googletag||{cmd:[]},window.googletag?.cmd.push(()=>{let a=!1,s=null;const i=e=>{const t=document.getElementById("main-navigation");t&&(t.style.top=`${e}px`)},v=300,E=4e3,y=10,b=(e,t,n,d)=>{if(!window.ResizeObserver)return n();let o;const g=window.setTimeout(()=>{clearTimeout(o),u.disconnect(),d()},E),f=()=>{clearTimeout(o),!(e.offsetHeight<y)&&(t(),o=window.setTimeout(()=>{clearTimeout(g),u.disconnect(),n()},v))},u=new ResizeObserver(f);u.observe(e),f()},h=e=>{if(a)return;a=!0;const t=e.closest("[data-ad-slot='skybox']");t&&(r?.(),r=null,t.removeAttribute("data-empty"),T(),b(e,()=>i(t.offsetHeight),()=>I(t,e),c))},I=(e,t)=>{r?.(),r=null,e.removeAttribute("data-empty"),e.setAttribute("data-loaded",""),window.ResizeObserver&&new ResizeObserver(()=>{t.offsetHeight===0&&c()}).observe(t),i(e.offsetHeight),document.dispatchEvent(new CustomEvent("skybox-ad-ready",{detail:{height:e.offsetHeight}})),window.ResizeObserver&&(s=new ResizeObserver(n=>{for(const d of n){const o=d.contentRect.height;i(o),document.dispatchEvent(new CustomEvent("skybox-ad-height-changed",{detail:{height:o}}))}}),s.observe(e))},T=()=>{const e=window.googletag.pubads().getSlots().find(n=>{const d=n.getSlotElementId(),o=document.getElementById(d);return o?o.closest(".inline-top")!==null:!1});if(!e)return;window.googletag?.destroySlots([e]);const t=document.querySelector(".inline-top");t&&(t.style.visibility="hidden",w(()=>{t.style.setProperty("display","none")}))};window.googletag.pubads().addEventListener("slotRenderEnded",e=>{if(e.isEmpty)return;const t=e.slot.getSlotElementId(),n=document.getElementById(t);!n||!n.closest("[data-ad-slot='skybox']")||h(n)})})})();</script><script type="module">function o(e){e.dataset.imageLoaded===void 0&&(e.dataset.imageLoaded="",window.requestAnimationFrame(()=>{e.style.opacity="1";const a=e.closest("[data-lazyimage]")?.querySelector("[data-blur]");a&&(a.style.opacity="0")}))}function t(e){if(e.dataset.imageLoaded!==void 0)return;(typeof e.decode=="function"?e.decode().catch(()=>{}):Promise.resolve()).finally(()=>o(e))}function d(e){!(e instanceof HTMLImageElement)||!e.matches("[data-image]")||t(e)}document.addEventListener("load",e=>d(e.target),!0);document.addEventListener("error",e=>d(e.target),!0);document.querySelectorAll("[data-lazyimage] [data-image]").forEach(e=>{e.complete&&t(e)});</script><script>(()=>{var l=(n,t)=>{let i=async()=>{await(await n())()},e=typeof t.value=="object"?t.value:void 0,s={timeout:e==null?void 0:e.timeout};"requestIdleCallback"in window?window.requestIdleCallback(i,s):setTimeout(i,s.timeout||200)};(self.Astro||(self.Astro={})).idle=l;window.dispatchEvent(new Event("astro:idle"));})();</script><script>(()=>{var A=Object.defineProperty;var g=(i,o,a)=>o in i?A(i,o,{enumerable:!0,configurable:!0,writable:!0,value:a}):i[o]=a;var d=(i,o,a)=>g(i,typeof o!="symbol"?o+"":o,a);{let i={0:t=>m(t),1:t=>a(t),2:t=>new RegExp(t),3:t=>new Date(t),4:t=>new Map(a(t)),5:t=>new Set(a(t)),6:t=>BigInt(t),7:t=>new URL(t),8:t=>new Uint8Array(t),9:t=>new Uint16Array(t),10:t=>new Uint32Array(t),11:t=>1/0*t},o=t=>{let[l,e]=t;return l in i?i[l](e):void 0},a=t=>t.map(o),m=t=>typeof t!="object"||t===null?t:Object.fromEntries(Object.entries(t).map(([l,e])=>[l,o(e)]));class y extends HTMLElement{constructor(){super(...arguments);d(this,"Component");d(this,"hydrator");d(this,"hydrate",async()=>{var b;if(!this.hydrator||!this.isConnected)return;let e=(b=this.parentElement)==null?void 0:b.closest("astro-island[ssr]");if(e){e.addEventListener("astro:hydrate",this.hydrate,{once:!0});return}let c=this.querySelectorAll("astro-slot"),n={},h=this.querySelectorAll("template[data-astro-template]");for(let r of h){let s=r.closest(this.tagName);s!=null&&s.isSameNode(this)&&(n[r.getAttribute("data-astro-template")||"default"]=r.innerHTML,r.remove())}for(let r of c){let s=r.closest(this.tagName);s!=null&&s.isSameNode(this)&&(n[r.getAttribute("name")||"default"]=r.innerHTML)}let p;try{p=this.hasAttribute("props")?m(JSON.parse(this.getAttribute("props"))):{}}catch(r){let s=this.getAttribute("component-url")||"<unknown>",v=this.getAttribute("component-export");throw v&&(s+=` (export ${v})`),console.error(`[hydrate] Error parsing props for component ${s}`,this.getAttribute("props"),r),r}let u;await this.hydrator(this)(this.Component,p,n,{client:this.getAttribute("client")}),this.removeAttribute("ssr"),this.dispatchEvent(new CustomEvent("astro:hydrate"))});d(this,"unmount",()=>{this.isConnected||this.dispatchEvent(new CustomEvent("astro:unmount"))})}disconnectedCallback(){document.removeEventListener("astro:after-swap",this.unmount),document.addEventListener("astro:after-swap",this.unmount,{once:!0})}connectedCallback(){if(!this.hasAttribute("await-children")||document.readyState==="interactive"||document.readyState==="complete")this.childrenConnectedCallback();else{let e=()=>{document.removeEventListener("DOMContentLoaded",e),c.disconnect(),this.childrenConnectedCallback()},c=new MutationObserver(()=>{var n;((n=this.lastChild)==null?void 0:n.nodeType)===Node.COMMENT_NODE&&this.lastChild.nodeValue==="astro:end"&&(this.lastChild.remove(),e())});c.observe(this,{childList:!0}),document.addEventListener("DOMContentLoaded",e)}}async childrenConnectedCallback(){let e=this.getAttribute("before-hydration-url");e&&await import(e),this.start()}async start(){let e=JSON.parse(this.getAttribute("opts")),c=this.getAttribute("client");if(Astro[c]===void 0){window.addEventListener(`astro:${c}`,()=>this.start(),{once:!0});return}try{await Astro[c](async()=>{let n=this.getAttribute("renderer-url"),[h,{default:p}]=await Promise.all([import(this.getAttribute("component-url")),n?import(n):()=>()=>{}]),u=this.getAttribute("component-export")||"default";if(!u.includes("."))this.Component=h[u];else{this.Component=h;for(let f of u.split("."))this.Component=this.Component[f]}return this.hydrator=p,this.hydrate},e,this)}catch(n){console.error(`[astro-island] Error hydrating ${this.getAttribute("component-url")}`,n)}}attributeChangedCallback(){this.hydrate()}}d(y,"observedAttributes",["props"]),customElements.get("astro-island")||customElements.define("astro-island",y)}})();</script><script>(()=>{var e=async t=>{await(await t())()};(self.Astro||(self.Astro={})).load=e;window.dispatchEvent(new Event("astro:load"));})();</script><script type="module" src="https://www.techrepublic.com/astrostatic/c733c3a8/_astro/TechRepublicHeader.astro_astro_type_script_index_0_lang.BGNXsHbR.js"></script><script type="module">document.body.clientWidth<1480||(window.googletag=window.googletag||{cmd:[]},window.googletag?.cmd.push(()=>{let i=!1;const l=()=>{if(i)return;i=!0;const t=document.createElement("div"),e=document.createElement("div"),n=`
position: fixed;
top: 0;
bottom: 0;
width: calc((100vw - 1200px) / 2);
background: transparent;
cursor: pointer;
`;t.style.cssText=n+"left: 0;",e.style.cssText=n+"right: 0;",t.id="left-gutter",e.id="right-gutter";const d=()=>{const o=document.body?.dataset?.src;o&&(window.location.href=o)};t.addEventListener("click",d),e.addEventListener("click",d);const s=()=>{const o=window.innerWidth,r=1200;if(o>r){t.style.display="block",e.style.display="block";const c=(o-r)/2;t.style.width=`${c}px`,e.style.width=`${c}px`}else t.style.display="none",e.style.display="none"};document.body.appendChild(t),document.body.appendChild(e),s(),window.addEventListener("resize",s)};window.googletag.pubads().addEventListener("slotRenderEnded",t=>{if(t.isEmpty)return;const e=t.slot.getSlotElementId(),n=document.getElementById(e);!n||!n.closest("[data-ad-slot='curtain']")||l()})}));</script><script type="module">document.querySelectorAll("a[data-share-link]").forEach(async e=>e.addEventListener("click",a=>navigator.canShare?.()?(a.preventDefault(),navigator.share({title:e.dataset.shareTitle,url:e.href}),!1):!0));</script><script type="module">function i({siteDomain:r}){const e=()=>({feature:"preferred_source",site_domain:r,page_url:typeof window<"u"?window.location.href:void 0,timestamp:new Date().toISOString()}),a=(t,d={})=>{typeof window>"u"||(window.dataLayer=window.dataLayer||[],window.dataLayer.push({event:t,...e(),...d}))};return{trackClicked(t){a("preferred_source_clicked",{preferred_source_surface:t})}}}document.addEventListener("click",r=>{const e=r.target?.closest("a[data-preferred-source]");e&&i({siteDomain:e.dataset.siteDomain??""}).trackClicked(e.dataset.surface??"article_header")});</script><script type="module">document.querySelectorAll('[href="#advertising-disclaimer"]').forEach(p=>{const n=p,e=document.createElement("div");e.className="advertising-disclaimer-tooltip",e.innerHTML="We are able to offer our services for free because some vendors may pay us for web traffic or other sales opportunities. Our mission is to help technology buyers make better purchasing decisions, so we provide you with information for all vendors — even those that don't pay us.",n.style.position="relative",n.appendChild(e),p.addEventListener("mouseenter",()=>{e.classList.add("show")}),p.addEventListener("mouseleave",()=>{e.classList.remove("show")})});document.addEventListener("DOMContentLoaded",()=>{document.querySelectorAll(".wp-block-ta-gazelle-blocks-comp-table").forEach(n=>{const e=n,t=e.querySelector(".is-layout-flex:first-child");if(!t)return;const i=t.children,o=i.length,l=[];e.style.setProperty("--cols",o.toString()),o<=2&&e.classList.add("two-column-table");const h=o<=2?0:1;for(let a=h;a<o;a++){const d=i[a],m=d?.querySelector("img"),s=d?.textContent?.trim()||"";l.push({img:m?.src,text:s})}e.querySelectorAll(".is-layout-flex:not(:first-child)").forEach(a=>{const d=a.children,m=o<=2?0:1;for(let s=m;s<d.length&&s-m<l.length;s++){const f=d[s],r=l[s-m];if(r.img||r.text){const c=document.createElement("div");if(c.className="mobile-product-pill",r.img){const u=document.createElement("img");u.src=r.img,c.appendChild(u),c.classList.add("with-logo")}if(r.text){const u=document.createElement("span");u.textContent=r.text,c.appendChild(u),r.img||c.classList.add("text-only")}f.style.position="relative",f.appendChild(c)}}}),t&&l.length>0&&t.classList.add("hide-on-mobile")}),document.querySelectorAll(".prose .table-wrapper table").forEach(n=>{const e=(t,i)=>{const o=i.getBoundingClientRect(),l={el:i,bottom:o.bottom,left:o.left};return!t||l.bottom>t.bottom+1||l.left<t.left-1?l:t};[...n.querySelectorAll("td")].reduce(e,null)?.el.classList.add("bottom-left-cell")})});</script><script type="module">class s extends HTMLElement{connectedCallback(){const e=this.querySelector(".gated");if(!e)return;const{articleId:n,gateThreshold:o}=e.dataset;if(!n||!o)return;const l=`content-gate-unlocked-${n}`;if(localStorage.getItem(l))return;const t=parseFloat(o);if(!Number.isFinite(t)||t<=0||t>=1)return;const r=()=>{e.style.maxHeight=`${e.scrollHeight*t}px`};r(),e.querySelectorAll("img").forEach(c=>{c.complete||c.addEventListener("load",r,{once:!0})})}}customElements.define("astro-article-contents",s);</script><script type="module">class h extends HTMLElement{stuck=!1;spyObserver=null;linkMap=new Map;connectedCallback(){this.querySelector("[data-collapsible-trigger]")?.addEventListener("click",()=>this.toggleCollapse()),this.setupStuckObserver(),this.setupScrollspy(),this.setupLinkPreCollapse()}setupLinkPreCollapse(){this.querySelectorAll(".toc-list a[href^='#']").forEach(t=>{t.addEventListener("click",()=>{this.classList.contains("expanded")&&this.classList.remove("expanded")})})}disconnectedCallback(){this.spyObserver?.disconnect()}setupStuckObserver(){const t=this.closest(".toc-container");if(!t)return;const o=(()=>{const c=document.querySelectorAll("header, div");for(const n of c){if(n===t||t.contains(n)||getComputedStyle(n).position!=="fixed")continue;const a=n.getBoundingClientRect();if(a.top<=0&&a.width>200&&a.height>=40)return n}return null})(),s=()=>{const c=o?Math.max(0,o.getBoundingClientRect().bottom):0,n=c>0?c+8:16;return t.style.setProperty("--toc-sticky-offset",`${n}px`),n};let i=s(),e=!1;const l=()=>{e=!1,i=s();const c=this.stuck;this.stuck=t.getBoundingClientRect().top<=i+.5,this.stuck!==c&&(t.classList.toggle("stuck",this.stuck),this.stuck&&this.classList.contains("expanded")&&this.classList.remove("expanded"))},d=()=>{e||(e=!0,requestAnimationFrame(l))},u=()=>{i=s(),d()};window.addEventListener("scroll",d,{passive:!0}),window.addEventListener("resize",u,{passive:!0}),l()}setupScrollspy(){const t=this.querySelectorAll(".toc-list a[href^='#']");if(t.length===0)return;const r=[];if(t.forEach(s=>{const i=decodeURIComponent(s.getAttribute("href")?.slice(1)??"");if(!i)return;this.linkMap.set(i,s);const e=document.getElementById(i);e&&r.push(e)}),r.length===0)return;const o=new Set;this.spyObserver=new IntersectionObserver(s=>{for(const e of s)e.isIntersecting?o.add(e.target.id):o.delete(e.target.id);let i=null;for(const e of r)if(o.has(e.id)){i=e.id;break}this.linkMap.forEach((e,l)=>{e.classList.toggle("active",l===i)})},{rootMargin:"-80px 0px -70% 0px",threshold:0}),r.forEach(s=>this.spyObserver.observe(s))}toggleCollapse(){this.classList.toggle("expanded")}}customElements.define("astro-collapsible",h);</script><script type="module" src="https://www.techrepublic.com/astrostatic/c733c3a8/_astro/InfiniScroll.astro_astro_type_script_index_0_lang.iEYh2FhN.js"></script><script type="module">class s extends HTMLElement{resizeObserver=null;connectedCallback(){this.updateHeightVar(),this.resizeObserver=new ResizeObserver(()=>{this.hasAttribute("data-collapsed")||this.updateHeightVar()}),this.resizeObserver.observe(this),this.querySelector("button")?.addEventListener("click",()=>{const e=this.toggleAttribute("data-collapsed");this.classList.toggle("translate-y-full",e);const t=this.querySelector(".chevron");t&&t.classList.toggle("rotate-180",e),e?document.documentElement.style.setProperty("--sticky-ad-height","0px"):this.updateHeightVar()})}disconnectedCallback(){this.resizeObserver?.disconnect(),document.documentElement.style.removeProperty("--sticky-ad-height")}updateHeightVar(){document.documentElement.style.setProperty("--sticky-ad-height",`${this.offsetHeight}px`)}}customElements.define("sticky-footer-ad",s);</script> <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-57GHMWX" height="0" width="0" style="display:none;visibility:hidden" title="Google tag manageer noscript tag"></iframe></noscript><script>(function(){const gtmId = "GTM-57GHMWX";
// Patched vs the stock GTM snippet: the gtm.js script-tag injection is
// pulled out of the IIFE and deferred to idle. window.dataLayer and gtm.start
// event are still created synchronously, so every dataLayer.push between
// now and load queues on the plain array and GTM drains it on boot —
// no events are lost, they arrive later.
//
// Why: gtm.js is ~177KB and lands mid-load alongside the ad stack, where it
// costs main thread we need for INP and competes with the LCP image for
// bandwidth. Nothing in the ad path depends on it (GPT is loaded by the
// Assertive Yield manager, not GTM).
;(function (w, d, s, l, i) {
w[l] = w[l] || []
w[l].push({
"gtm.start": new Date().getTime(),
event: "gtm.js",
})
const load = function () {
const f = d.getElementsByTagName(s)[0],
j = d.createElement(s),
dl = l != "dataLayer" ? "&l=" + l : ""
j.async = true
j.src = "https://www.googletagmanager.com/gtm.js?id=" + i + dl
f.parentNode.insertBefore(j, f)
}
// Cap the wait: ad-heavy pages can stay busy for many seconds and may
// never hit a true idle period.
if ("requestIdleCallback" in w) {
w.requestIdleCallback(load, { timeout: 4000 })
} else {
w.setTimeout(load, 2000)
}
})(window, document, "script", "dataLayer", gtmId)
})();</script><div data-ad-slot="skybox" data-ad-self-managed="" data-unit-base="/5055/aw-techrepublic" data-category="data-centers" class="static top-0 left-0 right-0 w-screen z-200 skybox skybox-closeBtn skybox-collapseBtn data-empty:hidden print:hidden bg-zinc-100"></div><script>(function(){const defaultLocale = "en";
const supportedShorts = ["en","de","fr","es"];
const siteDomain = "techrepublic.com";
;(function () {
try {
const pathname = window.location.pathname
const sitePrefix = "/sites/" + siteDomain + "/"
let base, afterBase
if (pathname.startsWith(sitePrefix)) {
base = sitePrefix
afterBase = pathname.slice(sitePrefix.length)
} else {
base = "/"
afterBase = pathname.slice(1)
}
const parts = afterBase.split("/")
const currentLocale = supportedShorts.includes(parts[0])
? parts[0]
: defaultLocale
const pref = localStorage.getItem("preferred-locale")
if (!pref || !supportedShorts.includes(pref)) {
localStorage.setItem("preferred-locale", currentLocale)
return
}
if (currentLocale !== defaultLocale) return
if (currentLocale === pref) return
const target =
base +
pref +
"/" +
afterBase +
window.location.search +
window.location.hash
window.location.replace(target)
} catch (err) {
console.error("Failed to redirect to preferred locale", err)
}
})()
})();</script><link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin=""><link href="https://fonts.googleapis.com/css2?family=Mulish:wght@400;500;600;700;800&display=swap" rel="stylesheet"><tr-header> <header class="sticky top-0 z-1000 bg-white antialiased print:static font-[Mulish,sans-serif] border-b border-[#efefef]" id="main-navigation"> <div class="flex items-center justify-between max-w-[1200px] mx-auto px-4 h-[70px] gap-3"> <!-- Logo --> <a href="/" class="shrink-0 flex items-center"> <div class="h-[40px] w-auto relative"> <img src="https://www.techrepublic.com/astrostatic/c733c3a8/_image/?href=%2F_astro%2Ftechrepublic.BQceyIVv.png&w=500&h=119&f=webp" alt="TechRepublic" loading="eager" fetchpriority="high" showPlaceholder="false" data-image="true" style="opacity:1" decoding="async" width="500" height="119" class="h-[40px] w-auto transition-opacity duration-300"> </div> </a> <!-- Desktop primary nav --> <nav class="hidden min-[1360px]:flex items-center text-[16px] text-[#000e2a] font-bold gap-2" aria-label="Primary navigation"> <a href="/topic/top-products/" class="px-3 py-2 text-[#000e2a] no-underline whitespace-nowrap hover:text-[#086bdb] transition-colors duration-150"> Top Products </a><a href="/topic/artificial-intelligence/" class="px-3 py-2 text-[#000e2a] no-underline whitespace-nowrap hover:text-[#086bdb] transition-colors duration-150"> AI </a><a href="/topic/developer/" class="px-3 py-2 text-[#000e2a] no-underline whitespace-nowrap hover:text-[#086bdb] transition-colors duration-150"> Developer </a><a href="/topic/payroll/" class="px-3 py-2 text-[#000e2a] no-underline whitespace-nowrap hover:text-[#086bdb] transition-colors duration-150"> Payroll </a><a href="/topic/security/" class="px-3 py-2 text-[#000e2a] no-underline whitespace-nowrap hover:text-[#086bdb] transition-colors duration-150"> Security </a><a href="/events/" class="px-3 py-2 text-[#000e2a] no-underline whitespace-nowrap hover:text-[#086bdb] transition-colors duration-150"> Events </a> <!-- Hubs dropdown --> <div class="relative" data-tr-hubs-wrapper=""> <button class="flex items-center gap-1 px-3 py-2 text-[#000e2a] bg-transparent border-0 cursor-pointer text-[16px] font-bold whitespace-nowrap hover:text-[#086bdb] transition-colors duration-150" aria-expanded="false" data-tr-hubs-btn=""> <span>Resources</span> <svg class="w-3 h-3 transition-transform duration-300" viewBox="0 0 12 12" fill="none" aria-hidden="true"> <path d="M2 4l4 4 4-4" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" /> </svg> </button> <div class="absolute top-full right-0 invisible opacity-0 transition-all duration-150 z-50" data-tr-hubs-dropdown=""> <div class="bg-white rounded-lg shadow-[0_4px_24px_rgba(0,0,0,0.12)] border border-gray-100 p-6 min-w-[680px] font-[Mulish,sans-serif]"> <div class="flex gap-8"> <!-- Resource Hubs column --> <div class="w-[200px] shrink-0"> <div class="px-1 pb-2 text-[10px] font-bold uppercase tracking-wider text-gray-400">
Resource Hubs
</div> <div class="flex flex-col"> <a href="/hubs/the-enterprise-guide-to-scalable-ai/" class="block px-1 py-1.5 text-[13px] text-[#000e2a] no-underline hover:text-[#086bdb] transition-colors duration-150"> The Enterprise Guide to Scalable AI </a><a href="/hubs/the-ai-ready-workplace-hub/" class="block px-1 py-1.5 text-[13px] text-[#000e2a] no-underline hover:text-[#086bdb] transition-colors duration-150"> The AI-Ready Workplace Hub </a> <a href="/premium/" class="block px-1 py-1.5 text-[13px] text-[#000e2a] no-underline hover:text-[#086bdb] transition-colors duration-150"> TechRepublic Premium </a><a href="https://academy.techrepublic.com/" class="block px-1 py-1.5 text-[13px] text-[#000e2a] no-underline hover:text-[#086bdb] transition-colors duration-150"> TechRepublic Academy </a><a href="/newsletters/" class="block px-1 py-1.5 text-[13px] text-[#000e2a] no-underline hover:text-[#086bdb] transition-colors duration-150"> Newsletters </a><a href="/resource-library/" class="block px-1 py-1.5 text-[13px] text-[#000e2a] no-underline hover:text-[#086bdb] transition-colors duration-150"> Resource Library </a><a href="/forums/" class="block px-1 py-1.5 text-[13px] text-[#000e2a] no-underline hover:text-[#086bdb] transition-colors duration-150"> Forums </a><a href="/sponsored/" class="block px-1 py-1.5 text-[13px] text-[#000e2a] no-underline hover:text-[#086bdb] transition-colors duration-150"> Sponsored </a> </div> </div> <!-- Featured Resources column --> <div class="flex-1 min-w-0"> <div class="px-1 pb-2 text-[10px] font-bold uppercase tracking-wider text-gray-400">
Featured Resources
</div> <div class="grid grid-cols-2 gap-4"> <a href="/sponsored/why-data-not-models-determines-ai-success/" class="group flex flex-col gap-2 no-underline"> <div class="aspect-video w-full overflow-hidden rounded-md bg-gray-100"> <img src="https://assets.techrepublic.com/uploads/2026/04/Untitled-design-18-1-770x433.png" alt="Why Data, Not Models, Determines AI Success" loading="lazy" class="h-full w-full object-cover transition-transform duration-200 group-hover:scale-[1.02]"> </div> <div class="text-[14px] font-bold leading-snug text-[#000e2a] group-hover:text-[#086bdb] transition-colors duration-150 line-clamp-2"> Why Data, Not Models, Determines AI Success </div> <div class="text-[13px] leading-snug text-gray-600 line-clamp-2"> Strong models alone are not enough, and this article shows why data readiness, accessibility, and governance often determine whether AI succeeds in production. </div> </a><a href="https://www.eweek.com/a/news/proving-the-roi-of-enterprise-ai-from-esg-insights-to-business-outcomes/" class="group flex flex-col gap-2 no-underline"> <div class="aspect-video w-full overflow-hidden rounded-md bg-gray-100"> <img src="https://cdn.eweek.com/Dell_26Q1_TN_1280x720_03.jpg" alt="Proving the ROI of Enterprise AI: From ESG Insights to Business Outcomes" loading="lazy" class="h-full w-full object-cover transition-transform duration-200 group-hover:scale-[1.02]"> </div> <div class="text-[14px] font-bold leading-snug text-[#000e2a] group-hover:text-[#086bdb] transition-colors duration-150 line-clamp-2"> Proving the ROI of Enterprise AI: From ESG Insights to Business Outcomes </div> <div class="text-[13px] leading-snug text-gray-600 line-clamp-2"> Enterprise leaders are under pressure to show that AI investments deliver more than experimentation, and this piece explores how to connect initiatives to measurable business outcomes. </div> </a><a href="https://www.eweek.com/a/artificial-intelligence/where-should-ai-workloads-run-rethinking-workload-placement-in-a-hybrid-ai-world/" class="group flex flex-col gap-2 no-underline"> <div class="aspect-video w-full overflow-hidden rounded-md bg-gray-100"> <img src="https://cdn.techrepublic.com/content-images/01KPVCT9XZBKTPSCST3R2GG1RE.jpg" alt="Where Should AI Workloads Run? Rethinking Workload Placement in a Hybrid AI World" loading="lazy" class="h-full w-full object-cover transition-transform duration-200 group-hover:scale-[1.02]"> </div> <div class="text-[14px] font-bold leading-snug text-[#000e2a] group-hover:text-[#086bdb] transition-colors duration-150 line-clamp-2"> Where Should AI Workloads Run? Rethinking Workload Placement in a Hybrid AI World </div> <div class="text-[13px] leading-snug text-gray-600 line-clamp-2"> Because placement decisions affect cost, performance, and control, this piece examines how data gravity and latency shape where AI workloads should run. </div> </a><a href="https://www.eweek.com/artificial-intelligence/dells-vrashank-jain-on-the-data-problem-that-could-break-your-ai/" class="group flex flex-col gap-2 no-underline"> <div class="aspect-video w-full overflow-hidden rounded-md bg-gray-100"> <img src="https://cdn.techrepublic.com/content-images/01KPVCP6B2QCW4Q6NEY1N5PD84.png" alt="Dell's Vrashank Jain on the Data Problem That Could Break Your AI" loading="lazy" class="h-full w-full object-cover transition-transform duration-200 group-hover:scale-[1.02]"> </div> <div class="text-[14px] font-bold leading-snug text-[#000e2a] group-hover:text-[#086bdb] transition-colors duration-150 line-clamp-2"> Dell's Vrashank Jain on the Data Problem That Could Break Your AI </div> <div class="text-[13px] leading-snug text-gray-600 line-clamp-2"> In this eSpeaks conversation, Vrashank Jain explains why fragmented environments, pipeline complexity, and data bottlenecks continue to slow enterprise AI progress. </div> </a> </div> </div> </div> </div> </div> </div> <!-- More dropdown --> <div class="relative" data-tr-more-wrapper=""> <button class="flex items-center gap-1 px-3 py-2 text-[#000e2a] bg-transparent border-0 cursor-pointer text-[16px] font-bold whitespace-nowrap hover:text-[#086bdb] transition-colors duration-150" aria-expanded="false" data-tr-more-btn=""> <span>More</span> <svg class="w-3 h-3 transition-transform duration-300" viewBox="0 0 12 12" fill="none" aria-hidden="true"> <path d="M2 4l4 4 4-4" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" /> </svg> </button> <div class="absolute top-full right-0 bg-white rounded-lg shadow-[0_4px_24px_rgba(0,0,0,0.12)] py-2 min-w-[220px] invisible opacity-0 transition-all duration-150 z-50 border border-gray-100" data-tr-more-dropdown=""> <!-- Popular Topics --> <div class="px-4 py-1.5 text-[10px] font-bold uppercase tracking-wider text-gray-400"> Popular Topics </div> <a href="/topic/project-management/" class="block px-4 py-1.5 text-[#000e2a] no-underline text-[13px] hover:bg-gray-50 hover:text-[#086bdb] transition-colors duration-150"> Project Management </a><a href="/topic/accounting/" class="block px-4 py-1.5 text-[#000e2a] no-underline text-[13px] hover:bg-gray-50 hover:text-[#086bdb] transition-colors duration-150"> Accounting </a><a href="/topic/big-data/crm/" class="block px-4 py-1.5 text-[#000e2a] no-underline text-[13px] hover:bg-gray-50 hover:text-[#086bdb] transition-colors duration-150"> CRM </a><a href="https://academy.techrepublic.com/" class="block px-4 py-1.5 text-[#000e2a] no-underline text-[13px] hover:bg-gray-50 hover:text-[#086bdb] transition-colors duration-150"> Academy </a><a href="/topic/cloud/" class="block px-4 py-1.5 text-[#000e2a] no-underline text-[13px] hover:bg-gray-50 hover:text-[#086bdb] transition-colors duration-150"> Cloud </a><a href="/topic/innovation/" class="block px-4 py-1.5 text-[#000e2a] no-underline text-[13px] hover:bg-gray-50 hover:text-[#086bdb] transition-colors duration-150"> Innovation </a><a href="/topic/smart-persons-guides/" class="block px-4 py-1.5 text-[#000e2a] no-underline text-[13px] hover:bg-gray-50 hover:text-[#086bdb] transition-colors duration-150"> Cheat Sheets </a><a href="/topic/big-data/" class="block px-4 py-1.5 text-[#000e2a] no-underline text-[13px] hover:bg-gray-50 hover:text-[#086bdb] transition-colors duration-150"> Big Data </a> <a href="/topic/" class="block px-4 py-1.5 text-[#086bdb] no-underline text-[13px] font-bold hover:bg-gray-50 transition-colors duration-150"> View All Topics </a> </div> </div> </nav> <!-- Right side actions --> <div class="flex items-center gap-3 ml-auto min-[1360px]:ml-0"> <div class="hidden md:block"> <astro-island uid="Z1q4Psp" prefix="s24" component-url="https://www.techrepublic.com/astrostatic/c733c3a8/_astro/LocaleDropdown.CpgIGAKg.js" component-export="default" renderer-url="https://www.techrepublic.com/astrostatic/c733c3a8/_astro/client.B-cu3CQi.js" props="{&quot;currentLocale&quot;:[0,&quot;en&quot;],&quot;defaultLocale&quot;:[0,&quot;en&quot;],&quot;supportedLocales&quot;:[1,[[0,&quot;en-US&quot;],[0,&quot;de&quot;],[0,&quot;fr&quot;],[0,&quot;es&quot;]]],&quot;siteDomain&quot;:[0,&quot;techrepublic.com&quot;]}" ssr="" client="idle" opts="{&quot;name&quot;:&quot;LocaleDropdown&quot;,&quot;value&quot;:true}" await-children=""><div class="relative"><button class="text-secondary hover:bg-primary hover:text-primary-foreground flex items-center gap-1.5 font-medium transition p-2 cursor-pointer text-mono text-[14px]/[24px] tracking-[0.7px] uppercase group" aria-label="Language: English" aria-haspopup="dialog" aria-expanded="false"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 20 15" aria-hidden="true" class="w-5"><!--[--><rect width="20" height="15" fill="#B22234" /><rect y="1.15" width="20" height="1.15" fill="#fff" /><rect y="3.46" width="20" height="1.15" fill="#fff" /><rect y="5.77" width="20" height="1.15" fill="#fff" /><rect y="8.08" width="20" height="1.15" fill="#fff" /><rect y="10.38" width="20" height="1.15" fill="#fff" /><rect y="12.69" width="20" height="1.15" fill="#fff" /><rect width="8" height="8.08" fill="#3C3B6E" /><!--]--></svg><span>EN</span></button><div class="absolute right-0 mt-0 w-40 border border-t-4 border-t-primary bg-white shadow-md z-50" style="display:none;"><div role="radiogroup" aria-label="Select language"><!--[--><label class="font-bold text-primary flex items-center gap-2.5 px-4 py-2 text-sm hover:bg-primary/10 hover:text-primary transition cursor-pointer"><input type="radio" name="locale" value="en" checked class="sr-only"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 20 15" aria-hidden="true" class="w-5 flex-shrink-0"><!--[--><rect width="20" height="15" fill="#B22234" /><rect y="1.15" width="20" height="1.15" fill="#fff" /><rect y="3.46" width="20" height="1.15" fill="#fff" /><rect y="5.77" width="20" height="1.15" fill="#fff" /><rect y="8.08" width="20" height="1.15" fill="#fff" /><rect y="10.38" width="20" height="1.15" fill="#fff" /><rect y="12.69" width="20" height="1.15" fill="#fff" /><rect width="8" height="8.08" fill="#3C3B6E" /><!--]--></svg> English</label><label class="flex items-center gap-2.5 px-4 py-2 text-sm hover:bg-primary/10 hover:text-primary transition cursor-pointer"><input type="radio" name="locale" value="de" class="sr-only"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 20 15" aria-hidden="true" class="w-5 flex-shrink-0"><!--[--><rect width="20" height="5" fill="#000" /><rect y="5" width="20" height="5" fill="#D00" /><rect y="10" width="20" height="5" fill="#FFCE00" /><!--]--></svg> Deutsch</label><label class="flex items-center gap-2.5 px-4 py-2 text-sm hover:bg-primary/10 hover:text-primary transition cursor-pointer"><input type="radio" name="locale" value="fr" class="sr-only"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 20 15" aria-hidden="true" class="w-5 flex-shrink-0"><!--[--><rect width="20" height="15" fill="#ED2939" /><rect width="13.33" height="15" fill="#fff" /><rect width="6.67" height="15" fill="#002395" /><!--]--></svg> Français</label><label class="flex items-center gap-2.5 px-4 py-2 text-sm hover:bg-primary/10 hover:text-primary transition cursor-pointer"><input type="radio" name="locale" value="es" class="sr-only"><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 20 15" aria-hidden="true" class="w-5 flex-shrink-0"><!--[--><rect width="20" height="15" fill="#c60b1e" /><rect y="3.75" width="20" height="7.5" fill="#ffc400" /><!--]--></svg> Español</label><!--]--></div></div></div><!--astro:end--></astro-island> </div> <astro-island uid="ZPjo5j" prefix="s25" component-url="https://www.techrepublic.com/astrostatic/c733c3a8/_astro/UserMenu.DFRBJuvx.js" component-export="default" renderer-url="https://www.techrepublic.com/astrostatic/c733c3a8/_astro/client.B-cu3CQi.js" props="{&quot;tabs&quot;:[1,[[0,&quot;saved&quot;],[0,&quot;community&quot;],[0,&quot;newsletters&quot;],[0,&quot;resources&quot;],[0,&quot;premium&quot;]]],&quot;admin&quot;:[0,true],&quot;allowRegistration&quot;:[0,true]}" ssr="" client="load" opts="{&quot;name&quot;:&quot;UserMenu&quot;,&quot;value&quot;:true}" await-children=""><div class="relative font-[Mulish,sans-serif]"><button disabled class="inline-flex items-center justify-center size-9 p-0 text-[0px] bg-transparent border-[1.5px] border-gray-300 rounded-full cursor-pointer overflow-hidden transition-all duration-150 hover:bg-gray-100 hover:border-gray-400 pointer-events-none opacity-0"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-user-icon lucide-user text-gray-500" aria-hidden="true"><path d="M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2" /><circle cx="12" cy="7" r="4" /></svg><span class="sr-only">Sign In</span></button><!----><!--teleport start--><!--teleport end--></div><!--astro:end--></astro-island> <!-- Search toggle / close --> <button class="flex items-center justify-center w-9 h-9 rounded-full text-[#000e2a] bg-transparent border-0 cursor-pointer hover:bg-gray-100 transition-colors duration-150" aria-label="Search" data-tr-search-toggle=""> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-search-icon lucide-search size-6" aria-hidden="true"><path d="m21 21-4.34-4.34" /><circle cx="11" cy="11" r="8" /></svg> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-x-icon lucide-x size-6 hidden" aria-hidden="true"><path d="M18 6 6 18" /><path d="m6 6 12 12" /></svg> </button> <!-- Go Premium CTA --> <a href="/premium/" class="hidden md:inline-flex items-center px-5 py-2 bg-[#d44216] text-white text-[16px] font-bold! rounded-full no-underline whitespace-nowrap hover:bg-[#b83812] transition-colors duration-150"> Go Premium </a> <!-- Mobile menu toggle --> <button class="flex items-center justify-center w-9 h-9 bg-transparent border-0 text-[#000e2a] cursor-pointer min-[1360px]:hidden" aria-label="Open menu" data-tr-toggle=""> <svg width="24" height="24" viewBox="0 0 24 24" fill="none" aria-hidden="true"> <path d="M3 6h18M3 12h18M3 18h18" stroke="currentColor" stroke-width="2" stroke-linecap="round" /> </svg> </button> </div> </div> <!-- Search dropdown panel --> <div class="hidden absolute left-0 right-0 top-full bg-white z-50 font-[Mulish,sans-serif]" data-tr-search-panel=""> <div class="max-w-[700px] mx-auto px-4 py-5"> <form role="search" method="get" action="/" data-tr-search-form=""> <div class="relative border-2 border-[#086bdb] rounded-full"> <input type="search" name="s" placeholder="What are you looking for?" required class="w-full h-12 pl-6 pr-12 border-0 rounded-full bg-white text-[#000e2a] text-base placeholder:text-gray-400 focus:outline-none font-[Mulish,sans-serif]" data-tr-search-input=""> <button type="submit" aria-label="Search" class="absolute right-3 top-1/2 -translate-y-1/2 bg-transparent border-0 text-gray-400 cursor-pointer hover:text-[#086bdb] transition-colors duration-150 p-1"> <svg viewBox="0 0 24 24" width="20" height="20" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"> <circle cx="11" cy="11" r="7" /> <path d="M21 21l-4.35-4.35" /> </svg> </button> </div> </form> </div> </div> </header> <!-- Mobile overlay --> <div class="hidden fixed inset-0 z-100000 flex-col font-[Mulish,sans-serif]" data-tr-overlay=""> <!-- Mobile header bar --> <div class="flex items-center justify-between px-4 h-[60px] bg-white border-b border-gray-200"> <a href="/" class="shrink-0 flex items-center"> <div class="h-[26px] w-auto relative"> <img src="https://www.techrepublic.com/astrostatic/c733c3a8/_image/?href=%2F_astro%2Ftechrepublic.BQceyIVv.png&w=500&h=119&f=webp" alt="TechRepublic" loading="eager" showPlaceholder="false" data-image="true" style="opacity:1" decoding="async" fetchpriority="auto" width="500" height="119" class="h-[26px] w-auto transition-opacity duration-300"> </div> </a> <button class="flex items-center justify-center w-9 h-9 bg-transparent border-0 text-[#000e2a] cursor-pointer" aria-label="Close menu" data-tr-close=""> <svg width="24" height="24" viewBox="0 0 24 24" fill="none" aria-hidden="true"> <path d="M18 6L6 18M6 6l12 12" stroke="currentColor" stroke-width="2" stroke-linecap="round" /> </svg> </button> </div> <!-- Mobile navigation body --> <div class="flex-1 overflow-y-auto bg-white"> <!-- Mobile search --> <form class="px-4 py-3 border-b border-gray-200" role="search" method="get" action="/" data-tr-search-form=""> <div class="relative"> <input type="search" name="s" placeholder="Search TechRepublic" required class="w-full h-10 pl-4 pr-10 border border-gray-300 rounded-full bg-white text-sm text-[#000e2a] placeholder:text-gray-400 focus:outline-none focus:border-[#086bdb]"> <button type="submit" aria-label="Search" class="absolute right-1 top-1 w-8 h-8 rounded-full bg-[#086bdb] text-white border-0 cursor-pointer flex items-center justify-center hover:bg-[#044997]"> <svg viewBox="0 0 24 24" width="14" height="14" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"> <circle cx="11" cy="11" r="7" /> <path d="M21 21l-4.35-4.35" /> </svg> </button> </div> </form> <!-- Go Premium mobile CTA --> <a href="https://www.techrepublic.com/premium/" class="flex items-center justify-center mx-4 mt-3 mb-1 px-4 py-2.5 bg-[#d44216] text-white text-sm font-bold rounded-full no-underline hover:bg-[#b83812]">
Go Premium
</a> <!-- Mobile nav links --> <div class="py-2"> <div class="px-4 py-2 text-[10px] font-bold uppercase tracking-wider text-gray-400">
Popular Topics
</div> <a href="/topic/top-products/" class="block px-4 py-2.5 text-[#000e2a] no-underline text-[15px] hover:bg-gray-50 hover:text-[#086bdb] transition-colors duration-150"> Top Products </a><a href="/topic/artificial-intelligence/" class="block px-4 py-2.5 text-[#000e2a] no-underline text-[15px] hover:bg-gray-50 hover:text-[#086bdb] transition-colors duration-150"> AI </a><a href="/topic/developer/" class="block px-4 py-2.5 text-[#000e2a] no-underline text-[15px] hover:bg-gray-50 hover:text-[#086bdb] transition-colors duration-150"> Developer </a><a href="/topic/payroll/" class="block px-4 py-2.5 text-[#000e2a] no-underline text-[15px] hover:bg-gray-50 hover:text-[#086bdb] transition-colors duration-150"> Payroll </a><a href="/topic/security/" class="block px-4 py-2.5 text-[#000e2a] no-underline text-[15px] hover:bg-gray-50 hover:text-[#086bdb] transition-colors duration-150"> Security </a><a href="/events/" class="block px-4 py-2.5 text-[#000e2a] no-underline text-[15px] hover:bg-gray-50 hover:text-[#086bdb] transition-colors duration-150"> Events </a><a href="/topic/project-management/" class="block px-4 py-2.5 text-[#000e2a] no-underline text-[15px] hover:bg-gray-50 hover:text-[#086bdb] transition-colors duration-150"> Project Management </a><a href="/topic/accounting/" class="block px-4 py-2.5 text-[#000e2a] no-underline text-[15px] hover:bg-gray-50 hover:text-[#086bdb] transition-colors duration-150"> Accounting </a><a href="/topic/big-data/crm/" class="block px-4 py-2.5 text-[#000e2a] no-underline text-[15px] hover:bg-gray-50 hover:text-[#086bdb] transition-colors duration-150"> CRM </a><a href="https://academy.techrepublic.com/" class="block px-4 py-2.5 text-[#000e2a] no-underline text-[15px] hover:bg-gray-50 hover:text-[#086bdb] transition-colors duration-150"> Academy </a><a href="/topic/cloud/" class="block px-4 py-2.5 text-[#000e2a] no-underline text-[15px] hover:bg-gray-50 hover:text-[#086bdb] transition-colors duration-150"> Cloud </a><a href="/topic/innovation/" class="block px-4 py-2.5 text-[#000e2a] no-underline text-[15px] hover:bg-gray-50 hover:text-[#086bdb] transition-colors duration-150"> Innovation </a><a href="/topic/smart-persons-guides/" class="block px-4 py-2.5 text-[#000e2a] no-underline text-[15px] hover:bg-gray-50 hover:text-[#086bdb] transition-colors duration-150"> Cheat Sheets </a><a href="/topic/big-data/" class="block px-4 py-2.5 text-[#000e2a] no-underline text-[15px] hover:bg-gray-50 hover:text-[#086bdb] transition-colors duration-150"> Big Data </a> <a href="https://www.techrepublic.com/topic/" class="block px-4 py-2.5 text-[#086bdb] no-underline text-[15px] font-bold hover:bg-gray-50">
View All Topics
</a> <div class="border-t border-gray-200 my-2"></div> <div class="px-4 py-2 text-[10px] font-bold uppercase tracking-wider text-gray-400">
Resources
</div> <a href="/hubs/the-enterprise-guide-to-scalable-ai/" class="block px-4 py-2.5 text-[#000e2a] no-underline text-[15px] hover:bg-gray-50 hover:text-[#086bdb] transition-colors duration-150"> The Enterprise Guide to Scalable AI </a><a href="/hubs/the-ai-ready-workplace-hub/" class="block px-4 py-2.5 text-[#000e2a] no-underline text-[15px] hover:bg-gray-50 hover:text-[#086bdb] transition-colors duration-150"> The AI-Ready Workplace Hub </a> <a href="/premium/" class="block px-4 py-2.5 text-[#000e2a] no-underline text-[15px] hover:bg-gray-50 hover:text-[#086bdb] transition-colors duration-150"> TechRepublic Premium </a><a href="https://academy.techrepublic.com/" class="block px-4 py-2.5 text-[#000e2a] no-underline text-[15px] hover:bg-gray-50 hover:text-[#086bdb] transition-colors duration-150"> TechRepublic Academy </a><a href="/newsletters/" class="block px-4 py-2.5 text-[#000e2a] no-underline text-[15px] hover:bg-gray-50 hover:text-[#086bdb] transition-colors duration-150"> Newsletters </a><a href="/resource-library/" class="block px-4 py-2.5 text-[#000e2a] no-underline text-[15px] hover:bg-gray-50 hover:text-[#086bdb] transition-colors duration-150"> Resource Library </a><a href="/forums/" class="block px-4 py-2.5 text-[#000e2a] no-underline text-[15px] hover:bg-gray-50 hover:text-[#086bdb] transition-colors duration-150"> Forums </a><a href="/sponsored/" class="block px-4 py-2.5 text-[#000e2a] no-underline text-[15px] hover:bg-gray-50 hover:text-[#086bdb] transition-colors duration-150"> Sponsored </a> </div> </div> </div> </tr-header> <div data-ad-slot="curtain" class="curtain data-empty:hidden print:hidden" data-unit-base="/5055/aw-techrepublic" data-category="data-centers"></div> <div class="wrapper flex flex-col b techrepublic-com pt-5"> <div class="flex items-center justify-center min-h-[90px]! md:min-h-[130px]! print:hidden inline-top data-empty:hidden" data-ad-slot="inline-top"> </div> <div class="space-y-10"> <div class="flex flex-col gap-y-2 md:flex-row md:justify-between md:gap-x-4 md:gap-y-0 border-t-2 border-secondary"> <div> <nav aria-label="Breadcrumb"> <ol class="text-[12px]/[13px] tracking-[1.2px] flex items-center space-x-2 font-mono list-none p-0 m-0"> <li class="flex items-center space-x-2"> <a class="py-1.5 uppercase font-semibold" href="/"> Home </a> </li><li class="flex items-center space-x-2"> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" class="lucide lucide-chevron-right-icon lucide-chevron-right w-4 text-primary"><path d="m9 18 6-6-6-6" /></svg> <a class="py-1.5 uppercase font-semibold bg-primary text-primary-foreground hover:text-primary-foreground hover:bg-primary/90 px-2" href="/topic/data-centers/"> Data Centers </a> </li> </ol> </nav> </div> <div class="flex flex-wrap items-center gap-x-6 gap-y-1"> <div class="flex items-center gap-3 py-1.5"> <div class="text-[#424242] font-mono text-xs uppercase tracking-[0.6px] font-medium"> SHARE </div> <div class="flex items-center gap-3"> <astro-island uid="2rdPKH" prefix="s0" component-url="https://www.techrepublic.com/astrostatic/c733c3a8/_astro/ForumDiscussionButton.KJYNv5Cy.js" component-export="default" renderer-url="https://www.techrepublic.com/astrostatic/c733c3a8/_astro/client.B-cu3CQi.js" props="{&quot;id&quot;:[0,&quot;67414&quot;]}" ssr="" client="idle" opts="{&quot;name&quot;:&quot;ForumDiscussionButton&quot;,&quot;value&quot;:true}" await-children=""><button title="Start a discussion" class="cursor-pointer w-[17px] h-[17px] flex items-center justify-center transition text-primary hover:text-primary/80 hover:scale-125" aria-label="Start a discussion"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-message-circle-icon lucide-message-circle w-4 h-4" aria-hidden="true"><path d="M2.992 16.342a2 2 0 0 1 .094 1.167l-1.065 3.29a1 1 0 0 0 1.236 1.168l3.413-.998a2 2 0 0 1 1.099.092 10 10 0 1 0-4.777-4.719" /></svg></button><!--astro:end--></astro-island> <a href="https://www.facebook.com/sharer.php?u=https%3A%2F%2Fc733c3a8-constellation.micah-shackelford.workers.dev%2Fsites%2Ftechrepublic.com%2Farticle%2Fhow-to-set-up-high-availability-storage-with-glusterfs-on-ubuntu-18-04%2F" aria-label="Share on Facebook" data-share-link="" data-share-title="How to set up high availability storage with GlusterFS on Ubuntu 18.04" target="_blank" rel="nofollow" class="w-[17px] h-[17px] flex items-center justify-center transition text-primary hover:text-primary/80 hover:scale-125"><svg role="img" viewBox="0 0 24 24" class="fill-current" width="17" height="17"><title>Facebook</title><path d="M9.101 23.691v-7.98H6.627v-3.667h2.474v-1.58c0-4.085 1.848-5.978 5.858-5.978.401 0 .955.042 1.468.103a8.68 8.68 0 0 1 1.141.195v3.325a8.623 8.623 0 0 0-.653-.036 26.805 26.805 0 0 0-.733-.009c-.707 0-1.259.096-1.675.309a1.686 1.686 0 0 0-.679.622c-.258.42-.374.995-.374 1.752v1.297h3.919l-.386 2.103-.287 1.564h-3.246v8.245C19.396 23.238 24 18.179 24 12.044c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.628 3.874 10.35 9.101 11.647Z" /></svg></a> <a href="https://x.com/intent/tweet?url=https%3A%2F%2Fc733c3a8-constellation.micah-shackelford.workers.dev%2Fsites%2Ftechrepublic.com%2Farticle%2Fhow-to-set-up-high-availability-storage-with-glusterfs-on-ubuntu-18-04%2F&text=How+to+set+up+high+availability+storage+with+GlusterFS+on+Ubuntu+18.04&via=TechRepublic" aria-label="Share on X" data-share-link="" data-share-title="How to set up high availability storage with GlusterFS on Ubuntu 18.04" target="_blank" rel="nofollow" class="w-[17px] h-[17px] flex items-center justify-center transition text-primary hover:text-primary/80 hover:scale-125"><svg role="img" viewBox="0 0 24 24" class="fill-current" width="17" height="17"><title>X</title><path d="M14.234 10.162 22.977 0h-2.072l-7.591 8.824L7.251 0H.258l9.168 13.343L.258 24H2.33l8.016-9.318L16.749 24h6.993zm-2.837 3.299-.929-1.329L3.076 1.56h3.182l5.965 8.532.929 1.329 7.754 11.09h-3.182z" /></svg></a> <a href="https://pinterest.com/pin/create/button/?url=https%3A%2F%2Fc733c3a8-constellation.micah-shackelford.workers.dev%2Fsites%2Ftechrepublic.com%2Farticle%2Fhow-to-set-up-high-availability-storage-with-glusterfs-on-ubuntu-18-04%2F&media=https%3A%2F%2Fassets.techrepublic.com%2Fuploads%2F2016%2F06%2Fdatacenterhero.jpg&description=If+you+need+to+set+up+a+distributed+file+system+in+your+data+center%2C+you+can%E2%80%99t+go+wrong+with+GlusterFS.+Jack+Wallen+shows+you+how.%0A" aria-label="Share on Pinterest" data-share-link="" data-share-title="How to set up high availability storage with GlusterFS on Ubuntu 18.04" target="_blank" rel="nofollow" class="w-[17px] h-[17px] flex items-center justify-center transition text-primary hover:text-primary/80 hover:scale-125"><svg role="img" viewBox="0 0 24 24" class="fill-current" width="17" height="17"><title>Pinterest</title><path d="M12.017 0C5.396 0 .029 5.367.029 11.987c0 5.079 3.158 9.417 7.618 11.162-.105-.949-.199-2.403.041-3.439.219-.937 1.406-5.957 1.406-5.957s-.359-.72-.359-1.781c0-1.663.967-2.911 2.168-2.911 1.024 0 1.518.769 1.518 1.688 0 1.029-.653 2.567-.992 3.992-.285 1.193.6 2.165 1.775 2.165 2.128 0 3.768-2.245 3.768-5.487 0-2.861-2.063-4.869-5.008-4.869-3.41 0-5.409 2.562-5.409 5.199 0 1.033.394 2.143.889 2.741.099.12.112.225.085.345-.09.375-.293 1.199-.334 1.363-.053.225-.172.271-.401.165-1.495-.69-2.433-2.878-2.433-4.646 0-3.776 2.748-7.252 7.92-7.252 4.158 0 7.392 2.967 7.392 6.923 0 4.135-2.607 7.462-6.233 7.462-1.214 0-2.354-.629-2.758-1.379l-.749 2.848c-.269 1.045-1.004 2.352-1.498 3.146 1.123.345 2.306.535 3.55.535 6.607 0 11.985-5.365 11.985-11.987C23.97 5.39 18.592.026 11.985.026L12.017 0z" /></svg></a> <a href="https://api.whatsapp.com/send?text=How+to+set+up+high+availability+storage+with+GlusterFS+on+Ubuntu+18.04+%0A%0Ahttps%3A%2F%2Fc733c3a8-constellation.micah-shackelford.workers.dev%2Fsites%2Ftechrepublic.com%2Farticle%2Fhow-to-set-up-high-availability-storage-with-glusterfs-on-ubuntu-18-04%2F" aria-label="Share on Whatsapp" data-share-link="" data-share-title="How to set up high availability storage with GlusterFS on Ubuntu 18.04" target="_blank" rel="nofollow" class="w-[17px] h-[17px] flex items-center justify-center transition text-primary hover:text-primary/80 hover:scale-125"><svg role="img" viewBox="0 0 24 24" class="fill-current" width="17" height="17"><title>WhatsApp</title><path d="M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 01-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 01-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 012.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0012.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 005.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 00-3.48-8.413Z" /></svg></a> </div> </div> <a href="https://www.google.com/preferences/source?q=techrepublic.com" target="_blank" rel="noopener nofollow" data-preferred-source="" data-site-domain="techrepublic.com" data-surface="article_header" title="See more from TechRepublic in Google Search" aria-label="Add TechRepublic as a preferred source on Google. Opens in a new tab." class="inline-flex items-center gap-2 rounded-full border py-1 pl-1 pr-3 text-[12px]/[16px] font-medium whitespace-nowrap transition-colors duration-150 focus-visible:outline-2 focus-visible:outline-offset-2 border-primary/35 text-legible-primary text-primary hover:border-primary hover:bg-primary hover:text-primary-foreground focus-visible:outline-primary"><span class="grid size-5 shrink-0 place-items-center rounded-full bg-white shadow-[inset_0_0_0_1px_rgba(0,0,0,0.08)]"><svg viewBox="0 0 48 48" width="48" height="48" class="size-3" aria-hidden="true">
<path fill="#EA4335" d="M24 9.5c3.54 0 6.71 1.22 9.21 3.6l6.85-6.85C35.9 2.38 30.47 0 24 0 14.62 0 6.51 5.38 2.56 13.22l7.98 6.19C12.43 13.72 17.74 9.5 24 9.5z" />
<path fill="#4285F4" d="M46.98 24.55c0-1.57-.15-3.09-.38-4.55H24v9.02h12.94c-.58 2.96-2.26 5.48-4.78 7.18l7.73 6c4.51-4.18 7.09-10.36 7.09-17.65z" />
<path fill="#FBBC05" d="M10.53 28.59c-.48-1.45-.76-2.99-.76-4.59s.27-3.14.76-4.59l-7.98-6.19C.92 16.46 0 20.12 0 24c0 3.88.92 7.54 2.56 10.78l7.97-6.19z" />
<path fill="#34A853" d="M24 48c6.48 0 11.93-2.13 15.89-5.81l-7.73-6c-2.15 1.45-4.92 2.3-8.16 2.3-6.26 0-11.57-4.22-13.47-9.91l-7.98 6.19C6.51 42.62 14.62 48 24 48z" />
</svg></span>Add TechRepublic as a preferred source</a> </div> </div> <div class="flex lg:flex-row flex-col gap-[30px] items-stretch"> <div class="shrink min-w-0 w-full"> <div class="space-y-[24px]"> <h1 class="h1 text-[36px]/[40px] normal-case">How to set up high availability storage with GlusterFS on Ubuntu 18.04</h1> </div> </div> <aside class="lg:min-w-[300px] lg:max-w-[300px] gap-10 flex flex-col content-sidebar"> </aside> </div> <div class="flex lg:flex-row flex-col gap-[30px] items-stretch"> <div class="shrink min-w-0 w-full"> <div class="md:col-span-2 space-y-[24px] h-max" id="article-container" data-save-article-root="true" data-save-article-id="67414"> <div class="border-b border-zinc-300 space-y-[24px] pb-[24px] mb-[24px]"> <p class="text-secondary text-[20px]/[28px]">If you need to set up a distributed file system in your data center, you can’t go wrong with GlusterFS. Jack Wallen shows you how.
</p> <div class="font-mono text-[12px] uppercase text-zinc-600 space-y-4 tracking-wider"> <div class="flex flex-wrap gap-4"> <div class="flex flex-col gap-1"> <span>Written By</span> <a class="font-bold flex items-center" href="/meet-the-team/us/jack-wallen/"> <div class="h-auto overflow-hidden rounded-full w-[35px] h-[35px] shrink-0 mr-2 relative" data-lazyimage=""> <img alt="" src="data:image/jpeg;base64,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" decoding="async" aria-hidden="true" class="aspect-square object-cover object-center h-auto overflow-hidden rounded-full w-[35px] h-[35px] shrink-0 mr-2 absolute inset-0" style="z-index: -1"> <div data-blur="" class="absolute inset-0 transition-opacity duration-300" style="backdrop-filter: blur(20px); z-index: 1;"></div> <img src="https://secure.gravatar.com/avatar/26000e280009ee0577eaa3ae5aa88093?d=mm&r=g" srcset="https://secure.gravatar.com/avatar/26000e280009ee0577eaa3ae5aa88093?d=mm&r=g 64w" alt="Jack Wallen" loading="lazy" fetchpriority="low" decoding="async" data-image="true" style="opacity:0" width="96" height="96" class="aspect-square object-cover object-center h-auto overflow-hidden rounded-full w-[35px] h-[35px] shrink-0 mr-2 transition-opacity duration-300"> </div> Jack Wallen </a> </div> </div> <div class="flex items-center gap-2"> <div class="flex flex-col md:flex-row gap-2"> <div> Aug 8, 2018 </div> </div> </div> </div> </div> <div class="-mt-[24px] flex justify-start"> <div data-save-state="" data-save-item-type="article" data-save-id="67414" class="group flex w-fit max-w-full items-center gap-2 bg-primary/10 border border-primary/10 px-2 pr-0"> <div class="min-w-0 group-data-[resume]:hidden"> <button type="button" data-save-toggle="" data-save-item-type="article" data-save-id="67414" data-save-slug="how-to-set-up-high-availability-storage-with-glusterfs-on-ubuntu-18-04" data-save-title="How to set up high availability storage with GlusterFS on Ubuntu 18.04" data-save-surface="article_inline" aria-pressed="false" class="group cursor-pointer border-none bg-transparent p-0 transition-[color,opacity] motion-reduce:transition-none flex w-full min-h-8 items-center gap-1.5 text-left text-[14px]/[16px] font-semibold text-secondary hover:underline"> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-bookmark-icon lucide-bookmark size-4 group-data-[saved]:hidden" aria-hidden="true"><path d="M17 3a2 2 0 0 1 2 2v15a1 1 0 0 1-1.496.868l-4.512-2.578a2 2 0 0 0-1.984 0l-4.512 2.578A1 1 0 0 1 5 20V5a2 2 0 0 1 2-2z" /></svg> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-bookmark-check-icon lucide-bookmark-check size-4 hidden group-data-[saved]:block fill-current" aria-hidden="true"><path d="M17 3a2 2 0 0 1 2 2v15a1 1 0 0 1-1.496.868l-4.512-2.578a2 2 0 0 0-1.984 0l-4.512 2.578A1 1 0 0 1 5 20V5a2 2 0 0 1 2-2z" /><path d="m9 10 2 2 4-4" /></svg> <span class="mr-3" data-save-label="">
Save for later
</span> </button> </div> <button type="button" data-save-resume-control="" data-save-resume="" data-save-id="67414" class="hidden min-h-8 min-w-0 cursor-pointer items-center gap-1.5 border-none bg-transparent p-0 text-left text-[14px]/[16px] font-semibold text-secondary group-data-[resume]:flex"> <span data-save-resume-pct=""></span> <span class="truncate">Continue reading</span> </button> <button type="button" data-save-remove="" data-save-item-type="article" data-save-id="67414" aria-label="Remove from saved" class="hidden size-8 shrink-0 cursor-pointer items-center justify-center border-none bg-transparent text-zinc-500 transition-colors group-data-[saved]:flex hover:bg-zinc-100 hover:text-zinc-700 motion-reduce:transition-none"> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-x-icon lucide-x size-4" aria-hidden="true"><path d="M18 6 6 18" /><path d="m6 6 12 12" /></svg> </button> </div> <script>
;(() => {
try {
const match = location.pathname.match(/^\/sites\/([^/]+)\//)
const scope = match ? match[1] : location.hostname
const ids = JSON.parse(
localStorage.getItem("sfl-saved-ids:" + scope) || "[]",
)
const prog = JSON.parse(
localStorage.getItem("reading-progress:" + scope) || "{}",
)
const saved = new Set(ids)
for (const el of document.querySelectorAll("[data-save-toggle]")) {
const on = saved.has(
el.getAttribute("data-save-item-type") +
":" +
el.getAttribute("data-save-id"),
)
if (on) el.setAttribute("data-saved", "")
else el.removeAttribute("data-saved")
el.setAttribute("aria-pressed", on ? "true" : "false")
const label = el.querySelector("[data-save-label]")
if (label) label.textContent = on ? "Saved" : "Save for later"
}
// The article widget. Both flags live on the card because CSS swaps
// its halves off them, and that has to happen before hydration.
// `data-resume` is deliberately narrower than `data-saved`: resume
// shows only where there is somewhere to go, so it is absent below
// 5% and again on a finished article, which is how the control
// retires itself without the item leaving the reader's list.
for (const card of document.querySelectorAll("[data-save-state]")) {
const id = card.getAttribute("data-save-id")
const on = saved.has(
card.getAttribute("data-save-item-type") + ":" + id,
)
const entry = prog[id]
const pct = entry ? entry.percent : 0
const resume = on && pct >= 5 && pct < 90
if (on) card.setAttribute("data-saved", "")
else card.removeAttribute("data-saved")
if (resume) card.setAttribute("data-resume", "")
else card.removeAttribute("data-resume")
if (!resume) continue
const label = card.querySelector("[data-save-resume-pct]")
if (label) label.textContent = pct + "%"
}
document.dispatchEvent(new CustomEvent("save:rescan"))
} catch {
/* storage unavailable — leave server-rendered defaults */
}
})()
</script> </div> <div id="affiliate-callout" class="rounded-xl border border-gray-400 p-4">
We may earn from vendors via affiliate links or
sponsorships. This might affect product placement on our
site, but not the content of our reviews. See our <a href="/terms-conditions/"> Terms of Use </a> for
details.
</div> <div class="prose"> <astro-article-contents data-astro-cid-7jion4xf="true"> <div class="article-contents" data-article-id="67414" data-gate-threshold="0.4" data-astro-cid-7jion4xf=""> <div class="prose"> <figure style="width:770px" id="attachment_5447" aria-describedby="caption-attachment-5447"><img loading="lazy" decoding="async" src="https://assets.techrepublic.com/uploads/2016/06/datacenterhero.jpg" width="770"><figcaption id="caption-attachment-5447"><br>Image: Jack Wallen</figcaption></figure>
<p>GlusterFS is a network file system capable of handling petabytes of data and thousands of users. For your data center Linux servers, GlusterFS might well be the file system you need for on-premises storage.</p>
<h3 id="more-about-data-centers">More about data centers</h3>
<ul>
<li>
<a property="url" target="" aria-label="Go to article Stargate Norway: OpenAI’s First AI Data Center in Europe" href="https://www.techrepublic.com/article/news-openai-stargate-norway-ai-data-center/">
Stargate Norway: OpenAI’s First AI Data Center in Europe </a>
</li>
<li>
<a property="url" target="" aria-label="Go to article AI Data Centers’ Soaring Energy Use: Who Pays for Higher Utilities Costs?" href="https://www.techrepublic.com/article/news-ai-data-center-energy-utilities/">
AI Data Centers’ Soaring Energy Use: Who Pays for Higher Utilities Costs? </a>
</li>
<li>
<a property="url" target="" aria-label="Go to article China’s Submerged AI Data Center Could ‘Influence Global Sustainable Computing’" href="https://www.techrepublic.com/article/news-china-underwater-ai-data-center-shanghai/">
China’s Submerged AI Data Center Could ‘Influence Global Sustainable Computing’ </a>
</li>
<li>
<a property="url" target="" aria-label="Go to article Google to Power Data Centers With Nuclear Energy by 2030 in First-Of-A-Kind’ Agreement" href="https://www.techrepublic.com/article/news-google-data-centers-nuclear-energy-2030/">
Google to Power Data Centers With Nuclear Energy by 2030 in First-Of-A-Kind’ Agreement </a>
</li>
</ul>
<p>I’m going to show you how to set up three Ubuntu servers that will represent a single namespace, using GlusterFS. I’ll be demonstrate on Ubuntu 18.04 and will assume you already have three Ubuntu Servers ready to go.</p>
<p>And with that said, let’s get GlusterFS up and running.</p>
<p><strong>SEE: <a href="http://b2b.cbsimg.net/downloads/TRPro/QG_storage.pdf">Quick glossary: Storage</a> (Tech Pro Research)</strong></p>
<div class="toc-container"><astro-collapsible class="toc expanded z-1"><button class="header cursor-pointer" aria-label="Toggle table of contents" data-collapsible-trigger=""><div aria-hidden="true">Contents</div><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-move-down-icon lucide-move-down" aria-hidden="true"><path d="M8 18L12 22L16 18" /><path d="M12 2V22" /></svg></button><ul class="toc-list"><li class="unstyled"><a href="#the-layout">The layout</a></li><li class="unstyled"><a href="#mapping-addresses">Mapping addresses</a></li><li class="unstyled"><a href="#add-the-necessary-repository">Add the necessary repository</a></li><li class="unstyled"><a href="#installing-starting-and-enabling">Installing, starting, and enabling GlusterFS</a></li><li class="unstyled"><a href="#configure-gluster-fs">Configure GlusterFS</a></li><li class="unstyled"><a href="#create-a-distributed-gluster-fs-v">Create a distributed GlusterFS volume</a></li><li class="unstyled"><a href="#the-gluster-fs-client">The GlusterFS client</a></li><li class="unstyled"><a href="#testing">Testing</a></li></ul></astro-collapsible></div><div class="jwplayer-wrapper mx-auto my-6 w-full max-w-[640px] aspect-video print:hidden" data-jwplayer-wrapper="11c5f516-ab03-4a30-bd8f-67e41a618e2d"> <div id="11c5f516-ab03-4a30-bd8f-67e41a618e2d"></div> </div> <script>(function(){const id = "11c5f516-ab03-4a30-bd8f-67e41a618e2d";
const token = "11c5f516-ab03-4a30-bd8f-67e41a618e2d";
const cid = "9e857bcd-b137-450c-abcf-2838a1b053cb";
const targetingKVPs = {"env":"prod","stage":"prod","url":"www.techrepublic.com/article/how-to-set-up-high-availability-storage-with-glusterfs-on-ubuntu-18-04/","hostname":"www.techrepublic.com","edge_country":"US","cid":"how-to-set-up-high-availability-storage-with-glusterfs-on-ubuntu-18-04","path":"sites,techrepublic.com,article,how-to-set-up-high-availability-storage-with-glusterfs-on-ubuntu-18-04","category":"data-centers,open-source","topic":"data-centers,open-source","ptype":"article","news":"no","author":"jack-wallen"};
const playerSrc = "https://cd.connatix.com/connatix.player.js?cid=9e857bcd-b137-450c-abcf-2838a1b053cb&pid=11c5f516-ab03-4a30-bd8f-67e41a618e2d";
/*
* Skybox fill contract (keep in sync with src/components/ad/SkyboxAd.astro):
* Non-empty skybox sets data-loaded on [data-ad-slot='skybox']
* then dispatches skybox-ad-ready. We probe the DOM initially;
* if empty, we listen for that event so a late fill still suppresses Connatix.
*/
function isSkyboxFilled() {
return Boolean(
document.querySelector("[data-ad-slot='skybox'][data-loaded]"),
)
}
const wrapper = document.querySelector(`[data-jwplayer-wrapper="${id}"]`)
let suppressed = false
let playerRequested = false
// The wrapper reserves its box via aspect-video, so deferring the player
// script costs no CLS. Load it only once the player is near the viewport
// (~940 KB of Connatix JS otherwise competes with everything at startup).
const loadPlayerScript = () => {
if (playerRequested || suppressed) return
playerRequested = true
const script = document.createElement("script")
script.async = true
script.src = playerSrc
document.head.appendChild(script)
}
const observer =
"IntersectionObserver" in window
? new IntersectionObserver(
(entries) => {
if (entries.some((entry) => entry.isIntersecting)) {
observer.disconnect()
loadPlayerScript()
}
},
{ rootMargin: "300px 0px" },
)
: null
const suppressPlayer = () => {
if (suppressed) return
// Do not suppress player on desktop
if (window.innerWidth > 768) return
suppressed = true
observer?.disconnect()
if (wrapper) {
wrapper.remove()
}
}
if (isSkyboxFilled()) {
suppressPlayer()
} else {
// Try to suppress player on late skybox fill
document.addEventListener("skybox-ad-ready", suppressPlayer, {
once: true,
})
if (wrapper && observer) {
observer.observe(wrapper)
} else {
loadPlayerScript()
}
window.cnx = window.cnx || { cmd: [] }
window.cnx.cmd.push(function () {
// do not add the pixel if the player is suppressed
const mount = document.getElementById(id)
if (suppressed || !mount || !mount.isConnected) return
new Image().src =
"https://capi.connatix.com/tr/si?token=" + token + "&cid=" + cid
cnx({
playerId: token,
settings: {
queryJsTargeting: targetingKVPs,
advertising: { macros: targetingKVPs },
},
}).render(id)
})
}
})();</script> <div class="has-data-empty:hidden print:hidden"> <div class="flex justify-center min-h-[190px] inline-article-native data-empty:hidden" data-ad-slot="inline-article-native"> </div> </div><h2 id="the-layout">The layout</h2>
<p>I have three Ubuntu 18.04 servers at the following addresses:</p>
<ul>
<li>192.168.1.206</li>
<li>192.168.1.207</li>
<li>192.168.1.208</li>
</ul>
<h2 id="mapping-addresses">Mapping addresses</h2>
<p>Open up the hosts file on each server with the command <em>sudo nano /etc/hosts</em> and then add the following (modifying to fit your IP address scheme):</p>
<p><code>192.168.1.206 gfs01<br>
192.168.1.207 gfs02<br>
192.168.1.208 gfs03</code></p>
<p>Save and close those files.</p>
<p>To make matters clearer, change the hostnames for each server to represent that which is mapped in the hosts file.</p>
<h2 id="add-the-necessary-repository">Add the necessary repository</h2>
<p>On each server, issue the following commands to add the necessary dependency, repository, and key:</p>
<p><code>sudo apt install software-properties-common -y<br>
wget -O- https://download.gluster.org/pub/gluster/glusterfs/3.12/rsa.pub | apt-key add -<br>
sudo add-apt-repository ppa:gluster/glusterfs-3.12<br>
</code></p>
<div class="has-data-empty:hidden print:hidden"> <div class="flex items-center gap-4 pt-2"> <div class="flex-1 border-t border-zinc-300"></div> <span class="text-xs uppercase font-semibold text-zinc-600">
Advertisement
</span> <div class="flex-1 border-t border-zinc-300"></div> </div> <div class="flex justify-center items-center min-h-[260px] py-2"> <div class="flex justify-center inline-article-display data-empty:hidden" data-ad-slot="inline-article-display"> </div> </div> <div class="border-t border-zinc-300"></div> </div><h2 id="installing-starting-and-enabling">Installing, starting, and enabling GlusterFS</h2>
<p>From the terminal on gfs01 and gfs02, issue the following command to install GlusterFS:</p>
<p><code>sudo apt install glusterfs-server -y</code></p>
<p>Now we can start and enable GlusterFS with the commands:</p>
<p><code>sudo systemctl start glusterd<br>
sudo systemctl enable glusterd</code></p>
<h2 id="configure-gluster-fs">Configure GlusterFS</h2>
<p>The first thing to do is to create a trusted pool. This is done on gfs01 with the command:</p>
<p><code>sudo gluster peer probe gfs02</code></p>
<p>You should immediately see <em>peer probe: success.</em></p>
<p>You can check the status of peers with the command:</p>
<p><code>sudo gluster peer status</code></p>
<p>You should see that 1 peer has been added (<strong>Figure A</strong>).</p>
<p><strong>Figure A</strong></p>
<p><img loading="lazy" decoding="async" src="https://assets.techrepublic.com/uploads/2018/08/glustera.jpg" width=""></p>
<h2 id="create-a-distributed-gluster-fs-v">Create a distributed GlusterFS volume</h2>
<p>With our pool created, we must create a distributed GlusterFS volume. I would recommend creating this volume on a partition that isn’t within the system directory, otherwise sync errors may occur. Create a new directory on both gfs01 and gfs02 with the command:</p>
<p><code>sudo mkdir -p /glusterfs/distributed</code></p>
<div class="has-data-empty:hidden print:hidden"> <div class="flex justify-center min-h-[190px] inline-article-native data-empty:hidden" data-ad-slot="inline-article-native"> </div> </div><p>Next we can create the volume. We’ll create a volume named v01 with replicas gfs01 and gfs02 with the command (issued on gfs01):</p>
<p><code>sudo gluster volume create v01 replica 2 transport tcp gfs01:/glusterfs/distributed gfs02:/glusterfs/distributed</code></p>
<p>After the distributed filesystem has been created, you need to start the volume with the command:</p>
<pre class="hljs"><span class="hljs-built_in">sudo</span> gluster volume start v01</pre>
<p>You can check the status of the volume with the command:</p>
<p><code>sudo gluster volume info v01</code></p>
<p>You should see the volume has been started (<strong>Figure B</strong>).</p>
<p><strong>Figure B</strong></p>
<p><img loading="lazy" decoding="async" src="https://assets.techrepublic.com/uploads/2018/08/glusterfsb.jpg" width=""></p>
<h2 id="the-gluster-fs-client">The GlusterFS client</h2>
<p>We’re going to use gfs03 as our client. To install the necessary package, issue the command:</p>
<p><code>sudo apt install glusterfs-client -y</code></p>
<p>After the installation completes, create a mount point with the command:</p>
<p><code>sudo mkdir -p /mnt/glusterfs</code></p>
<p>Mount the distributed glusterfs volume with the command:</p>
<p><code>sudo mount -t glusterfs gfs01:/v01 /mnt/glusterfs/</code></p>
<p>Check the volume with the command:</p>
<p><code>df -h /mnt/glusterfs</code></p>
<p>You should see the volume has been successfully mounted (<strong>Figure C</strong>).</p>
<p><strong>Figure C</strong></p>
<p><img loading="lazy" decoding="async" src="https://assets.techrepublic.com/uploads/2018/08/glusterfsc.jpg" width=""></p><div class="print:hidden"> <astro-island uid="Z1V4U0L" prefix="s2" component-url="https://www.techrepublic.com/astrostatic/c733c3a8/_astro/InlineNewsletterSubscribe.O4WPrSOs.js" component-export="default" renderer-url="https://www.techrepublic.com/astrostatic/c733c3a8/_astro/client.B-cu3CQi.js" props="{&quot;config&quot;:[0,{&quot;title&quot;:[0,&quot;Newsletters - TechRepublic&quot;],&quot;header&quot;:[0,&quot;Daily Tech Insider&quot;],&quot;subheader&quot;:[0,&quot;If you can only read one tech story a day, this is it.&quot;],&quot;primarySubscription&quot;:[0,{&quot;code&quot;:[0,&quot;daily-tech-insider&quot;],&quot;name&quot;:[0,&quot;Daily Tech Insider&quot;],&quot;label&quot;:[0,&quot;If you can only read one tech story a day, this is it.&quot;]}],&quot;preferenceCenterCodes&quot;:[1,[[0,&quot;daily-tech-insider&quot;],[0,&quot;cybersecurity-insider&quot;],[0,&quot;cloud-insider&quot;],[0,&quot;data-insider&quot;],[0,&quot;developer-insider&quot;],[0,&quot;executive-briefing&quot;],[0,&quot;innovation-insider&quot;],[0,&quot;microsoft-weekly&quot;],[0,&quot;project-management-insider&quot;],[0,&quot;tech-insider-europe-by-techrepublic&quot;],[0,&quot;daily-tech-insider-au&quot;]]],&quot;exitIntent&quot;:[0,{&quot;targeting&quot;:[0,{&quot;europe&quot;:[0,&quot;tech-insider-europe-by-techrepublic&quot;]}]}],&quot;assets&quot;:[0,{&quot;backgroundImage&quot;:[0,null],&quot;desktopPreview&quot;:[0,null],&quot;mobilePreview&quot;:[0,null],&quot;peopleImage&quot;:[0,null]}]}],&quot;websiteName&quot;:[0,&quot;TechRepublic&quot;],&quot;slug&quot;:[0,&quot;techrepublic&quot;]}" ssr="" client="idle" opts="{&quot;name&quot;:&quot;InlineNewsletterSubscribe&quot;,&quot;value&quot;:true}" await-children=""><!--[--><!----><!----><!----><!--]--><!--astro:end--></astro-island> </div>
<p>To make this mount happen upon reboot, and add the following line to the gfs03 <em>/etc/fstab</em> file:</p>
<div class="has-data-empty:hidden print:hidden"> <div class="flex items-center gap-4 pt-2"> <div class="flex-1 border-t border-zinc-300"></div> <span class="text-xs uppercase font-semibold text-zinc-600">
Advertisement
</span> <div class="flex-1 border-t border-zinc-300"></div> </div> <div class="flex justify-center items-center min-h-[260px] py-2"> <div class="flex justify-center inline-article-display data-empty:hidden" data-ad-slot="inline-article-display"> </div> </div> <div class="border-t border-zinc-300"></div> </div><p><code>gfs01:/v01 /mnt/glusterfs glusterfs defaults,_netdev 0 0</code></p>
<p>Now, should you have to reboot your server, the GlusterFS volume will automatically mount.</p>
<h2 id="testing">Testing</h2>
<p>On gsf01, issue the command:</p>
<p><code>sudo mount -t glusterfs gfs01:/v01 /mnt</code></p>
<p>On gsf02, issue the command:</p>
<p><code>sudo mount -t glusterfs gfs02:/v01 /mnt</code></p>
<p>Now go back to gfs03 and create a test file with the command:</p>
<p><code>sudo touch /mnt/glusterfs/testing</code></p>
<p>Go back to both gfs01 and gfs02 and issue the command:</p>
<p><code>ls /mnt</code></p>
<p>You should see the empty testing file created on gfs03.</p>
<p>At this point, any file created within the mounted volume will be automatically distributed to the nodes. You can create files on gfs01 or gfs02 at <em>/mnt</em> or gfs03 at <em>/mnt/glusterfs, </em>and they will automatically sync.</p>
<p>And that is a GlusterFS distributed file system that offers significant scaling and reliability.</p>
</div> </div> </astro-article-contents> <div style="clear: both;"></div> </div> <div class="border-t border-zinc-300 pt-6 mt-8"> <div class="lg:grid lg:grid-cols-8 gap-[10px] flex"> <a href="/meet-the-team/us/jack-wallen/"> <div class="h-auto overflow-hidden rounded-full w-[65px] h-[65px] shrink-0 relative" data-lazyimage=""> <img alt="" src="data:image/jpeg;base64,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" decoding="async" aria-hidden="true" class="aspect-square object-cover object-center h-auto overflow-hidden rounded-full w-[65px] h-[65px] shrink-0 absolute inset-0" style="z-index: -1"> <div data-blur="" class="absolute inset-0 transition-opacity duration-300" style="backdrop-filter: blur(20px); z-index: 1;"></div> <img src="https://secure.gravatar.com/avatar/26000e280009ee0577eaa3ae5aa88093?d=mm&r=g" srcset="https://secure.gravatar.com/avatar/26000e280009ee0577eaa3ae5aa88093?d=mm&r=g 128w, https://secure.gravatar.com/avatar/26000e280009ee0577eaa3ae5aa88093?d=mm&r=g 256w" alt="Jack Wallen" loading="lazy" fetchpriority="low" decoding="async" data-image="true" style="opacity:0" width="96" height="96" class="aspect-square object-cover object-center h-auto overflow-hidden rounded-full w-[65px] h-[65px] shrink-0 transition-opacity duration-300"> </div> </a> <div class="space-y-4 col-start-2 col-span-7"> <div> <a class="group" href="/meet-the-team/us/jack-wallen/"> <h3 class="h4 font-mono uppercase font-semibold mb-1 group-hover:text-primary text-secondary transition">Jack Wallen</h3> </a> </div> <div class="text-zinc-700 text-[16px]/[24px]"> <p>Jack Wallen is an award-winning writer for TechRepublic, The New Stack, and Linux New Media. He's covered a variety of topics for over twenty years and is an avid promoter of open source. For more news about Jack Wallen, visit his website jackwallen.com.</p> </div> </div> </div> </div> </div> </div> <aside class="lg:min-w-[300px] lg:max-w-[300px] gap-10 flex flex-col content-sidebar"> <div class="grow ad-container print:hidden"><div class="sticky top-[150px] flex flex-col gap-6"><div class="flex justify-center md:justify-start right-rail data-empty:hidden" data-ad-slot="right-rail"> </div> </div></div><div class="grow print:hidden"><div class="sticky top-[150px]"><astro-island uid="1ctb92" prefix="s3" component-url="https://www.techrepublic.com/astrostatic/c733c3a8/_astro/CardNewsletterSubscribe.CDvKoJ8K.js" component-export="default" renderer-url="https://www.techrepublic.com/astrostatic/c733c3a8/_astro/client.B-cu3CQi.js" props="{&quot;config&quot;:[0,{&quot;title&quot;:[0,&quot;Newsletters - TechRepublic&quot;],&quot;header&quot;:[0,&quot;Make smarter decisions with data, AI, and analytics insights.&quot;],&quot;subheader&quot;:[0,&quot;Actionable insights on data, analytics, and AI trends that help leaders turn information into smarter decisions. Delivered Mondays and Thursdays.&quot;],&quot;primarySubscription&quot;:[0,{&quot;code&quot;:[0,&quot;data-insider&quot;],&quot;name&quot;:[0,&quot;Daily Tech Insider&quot;],&quot;label&quot;:[0,&quot;If you can only read one tech story a day, this is it.&quot;]}],&quot;preferenceCenterCodes&quot;:[1,[[0,&quot;daily-tech-insider&quot;],[0,&quot;cybersecurity-insider&quot;],[0,&quot;cloud-insider&quot;],[0,&quot;data-insider&quot;],[0,&quot;developer-insider&quot;],[0,&quot;executive-briefing&quot;],[0,&quot;innovation-insider&quot;],[0,&quot;microsoft-weekly&quot;],[0,&quot;project-management-insider&quot;],[0,&quot;tech-insider-europe-by-techrepublic&quot;],[0,&quot;daily-tech-insider-au&quot;]]],&quot;exitIntent&quot;:[0,{&quot;targeting&quot;:[0,{&quot;europe&quot;:[0,&quot;tech-insider-europe-by-techrepublic&quot;]}]}],&quot;assets&quot;:[0,{&quot;backgroundImage&quot;:[0,null],&quot;desktopPreview&quot;:[0,null],&quot;mobilePreview&quot;:[0,null],&quot;peopleImage&quot;:[0,null]}]}],&quot;websiteName&quot;:[0,&quot;TechRepublic&quot;],&quot;slug&quot;:[0,&quot;techrepublic&quot;],&quot;location&quot;:[0,&quot;sidebar&quot;],&quot;locale&quot;:[0,&quot;en&quot;],&quot;formClass&quot;:[0,&quot;border-[#cbd5e1]&quot;],&quot;headingTag&quot;:[0,&quot;h3&quot;]}" ssr="" client="idle" opts="{&quot;name&quot;:&quot;CardNewsletterSubscribe&quot;,&quot;value&quot;:true}" await-children=""><div class="pt-[20px] pb-[30px] px-[24px] space-y-4 @container bg-primary/10 border-[#cbd5e1]"><h3 class="text-[24px]/[27px] tracking-[1.2px] font-bold uppercase text-secondary">Make smarter decisions with data, AI, and analytics insights.</h3><p class="text-[18px]/[24px] font-light">Actionable insights on data, analytics, and AI trends that help leaders turn information into smarter decisions. Delivered Mondays and Thursdays.</p><!--[--><form class="space-y-4 flex gap-4 flex-wrap justify-between"><input name="email" type="email" value="" placeholder="enter your email" autocomplete="off" style="display:contents;opacity:0;"><div class="flex lg:flex-row flex-col w-full lg:bg-white rounded-full p-1 has-active:border-zinc-400 has-focus:border-zinc-400 border-zinc-200 lg:border border-0 motion-safe:transition flex-col! bg-transparent! border-0! gap-y-2! pb-0! mb-0!"><label for="subscription-email-4773" class="sr-only">ENTER YOUR EMAIL</label><input id="subscription-email-4773" type="email" placeholder="ENTER YOUR EMAIL" class="border border-zinc-300 bg-white w-full text-[16px] p-2 rounded-lg order-1 sm:grow sm:basis-0 lg:w-auto lg:grow flex-1 px-6 py-3 text-gray-800 text-lg lg:border-none outline-none rounded-l-full rounded-r-full lg:rounded-r-none focus:border-tertiary active:border-tertiary lg:active:border-none lg:focus:border-none rounded-full!"><button type="submit" id="join-newsletter-btn" class="text-[16px] rounded-full py-2 order-3 hover:cursor-pointer motion-safe:transition max-sm:w-full px-8 sm:order-2 lg:min-w-[205px] flex items-center justify-center bg-tertiary text-tertiary-foreground hover:bg-tertiary/80 font-bold tracking-wide min-w-auto!">Join For Free</button></div><!----><!--[--><div class="text-sm text-gray-600">By subscribing, you agree to receive emails from TechRepublic. You can unsubscribe at any time. View our <a href="/terms-conditions/" target="_blank">Terms</a> and <a href="/privacy-policy/" target="_blank">Privacy Policy</a>. </div><!--]--></form><!----><!----><!--]--></div><!--astro:end--></astro-island></div></div><div class="grow ad-container print:hidden"><div class="sticky top-[150px]"><div class="flex justify-center md:justify-start right-rail data-empty:hidden" data-ad-slot="right-rail"> </div> </div></div><div class="grow print:hidden"><div class="sticky top-[150px] flex flex-col gap-6"><div class="px-6 py-4 space-y-4 bg-primary/10"><h3 class="h3 uppercase text-secondary text-[20px] tracking-[1px] font-bold border-b border-black/15 pb-2 mb-0">
More From Jack Wallen</h3><ul class="flex flex-col"><li class="py-2 border-b border-black/15"><a class="text-[16px]/[24px]" href="/article/5-reasons-why-you-should-use-a-password-manager/">5 Reasons Why You Should Use a Password Manager</a></li><li class="py-2 border-b border-black/15"><a class="text-[16px]/[24px]" href="/article/linux-101-how-to-clean-the-dnf-and-apt-caches/">How to Clean the DNF and APT Caches in Linux</a></li><li class="py-2 border-b border-black/15"><a class="text-[16px]/[24px]" href="/article/easy-ways-to-ruin-your-smartphone/">How to Break a Phone: Common Causes of Phone Damage</a></li><li class="py-2"><a class="text-[16px]/[24px]" href="/article/how-to-set-up-an-sftp-server-on-linux/">How to Set Up an SFTP Server on Linux</a></li></ul></div></div></div><div class="grow ad-container print:hidden"><div class="sticky top-[150px]"><div class="flex justify-center md:justify-start right-rail data-empty:hidden" data-ad-slot="right-rail"> </div> </div></div> </aside> </div> <aside> <div class="flex flex-col gap-7"> <div class="flex items-start justify-between gap-4"> <div class="text-[20px]/[28px] pt-[12px] tracking-[1.4px] font-bold uppercase grow text-secondary border-t-2 border-secondary"> <h3>Recommended for you...</h3> </div> <div class="hidden md:block"> </div> </div> <div> <div class="grid grid-cols-1 gap-6 md:grid-cols-4"><div class="group/card space-y-[17px]"><div class="flex flex-col w-full"><a class="block group w-full overflow-hidden relative" href="/article/news-data-center-pause-apac-thailand/"> <div class="relative w-full aspect-video"> <div class="w-full h-full relative" data-lazyimage=""> <img alt="" src="data:image/avif;base64,AAAAGGZ0eXBhdmlmAAAAAG1pZjFtaWFmAAAA0m1ldGEAAAAAAAAAIWhkbHIAAAAAAAAAAHBpY3QAAAAAAAAAAAAAAAAAAAAADnBpdG0AAAAAAAEAAAAeaWxvYwAAAABEAAABAAEAAAABAAAA8gAAAJYAAAAjaWluZgAAAAAAAQAAABVpbmZlAgAAAAABAABhdjAxAAAAAFZpcHJwAAAAOGlwY28AAAAUaXNwZQAAAAAAAAAQAAAACgAAAAxhdjFDgT9AAAAAABBwaXhpAAAAAAMKCgoAAAAWaXBtYQAAAAAAAAABAAEDAYIDAAAAnm1kYXQSAAoIP8z+SMBDQbQyhwFlpjtFJxf8/yAgMBAYAAAAAAABJJJIAMGEl6t8+ZbmGjYeTaV9GuwjZbLT6A4eEtD0pEmE9GmhmqG1I3j8KHq+MF9Til2v8YMURGYz8XEb6r6qxQWWNsC2y8obd4oBNyc07wM2D3QZSPxapQi/3Q20tXNSsSPibgLEgjLGml5o9pQp4a9UcSA=" decoding="async" aria-hidden="true" class="w-full h-full object-cover aspect-video absolute inset-0" style="z-index: -1"> <div data-blur="" class="absolute inset-0 transition-opacity duration-300" style="backdrop-filter: blur(20px); z-index: 1;"></div> <img src="https://assets.techrepublic.com/uploads/2026/09/IMGPR6725681_682ad08583307.jpg?w=1024" srcset="https://assets.techrepublic.com/uploads/2026/09/IMGPR6725681_682ad08583307.jpg?w=128 128w, https://assets.techrepublic.com/uploads/2026/09/IMGPR6725681_682ad08583307.jpg?w=256 256w, https://assets.techrepublic.com/uploads/2026/09/IMGPR6725681_682ad08583307.jpg?w=512 512w" alt="Thailand Asks 49 Data Centers to Pause as New Power and Water Rules Loom" sizes="(min-width: 1200px) 266px, (min-width: 768px) calc((100vw - 136px) / 4), calc(100vw - 32px)" loading="lazy" fetchpriority="auto" decoding="async" data-image="true" style="opacity:0" width="1024" height="1672" class="w-full h-full object-cover aspect-video transition-opacity duration-300"> </div> </div> </a><div class="flex items-start justify-between gap-2"><a class="bg-primary overflow-hidden text-primary-foreground inline-block uppercase text-[12px] leading-[16px] font-mono font-semibold hover:bg-primary/90 self-start tracking-widest text-nowrap max-w-full text-ellipsis" href="/topic/artificial-intelligence/"> <astro-island uid="KzIew" prefix="s7" component-url="https://www.techrepublic.com/astrostatic/c733c3a8/_astro/Ticker.Bx_ayGdx.js" component-export="default" renderer-url="https://www.techrepublic.com/astrostatic/c733c3a8/_astro/client.B-cu3CQi.js" props="{&quot;text&quot;:[0,&quot;Artificial Intelligence&quot;]}" ssr="" client="idle" opts="{&quot;name&quot;:&quot;Ticker&quot;,&quot;value&quot;:true}" await-children=""><div class="ticker-container px-[8px] py-[6px] flex" style="--scroll-distance:-0px;" data-v-34ac2891=""><span class="w-full truncate ticker-text" data-v-34ac2891="">Artificial Intelligence</span></div><!--astro:end--></astro-island> </a><button type="button" data-save-toggle="" data-save-item-type="article" data-save-id="4372755" data-save-slug="news-data-center-pause-apac-thailand" data-save-title="Thailand Asks 49 Data Centers to Pause as New Power and Water Rules Loom" data-save-surface="card" aria-pressed="false" aria-label="Save &quot;Thailand Asks 49 Data Centers to Pause as New Power and Water Rules Loom&quot; to read later" class="group cursor-pointer border-none bg-transparent p-0 transition-[color,opacity] motion-reduce:transition-none size-11 -m-1.5 shrink-0 flex items-center justify-center text-zinc-500 hover:text-primary data-[saved]:text-primary lg:opacity-0 lg:group-hover/card:opacity-100 lg:group-focus-within/card:opacity-100 data-[saved]:opacity-100"> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-bookmark-icon lucide-bookmark size-4 group-data-[saved]:hidden" aria-hidden="true"><path d="M17 3a2 2 0 0 1 2 2v15a1 1 0 0 1-1.496.868l-4.512-2.578a2 2 0 0 0-1.984 0l-4.512 2.578A1 1 0 0 1 5 20V5a2 2 0 0 1 2-2z" /></svg> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-bookmark-check-icon lucide-bookmark-check size-4 hidden group-data-[saved]:block fill-current" aria-hidden="true"><path d="M17 3a2 2 0 0 1 2 2v15a1 1 0 0 1-1.496.868l-4.512-2.578a2 2 0 0 0-1.984 0l-4.512 2.578A1 1 0 0 1 5 20V5a2 2 0 0 1 2-2z" /><path d="m9 10 2 2 4-4" /></svg> </button></div></div><a class="font-semibold text-secondary hover:text-primary line-clamp-3 text-ellipsis md:text-[18px]/[22px] text-[18px]/[22px]" href="/article/news-data-center-pause-apac-thailand/"> Thailand Asks 49 Data Centers to Pause as New Power and Water Rules Loom </a><div class="md:block hidden"><div class="font-light text-zinc-800 line-clamp-3 text-ellipsis text-[14px]"><p></p><p>Thailand has asked 49 data centers under construction to pause voluntarily while more than 117 pending projects face an approval freeze.</p>
<p></p></div></div><div class="gap-x-7 mt-2 uppercase font-mono text-[12px] leading-[16px] tracking-widest text-zinc-500 flex flex-col"><a class="text-secondary hover:text-primary font-semibold" href="/meet-the-team/us/techrepublic-staff/"> TechRepublic Staff </a><div class="uppercase font-mono text-[12px] leading-[16px] tracking-widest text-zinc-500" data-nosnippet="true">Sep 10, 2026</div></div></div><div class="group/card space-y-[17px]"><div class="flex flex-col w-full"><a class="block group w-full overflow-hidden relative" href="/article/news-apac-philippines-ai-infrastructure-timeline-data-centers/"> <div class="relative w-full aspect-video"> <div class="w-full h-full relative" data-lazyimage=""> <img alt="" src="data:image/avif;base64,AAAAGGZ0eXBhdmlmAAAAAG1pZjFtaWFmAAAA0m1ldGEAAAAAAAAAIWhkbHIAAAAAAAAAAHBpY3QAAAAAAAAAAAAAAAAAAAAADnBpdG0AAAAAAAEAAAAeaWxvYwAAAABEAAABAAEAAAABAAAA8gAAAIoAAAAjaWluZgAAAAAAAQAAABVpbmZlAgAAAAABAABhdjAxAAAAAFZpcHJwAAAAOGlwY28AAAAUaXNwZQAAAAAAAAAQAAAACQAAAAxhdjFDgT9AAAAAABBwaXhpAAAAAAMKCgoAAAAWaXBtYQAAAAAAAAABAAEDAYIDAAAAkm1kYXQSAAoIP8z+CMBDQbQyfGWGL0EnE/79gD/QEEgAAAAAAAEEEEAAwktWMAp+3DPmbFXNnDri8BsMAQCDz4bTiG6BxU17IX5mL+zohByTflC3lbKCkT0LdRGO0M7UroaNuEOsplJ+owJIjCQEfn3lIVknPJ9LtYZ0sksJyc2ajJ+9FDRtzPC49acwn0A=" decoding="async" aria-hidden="true" class="w-full h-full object-cover aspect-video absolute inset-0" style="z-index: -1"> <div data-blur="" class="absolute inset-0 transition-opacity duration-300" style="backdrop-filter: blur(20px); z-index: 1;"></div> <img src="https://assets.techrepublic.com/uploads/2026/09/ci-09092026-apac-philippines-ai-infrastructure-timeline-data-centers.jpg?w=640" srcset="https://assets.techrepublic.com/uploads/2026/09/ci-09092026-apac-philippines-ai-infrastructure-timeline-data-centers.jpg?w=128 128w, https://assets.techrepublic.com/uploads/2026/09/ci-09092026-apac-philippines-ai-infrastructure-timeline-data-centers.jpg?w=256 256w, https://assets.techrepublic.com/uploads/2026/09/ci-09092026-apac-philippines-ai-infrastructure-timeline-data-centers.jpg?w=512 512w" alt="Philippines AI Buildout Timeline: $34.4B Plan Targets Massive Data Center Expansion" sizes="(min-width: 1200px) 266px, (min-width: 768px) calc((100vw - 136px) / 4), calc(100vw - 32px)" loading="lazy" fetchpriority="auto" decoding="async" data-image="true" style="opacity:0" width="640" height="457" class="w-full h-full object-cover aspect-video transition-opacity duration-300"> </div> </div> </a><div class="flex items-start justify-between gap-2"><a class="bg-primary overflow-hidden text-primary-foreground inline-block uppercase text-[12px] leading-[16px] font-mono font-semibold hover:bg-primary/90 self-start tracking-widest text-nowrap max-w-full text-ellipsis" href="/topic/artificial-intelligence/"> <astro-island uid="KzIew" prefix="s8" component-url="https://www.techrepublic.com/astrostatic/c733c3a8/_astro/Ticker.Bx_ayGdx.js" component-export="default" renderer-url="https://www.techrepublic.com/astrostatic/c733c3a8/_astro/client.B-cu3CQi.js" props="{&quot;text&quot;:[0,&quot;Artificial Intelligence&quot;]}" ssr="" client="idle" opts="{&quot;name&quot;:&quot;Ticker&quot;,&quot;value&quot;:true}" await-children=""><div class="ticker-container px-[8px] py-[6px] flex" style="--scroll-distance:-0px;" data-v-34ac2891=""><span class="w-full truncate ticker-text" data-v-34ac2891="">Artificial Intelligence</span></div><!--astro:end--></astro-island> </a><button type="button" data-save-toggle="" data-save-item-type="article" data-save-id="4372563" data-save-slug="news-apac-philippines-ai-infrastructure-timeline-data-centers" data-save-title="Philippines AI Buildout Timeline: $34.4B Plan Targets Massive Data Center Expansion" data-save-surface="card" aria-pressed="false" aria-label="Save &quot;Philippines AI Buildout Timeline: $34.4B Plan Targets Massive Data Center Expansion&quot; to read later" class="group cursor-pointer border-none bg-transparent p-0 transition-[color,opacity] motion-reduce:transition-none size-11 -m-1.5 shrink-0 flex items-center justify-center text-zinc-500 hover:text-primary data-[saved]:text-primary lg:opacity-0 lg:group-hover/card:opacity-100 lg:group-focus-within/card:opacity-100 data-[saved]:opacity-100"> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-bookmark-icon lucide-bookmark size-4 group-data-[saved]:hidden" aria-hidden="true"><path d="M17 3a2 2 0 0 1 2 2v15a1 1 0 0 1-1.496.868l-4.512-2.578a2 2 0 0 0-1.984 0l-4.512 2.578A1 1 0 0 1 5 20V5a2 2 0 0 1 2-2z" /></svg> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-bookmark-check-icon lucide-bookmark-check size-4 hidden group-data-[saved]:block fill-current" aria-hidden="true"><path d="M17 3a2 2 0 0 1 2 2v15a1 1 0 0 1-1.496.868l-4.512-2.578a2 2 0 0 0-1.984 0l-4.512 2.578A1 1 0 0 1 5 20V5a2 2 0 0 1 2-2z" /><path d="m9 10 2 2 4-4" /></svg> </button></div></div><a class="font-semibold text-secondary hover:text-primary line-clamp-3 text-ellipsis md:text-[18px]/[22px] text-[18px]/[22px]" href="/article/news-apac-philippines-ai-infrastructure-timeline-data-centers/"> Philippines AI Buildout Timeline: $34.4B Plan Targets Massive Data Center Expansion </a><div class="md:block hidden"><div class="font-light text-zinc-800 line-clamp-3 text-ellipsis text-[14px]"><p></p><p>The Philippines’ $34.4 billion AI infrastructure plan targets 1.5 GW of data center capacity by 2033, as two US hyperscalers evaluate sites.</p>
<p></p></div></div><div class="gap-x-7 mt-2 uppercase font-mono text-[12px] leading-[16px] tracking-widest text-zinc-500 flex flex-col"><a class="text-secondary hover:text-primary font-semibold" href="/meet-the-team/us/matt-gonzales/"> Matt Gonzales </a><div class="uppercase font-mono text-[12px] leading-[16px] tracking-widest text-zinc-500" data-nosnippet="true">Sep 9, 2026</div></div></div><div class="group/card space-y-[17px]"><div class="flex flex-col w-full"><a class="block group w-full overflow-hidden relative" href="/article/news-openai-firmus-data-centers-apac-malaysia/"> <div class="relative w-full aspect-video"> <div class="w-full h-full relative" data-lazyimage=""> <img alt="" src="data:image/avif;base64,AAAAGGZ0eXBhdmlmAAAAAG1pZjFtaWFmAAAA0m1ldGEAAAAAAAAAIWhkbHIAAAAAAAAAAHBpY3QAAAAAAAAAAAAAAAAAAAAADnBpdG0AAAAAAAEAAAAeaWxvYwAAAABEAAABAAEAAAABAAAA8gAAAGcAAAAjaWluZgAAAAAAAQAAABVpbmZlAgAAAAABAABhdjAxAAAAAFZpcHJwAAAAOGlwY28AAAAUaXNwZQAAAAAAAAAQAAAACAAAAAxhdjFDgT9AAAAAABBwaXhpAAAAAAMKCgoAAAAWaXBtYQAAAAAAAAABAAEDAYIDAAAAb21kYXQSAAoIP8y/kYCGg2gyWWWuO0MlF/zAACAAEAAAAAAAAAFFFFAAG0j75zSh25Jy472jw84b9TgJRF1wD7Xn0BmiOhIq6es5LEtTiuK7vYPqGR2FarZRIhjk6YtRHyqeJcS923GIVOF7" decoding="async" aria-hidden="true" class="w-full h-full object-cover aspect-video absolute inset-0" style="z-index: -1"> <div data-blur="" class="absolute inset-0 transition-opacity duration-300" style="backdrop-filter: blur(20px); z-index: 1;"></div> <img src="https://assets.techrepublic.com/uploads/2026/09/Firmus-Factory-Walkthrough.png?w=1024" srcset="https://assets.techrepublic.com/uploads/2026/09/Firmus-Factory-Walkthrough.png?w=128 128w, https://assets.techrepublic.com/uploads/2026/09/Firmus-Factory-Walkthrough.png?w=256 256w, https://assets.techrepublic.com/uploads/2026/09/Firmus-Factory-Walkthrough.png?w=512 512w" alt="OpenAI Taps Firmus for Two Malaysia AI Data Centers as APAC Compute Race Accelerates" sizes="(min-width: 1200px) 266px, (min-width: 768px) calc((100vw - 136px) / 4), calc(100vw - 32px)" loading="lazy" fetchpriority="auto" decoding="async" data-image="true" style="opacity:0" width="1024" height="540" class="w-full h-full object-cover aspect-video transition-opacity duration-300"> </div> </div> </a><div class="flex items-start justify-between gap-2"><a class="bg-primary overflow-hidden text-primary-foreground inline-block uppercase text-[12px] leading-[16px] font-mono font-semibold hover:bg-primary/90 self-start tracking-widest text-nowrap max-w-full text-ellipsis" href="/topic/ai-infrastructure/"> <astro-island uid="13KmM3" prefix="s9" component-url="https://www.techrepublic.com/astrostatic/c733c3a8/_astro/Ticker.Bx_ayGdx.js" component-export="default" renderer-url="https://www.techrepublic.com/astrostatic/c733c3a8/_astro/client.B-cu3CQi.js" props="{&quot;text&quot;:[0,&quot;ai infrastructure&quot;]}" ssr="" client="idle" opts="{&quot;name&quot;:&quot;Ticker&quot;,&quot;value&quot;:true}" await-children=""><div class="ticker-container px-[8px] py-[6px] flex" style="--scroll-distance:-0px;" data-v-34ac2891=""><span class="w-full truncate ticker-text" data-v-34ac2891="">ai infrastructure</span></div><!--astro:end--></astro-island> </a><button type="button" data-save-toggle="" data-save-item-type="article" data-save-id="4372531" data-save-slug="news-openai-firmus-data-centers-apac-malaysia" data-save-title="OpenAI Taps Firmus for Two Malaysia AI Data Centers as APAC Compute Race Accelerates" data-save-surface="card" aria-pressed="false" aria-label="Save &quot;OpenAI Taps Firmus for Two Malaysia AI Data Centers as APAC Compute Race Accelerates&quot; to read later" class="group cursor-pointer border-none bg-transparent p-0 transition-[color,opacity] motion-reduce:transition-none size-11 -m-1.5 shrink-0 flex items-center justify-center text-zinc-500 hover:text-primary data-[saved]:text-primary lg:opacity-0 lg:group-hover/card:opacity-100 lg:group-focus-within/card:opacity-100 data-[saved]:opacity-100"> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-bookmark-icon lucide-bookmark size-4 group-data-[saved]:hidden" aria-hidden="true"><path d="M17 3a2 2 0 0 1 2 2v15a1 1 0 0 1-1.496.868l-4.512-2.578a2 2 0 0 0-1.984 0l-4.512 2.578A1 1 0 0 1 5 20V5a2 2 0 0 1 2-2z" /></svg> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-bookmark-check-icon lucide-bookmark-check size-4 hidden group-data-[saved]:block fill-current" aria-hidden="true"><path d="M17 3a2 2 0 0 1 2 2v15a1 1 0 0 1-1.496.868l-4.512-2.578a2 2 0 0 0-1.984 0l-4.512 2.578A1 1 0 0 1 5 20V5a2 2 0 0 1 2-2z" /><path d="m9 10 2 2 4-4" /></svg> </button></div></div><a class="font-semibold text-secondary hover:text-primary line-clamp-3 text-ellipsis md:text-[18px]/[22px] text-[18px]/[22px]" href="/article/news-openai-firmus-data-centers-apac-malaysia/"> OpenAI Taps Firmus for Two Malaysia AI Data Centers as APAC Compute Race Accelerates </a><div class="md:block hidden"><div class="font-light text-zinc-800 line-clamp-3 text-ellipsis text-[14px]"><p></p><p>OpenAI will anchor two Firmus AI data centers in Malaysia, adding future APAC compute capacity as regional infrastructure investment surges.</p>
<p></p></div></div><div class="gap-x-7 mt-2 uppercase font-mono text-[12px] leading-[16px] tracking-widest text-zinc-500 flex flex-col"><a class="text-secondary hover:text-primary font-semibold" href="/meet-the-team/us/techrepublic-staff/"> TechRepublic Staff </a><div class="uppercase font-mono text-[12px] leading-[16px] tracking-widest text-zinc-500" data-nosnippet="true">Sep 9, 2026</div></div></div><div class="group/card space-y-[17px]"><div class="flex flex-col w-full"><a class="block group w-full overflow-hidden relative" href="/article/news-patagonia-ai-data-center-projects/"> <div class="relative w-full aspect-video"> <div class="w-full h-full relative" data-lazyimage=""> <img alt="" src="data:image/avif;base64,AAAAGGZ0eXBhdmlmAAAAAG1pZjFtaWFmAAAA0m1ldGEAAAAAAAAAIWhkbHIAAAAAAAAAAHBpY3QAAAAAAAAAAAAAAAAAAAAADnBpdG0AAAAAAAEAAAAeaWxvYwAAAABEAAABAAEAAAABAAAA8gAAAGMAAAAjaWluZgAAAAAAAQAAABVpbmZlAgAAAAABAABhdjAxAAAAAFZpcHJwAAAAOGlwY28AAAAUaXNwZQAAAAAAAAAQAAAACQAAAAxhdjFDgT9AAAAAABBwaXhpAAAAAAMKCgoAAAAWaXBtYQAAAAAAAAABAAEDAYIDAAAAa21kYXQSAAoIP8z+CMBDQbQyVWWKL0EnE/z94D+AEEgIKAAAAAAAggggAMJCzEuTxNPp98mhJK/2ImiY+IRVP7Y4EehDVaZEDWeFW08BZYtxQJbbA203Fe79k1HskEcqTtt/r+CuHLA=" decoding="async" aria-hidden="true" class="w-full h-full object-cover aspect-video absolute inset-0" style="z-index: -1"> <div data-blur="" class="absolute inset-0 transition-opacity duration-300" style="backdrop-filter: blur(20px); z-index: 1;"></div> <img src="https://assets.techrepublic.com/uploads/2026/09/ChatGPT-Image-Sep-8-2026-02_11_21-AM-3.jpg?w=1024" srcset="https://assets.techrepublic.com/uploads/2026/09/ChatGPT-Image-Sep-8-2026-02_11_21-AM-3.jpg?w=128 128w, https://assets.techrepublic.com/uploads/2026/09/ChatGPT-Image-Sep-8-2026-02_11_21-AM-3.jpg?w=256 256w, https://assets.techrepublic.com/uploads/2026/09/ChatGPT-Image-Sep-8-2026-02_11_21-AM-3.jpg?w=512 512w" alt="Tech Firms Plan Billion-Dollar AI Data Centers in Patagonia" sizes="(min-width: 1200px) 266px, (min-width: 768px) calc((100vw - 136px) / 4), calc(100vw - 32px)" loading="lazy" fetchpriority="auto" decoding="async" data-image="true" style="opacity:0" width="1024" height="507" class="w-full h-full object-cover aspect-video transition-opacity duration-300"> </div> </div> </a><div class="flex items-start justify-between gap-2"><a class="bg-primary overflow-hidden text-primary-foreground inline-block uppercase text-[12px] leading-[16px] font-mono font-semibold hover:bg-primary/90 self-start tracking-widest text-nowrap max-w-full text-ellipsis" href="/topic/artificial-intelligence/"> <astro-island uid="KzIew" prefix="s10" component-url="https://www.techrepublic.com/astrostatic/c733c3a8/_astro/Ticker.Bx_ayGdx.js" component-export="default" renderer-url="https://www.techrepublic.com/astrostatic/c733c3a8/_astro/client.B-cu3CQi.js" props="{&quot;text&quot;:[0,&quot;Artificial Intelligence&quot;]}" ssr="" client="idle" opts="{&quot;name&quot;:&quot;Ticker&quot;,&quot;value&quot;:true}" await-children=""><div class="ticker-container px-[8px] py-[6px] flex" style="--scroll-distance:-0px;" data-v-34ac2891=""><span class="w-full truncate ticker-text" data-v-34ac2891="">Artificial Intelligence</span></div><!--astro:end--></astro-island> </a><button type="button" data-save-toggle="" data-save-item-type="article" data-save-id="4372266" data-save-slug="news-patagonia-ai-data-center-projects" data-save-title="Tech Firms Plan Billion-Dollar AI Data Centers in Patagonia" data-save-surface="card" aria-pressed="false" aria-label="Save &quot;Tech Firms Plan Billion-Dollar AI Data Centers in Patagonia&quot; to read later" class="group cursor-pointer border-none bg-transparent p-0 transition-[color,opacity] motion-reduce:transition-none size-11 -m-1.5 shrink-0 flex items-center justify-center text-zinc-500 hover:text-primary data-[saved]:text-primary lg:opacity-0 lg:group-hover/card:opacity-100 lg:group-focus-within/card:opacity-100 data-[saved]:opacity-100"> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-bookmark-icon lucide-bookmark size-4 group-data-[saved]:hidden" aria-hidden="true"><path d="M17 3a2 2 0 0 1 2 2v15a1 1 0 0 1-1.496.868l-4.512-2.578a2 2 0 0 0-1.984 0l-4.512 2.578A1 1 0 0 1 5 20V5a2 2 0 0 1 2-2z" /></svg> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-bookmark-check-icon lucide-bookmark-check size-4 hidden group-data-[saved]:block fill-current" aria-hidden="true"><path d="M17 3a2 2 0 0 1 2 2v15a1 1 0 0 1-1.496.868l-4.512-2.578a2 2 0 0 0-1.984 0l-4.512 2.578A1 1 0 0 1 5 20V5a2 2 0 0 1 2-2z" /><path d="m9 10 2 2 4-4" /></svg> </button></div></div><a class="font-semibold text-secondary hover:text-primary line-clamp-3 text-ellipsis md:text-[18px]/[22px] text-[18px]/[22px]" href="/article/news-patagonia-ai-data-center-projects/"> Tech Firms Plan Billion-Dollar AI Data Centers in Patagonia </a><div class="md:block hidden"><div class="font-light text-zinc-800 line-clamp-3 text-ellipsis text-[14px]"><p></p><p>Patagonia is attracting multibillion-dollar AI data center plans, but power infrastructure and connectivity gaps could determine which projects get built.</p>
<p></p></div></div><div class="gap-x-7 mt-2 uppercase font-mono text-[12px] leading-[16px] tracking-widest text-zinc-500 flex flex-col"><a class="text-secondary hover:text-primary font-semibold" href="/meet-the-team/us/kezia-jungco/"> Kezia Jungco </a><div class="uppercase font-mono text-[12px] leading-[16px] tracking-widest text-zinc-500" data-nosnippet="true">Sep 7, 2026</div></div></div></div> </div> <div class="justify-center md:hidden flex"> </div> </div> </aside> <div style="margin: 40px 0px; position: relative; height: 1px; width: 100%; user-select: none; pointer-events: none;"> <div data-type="infiniscroll-break" style="position: absolute; bottom: 0; left: 0; right: 0; height: 100vh;"></div> </div> <div data-type="infiniscroll-loading" hidden role="status" aria-live="polite" class="flex justify-center py-10"> <span class="w-8 h-8 border-2 border-zinc-300 border-t-primary rounded-full animate-spin"></span> <span class="sr-only">Loading more content…</span> </div> <script type="infiniscroll/json">{"title":"How to set up high availability storage with GlusterFS on Ubuntu 18.04","path":"/article/how-to-set-up-high-availability-storage-with-glusterfs-on-ubuntu-18-04/","id":67414,"category":2111,"ads":true,"adTargeting":{"env":"prod","stage":"prod","url":"www.techrepublic.com/article/how-to-set-up-high-availability-storage-with-glusterfs-on-ubuntu-18-04/","hostname":"www.techrepublic.com","edge_country":"US","cid":"how-to-set-up-high-availability-storage-with-glusterfs-on-ubuntu-18-04","path":"sites,techrepublic.com,article,how-to-set-up-high-availability-storage-with-glusterfs-on-ubuntu-18-04","kw":[],"category":["data-centers","open-source"],"topic":["data-centers","open-source"],"tax":[],"ptype":"article","news":"no","author":"jack-wallen"}}</script> <astro-island uid="s39t0" prefix="s1" component-url="https://www.techrepublic.com/astrostatic/c733c3a8/_astro/ExitIntentNewsletterPopup.uCr5XS_J.js" component-export="default" renderer-url="https://www.techrepublic.com/astrostatic/c733c3a8/_astro/client.B-cu3CQi.js" props="{&quot;newsletter&quot;:[0,{&quot;title&quot;:[0,&quot;Newsletters - TechRepublic&quot;],&quot;header&quot;:[0,&quot;Daily Tech Insider&quot;],&quot;subheader&quot;:[0,&quot;If you can only read one tech story a day, this is it.&quot;],&quot;primarySubscription&quot;:[0,{&quot;code&quot;:[0,&quot;daily-tech-insider&quot;],&quot;name&quot;:[0,&quot;Daily Tech Insider&quot;],&quot;label&quot;:[0,&quot;If you can only read one tech story a day, this is it.&quot;]}],&quot;preferenceCenterCodes&quot;:[1,[[0,&quot;daily-tech-insider&quot;],[0,&quot;cybersecurity-insider&quot;],[0,&quot;cloud-insider&quot;],[0,&quot;data-insider&quot;],[0,&quot;developer-insider&quot;],[0,&quot;executive-briefing&quot;],[0,&quot;innovation-insider&quot;],[0,&quot;microsoft-weekly&quot;],[0,&quot;project-management-insider&quot;],[0,&quot;tech-insider-europe-by-techrepublic&quot;],[0,&quot;daily-tech-insider-au&quot;]]],&quot;exitIntent&quot;:[0,{&quot;targeting&quot;:[0,{&quot;europe&quot;:[0,&quot;tech-insider-europe-by-techrepublic&quot;]}]}],&quot;assets&quot;:[0,{&quot;backgroundImage&quot;:[0,null],&quot;desktopPreview&quot;:[0,null],&quot;mobilePreview&quot;:[0,null],&quot;peopleImage&quot;:[0,null]}]}],&quot;websiteName&quot;:[0,&quot;TechRepublic&quot;],&quot;slug&quot;:[0,&quot;techrepublic&quot;]}" ssr="" client="idle" opts="{&quot;name&quot;:&quot;ExitIntentNewsletterPopup&quot;,&quot;value&quot;:true}" await-children=""><!----><!--astro:end--></astro-island> </div> <script data-ad-sidebar-selector=".content-sidebar">
;(() => {
const el = document.querySelector("[data-ad-sidebar-selector]")
const sidebarSelector =
el?.getAttribute("data-ad-sidebar-selector") || ".content-sidebar"
// AY uses GPT under the hood, so slotRenderEnded events fire reliably
// Watch for right-rail ads filling and adjust sidebar height
window.googletag = window.googletag || { cmd: [] }
window.googletag.cmd.push(() => {
const articleContainer =
document.getElementById("article-container")
// Hosts render two ContentWithSidebar rows (title, body), so the
// first matching aside is the empty title-row one — take the
// aside that actually holds ad containers.
const aside = Array.from(
document.querySelectorAll(sidebarSelector),
).find((el) => el.querySelector(".ad-container"))
if (!articleContainer || !aside) return
const getSidebarHeight = () =>
Array.from(aside.children).reduce(
(acc, el) => acc + el.offsetHeight,
0,
)
const adjustSidebarHeight = () => {
let ads = aside.querySelectorAll(".ad-container")
while (
articleContainer.offsetHeight < getSidebarHeight() &&
ads.length > 0
) {
if (ads.item(ads.length - 1)) {
ads.item(ads.length - 1).remove()
}
ads = aside.querySelectorAll(".ad-container")
}
}
window.googletag
.pubads()
.addEventListener("slotRenderEnded", (event) => {
// Only process filled ads
if (event.isEmpty) return
const slotElementId = event.slot.getSlotElementId()
const placement = document.getElementById(slotElementId)
// Check if this is a right-rail ad (class-based identification)
if (
!placement ||
!placement.classList.contains("right-rail")
) {
return
}
// Ad filled, check if we need to remove ads to fit sidebar
adjustSidebarHeight()
})
})
})()
</script> <div class="flex items-center justify-center min-h-[90px]! md:min-h-[130px]! print:hidden inline-bottom data-empty:hidden" data-ad-slot="inline-bottom"> </div> </div> <footer class="site-footer bg-[#000e2a] text-white antialiased"> <div class="max-w-[1200px] mx-auto px-4 pt-12 pb-8"> <div class="grid grid-cols-1 md:grid-cols-[1fr_auto_auto] gap-x-16 gap-y-8"> <!-- Left column: Logo + socials + cookie notice --> <div> <!-- Logo --> <a href="/" class="inline-flex items-center gap-2 mb-6"> <div class="h-[40px] w-auto relative"> <img src="https://www.techrepublic.com/astrostatic/c733c3a8/_image/?href=%2F_astro%2Ftechrepublic-white.B5d-svv5.png&w=512&h=119&f=webp" alt="TechRepublic Logo" data-image="true" style="opacity:1" loading="lazy" decoding="async" fetchpriority="auto" width="512" height="119" class="h-[40px] w-auto transition-opacity duration-300"> </div> </a> <!-- Social icons --> <div class="mb-6"> <div class="flex gap-2 flex-wrap md:flex-nowrap"> <div> <a href="https://www.facebook.com/TechRepublic" target="_blank" rel="noopener noreferrer" class="p-4 border text-white border-white rounded-lg block" aria-label="facebook"> <svg role="img" viewBox="0 0 24 24" class="fill-current" width="24" height="24" aria-hidden="true"><title>Facebook</title><path d="M9.101 23.691v-7.98H6.627v-3.667h2.474v-1.58c0-4.085 1.848-5.978 5.858-5.978.401 0 .955.042 1.468.103a8.68 8.68 0 0 1 1.141.195v3.325a8.623 8.623 0 0 0-.653-.036 26.805 26.805 0 0 0-.733-.009c-.707 0-1.259.096-1.675.309a1.686 1.686 0 0 0-.679.622c-.258.42-.374.995-.374 1.752v1.297h3.919l-.386 2.103-.287 1.564h-3.246v8.245C19.396 23.238 24 18.179 24 12.044c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.628 3.874 10.35 9.101 11.647Z" /></svg> <div class="sr-only">facebook</div> </a> </div><div> <a href="https://x.com/techrepublic" target="_blank" rel="noopener noreferrer" class="p-4 border text-white border-white rounded-lg block" aria-label="x"> <svg role="img" viewBox="0 0 24 24" class="fill-current" width="24" height="24" aria-hidden="true"><title>X</title><path d="M14.234 10.162 22.977 0h-2.072l-7.591 8.824L7.251 0H.258l9.168 13.343L.258 24H2.33l8.016-9.318L16.749 24h6.993zm-2.837 3.299-.929-1.329L3.076 1.56h3.182l5.965 8.532.929 1.329 7.754 11.09h-3.182z" /></svg> <div class="sr-only">x</div> </a> </div><div> <a href="https://www.linkedin.com/company/techrepublic" target="_blank" rel="noopener noreferrer" class="p-4 border text-white border-white rounded-lg block" aria-label="linkedin"> <svg class="fill-current" viewBox="0 0 24 25" fill="none" width="24" height="24" aria-hidden="true">
<path d="M6.20062 21.2143H1.84688V7.194H6.20062V21.2143ZM4.02141 5.2815C2.62922 5.2815 1.5 4.12838 1.5 2.73619C1.5 2.06747 1.76565 1.42614 2.2385 0.953285C2.71136 0.48043 3.35269 0.214783 4.02141 0.214783C4.69012 0.214783 5.33145 0.48043 5.80431 0.953285C6.27716 1.42614 6.54281 2.06747 6.54281 2.73619C6.54281 4.12838 5.413 5.2815 4.02141 5.2815ZM22.4953 21.2143H18.1509V14.3893C18.1509 12.7628 18.1181 10.6768 15.8873 10.6768C13.6237 10.6768 13.2769 12.444 13.2769 14.2721V21.2143H8.92781V7.194H13.1034V9.1065H13.1644C13.7456 8.00494 15.1655 6.84244 17.2838 6.84244C21.69 6.84244 22.5 9.744 22.5 13.5128V21.2143H22.4953Z" fill="currentColor" />
</svg> <div class="sr-only">linkedin</div> </a> </div><div> <a href="https://www.youtube.com/techrepublic" target="_blank" rel="noopener noreferrer" class="p-4 border text-white border-white rounded-lg block" aria-label="youtube"> <svg role="img" viewBox="0 0 24 24" class="fill-current" width="24" height="24" aria-hidden="true"><title>YouTube</title><path d="M23.498 6.186a3.016 3.016 0 0 0-2.122-2.136C19.505 3.545 12 3.545 12 3.545s-7.505 0-9.377.505A3.017 3.017 0 0 0 .502 6.186C0 8.07 0 12 0 12s0 3.93.502 5.814a3.016 3.016 0 0 0 2.122 2.136c1.871.505 9.376.505 9.376.505s7.505 0 9.377-.505a3.015 3.015 0 0 0 2.122-2.136C24 15.93 24 12 24 12s0-3.93-.502-5.814zM9.545 15.568V8.432L15.818 12l-6.273 3.568z" /></svg> <div class="sr-only">youtube</div> </a> </div><div> <a href="https://www.pinterest.com/techrepublic/" target="_blank" rel="noopener noreferrer" class="p-4 border text-white border-white rounded-lg block" aria-label="pinterest"> <svg role="img" viewBox="0 0 24 24" class="fill-current" width="24" height="24" aria-hidden="true"><title>Pinterest</title><path d="M12.017 0C5.396 0 .029 5.367.029 11.987c0 5.079 3.158 9.417 7.618 11.162-.105-.949-.199-2.403.041-3.439.219-.937 1.406-5.957 1.406-5.957s-.359-.72-.359-1.781c0-1.663.967-2.911 2.168-2.911 1.024 0 1.518.769 1.518 1.688 0 1.029-.653 2.567-.992 3.992-.285 1.193.6 2.165 1.775 2.165 2.128 0 3.768-2.245 3.768-5.487 0-2.861-2.063-4.869-5.008-4.869-3.41 0-5.409 2.562-5.409 5.199 0 1.033.394 2.143.889 2.741.099.12.112.225.085.345-.09.375-.293 1.199-.334 1.363-.053.225-.172.271-.401.165-1.495-.69-2.433-2.878-2.433-4.646 0-3.776 2.748-7.252 7.92-7.252 4.158 0 7.392 2.967 7.392 6.923 0 4.135-2.607 7.462-6.233 7.462-1.214 0-2.354-.629-2.758-1.379l-.749 2.848c-.269 1.045-1.004 2.352-1.498 3.146 1.123.345 2.306.535 3.55.535 6.607 0 11.985-5.365 11.985-11.987C23.97 5.39 18.592.026 11.985.026L12.017 0z" /></svg> <div class="sr-only">pinterest</div> </a> </div><div> <a href="/rssfeeds/" target="_blank" rel="noopener noreferrer" class="p-4 border text-white border-white rounded-lg block" aria-label="rss"> <svg role="img" viewBox="0 0 24 24" class="fill-current" width="24" height="24" aria-hidden="true"><title>RSS</title><path d="M19.199 24C19.199 13.467 10.533 4.8 0 4.8V0c13.165 0 24 10.835 24 24h-4.801zM3.291 17.415c1.814 0 3.293 1.479 3.293 3.295 0 1.813-1.485 3.29-3.301 3.29C1.47 24 0 22.526 0 20.71s1.475-3.294 3.291-3.295zM15.909 24h-4.665c0-6.169-5.075-11.245-11.244-11.245V8.09c8.727 0 15.909 7.184 15.909 15.91z" /></svg> <div class="sr-only">rss</div> </a> </div> </div> </div> <!-- Cookie notice --> <p class="text-[13px] text-white leading-relaxed max-w-md">
We use cookies and other data collection technologies to
provide the best experience for our customers. You may
request that your data not be shared with third parties
here: <a href="https://technologyadvice.com/privacy-policy/ccpa-opt-out/" target="_blank" rel="noreferrer noopener" class="underline hover:underline text-white">Do Not Sell My Data</a>.
</p> </div> <!-- Services column --> <div> <h4 class="text-[15px] font-bold text-white mb-4 mt-0"> Services </h4> <nav aria-label="Footer - Services"> <ul class="list-none m-0 p-0 space-y-2"> <li> <a href="/about/" class="text-[14px] no-underline hover:underline text-white transition-colors duration-150"> About Us </a> </li><li> <a href="https://technologyadvice.com/contact-us/" target="_blank" rel="noreferrer noopener" class="text-[14px] no-underline hover:underline text-white transition-colors duration-150"> Contact Us </a> </li><li> <a href="/newsletters/" class="text-[14px] no-underline hover:underline text-white transition-colors duration-150"> Newsletters </a> </li><li> <a href="/rssfeeds/" class="text-[14px] no-underline hover:underline text-white transition-colors duration-150"> RSS Feeds </a> </li><li> <a href="/site-map/" class="text-[14px] no-underline hover:underline text-white transition-colors duration-150"> Site Map </a> </li><li> <a href="https://support.techrepublic.com/" class="text-[14px] no-underline hover:underline text-white transition-colors duration-150"> Site Help &amp; Feedback </a> </li><li> <a href="/forums/faq/" class="text-[14px] no-underline hover:underline text-white transition-colors duration-150"> FAQ </a> </li><li> <a href="https://solutions.technologyadvice.com/advertise-on-techrepublic/?utm_source=techrepublic&utm_medium=portfolio_footer&utm_campaign=advertise_contact-us" target="_blank" rel="noreferrer noopener" class="text-[14px] no-underline hover:underline text-white transition-colors duration-150"> Advertise </a> </li><li> <a href="https://technologyadvice.com/privacy-policy/ccpa-opt-out/" target="_blank" rel="noreferrer noopener" class="text-[14px] no-underline hover:underline text-white transition-colors duration-150"> Do Not Sell My Information </a> </li><li> <a href="https://technologyadvice.com/careers/" target="_blank" rel="noreferrer noopener" class="text-[14px] no-underline hover:underline text-white transition-colors duration-150"> Careers </a> </li> </ul> </nav> </div> <!-- Explore column --> <div> <h4 class="text-[15px] font-bold text-white mb-4 mt-0"> Explore </h4> <nav aria-label="Footer - Explore"> <ul class="list-none m-0 p-0 space-y-2"> <li> <a href="/resource-library/content-type/downloads/" class="text-[14px] no-underline hover:underline text-white transition-colors duration-150"> Downloads </a> </li><li> <a href="/forums/" class="text-[14px] no-underline hover:underline text-white transition-colors duration-150"> TechRepublic Forums </a> </li><li> <a href="https://academy.techrepublic.com/" class="text-[14px] no-underline hover:underline text-white transition-colors duration-150"> TechRepublic Academy </a> </li><li> <a href="/premium/" class="text-[14px] no-underline hover:underline text-white transition-colors duration-150"> TechRepublic Premium </a> </li><li> <a href="/resource-library/" class="text-[14px] no-underline hover:underline text-white transition-colors duration-150"> Resource Library </a> </li><li> <a href="/pictures/" class="text-[14px] no-underline hover:underline text-white transition-colors duration-150"> Photos </a> </li><li> <a href="/videos/" class="text-[14px] no-underline hover:underline text-white transition-colors duration-150"> Videos </a> </li><li> <a href="/editorial-policy/" class="text-[14px] no-underline hover:underline text-white transition-colors duration-150"> Editorial Policy </a> </li> </ul> </nav> </div> </div> </div> <!-- Bottom bar --> <div class="pb-18"> <div class="max-w-[1200px] mx-auto px-4 py-5 flex flex-col md:flex-row items-center justify-between gap-3"> <div class="flex items-center gap-4"> <a href="/terms-conditions/" class="text-[13px] no-underline hover:underline text-white transition-colors duration-150"> Legal Terms </a> <a href="/privacy-policy/" class="text-[13px] no-underline hover:underline text-white transition-colors duration-150"> Privacy Policy </a> </div> <p class="text-[13px] text-white m-0">
© 2026 TechnologyAdvice. All rights reserved.
</p> </div> <div id="choice-footer-msg" class="max-w-[1200px] mx-auto px-4 text-[12px] text-white/40 [--choice-footer-link:white]"></div> </div> </footer><astro-island uid="ZBxB5E" prefix="s4" component-url="https://www.techrepublic.com/astrostatic/c733c3a8/_astro/BackToTop.DIsmzr01.js" component-export="default" renderer-url="https://www.techrepublic.com/astrostatic/c733c3a8/_astro/client.B-cu3CQi.js" props="{}" ssr="" client="idle" opts="{&quot;name&quot;:&quot;BackToTop&quot;,&quot;value&quot;:true}" await-children=""><button id="back-to-top" class="fixed right-4 z-1001 cursor-pointer transition-all duration-500 ease-in-out rounded-full hover:shadow-[0px_0px_3px_#71717a] hover:scale-105 bg-primary text-primary-foreground border-none p-0 opacity-0 translate-y-[70px]" style="bottom:calc(var(--sticky-ad-height, 0px) + 16px);" aria-label="Back to top"><svg width="48" height="48" viewBox="0 0 48 48" class="block" aria-hidden="true"><circle cx="24" cy="24" r="21" fill="none" stroke="currentColor" stroke-width="3" opacity="0.2" /><circle cx="24" cy="24" r="21" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round" stroke-dasharray="131.94689145077132" stroke-dashoffset="131.94689145077132" transform="rotate(-90 24 24)" style="transition:stroke-dashoffset 150ms ease;" /></svg><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-up-icon lucide-chevron-up absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2" aria-hidden="true"><path d="m18 15-6-6-6 6" /></svg></button><!--astro:end--></astro-island> <sticky-footer-ad class="group hide-on-empty fixed w-full bottom-0 bg-white flex justify-center items-center border-gray-200 border-t transition-transform duration-500 ease-in-out z-1000 has-[div[data-empty]]:hidden print:hidden" style="height: min-content"> <button class="absolute left-8 -top-[25px] cursor-pointer bg-white px-2 border-gray-200 border-t border-r border-l rounded-t-lg" aria-label="Toggle collapse"><!----><!--[--> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-down-icon lucide-chevron-down chevron transition-transform duration-500" aria-hidden="true"><path d="m6 9 6 6 6-6" /></svg> <!--]--></button> <div class="sticky-footer data-empty:hidden" data-ad-slot="sticky-footer"> </div> </sticky-footer-ad> <astro-island uid="4kij5" prefix="s5" component-url="https://www.techrepublic.com/astrostatic/c733c3a8/_astro/LoginModal.wN4CwDT5.js" component-export="default" renderer-url="https://www.techrepublic.com/astrostatic/c733c3a8/_astro/client.B-cu3CQi.js" props="{}" ssr="" client="idle" opts="{&quot;name&quot;:&quot;LoginModal&quot;,&quot;value&quot;:true}" await-children=""><!----><!--astro:end--></astro-island> <script>
;(() => {
try {
const match = location.pathname.match(/^\/sites\/([^/]+)\//)
const scope = match ? match[1] : location.hostname
const ids = JSON.parse(
localStorage.getItem("sfl-saved-ids:" + scope) || "[]",
)
const prog = JSON.parse(
localStorage.getItem("reading-progress:" + scope) || "{}",
)
const saved = new Set(ids)
for (const el of document.querySelectorAll("[data-save-toggle]")) {
const on = saved.has(
el.getAttribute("data-save-item-type") +
":" +
el.getAttribute("data-save-id"),
)
if (on) el.setAttribute("data-saved", "")
else el.removeAttribute("data-saved")
el.setAttribute("aria-pressed", on ? "true" : "false")
const label = el.querySelector("[data-save-label]")
if (label) label.textContent = on ? "Saved" : "Save for later"
}
// The article widget. Both flags live on the card because CSS swaps
// its halves off them, and that has to happen before hydration.
// `data-resume` is deliberately narrower than `data-saved`: resume
// shows only where there is somewhere to go, so it is absent below
// 5% and again on a finished article, which is how the control
// retires itself without the item leaving the reader's list.
for (const card of document.querySelectorAll("[data-save-state]")) {
const id = card.getAttribute("data-save-id")
const on = saved.has(
card.getAttribute("data-save-item-type") + ":" + id,
)
const entry = prog[id]
const pct = entry ? entry.percent : 0
const resume = on && pct >= 5 && pct < 90
if (on) card.setAttribute("data-saved", "")
else card.removeAttribute("data-saved")
if (resume) card.setAttribute("data-resume", "")
else card.removeAttribute("data-resume")
if (!resume) continue
const label = card.querySelector("[data-save-resume-pct]")
if (label) label.textContent = pct + "%"
}
document.dispatchEvent(new CustomEvent("save:rescan"))
} catch {
/* storage unavailable — leave server-rendered defaults */
}
})()
</script> <astro-island uid="1AIgz3" prefix="s6" component-url="https://www.techrepublic.com/astrostatic/c733c3a8/_astro/SaveForLater.B0TW_0pS.js" component-export="default" renderer-url="https://www.techrepublic.com/astrostatic/c733c3a8/_astro/client.B-cu3CQi.js" props="{}" ssr="" client="idle" opts="{&quot;name&quot;:&quot;SaveForLater&quot;,&quot;value&quot;:true}" await-children=""><div><div class="sr-only" role="status" aria-live="polite"></div><div class="sr-only" role="alert" aria-live="assertive"></div><div class="fixed right-[72px] z-1001 transition-all duration-500 ease-in-out" inert="" style="bottom:calc(var(--sticky-ad-height, 0px) + 16px);"><div class="flex h-12 items-stretch overflow-hidden cursor-pointer transition-all duration-500 ease-in-out rounded-full hover:shadow-[0px_0px_3px_#71717a] hover:scale-105 bg-primary text-primary-foreground border-none p-0 opacity-0 translate-y-[70px] pointer-events-none"><!----></div></div><!----><!----></div><!--astro:end--></astro-island> </body></html>