Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/cybozu-go/moco
MySQL operator on Kubernetes using GTID-based semi-synchronous replication.
https://github.com/cybozu-go/moco
kubectl-plugins kubernetes kubernetes-operator mysql
Last synced: about 1 month ago
JSON representation
MySQL operator on Kubernetes using GTID-based semi-synchronous replication.
- Host: GitHub
- URL: https://github.com/cybozu-go/moco
- Owner: cybozu-go
- License: apache-2.0
- Created: 2020-04-27T05:39:36.000Z (over 4 years ago)
- Default Branch: main
- Last Pushed: 2024-10-29T10:08:50.000Z (about 2 months ago)
- Last Synced: 2024-10-29T12:13:06.967Z (about 2 months ago)
- Topics: kubectl-plugins, kubernetes, kubernetes-operator, mysql
- Language: Go
- Homepage: https://cybozu-go.github.io/moco/
- Size: 20.7 MB
- Stars: 277
- Watchers: 19
- Forks: 22
- Open Issues: 19
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE
- Security: docs/security.md
Awesome Lists containing this project
- awesome-dok - MOCO - manage MySQL clusters using GTID-based semi-synchronous replication. (Databases / MySQL)
- awesome-dok - MOCO - manage MySQL clusters using GTID-based semi-synchronous replication. (Databases / MySQL)
README
[![GitHub release](https://img.shields.io/github/release/cybozu-go/moco.svg?maxAge=60)][releases]
[![CI](https://github.com/cybozu-go/moco/actions/workflows/ci.yaml/badge.svg)](https://github.com/cybozu-go/moco/actions/workflows/ci.yaml)
[![PkgGoDev](https://pkg.go.dev/badge/github.com/cybozu-go/moco)](https://pkg.go.dev/github.com/cybozu-go/moco)
[![Go Report Card](https://goreportcard.com/badge/github.com/cybozu-go/moco)](https://goreportcard.com/report/github.com/cybozu-go/moco)# MOCO
MOCO is a [MySQL][] operator on Kubernetes.
Its primary function is to manage MySQL clusters using [GTID-based](https://dev.mysql.com/doc/refman/8.0/en/replication-gtids.html) [semi-synchronous](https://dev.mysql.com/doc/refman/8.0/en/replication-semisync.html) replication. It does _not_ manage [group replication](https://dev.mysql.com/doc/refman/8.0/en/group-replication.html) clusters.MOCO is designed to have the following properties.
- Compatibility with the standard MySQL
- This is the reason that MOCO does not adopt group replication that has [a number of limitations](https://dev.mysql.com/doc/refman/8.0/en/group-replication-limitations.html).
- Safety
- MOCO only allows writes to a single instance called the primary at a time.
- MOCO configures loss-less semi-synchronous replication with sufficient replicas.
- MOCO detects and excludes instances having [errant transactions](https://www.percona.com/blog/2014/05/19/errant-transactions-major-hurdle-for-gtid-based-failover-in-mysql-5-6/).
- Availability
- MOCO can quickly switch the primary in case of the primary failure or restart.
- MOCO allows up to 5 instances in a cluster.Blog article: [Introducing MOCO, a modern MySQL operator on Kubernetes](https://blog.kintone.io/entry/moco)
## Supported software
- MySQL: 8.0.28, 8.0.36, 8.0.37, 8.0.39, 8.4.2
- Kubernetes: 1.29, 1.30, 1.31MOCO supports (tests) the LTS releases of MySQL 8.
Innovation releases would probably work. But they are not tested in our CI.## Features
- Cluster with odd number of MySQL instances
- [`kubectl` plugin](docs/kubectl-moco.md)
- Replication from an external MySQL instance
- Manual and automatic switchover of the primary instance
- Automatic failover of the primary instance
- Backup and [Point-in-Time Recovery](https://dev.mysql.com/doc/refman/8.0/en/point-in-time-recovery-positions.html)
- Errant transaction detection
- Different MySQL versions for each cluster
- Upgrading MySQL version of a cluster
- Monitor for replication delays
- Built-in [mysqld_exporter][] for `mysqld` metrics
- Services for the primary and replicas, respectively
- Custom `my.cnf` configurations
- Custom Pod, Service, and PersistentVolumeClaim templates
- Redirect slow query logs to a sidecar container
- Auto-generate [PodDisruptionBudget](https://kubernetes.io/docs/concepts/workloads/pods/disruptions/#pod-disruption-budgets)## Quick start
You can quickly run MOCO using [kind](https://kind.sigs.k8s.io/).
1. Prepare a Linux machine and install Docker.
2. Checkout MOCO and go to `e2e` directory.
3. Run `make start`You can then create a three-instance MySQL cluster as follows:
```console
$ cat > mycluster.yaml <<'EOF'
apiVersion: moco.cybozu.com/v1beta2
kind: MySQLCluster
metadata:
namespace: default
name: test
spec:
replicas: 3
podTemplate:
spec:
containers:
- name: mysqld
image: ghcr.io/cybozu-go/moco/mysql:8.4.2
volumeClaimTemplates:
- metadata:
name: mysql-data
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1Gi
EOF$ export KUBECONFIG=$(pwd)/.kubeconfig
$ ../bin/kubectl apply -f mycluster.yaml
```Check the status of MySQLCluster until it becomes healthy as follows:
```console
$ ../bin/kubectl get mysqlcluster test
NAME AVAILABLE HEALTHY PRIMARY SYNCED REPLICAS ERRANT REPLICAS
test True True 0 3
```Once it becomes healthy, you can use `kubectl-moco` to play with `mysql` client.
```console
$ ../bin/kubectl moco mysql -it test
```To destroy the Kubernetes cluster, run:
```console
$ make stop
```## Documentation
See https://cybozu-go.github.io/moco/
[`examples`](examples/) directory contains example MySQLCluster manifests.
## Docker images
Docker images are available on [ghcr.io/cybozu-go/moco](https://github.com/orgs/cybozu-go/packages/container/package/moco).
[releases]: https://github.com/cybozu-go/moco/releases
[MySQL]: https://www.mysql.com/
[mysqld_exporter]: https://github.com/prometheus/mysqld_exporter