您的位置 首页 > 德语词汇

Cassandra是什么意思(Cassandra入门与实战)

大家好,如果您还对Cassandra是什么意思不太了解,没有关系,今天就由本站为大家分享Cassandra是什么意思的知识,包括Cassandra入门与实战的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!

互联网时代各种数据存储方式层出不穷,有传统的关系性数据库如:MySQL、Oracle等,;有全文检索框架如:ElasticSearch、Solr;有NoSQL如:Cassandra、Redis

NoSQL,泛指非关系型的数据库,NoSQL去掉关系数据库的关系型特性,数据之间无关系,非常容易扩展。

Cassandra是什么意思(Cassandra入门与实战)

NoSQL型数据库一般包含一些共同特性:

NoSQL数据库种类繁多,但是一个共同的特点都是去掉关系数据库的关系型特性。数据之间无关系,这样就非常容易扩展,在架构的层面上带来了可扩展的能力。

NoSQL数据库都具有非常高的读写性能,尤其在大数据量下。一般MySQL使用QueryCache。NoSQL的Cache是记录级的,是一种细粒度的Cache,所以NoSQL在这个层面上来说性能就要高很多。

NoSQL无须事先为要存储的数据建立字段,随时可以存储自定义的数据格式。而在关系数据库里,增删字段是一件非常麻烦的事情。

NoSQL在不太影响性能的情况,就可以方便地实现高可用的架构。比如Cassandra、HBase模型,通过复制模型也能实现高可用。

这一类数据库主要使用[哈希表],这个表中有一个特定的键和一个指针指向特定的数据。Key/value模型的优势在于简单、易部署。代表为:Redis。

这类数据库通常是用来应对分布式存储的海量数据。键仍然存在,但是它们的特点是指向了多个列。这些列是由列家组来安排的。如:Cassandra,HBase。

文档型数据库和第一种键值存储相类似。该类型的数据模型是版本化的文档,半结构化的文档以特定的格式存储,比如JSON。文档型数据库可以看作是键值数据库的升级版,允许之间嵌套键值,在处理网页等复杂数据时,文档型数据库比传统键值数据库的查询效率更高。如:CouchDB,MongoDb。

图形结构的数据库同其他行列以及关系型数据库不同,它是使用灵活的图形模型,并且能够扩展到多个服务器上。

Cassandra是一套开源分布式NoSQL数据库系统。它最初由Facebook开发,用于储存收件箱等简单格式数据,集GoogleBigTable的数据模型与AmazonDynamo的完全分布式的架构于一身Facebook于2008将Cassandra开源,此后,由于Cassandra良好的可扩展性,被Digg、Twitter等知名Web2.0网站所采纳,成为了一种流行的分布式结构化数据存储方案。

Cassandra在2009年成为了Apache软件基金会的Incubator项目,并在2010年2月走出孵化器,成为正式的基金会项目。

Cassandra的名称来源于希腊神话,是特洛伊的一位悲剧性的女先知的名字,因此项目的Logo是一只放光的眼睛。

打开官网,选择下载频道https://cassandra.apache.org/download/

进入下载频道后,目前最近版是3.11.6,我们选择使用版本3.9,可以从版本列表中选择想要使用版本

点击进入3.9的目录,下载apache-cassandra-3.9-bin.tar.gz

点击红框内的链接,下载3.9版本,下载后文件如下:

注意:Cassandra使用JAVA语言开发,首先保证当前机器中已经安装JDK

找一个不包含中文的目录,把刚才下载的安装文件复制过去。然后解压到当前文件夹

在环境变量中新建一个CASSANDRA_HOME变量,值为:D:\\coding-software\\apache-cassandra-3.9

在Path环境变量中在末尾添加:%CASSANDRA_HOME%\\bin

打开dos窗口可以查看是否设置成功。输入echo%cassandra_home%,显示如下内容说环境变量值设置成功

cassandra的数据分为3类,这3类数据的存储位置都可以在配置文件中修改

data目录:用于存储真正的数据文件,即后面将要讲到的SSTable文件。如果服务器有多个磁盘,可以指定多个目录,每一个目录都在不同的磁盘中。这样Cassandra就可以利用更多的硬盘空间。

在data目录下,Cassandra会将每一个Keyspace中的数据存储在不同的文件目录下,并且Keyspace文件目录的名称与Keyspace名称相同。

