通讯节点的选择方法及装置与流程

文档序号:11960248阅读:384来源:国知局
通讯节点的选择方法及装置与流程

本发明涉及通信领域,具体而言,涉及一种通讯节点的选择方法及装置。



背景技术:

随着互联网规模的极速扩大,网站的页面浏览量和访问用户数成线性甚至是指数倍的增加,单服务器单数据库早已不能满足实际需求。目前绝大多数的大型网站的服务器都采用了分布式服务集群的部署方式,所谓集群,就是让一组服务器协同工作,解决大并发、大数据量瓶颈的问题。分布式集群带来的棘手的问题是跨服务器Session(会话)共享的问题,即不同的服务器共享同一个Session数据,实现不同服务器应用同一个Session,为解决该问题,目前业界比较流行的做法是采用容器+高性能分布式缓存数据库,即把本地的Session数据的序列化存储到缓存数据库中实现不同的服务器进行共享,这个方法能很好的解决Session的共享问题。常用的高性能分布式缓存数据库有Zookeeper,Memcached,Redis等。其中Zookeeper是个非常好的分布式缓存数据库,它的本质是一个分布式小文件系统,即当所有的Zookeeper节点全部挂掉,数据也不会丢失,重启服务器之后,数据即可恢复,而且Zookeeper的节点是原子的,更新不是成功便是失败,另外通过选举算法和集群复制还可以避免单点故障。Zookeeper集群主要有三个角色leader(领导者)、follower(跟随者)和observer(观察者),一个集群中会选举一个节点为leader,leader节点接收客户端请求、负责进行投票的发起和决议并与所有的follower和observer进行内部的数据交换;follower节点和observer节点接收客户端连接,并将写请求转发给leader节点向客户端返回结果,其中follower和observer的唯一区别是follower会参与leader的选举,而observer不会。当集群中leader宕机后,Zookeeper进入恢复模式,恢复模式需要重新选举出一个新的leader,让所有的server都恢复到一个正确的状态。在集群的正常运行过程中,客户端连接任一运行正常的角色节点都可以接入集群。由于Zookeeper集群的节点存在着多个,即有多个节点可以接入,导致存在分布式共享Session的客户端接入集群节点的选择问题。

针对相关技术中分布式共享Session的客户端接入集群节点的选择问题,目前尚未提出有效的解决方案。



技术实现要素:

本发明的主要目的在于提供一种通讯节点的选择方法及装置,以至少解决 相关技术中分布式共享Session的客户端接入集群节点的选择问题。

根据本发明的一个方面,提供了一种通讯节点的选择装置,所述装置包括:会话管理模块、数据库通讯模块以及通讯节点选择模块;所述会话管理模块,用于在接收到用户请求的会话处理请求时,调用所述数据库通讯模块获取数据库集群中节点的信息;所述通讯节点选择模块,用于从所述数据库通讯模块中获取所述节点的信息,并依据所述节的点信息通过预定规则从连接池中选择可用连接与所述数据库集群进行通讯,其中,所述连接池用于存储所述装置与所述数据库集群中节点之间的连接。

进一步地,所述通讯节点选择模块通过预定规则选择节点与所述数据库集群进行通讯的方式包括:所述通讯节点选择模块,判断是否有携带指定会话标识的连接;在判断结果为否时,依据预设算法从所述连接池中选择一个可用且未被标识的第一连接与所述数据库集群进行通讯,并为所述第一连接增加所述指定会话标识;在判断结果为是时,选择与所述指定会话标识对应的连接执行与所述数据库集群的通讯。

进一步地,在选择与所述指定会话标识对应的连接执行与所述数据库集群的通讯之后,若与所述指定会话标识对应的连接异常时,所述通讯节点选择模块,还用于依据所述预设算法从所述连接池中重新选择一个可用的第二连接与所述数据库集群进行通讯,并为所述第一连接增加所述指定会话标识。

进一步地,所述预设算法包括:随机分配算法、轮询算法,加权轮询算法以及一致性哈希算法。

进一步地,所述装置还包括:连接池管理模块,用于执行对所述连接池中连接的管理操作,其中,所述管理操作包括:创建连接、增加连接、销毁连接、删除连接以及检测连接状态。

