为了账号安全,请及时绑定邮箱和手机立即绑定

分布式集群学习入门指南

标签:
杂七杂八
概述

分布式集群是一种通过多台计算机协同工作的系统架构,能够充分利用多节点的计算资源,提高系统的整体性能、可靠性和可扩展性。本文将详细介绍分布式集群的优势、应用场景、组成部分以及如何进行安装、配置、管理和监控,帮助读者全面了解分布式集群的相关知识和实践技巧。文中还涵盖了分布式集群学习的关键概念和优化方法。

分布式集群简介

分布式集群是一种通过多台计算机协同工作的系统架构。它将任务分解为多个子任务,分配给不同节点并行处理,然后将结果汇集起来,最终得到一个完整的解决方案。这种架构的优点在于它能够充分利用多节点的计算资源,增强系统的整体性能、可靠性和可扩展性。

分布式集群的优势与应用场景

  • 高可用性:通过冗余部署,一个节点故障不会导致整个系统崩溃。例如,可以配置主节点和多个从节点,主节点出现故障时,其中一个从节点可以迅速接管主节点的角色。
  • 负载均衡:将工作任务分散到多个节点上,可以有效减少单节点的负载,提高系统的整体响应速度。例如,使用负载均衡器将请求分发到不同的后端服务器。
  • 高可扩展性:新增节点可以轻松加入集群,从而提高系统的处理能力。例如,可以通过增加更多的服务器来应对日益增长的流量需求。
  • 数据一致性:分布式系统通过分布式一致性算法确保数据在多个节点之间的一致性,保证数据的安全和稳定。例如,使用Paxos或Raft算法来保证数据的一致性。

分布式集群的组成部分

分布式集群主要包括以下组件:

  • 节点:节点是集群中的基本单位,可以是物理服务器或虚拟机。每个节点负责执行一部分任务。
  • 负载均衡器:用于将请求均匀地分发到各个节点上,确保每个节点的负载均衡。
  • 存储系统:负责数据的存储和管理,包括分布式文件系统、数据库等。例如,Hadoop的HDFS(Hadoop Distributed File System)或MySQL集群。
  • 通信协议:节点之间通过特定的协议进行通信和数据交换,常见的包括TCP/IP、HTTP等。
  • 分布式协调服务:用于协调节点间的操作,如Zookeeper、Consul或Etcd等。
  • 监控工具:用于监控集群的状态,包括性能指标、资源使用情况等,如Prometheus和Grafana。
  • 日志管理:收集和管理集群节点的日志信息,便于故障排查和性能分析。
  • 资源管理器:如YARN或Kubernetes,用于管理和调度集群中的资源,使其得到高效利用。

示例代码

以下是一个简单的Python代码示例,演示了如何使用多进程来模拟分布式集群中的任务分配:

import multiprocessing

def worker(num):
    """每个进程执行的任务"""
    print(f'Worker {num} is running on process {multiprocessing.current_process().pid}')

if __name__ == '__main__':
    processes = []
    for i in range(4):  # 创建4个进程
        p = multiprocessing.Process(target=worker, args=(i,))
        p.start()
        processes.append(p)

    for p in processes:
        p.join()  # 等待所有进程完成

通过以上代码,可以模拟分布式集群的结构和行为,每个进程代表一个节点,共同完成任务。

分布式集群架构

分布式集群的架构设计对于集群的性能、可扩展性和可用性至关重要。常见的分布式集群架构类型有多种,每种架构都有其特定的应用场景和优势。

