暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

OceanBase手动部署三节点OBserver文档

原创 shunwah 2022-02-17
1733

OceanBase手动部署三节点OBserver文档

oceanbase部署请查看历史文章

https://www.modb.pro/db/324460 使用OBD自动部署三节点OceanBase文档

https://www.modb.pro/db/328171 OceanBase手动部署三节点OBserver文档

https://www.modb.pro/db/322997 OceanBase 单节点手动部署OB文档

https://www.modb.pro/db/250245 Docker单节点自动化部署OB集群

机器信息

机器类型主机配置备注
OSCentos 7.4 
中控机 /OBDCPU:8C内存:16G
目标机器 /OBserverCPU:8C内存:32G
系统盘 /dev/vda 100GLVS分区、文件系统:EXT4
数据盘 /datadev/vdb 200GGPT分区、文件系统:xfs
事务日志盘 /redodev/vdc 100GGPT分区、文件系统:xfs

image-20211231154309608

机器划分

角色机器IP备注
OBD172.20.2.131中控机
OBserver172.20.2.120{2881,2882}, {3881,3882} zone1
 172.20.2.121{2881,2882}, {3881,3882} zone2
 172.20.2.122{2881,2882}, {3881,3882} zone3
OBproxy172.20.2.131{2883,2884} 反向代理
OBclient172.20.2.131OB命令行客户端

安装部署版本:

软件名版本备注
libobclientlibobclient-2.0.0-2.el7.x86_64
obclient2.0.0-2.el7.x86_64
obproxy3.2.0-1.el7.x86_64
oceanbase-ce3.1.1-4.el7.x86_64
oceanbase-ce-libs3.1.1-4.el7.x86_64

安装方式:

RPM包手动安装OceanBase

目录规划:

软件包默认安装目录是 : /home/admin/oceanbase 目录结构如下:

/home/admin/oceanbaseobs部署启动目录RPM包自动创建
/home/admin/oceanbase/obobs数据总目录手动创建
/data/obobs数据文件实际目录手动创建连接至数据总目录
/redo/{clog,slog,ilog}事务日志实际目录手动创建连接至数据总目录
/home/admin/oceanbase/etc配置文件启动时在启动目录自动创建
/home/admin/oceanbase/log运行日志目录启动时在启动目录自动创建

一、磁盘配置

1、查看原磁盘df -Th

image-20220213152223376

2、查看待增加磁盘fdisk-l


3、磁盘划分(GPT)分区

使用 parted 技术对 /dev/vdb 进行划分。GPT分区大小请根据实际磁盘大小调整参数。需要登录到每个节点上手动初始化。

yum -y install gdisk cloud-utils-growpart parted e2fsprogs

image-20220213152629075

[root@CAIP120 ~]# parted /dev/sdb
# 将设备转换成GPT分区格式。
(parted) mklabel gpt
#划分一个主分区,并设置分区的开始位置和结束位置
#使用全部空间创建一个主分区(请根据实际创建)。通常于前面留出1M的空余空间。
(parted) mkpart primary 1 100%  
# 检查分区是否对齐(如有多个分区,均需检查),此处显示“1 aligned”表示已对齐。
(parted) align-check optimal 1  
#查看分区表
(parted) print
#退出
(parted) quit

image-20220213152551680

4、此时使用fdisk -l应能查看到分区/dev/sdb1(根据实际显示分区名)。

image-20220213152712367

[root@CAIP120 ~]# fdisk -l
#格式化文件系统(请使用实际的分区名和文件系统类型)
mkfs.xfs /dev/sdb1     --xfs分区格式化
mkfs.ext4 /dev/sdb1    --ext4分区格式化
#创建挂载点目录
[root@CAIP120 /]# mkdir data
#使用blkid查看UUID
[root@CAIP120 ~]# blkid
#备份/etc/fstab,并新增加UUID
vim /etc/fstab
#使用`mount -a`验证fstab配置是否正确。
[root@CAIP120 ~]# mount -a

image-20220213153101198


image-202202131533251335、重复上面操作、同上、依次挂载好对应磁盘和目录

(/data、/redo、)

mkdir -p /data  (/dev/sdb)

mkdir -p /redo   (/dev/sdc)