进一步地,所述装置还包括:集群节点加载模块,用于记载所述装置配置的数据库集群的节点值;动态建链模块,用于在所述集群节点加载模块重新加载所述数据库集群配置的实际节点值时,周期性动态更新与所述数据库集群的连接。

进一步地,所述动态建链模块动态更新与所述数据库集群的连接的方式包括:所述动态建链模块,建立所述装置与所述数据库集群节点可用连接数为N/2+1个,其中,所述N为所述数据库集群的节点数;或,建立所述装置与所述数据库集群中的每一个节点的连接;或,在所述数据库集群中只有一个节点时,建立所述装置与所述数据库集群节点可用连接数为1;在所述数据库集群的节点大于或等于2时,建立所述装置与所述数据库集群节点可用连接数为2。

进一步地,所述装置还包括:集群节点配置反写模块,用于周期性检测所述数据库集群配置的实际节点值与所述装置配置的所述数据库集群的节点值的一致性;在检测到不一致时,获取所述数据库集群节点的实际节点值反写如所述装置的配置文件中,并调用所述集群节点加载模块重新加载所述实际节点值。

进一步地,所述装置还包括:连接池定时检测模块,用于周期性检测所述连接池的连接状态以及连接池的连接数是否满足预设数量;在检测到有连接不可用时,触发所述连接池管理模块删除该不可用连接;在检测到连接数不满足预设数量时,触发所述动态建链模块更新所述连接池。

根据本发明的另一个方面,提供了一种应用于上述任一装置中通讯节点的选择方法,所述装置包括:会话管理模块、数据库通讯模块以及通讯节点选择模块,所述方法包括:在接收到用户请求的会话处理请求时,所述会话管理模块调用所述数据库通讯模块获取数据库集群中节点的信息;所述通讯节点选择模块从所述数据库通讯模块中获取所述节点的信息,并依据所述节点的信息通过预定规则从连接池中选择可用连接与所述数据库集群进行通讯,其中,所述连接池用于存储所述装置与所述数据库集群中节点之间的连接。

进一步地,所述通讯节点选择模块通过预定规则选择节点与所述数据库集群进行通讯包括:所述通讯节点选择模块判断是否有携带指定会话标的连接;在判断结果为否时,所述通讯节点选择模块依据预设算法从所述连接池中选择一个可用且未被标识的第一连接与所述数据库集群进行通讯,并为所述第一连接增加所述指定会话标识;在判断结果为是时,所述通讯节点选择模块选择与所述指定会话标识对应的连接执行与所述数据库集群的通讯。

进一步地,在选择与所述指定会话标识对应的连接执行与所述数据库集群的通讯之后,所述方法还包括:若与所述指定会话标识对应的连接异常时,所述通讯节点选择模块依据所述预设算法从所述连接池中重新选择一个可用的第二连接与所述数据库集群进行通讯,并为所述第二连接增加所述指定会话标识。

通过本发明,在接收到用户请求的会话处理请求时,会话管理模块调用数据库通讯模块获取会话在数据库集群中节点的信息,而通讯节点选择模块,用于从数据库通讯模块中获取该节点的信息,并依据节点的信息通过预定规则从连接池中选择可用连接与数据库集群进行通讯;可见,本实施例中通讯节点选择模块通过预定规则选择连接池中可用的连接进行通讯,从而使得请求连接的压力不过分集中在集群的单个节点上,达到集群节点的压力尽量均衡,解决了相关技术中分布式共享Session的客户端接入集群节点的选择问题。

附图说明

此处所说明的附图用来提供对本发明的进一步理解,构成本申请的一部分,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:

图1是根据本发明实施例的通讯节点的选择装置结构框图;

图2是根据本发明实施例的通讯节点的选择装置可选结构框图一;

图3是根据本发明实施例的通讯节点的选择装置可选结构框图二;

图4是根据本发明实施例的通讯节点的选择装置可选结构框图三;

图5是根据本发明实施例的通讯节点的选择装置可选结构框图四;

图6是根据本发明实施例的通讯节点的选择方法的流程图;

图7是根据本发明可选实施例的获取数据库集群服务的容器客户端的结构框图;

图8是根据本发明可选实施例的分布式共享Session存储在容器客户端启动顺序的流程图;

