查看原文
其他

IvorySQL Operator | 一键部署IvorySQL集群,高效管理与个性化配置尽在掌控

矫顺田 IvorySQL开源数据库社区
2024-11-16

IvorySQL Operator是在Kubernetes上部署和管理IvorySQL集群的Operator。借助IvorySQL Operator,用户可以在极短时间内迅速部署一个功能完备的IvorySQL集群,同时涵盖TLS通信安全、高可用、备份恢复及全面的监控。


此外,IvorySQL Operator还支持用户根据实际业务需求进行自定义配置,充分满足个性化的使用场景。



01

安装IvorySQL Operator

1.1 环境准备

操作系统:版本:CentOS 7.x x86_64,配置建议cpu>2核,memory>4G,系统盘>100G

K8S:       版本:1.23.7

go:         版本:1.20


1.2 安装部署

1) 获取项目 
git clone git@github.com:IvorySQL/ivory-operator.git

2)构建二进制文件
为了显著提升Go模块的下载和构建速度,我们推荐使用goproxy。通过设置环境变量GOPROXY,并指定国内可靠的代理服务器,可以大大提高模块获取的效率和稳定性,从而优化您的开发体验。
export GOPROXY=https://goproxy.cn,direct
go build -o ivory-operator ./cmd/ivory-operator  # ivory-operator可自定义

3)运行该二进制文件,启动ivory-operator
nohup ./ivory-operator > ivyo.log 2>&1 &

4) 安装crd
crd文件位于项目ivory-operator/config/crd/bases下
kubectl create -f ivory-operator.ivorysql.org_ivoryclusters.yaml

5)查看crd
kubectl get crd



02

使用IvorySQL Operator

2.1 创建namespace

在开始之前,建议先创建一个namespace来进行资源隔离,确保后续在K8S中创建的相关资源都限定在这个namespace下。
kubectl create ns ivory-operator     # ivory-operator可自定义

2.2 创建实例

编辑一个yaml文件(即CR文件,customer resource),该文件应详细声明IvorySQL集群所期望达到的状态。
apiVersion: ivory-operator.ivorysql.org/v1beta1
kind: IvoryCluster
metadata:
  name: ivy01
  namespace: ivory-operator
spec:
  image: docker.io/ivorysql/ivorysql:ubi8-3.0-2.0-1
  postgresVersion: 16
  instances:
- name: instance1
  replicas: 2
      dataVolumeClaimSpec:
        accessModes:
        - "ReadWriteOnce"
        resources:
          requests:
            storage: 1Gi
  backups:
    pgbackrest:
      image: docker.io/ivorysql/pgbackrest:ubi8-2.47-2.0-1
      repos:
      - name: repo1
        volume:
          volumeClaimSpec:
            accessModes:
            - "ReadWriteOnce"
            resources:
              requests:
                storage: 1Gi

在K8S中应用这个资源。
[root@k8s-master ivory-operator]# kubectl apply -k examples/kustomize/ivory
ivorycluster.ivory-operator.ivorysql.org/ivy01 configured

查询集群状态,如果查询结果显示STATUS为Running,则表明数据库已经正常启动并处于运行状态。
[root@k8s-master ivory-operator]kubectl -n ivory-operator get pods \
  --selector=ivory-operator.ivorysql.org/cluster=ivy01,ivory-operator.ivorysql.org/instance
NAME                     READY   STATUS    RESTARTS   AGE
ivy01-instance1-llrz-0   4/4     Running   0          3h40m
ivy01-instance1-wbdt-0   4/4     Running   0          3h40m

您可以使用以下命令来查看IvorySQL集群中当前担任主节点的具体节点信息。
kubectl -n ivory-operator get pods \
  --selector=ivory-operator.ivorysql.org/role=master \
  -o jsonpath='{.items[*].metadata.labels.ivory-operator\.ivorysql\.org/instance}'

