文章编号:11340时间:2024-09-30人气:
在当今瞬息万变的数字时代,确保大型集群的高可用性至关重要。高可用性意味着系统即使出现故障也能保持正常运行,从而保障业务连续性和客户满意度。本文将深入探讨大型集群的高可用性策略,包括故障转移、容错性和自动修复。
故障转移机制通常包括以下步骤:
故障检测:系统持续监控节点的健康状况,并检测任何故障。故障通知:一旦检测到故障,系统会向故障转移管理器发送通知。故障转移决策:故障转移管理器评估故障的情况,并决定是否需要进行故障转移。故障转移执行:如果需要进行故障转移,故障转移管理器将启动故障转移过程,将服务转移到备用节点。容错性机制包括以下方面:
数据复制:将数据复制到多个节点上,以确保即使一个或多个节点故障,数据也不会丢失。冗余组件:使用冗余组件,如电源和网络连接,以防止单点故障导致整个系统失效。动态重新配置:当节点发生故障时,系统能够自动重新配置,将服务重新分配到其他可用节点。
自动修复机制包括以下流程:
故障检测和诊断:系统持续监控节点和服务的健康状况,并诊断任何故障。修复措施:根据诊断结果,系统触发自动修复措施,例如重新启动服务或替换故障组件。验证:在修复完成后,系统验证修复操作是否成功,并恢复服务。Oraclerac节点一般情况下是不开放端口的。 原因是Oraclerac是Oracle集群架构,由多个节点组成,节点之间通过专用网络互相通信。 在Oraclerac中,通过共享存储来实现数据的高可用性和故障恢复能力。 对于外部网络来说,Oraclerac节点不直接对外提供服务。 外部访问Oraclerac集群的方式是通过连接到VIP(Virtual IP)或者通过监听器(Listener)来访问数据库服务。 因此,对外开放Oraclerac节点的端口是不必要的,也存在一定的安全风险。 然而,有些特定情况下,可能需要开放Oraclerac节点的端口,比如需要进行特定的网络调试、监控或者管理操作。 但是在这种情况下,应该采取严格的安全措施,限制访问的IP范围,使用安全协议进行通信等,以保护Oraclerac集群的安全性。 拓展内容:Oraclerac是一种高可用性和故障恢复能力较强的数据库解决方案。 它采用共享存储和节点间的数据同步来实现数据库的冗余备份和自动故障转移。 通过多个节点的协同工作,Oraclerac可以提供持续的数据库服务,即使在节点故障或者计划维护期间也能保持数据的可用性。 除了提高数据库的可用性外,Oraclerac还能提供更好的性能扩展能力。 通过增加节点,可以提高数据库的并发处理能力和负载均衡能力。 同时,Oraclerac还支持在线扩容和在线升级,可以方便地满足不断增长的业务需求和技术要求。 总之,Oraclerac是一种强大的数据库架构,在企业级应用中被广泛使用。 在配置和管理Oraclerac集群时,需要综合考虑安全性、性能、可用性等因素,合理设置相关的网络访问策略,以确保数据库的稳定运行和数据的安全。
当你部署完 Kubernetes, 即拥有了一个完整的集群。 一个 Kubernetes 集群由一组被称作节点的机器组成。 这些节点上运行 Kubernetes 所管理的容器化应用。 集群具有至少一个工作节点。 工作节点托管作为应用负载的组件的 Pod 。 控制平面管理集群中的工作节点和 Pod 。 为集群提供故障转移和高可用性,这些控制平面一般跨多主机运行,集群跨多个节点运行。 本节概述了交付正常运行的 Kubernetes 集群所需的各种组件。 从上面的构架图可以看出来整个kubernetes集群分为control plane(master)和node节点两部份。 master组件是集群的“脑力”输出者。 它维护有kubernetesr 的所有对象记录,负责持续管理对象状态并响应集群中各种资源对象的管理操作,以及确保各资源对象的实际状态与所需状态相匹配。 主要由API Server(kube-apiserver)、Control Manager(kube-controller-manager)和Scheduler(kube-scheduler)这3个组件。 以及一个用于集群状态存储的etcd存储服务组成。 kube-apiserver API Server是 Kubernetes控制平台的前端。 支持不同类型应用的生命周期编排,包括部署、缩放和滚动更新等。 还是整个集群的网关接口,由kube-apiserver守护程序运行为服务。 通过HTTP/HTTPS协议将RESTful API公开给用户。 是发往集群的所有REST操作命令的接入点,并提供认证、授权、访问控制、API注册和发现等所有的REST请求。 并将结果状态持久存储于集群状态存储系统(etcd)中。 kube-apiserver 支持同时提供 https(默认监听在 6443 端口)和 http API(默认监听在 127.0.0.1 的 8080 端口),其中 http API 是非安全接口,不做任何认证授权机制,不建议生产环境启用。 两个接口提供的 REST API 格式相同kube-controller-manager Control Manager负责实现用户通过API Server提交的终态声明。 它通过一系列操作步骤驱动API对象的当前状态逼近或同于期望状态。 Kubernetes提供了驱动Node、Pod、Server、Endpoint、ServiceAccount和Token等数十种类型的API对象的控制器。 从逻辑上讲,每个控制器都是一个单独的进程, 但是为了降低复杂性,它们都被编译到同一个可执行文件,并在一个进程中运行。 控制器包括:kube-scheduler Scheduler是指为API Server 接收到的每一个pod创建请求,并在集群中为其匹配出一个最佳的工作节点为。 调度决策考虑的因素包括单个 Pod 和 Pod 集合的资源需求、硬件/软件/策略约束、亲和性和反亲和性规范、数据位置、工作负载间的干扰和最后时限等特性。 etcd kubernetes集群的所有状态信息都需要持久存储于存储系统etcd中。 etcd是由CoreOS基于Raft协议开发的分布式键值存储。 可用于服务发现。 共享配置以及一致性保障。 生产环境中应该以etcd集群的方式运行以确保其服务可用性,并需要制周期备份策略以确保数据安全可靠。 etcd还为其存储的数据提供了监听(watch)机制。 用于监视和推送变更,API Server是kubernetes集群中唯一能够与etcd通信的组件。 封装了这种监听机制。 并借此同其他各组件高效协同。 Node组件是集群中的“体力”输出者,因而一个集群通常会有多个Node以提供足够的承载力来运行容器化应用和其他工作负载。 kubelet kubelet是运行于每个node节点之上的“节点代理”服务,负责维护容器的生命周期,同时也负责Volume(CSI)和网络(CNI)的管理;其主要功能概括如下: 持续监听node的健康状态并向master汇报。 基于用户自定义的探针进行存活状态探测,并在任何Pod出现问题时将其重建为新实例。 准备pod所需的数据卷 返回pod的状态 在node节点执行容器的健康检测 Pod是一组容器组成的集合并包含这些容器的管理机制。 安并未额外定义进程的边界或其他更多抽象,因此真正负责运行容器的依然是底层的容器运行时。 kubelet通过CRI(容器运行时接口)可支持多种类型的OCI容器运行时,例如docker、 containerd、CRI-O、runC、fraki和kata Containers等kube-proxy kube-proxy也是需要运行于集群中每个节点之上的服务进程。 它把API Server上的Service资源对象转换为当前节点上的iptables或与ipvs规则。 这些规则能够将那些发往该Service对象ClusterIP的流量分发至它后端的Pod端点上。 kube-proxy是kubernetes的核心网络组件。 它本质上更象是Pod的代理及负载均衡器。 负责确保集群中Node、Service和Pod对象之间的有效通信 。 kube-proxy 不同的版本可支持三种工作模式 UserSpace: kubernetes V1.1之前使用,V1.2及以后就已淘汰 IPtables: Kubernetes 1.1版本开始支持。 1.2开始为默认 IPVS: kubernetes 1.9引入到1.11为正式版本,需要安装ipvadm、ipset工具包和加载ip_vs内核模块。 kubectl 概述 是一个通过命令行对kubernetes集群管理的工具 基于Web的用户接口,用于可视化k8s集群。 dashborad可用于获取集群中资源对象的详细信息,Dashboard提供GUI,作为运维人员,使用kubectl命令行工具管理足矣 CoreDNS负责为整个集群提供DNS服务,它自1.11版本起默认使用CoreDNS,一种灵活,可扩展的DNS服务,之前的版本用到的是kube-dns项目,SkyDNS则是更早一代的解决方案。
集群(cluster)是由一组计算机作为整体向用户提供网络资源的系统,这些计算机被称为节点。 理想的集群让用户不会察觉到其后端的多个计算机,而将集群视为单一系统,管理员可以灵活地增加或删除节点。 集群通过协同工作充分利用计算资源,能将过载任务分配给集群中其他计算机,实现与专用计算机相媲美的处理能力,但成本更低。 集群系统包括硬件(节点、网络、存储)和软件(集群系统、节点系统、应用支撑软件)。 集群技术的核心定义:一组相互独立的服务器在网络中表现为单一系统,协同管理提供高可靠性的服务。 集群中所有计算机共享一个共同名称,集群内任一系统运行的服务被所有网络客户共享。 集群系统能够协调管理各组件的错误和失败,并在集群中透明地加入或移除组件。 集群包含多台服务器,共享数据存储空间。 任何运行应用的服务器上的数据存储在共享空间中,服务器的操作系统和应用文件存储在各自的本地存储上。 集群节点通过内部局域网通信,当节点服务器故障时,应用服务自动在另一节点接管。 集群系统的主要优点包括高可扩展性、高可用性(HA)、高性能和高性价比。 集群系统分为高可用性和性能计算集群。 高可用性集群致力于提供高度可靠的服务,利用集群容错性确保7*24小时不间断服务,如文件服务器、数据库服务。 负载均衡集群则通过将任务平均分配到集群中不同的计算机,提高任务处理效率,实现高性能。 实际应用中,高可用性和负载均衡功能可能结合使用,提供高效稳定服务。 高可用性(HA)是指计算机系统的可靠性(MTTF)与可维护性(MTTR)的度量,可用性定义为MTTF与总时间的百分比。 负载均衡服务器的高可用性通过建立备份服务器实现,主服务器与备份服务器运行HA监控程序,通过“我在线”信息监控对方运行状况。 当备份服务器不能在规定时间内收到信息,接管主服务器服务;当主服务器恢复后,两者系统保持一致,故障恢复自动完成。 HA有三种工作方式:主从方式、双机双工方式和集群工作方式。 主从方式中,一台为主机,另一台为备份机,主机宕机后备份机接管所有工作。 双机双工方式中,两台主机同时运行服务,相互监测,任一台宕机后另一台接管服务。 集群工作方式中,多台主机共同工作,每个主机运行服务,为服务定义备用主机,当主机故障时,服务由其他主机接管。 面对困境,提升当前能力至极致,是解决问题的关键。
所谓的高可用,也叫 HA(High Availability),是分布式系统架构设计中必须考虑的因素之一,它是保证系统SLA的重要指标。 Redis 高可用的主要有三种模式: 主从模式 , 哨兵模式和集群模式 。
Redis 提供了 Redis 提供了复制(replication)功能,当一台 redis 数据库中的数据发生了变化,这个变化会被自动地同步到其他的 redis 机器上去。
Redis 多机器部署时,这些机器节点会被分成两类,一类是主节点(master 节点),一类是从节点(slave 节点)。 一般 主节点可以进行读、写操作 ,而 从节点只能进行读操作 。 一个主节点可以有多个从节点,但是一个从节点只会有一个主节点,也就是所谓的 一主多从结构 。
· 支持主从复制,主机会自动将数据同步到从机,可以进行读写分离;
· Master 是以非阻塞的方式为主 Slaves 提供服务。所以在 Master-Slave 同步期间,客户端仍然可以提交查询或修改请求;
· Slave 同样是以非阻塞的方式完成数据同步。 在同步期间,如果有客户端提交查询请求,Redis 则返回同步之前的数据。
· Redis 不具备自动容错和恢复功能,主机从机的宕机都会导致前端部分读写请求失败,需要等待机器重启或者手动切换前端的 IP 才能恢复;
· 主机宕机,宕机前有部分数据未能及时同步到从机,切换 IP 后面还会引入数据不一致的问题,降低了系统的可用性;
· Redis 较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂;
· Redis 的主节点和从节点中的数据是一样的,降低的内存的可用性
实际生产中,我们优先考虑哨兵模式。 这种模式下,master 宕机,哨兵会自动选举 master 并将其他的 slave 指向新的 master。
在主从模式下,redis 同时提供了哨兵命令redis-sentinel,哨兵是一个独立的进程,作为进程,它会独立运行。 其原理是哨兵进程向所有的 redis 机器人发送命令,等待 Redis 服务器响应,从而监控运行的多个 Redis 实例。 一般为了便于决策选举,使用 奇数个哨兵 。 多个哨兵构成一个哨兵集群,哨兵直接也会相互通信,检查哨兵是否正常运行,同时发现 master 战机哨兵之间会进行决策选举新的 master
哨兵模式的作用:
· 通过发送命令,让 Redis 服务器返回监控其运行状态,包括主服务器和从服务器;
· 然而一个哨兵进程对 Redis 服务器进行监控,也可能会出现问题,为此,我们可以使用多个哨兵进行监控。 各个哨兵之间还会进行监控,这样就形成了多种哨兵模式。
哨兵很像 kafka 集群中的 zookeeper 的功能。
· 哨兵模式是基于主从模式的,所有主从的优点,哨兵模式都具有。
· 主从可以自动切换,系统更健壮,可用性更高。
· 具有主从模式的缺点,每台机器上的数据是一样的,内存的可用性较低。
· Redis 较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。
Redis 集群模式本身没有使用一致性 hash 算法,而是使用 slots 插槽 。
Redis 哨兵模式基本已经可以实现高可用,读写分离 ,但是在这种模式下每台 Redis 服务器都存储相同的数据,很浪费内存,所以在 redis3.0 上加入了 Cluster 集群模式,实现了 Redis 的分布式存储,对数据进行分片,也就是说每台 Redis 节点上存储不同的内容;每个节点都会通过集群总线(cluster bus),与其他的节点进行通信。 通讯时使用特殊的端口号,即对外服务端口号加 。 例如如果某个 node 的端口号是 6379,那么它与其它 nodes 通信的端口号是 。 nodes 之间的通信采用特殊的二进制协议。
对客户端来说,整个 cluster 被看做是一个整体,客户端可以连接任意一个 node 进行操作,就像操作单一 Redis 实例一样, 当客户端操作的时候 key 没有分配到该 node 上时,Redis 会返回转向指令,指向正确的 node,这有点儿像浏览器页面的 302 redirect 跳转。
根据官方推荐,集群部署至少要 3 台以上的 master 节点,最好使用 3 主 3 从六个节点的模式。
在 Redis 的每一个节点上,都有这么两个东西, 一个是插槽(slot),它的的取值范围是:0-, 可以从上面执行的结果看到这 个 slot 在三个 master 上的分布。 还有一个就是 cluster,可以理解为是一个集群管理的插件,类似的哨兵。
当我们的存取的 Key 到达的时候,Redis 会根据 crc16 的算法对计算后得出一个结果,然后把结果和 求余数,这样每个 key 都会对应一个编号在 0- 之间的哈希槽,通过这个值,去找到对应的插槽所对应的节点,然后直接自动跳转到这个对应的节点上进行存取操作。
为了保证高可用, redis-cluster 集群引入了主从模式 ,一个主节点对应一个或者多个从节点。 当其它主节点 ping 主节点 master 1 时,如果半数以上的主节点与 master 1 通信超时,那么认为 master 1 宕机了,就会启用 master 1 的从节点 slave 1,将 slave 1 变成主节点继续提供服务。
如果 master 1 和它的从节点 slave 1 都宕机了,整个集群就会进入 fail 状态,因为集群的 slot 映射不完整。 如果集群超过半数以上的 master 挂掉,无论是否有 slave,集群都会进入 fail 状态。
redis-cluster 采用去中心化的思想 ,没有中心节点的说法,客户端与 Redis 节点直连,不需要中间代理层,客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可。
对 redis 集群的扩容就是向集群中添加机器,缩容就是从集群中删除机器,并重新将 个 slots 分配到集群中的节点上(数据迁移)。
扩缩容也是使用集群管理工具 。
扩容时,先使用 add-node将新的机器加到集群中,这是新机器虽然已经在集群中了,但是没有分配 slots,依然是不起做用的。 在使用 reshard进行分片重哈希(数据迁移),将旧节点上的 slots 分配到新节点上后,新节点才能起作用。
缩容时,先要使用 reshard移除的机器上的 slots,然后使用 add-del移除机器。
采用去中心化思想,数据按照 slot 存储分布在多个节点,节点间数据共享,可动态调整数据分布;
可扩展性:可线性扩展到 1000 多个节点,节点可动态添加或删除;
高可用性:部分节点不可用时,集群仍可用。通过增加 Slave 做 standby 数据副本,能够实现故障自动 failover,节点之间通过 gossip 协议交换状态信息,用投票机制完成 Slave 到 Master 的角色提升;
降低运维成本,提高系统的扩展性和可用性。
Cluster 是无中心节点的集群架构,依靠 Goss 协议(谣言传播)协同自动化修复集群的状态。 但 GosSIp 有消息延时和消息冗余的问题,在集群节点数量过多的时候,节点之间需要不断进行 PING/PANG 通讯,不必须要的流量占用了大量的网络资源。 虽然 Reds4.0 对此进行了优化,但这个问题仍然存在。
2.数据迁移问题
Redis Cluster 可以进行节点的动态扩容缩容,这一过程,在目前实现中,还处于半自动状态,需要人工介入。 在扩缩容的时候,需要进行数据迁移。
而 Redis 为了保证迁移的一致性,迁移所有操作都是同步操作 ,执行迁移时,两端的 Redis 均会进入时长不等的阻塞状态,对于小 Key,该时间可以忽略不计,但如果一旦 Key 的内存使用过大,严重的时候会接触发集群内的故障转移,造成不必要的切换。
主从模式:master 节点挂掉后,需要手动指定新的 master,可用性不高,基本不用。
哨兵模式:master 节点挂掉后,哨兵进程会主动选举新的 master,可用性高,但是每个节点存储的数据是一样的,浪费内存空间。 数据量不是很多,集群规模不是很大,需要自动容错容灾的时候使用。
集群模式:数据量比较大,QPS 要求较高的时候使用。 Redis Cluster 是 Redis 3.0 以后才正式推出,时间较晚,目前能证明在大规模生产环境下成功的案例还不是很多,需要时间检验。
配置区别的话,高可用集群的配置对于CPU和内部软件的性能要求更高,更注重它的散热性与持续性。 集群(一组协同工作的计算机)是充分利用计算资源的一个重要概念,因为它能够将工作负载从一个超载的系统(或节点)迁移到集群中的另一个系统上。 其处理能力是与专用计算机(小型机,大型机)可相比,但其性价比高于专用计算机.常见的硬件有:结点,网络,存储.软件有:机群系统,节点系统,应用支撑软件。 高可用(High Availability)集群,简称HA集群。 这类集群致力于提供高度可靠的服务。 就是利用集群系统的容错性对外提供7*24小时不间断的服务,如高可用的文件服务器、数据库服务等关键应用。
内容声明:
1、本站收录的内容来源于大数据收集,版权归原网站所有!
2、本站收录的内容若侵害到您的利益,请联系我们进行删除处理!
3、本站不接受违法信息,如您发现违法内容,请联系我们进行举报处理!
4、本文地址:http://www.jujiwang.com/article/782e474d03ce78251c55.html,复制请保留版权链接!
简介多项式回归是一种机器学习算法,用于拟合基于多项式函数的数据,它是一种强大的工具,可用于对各种现象进行建模,例如增长模式、趋势和周期,流行的多项式回归方法,如polyfit,存在一些局限性,这些方法通常容易过拟合,并且可能对噪声数据敏感,它们只能拟合低阶多项式,这限制了它们的适用性,为了克服这些限制,本文将探讨多项式回归的替代方法和...。
本站公告 2024-09-29 19:15:02
黑洞黑洞是时空中的一个区域,它具有如此强大的引力,以至于任何东西,甚至光,都不能逃逸,黑洞是由恒星核心的重力坍缩形成的,当恒星耗尽核燃料时,它会开始坍缩,如果恒星足够大,它的引力将变得如此强大,以至于它会形成一个黑洞,黑洞的视界是黑洞周围的一个边界,一旦穿过它,就再也没有逃脱的可能,任何穿过视界的东西都将不断地向黑洞中心下落,直到它被...。
互联网资讯 2024-09-27 08:14:53
ECShop是一个功能强大的电子商务解决方案,致力于为企业提供全面且用户友好的在线购物体验,作为行业领先的平台,ECShop已赋能无数企业,帮助他们在线销售产品和服务,并建立成功且可持续的业务,ECShop的优势易于使用,ECShop的用户界面直观且易于导航,即使是电子商务初学者也能轻松上手,全面的功能,ECShop提供全面的功能套件...。
互联网资讯 2024-09-27 04:03:17
概述服务器推送是一种网络技术,允许服务器在不等待客户端请求的情况下主动向客户端发送数据,这意味着服务器可以将网站或应用程序的更新、新事件或实时数据直接发送给客户端,而无需客户端发起请求,服务器推送的优点服务器推送提供了许多优点,包括,减少延迟,通过主动推送数据,服务器可以消除客户端请求数据的延迟,从而减少页面加载时间和提升整体响应速度...。
技术教程 2024-09-16 14:48:07
引言本指南旨在为有兴趣构建自己的JavaWeb应用程序的个人提供一个全面且易于理解的介绍,我们将涵盖从设置开发环境到部署应用程序的每个步骤,第1步,设置开发环境1.1安装JavaJDK你需要在你的系统上安装Java开发工具包,JDK,请访问[Oracle网站],https,www.oracle.com,java,technolo...。
互联网资讯 2024-09-16 10:40:51
对象导向编程,OOP,是一种强大的编程范式,可用于构建可扩展、可维护和可重用的代码,OOP的核心概念包括封装、继承和多态性,这些概念使您能够创建可轻松维护和扩展的应用程序,OOP的核心概念封装封装是将数据和方法组合到称为对象的单个单元中的过程,这允许您隐藏对象的内部实现细节,只向外部世界公开您希望它们知道的接口,封装有助于提高代码的可...。
互联网资讯 2024-09-11 02:17:42
Java是一种功能强大的编程语言,可用于创建各种应用程序,包括计算器,通过利用Java的可定制性,您可以创建满足特定需求的定制计算器,例如科学或财务计算,科学计算器科学计算器是需要执行复杂数学运算的个人的理想选择,使用Java,您可以创建具有以下功能的自定义科学计算器,三角函数,正弦、余弦、正切等,对数和指数函数统计函数,平均值、中位...。
技术教程 2024-09-10 23:10:24
简介对象导向编程,OOP,是计算机编程中的一种范式,它通过使用对象、类和继承等概念来组织代码,在VB中,OOP的实现称为vbs对象,本文将探索vbs对象的强大功能,包括可重用性、封装和继承,可重用性vbs对象的一个主要优点是其可重用性,创建一个对象后,可以将其多次用于不同的项目和应用程序,这可以节省大量时间和精力,并确保代码的连贯性,...。
最新资讯 2024-09-09 03:38:09
前言欢迎来到Java电子书教程!本教程旨在为初学者提供一个简洁明了的Java编程基础入门指南,通过循序渐进的教程和大量的示例代码,您将快速掌握Java的基本概念和语法结构,第1章,Java基础什么是Java,Java的特点Java应用程序结构基本数据类型变量和操作符第2章,控制流程条件语句,if,else、switch,case,循环...。
本站公告 2024-09-07 19:13:06
在数据分析中,数据的质量至关重要,混乱或不完整的数据会导致分析结果不准确,并可能误导决策,replace,函数是一个有用的工具,可用于处理混乱数据并提高数据质量,replace,函数的用法replace,函数的语法如下,replace,string,pattern,replacement,string,要替换的字符串,patte...。
互联网资讯 2024-09-07 18:54:59
简介网页标题是用户在浏览器选项卡和搜索结果中看到的文本,它不仅重要用户体验,也有助于搜索引擎优化,SEO,动态标题可以根据页面内容、用户位置或其他因素而变化,从而为用户提供更相关和引人入胜的体验,通过使用HTML源代码中的简单技巧,您可以轻松创建动态标题,使用document.title属性document.title属性可用于设置...。
最新资讯 2024-09-07 04:04:24
注意,以下内容可能引起不适或恐惧感,胆小者请谨慎阅读,西湖断桥,断桥怨魂杭州西湖的断桥上,相传着一位名叫白素贞的蛇妖与书生许仙的凄美爱情故事,但传说中,白素贞在断桥上被法海镇压,留下了一抹怨气,据说,每到深夜,断桥上便会传来白素贞的哀怨哭声,令人毛骨悚然,北京朝阳门,鬼门关北京朝阳门外的京杭大运河边,有一个地方叫鬼门关,传说,这里曾是...。
互联网资讯 2024-09-04 01:03:13