# Mariadb 数据库集群

Mariadb 是从 MySQL 衍生出来的开源关系型数据库，目前兼容 mysql 5.7 版本；它也非常流行，拥有 Google Facebook 等重要企业用户。本文档介绍使用 helm charts 方式安装 mariadb cluster，仅供实践交流使用。

## 前提条件

- 已部署 k8s 集群，参考[这里](../setup/quickStart.md)
- 已部署 helm，参考[这里](../guide/helm.md)
- 集群提供持久性存储，参考[这里](../setup/08-cluster-storage.md)

这里演示使用 nfs 动态存储，编辑修改 nfs 存储部分参数

``` bash
$ vi roles/cluster-storage/defaults/main.yml
storage:
  # nfs server 参数
  nfs:
    enabled: "yes"              # 启用 nfs
    server: "172.16.3.86"       # 设置 nfs 服务器地址
    server_path: "/data/nfs"    # 设置共享目录
    storage_class: "nfs-db"     # 定义 storage_class，后面pvc要调用这个 
    provisioner_name: "nfs-provisioner-01"  # 任意命名

# 配置完成，保存退出，运行下面命令
$ ansible-playbook /etc/ansible/roles/cluster-storage/cluster-storage.yml
# 确认nfs provisioner pod
$ kubectl get pod --all-namespaces |grep nfs
kube-system   nfs-provisioner-01-88694d78c-mrn7f            1/1     Running   0          6m
```

## mariadb charts 配置修改

按照惯例，直接把 chart 下载到本地，然后把配置复制 values.yaml 出来进行修改，这样方便以后整体更新 chart，安装实际使用需要修改配置文件

``` bash
$ cd /etc/ansible/manifests/mariadb-cluster
# 编辑 my-values.yaml 修改以下部分

service:
  type: NodePort     # 方便集群外部访问
  port: 3306
  nodePort:
    master: 33306    # 设置主库的nodePort
    slave: 33307     # 设置从库的nodePort

rootUser:            # 设置 root 密码
  password: test.c0m
  forcePassword: true

db:                  # 设置初始测试数据库
  user: hello
  password: hello
  name: hello
  forcePassword: true

replication:         # 设置主从复制
  enabled: true
  user: replicator
  password: R4%forep11CAT0r
  forcePassword: true

master:
  affinity: {}
  antiAffinity: soft
  tolerations: []
  persistence:
    enabled: true    # 启用持久化存储
    mountPath: /bitnami/mariadb
    storageClass: "nfs-db"  # 设置使用 nfs-db 存储类
    annotations: {}
    accessModes:
    - ReadWriteOnce
    size: 5Gi        # 设置存储容量 

slave:
  replicas: 1
  affinity: {}
  antiAffinity: soft
  tolerations: []
  persistence:
    enabled: false   # 从库这里没有启用持久性存储
```

## 安装

使用 helm 安装

``` bash
$ cd /etc/ansible/manifests/mariadb-cluster
$ helm install --name mariadb --namespace default -f my-values.yaml ./mariadb
```

## 验证

``` bash
$ kubectl get pod,svc | grep mariadb
pod/mariadb-mariadb-master-0      1/1     Running   0          27m
pod/mariadb-mariadb-slave-0       1/1     Running   0          29m

service/mariadb                       NodePort    10.68.170.168   <none>        3306:33306/TCP       29m
service/mariadb-mariadb-slave         NodePort    10.68.151.95    <none>        3306:33307/TCP       29m
```