常见的分布式集群架构类型

  1. 主从架构(Master-Slave)

    • 定义:主从架构是指集群中有一个或多个主节点(Master),其他节点是从节点(Slave)。主节点负责进行数据写操作,从节点则进行数据读操作。主从架构适用于写操作较少、读操作较多的应用场景。
    • 优势:提高了读取性能,分离了读写操作。
    • 劣势:单点故障,主节点如果出现故障,整个集群将受到影响。
    • 应用场景:适用于数据库读多写少的应用场景。
    • 示例代码

      from kazoo.client import KazooClient
      
      zk = KazooClient('localhost:2181')
      zk.start()
      zk.create('/path/to/data', b'value')
      zk.stop()
  2. 主主架构(Master-Master)

    • 定义:主主架构意味着集群中的所有节点都是主节点,它们可以执行读写操作。
    • 优势:没有单点故障,提高了可用性。
    • 劣势:数据同步复杂,需要确保所有主节点的数据一致性。
    • 应用场景:适用于写操作频繁的应用场景。
  3. 环形架构(Ring)

    • 定义:环形架构是一种分布式架构,其中各个节点通过网络连接形成环状结构。每个节点只与相邻的两个节点通信。
    • 优势:易于实现和部署。
    • 劣势:拓扑结构固定,难以扩展。
    • 应用场景:适用于需要简单连接和通信的小规模集群。
  4. 星型架构(Star)

    • 定义:星型架构是指一个节点为中心节点,其他节点都直接连接到这个中心节点。
    • 优势:中心节点可以高效地管理所有节点。
    • 劣势:中心节点成为系统性能的瓶颈,单点故障风险。
    • 应用场景:适用于需要中心化管理的应用场景。
  5. 网状架构(Mesh)
    • 定义:网状架构是指每个节点都可以直接与其他节点通信,形成一个复杂的网络结构。
    • 优势:拓扑结构灵活,易于扩展。
    • 劣势:实现和管理复杂。
    • 应用场景:适用于需要高度灵活性和可扩展性的大规模集群。

架构选择与应用场景的关系

选择合适的分布式集群架构需要考虑以下因素:

  • 读写操作比例:主从架构适用于读操作远多于写操作的场景,主主架构适用于写操作频繁的场景。
  • 数据一致性要求:主主架构需要保证数据的一致性,主从架构则相对简单。
  • 系统规模:小规模集群可以使用简单的星型或环形架构,大规模集群则需要复杂的网状架构。
  • 复杂度和成本:网状架构虽然灵活,但实现和管理复杂,成本较高;而星型架构则相对简单且成本较低。
分布式集群的安装与配置

选择合适的分布式集群技术并进行安装和配置是分布式集群部署的第一步。正确选择和配置可以确保集群的稳定运行和高效性能。

选择合适的分布式集群技术

选择合适的分布式集群技术需要综合考虑以下几个因素:

  • 应用场景:根据具体的业务需求选择适合的技术。例如,Hadoop适合大数据处理场景,而Kubernetes适合容器化应用的部署。
  • 技术成熟度:优先选择已广泛使用并经过验证的技术,如Hadoop、Spark、Kubernetes等。
  • 社区支持:选择有活跃社区和强大支持的技术,可以在遇到问题时得到及时的帮助和支持。
  • 成本:考虑技术的开源或商业版本,以及相关的硬件和运维成本。

安装分布式集群环境

以Hadoop和Kubernetes为例,以下是安装Hadoop和Kubernetes的基本步骤:

Hadoop安装步骤:

  1. 安装Java环境:Hadoop依赖于Java环境,因此需要先安装Java。

    sudo apt-get update
    sudo apt-get install openjdk-8-jdk
  2. 下载并解压Hadoop

    wget https://downloads.apache.org/hadoop/common/hadoop-3.3.1/hadoop-3.3.1.tar.gz
    tar -xzf hadoop-3.3.1.tar.gz
    mv hadoop-3.3.1 /usr/local/hadoop
  3. 配置环境变量
    编辑~/.bashrc文件,添加以下内容:

    export HADOOP_HOME=/usr/local/hadoop
    export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
  4. 配置Hadoop配置文件
    编辑$HADOOP_HOME/etc/hadoop/hadoop-env.sh,设置Java环境变量。

    export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
  5. 配置核心配置文件
    编辑$HADOOP_HOME/etc/hadoop/core-site.xml,设置Hadoop的核心配置。

    <configuration>
       <property>
           <name>fs.defaultFS</name>
           <value>hdfs://localhost:9000</value>
       </property>
    </configuration>
  6. 配置HDFS配置文件
    编辑$HADOOP_HOME/etc/hadoop/hdfs-site.xml,设置HDFS的存储配置。

    <configuration>
       <property>
           <name>dfs.replication</name>
           <value>3</value>
       </property>
    </configuration>
  7. 格式化HDFS

    hdfs namenode -format
  8. 启动Hadoop集群
    start-dfs.sh
    start-yarn.sh

