#作者:猎人
一、背景
近期某省核心业务讨论的双中心方案:有平台依赖的minio组件,需要实现多个minio集群之间数据库实时同步。
二、方案
- 首先保证minio容器中有 mc 命令
安装mc命令
下载mc客户端
wget https://dl.min.io/client/mc/release/linux-amd64/mc
添加执行权限
chmod +x mc
移动到/usr/bin目录
mv mc /usr/bin/
2、同步配置(以下配置只在主集群服务中配置)
(1)能登录后台的话,直接在minio客户端执行命令即可
命令格式:mc config host add name http://ip:端口 用户名 密码
- name: 自定义配置名称
- ip: 访问该minio服务的ip
- 端口: 9000端口映射的端口
- 用户名\密码: 部署服务设置的账号密码
以此环境为样例:
mc config host add minio_master http://172.18.243.20:32686 admin admin@12345
mc config host add minio_slave http://172.18.243.20:32100 admin admin@12345
(2)k8s方式部署的话,直接挂载configmap配置文件到minio服务的 /.mc/config.json 路径即可
以此环境为样例:
{
"version": "10",
"aliases": {
"minio_master": {
"url": "http://172.18.243.20:32686", # minio服务地址可以配置域名方式 http://minio-twfho.component:9000
"accessKey": "admin",
"secretKey": "admin@12345",
"api": "s3v4",
"path": "auto"
},
"minio_slave": {
"url": "http://172.18.243.20:32100", # http://minio-ocazf.component:9000
"accessKey": "admin", #
"secretKey": "admin@12345",
"api": "s3v4",
"path": "auto"
}
}
}
(3)配置完成可以在客户端执行命令查看是否配置成功
mc alias list
3、启动同步服务(以下配置只在主集群服务中配置)
(1)能登录后台的话,直接在minio客户端执行命令即可
命令格式:nohup mc mirror --remove --overwrite --watch minio_master minio_slave &
- nohup: Linux命令保证服务不被退出
- mc mirror: minio中固定的客户端命令,用于同步数据
- –remove: 移除目标上的无关对象
- –overwrite: 覆盖对象
- –watch: 持续监控
- minio_master minio_slave: 上一步中自定义的配置名称
- & Linux命令保证服务后台运行
- 具体细节配置可参考官网:http://docs.minio.org.cn/minio/baremetal/reference/minio-cli/minio-mc/mc-mirror.html#command-mc-mirror
命令说明:从服务minio_master同步数据到服务minio_slave,单向同步。
nohup mc mirror --remove --overwrite --watch minio_master minio_slave &
命令说明:将服务minio_master上名为“bucket-demo”的桶的数据迁移到服务器minio_slave的“bucket-demo”桶中
./mc cp --recursive minio_master/bucket-demo/ minio_slave/bucket-demo/
命令说明:将服务minio_master上所有数据迁移到服务minio_slave中
./mc cp --recursive minio_master minio_slave
--recursive 递归拷贝
(2)k8s方式部署的话,将上述命令直接配置在钩子函数中执行(该方式还未验证通过,同步服务启动完成后同步服务,过一会成为了僵尸进程)
lifecycle:
postStart:
exec:
command:
- /bin/bash
- -c
- /opt/bitnami/scripts/minio/nohup.sh
nohup.sh 脚本通过configmap方式挂载到minio服务中
nohup.sh 脚本内容跟3.1中的命令一样
验证场景:
1、双向同步需求可以实现,只需要在两个minio集群各自配置 向对方集群同步数据即可(建议只做单向同步,因为两个集群之间互相同步可能造成数据丢失问题。具体原因暂时未知,多次测试看出来的问题)
(1)在双minio集群的每个pod中挂载两个minio集群配置的文件
(2)在双minio集群的每个pod中启动mc mirror同步服务向对方集群同步数据
(3)在主集群上传一个文件,目的集群正常同步到数据
Minio-master
Minio-slave
(4)在目的集群上传一个文件,主集群正常同步到数据
Minio-slave
Minio-master
2、4节点的集群,目的集群挂掉一个节点可以正常写入和同步;目的集群挂掉两个节点就只能查看,不能写入和同步
(1)设置节点不可调度,删掉目的集群的一个pod让他拉起不正常
(2)在主集群上传一个文件,目的集群正常同步到数据
Minio-master
Minio-slave
(3)设置节点不可调度,删掉目的集群的两个pod让他拉起不正常
(4)在主集群上传一个文件,目的集群未同步到数据
Minio-master
Minio-slave
(5)目的集群节点恢复正常之后,刚才主集群的数据自动同步过来
Minio-master
Minio-slave
3、4节点的集群,主集群挂掉一个节点可以正常写入和同步;主集群挂掉两个节点就只能查看,不能写入和同步
(1)设置节点不可调度,删掉主集群的一个pod让他拉起不正常
(2)在主集群上传一个文件,目的集群正常同步到数据
Minio-master
Minio-slave
(3)设置节点不可调度,删掉目的集群的两个pod让他拉起不正常
(4)主集群上传文件失败
三、yaml样例
1、minio-StatefulSet
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: minio-twfho
namespace: component
spec:
podManagementPolicy: Parallel
replicas: 4
revisionHistoryLimit: 10
selector:
matchLabels:
app.kubernetes.io/instance: minio-twfho
app.kubernetes.io/name: minio
serviceName: minio-twfho-headless
template:
metadata:
annotations:
checksum/credentials-secret: fd559c1b282e87f436c328a94f336979a323969ea693af8e8b7ccb1f58512777
configMap: nohup;mcconfig;
creationTimestamp: null
labels:
app.kubernetes.io/instance: minio-twfho
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: minio
helm.sh/chart: minio-10.1.10
spec:
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- podAffinityTerm:
labelSelector:
matchLabels:
app.kubernetes.io/instance: minio-twfho
app.kubernetes.io/name: minio
namespaces:
- component
topologyKey: kubernetes.io/hostname
weight: 1
automountServiceAccountToken: true
containers:
- env:
- name: BITNAMI_DEBUG
value: "false"
- name: MINIO_DISTRIBUTED_MODE_ENABLED
value: "yes"
- name: MINIO_DISTRIBUTED_NODES
value: minio-twfho-{0...3}.minio-twfho-headless.component.svc.cluster.local:9000/data
- name: MINIO_SCHEME
value: http
- name: MINIO_FORCE_NEW_KEYS
value: "no"
- name: MINIO_ROOT_USER
value: admin
- name: MINIO_ROOT_PASSWORD
value: admin@12345
- name: MINIO_SKIP_CLIENT
value: "yes"
- name: MINIO_BROWSER
value: "on"
- name: MINIO_PROMETHEUS_AUTH_TYPE
value: public
image: boatswain.registry.si-tech.com.cn:30100/component/bitnami/minio:2022.2.16
imagePullPolicy: Always
lifecycle:
postStart:
exec:
command:
- /bin/bash
- -c
- /opt/bitnami/scripts/minio/nohup.sh
livenessProbe:
failureThreshold: 5
httpGet:
path: /minio/health/live
port: minio-api
scheme: HTTP
initialDelaySeconds: 5
periodSeconds: 5
successThreshold: 1
timeoutSeconds: 5
name: minio
ports:
- containerPort: 9000
name: minio-api
protocol: TCP
- containerPort: 9001
name: minio-console
protocol: TCP
readinessProbe:
failureThreshold: 5
initialDelaySeconds: 5
periodSeconds: 5
successThreshold: 1
tcpSocket:
port: minio-api
timeoutSeconds: 1
resources: {}
securityContext:
runAsNonRoot: true
runAsUser: 1001
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /data
name: data
- mountPath: /opt/bitnami/scripts/minio/nohup.sh
name: nohup-0
subPath: nohup.sh
- mountPath: /.mc/config.json
name: mcconfig-1
subPath: config.json
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext:
fsGroup: 1001
serviceAccount: minio-twfho
serviceAccountName: minio-twfho
terminationGracePeriodSeconds: 30
volumes:
- configMap:
defaultMode: 493
items:
- key: nohup.sh
path: nohup.sh
name: nohup
optional: false
name: nohup-0
- configMap:
defaultMode: 420
items:
- key: config.json
path: config.json
name: mcconfig
optional: false
name: mcconfig-1
updateStrategy:
type: RollingUpdate
volumeClaimTemplates:
- apiVersion: v1
kind: PersistentVolumeClaim
metadata:
creationTimestamp: null
labels:
app.kubernetes.io/instance: minio-twfho
app.kubernetes.io/name: minio
name: data
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: glusterfs-sc
volumeMode: Filesystem
status:
phase: Pending
2、mcconfig-configmap
piVersion: v1
data:
config.json: "{
"version": "10",
"aliases": {
"minio_master": {
"url": "http://minio-twfho.component:9000",
"accessKey": "admin",
"secretKey": "admin@12345",
"api": "s3v4",
"path": "auto"
},
"minio_slave": {
"url": "http://minio-ocazf.component:9000",
"accessKey": "admin",
"secretKey": "admin@12345",
"api": "s3v4",
"path": "auto"
}
}
}"
kind: ConfigMap
metadata:
name: mcconfig
namespace: component
3、nohup-configmap
apiVersion: v1
data:
nohup.sh: nohup mc mirror --remove --overwrite --watch minio_master minio_slave
&
kind: ConfigMap
metadata:
name: nohup
namespace: component