假设有两个Keyspace,分别为ks1和ks2,但在data目录下,将看到3个不同的目录:ks1,ks2和system。其中ks1和ks2用于存储系统定义的两个Keyspace的数据,另外一个system目录是Cassandra系统默认的一个Keyspace,叫做system,它用来存储Cassandra系统的相关元数据信息以及HINT数据信息。

commitlog目录:用于存储未写人SSTable中的数据,每次Cassandra系统中有数据写入,都会先将数据记录在该日志文件中,以保证Cassandra在任何情况下宕机都不会丢失数据。如果服务器有足够多的磁盘,可以将本目录设置在一个与data目录和cache目录不同的磁盘中,以提升读写性能。

cache目录:用于存储系统中的缓存数据。可以在cassandra.yaml文件中定义ColumnFamily的属性中定义与缓存相关的信息,如缓存数据的大小(对应配置文件中的keys_cached和rOws_cached)、持久化缓存数据的时间间隔(对应配置文件中的rowcache_save_periodin.seconds和key.cachesaveperiodinseconds)等。当Cassandra系统重启的时候,会从该目录下加载缓存数据。如果服务器有足够多的磁盘空间,可以将本目录设置在一个与data目录和commitlog目录不同的磁盘中,以提升读写性能。

data_file_directories:\n-D:\\coding-software\\apache-cassandra-3.9\\data如图:2)新建日志目录,commitlog目录在D:\\coding-software\\apache-cassandra-3.9目录中新建一个commitlog目录;在cassandra.yaml中配置commitlog目录;注意:如果不配置日志目录,默认为:$CASSANDRA_HOME/data/commitlog;注意:-的后面要跟一个空格,这是yaml的语法;代码:

commitlog_directory:\n-D:\\coding-software\\apache-cassandra-3.9\\commitlog如图:3)新建缓存目录,saved_caches目录在D:\\coding-software\\apache-cassandra-3.9目录中新建一个saved_caches目录;在cassandra.yaml中配置saved_caches目录;注意:如果不配置日志目录,默认为:$CASSANDRA_HOME/data/saved_caches;注意:saved_caches_directory:后面要跟一个空格,这是yaml的语法;代码:

saved_caches_directory:D:\\coding-software\\apache-cassandra-3.9\\saved_caches如图:3.2.4启动Cassandra

打开DOS窗口,进入D:\\InstallFile\\apache-cassandra-3.9\\bin目录,执行cassandra.bat文件,看到下入图,说明启动成功。注意:这个CMD窗口不要关闭,一旦关闭,Cassandra服务就会关闭了!!!

注意:Cassandra的客户端的使用需要用的Python2.X版本。需要先安装Python2.X

进入2.7.13的下载页面,这里我选择windows64位安装文件,点击下载

接下来,安装Python2.7,找到安装文件双击打开,多次点击下一步,完成安装。

然后把Python2.7安装后的目录设置到环境变量的path中

新打开CMD窗口,输入命令python,如果现实如下内容,说明python安装成功

新打开CMD窗口,进入Cassandra的bin目录,输入

D:\\coding-software\\apache-cassandra-3.11.6\\bin>cqlsh.bat192.168.137.19042

回车,看到如图所示,说明已经连接到服务器

注意:Cassandra使用JAVA语言开发,首先保证当前机器中已经安装JDK

tar-xzvfapache-cassandra-3.9-bin.tar.gz

解压后,可以看到Cassandra的目录,如图:

进入解压后的目录,创建3个Cassandra的数据文件夹

[root@localhostapache-cassandra-3.9]#mkdirdata\n[root@localhostapache-cassandra-3.9]#mkdircommitlog\n[root@localhostapache-cassandra-3.9]#mkdirsaved_caches3.3.3配置Cassandra

在conf目录中找到cassandra.yaml配置文件,配置上面创建的3个数据目录

data_file_directories:\n-/usr/local/apache-cassandra-3.9/data2)配置commitlog_directory

内容:

commitlog_directory:/usr/local/apache-cassandra-3.9/commitlog3)配置saved_caches_directory

内容:

saved_caches_directory:/usr/local/apache-cassandra-3.9/saved_caches4)保存文件

使用:wq保存文件

进入/usr/local/apache-cassandra-3.9/bin目录,执行cassandra