Kubernetes安装步骤:

  1. 安装Docker

    sudo apt-get update
    sudo apt-get install docker.io
  2. 下载并安装Kubernetes

    curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
    sudo apt-get update && sudo apt-get install -y apt-transport-https
    echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
    sudo apt-get update
    sudo apt-get install -y kubelet kubeadm kubectl
  3. 初始化Kubernetes集群

    kubeadm init --pod-network-cidr=10.244.0.0/16
  4. 安装网络插件

    kubectl apply -f https://docs.projectcalico.org/v3.18/manifests/calico.yaml
  5. 配置kubectl
    mkdir -p $HOME/.kube
    sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    sudo chown $(id -u):$(id -g) $HOME/.kube/config

配置集群参数

配置集群参数是确保集群正常运行的重要步骤。以下是一些常见的配置参数:

  • 节点配置:根据集群的规模和拓扑结构,配置各个节点的角色(如NameNode、DataNode、ResourceManager、NodeManager等)。
  • 网络配置:确保各个节点之间能够正常通信,如配置主机名解析、设置防火墙规则等。
  • 资源管理:配置资源配额、队列策略等,确保资源的合理分配和调度。
  • 日志管理:配置日志级别、日志保存位置等,便于日志查看和故障排查。
  • 安全性配置:配置用户认证、权限管理等,确保集群的安全性。
  • 性能调优:根据集群的实际运行状况,调整各种参数以提高性能。

示例代码:

以下是一个简单的Hadoop配置文件示例,展示了如何配置Hadoop的核心配置和HDFS存储配置:

<!-- core-site.xml -->
<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://localhost:9000</value>
    </property>
</configuration>

<!-- hdfs-site.xml -->
<configuration>
    <property>
        <name>dfs.replication</name>
        <value>3</value>
    </property>
</configuration>

通过以上配置,可以确保Hadoop集群的正常运行和高效性能。

分布式集群的管理与监控

分布式集群的管理与监控是确保集群稳定运行和高效性能的重要环节,主要包括集群节点的管理、性能监控、日志管理、故障排查与维护等方面。

集群节点的管理

节点管理是分布式集群管理的核心任务之一,主要包括以下几个方面:

  • 节点状态监控:定期检查节点的状态,确保节点的正常运行。
  • 节点资源管理:监控节点的资源使用情况,如CPU、内存、磁盘等,确保资源的合理分配。
  • 节点故障处理:当节点出现故障时,及时进行故障隔离和恢复。
  • 节点配置管理:定期更新和配置节点,确保集群的运行环境一致。

示例代码:

以下是一个简单的Python脚本,用于监控Hadoop集群中节点的状态和资源使用情况:

import subprocess

def check_node_status():
    """检查节点状态"""
    cmd = "hdfs dfsadmin -report"
    process = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    stdout, stderr = process.communicate()
    if process.returncode != 0:
        return stderr.decode()
    else:
        return stdout.decode()

def check_resource_usage(node):
    """检查节点的资源使用情况"""
    cmd = f"ssh {node} 'free -m'"
    process = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    stdout, stderr = process.communicate()
    if process.returncode != 0:
        return stderr.decode()
    else:
        return stdout.decode()

if __name__ == '__main__':
    print("Node status:")
    print(check_node_status())
    print("Node resource usage:")
    print(check_resource_usage('node1'))

通过以上脚本,可以监控Hadoop集群中节点的状态和资源使用情况,确保集群的稳定运行。

性能监控与日志管理

性能监控和日志管理是确保集群性能的重要手段,主要包括以下几个方面:

  • 性能监控:通过监控集群的性能指标,如CPU利用率、内存使用率、磁盘I/O等,及时发现性能瓶颈。
  • 日志管理:收集和管理集群节点的日志信息,便于故障排查和性能分析。

