Skip to content

Commit a564379

Browse files
Mazizovaclaude
andauthored
MOCO case study: add the maintainers' response (update banner and framed guest comment) (#142)
Co-authored-by: Claude Sonnet 5.5 <[email protected]>
1 parent 46087ca commit a564379

4 files changed

Lines changed: 102 additions & 0 deletions

File tree

‎assets/scss/_case-studies.scss‎

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,3 +238,65 @@
238238
white-space: pre-wrap;
239239
overflow-wrap: anywhere;
240240
}
241+
242+
// ── Update banner (top of an article) and framed guest comment (end of article) ──
243+
.post-content .update-banner {
244+
margin: 0 0 2rem;
245+
padding: 0.875rem 1.25rem;
246+
background: rgba($accent, 0.08);
247+
border: 1px solid rgba($accent, 0.3);
248+
border-radius: 10px;
249+
font-size: 0.9375rem;
250+
line-height: 1.5;
251+
color: $off-white;
252+
253+
strong { color: $white; }
254+
a { font-weight: 600; white-space: nowrap; }
255+
}
256+
257+
.post-content .guest-comment {
258+
margin: 3rem 0 2rem;
259+
padding: 1.75rem 2rem 1.5rem;
260+
background: $dark-card;
261+
border: 1px solid $dark-border;
262+
border-left: 4px solid $accent;
263+
border-radius: 12px;
264+
scroll-margin-top: 88px;
265+
266+
> :last-child { margin-bottom: 0; }
267+
268+
.guest-comment-label {
269+
display: inline-block;
270+
margin-bottom: 0.75rem;
271+
padding: 0.2rem 0.6rem;
272+
font-size: 0.6875rem;
273+
font-weight: 700;
274+
letter-spacing: 0.08em;
275+
text-transform: uppercase;
276+
color: $accent;
277+
background: rgba($accent, 0.1);
278+
border: 1px solid rgba($accent, 0.3);
279+
border-radius: 999px;
280+
}
281+
282+
h2 { margin-top: 0; }
283+
h3 { font-size: 1.125rem; margin: 1.75rem 0 0.5rem; }
284+
285+
.guest-comment-signature {
286+
margin-top: 1.5rem;
287+
font-weight: 600;
288+
color: $white;
289+
}
290+
291+
.guest-comment-cta {
292+
margin: 1.5rem 0 0;
293+
padding-top: 1.25rem;
294+
border-top: 1px solid $dark-border;
295+
font-size: 0.9375rem;
296+
color: $off-white;
297+
}
298+
}
299+
300+
@media (max-width: 600px) {
301+
.post-content .guest-comment { padding: 1.25rem 1.25rem 1.125rem; }
302+
}

