云原生专栏大纲
文章目录
- mysql主从集群部署
- mysql高可用集群
- 高可用互为主从架构
- 互为主从架构
- 如何实现
- 主主复制中若是两台master上同时出现写操作可能会出现的问题
- 该架构是否存在问题?
- heml部署mysql高可用集群
- nacos集群部署
- 官网文档部署nacos
- helm部署nacos
- redis集群部署
- 主从哨兵部署
- redis cluster部署
- 安装reids客户端redisinsight
- zk集群部署
- kafka集群部署
- kafka可视化控制台
- es集群部署
- rocketmq集群部署
- minio集群部署
- SkyWalking部署
- 使用 Docker Helm 存储库 (>= 4.3.0) 安装已发布的版本
- 使用 master 分支安装 SkyWalking 的开发版本
- MongoDB部署
该章节主要讲述helm安装研发常用环境,目前很多厂商都提供组件的helm安装支持,使用helm能大大降低部署难度。
mysql主从集群部署
- 添加应用仓库:https://charts.bitnami.com/bitnami
- 搜索mysql部署,配置参考
- 查看部署情况
mysql高可用集群
高可用互为主从架构
互为主从架构
mysql基于主从复制可以实现互为主从,若是两个mysql都对外提供写服务可能出现数据冲突问题。为避免写冲突,master只会有一个对外提供写服务,采用keepalived+mysql实现互为主从架构。
互为主从的架构通常称为主主复制(Master-Master Replication)或双主复制(Dual-Master Replication)。在这种架构中,两个或多个 MySQL 实例充当主服务器,并且彼此互为对方的从服务器。
以下是主主复制的基本工作原理:
- 双向复制:每个主服务器都可以接收写操作,并将这些写操作记录到自己的二进制日志中。同时,它也会将二进制日志事件发送给其他主服务器,以便它们可以复制这些写操作到自己的数据库中。
- 数据同步:每个主服务器都会将其他主服务器发送的二进制日志事件应用到自己的数据库中,从而保持数据的同步。这样,每个主服务器都包含了完整的数据集,并且可以独立地处理读和写操作。
- 冲突解决:在主主复制中,由于每个主服务器都可以接收写操作,可能会发生冲突。例如,如果两个主服务器同时接收到对同一行数据的更新操作,那么就会发生冲突。解决冲突的方法可以通过配置冲突检测和解决策略,例如使用时间戳或自定义逻辑来确定哪个写操作应该优先。
主主复制的优点包括:
- 冗余备份:每个主服务器都具有完整的数据集,可以作为其他主服务器的冗余备份,提供高可用性和数据冗余。
- 读写负载均衡:由于每个主服务器都可以处理读和写操作,可以将读操作分发到不同的主服务器,实现读写负载均衡,提高系统的性能和扩展性。
- 故障切换:如果一个主服务器发生故障,可以将应用程序的写操作切换到其他主服务器,从而实现故障切换,减少停机时间。
但是,主主复制也有一些注意事项和限制:
- 冲突处理:需要仔细处理冲突,确保数据的一致性。冲突的解决策略需要根据具体的应用程序需求进行配置。
- 网络延迟:由于主服务器之间需要相互复制数据,网络延迟可能会对性能产生影响。
- 数据一致性:在主主复制架构中,需要确保应用程序的写操作只发送到其中一个主服务器,以避免数据不一致的情况发生。
总的来说,主主复制架构提供了更高的可用性、冗余备份和读写负载均衡。但是,它也需要仔细的配置和管理,以确保数据的一致性和冲突的解决。
如何实现
在Kubernetes(K8s)中实现Keepalived和MySQL的互为主从架构可以提供高可用性和故障转移的能力。下面是一个基本的步骤概述:
- 创建Kubernetes集群:首先,您需要创建一个Kubernetes集群,确保有足够的节点和资源来部署Keepalived和MySQL实例。
- 部署Keepalived:使用Kubernetes的Deployment或StatefulSet对象,部署Keepalived实例。Keepalived是一个开源的高可用性解决方案,可以用于实现虚拟IP(VIP)的故障转移和健康检查。您可以配置两个Keepalived实例,一个作为主节点,另一个作为备份节点。
- 配置Keepalived:在Keepalived配置中,指定VIP和健康检查的目标。Keepalived将定期检查MySQL实例的健康状态,并在主节点故障时将VIP转移到备份节点。
- 部署MySQL实例:使用Kubernetes的Deployment或StatefulSet对象,部署两个MySQL实例,一个作为主服务器,另一个作为从服务器。在配置MySQL实例时,确保主服务器和从服务器的复制配置正确,并且它们能够连接到正确的数据库。
- 配置MySQL主从复制:在MySQL实例中,配置主服务器和从服务器之间的主从复制关系。确保主服务器和从服务器之间的网络连接正常,并且复制配置正确。这样,主服务器上的写操作将被异步地复制到从服务器上,实现数据的复制和同步。
- 测试和监控:完成部署后,进行测试以确保Keepalived和MySQL实例的故障转移和复制功能正常工作。监控Keepalived和MySQL实例的健康状态,并及时处理任何故障或问题。
主主复制中若是两台master上同时出现写操作可能会出现的问题
在主主复制中,如果两台主服务器同时接收到对同一行数据的写操作,可能会出现以下问题:
- 冲突数据:由于两台主服务器同时接收到写操作,它们可能会在同一行数据上进行不同的修改,导致数据冲突。这可能会导致数据不一致的情况发生,因为每个主服务器都会复制自己接收到的写操作到其他主服务器。
- 数据丢失:如果两台主服务器同时进行写操作,而没有进行冲突检测和解决策略,可能会导致其中一台主服务器的写操作被覆盖或丢失。这可能会导致数据的不完整性或丢失。
- 数据一致性问题:由于两台主服务器之间的数据复制是异步的,复制的延迟可能导致数据在两台主服务器之间不一致。如果一个主服务器上的写操作在另一个主服务器上复制之前被读取,可能会导致读取到不一致的数据。
为了解决这些问题,可以采取以下策略:
- 冲突检测和解决:在主主复制中,需要配置冲突检测和解决策略。这可以通过使用时间戳、自定义逻辑或其他冲突解决算法来确定哪个写操作应该优先。例如,可以使用时间戳来判断哪个写操作更早,然后应用该操作并忽略其他写操作。
- 分区数据:可以将数据按照一定的规则分区,确保同一行数据只在一个主服务器上进行写操作。例如,可以根据数据的某个属性或哈希值将数据分配给不同的主服务器,从而避免冲突。
- 应用程序层面的冲突解决:在应用程序中处理冲突,可以通过在应用程序层面实现乐观锁或悲观锁来避免数据冲突。例如,使用乐观锁机制可以在写操作之前检查数据的版本,并在写操作时进行冲突检测和解决。
该架构是否存在问题?
在Keepalived和MySQL互为主从架构中,当主服务器(Master)宕机并切换到备份服务器(Slave)时,可能会发生事务丢失的问题。这是因为MySQL的主从复制是异步的,主服务器上的事务在复制到从服务器之前可能会丢失。
以下是一些可能导致事务丢失的情况:
- 主服务器宕机期间的未提交事务:如果主服务器在宕机之前有未提交的事务,这些事务将无法被复制到备份服务器,因此会丢失。
- 主从复制延迟:即使主服务器上的事务已经提交,由于网络延迟或复制进程的延迟,从服务器可能无法立即接收到这些事务的复制。在这段延迟期间,如果主服务器宕机,那么这些已提交但尚未复制到从服务器的事务也会丢失。
为了减少事务丢失的风险,可以采取以下措施:
- 使用持久化存储引擎:选择适当的MySQL存储引擎,如InnoDB,它支持事务和持久化存储。这样,即使主服务器宕机,已提交的事务也会在数据库重新启动后恢复。
- 配置同步复制:将MySQL的主从复制配置为同步复制模式,这意味着主服务器上的事务必须在复制到从服务器之前进行确认。这样可以确保在主服务器宕机之前,已提交的事务已经复制到从服务器。
- 使用半同步复制:MySQL提供了半同步复制模式,它在主服务器上接收到事务后会等待至少一个备份服务器确认已接收该事务,然后才会提交。这可以进一步减少事务丢失的风险。
- 定期监控复制状态:实施监控和警报系统来监测主从复制的状态。如果出现复制延迟或错误,可以及时采取措施来解决问题,减少事务丢失的可能性。
需要注意的是,即使采取了上述措施,完全消除事务丢失的风险是很困难的。在高可用性和数据一致性之间需要进行权衡,根据业务需求和数据的重要性来选择适当的复制策略和措施。此外,定期备份数据并测试恢复过程也是重要的,以便在发生事务丢失或其他故障时能够快速恢复数据。
heml部署mysql高可用集群
RadonDB MySQL 是基于 MySQL 的开源、云原生、高可用集群解决方案。通过使用 Raft 协议,RadonDB MySQL 可以快速进行故障转移,且不会丢失任何事务。
参考:
在 Kubernetes 上部署 RadonDB MySQL 集群 | RadonDB 开源社区
https://github.com/radondb/radondb-mysql-kubernetes/blob/main/README_zh.md
在 KubeSphere 上部署 RadonDB MySQL 集群
kubesphere应用商店mysql兼容高可用:
官网部署失败,参考下述文档部署成功
容器化 | 在 Kubernetes 上部署 RadonDB MySQL 集群_helm radondb-CSDN博客
nacos集群部署
官网文档部署nacos
官方部署文档:Kubernetes Nacos 官网部署文档
- 下载官网项目
git clone https://github.com/nacos-group/nacos-k8s.git
- 快速部署
./quick-startup.sh# 脚本内容如下:
# 小编修改了部署namespace为nacos,数据持久化等可查看下载项目文件进行修改
echo "mysql mysql startup"
kubectl create -f ./deploy/mysql/mysql-local.yaml -n nacosecho "nacos quick startup"
kubectl create -f ./deploy/nacos/nacos-quick-start.yaml -n nacos
- 查看部署情况
helm部署nacos
- 添加应用仓库
https://ygqygq2.github.io/charts
https://charts.kubegems.io/kubegemsapp
- 进入项目空间,选择应用仓库
- 在应用仓库中搜索nacos,点击nacos
- 选择nacos版本,点击下一步
- 修改values.yaml
mysql:enabled: true # 是否启用内部mysql,false使用外部需配置externalexternal:mysqlMasterHost: "mysql_master_host"mysqlDatabase: "nacos"mysqlMasterPort: "3306"mysqlMasterUser: "nacos"mysqlMasterPassword: "nacos"mysqlSlaveHost: "mysql_slave_host"mysqlSlavePort: "3306"architecture: replicationauth: # 修改nacosrootPassword: "nacos"database: "nacos"username: "nacos"password: "nacos"replicationUser: "replicator"replicationPassword: "replicator"
- 查看部署情况
- 服务暴露
- 访问测试
redis集群部署
主从哨兵部署
- 添加应用仓库:https://charts.bitnami.com/bitnami
- 搜索redis部署
- values.yaml配置修改,配置参考,常用配置如下:
配置项 | 描述 | 值 |
---|---|---|
architecture | Redis架构。允许的值:standalone或replication | replication |
auth.enabled | 启用密码身份验证 | true |
auth.sentinel | 在哨兵上也启用密码身份验证 | true |
auth.password | Redis密码 | “” |
master.count | ||
master.count | 要部署的 Redis 主实例数(实验性,需要额外配置) | 1 |
replica.replicaCount | 要部署的 Redis 副本数 | 3 |
replica.configuration | Redis副本节点的配置 | “” |
sentinel.enabled | 在 Redis Pod 上使用 Redis Sentinel。 | false |
可视化修改配置,可在右上角点击编辑YAML切换:
- 部署情况
redis cluster部署
Helm(bitnami)部署zookeeper和kafka集群_helm bitnami-CSDN博客
- 添加应用仓库:https://charts.bitnami.com/bitnami
- 搜索redis-cluster
- values.yaml配置修改,配置参考,常用配置如下:
cluster.nodes | 主节点数应始终为 >= 3,否则集群创建将失败 | 6 |
---|---|---|
cluster.replicas | 集群中每个主节点的副本数 | 1 |
cluster.externalAccess.enabled | 启用对 Redis 的访问 | false |
metrics.enabled | 启动边车 prometheus 导出器 | false |
- helm方式部署
# 添加仓库
helm repo add bitnami https://charts.bitnami.com/bitnami
# 安装
helm install -n middleware redis-cluster bitnami/redis-cluster
# 查看密码
kubectl get secret --namespace "middleware" redis-cluster -o jsonpath="{.data.redis-password}" | base64 -d
# 自定义values.yaml,https://github.com/bitnami/charts/blob/main/bitnami/redis-cluster/values.yaml# 使用自定义values.yaml更新已安装redis-cluster
helm upgrade -n middleware -f values.yaml redis-cluster
参考:
在 K8S 中快速部署 Redis Cluster & Redisinsight
https://www.cnblogs.com/hacker-linner/p/15839374.html
Helm 安装 bitnami/redis 集群模式
安装reids客户端redisinsight
镜像:redislabs/redisinsight:1.9.0
容器内部数据路径:/db
使用ks可视化方式安装,不过多介绍
zk集群部署
-
添加应用仓库:https://charts.bitnami.com/bitnami
-
搜索zookeeper部署
-
values.yaml配置修改,配置参考,常用配置如下:
| 名字 | 描述 | 值 |
| — | — | — |
| replicaCount | ZooKeeper 节点数 | 1 |
| auth.client.enabled | 启用 ZooKeeper 客户端-服务器身份验证。它使用 SASL/Digest-MD5 | false | -
查看部署情况
kafka集群部署
- 添加应用仓库:https://charts.bitnami.com/bitnami
- 搜索kafka部署
- values.yaml配置修改,常用配置如下,其他参考配置参考
- helm命令
helm install kafka bitnami/kafka \--namespace kafka --create-namespace \--set global.storageClass=<storageClass-name> \--set kubeVersion=<theKubeVersion> \--set image.tag=3.1.0-debian-10-r22 \--set replicaCount=3 \--set service.type=ClusterIP \--set externalAccess.enabled=true \--set externalAccess.service.type=LoadBalancer \--set externalAccess.service.ports.external=9094 \--set externalAccess.autoDiscovery.enabled=true \--set serviceAccount.create=true \--set rbac.create=true \--set persistence.enabled=true \--set logPersistence.enabled=true \--set metrics.kafka.enabled=false \--set zookeeper.enabled=true \--set zookeeper.persistence.enabled=true \--wait
- –namespace kafka --create-namespace: 安装在 kafka namespace, 如果没有该 ns 就创建;
- global.storageClass= 使用指定的 storageclass
- kubeVersion= 让 bitnami/kafka helm 判断是否满足版本需求,不满足就无法创建
- image.tag=3.1.0-debian-10-r22: 20220219 的最新镜像,使用完整的名字保证尽量减少从互联网 pull 镜像;
- replicaCount=3: kafka 副本数为 3
- service.type=ClusterIP : 创建 kafka service, 用于 k8s 集群内部,所以 ClusterIP 就可以
- –set externalAccess.enabled=true --set externalAccess.service.type=LoadBalancer --set externalAccess.service.ports.external=9094 --set externalAccess.autoDiscovery.enabled=true --set serviceAccount.create=true --set rbac.create=true 创建用于 k8s 集群外访问的 kafka-<0|1|2>-external 服务 (因为前面 kafka 副本数为 3)
- persistence.enabled=true: Kafka 数据持久化,容器中的目录为 /bitnami/kafka
- logPersistence.enabled=true: Kafka 日志持久化,容器中的目录为 /opt/bitnami/kafka/logs
- metrics.kafka.enabled=false 不启用 kafka 的监控 (Kafka 监控收集数据是通过 kafka-exporter 实现的)
- zookeeper.enabled=true: 安装 kafka 需要先安装 zookeeper
- zookeeper.persistence.enabled=true: Zookeeper 日志持久化,容器中的目录为:/bitnami/zookeeper
- –wait: helm 命令会一直等待创建的结果
- Kafka 测试验证
创建kafka-client pod:
kubectl run kafka-client --restart='Never' --image docker.io/bitnami/kafka:3.1.0-debian-10-r22 --namespace kafka --command -- sleep infinity
进入到 kafka-client 中,运行如下命令测试:
kafka-console-producer.sh --broker-list kafka-0.kafka-headless.kafka.svc.cluster.local:9092 --topic test
kafka-console-consumer.sh --bootstrap-server kafka-0.kafka-headless.kafka.svc.cluster.local:9092 --topic test --from-beginningkafka-console-producer.sh --broker-list 10.109.205.245:9094 --topic test
kafka-console-consumer.sh --bootstrap-server 10.109.205.245:9094 --topic test --from-beginning
kafka可视化控制台
组件 | 描述 |
---|---|
Know Streaming | 专注于Kafka运维管控、监控告警、资源治理、多活容灾等核心场景。 Know Streaming github | Know Streaming官网 |
Kafka Manager | Kafka Manager 是 Yahoo 开源的 Kafka 集群管理工具。它提供了一个直观的 Web 界面,用于监控和管理 Kafka 集群。Kafka Manager 可以显示集群的整体状态、主题和分区的详细信息,以及消费者组的偏移量等。您可以使用 Kafka Manager 进行主题和分区的管理、消费者组的监控和管理,以及执行一些集群维护任务。Kafka Manager官网 |
Kafdrop | Kafdrop 是一个开源的 Kafka 可视化工具,提供了一个简单易用的 Web 界面来监控 Kafka 集群。Kafdrop 可以显示 Kafka 集群中的主题、分区和消费者组的信息,并提供了实时的消息流量监控。它还支持查看消息的详细内容和偏移量的管理。Kafdrop官网 |
Kafka Map | Kafka Map 是一个开源的 Kafka 可视化工具,它提供了一个交互式的 Web 界面,用于可视化 Kafka 主题和分区之间的消息流。Kafka Map 使用图形化的方式展示了消息在不同分区之间的流动情况,帮助用户更好地理解和分析消息的传输路径。kafka-map官网 |
从功能的专业程度建议使用Know Streaming,关注消息分区流向建议kafka-map,轻量级的 Kafka 可视化工具建议Kafdrop
es集群部署
参考
Download Elasticsearch
Elasticsearch支持哪些插件_检索分析服务 Elasticsearch版(ES)-阿里云帮助中心
Kubernetes Helm3 部署 ElasticSearch & Kibana 7 集群-腾讯云开发者社区-腾讯云
- 添加应用仓库:https://charts.bitnami.com/bitnami
- 搜索elasticsearch部署
- values.yaml配置修改,配置参考
制作安装ik分词器的es可使用上述截图中镜像作为基础镜像(推荐),也可使用plugins参数初始化安装
# 查看elasticsearch安装位置
which elasticsearch# 查看当前已安装的插件
elasticsearch-plugin list# 安装插件
elasticsearch-plugin install {插件名称}# ik分词器地址https://github.com/medcl/elasticsearch-analysis-ik/releases/
# elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v8.12.0/elasticsearch-analysis-ik-8.12.0.zip
在 Elasticsearch 集群中,不同角色承担着不同的职责和功能。下面是关于 Elasticsearch 集群中各个角色的详细介绍:
- Coordinating(协调节点)角色:
- 职责:协调节点是集群中的请求入口点,它接收来自客户端的请求并将其转发到适当的节点。它不存储数据,主要用于处理搜索请求和聚合操作。
- 功能:
- 路由请求:协调节点根据请求的内容将其路由到正确的数据节点,以提高集群的性能和扩展性。
- 整合结果:协调节点将从数据节点接收到的结果进行汇总和整合,然后将结果返回给客户端。
- Data(数据节点)角色:
- 职责:数据节点存储和管理实际的索引数据。
- 功能:
- 数据存储:数据节点负责存储索引数据,并提供对数据的增删改查操作。
- 数据分片:数据节点将索引数据分成多个分片,每个分片可以分布在不同的节点上,以实现数据的分布式存储和处理。
- 数据复制:数据节点可以复制数据分片,以提供高可用性和故障容错性。
- Ingest(数据预处理节点)角色:
- 职责:Ingest 节点用于处理数据的预处理和转换,以便在索引之前进行必要的操作。
- 功能:
- 数据预处理:Ingest 节点可以执行各种数据的提取、转换和加载(ETL)操作,例如数据过滤、转换、标准化等。
- 数据修改:Ingest 节点可以在数据进入索引之前对其进行修改和处理,以满足特定的需求和要求。
- Master(主节点)角色:
- 职责:主节点管理集群的整体状态和配置。
- 功能:
- 集群管理:主节点负责协调集群中的各个节点,执行集群范围的操作,例如创建和删除索引、添加和删除节点等。
- 元数据维护:主节点维护集群的元数据,包括索引的映射、分片分配、节点状态等。
- 集群稳定性:主节点确保集群的稳定性和一致性,协调节点的选举和故障检测等操作由主节点负责。
这些角色在 Elasticsearch 集群中相互协作,共同构建一个高性能、可扩展和可靠的分布式搜索和分析平台。需要注意的是,一个节点可以同时承担多个角色,具体取决于集群的规模和配置。
rocketmq集群部署
参考:Helm 部署 RocketMQ-腾讯云开发者社区-腾讯云
https://github.com/itboon/rocketmq-helm
## 部署高可用集群, 多 Master 多 Slave
## 3个 master 节点,每个 master 具有1个副节点,共6个 broker 节点
helm upgrade --install rocketmq \--namespace rocketmq-demo \--create-namespace \--set broker.size.master="3" \--set broker.size.replica="1" \--set broker.master.jvmMemory="-Xms2g -Xmx2g" \--set broker.master.resources.requests.memory="4Gi" \--set nameserver.replicaCount="3" \--set dashboard.enabled="true" \--set dashboard.ingress.enabled="true" \--set dashboard.ingress.hosts[0].host="rocketmq-ha.example.com" \rocketmq-repo/rocketmq
minio集群部署
- 添加应用仓库:https://charts.bitnami.com/bitnami
- 搜索kafka部署
- values.yaml配置修改,配置参考,常用配置如下:
- helm命令
SkyWalking部署
参考:
https://github.com/apache/skywalking-helm
k8s 部署 skywalking 并将 pod 应用接入链路追踪 - 掘金
https://www.cnblogs.com/lina-2159/p/16190984.html
使用 Docker Helm 存储库 (>= 4.3.0) 安装已发布的版本
helm install "skywalking" \oci://registry-1.docker.io/apache/skywalking-helm \--version "4.3.0" \-n "skywalking" \--set oap.image.tag=9.2.0 \--set oap.storageType=elasticsearch \--set ui.image.tag=9.2.0
使用 master 分支安装 SkyWalking 的开发版本
git clone https://github.com/apache/skywalking-kubernetescd skywalking-kubernetes/chart
helm repo add elastic https://helm.elastic.co
helm dep up skywalking
# 安装
helm install "skywalking" ./skywalking -n "skywalking" -f ./skywalking/values-my-es.yaml# 卸载
helm uninstall skywalking -n skywalking
修改values-my-es.yaml配置是否使用外部es
elasticsearch:enabled: false # 由于使用 外部的 es,所以这里需要设置为 false,因为设置为 true 会在 k8s 中部署 esconfig: # For users of an existing elasticsearch cluster,takes effect when `elasticsearch.enabled` is falsehost: your.elasticsearch.host.or.ipport:http: 9200user: "xxx" # [optional]password: "xxx" # [optional]
MongoDB部署
- 添加应用仓库:https://charts.bitnami.com/bitnami
- 搜索kafka部署
- values.yaml配置修改,配置参考,常用配置如下:
- helm命令
helm 安装 MongoDB 集群
helm pull bitnami/mongodb
tar -xzvf mongodb-14.10.1.tgz
helm -n mongodb install mongodb ./mongodb