意思是官方不推荐使用root用户或组来运行Cassandra,请使用其他系统用户来启动Cassandra。如果就是想用root用户来启动,可以在命令后面加上-R,也就是使用root用户启动的命令是

./cassandra-R

好,接下来输入命令来启动,可以看到一大堆的输出内容,说明启动成功了。如下:

输入命令来查看正在运行的cassandra的pid

ps-ef|grepcassandra

显示如图,pid是1729:

刚才已经查到了pid,现在可以使用命令杀掉这个pid对应的进程

kill-917293.3.6启动、重启、关闭的脚本

为了方便管理,可以编写脚本来管理,在/usr/local/apache-cassandra-3.9下创建一个startme.sh,输入一下内容:

#!/bin/sh\nCASSANDRA_DIR="/usr/local/apache-cassandra-3.9"\necho"************cassandra***************"\ncase"$1"in\nstart)\n\necho"**"\necho"*starting*"\nnohup$CASSANDRA_DIR/bin/cassandra-R>>$CASSANDRA_DIR/logs/system.log2>&1&\necho"*started*"\necho"**"\necho"************************************"\n;;\nstop)\n\necho"**"\necho"*stopping*"\nPID_COUNT=`psaux|grepCassandraDaemon|grep-vgrep|wc-l`\nPID=`psaux|grepCassandraDaemon|grep-vgrep|awk{'print$2'}`\nif[$PID_COUNT-gt0];then\necho"*trystop*"\nkill-9$PID\necho"*killSUCCESS!*"\nelse\necho"*thereisno!*"\necho"**"\necho"************************************"\nfi\n;;\nrestart)\n\necho"**"\necho"*********restarting******"\n$0stop\n$0start\necho"**"\necho"************************************"\n;;\nstatus)\n$CASSANDRA_DIR/bin/nodetoolstatus\n;;\n\n*)\necho"Usage:$0{start|stop|restart|status}"\n\nexit1\nesac

接下来就可以使用这个脚本进行启动,重启,关闭的操作

[root@localhostapache-cassandra-3.9]#./startme.shstart\n[root@localhostapache-cassandra-3.9]#./startme.shrestart\n[root@localhostapache-cassandra-3.9]#./startme.shstop3.3.7查看状态

运行bin目录下的nodetool

[root@localhostbin]#./nodetoolstatus

结果如图:

也可以运行自己编写的脚本,效果与上图一致:

[root@localhostapache-cassandra-3.9]#./startme.shstatus

如果cassandra启动出错,可以在bin目录下使用journalctl-ucassandra命令查看

[root@localhostbin]#journalctl-ucassandra3.3.8使用客户端连接

命令

[root@localhostapache-cassandra-3.9]#./bin/cqlsh

效果

看到上面的效果,说明Cassandra已经安装成功,并且使用客户端连接成功

7199-JMX\n7000-节点间通信(如果启用了TLS,则不使用)\n7001-TLS节点间通信(使用TLS时使用)\n9160-Thrift客户端API\n9042-CQL本地传输端口3.5Cassandra.yaml内容

cluster_name

集群的名字,默认情况下是TestCluster。对于这个属性的配置可以防止某个节点加入到其他集群中去,所以一个集群中的节点必须有相同的cluster_name属性。

Cassandra需要监听的IP或主机名,默认是localhost。建议配置私有IP,不要用0.0.0.0。

commitlog的保存目录,压缩包安装方式默认是/var/lib/cassandra/commitlog。通过前面的了解,我们可以知道,把这个目录和数据目录分开存放到不同的物理磁盘可以提高性能。

数据文件的存放目录,压缩包安装方式默认是/var/lib/cassandra/data。为了更好的效果,建议使用RAID0或SSD。

保存表和行的缓存,压缩包安装方式默认是/var/lib/cassandra/saved_caches。

在启动节点前,需要仔细评估你的需求。

提交失败时的策略(默认stop):

stop:关闭gossip和Thrift,让节点挂起,但是可以通过JMX进行检测。

sto_commit:关闭commitlog,整理需要写入的数据,但是提供读数据服务。

ignore:忽略错误,使得该处理失败。

设置Cassandra如何处理磁盘故障(默认stop)。

stop:关闭gossip和Thrift,让节点挂起,但是可以通过JMX进行检测。