‎assets/scss/_light-theme.scss‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1242,6 +1242,8 @@
12421242
.resource-case-title { color: #0f172a; }
12431243
.post-author-role { color: #64748b; }
12441244
.resource-case-meta { color: #64748b; }
1245+
.post-content .update-banner { background: rgba(2, 114, 165, 0.07); border-color: rgba(2, 114, 165, 0.3); color: #334155; strong { color: #0f172a; } }
1246+
.post-content .guest-comment { background: #ffffff; border-color: #dde3ed; border-left-color: #00c8ff; .guest-comment-label { color: #0272a5; background: rgba(2, 114, 165, 0.08); border-color: rgba(2, 114, 165, 0.3); } .guest-comment-signature { color: #0f172a; } .guest-comment-cta { border-top-color: #dde3ed; color: #334155; } }
12451247

12461248
// People Behind MySQL
12471249
.interview-card, .interview-strip { background: #ffffff; border-color: #dde3ed; }

‎content/blog/four-attempts-one-reset-master/index.md‎

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ case_study:
1414
company_url: "https://www.ivinco.com/"
1515
---
1616

17+
<p class="update-banner"><strong>Update, October 23, 2026:</strong> The MOCO maintainers at Cybozu responded to this case. <a href="#maintainers-response">Read their comment →</a></p>
18+
1719
Historically, we had four bare-metal MySQL clusters. Over time, we merged them into two: the big one (750 GB data directory, ~50 databases, largest table 100 GB) and a small one (200 GB data directory) with specific transaction isolation requirements.
1820

1921
On bare-metal, we ran Percona Server 8.0.x across 3 servers with 768 GB RAM for the big cluster and 2 servers with 128 GB RAM for the small one. But daily operations shifted (this post focuses primarily on the big cluster): the CPUs of the big cluster were idle almost 95% of the time on average, and the whole data directory fit into the server's RAM, so it was reduced to 384 GB without a performance penalty. Further experiments showed that it could potentially handle the load with even less RAM.
@@ -133,3 +135,33 @@ On the donor, that account was used only by local monitoring scripts, so the fix
133135
**Rebuilding a replica is an event for production, not a background task.** Since MOCO configures semi-synchronous replication, it will always clone a new replica from the current primary. Operating at the raw block layer does not eliminate I/O competition: on shared hybrid storage, aggressive clone throughput demands significant storage performance headroom to keep production latency stable.
134136

135137
**A physical clone copies the raw system tables as-is, inheriting the donor's legacy state:** accounts, grants, and leftover system schemas. At the same time, don't rely solely on your familiar bare-metal configuration: MOCO overrides critical runtime variables to enforce cluster orchestration, silently ignoring conflicting directives in your custom ConfigMap (see ConstMycnf in pkg/mycnf/generator.go).
138+
139+
{{% guest-comment id="maintainers-response" %}}
140+
141+
## Response from the MOCO maintainers
142+
143+
After publication, we asked the MOCO maintainers at Cybozu to comment on the issues described above. Their response is published in full, with their permission.
144+
145+
### 1. On Hardcoded VIPs and Network Endpoints
146+
147+
Discovering hardcoded IPs late in a migration is a classic headache that many engineers experience. While this challenge is not specific to MOCO, networking is always a major topic in Kubernetes. In public cloud environments, you get networks that are deeply integrated with VPCs. In self-hosted environments, however, you must select and design your own network stack. At Cybozu, we went through a lot of trial and error before adopting **Cilium**. If readers are interested in our infrastructure journey, CNCF published a [case study about it](https://www.cncf.io/case-studies/cybozu/).
148+
149+
### 2. On Ceph and Storage Performance
150+
151+
We completely agree that operating and tuning Software-Defined Storage (SDS) like Ceph for high-write database workloads is very difficult. Instead of redundant network storage, we run local SSDs on each node provisioned by **[TopoLVM](https://github.com/topolvm/topolvm)**. Local SSDs eliminate the operational complexity of SDS and deliver high IOPS with very low latency. The trade-off is that data is tied to a specific node; if a node dies, the local data is lost. However, this is precisely why MOCO was created: **it is designed to auto-heal replicas when nodes fail**, making local SSDs a practical and reliable choice.
152+
153+
### 3. On `root@localhost` and `RESET MASTER`
154+
155+
This was definitely an unexpected corner case for us. While we stand by the requirement from an architectural standpoint, we are genuinely sympathetic to the time and effort spent debugging such a tricky issue! To support reliable auto-healing, a MySQL pod must be able to initialize safely and idempotently at any time. Checking for a passwordless `root@localhost` was our method to detect a brand-new instance, which unintentionally conflicted with an external donor that kept that account. We will document this restriction, but we welcome suggestions from the community on how to handle this more cleanly without breaking idempotent auto-healing.
156+
157+
### 4. On `ConstMycnf` and Overridden Settings
158+
159+
This is a very fair critique, and we have some regrets about our early development choices here. While some parameters are strictly required for MOCO's orchestration and semi-synchronous replication to work correctly, others were simply carried over from Cybozu’s production settings at the time. We believe users should have more control over settings that MOCO does not strictly require. Kento Takeuchi is currently working on reviewing these parameters to separate mandatory settings from user-configurable ones (apologies for the slow progress on this).
160+
161+
Thank you again for spotlighting MOCO and creating space for this constructive conversation. We look forward to continued collaboration with the OurSQL Foundation and the broader open source community.
162+
163+
<p class="guest-comment-signature">— Sho Iizuka, Site Reliability Engineer, on behalf of the MOCO maintainers, Cybozu</p>
164+
165+
<p class="guest-comment-cta">Have an idea for how MOCO could detect a brand-new instance without breaking idempotent auto-healing? The maintainers are open to suggestions: join the discussion in <a href="https://github.com/cybozu-go/moco-agent/issues/123">cybozu-go/moco-agent#123</a>.</p>
166+
167+
{{% /guest-comment %}}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{{/* A comment by someone other than the article's author, set apart in a framed block.
2+
Usage: {{% guest-comment id="anchor" %}} markdown {{% /guest-comment %}} */}}
3+
<section class="guest-comment"{{ with .Get "id" }} id="{{ . }}"{{ end }}>
4+
<span class="guest-comment-label">Guest comment</span>
5+
{{ .Inner }}
6+
</section>

0 commit comments

Comments
 (0)