示例代码:

以下是一个简单的Python脚本,用于监控Hadoop集群的性能指标和收集日志:

import subprocess
import time

def monitor_performance():
    """监控性能指标"""
    while True:
        cmd = "hadoop dfsadmin -report"
        process = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        stdout, stderr = process.communicate()
        if process.returncode != 0:
            print("Error:", stderr.decode())
        else:
            print("Performance report:", stdout.decode())
        time.sleep(60)

def collect_logs(node):
    """收集日志"""
    cmd = f"ssh {node} 'cat /path/to/logfile'"
    process = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    stdout, stderr = process.communicate()
    if process.returncode != 0:
        print("Error:", stderr.decode())
    else:
        print("Log content:", stdout.decode())

if __name__ == '__main__':
    monitor_performance()
    collect_logs('node1')

通过以上脚本,可以监控Hadoop集群的性能指标并收集日志,便于故障排查和性能分析。

故障排查与维护

故障排查与维护是确保集群长期稳定运行的重要任务,主要包括以下几个方面:

  • 故障隔离:当某个节点出现故障时,及时将故障节点隔离,避免影响其他节点的正常运行。
  • 故障恢复:通过备份恢复、重新启动等方式恢复故障节点,确保集群的完整性。
  • 定期维护:定期进行硬件检查、软件升级等维护工作,确保集群的稳定运行。

示例代码:

以下是一个简单的Python脚本,用于隔离和恢复故障节点:

import subprocess

def isolate_faulty_node(node):
    """隔离故障节点"""
    cmd = f"ssh {node} 'shutdown -h now'"
    subprocess.run(cmd, shell=True, check=True)
    print(f"Node {node} is isolated.")

def recover_faulty_node(node):
    """恢复故障节点"""
    cmd = f"ssh {node} 'reboot'"
    subprocess.run(cmd, shell=True, check=True)
    print(f"Node {node} is being recovered.")

if __name__ == '__main__':
    isolate_faulty_node('node1')
    recover_faulty_node('node1')

通过以上脚本,可以隔离和恢复故障节点,确保集群的稳定运行。

分布式集群的应用实例

分布式集群的应用实例可以帮助我们更好地理解分布式集群的实际应用场景和技术实现。以下是一些实际案例和常见问题的解决方法。

实际案例分析

示例一:Hadoop在大数据处理中的应用

Hadoop是一个广泛使用的分布式计算框架,主要用于处理大规模数据集。以下是一个简单的Hadoop应用案例,演示了如何使用Hadoop进行日志分析。

  1. 数据收集:将日志文件从各个节点收集到HDFS中。
  2. 数据处理:使用MapReduce任务对收集到的日志文件进行解析和统计。
  3. 结果输出:将处理结果输出到HDFS或本地文件系统中。

示例代码:

from mrjob.job import MRJob
from mrjob.step import MRStep

class LogAnalyzer(MRJob):

    def mapper(self, _, line):
        # 解析日志行
        parts = line.split()
        ip = parts[0]
        yield ip, 1

    def reducer(self, ip, counts):
        # 统计每个IP的访问次数
        yield ip, sum(counts)

if __name__ == '__main__':
    LogAnalyzer.run()

示例二:Kubernetes在微服务中的应用

Kubernetes是一个开源的容器编排工具,适用于微服务架构的应用部署。以下是一个简单的Kubernetes应用案例,演示了如何使用Kubernetes部署一个Web应用。

  1. 定义Docker镜像:编写Dockerfile,构建Docker镜像。
  2. 部署Kubernetes资源:使用Kubernetes的Deployment和Service资源部署Web应用。
  3. 访问应用:通过Kubernetes的Service访问部署的应用。

示例代码:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: webapp
spec:
  replicas: 3
  selector:
    matchLabels:
      app: webapp
  template:
    metadata:
      labels:
        app: webapp
    spec:
      containers:
      - name: webapp
        image: mywebapp:latest
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: webapp-service
spec:
  selector:
    app: webapp
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
  type: LoadBalancer

