https://cn.greenplum.org/

https://hub.docker.com/r/lyasper/greenplum

https://github.com/lij55/gphost

https://github.com/greenplum-db/gpdb/releases

安装

  • 以root用户在master节点上执行

# 默认安装到 /usr/local/greenplum-db/ or /usr/local/gpdb/
rpm -Uvh greenplum-db-5.10.2-rhel7-x86_64.rpm

# 安装成功后的目录文件
  # drwxr-xr-x 7 gpadmin gpadmin 4096 Jan  7 15:42 bin
  # drwxr-xr-x 3 gpadmin gpadmin 4096 Jan  7 15:42 docs
  # -rwxr-xr-x 1 gpadmin gpadmin  737 Dec 24  2019 greenplum_path.sh
  # drwxr-xr-x 4 gpadmin gpadmin 4096 Jan  7 15:42 include
  # drwxr-xr-x 5 gpadmin gpadmin 4096 Jan 13 14:48 lib
  # drwxr-xr-x 2 gpadmin gpadmin 4096 Jan  7 15:42 sbin
  # drwxr-xr-x 5 gpadmin gpadmin 4096 Jan 13 18:13 shar

添加修改配置文件

  • conf文件配置

# 创建文件夹以及配置文件
mkdir conf
touch conf/all_hosts

# 前提已经配置好 /etc/hosts文件

vim conf/all_hosts
  #写入master、slave节点的hostname
  xmscczw-ecs-ggaq-mpp-0001
  xmscczw-ecs-ggaq-mpp-0002
  xmscczw-ecs-ggaq-mpp-0003
touch conf/seg_hosts
  #包含所有的Segment Host的主机名
  xmscczw-ecs-ggaq-mpp-0001
  xmscczw-ecs-ggaq-mpp-0002

# 此处xmscczw-ecs-ggaq-mpp-0003为master

  • 数据存储路径配置

# 创建数据存储路径文件(在分发到其他节点后,三个节点都要执行)
mkdir -p /data/greenplum/data/master
mkdir -p /data/greenplum/data/primary
mkdir -p /data/greenplum/data/mirror
mkdir -p /data/greenplum/data2/primary
mkdir -p /data/greenplum/data2/mirror

# 增加initgp_config文件为模板
cp /usr/local/gpdb/docs/cli_help/gpconfigs/gpinitsystem_config /usr/local/gpdb/docs/cli_help/gpconfigs/initgp_config

# 编辑initgp_config配置文件

vim initgp_config

declare -a DATA_DIRECTORY=(/data/greenplum/data/primary /data/greenplum/data/primary /data/greenplum/data/primary /data/greenplum/data2/primary /data/greenplum/data2/primary /data/greenplum/data2/primary)
declare -a MIRROR_DATA_DIRECTORY=(/data/greenplum/data/mirror /data/greenplum/data/mirror /data/greenplum/data/mirror /data/greenplum/data2/mirror /data/greenplum/data2/mirror /data/greenplum/data2/mirror)
ARRAY_NAME=”gp_sydb”                                      
MASTER_HOSTNAME=master                                  
MASTER_DIRECTORY=/data/greenplum/data/master                
MASTER_DATA_DIRECTORY=/data/greenplum/data/master/gpseg-1    
DATABASE_NAME=gp_sydb  
MACHINE_LIST_FILE=/usr/local/gpdb/conf/seg_hosts


创建用户

  • 建用户、用户组

# 创建用户,赋予安装目录

groupadd gpadmin                                # 用户组gpadmin
useradd -g gpadmin gpadmin                      # 创建用户名gpadmin
passwd gpadmin gpadmin                          # 设置用户密码

chown -R gpadmin:gpadmin /usr/local/gpdb/       # 设置安装目录文件


配置免密登录

  • 实现ssh免密登录

# 以root用户在master节点上执行
ssh-keygen    # 生成秘钥
ssh-copy-id -i ~/.ssh/id_rsa.pub root@xmscczw-ecs-ggaq-mpp-0002  # 分发公共秘钥
ssh-copy-id -i ~/.ssh/id_rsa.pub root@xmscczw-ecs-ggaq-mpp-0001

