kubernetes部署Percona XtraDB Cluster叢集
阿新 • • 發佈:2020-09-21
PXC介紹
全稱percona-xtradb-cluster,提供了MySQL高可用的一種實現方法。PXC叢集以節點組成(推薦至少3節點,便於故障恢復),每個節點都是基於常規的 MySQL Server,意味著你可以從叢集中分離出某節點單獨使用,叢集中每個節點都包含完整的資料。
PXC特性
- 同步複製
- 支援多主複製
- 支援並行複製
- 作為高可用方案,實施相對簡單
架構圖如下所示
部署PXC叢集到kubernetes
1、下載部署檔案
git clone -b v1.5.0 https://github.com/percona/percona-xtradb-cluster-operator
2、建立CRD
[root@k8s-master001 deploy]# kubectl apply -f crd.yaml Warning: apiextensions.k8s.io/v1beta1 CustomResourceDefinition is deprecated in v1.16+, unavailable in v1.22+; use apiextensions.k8s.io/v1 CustomResourceDefinition customresourcedefinition.apiextensions.k8s.io/perconaxtradbclusters.pxc.percona.com created customresourcedefinition.apiextensions.k8s.io/perconaxtradbclusterbackups.pxc.percona.com created customresourcedefinition.apiextensions.k8s.io/perconaxtradbclusterrestores.pxc.percona.com created customresourcedefinition.apiextensions.k8s.io/perconaxtradbbackups.pxc.percona.com created
3、建立namespace
[root@k8s-master001 deploy]# kubectl create namespace pxc
namespace/pxc created
[root@k8s-master001 deploy]# kubectl config set-context $(kubectl config current-context) --namespace=pxc
Context "kubernetes-admin@kubernetes" modified.
4、建立RBAC
[root@k8s-master001 deploy]# kubectl apply -f rbac.yaml Warning: rbac.authorization.k8s.io/v1beta1 Role is deprecated in v1.17+, unavailable in v1.22+; use rbac.authorization.k8s.io/v1 Role role.rbac.authorization.k8s.io/percona-xtradb-cluster-operator created serviceaccount/percona-xtradb-cluster-operator created serviceaccount/percona-xtradb-cluster-operator-workload created Warning: rbac.authorization.k8s.io/v1beta1 RoleBinding is deprecated in v1.17+, unavailable in v1.22+; use rbac.authorization.k8s.io/v1 RoleBinding rolebinding.rbac.authorization.k8s.io/service-account-percona-xtradb-cluster-operator created
5、建立operator
[root@k8s-master001 deploy]# kubectl apply -f operator.yaml
deployment.apps/percona-xtradb-cluster-operator created
[root@k8s-master001 deploy]# kubectl get po -n pxc
NAME READY STATUS RESTARTS AGE
percona-xtradb-cluster-operator-54d9b7c858-hkmsp 1/1 Running 0 2m19s
6、建立secrets
建立root密碼,並修改secrets.yaml中的root欄位為新生成的密碼
[root@k8s-master001 deploy]# echo -n 'pxcadmin' | base64
cHhjYWRtaW4=
[root@k8s-master001 deploy]# kubectl apply -f secrets.yaml
secret/my-cluster-secrets created
7、建立Percona XtraDB Cluster
修改配置
updateStrategy: OnDelete
指定儲存類和儲存大小
rook-ceph是k8s的儲存類,可以通過kubectl get sc獲取
persistentVolumeClaim:
storageClassName: rook-ceph
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 6Gi
執行部署
[root@k8s-master001 deploy]# kubectl apply -f cr.yaml
perconaxtradbcluster.pxc.percona.com/cluster1 created
[root@k8s-master001 deploy]# kubectl get po -n pxc
NAME READY STATUS RESTARTS AGE
cluster1-haproxy-0 2/2 Running 0 17m
cluster1-haproxy-1 2/2 Running 0 15m
cluster1-haproxy-2 2/2 Running 0 13m
cluster1-pxc-0 1/1 Running 0 17m
cluster1-pxc-1 1/1 Running 0 6m28s
cluster1-pxc-2 1/1 Running 0 3m33s
8、驗證:
執行一個percona-client
kubectl run -i --rm --tty percona-client --image=percona:5.7 --restart=Never -- bash -il
檢視3306代理,這裡官方用的是haproxy
sh-4.2$ env|grep 3306
CLUSTER1_HAPROXY_SERVICE_PORT=3306
CLUSTER1_HAPROXY_REPLICAS_PORT_3306_TCP_PORT=3306
CLUSTER1_HAPROXY_PORT=tcp://10.106.76.114:3306
連線資料庫,檢視叢集資訊,wsrep_cluster_size=3,表示現在叢集有3個節點 ,更多資訊自己檢視輸出資訊
sh-4.2$ mysql -h10.106.76.114 -uroot -ppxcadmin
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
mysql> show status like 'wsrep%';
+----------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Variable_name | Value |
+----------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| wsrep_local_state_uuid | 703296d1-f72b-11ea-93ec-5267957b341b |
| wsrep_cluster_capabilities | |
| wsrep_cluster_conf_id | 5 |
| wsrep_cluster_size | 3 |
| wsrep_cluster_state_uuid | 703296d1-f72b-11ea-93ec-5267957b341b |
| wsrep_cluster_status | Primary |
| wsrep_connected | ON |
| wsrep_local_bf_aborts | 0 |
| wsrep_local_index | 2 |
| wsrep_provider_capabilities | :MULTI_MASTER:CERTIFICATION:PARALLEL_APPLYING:TRX_REPLAY:ISOLATION:PAUSE:CAUSAL_READS:INCREMENTAL_WRITESET:UNORDERED:PREORDERED:STREAMING:NBO: |
| wsrep_provider_name | Galera |
| wsrep_provider_vendor | Codership Oy <[email protected]> |
| wsrep_provider_version | 4.3(r752664d) |
| wsrep_ready | ON |
| wsrep_thread_count | 3 |
+----------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
75 rows in set (0.01 sec)
9、說明
kubectl get po -n pxc
NAME READY STATUS RESTARTS AGE
cluster1-haproxy-0 2/2 Running 0 39m
cluster1-haproxy-1 2/2 Running 0 36m
cluster1-haproxy-2 2/2 Running 0 35m
cluster1-pxc-0 1/1 Running 1 39m
cluster1-pxc-1 1/1 Running 0 28m
cluster1-pxc-2 1/1 Running 0 25m
percona-client 1/1 Running 0 16m
percona-xtradb-cluster-operator-54d9b7c858-hkmsp 1/1 Running 0 65m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/cluster1-haproxy ClusterIP 10.106.76.114 <none> 3306/TCP,3309/TCP 43m
service/cluster1-haproxy-replicas ClusterIP 10.104.239.57 <none> 3306/TCP 43m
service/cluster1-pxc ClusterIP None <none> 3306/TCP 43m
service/cluster1-pxc-unready ClusterIP None <none> 3306/TCP 43m
- 從以上輸出可以看到,運行了三個pxc節點,這裡可以視為物理機三個mysql節點,除此之外,還有三個haproxy。說明使用haproxy來為pxc叢集提供代理服務,進入到cluster1-haproxy-0 可以看到如下資訊
server cluster1-pxc-0 cluster1-pxc-0.cluster1-pxc.pxc.svc.cluster.local:3306 check inter 10000 rise 1 fall 2 weight 1
server cluster1-pxc-1 cluster1-pxc-1.cluster1-pxc.pxc.svc.cluster.local:3306 check inter 10000 rise 1 fall 2 weight 1
server cluster1-pxc-2 cluster1-pxc-2.cluster1-pxc.pxc.svc.cluster.local:3306 check inter 10000 rise 1 fall 2 weight 1
-
再來看service,建立了cluster1-haproxy,如果在kubernetes叢集內部,可以直接通過CLUSTER-IP+PORT訪問到資料庫
-
如果想在叢集外部訪問到資料庫,可以使用前文介紹的Ingress來暴露TCP服務,如果測試,也可使建立一個NodePort來暴露服。務下一篇我們就來就使用前文介紹過的Ingress來把mysql的服務暴露出去,順便介紹Nginx-Ingress。