stop_paranoid:在任何SSTable错误时就闭gossip和Thrift。

best_effort:这是Cassandra处理磁盘错误最好的目标。如果Cassandra不能读取磁盘,那么它就标记该磁盘为黑名单,可以继续在其他磁盘进行写入数据。如果Cassandra不能从磁盘读取数据,那个这些SSTable就标记为不可读,其他可用的继续堆外提供服务。所以就有可能在一致性水平为ONE时会读取到过期的数据。

用于设置Cassandra定位节点和路由请求的snitch(默认org.apache.cassandra.locator.SimpleSnitch),必须设置为实现了IEndpointSnitch的类。

用于监听客户端连接的地址。可用的包括:

需要联系的节点地址。Cassandra使用-seeds集合找到其他节点并学习其整个环中的网络拓扑。

class_name:(默认org.apache.cassandra.locator.SimpleSeedProvider),可用自定义,但通常不必要。

–seeds:(默认127.0.0.1)逗号分隔的IP列表。

compaction_throughput_mb_per_sec

限制特定吞吐量下的压缩速率。如果插入数据的速度越快,越应该压缩SSTable减少其数量。推荐16-32倍于写入速度(MB/s)。如果是0表示不限制。

指定节点中memables最大使用的内存数(默认1/4heap)。

(默认32)读取数据的瓶颈是在磁盘上,设置16倍于磁盘数量可以减少操作队列。

(默认32)在Cassandra里写很少出现I/O不稳定,所以并发写取决于CPU的核心数量。推荐8倍于CPU数。

(默认false)最后一次快照发生时备份更新的数据(增量备份)。当增量备份可用时,Cassandra创建一个到SSTable的的硬链接或者流式存储到本地的备份/子目录。删除这些硬链接是操作员的责任。

(默认false)启用或禁用在压缩前执行快照。这个选项在数据格式改变的时候来备份数据是很有用的。注意使用这个选项,因为Cassandra不会自动删除过期的快照。

(默认8)调整失效检测器的敏感度。较小的值增加了把未响应的节点标注为挂掉的可能性,反之就会降低其可能性。在不稳定的网络环境下(比如EC2),把这个值调整为10或12有助于防止错误的失效判断。大于12或小于5的值不推荐!

(默认:periodic)Cassandra用来确认每毫秒写操作的方法。

(默认1024*CPU的数量)commitlog队列上的等待条目。当写入非常大的blob时,请减少这个数值。比如,16倍于CPU对于1MB的Blob工作得很好。这个设置应该至少和concurrent_writes一样大。

(默认32)设置每个commitlog文件段的大小。一个commitlog段在其所有数据刷新到SSTable后可能会被归档、删除或回收。数据的总数可以潜在的包含系统中所有表的commitlog段。默认值适合大多数情况,当然你也可以修改,比如8或16MB。

(默认32位JVM为32,64位JVM为1024)commitlog使用的总空间。如果使用的空间达到以上指定的值,Cassandra进入下一个临近的部分,或者把旧的commitlog刷新到磁盘,删除这些日志段。该个操作减少了在启动时加载过多数据引起的延迟,防止了把无限更新的表保存到有限的commitlog段中。

(默认true)当设置为true的时候,缓存的rowkey在压缩期间被跟踪,并且重新缓存其在新压缩的SSTable中的位置。如果有极其大的key要缓存,把这个值设为false。

(默认每个CPU一个)设置每个节点并发压缩处理的值,不包含验证修复逆商。并发压缩可以在混合读写工作下帮助保持读的性能——通过减缓把一堆小的SSTable压缩而进行的长时间压缩。如果压缩运行得太慢或太快,请首先修改compaction_throughput_mb_per_sec的值。

in_memory_compaction_limit_in_mb

(默认64)针对数据行在内存中的压缩限制。超大的行会溢出磁盘并且使用更慢的二次压缩。当这个情况发生时,会对特定的行的key记录一个消息。推荐5-10%的Java对内存大小。

(默认false)当设置为true的时候,每个压缩操作使用一个线程,一个线程用于合并SSTable。典型的,这个只在使用SSD的时候有作用。使用HDD的时候,受限于磁盘I/O(可参考compaction_throughput_mb_per_sec)。