图9是根据本发明可选实施例的分布式共享Session存取的流程图;

图10是根据本发明可选实施例的数据库集群节点配置反写模块工作的流程图。

具体实施方式

需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。下面将参考附图并结合实施例来详细说明本发明。

本实施例提供了一种通讯节点的选择装置,图1是根据本发明实施例的通讯节点的选择装置结构框图,如图1所示,该装置包括:会话管理模块101、数据库通讯模块102以及通讯节点选择模块103;

其中,会话管理模块101,与数据库通讯模块102耦合连接,用于在接收到用户请求的会话处理请求时,调用数据库通讯模块102获取数据库集群中节点的信息;其中,该会话处理请求可以是用于生成、更新或读取会话的请求。

通讯节点选择模块103,与数据库通讯模块102耦合连接,用于从数据库通讯模块102中获取节点的信息,并依据节点的信息通过预定规则从连接池中选择可用连接与数据库集群进行通讯,其中,连接池用于存储装置与数据库集群中节点的连接。

通过本发明实施例装置,在接收到用户请求的会话处理请求时,会话管理模块调用数据库通讯模块获取会话在数据库集群中节点的信息,而通讯节点选择模块,用于从数据库通讯模块中获取该节点的信息,并依据该节点的信息通过预定规则从连接池中选择可用连接与数据库集群进行通讯;可见,本实施例中通讯节点选择模块通过预定规则选择连接池中可用的连接进行通讯,从而使得请求连接的压力不过分集中在集群的单个节点上,达到集群节点的压力尽量均衡,解决了相关技术中分布式共享Session的客户端接入集群节点的选择问题。

对于本实施例中,通讯节点选择模块103依据节点信息通过预定规则从连接池中选择可用连接与数据库集群进行通讯方式,在本实施例一个可选实施例中,该通讯节点选择模块103采取的方式为,判断是否有携带指定会话标识的连接;在判断结果为否时,依据预设算法从连接池中选择一个可用且未被标识的第一连接与数据库集群进行通讯,并为第一连接增加指定会话标识;而在判断结果为是时,选择与指定会话标识对应的连接执行与数据库集群的通讯。

而在本实施例的另一个可选实施方式中,在选择与指定会话标识对应的连接执行与数据库集群的通讯之后,若与指定会话标识对应的连接异常时,通讯节点选择模块依据预设算法从连接池中重新选择一个可用的第二连接与数据库集群进行通讯,并通过指定会话标识更新第二连接的标识。

需要说明的是,本实施例中涉及到的预设算法可以是随机分配算法、轮询算法,加权轮询算法以及一致性哈希算法等等,下面以随机分配算法为例的应用场景一,对上述通讯节点选择模块103依据节点信息通过预定规则从连接池中选择可用连接与数据库集群进行通讯方式进行举例说明;

应用场景一:从连接池中通过随机分配+Session ID(对应于指定会话标识)算法取出一条可用连接进行通讯,即当Session ID是第一次发生通讯行为时,采用随机分配算法从连接池中随机取出一条未被标志的可用连接进行通讯,并标志该连接为该Session ID使用的标志,Session(会话)在销毁时,清除连接使用的标志;若不是第一次通讯则Session ID将会采用之前分配的连接进行通讯,若取不到之前的连接或者连接不可用或者其它读取异常,那么将采用随机分配算法重新选择一条未被标志可用连接进行通讯,并标志该Session ID使用的标志,若连接都被标志且依然分配不到未被标志的连接时,则依然采用随机分配算法分配一条可用连接给该Session,并更新为该会话ID使用的标志

图2是根据本发明实施例的通讯节点的选择装置可选结构框图一,如图2所示,该装置还包括:连接池管理模块104,数据库通讯模块102耦合连接,用于执行对连接池中连接的管理操作,其中,管理操作包括:创建连接、增加连接、销毁连接、删除连接以及检测连接状态。

图3是根据本发明实施例的通讯节点的选择装置可选结构框图二,如图3所示,该装置还包括:集群节点加载模块105,与动态建链模块106耦合连接,用于记载装置配置的数据库集群的节点值;动态建链模块106,与数据库通讯模块102耦合连接,用于在集群节点加载模块重新加载实际节点值时,动态更新与数据库集群的连接。