# 以gpadmin用户在master节点上执行
ssh-keygen    # 生成秘钥
ssh-copy-id -i ~/.ssh/id_rsa.pub gpadmin@xmscczw-ecs-ggaq-mpp-0003
ssh-copy-id -i ~/.ssh/id_rsa.pub gpadmin@xmscczw-ecs-ggaq-mpp-0002  # 分发公共秘钥
ssh-copy-id -i ~/.ssh/id_rsa.pub gpadmin@xmscczw-ecs-ggaq-mpp-0001

# 先执行该
source /usr/local/gpdb/greenplum_path.sh
gpssh-exkeys -f /workspace/gpdb/gp-all.txt


分发到其他节点

# 将安装包分发到其他两个节点
cd /usr/local/
scp -r /usr/local/gpdb/  xmscczw-ecs-ggaq-mpp-0001:$PWD
scp -r /usr/local/gpdb/  xmscczw-ecs-ggaq-mpp-0002:$PWD


# 使用自带的gpssh工具,实现在主节点同时操作其他两个服务器

source /usr/local/gpdb/greenplum_path.sh
bin/gpssh-exkeys -f /usr/local/gpdb/conf/seg_hosts
# 显示格式为
=> cd /usr/local
[xmscczw-ecs-ggaq-mpp-0001]
[xmscczw-ecs-ggaq-mpp-0002]

# 并执行以下命令
groupadd gpadmin                                # 用户组gpadmin
useradd -g gpadmin gpadmin                      # 创建用户名gpadmin
passwd gpadmin gpadmin                          # 设置用户密码
chown -R gpadmin:gpadmin /usr/local/gpdb/       # 设置安装目录文件


gpadmin用户配置

  • 三个节点分别执行以下命令

su gpadmin


# 在配置文件 ~/.bashrc 、~/.bash_profile 中分别都添加以下内容:
# --------------------------------------------------------------
source /usr/local/gpdb/greenplum_path.sh
export MASTER_DATA_DIRECTORY=/data/greenplum/data/master/gpseg-1
export GPPORT=5432
export PGUSER=gpadmin
export PGDATABASE=gp_sydb
export LD_LIBRARY_PATH=/usr/local/lib/lib
# --------------------------------------------------------------

# 使两个文件生效
source ~/.bashrc
source ~/.bash_profile


执行初始化

  • gpadmin 用户在master节点执行

gpinitsystem -c /usr/local/gpdb/docs/cli_help/gpconfigs/initgp_config -h conf/seg_hosts -s xmscczw-ecs-ggaq-mpp-0001

# gpinitsystem命令参数解释:
 # -c:指定初始化文件。
 # -h:指定segment主机文件。
 # -s:指定standby主机,创建standby节点。
 
# 查看配置正确,确认是否执行?
Continue with Greenplum creation Yy|Nn (default=N):
Y


系统登录初始化设置

  • 账号、密码、登录

su gpadmin
/* 进入命令端,psql修改数据库密码 */
bin/psql -d gp_sydb
   gpdb=# alter user gpadmin with password 'gpadmin';  //设置gpadmin账号密码为gpadmin
   gpdb=# \q                                           //退出命令

/* 远程登陆 */

bin/psql -p 5432 -d gp_sydb

/* 查询当前版本 */
select * from version();
  • 设置监听IP和Port

vim ${MASTER_DATA_DIRECTORY}/postgresql.conf

例如:vim /data/greenplum/data/master/gpseg-1/postgresql.conf

# 设置监听IP (* 生产环境慎用)
listen_addresses = '${ host ip address } '
port = 5432

#### 设置数据库白名单
vim ${MASTER_DATA_DIRECTORY}/pg_hba.conf

# 增加如下一条记录,允许用户密码模式和可以登陆的IP地址范围; 注:设置完这个,建议再重新设置依稀账号密码
#TYPE  DATABASE  USER   CIDR-ADDRESS     METHOD
host    all     gpadmin     0.0.0.0/0        md5

# 测试登陆 root/gpadmin都可

psql -p 5432 -h 172.20.6.15 -U gpadmin -d testgpdb

例如:bin/psql -p 5432 -h xmscczw-ecs-ggaq-mpp-0003 -U gpadmin -d gp_sydb


数据库连接异常

su gpadmin
gpstop
Y
vim vim /data/greenplum/data/master/gpseg-1/pg_hba.conf  # 在master、standby节点分别执行