(默认false)启用或禁用内核页面缓存预热压缩后的key缓存。当启用的时候会预热第一个页面(4K)用于由每个数据行的顺序访问。对于大的数据行通常是有危害的。

(小于1/4堆内存或512)用于SSTable读取的缓存内存大小。

(默认4)等待刷新的满的memtable的数量(等待写线程的memtable)。最小是设置一个table上索引的最大数量。

(默认每数据目录一个)设置用于刷新memtable的线程数量。这些线程是磁盘I/O阻塞的,每个线程在阻塞的情况下都保持了memtable。如果有大的堆内存和很多数据目录,可以增加该值提升刷新性能。

(默认64)当数据到达这个值的时候添加列索引到行上。这个值定义了多少数据行必须被反序列化来读取列。如果列的值很大或有很多列,那么就需要增加这个值。

(默认false)添加新刷新或压缩的SSTable到操作系统的页面缓存。

(默认0.6)设置由reduce_cache_sizes_at定义的Java对内存达到限制时的最大缓存容量百分比。

(默认0.85)当Java对内存使用率达到这个百分比,Cassandra减少通过reduce_cache_capacity_to定义的缓存容量。禁用请使用1.0。

stream_throughput_outbound_megabits_per_sec

(默认200)限制所有外出的流文件吞吐量。Cassandra在启动或修复时使用很多顺序I/O来流化数据,这些可以导致网络饱和以及降低RPC的性能。

(默认false)当使用顺序写的时候,启用该选项就告诉fsync强制操作系统在trickle_fsync_interval_in_kb设定的间隔刷新脏缓存。建议在SSD启用。

本章介绍Cassandra的基本入门概念

Cassandra的数据模型与常见的关系型数据库的数据模型有很大的不同

列是Cassandra的基本数据结构单元,具有三个值:名称,值、时间戳

在Cassandra中不需要预先定义列(Column),只需要在KeySpace里定义列族,然后就可以开始写数据了。

列族相当于关系数据库的表(Table),是包含了多行(Row)的容器。

ColumnFamily的结构举例,如图:

可以理解为Java结构Map>,如图:

静态的columnfamily,字段名是固定的,比较适合对于这些column都有预定义的元数据

动态的columnfamily,字段名是应用程序计算出来并且提供的,所以columnfamily只能定义这些字段的类型,无法不可以指定这些字段的名字和值,这些名字和值是由应用程序插入某字段才得出的。

ColumnFamily中的每一行都用RowKey(行键)来标识,这个相当于关系数据库表中的主键,并且总是被索引的。

Cassandra可以使用PRIMARYKEY关键字创建主键,主键分为2种

如果PrimaryKey由一列组成,那么称为SinglecolumnPrimaryKey

如果PrimaryKey由多列组成,那么这种情况称为CompoundPrimaryKey或CompositePrimaryKey

Cassandra的键空间(KeySpace)相当于数据库,我们创建一个键空间就是创建了一个数据库。

键空间包含一个或多个列族(ColumnFamily)

注意:一般将有关联的数据放到同一个KeySpace下面

建空间(KeySpace)创建的时候可以指定一些属性:副本因子,副本策略,Durable_writes(是否启用CommitLog机制)

副本因子决定数据有几份副本。例如:

副本因子为1表示每一行只有一个副,。副本因子为2表示每一行有两个副本,每个副本位于不同的节点上。在实际应用中为了避免单点故障,会配置为3以上。

注意:所有的副本都同样重要,没有主从之分。可以为每个数据中心定义副本因子。副本策略设置应大于1,但是不能超过集群中的节点数。

否对当前KeySpace的更新使用commitlog,默认为true

副本就是把数据存储到多个节点,来提高容错性

Cassandra数据库是为跨越多条主机共同工作,对用户呈现为一个整体的分布式系统设计的。Cassandra最外层容器被称为群集。Cassandra将集群中的节点组织成一个环(ring),然后把数据分配到集群中的节点(Node)上。

超级列是一个特殊列,因此,它也是一个键值对。但是超级列存储了子列的地图。

通常列族被存储在磁盘上的单个文件中。因此,为了优化性能,重要的是保持您可能在同一列族中一起查询的列,并且超级列在此可以有所帮助。下面是超级列的结构。

CQL提供了一组丰富的内置数据类型,用户还可以创建自己的自定义数据类型。CQL是Cassandra提供的一套查询语言

