2023年6月30日发(作者:)
k8s集群下canal-server的伪⾼可⽤实践k8s集群下canal-server的伪⾼可⽤实践前⾔前⾯我们已经介绍了canal的admin、server、adapter三个部分的容器化以及在k8s集群下的搭建过程。在创建canal-server的时候,k8s环境下,容器重启会造成ip地址的变动给我们带来了⼀些问题,我们通过在创建canal-server的时候使⽤statefuset类型,使其可以通过固定的域名去向canal-admin注册,从⽽保证了canal-server的连接地址的稳定不变。本⽂将利⽤容器异常⾃动重启这个特性,搭建⼀个anal-server的伪⾼可⽤版本。问题在使⽤server的默认配置时,ties下的这⼀项设置的是classpath:spring/,在该模式下,server会将解析位点和消费位点以本地⽂件的形式记录下来,⽽在咱们之前搭建的容器环境下,容器⼀旦重启,这些记录着位点信息的⽂件也就不存在了,server容器重新启动后会认为这是⼀个新建的同步任务,然后以当前位点开始解析binlog,这样必然会发⽣数据丢失的现象。解决⽅案容器重启造成数据丢失的原因是容器重启后,容器内的内容没有做持久化的存储导致记录解析和消费位点的⽂件丢失,进⽽以当前位点解析binlog,从⽽造成的数据丢失。这个时候,我们只需要将这个记录解析和消费位点的⽂件能够在容器重启之后不丢失就可以了,下⾯我们将在k8s环境下使⽤PV和PVC来解决这个问题。需要先将磁盘挂载到192.168.100.1的/data/canal-server⽬录下,然后创建pv,如下kind: StorageClassapiVersion: /v1metadata: name: local-storageprovisioner: /no-provisionervolumeBindingMode: WaitForFirstConsumer---apiVersion: v1kind: PersistentVolumemetadata: name: local-pv-sdaspec: capacity: storage: 1Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain storageClassName: local-storage local: path: /data/canal-server nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: /hostname operator: In values: - 192.168.100.1#创建PVkubectl apply -f 因为server是⽤statefuset类型创建,所以⽆需⼿动创建PVC,修改server的如下apiVersion: apps/v1kind: StatefulSetmetadata: name: canal-server-stable namespace: testcanal labels: app: canal-server-stablespec: selector: matchLabels: app: canal-server-stable serviceName: "canal-server-discovery-svc-stable" replicas: 4 template: metadata: labels: app: canal-server-stable annotations: /path: / /port: "11112" /scrape: "true" spec: containers: - image: canal/canal-server:v1.1.4 name: canal-server-stable imagePullPolicy: Always ports: - containerPort: 11110 protocol: TCP name: http1 - containerPort: 11111 protocol: TCP name: http2 - containerPort: 11112 protocol: TCP name: http3 resources: requests: cpu: 100m memory: 100Mi limits: cpu: 4000m memory: 4Gi volumeMounts: - mountPath: /home/canal/bin/ subPath: name: server-conf #挂载pvc到容器的/home/canal/instance⽬录下 - name: data mountPath: /home/canal/instance volumes: - name: server-conf configMap: name: canal-server-stable-conf defaultMode: 0777 securityContext: runAsUser: 0#⾃动与满⾜条件的pv匹配
volumeClaimTemplates: - metadata: name: data spec: accessModes: [ "ReadWriteOnce" ] accessModes: [ "ReadWriteOnce" ] storageClassName: 'local-storage' resources: requests: storage: "1G"#创建server容器kubectl apply -f 在admin界⾯修改server的ties中的改为以下配置# pvc挂载到容器的⽬录 = ../instance总结使⽤挂载持久化存储到容器内可以保证server在发⽣异常重启之后还能够从记录解析和消费位点信息的⽂件中读取位点信息,在异常发⽣的时间重新解析binlog,从⽽保证了数据的准确性。以上便是我根据容器特性搭建的伪⾼可⽤的canal-server,该版本的问题是pv使⽤的本地存储,若磁盘或物理机发⽣故障,数据同样会丢失,可以使⽤⾼可⽤存储⽅案替代。后续继续更新canal使⽤中遇到的问题以及处理⽅案,求关注!欢迎关注我的个⼈微信公众号,⼀个菜鸟程序猿的技术技术分享和奔溃⽇常
发布者:admin,转转请注明出处:http://www.yc00.com/xiaochengxu/1688057803a72566.html
评论列表(0条)