# 添加
host     all         gpadmin         10.8.31.116/32       trust
host     all         all         10.8.31.27/32       trust
host     all         all         10.10.4.79/32       trust

gpstart  # 在master节点gpadmin用户执行


ssh免密登录


1.客户端生成公私钥

本地客户端生成公私钥:(一路回车默认即可)

ssh-keygen

上面这个命令会在用户目录.ssh文件夹下创建公私钥

cd ~/.ssh
ls

下创建两个密钥:

  1. id_rsa (私钥)

  2. id_rsa.pub (公钥)


2.上传公钥到服务器

这里测试用的服务器地址为:192.168.235.22 用户为:root

ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.235.22

上面这条命令是写到服务器上的ssh目录下去了

cd ~/.ssh
vim authorized_keys

可以看到客户端写入到服务器的 id_rsa.pub (公钥)内容。


3.测试免密登录

客户端通过ssh连接远程服务器,就可以免密登录了。

ssh root@192.168.235.22


gp集群配置


修改配置文件

  1. 创建文件

# 创建文件夹以及配置文件
mkdir conf
touch conf/all_hosts
vim conf/all_hosts
  #写入master、slave节点的hostname
  xmscczw-ecs-ggaq-mpp-0001
  xmscczw-ecs-ggaq-mpp-0002
  xmscczw-ecs-ggaq-mpp-0003
touch conf/seg_hosts
  #写入slave节点的hostname
  xmscczw-ecs-ggaq-mpp-0001
  xmscczw-ecs-ggaq-mpp-0002

# 此处xmscczw-ecs-ggaq-mpp-0003为master

启动关闭命令

在一个Greenplum数据库管理系统中,所有主机上的数据库实例(Master和所有的Segment)一起被启动或者停止,启停操作统一由Master实例发起,它们步调一致,在外界看来是一个完整的数据库管理系统。

由于一个Greenplum数据库系统分布在很多机器上,启动和停止一个Greenplum数据库系统的过程与普通PostgreSQL数据库的启动和停止过程不同。

分别使用gpstartgpstop 工具来启动和停止Greenplum数据库。这些工具位于Greenplum数据库Master主机的$GPHOME/bin 目录下。

Important: 不要采用kill命令来直接杀掉任何后台Postgres进程。 可以使用数据库内命pg_cancel_backend()来完成此操作。

采用 kill -9 或 kill -11 可能引发数据库损坏并且妨碍根据目前数据库的表现进行问题根源分析。

以下命令需要切换到gpadmin账号执行

su gpadmin

启动GreenPlum

gpstart

只启动主节点

gpstart -m

停止GreenPlum

gpstop

只停止主节点

gpstop -m

快速停止GP服务

gpstop -M fast

停止某台机器上的所有从节点,比如sdw1

gpstop --host sdw1


重启GreenPlum

gpstop -r


重载加载配置文件

当GP服务在运行的时候去修改主节点上pg_hba.conf或者postgresql.conf 文件,没有必要去重启GP服务,只需要通过gpstop -u去重新加载配置文件即可,

当然有些涉及到GP的配置还是要去重启服务的

$ gpstop -u


性能调优


内存配置

参考:https://cloud.tencent.com/developer/article/1447227


GP常用命令


cmd命令

pg_ctl --version:查看pgsl版本

pg_ctl -D /xx/pgdata start:启动pgsl数据库

注:必须在环境变量中设置了PGDATA后才能省略-D参数 ,可以参照这篇论文PostgreSQL环境变量与psql命令的替代作用,但是里面没有讲PGDATA目录的位置

psql -h Server -p Port -U Username DatabaseName:连接数据库,例如:psql -h Serve

r -p Port -U Username DatabaseName


postgre命令

\l:列出所有的数据库;

\c DatabaseName:连接数据库;

\dt:连接进入到某个数据库后,使用此命令查看数据库中的所有表;

\d TableName:查看某个表的描述,此命令可以用来查看某个表中的列元素和相应的数据类型;

\d+ tableName:查看指定表的基本情况

\e:打开psql内置的文本编辑器,可以方便的编写脚本。这个编辑器使用了Vim环境,用这个Vim文本编辑器编写SQL脚本会很方便,保存之后退出,就能自动运行刚才在编辑器中保存的SQL命令,并返回结果;如果需要对刚执行的SQL命令进行修改,可以再次使用\e打开编辑器,里面的内容仍然是上一次保存的文本;

