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

磐维分布式数据库3.0.1安装部署

原创 飞天 2024-11-24
1835

1、磐维数据库介绍

磐维数据库,简称"PanWeiDB"。是中国移动信息技术中心首个基于中国本土开源数据库打造的面向ICT基础设施的自研数据库产品。其产品内核能力基于华为openGauss开源软件,并进一步提升了系统稳定性。
磐维数据库具有高性能、高可靠、高安全、高兼容等特点,能够满足复杂多变的业务需求。磐维数据库提供了自动化、流程化的解决方案,实现了一键式数据迁移。这种高效的数据迁移方式不仅提高了迁移数据的效率,也降低了操作难度,为用户带来了极大的便利。

磐维数据库包括集中式和分布式,本文主要介绍磐维分布式数据库3.0.1安装部署过程,供大家参考。

2、环境要求

2.1 硬件环境要求

image.png
推荐服务器配置,如表 2-2 所示:
image.png

2.2 软件环境要求

推荐如下软件类型及版本:
image.png

2.3 软件依赖要求

安装 PanWeiDB 3.0.1 的软件依赖要求,见表 2-4 所示。
建议使用上述操作系统源中依赖软件的默认安装包。若默认安装包不存在,可参照软件对应的建议版本,单独进行下载安装。
image.png
image.png

3、部署规划

磐维分布式数据库采用 share nothing 架构,计算节点和存储节点分离,节点间通过高速网络进行通信。所有节点都有主从互备,确保系统的高可用性。逻辑架构如下图所示。
image.png

说明:出于安全需要,本文中的ip地址都用*.*代替,大家在实际部署过程中要换成真实的ip地址。
本文中使用了三台虚拟机,配置如下:

主机名 ip地址 OS版本 内存、CPU
node1 192.*.*.60 Centos7.9 4G 、 1个双核
node2 192.*.*.62 Centos7.9 4G 、 1个双核
node3 192.*.*.64 Centos7.9 4G 、 1个双核

部署规划如下:

节点类型 节点名称 节点 IP 端口 代理端口 角色 工作路径 work_dir
gha_server gha_server1 192.*.*.60 20001 - - -
dcs - 192.*.*.60 2379 - - -
dcs - 192.*.*.62 2379 - - -
dcs - 192.*.*.64 2379 - - -
gtm gtm1 192.*.*.60 6666 8001 /data/gtm/gtm1
gtm gtm2 192.*.*.62 6666 8002 /data/gtm/gtm2
coordinator cn1 192.*.*.62 5432 8003 /data/coord/cn1
coordinator cn2 192.*.*.64 5432 8004 /data/coord/cn2
datanode dn1_1 192.*.*.62 15432 8005 /data/dn1/dn1_1
datanode dn1_2 192.*.*.64 15432 8006 /data/dn1/dn1_2
datanode dn1_3 192.*.*.60 15432 8007 /data/dn1/dn1_3
datanode dn2_1 192.*.*.64 20001 8008 /data/dn1/dn2_1
datanode dn2_2 192.*.*.60 20001 8009 /data/dn1/dn2_2
datanode dn2_3 192.*.*.62 20001 8010 /data/dn1/dn2_3

4、安装准备

4.1 检查系统依赖包

rpm -q bison flex patch bzip2

如果缺少依赖包,配置好yum源进行安装:

yum install -y bison flex patch bzip2

4.2 检查是否支持 rdtscp 指令集

cat /proc/cpuinfo | grep rdtscp

4.3 创建用户和组、配置sudoer

创建用户和组:
groupadd dbgrp
useradd -m -d /home/omm omm -g dbgrp
passwd omm
返回并设置密码

配置sudoer:
# visudo
进入编辑模式,添加 omm 用户及权限:
omm ALL=(ALL) NOPASSWD:ALL
保存并退出。

4.4 关闭防火墙

systemctl status firewalld.service
sudo systemctl stop firewalld.service
sudo systemctl disable firewalld.service

4.5 关闭 SELINUX

检查selinux是否已关闭:
sestatus
如果系统提示以下信息,说明 selinux 已被禁用:
SELinux status: disabled
否则,执行下面命令关闭selinux:
sed -i 's/^SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
重启服务器生效。