CQL提供2种类型存放文本类型,text和varchar基本一致

集合数据类型,set里面的元素存储是无序的。

set里面可以存储前面介绍的数据类型,也可以是用户自定义数据类型,甚至是其他集合类型。

list包含了有序的列表数据,默认情况下,数据是按照插入顺序保存的。

map数据类型包含了key/value键值对。key和value可以是任何类型,除了counter类型

使用集合类型要注意:1、集合的每一项最大是64K。2、保持集合内的数据不要太大,免得Cassandra查询延时过长,Cassandra查询时会读出整个集合内的数据,集合在内部不会进行分页,集合的目的是存储小量数据。3、不要向集合插入大于64K的数据,否则只有查询到前64K数据,其它部分会丢失。

如果内置的数据类型无法满足需求,可以使用自定义数据类型。

CQLShell简称cqlsh,是一个可以和Cassandra数据库通信的客户端,使用这个cqlsh客户端可以执行Cassandra查询语言(CQL)。

新打开CMD窗口,进入Cassandra的bin目录,输入

D:\\coding-software\\apache-cassandra-3.9\\bin>cqlsh.bat192.168.137.19042

回车,看到如图所示,说明已经连接到服务器

进入cassandra安装目录下的bin目录,执行cqlsh命令

[root@localhostapache-cassandra-3.9]#./bin/cqlsh192.168.137.1319042

执行命令后效果

上面的操作在启动cqlsh的时候并没有指定需要连接的节点以及端口,默认cqlsh会自动探测本机及端口。上面的操作时已经启动了Cassandra服务并绑定相关端口,注:【端口列表】,cqlsh默认就会连接本机的9042端口。

从上面的命令可以看出cqlsh连接到名为TestCluster的集群,这个名字是默认值,可以自定义,配置在conf/cassandra.yaml文件的cluster_name参数,注:【yaml全内容】

另外,也可以在启动cqlsh的时候指定节点和端口,效果和不指定一样:

[root@localhostapache-cassandra-3.9]#./bin/cqlshlocalhost90424.3.3cqlsh的基本命令

命令列表

输入命令,可以查看cqlsh支持的命令

cqlsh>help

显示效果:

此命令配合一些内容可以输入信息

Describecluster提供有关集群的信息

cqlsh>Describecluster;

效果

DescribeKeyspaces列出集群中的所有Keyspaces(键空间)

cqlsh>DescribeKeyspaces;

效果,显示当前Cassandra里的所有键空间

Describetables列出键空间的所有表

cqlsh>Describetables;

效果,当前没有创建任何的键空间,这里显示的默认内置的表

Describetables列出键空间内指定表的信息

先指定键空间,这里使用system_traces

cqlsh>USEsystem_traces;

列出system_traces下的sessions信息

cqlsh:system_traces>DESCRIBEsessions;

效果

此命令捕获命令的输出并将其添加到文件。

输入命令,将输出内容捕获到名为outputfile的文件

CAPTURE'/usr/local/apache-cassandra-3.11.6/outputfile'

执行效果

执行一个查询,控制台可以看到输出。

然后去看outputfile文件,会发现把刚才查询的

show命令后可以跟3个内容,分别是HOST、SESSION、VERSION输入SHOW,点击2次TAB按键,可以看到3个内容提示

cqlsh:system_traces>SHOW

输入SHOWHOST,显示当前cqlsh连接的Cassandra服务的ip和端口

cqlsh:system_traces>SHOWHOST

输入SHOWVERSION显示当前的版本

cqlsh:system_traces>SHOWVERSION

出入SHOWSESSION显示会话信息,需要参数uuid

cqlsh:system_traces>SHOWSESSION<uuid>

显示效果

CQL:CassandraQueryLanguage和关系型数据库的SQL很类似(一些关键词相似),可以使用CQL和Cassandra进行交互,实现定义数据结构,插入数据,执行查询。

注意:CQL和SQL是相互独立,没有任何关系的。CQL缺少SQL的一些关键功能,比如JOIN等。

好了,本文到此结束,如果可以帮助到大家,还望关注本站哦!

本站涵盖的内容、图片、视频等数据,部分未能与原作者取得联系。若涉及版权问题,请及时通知我们并提供相关证明材料,我们将及时予以删除!谢谢大家的理解与支持!

Copyright © 2023