\q:退出psql。

SQL语句

# 创建,删除,修改数据库
create database StudentManagement;
# 创建
create table student(
Sno char(10) constraint Sno_pk primary key,
Sname char(20) unique,
Ssex char(2),
Sage smallint
--Sdept char(20)
);

# 删除
drop table student;

# 修改表
alter table student add column Sdept char(20);

# 自增
--SERIAL代表自增,默认从1开始增加,每次自增1。
create table CREATETASK_CHKID_N(
id SERIAL PRIMARY KEY,
chk_id TEXT,
n INTEGER
);

删除表
drop table REL_CROSS_NODE;

清空表
delete from [表名]

or

TRUNCATE TABLE  [表名]

  • 注:SQL命令需要加“;”,PostegreSQL命令不需要加

  • select count(*) from pg_stat_user_tables ;


查询表
select count(*) from pg_stat_user_tables;


注意点

  • 内存增加为16G,默认8G

       gpconfig -c gp_vmem_protect_limit -m 16384 -v 16384

  • 查询内存

       gpconfig -s gp_vmem_protect_limit

  • 查看共享内存

    ipcs -m

  • 释放共享内存  

       ipcrm -m 5210112(shmid)


# 常用命令


1、连接数据库, 默认的用户和数据库是postgres

psql -U user -d dbname


2、切换数据库,相当于MySQL的use dbname

\c dbname


3、列举数据库,相当于mysql的show databases

\l


4、列举表,相当于mysql的show tables

\dt


5、查看表结构,相当于desc tblname,show columns from tbname

\d tblname


6、查看索引

\di


7、查看函数

\df


8、创建数据库

create database [数据库名]; 


9、删除数据库:

drop database [数据库名];  


10、重命名一个表:

alter table [表名A] rename to [表名B]; 


11、删除一个表:

drop table [表名]; 


12、在已有的表里添加字段:

alter table [表名] add column [字段名] [类型]; 


13、删除表中的字段:

alter table [表名] drop column [字段名]; 


14、重命名一个字段:

alter table [表名] rename column [字段名A] to [字段名B]; 


15、给一个字段设置缺省值:

alter table [表名] alter column [字段名] set default [新的默认值];


16、去除缺省值:

alter table [表名] alter column [字段名] drop default; 


17、在表中插入数据:

insert into 表名 ([字段名m],[字段名n],......) values ([列m的值],[列n的值],......); 


18、修改表中的某行某列的数据:

update [表名] set [目标字段名]=[目标值] where [该行特征]; 


19、删除表中某行数据:

delete from [表名] where [该行特征]; 

delete from [表名];--删空整个表 


20、创建表:

create table ([字段名1] [类型1] <references 关联表名(关联的字段名)>;,[字段名2] [类型2],......<,primary key (字段名m,字段名n,...)>;); 


21、显示 PostgreSQL 的使用和发行条款

\copyright    


22、显示或设定用户端字元编码

\encoding [字元编码名称]


23、SQL 命令语法上的说明,用 * 显示全部命令

\h [名称]     


24、提示用户设定内部变数

\prompt [文本] 名称


25、修改用户密码

\password [USERNAME]


26、退出 psql

    \q


gpstate

命令     参数   作用 
gpstate -b =》 显示简要状态
gpstate -c =》 显示主镜像映射
gpstart -d =》 指定数据目录(默认值:$MASTER_DATA_DIRECTORY)
gpstate -e =》 显示具有镜像状态问题的片段
gpstate -f =》 显示备用主机详细信息
gpstate -i =》 显示GRIPLUM数据库版本
gpstate -m =》 显示镜像实例同步状态
gpstate -p =》 显示使用端口
gpstate -Q =》 快速检查主机状态
gpstate -s =》 显示集群详细信息
gpstate -v =》 显示详细信息

gpconfig

   命令    参数                              作用