临时生效方法:
setenforce 0

4.6 同步系统时间

PanWeiDB 分布式数据库系统,需要各节点间时间同步,来保证数据库一致性。一般采用 NTP 服务方式来保证各节点间的时间同步。检查和配置 NTP 服务的操作步骤如下:

(1) 检查服务器是否安装 NTP 服务以及是否正常运行:
systemctl status ntpd.service
若 NTP 服务未处于正常运行状态,执行rpm -qa|grep ntp:
如果没有 ntp 显示,则应删除原有 ntpdate 后重新安装 ntp:
yum -y remove ntpdate-4.2.6p5-29.el7.centos.x86_64
yum -y install ntp
(2) 配置 NTP 服务
1、node1节点(192.*.*.60)作为 server
执行vi /etc/ntp.conf
添加内容:
restrict 192.*.*.60 nomodify notrap nopeer noquery
server 127.127.1.0
Fudge 127.127.1.0 stratum 10
注释:
#server 0.centos.pool.ntp.org iburst
#server 1.centos.pool.ntp.org iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst

2、node2节点(192.*.*.62)执行vi /etc/ntp.conf
添加内容:
restrict 192.*.*.62 nomodify notrap nopeer noquery
server 192.*.*.60
Fudge 192.*.*.60 stratum 10
注释:
#server 0.centos.pool.ntp.org iburst
#server 1.centos.pool.ntp.org iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst

3、node3节点(192.*.*.64)执行vi /etc/ntp.conf
添加内容:
restrict 192.*.*.64 nomodify notrap nopeer noquery
server 192.*.*.60
Fudge 192.*.*.60 stratum 10
注释:
#server 0.centos.pool.ntp.org iburst
#server 1.centos.pool.ntp.org iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst

4、三个节点都执行:
systemctl stop ntpd
systemctl start ntpd
systemctl status ntpd
systemctl enable ntpd

5、配置完毕后,在各节点执行以下命令,查看 NTP 服务是否连通。
ntpstat
NTP 主节点应返回:
synchronised to local net (127.127.1.0) at stratum 6
time correct to within 11 ms
polling server every 64 s
NTP 其他节点应返回:
synchronised to NTP server (192.68.100.60) at stratum 7
time correct to within 28 ms
polling server every 128 s

4.7 配置系统内核参数

vi /etc/sysctl.conf 加入:
kernel.sem = 40960 2048000 40960 20480
保存并退出
sysctl -p

4.8 关闭THP

#检查THP开启情况
cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]

##关闭THP
echo never > /sys/kernel/mm/transparent_hugepage/enabled
## 设置重启后自动关闭
chmod +x /etc/rc.d/rc.local
systemctl enable rc-local.service

cat >> /etc/rc.d/rc.local <<EOF
swapoff -a
if test -f /sys/kernel/mm/transparent_hugepage/enabled;
then
   echo never > /sys/kernel/mm/transparent_hugepage/enabled
fi
if test -f /sys/kernel/mm/transparent_hugepage/defrag;
then
  echo never > /sys/kernel/mm/transparent_hugepage/defrag
fi
EOF

4.9 关闭RemoveIPC

1、 修改/etc/systemd/logind.conf文件中的“RemoveIPC”值为“no”
vim  /etc/systemd/logind.conf
RemoveIPC=no
2、修改/usr/lib/systemd/system/systemd-logind.service文件中的“RemoveIPC”值为“no”
vim /usr/lib/systemd/system/systemd-logind.service
RemoveIPC=no       #没有参数,添加到末尾
3、 重启服务
systemctl daemon-reload
systemctl restart systemd-logind.service
4、 结果验证确认
loginctl show-session | grep RemoveIPC
systemctl show systemd-logind | grep RemoveIPC

4.10 配置互信

在所有节点创建 omm 用户免密登录。需在所有节点使用 omm 用户,进行以下操作:

# su - omm
$ mkdir ~/.ssh
$ chmod 700 ~/.ssh
$ ssh-keygen -t rsa
将公钥文件上传至同集群所有节点(包括本节点),即可实现免密登录(此操作需输入密码):
$ ssh-copy-id omm@192.*.*.60
$ ssh-copy-id omm@192.*.*.62
$ ssh-copy-id omm@192.*.*.64

