limx59的个人博客分享 http://blog.sciencenet.cn/u/limx59

博文

如何搭建基于Kubernates的Mysql多主机群

已有 4636 次阅读 2016-10-25 15:31 |系统分类:科研笔记

1、Persona XtraDB Cluster介绍:

      Persona XtraDB Cluster集群是由HPE公司提出的基于MySQL的多主数据库集群,该集群主要是通过容器的方式实现Mysql集群的部署,并且能够依托Kubernates实现对集群节点的管理。

(1)集群的主要特点

       Persona XtraDB Cluster集群的特点实现的是多主服务器协同工作,能够实现多节点共享和单独提供服务的能力。从而减少了因为master节点宕机造成的数据库运行效率低下或者无法提供服务的问题。根据官方资料,其拓扑结构及其特点如下图所示:

   依据上图中的拓扑结构和特点,Percona XtraDB Cluster与原有的数据库相比,也存在比较大的优缺点:

2、PXC的部署过程

      ①创建Cluster服务

      由于PXC(Percona XtraDB Cluster)主要是基于Kubernates进行部署,因此需要在Kubernates环境下创建相应的服务和Pod。当然基于k8s创建服务和Pod等主要是在k8s集群的master节点中完成。首先需要为PXC创建统一的集群服务。在此之前需要下载PXC的镜像,并且部署到自己的镜像服务器上,我们这边采用的私有服务器地址是:10.1.24.90:5000,这个地址在后续创建服务中会用到。我们创建配置脚本文件为:pxc-cluster-service.yaml 。其具体的脚本文件如下图所示:

如上图所示,我们在k8s中创建了一个名称叫做pxc-cluster的服务,端口号是3306

通过如下命令,执行上述脚本:

$ Kubectl create -f ./pxc-cluster-service.yaml  

$ Kubectl create -f ./pxc-cluster-service.yaml

执行上述脚本以后,提示创建服务成功。通过如下命令,可以查看系统中是否已经启动了相关的服务

$ kubectl get svc --all-namespaces  

通过上述命令以后,我们可以查看到如下状态:

     

如上图所示,我们发现刚才创建的cluster服务已经启动。

②创建Cluster的node1节点

      在Kubernates系统中创建完成pxc-cluster服务以后,我们就开始着手创建集群的每个节点了。当然在k8s中创建的服务,自然是通过pod方式实现。因此每次添加新的节点都是通过配置脚本的方式来创建的,并且需要为每一个节点起一个名称。

      特别需要注意的是,创建节点的时候Service和RC需要同时创建,如果仅有Service而无Endpoint的话,后续的SSL过程会失败,那么创建的节点也会自动停止,导致创建的pod停止,会被RC不断的重启。

      因此在创建配置脚本过程中,需要创建两个部分:Service和RC,具体的源代码如下所示:

  • Service部分:

apiVersion: v1  
  1. kind: Service  

  2. metadata:  

  3.  name: pxc-node1  

  4.  labels:  

  5.    node: pxc-node1  

  6. spec:  

  7.  ports:  

  8.    - port: 3306  

  9.      name: mysql  

  10.    - port: 4444  

  11.      name: state-snapshot-transfer  

  12.    - port: 4567  

  13.      name: replication-traffic  

  14.    - port: 4568  

  15.      name: incremental-state-transfer  

  16.  selector:  

  17.    node: pxc-node1  

  18. ---  

apiVersion: v1 kind: Service metadata: name: pxc-node1 labels: node: pxc-node1 spec: ports: - port: 3306 name: mysql - port: 4444 name: state-snapshot-transfer - port: 4567 name: replication-traffic - port: 4568 name: incremental-state-transfer selector: node: pxc-node1 ---上述部分是配置脚本的Service部分,在k8s集群中创建了一个pxc的节点服务,名称为pxc-node1,端口和pxc-cluster服务统一为3306,数据库名称为mysql,并且创建了另外三个端口:stat-snapshot-transfer(4444)、replication-traffic(4567)、incremental-stat-transfer(4568)
  • RC部分:

---  
  1. apiVersion: v1  

  2. kind: ReplicationController  

  3. metadata:  

  4.  name: pxc-node1  

  5. spec:  

  6.  replicas: 1  

  7.  template:  

  8.    metadata:  

  9.      labels:  

  10.        node: pxc-node1  

  11.        unit: pxc-cluster  

  12.    spec:  

  13.      containers:  

  14.        - resources:  

  15.            limits:  

  16.              cpu: 0.3  

  17.          image: 10.1.24.90:5000/percona_xtradb_cluster_5_6  

  18.          name: pxc-node1  

  19.          ports:  

  20.            - containerPort: 3306  

  21.            - containerPort: 4444  

  22.            - containerPort: 4567  

  23.            - containerPort: 4568  

  24.          env:  

  25.            - name: GALERA_CLUSTER  

  26.              value: "true"  

  27.            - name: WSREP_CLUSTER_ADDRESS  

  28.              value: gcomm://  

  29.            - name: WSREP_SST_USER  

  30.              value: sst  

  31.            - name: WSREP_SST_PASSWORD  

  32.              value: sst  

  33.            - name: MYSQL_ROOT_PASSWORD  

  34.              value: root  


--- apiVersion: v1 kind: ReplicationController metadata: name: pxc-node1 spec: replicas: 1 template: metadata: labels: node: pxc-node1 unit: pxc-cluster spec: containers: - resources: limits: cpu: 0.3 image: 10.1.24.90:5000/percona_xtradb_cluster_5_6 name: pxc-node1 ports: - containerPort: 3306 - containerPort: 4444 - containerPort: 4567 - containerPort: 4568 env: - name: GALERA_CLUSTER value: "true" - name: WSREP_CLUSTER_ADDRESS value: gcomm:// - name: WSREP_SST_USER value: sst - name: WSREP_SST_PASSWORD value: sst - name: MYSQL_ROOT_PASSWORD value: root
上述部分是配置脚本的RC部分,在k8s中创建了一个pxc-node的RC,其中副本数为1,可以根据需求修改为其他数字。RC的名称同样是pxc-node1,说明此节点的副本是1个。并且创建Pod所需要的镜像,正如从之前上传的私库镜像服务器上下载镜像文件。而所创建的pod在配置脚本中归属的单元为pxc-cluster集群中。而在创建的环境中也同时创建的mysql的环境变量,包括:root用户和密码,SST用户和密码等等。

    执行如下命令,创建node1的pod:


$ kubectl create -f ./pxc-node1.yaml  


$ kubectl create -f ./pxc-node1.yaml


执行上述命令以后,执行如下命令,可以查看创建的pod是否启动:


$ kubectl get pods  


$ kubectl get pods
通过上图,我们发现在k8s系统中,我们启动的pod有我们刚刚创建好的pod。说明节点创建成功。

通过上述方法,我们可以成功创建node1,node2,node3等等,当然需要修改配置文件的名称以及相关service和RC的名称。

通过这种方法可以组建一个基于Kubernates的mysql集群。

3、验证mysql部署情况

执行如下命令,连接PXC数据库集群。


$ kubectl exec -ti <POD-ID> --mysql-u root -proot -h pxc-cluster  

$ kubectl exec -ti <POD-ID> --mysql-u root -proot -h pxc-cluster


其中POD-ID就是上述查询到的POD的名称。比如本文创建的POD节点有四个,分别是:

  • pxc-node1-rkwj8

  • pxc-node2-a6usw

  • pxc-node3-oky8e

  • pxc-node4-6q6bz

那么选择其中一个pod都可以。
执行上述命令以后,其结果如下图所示:

说明已经成功连接到mysql数据库中。

执行如下脚本,具体查看一下集群的节点数有几个:


$ mysql> show status like 'wsrep_cluster_size';  


$ mysql> show status like 'wsrep_cluster_size';
执行上述命令后,可以查看到如下图所示:
如上图所示,具体的集群的节点数有4个,这跟我们之前创建的4个节点吻合。说明我们创建的四个节点成功。
4、备注
如果删除其中一个节点pod,k8s系统都会自动拉起一个节点。但是重新查看mysql中的节点数状态会发现,新拉起的节点并不能够识别。需要将其他创建的节点都删掉重新创建才能正常识别。




https://blog.sciencenet.cn/blog-50618-1010777.html

上一篇:如何搭建DC/OS系统的框架私有服务器
下一篇:如何搭建基于Kubernates的MySQL主从服务器集群
收藏 IP: 202.108.100.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...
扫一扫,分享此博文

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-6-17 17:47

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部