常见问题与解决方法

问题一:节点间通信失败

当节点之间无法通信时,可能是网络配置或防火墙设置问题。可以通过以下步骤进行排查:

  1. 检查网络配置:确保各个节点之间的网络连接畅通。
  2. 检查防火墙规则:确保防火墙允许必要的端口通信。
  3. 检查配置文件:确保配置文件中的IP地址和端口设置正确。

示例代码:

# 检查网络连接
ping node1

# 检查防火墙规则
sudo iptables -L

问题二:数据一致性问题

数据一致性问题可能出现在分布式系统中,可以通过以下方法解决:

  1. 使用分布式一致性算法:如Paxos或Raft算法,确保数据在多个节点之间的一致性。
  2. 定期同步数据:定期进行数据同步,确保数据的一致性。
  3. 使用分布式协调服务:如Zookeeper或Etcd,确保数据的一致性。

示例代码:

import kazoo.client

zk = kazoo.client.KazooClient('localhost:2181')
zk.start()
zk.create('/path/to/data', b'value')
zk.stop()

问题三:性能瓶颈

性能瓶颈可能出现在网络、磁盘或内存等资源上,可以通过以下方法解决:

  1. 增加资源:增加CPU、内存或磁盘等资源,提高系统的性能。
  2. 优化算法:优化数据处理算法,减少资源消耗。
  3. 使用缓存:使用缓存减少I/O操作,提高性能。

示例代码:

import os
import psutil

def check_resource_usage():
    """检查资源使用情况"""
    cpu_usage = psutil.cpu_percent(interval=1)
    memory_usage = psutil.virtual_memory().percent
    disk_usage = psutil.disk_usage('/').percent
    print(f"CPU usage: {cpu_usage}%")
    print(f"Memory usage: {memory_usage}%")
    print(f"Disk usage: {disk_usage}%")

if __name__ == '__main__':
    check_resource_usage()

实战演练与实践技巧

技巧一:合理规划资源

合理规划资源是确保分布式集群高效运行的关键。可以通过以下方法进行资源规划:

  1. 评估需求:根据实际业务需求评估所需的资源。
  2. 预留资源:预留一定的资源,以应对突发情况。
  3. 动态分配资源:根据实际负载动态分配资源。

示例代码:

import kubernetes.client
from kubernetes.client.rest import ApiException

def update_resources(namespace, name, cpu, memory):
    """更新资源配额"""
    configuration = kubernetes.client.Configuration()
    api = kubernetes.client.CoreV1Api(kubernetes.client.ApiClient(configuration))

    try:
        resource_quota = kubernetes.client.V1ResourceQuota(
            metadata=kubernetes.client.V1ObjectMeta(name=name),
            spec=kubernetes.client.V1ResourceQuotaSpec(
                hard={"cpu": cpu, "memory": memory}
            )
        )
        api.patch_namespaced_resource_quota(name=name, namespace=namespace, body=resource_quota)
    except ApiException as e:
        print("Exception when updating resource quota: %s\n" % e)

if __name__ == '__main__':
    update_resources('default', 'my-quota', '100m', '256Mi')

技巧二:监控与报警

监控与报警是确保集群稳定运行的重要手段。可以通过以下方法进行监控和报警:

  1. 设置报警规则:设置资源使用率、性能指标等报警规则。
  2. 集成监控工具:集成Prometheus、Grafana等监控工具,进行实时监控。
  3. 自动化报警:通过脚本或工具实现自动化报警。

示例代码:

import subprocess

def check_performance():
    """检查性能指标"""
    cmd = "hadoop dfsadmin -report"
    process = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    stdout, stderr = process.communicate()
    if process.returncode != 0:
        print("Error:", stderr.decode())
    else:
        print("Performance report:", stdout.decode())

def send_alarm(message):
    """发送报警信息"""
    print("Alarm:", message)

if __name__ == '__main__':
    check_performance()
    send_alarm("Performance issue detected")