可选地,动态建链模块106动态更新与数据库集群的连接的方式,在本实施例的一个可选实施方式中,该动态建链模块106通过如下方式来实现,建立装置与数据库集群节点可用连接数为N/2+1个,其中,N为数据库集群的节点数;或,建立装置与数据库集群中的每一个节点的连接;或,在数据库集群中只有一个节点时,建立装置与数据库集群节点可用连接数为1;在数据库集群的节点大于或等于2时,建立装置与数据库集群节点可用连接数为2。

图4是根据本发明实施例的通讯节点的选择装置可选结构框图三,如图4所示,该装置还包括:集群节点配置反写模块107,与集群节点加载模块105耦合连接,用于周期性检测库集群配置的实际节点值与装置配置的数据库集群的节点值的一致性;在检测到不一致时,获取数据库集群节点的实际节点值反写如装置的配置文件中,并调用集群节点加载模块重新加载实际节点值。

图5是根据本发明实施例的通讯节点的选择装置可选结构框图四,如图5所示,该装置还包括:连接池定时检测模块108,与连接池管理模块104耦合连接,用于周期性检测连接池的连接状态以及连接池的连接数是否满足预设数量;在检测到有连接不可用时,触发连接池管理模块删除该不可用连接;在检测到连接数不满足预设数量时,触发动态建链模块更新连接池。

图6是根据本发明实施例的通讯节点的选择方法的流程图,如图6所示,该方法的步骤包括:

步骤S602:在接收到用户请求的会话处理请求时,会话管理模块调用数据库通讯模块获取数据库集群中节点的信息;

步骤S604:通讯节点选择模块从数据库通讯模块中获取节点的信息,并依据该节点信息通过预定规则从连接池中选择可用连接与数据库集群进行通讯;

其中,连接池用于存储装置与数据库集群中节点之间的连接。

可选地,通讯节点选择模块通过预定规则选择节点与数据库集群进行通讯的方式,在本实施例的可选实施方式中可以通过如下方式来实现:

步骤S11:通讯节点选择模块判断是否有携带指定会话标识的连接;

步骤S12:在判断结果为否时,通讯节点选择模块依据预设算法从连接池中选择一个可用且未被标识的第一连接与数据库集群进行通讯,并为第一连接增加 指定会话标识;

步骤S13:在判断结果为是时,通讯节点选择模块选择与指定会话标识对应的连接执行与数据库集群的通讯。

步骤S14:在通讯节点选择模块选择与指定会话标识对应的连接执行与数据库集群的通讯之后,若与指定会话标识对应的连接异常时,通讯节点选择模块依据预设算法从连接池中重新选择一个可用的第二连接与数据库集群进行通讯,并为第二连接增加指定会话标。

需要说明的是,此处的步骤S11至步骤S13与本发明的装置实施例中的通讯节点选择模块通过预定规则选择节点与数据库集群进行通讯的方式是对应的,因此,在此就再赘述。

可选地,本实施例的方法步骤还可以包括:

步骤S21:集群节点加载模块记载装置配置的数据库集群的节点值;

步骤S22:在集群节点加载模块重新加载实际节点值时,动态建链模块周期性动态更新与数据库集群的连接。

而对于步骤S22中涉及到的动态建链模块动态更新与数据库集群的连接的方式,可以通过如下方式来实现:动态建链模块,建立装置与数据库集群节点可用连接数为N/2+1个,其中,N为数据库集群的节点数;或,建立装置与数据库集群中的每一个节点的连接;或,在数据库集群中只有一个节点时,建立装置与数据库集群节点可用连接数为1;在数据库集群的节点大于或等于2时,建立装置与数据库集群节点可用连接数为2。

步骤S23:集群节点配置反写模块周期性检测库集群配置的实际节点值与装置配置的数据库集群的节点值的一致性;在检测到不一致时,获取数据库集群节点的实际节点值反写如装置的配置文件中,并调用集群节点加载模块重新加载实际节点值。

下面结合本发明的可选实施例对本发明进行举例说明;