image-20220213154413084

6、检查划分好的磁盘df -h #检查

image-20211231153558521

二、配置安装用户

1、创建admin用户并设置密码(所有节点都要设置):

[root@CAIP120 /]# useradd -U admin -d /home/admin -s /bin/bash && echo "Sixlens2881" |passwd --stdin admin

image-20220213154453771

2、更改目录属主属组权限:

[root@CAIP120 /]# chown -R admin.admin /data && chown -R admin.admin /redo && chown -R admin.admin /home/admin

image-20220213154543228

Note:先创建admin用户,后mount挂载/home/admin/ocaeabase 否则创建用户提示家目录存在

3、用户 admin 授予 sudo 权限配置:

[root@CAIP120 /]# vim /etc/sudoers
## Allow root to run any commands anywhere
admin    ALL=(ALL)       ALL

image-20220213154720447

Note:sudoers拒绝所有用户读写,root用户也无权限,需增加权限后更改 #chmod u+w /etc/sudoers

三、初始化服务器环境

1、配置 SSH 免密登录

手动部署 OceanBase 集群,相应节点上安装软件包,并启动 observer 或 obproxy 进程,不需要配置 SSH 免密登录。自动化技术部署 OceanBase 集群,则需要一台中控机,中控机的用户 admin 到 OBSERVER 节点的用户 admin 的免密登录:

  • 在中控机生成 RSA 或 DSA 公钥和私钥
$ ssh-keygen -t rsa  #在中控机131执行
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
$ mkdir ~/.ssh  #在Observer3个节点建立隐藏ssh目录
$ scp ~/.ssh/authorized_keys admin@172.20.2.116-118:~/.ssh/authorized_keys #中控机复制到目标机器

image-20211231165737696


目标机器授权(所有目标节点)

$ chmod 700 .ssh  --目标机器执行
$ chmod 600 .ssh/authorized_keys  --目标机器执行

image-20220213161916554

Note:root用户配置免密可直接登录,普通用户需更改目录和文件权限,否则无法登陆

$ for i in 120 121 122;do ssh 172.20.2.$i date;done --中控机执行免密连接测试

image-20220213162041256

2、配置时间同步服务

(中控节点作为时间服务器,以root身份配置):

  • 判断是否使用 ntpd同步时间。

    [root@CAIP131 ~]# systemctl status ntpd
    Unit ntpd.service could not be found.    #未安装
    

    image-20220213184441861

    安装 chrony配置时间同步服务,CentOS 或 RedHat 7.x 版本推荐使用 chrony 服务做时间源

# yum remove ntp -y
# yum -y install chrony
# vim /etc/chrony.conf
server ntp1.aliyun.com iburst
driftfile /var/lib/chrony/drift
makestep 1.0 3
rtcsync
logdir /var/log/chrony
allow all
stratumweight 0
local stratum 10

image-20220213184547823

[root@CAIP131 ~]# systemctl start chronyd && systemctl enable chronyd && systemctl status chronyd
  #设置开机自启

image-20220213184810901

客户端配置(所有目标节点):

[root@CAIP120 /]# echo "* * * * * /sbin/ntpdate -u 172.20.2.131 2>&1 1>>/tmp/ntpdate.log" >> /var/spool/cron/root

image-20220213185422051

中控机检查时间同步(中控机执行)

[root@CAIP131 ~]# for i in 120 121 122 ;do clockdiff 172.20.2.$i;done
检查和目标节点时间误差常用命令是: clockdiff

image-20220213185757869

客户端检查时间同步(所有目标节点)

[root@CAIP120 /]# clockdiff 172.20.2.131  #目标机到中控机之间时间同步检查

image-20220213190203699

# ping -T tsandaddr 172.20.2.131  --如果有机子clockdiff报错,使用tsandaddr
[admin@CAIP120 oceanbase]$ ping -T tsandaddr 172.20.2.131 -c 2

image-20220213190538369

3、修改会话变量设置

全局修改配置limits.conf(所有目标节点)最大文件句柄数设置为 655350,Core 文件大小设置为 unlimited 。