gpconfig -c =》 --change param_name  通过在postgresql.conf 文件的底部添加新的设置来改变配置参数的设置。
gpconfig -v =》 --value value 用于由-c选项指定的配置参数的值。默认情况下,此值将应用于所有Segment及其镜像、Master和后备Master。
gpconfig -m =》 --mastervalue master_value 用于由-c 选项指定的配置参数的Master值。如果指定,则该值仅适用于Master和后备Master。该选项只能与-v一起使用。
gpconfig -masteronly =》当被指定时,gpconfig 将仅编辑Master的postgresql.conf文件。
gpconfig -r =》 --remove param_name 通过注释掉postgresql.conf文件中的项删除配置参数。
gpconfig -l =》 --list 列出所有被gpconfig工具支持的配置参数。
gpconfig -s =》 --show param_name 显示在Greenplum数据库系统中所有实例(Master和Segment)上使用的配置参数的值。如果实例中参数值存在差异,则工具将显示错误消息。使用-s=》选项运行gpconfig将直接从数据库中读取参数值,而不是从postgresql.conf文件中读取。如果用户使用gpconfig 在所有Segment中设置配置参数,然后运行gpconfig -s来验证更改,用户仍可能会看到以前的(旧)值。用户必须重新加载配置文件(gpstop -u)或重新启动系统(gpstop -r)以使更改生效。
gpconfig --file =》 对于配置参数,显示在Greenplum数据库系统中的所有Segment(Master和Segment)上的postgresql.conf文件中的值。如果实例中的参数值存在差异,则工具会显示一个消息。必须与-s选项一起指定。
gpconfig --file-compare 对于配置参数,将当前Greenplum数据库值与主机(Master和Segment)上postgresql.conf文件中的值进行比较。
gpconfig --skipvalidation 覆盖gpconfig的系统验证检查,并允许用户对任何服务器配置参数进行操作,包括隐藏参数和gpconfig无法更改的受限参数。当与-l选项(列表)一起使用时,它显示受限参数的列表。 警告: 使用此选项设置配置参数时要格外小心。
gpconfig --verbose 在gpconfig命令执行期间显示额外的日志信息。
gpconfig --debug 设置日志输出级别为调试级别。
gpconfig -? | -h | --help 显示在线帮助。

gpstart

命令     参数   作用 
gpstart -a => 快速启动|
gpstart -d => 指定数据目录(默认值:$MASTER_DATA_DIRECTORY)
gpstart -q => 在安静模式下运行。命令输出不显示在屏幕,但仍然写入日志文件。
gpstart -m => 以维护模式连接到Master进行目录维护。例如:$ PGOPTIONS='-c gp_session_role=utility' psql postgres
gpstart -R => 管理员连接
gpstart -v => 显示详细启动信息

gpstop

命令     参数   作用 
gpstop -a => 快速停止
gpstop -d => 指定数据目录(默认值:$MASTER_DATA_DIRECTORY)
gpstop -m => 维护模式
gpstop -q => 在安静模式下运行。命令输出不显示在屏幕,但仍然写入日志文件。
gpstop -r => 停止所有实例,然后重启系统
gpstop -u => 重新加载配置文件 postgresql.conf 和 pg_hba.conf
gpstop -v => 显示详细启动信息
gpstop -M fast      => 快速关闭。正在进行的任何事务都被中断。然后滚回去。
gpstop -M immediate => 立即关闭。正在进行的任何事务都被中止。不推荐这种关闭模式,并且在某些情况下可能导致数据库损坏需要手动恢复。
gpstop -M smart     => 智能关闭。如果存在活动连接,则此命令在警告时失败。这是默认的关机模式。
gpstop --host hostname => 停用segments数据节点,不能与-m、-r、-u、-y同时使用

集群恢复

命令     参数   作用 
gprecoverseg -a => 快速恢复
gprecoverseg -i => 指定恢复文件
gprecoverseg -d => 指定数据目录
gprecoverseg -l => 指定日志文件
gprecoverseg -r => 平衡数据
gprecoverseg -s => 指定配置空间文件
gprecoverseg -o => 指定恢复配置文件
gprecoverseg -p => 指定额外的备用机
gprecoverseg -S => 指定输出配置空间文件

激活备库流程

命令     参数   作用 
gpactivatestandby -d 路径 | 使用数据目录绝对路径,默认:$MASTER_DATA_DIRECTORYgpactivatestandby -f | 强制激活备份主机
gpactivatestandby -v | 显示此版本信息

始化备Master

命令     参数   作用 
gpinitstandby -s 备库名称 => 指定新备库
gpinitstandby -D => debug 模式
gpinitstandby -r => 移除备用机