除了使用命令查看集群状态,您也可以直接进入IvorySQL集群的容器中查看和了解集群的当前状态。
kubectl exec -it ivy01-instance1-wbdt-0 -c database -n ivory-operator -- /bin/bash
patronictl list
+------------------------+-----------------------------------+--------------+---------+----+-----------+
| Member                 | Host                              | Role         | State   | TL | Lag in MB |
+ Cluster: ivy01-ha (7309663449761415262) -------------------+--------------+---------+----+-----------+
| ivy01-instance1-llrz-0 | ivy01-instance1-llrz-0.ivy01-pods | Sync Standby | running |  4 |         0 |
| ivy01-instance1-wbdt-0 | ivy01-instance1-wbdt-0.ivy01-pods | Leader       | running |  4 |           |
+------------------------+-----------------------------------+--------------+---------+----+-----------+

由于我们在CR文件中设置了replica数量为2,因此IvorySQL Operator会自动为我们部署一个包含2个节点的集群。目前,这个集群已经成功部署并正常运行。


2.3 链接实例

1)查看服务
[root@k8s-master ivory-operator]# kubectl -n ivory-operator get svc --selector=ivory-operator.ivorysql.org/cluster=ivy01
NAME              TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
ivy01-ha          NodePort    10.99.137.135   <none>        5432/TCP   3h42m
ivy01-ha-config   ClusterIP   None            <none>        <none>           3h42m
ivy01-pods        ClusterIP   None            <none>        <none>           3h42m
ivy01-primary     ClusterIP   None            <none>        5432/TCP         3h42m
ivy01-replicas    ClusterIP   10.100.178.96   <none>        5432/TCP         3h42m

2)修改服务类型
在cr文件中,您可以添加service.type为NodePort,这样可以允许外部流量通过节点的IP地址和指定的NodePort访问IvorySQL集群的Service,从而实现对数据库的远程访问。
spec:
  service:
    metadata:
      annotations:
        my-annotation: value1
      labels:
        my-label: value2
    type: NodePort

查看IvorySQL服务状态时,发现服务类型(type)已调谐为NodePort,这表示服务现已支持通过节点的IP地址和对应的NodePort来接收外部流量。
kubectl -n ivory-operator get svc --selector=ivory-operator.ivorysql.org/cluster=ivy01
ivy01-ha          NodePort    10.99.137.135   <none>        5432:31518/TCP   3h42m
ivy01-ha-config   ClusterIP   None            <none>        <none>           3h42m
ivy01-pods        ClusterIP   None            <none>        <none>           3h42m
ivy01-primary     ClusterIP   None            <none>        5432/TCP         3h42m
ivy01-replicas    ClusterIP   10.100.178.96   <none>        5432/TCP         3h42m

3)使用psql工具连接
psql -h 127.0.0.1 -p 31518 -d postgres -U ivorysql

2.4 用户及数据库管理

1)创建用户、数据库

向cr文件中写入以下内容,代表创建一个名为rhino的用户,并赋予该用户对zoo数据库的访问权限。
spec:
  users:
    - name: rhino
      databases:
        - zoo

再次apply这个cr
[root@k8s-master ivory-operator]# kubectl apply -k examples/kustomize/ivory
ivorycluster.ivory-operator.ivorysql.org/ivy01 configured

进入容器查看
kubectl exec -it ivy01-ivy-wgp4-0 -n ivory-operator -- /bin/bashs
[ivorysql@ivy01-instance1-llrz-0 /]$ psql -d zoo
psql (16.0)
Type "help" for help.

zoo=# \du
                              List of roles
 Role name  |                         Attributes                         
------------+------------------------------------------------------------
 _ivoryrepl | Replication
 ivy01      | 
 ivorysql   | Superuser, Create role, Create DB, Replication, Bypass RLS
 rhino      | 

2)删除用户/数据库

对于用户或数据库的删除操作,不能简单地通过再次应用修改后的cr文件来实现。相反,您需在集群中直接执行相应的DROP语句来完成这一操作。
DROP OWNED BY rhino;
DROP ROLE rhino;
DROP DATABASE zoo;

3)删除实例
[root@k8s-master ivory-operator]# kubectl delete -k examples/kustomize/ivory
ivorycluster.ivory-operator.ivorysql.org "ivy01" deleted

2.5 实例管理

1)重启集群
  kubectl patch IvoryCluster/ivy01 -n ivory-operator --type merge \
--patch '{"spec":{"metadata":{"annotations":{"restarted":"'"$(date)"'"}}}}'

2)关闭集群
  kubectl patch IvoryCluster/ivy01 -n ivory-operator --type merge \
  --patch '{"spec":{"shutdown": true}}'