[root@CAIP120 /]# vim /etc/security/limits.conf
root soft nofile 655350
root hard nofile 655350
* soft nofile 655350
* hard nofile 655350
* soft stack 20480
* hard stack 20480
* soft nproc 655360
* hard nproc 655360
* soft core unlimited
* hard core unlimited

image-20220213190728969

出当前会话,重新登录。执行 # ulimit -a,查看配置是否生效:

4、内核参数修改

修改配置文件vim /etc/sysctl.conf

# cat /etc/sysctl.conf |grep ^[^#] 
fs.aio-max-nr=1048576
net.core.somaxconn = 2048
net.core.netdev_max_backlog = 10000 
net.core.rmem_default = 16777216 
net.core.wmem_default = 16777216 
net.core.rmem_max = 16777216 
net.core.wmem_max = 16777216
net.ipv4.ip_local_port_range = 3500 65535 
net.ipv4.ip_forward = 0 
net.ipv4.conf.default.rp_filter = 1 
net.ipv4.conf.default.accept_source_route = 0 
net.ipv4.tcp_syncookies = 0 
net.ipv4.tcp_rmem = 4096 87380 16777216 
net.ipv4.tcp_wmem = 4096 65536 16777216 
net.ipv4.tcp_max_syn_backlog = 16384 
net.ipv4.tcp_fin_timeout = 15 
net.ipv4.tcp_max_syn_backlog = 16384 
net.ipv4.tcp_tw_reuse = 1 
net.ipv4.tcp_tw_recycle = 1 
net.ipv4.tcp_slow_start_after_idle=0
vm.swappiness = 0
vm.min_free_kbytes = 2097152
[root@CAIP120 /]# sysctl -p   --加载配置,使配置生效

image-20220213190910406

5、关闭防火墙和 SELinux

查看防火墙状态

[root@CAIP120 /]# systemctl status firewalld

image-20220213191029699

如果是 inactive 那就不用管。如果是 active,那就永久关闭

systemctl stop firewalld
systemctl disable firewalld 
systemctl status firewalld

关闭 SELinux

修改 SELinux 配置文件中的 SELINUX 选项。

vi /etc/selinux/config

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled

image-20220213191059206

配置文件修改后只会重启主机后生效,还需要使用下面命令立即生效。

setenforce 0

6、安装相关工具软件

yum install epel-release -y
yum install -y net-tools lrzsz tree htop dstat sysvinit-tools

查看 OBSERVER 进程特点
yum -y install sysvinit-tools
ps -ef|grep observer
查看进程监听端口
yum install -y net-tools
netstat -ntlp
查看 OceanBase 工作目录结构
yum -y install tree
tree /root/ob
tree /root/obce/

image-20220213191924818

四、安装部署

1、新建soft软件包临时目录(切换admin用户)

[root@CAIP121 /]# su - admin
[admin@CAIP121 ~]$ mkdir ~/soft

image-20220217104248414

创建oceanbase目录,配置软连接:

[admin@CAIP120 ~]$ mkdir -p ~/oceanbase/store/obdemo  /data/obdemo/{sstable,etc3} /redo/obdemo/{clog,ilog,slog,etc2}
[admin@CAIP120 ~]$ for f in {clog,ilog,slog,etc2}; do ln -s /redo/obdemo/$f ~/oceanbase/store/obdemo/$f ; done
[admin@CAIP120 ~]$ for f in {sstable,etc3}; do ln -s /data/obdemo/$f ~/oceanbase/store/obdemo/$f; done

image-20220217104346875

2、OceanBase 软件包下载:

2.1、OB阿里云RPM包下载地址

https://mirrors.aliyun.com/oceanbase/community/stable/el/7/x86_64/

image-20220212113954911

2.2、安装 OceanBase 软件包

目标机器准备好OceanBase 的 RPM 包,安装oceanbase-ce oceanbase-ce-libs libobclient obclient

image-20220217104800304

[admin@CAIP121 soft]$ sudo rpm -ivh *.rpm  #一键安装软件包
rpm -ivh libobclient-2.0.0-2.el7.x86_64.rpm
rpm -ivh oceanbase-ce-libs-3.1.1-4.el7.x86_64.rpm
rpm -ivh oceanbase-ce-3.1.1-4.el7.x86_64.rpm
rpm -ivh obproxy-3.2.0-1.el7.x86_64.rpm
rpm -ivh obclient-2.0.0-2.el7.x86_64.rpm