本可选实施例提供了一种可靠的、稳定的、具有可伸缩性的获取数据库集群服务的容器客户端(对应于本发明实施例中的装置),该容器客户端应用于分布式Session共享。图7是根据本发明可选实施例的获取数据库集群服务的容器客户端的结构框图,如图7所示,该容器客户端包括:集群节点加载模块、集群节点配置反写模块、动态建链模块、连接池定时检测模块、连接池管理模块、数据库通讯节点选择模块以及通讯处理模块;

其中,集群节点加载模块,用于加载容器配置的集群节点值,并调用动态建 链模块进行建链;

集群节点配置反写模块,用于定时检测数据库集群节点实际配置值和容器客户端配置值的一致性,当存在集群节点配置和容器客户端配置不一致时,读取集群节点的实际配置并反写到容器的配置文件中,并调用集群节点配置加载模块重新加载该配置值。

动态建链模块,用于根据加载的数据库集群节点配置,动态更新与数据库集群的连接。

对于动态更新于数据库集群的连接方式,在本可选实施例中包括:在数据库集群模块比较小时,每个容器客户端与数据库集群的中每个节点建立一条且仅一条连接,成功建链后将该连接放置到连接池中进行统一管理维护。而为避免当数据库集群规模比较大,节点数比较多,实际并不需要那么多连接时,建链策略提供可配置。比如:策略a:当配置策略为可用数时,客户端与集群节点建立可用连接数为n/2+1个连接;策略b:当配置策略为全部数时,容器端与每个数据库节点都建立一条连接;策略c:当配置为最小可用数时,若配置仅为1个Zookeeper节点,则容器客户端与集群节点建立连接数为1,否则容器客户端与集群数据库节点建立可用连接数为2。连接成功建立后,客户端与集群的数据库节点之间的通讯都是通过取连接池的连接来完成。当建链过程中若存在失败时,则跳过该Zookeeper节点的建链,选择下一个节点建链直到满足策略需求,如此循环超过一定次数(可选的该一定次数可以是2次),若仍然不满足策略需求时,则退出模块。

连接池定时检测模块,用于定时检测连接池的连接和检测连接池的连接是否满足建链策略。当定时检测发现连接不可用时,及时从连接池中删除不可用的连接;当定时检测连接数发现不满足建链策略,则调用动态建链模块更新连接池;例如,当不满足的策略为可用数时,那需要调用动态建链模块,重新建立连接加入到连接池中,维持连接可用数达到策略要求。

连接池管理模块,用于统一管理连接池中的连接,提供连接池常用的操作,该常用操作包括:提供连接创建、增加、销毁、删除、以及连接状态检测等功能。

通讯节点选择模块,用于当容器端需要与数据库集群中的节点进行通讯读取共享的Session数据时,为避免容器段的请求压力都集中在集群中的单个节点上;

可选地,在本可选实施例中,采取随机分配+Session ID相结合的方法,选择数据库集群中的节点来进行通讯。即从连接池中通过随机分配+Session ID算法取出一条可用连接进行通讯,即当Session ID是第一次发生通讯行为时,采用随机分配算法从连接池中随机取出一条未被标志的可用连接进行通讯,并标志该连接为该Session ID使用的标志,Session在销毁时,清除连接使用的标志;若 不是第一次通讯则Session ID将会采用之前分配的连接进行通讯,若取不到之前的连接或者连接不可用或者其它读取异常,那么将采用随机分配算法重新选择一条未被标志可用连接进行通讯,并标志该Session ID使用的标志,若连接都被标志且依然分配不到未被标志的连接时,则依然采用随机分配算法分配一条可用连接给该Session,并更新为该会话ID使用的标志。为了满足业务的定制化需求,选择算法还可以是:提供轮询算法,加权轮询算法以及一致性哈希算法等。

数据库通讯模块,用于使用连接与数据库集群中节点进行数据传递,主要是向集群节点请求信息和获取响应信息,把获取的响应信息传递给相应的其它模块,例如把获取的共享Session信息传递给Session管理模块,把获取的集群节点实际配置信息传递给集群节点配置反写模块等。