验证互信

所有节点执行下面命令都不需要输入密码,即互信正常。
$ ssh 192.*.*.60 date
Sun Nov 24 20:57:59 CST 2024
$ ssh 192.*.*.62 date
Sun Nov 24 20:58:04 CST 2024
$ ssh 192.*.*.64 date
Sun Nov 24 20:58:08 CST 2024

5、安装部署

以下流程操作仅在第一台主机上进行。为保证正常使用,请申请 license 文件,永久生效。使用方法为:在 GTM 节点目录(例如本文中为/data/gtm/gtm1)下创建 pw_license 目录,并将向技术人员申请license 文件放置此目录中,重启后生效。

安装部署流程为:创建目录、准备安装包、编辑 yml 文件、预检查、安装。

5.1 创建安装目录

在第一台主机上创建 PanWeiDB 分布式数据库的安装目录。配置文件中 pkg_path 参数值需与安装目录保持一致。

mkdir -p /data/omm_package

5.2 准备安装包

将数据库安装文件上传到第一台主机的安装目录/data/omm_package/,并解压:

[omm@node1 omm_package]$ cd /data/omm_package/
[omm@node1 omm_package]$ ll
total 247244
-rw-r--r-- 1 omm dbgrp 253177558 Nov 24 15:37 PanWeiDB_V2.0_dist_S3.0.1_B01_x86_64.tar.gz
[omm@node1 omm_package]$ tar -xvf PanWeiDB_V2.0_dist_S3.0.1_B01_x86_64.tar.gz 
[omm@node1 omm_package]$ tar -xvf PanWeiDB_V2.0_dist_S3.0.1_B01_x86_64_om.tar.gz

5.3 编辑 yml 文件

编辑集群配置文件。 模板配置文件默认在安装目录中(例如/data/omm_package)。

[omm@node1 omm_package]$ pwd
/data/omm_package
[omm@node1 omm_package]$ ls -l panwei.yml
-rw-r--r-- 1 omm dbgrp 2565 Sep 25 16:57 panwei.yml

编辑 panwei.yml 配置文件,修改后的结果如下:

[omm@node1 omm_package]$ cat panwei.yml
ha_server:
  - ha_server1:
      host: 192.*.*.60
      port: 20001
dcs:
  - host: 192.*.*.60
    port: 2379
  - host: 192.*.*.62
    port: 2379
  - host: 192.*.*.64
    port: 2379
gtm:
  - gtm1:
      host: 192.*.*.60
      agent_host: 192.*.*.60
      role: primary
      port: 6666
      agent_port: 8001
      work_dir: /data/gtm/gtm1
  - gtm2:
      host: 192.*.*.62
      agent_host: 192.*.*.62
      role: standby
      port: 6666
      agent_port: 8002
      work_dir: /data/gtm/gtm2
coordinator:
  - cn1:
      host: 192.*.*.62
      agent_host: 192.*.*.62
      role: primary
      port: 5432
      agent_port: 8003
      work_dir: /data/coord/cn1
  - cn2:
      host: 192.*.*.64
      agent_host: 192.*.*.64
      role: primary
      port: 5432
      agent_port: 8004
      work_dir: /data/coord/cn2
datanode:
  - dn1:
      - dn1_1:
          host: 192.*.*.62
          agent_host: 192.*.*.62
          role: primary
          port: 15432
          agent_port: 8005
          work_dir: /data/dn1/dn1_1
      - dn1_2:
          host: 192.*.*.64
          agent_host: 192.*.*.64
          role: standby
          port: 15432
          agent_port: 8006
          work_dir: /data/dn1/dn1_2
      - dn1_3:
          host: 192.*.*.60
          agent_host: 192.*.*.60
          role: standby
          port: 15432
          agent_port: 8007
          work_dir: /data/dn1/dn1_3
  - dn2:
      - dn2_1:
          host: 192.*.*.64
          agent_host: 192.*.*.64
          role: primary
          port: 20010
          agent_port: 8008
          work_dir: /data/dn2/dn2_1
          # numa:
          #   cpu_node_bind: 0,1
          #   mem_node_bind: 0,1
      - dn2_2:
          host: 192.*.*.60
          agent_host: 192.*.*.60
          role: standby
          port: 20010
          agent_port: 8009
          work_dir: /data/dn2/dn2_2
          # numa:
          #   cpu_node_bind: 2
          #   mem_node_bind: 2
      - dn2_3:
          host: 192.*.*.62
          agent_host: 192.*.*.62
          role: standby
          port: 20010
          agent_port: 8010
          work_dir: /data/dn2/dn2_3
          # numa:
          #   cpu_node_bind: 3
          #   mem_node_bind: 3