image-20220217114946443

2.3、查询已安装RPM包

[admin@CAIP121 soft]$ rpm -ql oceanbase-ce-libs-3.1.1-4.el7
[admin@CAIP121 soft]$ rpm -ql libobclient-2.0.0-2.el7
[admin@CAIP121 soft]$ rpm -ql obclient-2.0.0-2.el7
[admin@CAIP121 soft]$ rpm -ql oceanbase-ce-3.1.1-4.el7
[admin@CAIP121 soft]$ rpm -ql obproxy-3.2.0-1.el7

image-20220217104908222

image-20220217105032667

软件包默认安装目录是 : /home/admin/oceanbase

2.4、检查目录结构,目录结构如下:

[admin@CAIP121 soft]$ tree ~/oceanbase/store/ /data/ /redo/

image-20220217105130059

五、启动 OBSERVER

1、启动三节点OBSERVER

1.1、启动172.20.2.120 (zone1)

echo 'export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:~/oceanbase/lib' >> ~/.bash_profile
. ~/.bash_profile

cd ~/oceanbase && bin/observer -i ens192 -p 2881 -P 2882 -z zone1 -d ~/oceanbase/store/obdemo -r '172.20.2.120:2882:2881;172.20.2.121:2882:2881;172.20.2.122:2882:2881' -c 20220217 -n obdemo -o "memory_limit=24G,cache_wash_threshold=8G,__min_full_resource_pool_memory=268435456,system_memory=3G,memory_chunk_cache_size=128M,cpu_count=16,net_thread_count=4,datafile_size=50G,stack_size=1536K,config_additional_dir=/data/obdemo/etc3;/redo/obdemo/etc2"

1.2、启动172.20.2.121 (zone2)

echo 'export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:~/oceanbase/lib' >> ~/.bash_profile
. ~/.bash_profile

cd ~/oceanbase && bin/observer -i ens192 -p 2881 -P 2882 -z zone2 -d ~/oceanbase/store/obdemo -r '172.20.2.120:2882:2881;172.20.2.121:2882:2881;172.20.2.122:2882:2881' -c 20220217 -n obdemo -o "memory_limit=24G,cache_wash_threshold=8G,__min_full_resource_pool_memory=268435456,system_memory=3G,memory_chunk_cache_size=128M,cpu_count=16,net_thread_count=4,datafile_size=50G,stack_size=1536K,config_additional_dir=/data/obdemo/etc3;/redo/obdemo/etc2"

1.3、启动172.20.2.122 (zone3)

echo 'export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:~/oceanbase/lib' >> ~/.bash_profile
. ~/.bash_profile

cd ~/oceanbase && bin/observer -i ens192 -p 2881 -P 2882 -z zone3 -d ~/oceanbase/store/obdemo -r '172.20.2.120:2882:2881;172.20.2.121:2882:2881;172.20.2.122:2882:2881' -c 20220217 -n obdemo -o "memory_limit=24G,cache_wash_threshold=8G,__min_full_resource_pool_memory=268435456,system_memory=3G,memory_chunk_cache_size=128M,cpu_count=16,net_thread_count=4,datafile_size=50G,stack_size=1536K,config_additional_dir=/data/obdemo/etc3;/redo/obdemo/etc2"

如果三个节点机型都一致,那么启动参数里只有一个参数不一样,就是 -z 指定该节点是哪个 zone

image-20220217133611051

1.2、验证服务是否启动:

[admin@CAIP121 oceanbase]$ ps aux |grep obs
[admin@CAIP121 oceanbase]$ pidof observer

image-20220217133639914

2、集群自举(初始化)

当 OceanBase 集群三个节点都正常启动,并且监听正常时,中控机连接到任一节点(通过 2881 端口直连),进行自举(bootstrap 集群初始化)操作。 初始密码是空

[admin@CAIP131 ~]$ obclient -h 172.20.2.121 -u root -P 2881 -p -c -A

image-20220217134113466

初始化操作

