一、前言
mysql作为互联网LAMP技术栈中最老最坚固的基石之一,具有众多的集群解决方案,而galera是其中比较优秀的方案之一:
Galera的特点:
- 多主架构:真正的多点读写的集群,在任何时候读写数据,都是最新的。
- 同步复制:集群不同节点之间数据实时同步复制,在数据库挂掉之后,数据不会丢失。
- 并发复制:支持并行复制数据,更好的性能
Galera缺点:
由于同一个事务需要在集群的多台机器上同时执行成功,这个事务才算成功,网络传输及并发执行会导致性能损失,节点中的最大的tps值取决于速度最慢的那个节点,所以各个节点的处理能力要尽量平衡。
目前基于Galera Cluster的实现方案有三种,较成熟、应用案例较多的是Percona XtraDB Cluster:
- Galera Cluster for MySQL
- Percona XtraDB Cluster
- MariaDB Galera Cluster
本文介绍使用Kubernetes statefulset部署Galera集群并且使用基于Ceph的PVC来持久化mysql数据
转载自https://blog.csdn.net/cloudvtech
二、部署集群
2.1 准备工作
创建namespace
kubectl create ns galera
创建Ceph StorageClass的access key
kubectl -n ceph get secrets/pvc-ceph-client-key -o json | jq '.metadata.namespace = "galera"' | kubectl create -f -
kubectl get secrets -n galera
NAME TYPE DATA AGE
default-token-np974 kubernetes.io/service-account-token 3 18m
pvc-ceph-client-key kubernetes.io/rbd
2.2 部署文件
galera-service.yaml,提供集群的访问接口
apiVersion: v1
kind: Service
metadata:
annotations:
service.alpha.kubernetes.io/tolerate-unready-endpoints: "true"
name: galera
namespace: galera
labels:
app: mysql
spec:
ports:
- port: 3306
name: mysql
# *.galear.default.svc.cluster.local
clusterIP: None
selector:
app: mysql
galera-statefulset.yaml,部署集群statfulset POD
apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
name: mysql
namespace: galera
spec:
serviceName: "galera"
replicas: 5
template:
metadata:
labels:
app: mysql
spec:
initContainers:
- name: install
image: gcr.io/google_containers/galera-install:0.1
imagePullPolicy: Always
args:
- "--work-dir=/work-dir"
volumeMounts:
- name: workdir
mountPath: "/work-dir"
- name: config
mountPath: "/etc/mysql"
- name: bootstrap
image: debian:jessie
command:
- "/work-dir/peer-finder"
args:
- -on-start="/work-dir/on-start.sh"
- "-service=galera"
env:
- name: POD_NAMESPACE
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.namespace
volumeMounts:
- name: workdir
mountPath: "/work-dir"
- name: config
mountPath: "/etc/mysql"
containers:
- name: mysql
image: gcr.io/google_containers/mysql-galera:e2e
ports:
- containerPort: 3306
name: mysql
- containerPort: 4444
name: sst
- containerPort: 4567
name: replication
- containerPort: 4568
name: ist
args:
- --defaults-file=/etc/mysql/my-galera.cnf
- --user=root
readinessProbe:
# TODO: If docker exec is buggy just use gcr.io/google_containers/mysql-healthz:1.0
exec:
command:
- sh
- -c
- "mysql -u root -e 'show databases;'"
initialDelaySeconds: 15
timeoutSeconds: 5
successThreshold: 2
volumeMounts:
- name: datadir
mountPath: /var/lib/
- name: config
mountPath: /etc/mysql
volumes:
- name: config
emptyDir: {}
- name: workdir
emptyDir: {}
volumeClaimTemplates:
- metadata:
name: datadir
annotations:
volume.beta.kubernetes.io/storage-class: "ceph-rbd"
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1Gi
2.3 查看部署状态
PODs
kubectl get pods -n galera
NAME READY STATUS RESTART