env:
  # cluster_type allowed values: multiple-nodes, single-inst, default is multiple-nodes
  cluster_type: multiple-nodes
  pkg_path: /data/omm_package
  prefix: /data/omm_db
  version: V2.0_dist_S3.0.1_B01
  user: omm
  port: 22
  third_ssh: false
# constant:
#   virtual_ip: 100.0.1.254/24
[omm@node1 omm_package]$ 

5.4 预检查

完成两层安装包解压后,会在安装目录下生成 script 子目录。执行 ha_preinstall 命令进行环境配置,包括建立用户互信、安装前环境检查和环境修复功能。

安装前环境检查

[omm@node1 ~]$ cd /data/omm_package/script/
[omm@node1 script]$ ./ha_preinstall -i A -h 192.*.*.60,192.*.*.62,192.*.*.64 -u omm -p 22
Checking items:
    A1. [ OS version status ]                                   : Normal
    A2. [ Kernel version status ]                               : Normal
    A3. [ Unicode status ]                                      : Normal
    A4. [ Time zone status ]                                    : Normal
    A5. [ Swap memory status ]                                  : Normal
    A6. [ Bash type ]                                           : Normal
    A7. [ System limits ]                                       : Normal
    A8. [ Disk configuration status ]                           : Normal
    A9. [ Pre-read block size status ]                          : Normal
    A10.[ IO scheduler status ]                                 : Normal
    A11.[ Network card configuration status ]                   : Normal
    A12.[ Time consistency status ]                             : Normal
    A13.[ Firewall/Ufw service status ]                         : Normal
    A14.[ THP service status ]                                  : Normal
    A15.[ SELinux status ]                                      : Normal
    A16.[ Dependency version ]                                  : Normal
    A17.[ Sudo privilege ]                                      : Normal
    A18.[ Command permission ]                                  : Normal
Total numbers:18. Abnormal numbers:0. Warning numbers:0.

5.5 安装数据库

完成两层安装包解压后,会在安装目录下生成 script 子目录。执行 ha_ctl 命令安装PanWeiDB 分布式数据库。语法格式为:
ha_ctl install <-c cluster> <-p confpath>
其中参数说明:

  • -c 参数:指定数据库集群名称,为可选字段。缺省默认值 panwei。
  • -p 参数:指定配置文件保存路径,为可选字段。

注意:

  • 集群名需与配置文件名保持一致。
  • 安装完成后,不要删除 ha_ctl 命令文件所在的 script 目录,否则将导致运维命令丢失。
  • 安装数据库时环境变量尚未配置,需进入 script 目录执行 ha_ctl 命令。安装成功后,可在任意目录下以 omm 用户执行 ha_ctl 命令。
./ha_ctl install -c panwei -p /data/omm_package

执行结果如下:

[omm@node1 script]$ ./ha_ctl install -c panwei -p /data/omm_package
{
    "ret":0,
    "msg":"Success"
}

这一步在虚拟机里面花费8分钟,物理机上会更快。

6、集群管理

6.1 数据库状态监控

登录任一节点都可以执行。
语法:

ha_ctl monitor all/server/gtm/coordinator/datanode/dcs <-c cluster> <-H> -l dcslist

其中参数说明:

  • -c 参数:表示数据库名称,为可选字段。缺省默认值 panwei。
  • dcslist 为 DCS 地址,一般情况下可以只列出一个节点地址,其他节点会自动同步消息。为了保证高可用,也可以列出所有节点地址。
  • -H 参数:如指定该参数,则集群状态结果以表格形式展示。
    running:节点处于正常运行状态
    stopped:节点处于正常停止状态
    unstable:节点处于不稳定的中间状态。检查故障处理。