#

---Greenplum能做什么?

数仓 / OLAP / 即席查询

混合负载 / HTAP

流数据

集成数据分析

数据库内嵌机器学习

现代 SQL

---Greenplum 是全球最先进的大数据分析引擎,专为分析、机器学习和AI而打造.

面向数据仓库应用的关系型数据库,基于PostgreSQL开发,跟PostgreSQL的兼容性非常好,大部分PostgreSQL客户端工具及PostgreSQL应用都能运行在GreenPlum平台上。


---如果想在数据仓库中快速查询结果,可以使用greenplum。

Greenplum数据库也简称GPDB。它拥有丰富的特性:

第一,完善的标准支持:GPDB完全支持ANSI SQL 2008标准和SQL OLAP 2003 扩展;从应用编程接口上讲,它支持ODBC和JDBC。完善的标准支持使得系统开发、维护和管理都大为方便。而现在的 NoSQL,NewSQL和Hadoop 对 SQL 的支持都不完善,不同的系统需要单独开发和管理,且移植性不好。

第二,支持分布式事务,支持ACID。保证数据的强一致性。

第三,做为分布式数据库,拥有良好的线性扩展能力。在国内外用户生产环境中,具有上百个物理节点的GPDB集群都有很多案例。

第四,GPDB是企业级数据库产品,全球有上千个集群在不同客户的生产环境运行。这些集群为全球很多大的金融、政府、物流、零售等公司的关键业务提供服务。

第五,GPDB是Greenplum(现在的Pivotal)公司十多年研发投入的结果。GPDB基于PostgreSQL 8.2,PostgreSQL 8.2有大约80万行源代码,而GPDB现在有130万行源码。相比PostgreSQL 8.2,增加了约50万行的源代码。

第六,Greenplum有很多合作伙伴,GPDB有完善的生态系统,可以与很多企业级产品集成,譬如SAS,Cognos,Informatic,Tableau等;也可以很多种开源软件集成,譬如Pentaho,Talend 等。


# 数据库由Master Severs和Segment Severs通过Interconnect互联组成。

 Master节点:是整个系统的控制中心和对外的服务接入点,它负责接收用户SQL请求,将SQL生成查询计划并进行并行处理优化,然后将查询计划分配(dispatch)到所有的Segment节点进行并行处理,协调组织各个Segment节点按照查询计划一步一步地进行并行处理,最后获取到Segment的计算结果,再返回给客户端;从用户的角度看Greenplum集群,看到的只是Master节点,无需关心集群内部的机制,所有的并行处理都是在Master控制下自动完成的。Master节点一般只有一个或两个(互为备份);

Segment节点:是Greenplum执行并行任务的并行运算节点,它接收Master的指令进行MPP并行计算,因此所有Segment节点的计算性能总和就是整个集群的性能,通过增加Segment节点,可以线性化得增加集群的处理性能和存储容量,Segment节点可以是1~10000个节点;

Interconnect:是Master节点与Segment节点、Segment节点与Segment节点之间的数据传输组件,它基于千兆交换机或万兆交换机实现数据在节点间的高速传输;

外部数据加载到Greenplum时,采用并行数据流进行加载,直接加载到Segment节点,这项独特的技术是Greenplum的专有技术,以此保证外部数据在最短时间内加载到数据库中。

---简单来说

Master主机负责:建立与客户端的连接和管理;SQL的解析并形成执行计划;执行计划向Segment的分发收集Segment的执行结果;Master不存储业务数据,只存储数据字典。  

Segment主机负责:业务数据的存储和存取;用户查询SQL的执行。 

---

Master Host:

主节点, 负责协调整个集群

没有数据, 只有用户的元数据

Standby Master: 备份主

Segment Host:

每个Segment都是一个单节点的PostgreSQL数据库。

包含用户的实际数据, 会等待master给它分配实际任务, 然后进行相互协调执行。

每个Segment对应在另外一个节点上会有一个镜像(mirror), 当这台Segment挂了之后, 它的镜像就会自动提升为primary, 从而实现高可用。

可以随着业务的扩充进行线性扩展

每台机器都是独立的, 机器之间通过Interconnect进行网络通讯, 因为又被称为MPP无共享架构。


签名:这个人很懒,什么也没有留下!
最新回复 (0)
返回