MySQL [(none)]> set session ob_query_timeout=1000000000; alter system bootstrap ZONE 'zone1' SERVER '172.20.2.120:2882', ZONE 'zone2' SERVER '172.20.2.121:2882', ZONE 'zone3' SERVER '172.20.2.122:2882' ;

image-20220217134219626

root@sys系统租户登录

[admin@CAIP131 ~]$ obclient -h 172.20.2.121 -u root@sys -P 2881 -p -c -A
#bootstrap集群初始化成功后可以用root@sys系统租户连入

image-20220217134400136

检查数据库

MySQL [(none)]> show databases; 

image-20220217134541895

3、设置系统租户密码

集群管理员root@sys的密码默认是空的,这里需要给root@sys租户设置一个密码。

MySQL [(none)]> alter user root identified by 'sixlens2881';

image-20220217134725757

3.1、使用root@sys登陆数据库:#测试密码连接

[admin@CAIP131 ~]$ obclient -h 172.20.2.121 -uroot@sys -P 2881 -psixlens2881 -c -A oceanBase

image-20220217134846998

3.2查看集群状态:

MySQL [oceanBase]> select * from __all_server;

image-20220217134952024

3.3、创建proxyr用户

在OceanBase 集群上创建proxyr用户OBPROXY 用户名(proxyro)密码默认OBPROXY 连接 OceanBase 集群使用用户 proxyro 。这个用户不存在,需要创建:

MySQL [oceanBase]> grant select on oceanbase.* to proxyro identified by 'sixlens2881';

image-20220217135058053

六、安装 OBPROXY 软件包

1、官网下载 OBPROXY 软件包

https://open.oceanbase.com/softwareCenter/community

image-20220217135944217

手动部署,需要安装 OceanBase 的 OBPROXY 软件 。部署obproxy(中控机):

[admin@CAIP131 ~]$ sudo rpm -ivh obproxy-3.2.0-1.el7.x86_64.rpm 

image-20220217135735430

2、启动 OBPROXY

[admin@CAIP131 ~]$ cd ~/obproxy-3.2.0 && bin/obproxy -r "172.20.2.120:2881;172.20.2.121:2881;172.20.2.122:2881" -p 2883 -o "enable_strict_kernel_release=false,enable_cluster_checkout=false,enable_metadb_used=false" -c obdemo

启动-c 指定的集群名obdemo和OBserver的集群名保持一致才能启动

3、检查 OBPROXY, 监听进程正常

进程 obproxy 默认会监听2个端口:2883 和 2884 。

ps -ef|grep obproxy
netstat -ntlp |grep obproxy

image-20220217140356614

4、登录 OBPROXY 修改密码,(中控机)安装obclient,方便测试连接:

登录用户名:root@proxysys, 端口:2883 ,初始密码:空。

[admin@CAIP131 obproxy-3.2.0]$ obclient -h 172.20.2.131 -u root@proxysys -P 2883 -p

image-20220217140710262

5、修改 OBPROXY 管理密码

MySQL [(none)]> show proxyconfig like '%sys_password%';
MySQL [(none)]> alter proxyconfig set obproxy_sys_password = 'sixlens123';

image-20220217140857620

6、 测试OBPROXY 管理密码连接

[admin@CAIP131 obproxy-3.2.0]$ obclient -h 172.20.2.131 -u root@proxysys -P 2883 -psixlens123

image-20220217141127706

7、修改 OBPROXY 连接 OceanBase 集群用户 proxyro 的密码

 OBPROXY 才能跟 OceanBase 集群正常连接。###这个密码就是前面 OceanBase 集群初始化后创建的用户 proxyro 的密码
MySQL [(none)]> alter proxyconfig set observer_sys_password = 'sixlens2881';

image-20220217145150322

8、通过 OBPROXY 连接 OceanBase , 如果能查看所有会话,则说明 OBPROXY 部署成功

[admin@CAIP131 ~]$ obclient -h172.20.2.131 -uroot@sys#obdemo -P2883 -psixlens2881 -c -A oceanbase

image-20220217142523576

MySQL [oceanbase]> show processlist;
MySQL [oceanbase]> show full processlist;

七、资源池-租户-用户-创建及测试

1、查询系统资源总计资源