命令执行结果如下:

[omm@node1 ~]$ ha_ctl monitor all -l http://192.*.*0.60:2379 -H
+----+------------+----------------+-------+---------+--------+
| No |    name    |      host      |  port |  state  | leader |
+----+------------+----------------+-------+---------+--------+
| 0  | ha_server1 | 192.*.*.60 | 20001 | running |  True  |
+----+------------+----------------+-------+---------+--------+
+----+------+----------------+------+----------------+---------+---------+
| No | name |      host      | port |    work_dir    |  state  |   role  |
+----+------+----------------+------+----------------+---------+---------+
| 0  | gtm1 | 192.*.*.60 | 6666 | /data/gtm/gtm1 | running | primary |
| 1  | gtm2 | 192.*.*.62 | 6666 | /data/gtm/gtm2 | running | standby |
+----+------+----------------+------+----------------+---------+---------+
+----+------+----------------+------+-----------------+---------+---------+
| No | name |      host      | port |     work_dir    |  state  |   role  |
+----+------+----------------+------+-----------------+---------+---------+
| 0  | cn1  | 192.*.*.62 | 5432 | /data/coord/cn1 | running | primary |
| 1  | cn2  | 192.*.*.64 | 5432 | /data/coord/cn2 | running | primary |
+----+------+----------------+------+-----------------+---------+---------+
+----+-------+-------+----------------+-------+-----------------+---------+---------+
| No | group |  name |      host      |  port |     work_dir    |  state  |   role  |
+----+-------+-------+----------------+-------+-----------------+---------+---------+
| 0  |  dn1  | dn1_1 | 192.*.*.62 | 15432 | /data/dn1/dn1_1 | running | primary |
| 1  |  dn1  | dn1_2 | 192.*.*.64 | 15432 | /data/dn1/dn1_2 | running | standby |
| 2  |  dn1  | dn1_3 | 192.*.*.60 | 15432 | /data/dn1/dn1_3 | running | standby |
| 3  |  dn2  | dn2_1 | 192.*.*.64 | 20010 | /data/dn2/dn2_1 | running | primary |
| 4  |  dn2  | dn2_2 | 192.*.*.60 | 20010 | /data/dn2/dn2_2 | running | standby |
| 5  |  dn2  | dn2_3 | 192.*.*.62 | 20010 | /data/dn2/dn2_3 | running | standby |
+----+-------+-------+----------------+-------+-----------------+---------+---------+
+----+----------------------------+--------+---------+----------+
| No |            url             |  name  |  state  | isLeader |
+----+----------------------------+--------+---------+----------+
| 0  | http://192.*.*.64:2379 | node_2 | healthy |   True   |
| 1  | http://192.*.*.62:2379 | node_1 | healthy |  False   |
| 2  | http://192.*.*.60:2379 | node_0 | healthy |  False   |
+----+----------------------------+--------+---------+----------+

6.2 启动数据库

语法:

ha_ctl start all -l dcslist <-c cluster>

命令执行结果如下:

[omm@node1 ~]$ ha_ctl start all -l http://192.*.*.60:2379
{
    "ret":0,
    "msg":"Success"
}
[omm@node1 ~]$ 

6.3 停止数据库

语法:

ha_ctl stop all -l dcslist <-c cluster>

命令执行结果如下:

[omm@node1 ~]$ ha_ctl stop all -l http://192.*.*.60:2379
{
    "ret":0,
    "msg":"Success"
}
[omm@node1 ~]$ 

6.4 数据库卸载

1、集群卸载语法格式:
ha_ctl uninstall <-f> <-c cluster> -l dcslist
参数说明:
-f 参数:表示清理安装目录,为可选字段。缺省保留目录文件夹。
2、卸载完成后删除 DCS 工具:
在集群卸载后环境变量自动清除,因此再次执行 ha_ctl 命令需要进入 script 目录。
cd /data/omm_package/script
ha_ctl destroy dcs -l dcslist

7、连接与使用

7.1 本地连接(gsql访问)

1、以 omm 用户登录数据库读写 CN 节点。
2、连接数据库。

gsql -d dbname -p port <-U user_name> <-h hostip>

