Skip to content
This repository has been archived by the owner on Jul 22, 2024. It is now read-only.

Commit

Permalink
add chinese readme file
Browse files Browse the repository at this point in the history
add chinese readme file
  • Loading branch information
wwalisa committed Dec 27, 2017
1 parent cbf5f4a commit 0a4f449
Showing 1 changed file with 231 additions and 0 deletions.
231 changes: 231 additions & 0 deletions README-cn.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,231 @@
[![构建状态](https://travis-ci.org/IBM/Scalable-Cassandra-deployment-on-Kubernetes.svg?branch=master)](https://travis-ci.org/IBM/Scalable-Cassandra-deployment-on-Kubernetes)

# Kubernetes 集群上的可扩展多节点 Cassandra 部署

*阅读本文的其他语言版本:[English](README.md)*

本项目将演示如何将一个多节点可扩展 Cassandra 集群部署在 Kubernetes 上。Apache Cassandra 是一个可大规模扩展的开源 NoSQL 数据库。Cassandra 非常适合管理跨多个数据中心和云的大量结构化、半结构化和非结构化数据。

利用 Kubernetes 概念,比如 [PersistentVolume](https://kubernetes.io/docs/concepts/storage/persistent-volumes/)[StatefulSet](https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/),我们可以提供一种具有容灾能力的 Cassandra 安装,并确信它的数据(状态)是安全的。

我们还对 Cassandra 使用了一个[“headless” service](https://kubernetes.io/docs/concepts/services-networking/service/#headless-services)。这样,我们就可以为应用程序提供一种通过 [KubeDNS](https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/) 访问它的方式,而且不会将它暴露给外部世界。要从您的开发人员工作站访问它,您可以对任何 Cassandra Pod 使用 `kubectl exec` 命令。如果您确实希望将应用程序连接到它,那么您可以在配置您的应用程序时使用 KubeDNS 值 `cassandra.default.svc.cluster.local`

![kube-cassandra](images/kube-cassandra-code.png)

## 使用的 Kubernetes 概念

* [Kubenetes Pods](https://kubernetes.io/docs/user-guide/pods)
* [Kubenetes 服务](https://kubernetes.io/docs/user-guide/services)
* [Kubernets StatefulSets](https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/)

## 包含的组件
* [Kubernetes 集群](https://console.ng.bluemix.net/docs/containers/cs_ov.html#cs_ov)
* [IBM Cloud Container 服务](https://console.ng.bluemix.net/catalog/?taxonomyNavigation=apps&category=containers)
* [IBM Cloud Private](https://www.ibm.com/cloud-computing/products/ibm-cloud-private/)
* [Cassandra](http://cassandra.apache.org/)

## 入门

要遵循本指南进行操作,您需要一个 Kubernetes 集群。如果无法访问现有的 Kubernetes 集群,请按照操作说明(在链接中)提供以下组件之一:

* [Minikube](https://kubernetes.io/docs/getting-started-guides/minikube),在您的工作站上
* [IBM Cloud Container 服务](https://github.com/IBM/container-journey-template#container-journey-template---creating-a-kubernetes-cluster),部署在一个 IBM 管理的集群中(免费的小集群)
* [IBM Cloud Private - 社区版](https://github.com/IBM/deploy-ibm-cloud-private/blob/master/README.md),用于获得一个自主管理的 Kubernetes 集群(在 Vagrant、Softlayer 或 OpenStack 中)

_这里的代码会定期使用 Travis CI针对[来自 Cloud Container 服务的 Kubernetes 集群](https://console.ng.bluemix.net/docs/containers/cs_ov.html#cs_ov) 进行测试。_

安装 Kubernetes(或设置对它的访问权)后,通过运行以下命令并确认获得了客户端和服务器的版本响应,确保您能访问它:

```shell
$ kubectl version
Client Version: version.Info{Major:"1", Minor:"7", GitVersion:"v1.7.5", GitCommit:"17d7182a7ccbb167074be7a87f0a68bd00d58d97", GitTreeState:"clean", BuildDate:"2017-08-31T09:14:02Z", GoVersion:"go1.8.3", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"7", GitVersion:"v1.7.5", GitCommit:"17d7182a7ccbb167074be7a87f0a68bd00d58d97", GitTreeState:"clean", BuildDate:"2017-09-18T20:30:29Z", GoVersion:"go1.8.3", Compiler:"gc", Platform:"linux/amd64"}
```

## 创建一个 Cassandra 服务来实现 Cassandra 集群组建和发现

### 1.创建一个 Cassandra Headless Service

为了使我们能对 Cassandra 种子节点(我们很快将部署它)执行简单的发现操作,我们可以创建一个”Headless” service。 为此,我们为 [cassandra-service.yaml](cassandra-service.yaml) 中的 **clusterIP** 指定 **none**。这个”Headless” service允许 Pod 使用 KubeDNS发现 Cassandra 种子的 IP 地址。

您可以使用 [cassandra-service.yaml](cassandra-service.yaml) 文件创建这个”Headless” service:

```shell
$ kubectl create -f cassandra-service.yaml
service "cassandra" created
$ kubectl get svc cassandra
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
cassandra None <none> 9042/TCP 10s
```

部署到 Kubernetes 的大部分应用程序都应该是云原生的,而且依靠外部资源来存储其数据(或状态)。但是,因为 Cassandra 是一个数据库,所以我们可以使用Stateful Sets和Persistent Volume来确保数据库的容灾能力。

### 2.创建本地卷

要创建持久 Cassandra 节点,需要配备Persistent Volume (PV)。可通过两种方式配备PV:**动态和静态**

出于简单性和兼容性,我们将使用**静态**配备功能,使用所提供的 yaml 文件手动创建卷。

_备注:您将需要与 Cassandra 节点数量相同的持久卷。如果您希望有 3 个 Cassandra 节点,则需要创建 3 个PV。_

提供的 [local-volumes.yaml](local-volumes.yaml) 文件已定义了 **3** 个持久卷。如果您希望拥有 3 个以上的 Cassandra 节点,可以更新该文件来添加更多卷。创建这些卷:

```shell
$ kubectl create -f local-volumes.yaml
$ kubectl get pv
NAME CAPACITY ACCESSMODES RECLAIMPOLICY STATUS CLAIM STORAGECLASS REASON AGE
cassandra-data-1 1Gi RWO Recycle Available 7s
cassandra-data-2 1Gi RWO Recycle Available 7s
cassandra-data-3 1Gi RWO Recycle Available 7s
```

### 3.创建一个 StatefulSet

[StatefulSet](cassandra-statefulset.yaml) 负责创建 Pod。它提供有序部署、有序终止和唯一网络名称。运行以下命令来启动一个 Cassandra 服务器:

```shell
$ kubectl create -f cassandra-statefulset.yaml
```
### 4.验证 StatefulSet

可以使用以下命令检查您的 StatefulSet 是否已部署。

```shell
$ kubectl get statefulsets
NAME DESIRED CURRENT AGE
cassandra 1 1 2h
```

如果查看 Pod 列表,您会看到 1 个 Pod 正在运行。您的 Pod 名称应该是 cassandra-0,后续 Pod 将按照序数编号(*cassandra-1、cassandra-2、……*)进行命名使用此命令查看 StatefulSet 创建的 Pod:

```shell
$ kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
cassandra-0 1/1 Running 0 1m 172.xxx.xxx.xxx 169.xxx.xxx.xxx
```

要检查 Cassandra 节点是否启动,可以执行 **nodetool status:**

```shell
$ kubectl exec -ti cassandra-0 -- nodetool status
Datacenter: DC1
===============
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
-- Address Load Tokens Owns (effective) Host ID Rack
UN 172.xxx.xxx.xxx 109.28 KB 256 100.0% 6402e90d-7995-4ee1-bb9c-36097eb2c9ec Rack1
```
### 5.扩展 StatefulSet

要扩大或缩小 StatefulSet 的大小,可以使用 scale 命令:

```shell
$ kubectl scale --replicas=3 statefulset/cassandra
```

等待一两分钟,检查命令是否有效:

```shell
$ kubectl get statefulsets
NAME DESIRED CURRENT AGE
cassandra 3 3 2h
```

如果观察 Cassandra Pod 的部署,就会发现它们是按顺序创建的。

可以再次查看 Pod 列表,确认您的 Pod 在正常运行。

```shell
$ kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
cassandra-0 1/1 Running 0 13m 172.xxx.xxx.xxx 169.xxx.xxx.xxx
cassandra-1 1/1 Running 0 38m 172.xxx.xxx.xxx 169.xxx.xxx.xxx
cassandra-2 1/1 Running 0 38m 172.xxx.xxx.xxx 169.xxx.xxx.xxx
```

可以执行 **nodetool status** 来检查是否有其他 Cassandra 节点加入并形成了一个 Cassandra 集群。

_**备注:**Cassandra 数据库完成设置可能会花大约 5 分钟的时间。_

```shell
$ kubectl exec -ti cassandra-0 -- nodetool status
Datacenter: DC1
===============
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
-- Address Load Tokens Owns (effective) Host ID Rack
UN 172.xxx.xxx.xxx 103.25 KiB 256 68.7% 633ae787-3080-40e8-83cc-d31b62f53582 Rack1
UN 172.xxx.xxx.xxx 108.62 KiB 256 63.5% e95fc385-826e-47f5-a46b-f375532607a3 Rack1
UN 172.xxx.xxx.xxx 177.38 KiB 256 67.8% 66bd8253-3c58-4be4-83ad-3e1c3b334dfd Rack1
```

_需要等到节点的状态变为 Up and Normal (UN),才能执行后续步骤中的命令。_

### 6.使用 CQL

可以使用以下命令访问 Cassandra 容器:

```shell
kubectl exec -it cassandra-0 cqlsh
Connected to Cassandra at 127.0.0.1:9042.
[cqlsh 5.0.1 | Cassandra 3.11.1 | CQL spec 3.4.4 | Native protocol v4]
Use HELP for help.
cqlsh> describe tables

Keyspace system_traces
----------------------
events sessions

Keyspace system_schema
----------------------
tables triggers views keyspaces dropped_columns
functions aggregates indexes types columns

Keyspace system_auth
--------------------
resource_role_permissons_index role_permissions role_members roles

Keyspace system
---------------
available_ranges peers batchlog transferred_ranges
batches compaction_history size_estimates hints
prepared_statements sstable_activity built_views
"IndexInfo" peer_events range_xfers
views_builds_in_progress paxos local

Keyspace system_distributed
---------------------------
repair_history view_build_status parent_repair_history

```

## 故障排除

* 如果您的 Cassandra 实例未正确运行,可以使用以下命令来检查日志
* `kubectl logs <your-pod-name>`
* 要清理/删除持久卷上的数据,可以使用以下命令来删除 PVC
* `kubectl delete pvc -l app=cassandra`
* 如果您的 Cassandra 节点未加入,可以删除您的控制器/statefulset,然后删除您的 Cassandra 服务。
* 如果您创建了 Cassandra StatefulSet,则使用 `kubectl delete statefulset cassandra`
* `kubectl delete svc cassandra`
* 删除所有信息:
* `kubectl delete statefulset,pvc,pv,svc -l app=cassandra`

## 参考资料
* 这个 Cassandra 示例基于 Kubernete 的[使用 Kubernetes 的云原生 Cassandra 部署](https://github.com/kubernetes/kubernetes/tree/master/examples/storage/cassandra)

# 隐私声明

可以配置包含这个包的样本 Kubernetes Yaml 文件来跟踪对 [IBM Cloud](https://www.bluemix.net/) 和其他 Kubernetes 平台的部署。每次部署时,都会将以下信息发送到 [Deployment Tracker](https://github.com/IBM/metrics-collector-service) 服务:

* Kubernetes 集群提供者(`IBM Cloud、Minikube 等`
* Kubernetes 机器 ID
* Kubernetes 集群 ID(仅来自 IBM Cloud 的集群)
* Kubernetes 客户 ID(仅来自 IBM Cloud 的集群)
* 这个 Kubernetes 作业中的环境变量。

此数据收集自样本应用程序的 yaml 文件中的 Kubernetes 作业。IBM 使用此数据来跟踪与将样本应用程序部署到 IBM Cloud 相关的指标,以度量我们的示例的实用性,让我们可以持续改进为您提供的内容。仅跟踪包含对 Deployment Tracker 服务执行 ping 操作的代码的样本应用程序的部署过程。

## 禁用部署跟踪

请注释掉/删除 'cassandra-service.yaml' 文件末尾的 Metric Kubernetes Job 部分。

0 comments on commit 0a4f449

Please sign in to comment.