SELECT svr_ip,svr_port, cpu_total, mem_total/1024/1024/1024, disk_total/1024/1024/1024, zone FROM __all_virtual_server_stat;

image-20220217151222496

查询租户已分配资源:

MySQL [oceanbase]> SELECT sum(c.max_cpu), sum(c.max_memory)/1024/1024/1024 FROM __all_resource_pool as a, __all_unit_config AS c WHERE a.unit_config_id=c.unit_config_id;

image-20220217151340675

Note:资源池cpu共14c/21g/50G 租户已用 5c/1.5G 新建租户最大可用为 9c/19.5g(超分会报错)

2、创建资源单元(6c/8g/50G):

MySQL [oceanbase]> CREATE RESOURCE UNIT unitsixlens max_cpu = 6, max_memory = '8G', min_memory = '8G', max_iops = 100000, min_iops = 100000, max_session_num = 30000, max_disk_size = '50G';

image-20220217152306061

查看新创建的资源单元

MySQL [oceanbase]> SELECT unit_config_id,name,max_cpu,min_cpu,max_memory,min_memory,max_disk_size FROM __all_unit_config;

image-20220217152349437

3、创建资源池:

MySQL [oceanbase]> CREATE RESOURCE POOL poolsixlens UNIT = 'unitsixlens', UNIT_NUM = 1,ZONE_LIST = ('zone1', 'zone2', 'zone3');

image-20220217152422559

4、创建租户:

MySQL [oceanbase]> create tenant tenantsixlens resource_pool_list=('poolsixlens'), charset=utf8mb4, replica_num=3, zone_list('zone1', 'zone2', 'zone3'), primary_zone=RANDOM, locality='F@zone1,F@zone2,F@zone3' set variables ob_compatibility_mode='mysql', ob_tcp_invited_nodes='%';

image-202202171524516155、查看创建成功的租户:

MySQL [oceanbase]> select tenant_id,tenant_name,primary_zone from __all_tenant;

image-20220217152520093

6、登录新创建的tenantsixlens租户(默认租户密码为空):

[admin@CAIP131 ~]$ obclient -h172.20.2.131 -uroot@tenantsixlens#obdemo -P2883 -c -A oceanbase

image-20220217155229707

创建用户 设置用户tenantsixlens的密码

MySQL [oceanbase]> CREATE USER 'usersixlens' IDENTIFIED BY 'Pwd123#';

image-20220217155508360

查看创建成功的用户

MySQL [oceanbase]> SELECT user FROM mysql.user; 

image-20220215095917297

授权用户

MySQL [oceanbase]> GRANT ALL PRIVILEGES ON *.* TO usersixlens WITH GRANT OPTION;

image-20220217160556664

查看用户授权

MySQL [oceanbase]> show grants for usersixlens;

image-20220217160636042

用于登录测试:

[admin@CAIP131 ~]$ obclient -h172.20.2.131 -uusersixlens@tenantsixlens#obdemo -pPwd123# -P2883 -c -A oceanbase

image-20220217160914203

7、连接白名单设置(否则只能127登录)sys租户

[admin@CAIP131 ~]$ obclient -h172.20.2.131 -uroot@sys#obdemo -P2883 -psixlens2881 -c -A oceanbase

image-20220217161242135

tenantsixlens连接白名单设置

MySQL [oceanbase]> ALTER TENANT tenantsixlens SET VARIABLES ob_tcp_invited_nodes='%'; 

image-20220217161301829

8、使用租户新用户登录OB集群测试建库建表:

[admin@CAIP131 ~]$ obclient -h172.20.2.131 -uusersixlens@tenantsixlens#obdemo -pPwd123# -P2883 -c -A oceanbase

image-20220217161611095

使用新用户usersixlens登录,创建测试表:

MySQL [(none)]> create database sixlens;
MySQL [(none)]> use sixlens;    #需要进入新创建的数据库,否则会报错
MySQL [sixlens]> CREATE TABLE sixlens (id int,name varchar(20));
MySQL [sixlens]> insert into sixlens(id,name) values(20220217,"obtest");
MySQL [sixlens]> show tables;
MySQL [sixlens]> select * from sixlens;

image-20220217162027500

 

最后修改时间:2022-03-04 16:14:08
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论