示例:以最简便的方式,通过 CN 节点连接到 postgres 数据库

gsql -d postgres -p 5432

命令执行结果如下:

[omm@node2 ~]$ gsql -d postgres -p 5432
gsql ((PanWeiDB_V2.0(openGauss)-distributed version-3.0.1_B01 build d2edb141) compiled at 2024-09-25 16:30:33 commit 0 last mr 2715 )
Non-SSL connection (SSL connection is recommended when requiring high-security)
Type "help" for help.

postgres=#

7.2 远程访问(gsql访问)

设置白名单

gs_guc reload -Z coordinator -N all -I all -h "host all all 192.0.0.0/8 sha256"

执行结果如下:

[omm@node2 ~]$ gs_guc reload -Z coordinator -N all -I all -h "host all all 192.0.0.0/8 sha256"
The gs_guc run with the following arguments: [gs_guc -Z coordinator -N all -I all -h host all all 192.0.0.0/8 sha256 reload ].
Begin to perform the total nodes: 3.
Popen count is 2, Popen success count is 2, Popen failure count is 0.
Begin to perform gs_guc for coordinators.
Command count is 2, Command success count is 2, Command failure count is 0.

Total instances: 2.
ALL: Success to perform gs_guc!

测试:

[omm@node1 ~]$ gsql -h 192.*.*.62 -d postgres -U test
Password for user test: 
gsql ((PanWeiDB_V2.0(openGauss)-distributed version-3.0.1_B01 build d2edb141) compiled at 2024-09-25 16:30:33 commit 0 last mr 2715 )
SSL connection (cipher: ECDHE-RSA-AES128-GCM-SHA256, bits: 128)
Type "help" for help.

postgres=> \du
           List of roles
 Role name | Attributes | Member of 
-----------+------------+-----------
 test      |            | {}

postgres=> 

7.3 远程访问(dbeaver工具)

数据库连接配置:
image.png
测试连接:
image.png
查询数据:
image.png

8、碰到的问题

[omm@node1 script]$ ./ha_preinstall -i A -h 192.*.*.60,192.*.*.62,192.*.*.64 -u omm -p 22
Checking items:
    A1. [ OS version status ]                                   : Abnormal
    A2. [ Kernel version status ]                               : Warning
    A3. [ Unicode status ]                                      : Abnormal
    A4. [ Time zone status ]                                    : Abnormal
    A5. [ Swap memory status ]                                  : Warning
    A6. [ Bash type ]                                           : Abnormal
    A7. [ System limits ]                                       : Warning
    A8. [ Disk configuration status ]                           : Warning
    A9. [ Pre-read block size status ]                          : Abnormal
    A10.[ IO scheduler status ]                                 : Abnormal
    A11.[ Network card configuration status ]                   : Warning
    A12.[ Time consistency status ]                             : Abnormal
    A13.[ Firewall/Ufw service status ]                         : Warning
    A14.[ THP service status ]                                  : Warning
    A15.[ SELinux status ]                                      : Abnormal
    A16.[ Dependency version ]                                  : Abnormal
    A17.[ Sudo privilege ]                                      : Abnormal
    A18.[ Command permission ]                                  : Abnormal
Total numbers:18. Abnormal numbers:11. Warning numbers:7.
Do checking operation finished. Result: Abnormal.
解决办法:
[omm@node1 script]$ ./ha_preinstall -i A1 -h 192.*.*.60,192.*.*.62,192.*.*.64 -u omm -p 22 --detail
Checking items
    A1. [ OS version status ]                                   : Abnormal   
        check A1 failed, Error: 
        [Errno -2] Name or service not known
        please check error message and run: "/data/omm_package/script/ha_preinstall -i A1 -h 192.*.*.60,192.*.*.62,192.*.*0.64 -u omm -p 22 --detail" to try it again!

Total numbers:1. Abnormal numbers:1. Warning numbers:0.
Do checking operation finished. Result: Abnormal.
编辑/etc/hosts加入:
192.*.*.60 node1
192.*.*.62 node2
192.*.*.64 node3

9、总结

按文档一步一步地部署磐维分布式数据库还是比较简单的,有需求的朋友们快来试一试吧!

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

评论