3)调整cpu和内存
您可以对cr文件中的cpu和memory部分进行修改,以满足您的特定需求。
spec:
  instances:
      resources:
        limits:
          cpu: 2.0
          memory: 4Gi

apply
[root@k8s-master ivory-operator]# kubectl apply -k examples/kustomize/ivory
ivorycluster.ivory-operator.ivorysql.org/ivy01 configured

4)自定义配置
在cr文件中做如下修改并应用
spec:
patroni:
    dynamicConfiguration:
      postgresql:
        parameters:
          max_parallel_workers: 2
          max_worker_processes: 2
          shared_buffers: 1GB
          work_mem: 4MB

2.6 高可用主备切换

在cr文件中增加如下内容
spec:
  patroni:
    switchover:
      enabled: true
      targetInstance: ivy01-instance1-wm5p
(注意:targetInstance 非必填,ivy01-instance1-wm5p为要切换为主的INSTANCE)

apply
[root@k8s-master ivory-operator]# kubectl apply -k examples/kustomize/ivory
ivorycluster.ivory-operator.ivorysql.org/ivy01 configured

主备切换
  kubectl annotate -n ivory-operator IvoryCluster ivy01 ivory-operator.ivorysql.org/trigger-switchover="$(date)"

查询主节点
kubectl -n ivory-operator get pods \
  --selector=ivory-operator.ivorysql.org/role=master \
  -o jsonpath='{.items[*].metadata.labels.ivory-operator\.ivorysql\.org/instance}'

切换回来
 kubectl annotate -n ivory-operator IvoryCluster ivy01 ivory-operator.ivorysql.org/trigger-switchover="$(date)" –overwrite

2.7 备份恢复

1)备份

为了完善cr文件中的备份设置,您需要在backups部分增加如下内容,确保options下的各项选项与pgbackrest工具的配置相对应。
spec:
  backups:
    pgbackrest:
      image: docker.io/ivorysql/pgbackrest:ubi8-2.47-2.0-1
      manual:
        options:
        - --type=full
        repoName: repo1

执行备份
kubectl annotate -n ivory-operator IvoryCluster ivy01 ivory-operator.ivorysql.org/pgbackrest-backup="$(date)"

2)恢复
编辑cr文件
spec:
  backups:
    pgbackrest:
      image: docker.io/ivorysql/pgbackrest:ubi8-2.47-2.0-1
      restore:
        enabled: true
        repoName: repo1
        options:
        - --type=time
        - --target="2023-06-25 09:38:00"

apply这个cr文件
[root@k8s-master ivory-operator]# kubectl apply -k examples/kustomize/ivory
ivorycluster.ivory-operator.ivorysql.org/ivy01

执行一次恢复
kubectl annotate -n ivory-operator IvoryCluster ivy01 ivory-operator.ivorysql.org/pgbackrest-restore=id1

查询恢复结果
kubectl get all -n ivory-operator

查询恢复完成后实例状态
kubectl get all -n ivory-operator

登录数据库查看数据是否恢复
kubectl exec -it ivy01-ivy-wgp4-0 -n ivory-operator -- /bin/bash


关注公众号,了解更多社区动态


- 我们是谁 -

lvorySQL是由浪潮软件集团瀚高股份主导研发的,一款深度兼容Oracle的PostgreSQL开源数据库系统。IvorySQL从底层代码层面深入把握开源技术的发展趋势,基于PostgreSQL 16.2的最新内核进行构建,同时提供了更加全面灵活的Oracle兼容功能,具备高度的SQL和PL/SQL兼容性,能够满足企业对于数据库系统多样化和高兼容性的需求。

- 推荐阅读 -


IvorySQL


  一款开源的兼容Oracle的PostgreSQL


官方网址:
https://www.ivorysql.org
社区仓库:
https://github.com/IvorySQL/IvorySQL
IvorySQL社区欢迎并赞赏所有类型的贡献,期待您的加入!
记得在GitHub给我们一个 ⭐奥~


点击文末的 “阅读原文”,开启您的IvorySQL3.0 Release Notes探索之旅,深入了解更多独家特性。

>>>最新版本体验链接:
https://github.com/IvorySQL/IvorySQL/releases
继续滑动看下一个
IvorySQL开源数据库社区
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存