通过以上技巧和实践,可以更好地管理和优化分布式集群,确保其稳定运行和高效性能。

分布式集群的优化与扩展

分布式集群的优化与扩展是提高系统性能和可扩展性的关键环节。通过合理的优化策略和扩展方法,可以充分利用多节点的计算资源,提高系统的整体性能、可靠性和可扩展性。

性能优化策略

性能优化是提高分布式集群性能的重要手段,主要包括以下几个方面:

  • 算法优化:优化数据处理算法,减少资源消耗。
  • 资源管理:合理分配和调度资源,确保资源的高效利用。
  • 负载均衡:通过负载均衡技术,均衡各个节点的负载。
  • 缓存机制:使用缓存减少I/O操作,提高性能。
  • 并行处理:将任务分解为多个子任务,分配给不同节点并行处理。

示例代码:

以下是一个简单的Python脚本,演示了如何使用缓存机制减少I/O操作,提高性能:

import os
import psutil

def check_cache_usage():
    """检查缓存使用情况"""
    disk_usage = psutil.disk_usage('/').percent
    print(f"Disk usage: {disk_usage}%")

    # 使用缓存减少I/O操作
    cache = {}
    for i in range(1000):
        if i in cache:
            print(f"Using cached value for {i}")
        else:
            cache[i] = i * i
            print(f"Calculating value for {i}")

if __name__ == '__main__':
    check_cache_usage()

通过以上脚本,可以使用缓存机制减少I/O操作,提高性能。

扩展集群的方法

扩展集群的方法包括增加节点数量和优化集群架构,具体如下:

  • 增加节点数量:通过增加节点数量来提高集群的处理能力。
  • 优化集群架构:通过优化集群架构,提高集群的性能和可扩展性。
  • 资源管理:通过资源管理器如YARN或Kubernetes,合理分配和调度资源,提高集群的利用率。
  • 负载均衡:通过负载均衡技术,均衡各个节点的负载,提高集群的稳定性和性能。

示例代码:

以下是一个简单的Kubernetes脚本,演示了如何增加一个Pod的数量:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: webapp
spec:
  replicas: 5  # 增加Pod的数量
  selector:
    matchLabels:
      app: webapp
  template:
    metadata:
      labels:
        app: webapp
    spec:
      containers:
      - name: webapp
        image: mywebapp:latest
        ports:
        - containerPort: 80

通过以上脚本,可以增加Pod的数量,提高集群的处理能力。

资源管理与负载均衡

资源管理与负载均衡是提高分布式集群性能和可扩展性的重要手段,主要包括以下几个方面:

  • 资源管理:通过资源管理器如YARN或Kubernetes,合理分配和调度资源,提高集群的利用率。
  • 负载均衡:通过负载均衡技术,均衡各个节点的负载,提高集群的稳定性和性能。
  • 故障隔离:通过故障隔离技术,隔离故障节点,避免影响其他节点的正常运行。

示例代码:

以下是一个简单的Python脚本,演示了如何使用负载均衡技术均衡各个节点的负载:

import os
import psutil

def check_load():
    """检查负载情况"""
    cpu_usage = psutil.cpu_percent(interval=1)
    memory_usage = psutil.virtual_memory().percent
    disk_usage = psutil.disk_usage('/').percent
    print(f"CPU usage: {cpu_usage}%")
    print(f"Memory usage: {memory_usage}%")
    print(f"Disk usage: {disk_usage}%")

def load_balance():
    """均衡负载"""
    # 示例:将任务分配给负载较低的节点
    nodes = ['node1', 'node2', 'node3']
    load = [check_load(node) for node in nodes]
    # 选择负载较低的节点
    lowest_load_node = nodes[load.index(min(load))]
    print(f"Load balancing to {lowest_load_node}")

if __name__ == '__main__':
    load_balance()

通过以上脚本,可以均衡各个节点的负载,提高集群的稳定性和性能。

通过以上优化策略和扩展方法,可以充分利用多节点的计算资源,提高分布式集群的性能、可靠性和可扩展性。

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消