通过本可选实施例提供的均衡选择数据库集群通讯节点的方法,填充了相关技术的空白。在本可选实施例中,引入的集群节点配置反写模块能自动且即时获取到集群规模的最新信息,能在无需手工配置、无需重启容器的情况下动态同步到容器的配置;此外,动态建链模块提供可自定义的建链策略,能全方位满足不同的场景需求,能在集群出现节点故障但其它节点依然能提供正常服务时,不影响容器端的正常运作;另外,采用随机分配算法选择连接池的连接,能使得请求压力不过分集中在集群的单个Zookeeper节点上,使得集群节点的压力尽量均衡,提高集群整体的信息处理能力和降低单点故障发生几率,采用同一Session ID使用同一连接能避免使用连接的频繁切换,提高客户端信息处理能力。

可见,通过本可选实施例解决了相关技术中均衡的选择数据库集群中的通讯节点,数据库节点请求压力过分集中,集群中数据库节点异常容错,以及数据库集群中节点规模难以自动适应的问题。

下面结合附图对本发明可选实施例进行详细说明;

图8是根据本发明可选实施例的分布式共享Session存储在容器客户端启动顺序的流程图,如图8所示,该启动的顺序包括:

步骤S802:手工配置相关信息;

其中,该相关信息包括:配置容器使用共享Session、配置数据库集群节点信息、配置集群节点动态建链策略、配置节点选择策略等;

步骤S804:触发该容器客户端相应模块的加载;

步骤S806:加载配置的数据库集群节点值;

步骤S808:启动集群节点反写模块;

其中,该模块定时检测容器中配置的集群和实际集群值的一致性,若不一致 则更新加载集群的配置值,并反写实际值到容器的配置文件;

步骤S810:启动动态建链模块,加载配置的建链策略;

其中,根据上述策略,如最大可用数、可用数或最小数策略,生成连接存储到连接池中;

步骤S812:启动连接池管理模块和连接池定时检测模块,以管理维护连接池中的连接。

图9是根据本发明可选实施例的分布式共享Session存取的流程图,如图9所示,在容器有接收到用户请求需要生成、更新或者读取Session时,Session管理模块调用数据库通讯处理模块,处理Session在数据库节点的存取,并返回结果给Session管理模块。数据库通讯处理模块在与数据库通讯过程中,需要调用通讯节点选择模块根据一定算法,该一定算法包括:随机分配+Session ID算法、轮询、加权轮询或者一致性哈希等,以获取数据库节点的连接来进行处理。

图10是根据本发明可选实施例的数据库集群节点配置反写模块工作的流程图,如图10所示,在容器定时器定时触发集群节点配置反写模块时,配置反写模块调用数据库通讯处理模块与数据库集群进行通讯,获取实际配置信息,然后进行容器加载的配置一致性进行判定,当判定不一致时,更新配置文件并触发配置加载模块,当配置加载模块重新加载配置文件后,会重新调用动态加载模块更新连接池。

由上述图7至图10,以及相应的说明可知,本可选实施例具有容灾的功能,即无论数据库集群中的节点出现何种异常,只要集群整体仍然能提供正常的服务,则容器客户端依然能使用数据库集群提供的服务进行正常运作;此外,本可选实施例的方式具有比较好的稳定性,即不存在大压力情况下,容器客户端请求压力过分集中而导致数据库节点提供能力不均衡的情况;本可选实施例还具有可伸缩性的功能,即集群的规模无论是扩大还是缩小,容器客户端依然能在无需手工修改配置、无需重启的情况下,继续自动使用扩大规模或缩小规模的节点。

在另外一个实施例中,还提供了一种软件,该软件用于执行上述实施例及优选实施方式中描述的技术方案。

在另外一个实施例中,还提供了一种存储介质,该存储介质中存储有上述软件,该存储介质包括但不限于:光盘、软盘、硬盘、可擦写存储器等。

显然,本领域的技术人员应该明白,上述本发明的各模块或各步骤可以用通用的计算装置来实现,它们可以集中在单个的计算装置上,或者分布在多个计算装置所组成的网络上,可选地,它们可以用计算装置可执行的程序代码来实现,从而,可以将它们存储在存储装置中由计算装置来执行,并且在某些情况下,可 以以不同于此处的顺序执行所示出或描述的步骤,或者将它们分别制作成各个集成电路模块,或者将它们中的多个模块或步骤制作成单个集成电路模块来实现。这样,本发明不限制于任何特定的硬件和软件结合。

上述仅为本发明的可选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1