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

Kylin Linux操作系统下opengauss 5.0.1安装操作指南

原创 吴建 2024-05-16
1064

Kylin Linux操作系统下opengauss 5.0.1安装操作指南


1. 文档属性 3

修改记录 3

文档概述 3

2. 安装前信息采集、需求及规划 4

2.1. 安装调研基本信息 4

2.2. 主机相关信息 4

2.3. 主机磁盘目录规划 5

2.4. 数据库信息 5

3. 安装前准备 6

3.1. 检查环境 6

3.2. 软件准备 7

3.3. 配置系统安装环境 7

3.3.1. Yum安装系统包 7

3.3.2. 修改内核参数 8

3.3.3. 修改系统限制 10

3.3.4. 修改shell配置,设置操作系统字符集 10

3.3.5. 禁用防火墙和selinux 10

3.3.6. 配置ntp服务 11

3.3.7. 禁用Transparent HugePages透明大页 12

3.3.8. 检查RemoveIPC=no 12

3.3.9. 关闭swap交换内存 13

3.3.10. 配置SSH服务(允许root登录,关闭Banner) 13

3.4. 添加用户和组 14

3.4.1. 规划目录并授权 14

4. 安装opengauss 14

4.1. 准备安装介质 14

4.2. 创建XML文件 15

4.3. 初始化安装环境 16

4.4. 执行安装 17

5. 调整数据库参数 19

6. 配置物理备份脚本 21

  1. 文档属性

修改记录

日期

作者

版本

修改记录

2024-04-15

吴建

1.0

First edtion

文档概述

本文档参考opengauss 5.0.1官方文档等。

本文档作为opengauss 5.0.1在Kylin Linux SP2操作系统上的安装配置手册,为运维人员提供前期准备及安装配置参考,仅供参考。

注意:

此文档所提供的设定仅作为参考,由于客户环境、场景有差异,设定有所不同。

由于用户的生产系统千差万别,强烈建议工程师实施期间,根据实际环境进行适当设定,以规避可能出现的风险。

本文档仅供内部参考。

  1. 安装前信息采集、需求及规划

安装调研基本信息

信息项

说明

硬件平台

例如,信创云平台海光CPU虚拟机

操作系统及版本

例如,Kylin Linux SP2

存储

例如,云平台存储

网络

例如,云平台网络

数据库版本

例如,openGauss 5.0.1

数据库架构(单实例/主从)

例如,单实例

数据文件存放形式(FS/RAW...)

例如,使用FS文件系统

NTP

例如,是否使用NTP

主机相关信息

信息项

说明

备注

硬件平台信息

例如,信创云平台海光CPU虚拟机

操作系统及版本信息

例如,Kylin Linux SP2

CPU个数

例如,8

内存大小

例如,32GB

网卡个数

例如,1

主机磁盘目录规划

目录规划举例:

目录名称

设备名

大小

用途

数据库安装目录

/opengauss_soft

30G

用于存放opengauss软件

数据库数据文件目录

/opengauss_data

300G

用于存放opengauss数据文件

归档目录

/opengauss_arch

100G

用于存放opengauss WAL归档日志

物理备份目录

/opengauss_bak

200G

用于存放opengauss物理备份

数据库信息

内容

描述

备注

数据量

预估数据量大小。

字符集

数据库字符集以及国家语言字符集。

数据库名称

请提供数据库名称。

表空间需求

请提供具体的表空间名称以及表空间大小需求。

用户需求

请提供用户名称、权限需求、用户默认表空间。

应用规划数据库最大连接数

请提供应用规划数据库最大的连接数,根据此数值设置数据库的processes以及sessions数。

数据库的时区需求

请根据应用提供数据库需要使用的时区。

归档策略

开启归档策略。

备份策略

数据库备份策略。

  1. 安装前准备

检查环境

检查磁盘空间(保证30G以上)

[root@node11~]#df -h

检查操作系统版本

[root@node6 ~]# cat /etc/os-release

NAME="Kylin Linux Advanced Server"

VERSION="V10 (Sword)"

ID="kylin"

VERSION_ID="V10"

PRETTY_NAME="Kylin Linux Advanced Server V10 (Sword)"

ANSI_COLOR="0;31"

[root@node6 ~]# cat /etc/.productinfo

Kylin Linux Advanced Server

release V10 (SP2) /(Sword)-x86_64-Build09/20210524

操作系统版本为Kylin Linux V10 SP2

检查内核版本

[root@node6 ~]# uname -a

Linux node6 4.19.90-24.4.v2101.ky10.x86_64 #1 SMP Mon May 24 12:14:55 CST 2021 x86_64 x86_64 x86_64 GNU/Linux

查看当前时间和时区 (保证为东八区)

[root@node6 ~]# date -R

Mon, 15 Apr 2024 15:45:32 +0800

[root@node6 ~]# date

2024年 04月 15日 星期一 15:45:55 CST

其中CST代表China Standard Time,为正确时区。

修改时区方法:

  1. 找到相应的时区文件 /usr/share/zoneinfo/Asia/Shanghai

用此文件替换当前的 /etc/localtime

[root@localhost ~]# cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

cp: overwrite `/etc/localtime'? y

  1. 另一种修改方法为:

[root@localhost ~]#timedatectl set-timezone Asia/Shanghai

修改时间方法:

使用date命令修改日期时间:

[root@localhost ~]# date -s "14:46:50 12/26/2017"

Tue Dec 26 14:46:50 CST 2017

3. 将当前时间写入BIOS避免安重启后失效

[root@localhost ~]# hwclock -w

软件准备

openGauss5.0.1企业版安装包:openGauss-5.0.1-CentOS-64bit-all.tar.gz

下载地址:https://www.opengauss.org/zh/download/

海光CPU的虚机,麒麟操作系统openGauss Server 选择操作系统与架构:x86_64 openEuler 20.03 opengauss_5.0.1企业版

配置系统安装环境

      1. Yum安装系统包

配置本地yum源

# mkdir /mnt/iso

# mount /dev/sr0 /mnt/iso

# cd /etc/yum.repos.d

# vi media.repo

[InstallMedia]

name=Kylin v10 sp2

gpgcheck=0

enabled=1

baseurl=file:///mnt/iso

安装rpm包

[root@node6 yum.repos.d]# yum clean all

6 文件已删除

[root@node6 yum.repos.d]# yum install -y libaio-devel flex bison ncurses-devel glibc-devel patch readline-devel expect libnsl2

      1. 修改内核参数

[root@node11~]# vi /etc/sysctl.conf

添加

# Controls the opengauss parameters

net.ipv4.tcp_max_tw_buckets = 10000

net.ipv4.tcp_tw_reuse = 1

net.ipv4.tcp_tw_recycle = 1

net.ipv4.tcp_keepalive_time = 30

net.ipv4.tcp_keepalive_probes = 9

net.ipv4.tcp_keepalive_intvl = 30

net.ipv4.tcp_retries1 = 5

net.ipv4.tcp_syn_retries = 5

net.ipv4.tcp_synack_retries = 5

net.sctp.path_max_retrans = 10

net.sctp.max_init_retransmits = 10

net.sctp.association_max_retrans = 10

net.sctp.hb_interval = 30000

net.ipv4.tcp_retries2 = 12

vm.overcommit_memory = 0

net.sctp.sndbuf_policy = 0

net.sctp.rcvbuf_policy = 0

net.sctp.sctp_mem = 94500000 915000000 927000000

net.sctp.sctp_rmem = 8192 250000 16777216

net.sctp.sctp_wmem = 8192 250000 16777216

net.ipv4.tcp_rmem = 8192 250000 16777216

net.ipv4.tcp_wmem = 8192 250000 16777216

net.core.wmem_max = 21299200

net.core.rmem_max = 21299200

net.core.wmem_default = 21299200

net.core.rmem_default = 21299200

net.ipv4.ip_local_port_range = 26000 65535

kernel.sem = 250 6400000 1000 25600

vm.min_free_kbytes = 524288

net.core.somaxconn = 65535

net.ipv4.tcp_syncookies = 1

net.sctp.addip_enable = 0

net.core.netdev_max_backlog = 65535

net.ipv4.tcp_max_syn_backlog = 65535

net.ipv4.tcp_fin_timeout = 60

kernel.shmall = 1152921504606846720

kernel.shmmax = 18446744073709551615

net.ipv4.tcp_sack = 1

net.ipv4.tcp_timestamps = 1

vm.extfrag_threshold = 500

vm.overcommit_ratio = 90

net.ipv4.ip_local_reserved_ports = 20050-20057,26000-26007

net.sctp.sctp_mem = 94500000 915000000 927000000

net.sctp.sctp_rmem = 8192 250000 16777216

net.sctp.sctp_wmem = 8192 250000 16777216

备注:

kernel.shmall,kernel.shmmax和vm.min_free_kbytes需要根据当前主机内存修改:

kernel.shmall = memory size / pagesize (这个pagesize是OS的,可以通过getconf PAGESIZE得知,可以通过执行以下命令获取到)

echo "`cat /proc/meminfo | grep "MemTotal" | awk '{print $2}'` / (`getconf PAGESIZE` / 1024)" | bc

# kernel.shmmax Recommended: 1/2 memory < shmmax <= memory - 1. Limit max SGA size.(注意,这里的单位是byte,可以通过下面命令计算--此处示例以物理内存的80%进行设置)

echo "`cat /proc/meminfo | grep "MemTotal" | awk '{print $2}'` * 1024 * 0.8" | bc | sed 's#\..*$##'

#vm.min_free_kbytes = 0.5% of total Physical Memroy,建议最小值为524288)

修改内核参数,并使其生效,注意执行完后可能会输出很多文件或目录不存在可以忽略重启后就正常了

# sysctl -p

      1. 修改系统限制

[root@node11~]# vi /etc/security/limits.conf

添加

* soft stack 3072

* hard stack 3072

* soft nofile 1000000

* hard nofile 1000000

* soft nproc unlimited

* hard nproc unlimited

tail -n 10 /etc/security/limits.conf

      1. 修改shell配置,设置操作系统字符集

# vi /etc/profile

添加

export LANG= zh_CN.UTF-8

      1. 禁用防火墙和selinux

禁用防火墙

# systemctl status firewalld

# systemctl stop firewalld

# systemctl disable firewalld

# systemctl is-enabled firewalld

禁用SELINUX

# /usr/sbin/sestatus -v

如果selinux为enable状态,则修改/etc/selinux/config文件:

SELINUX=disabled

或使用下面命令:

sed -i '/^SELINUX=.*/ s//SELINUX=disabled/' /etc/selinux/config

并重启服务器

      1. 配置ntp服务

可以选择用NTP服务器,修改NTP服务配置文件。

[root@node191~]# yum install ntp

[root@node191~]#systemctl enable ntpd

使用vi命令编辑/etc/ntp.conf文件,添加时间源,tinker step 0为缓慢调整。

配置如下:

server 192.112.63.24 minpoll 4 maxpoll 4

tinker step 0

修改/etc/sysconfig/ntpd配置文件,添加-x参数

OPTIONS="-p /var/run/ntpd.pid -g -x"

使用systemctl restart ntpd 重启ntpd服务。

使用systemctl enable ntpd确保ntpd在系统重启时能自动启动。并使用命令systemctl is-enabled ntpd查看ntpd是否处于开机自启动状态。

[root@node11 ~]# systemctl is-enabled ntpd

enabled

使用ntpq -p 查看ntpd 服务运行状态,ps -ef | grep ntp正确显示状态如下

注意:chronyd服务(RHEL7默认使用chrony进行时间同步)的启用导致NTPD服务无法默认开机启动,解决办法就是

systemctl disable chronyd

      1. 禁用Transparent HugePages透明大页

操作系统上关闭Transparent HugePages方法:

# vi /etc/default/grub

在GRUB_CMDLINE_LINUX加入选项 numa=off transparent_hugepage=never

GRUB_CMDLINE_LINUX="rd.lvm.lv=rhel/root rd.lvm.lv=rhel/swap rhgb quiet transparent_hugepage=never"

重新生成grub配置文件

On BIOS-based machines, issue the following command as root:

# grub2-mkconfig -o /boot/grub2/grub.cfg

On UEFI-based machines, issue the following command as root:

# grub2-mkconfig -o /boot/efi/EFI/kylin/grub.cfg

重启主机,检查Transparent HugePages, AnonHugePages=0

# cat /proc/meminfo | grep AnonHugePages

AnonHugePages: 0 kB

      1. 检查RemoveIPC=no

# cat /etc/systemd/logind.conf | grep RemoveIPC

#RemoveIPC=no

重启systemd-logind服务或重启主机

# systemctl daemon-reload

# systemctl restart systemd-logind

      1. 关闭swap交换内存

[root@node6 ~]# swapoff -a

[root@node6 ~]# cp /etc/fstab /etc/fstab.bak

[root@node6 ~]# vim /etc/fstab

将swap那行注释

      1. 配置SSH服务(允许root登录,关闭Banner)

# vim /etc/ssh/sshd_config

修改PermitRootLogin为yes

注释#Banner none

重启服务使设置生效

systemctl restart sshd.service

添加用户和组

拷贝执行

groupadd dbgrp

useradd -g dbgrp -m omm

echo "Wj_omm19873625" | passwd --stdin omm

      1. 规划目录并授权

规划目录并授权

[root@node6 ~]# chown omm:dbgrp /opengauss_soft/

[root@node6 ~]# chown omm:dbgrp /opengauss_data/

[root@node6 ~]# chown omm:dbgrp /opengauss_arch/

[root@node6 ~]# chown omm:dbgrp /opengauss_bak/

  1. 安装opengauss

准备安装介质

在服务器上创建安装包的存放目录

mkdir -p /opt/software/openGauss

chmod 755 -R /opt/software

将openGauss-5.0.1-openEuler-64bit-all.tar.gz上传到/opt/software/openGauss目录

解压软件包

tar -zxvf openGauss-5.0.1-openEuler-64bit-all.tar.gz

解压om软件包,使用om脚本安装

tar -zxvf openGauss-5.0.1-openEuler-64bit-om.tar.gz

创建XML文件

单机OM的XML文件如下:

vim /opt/software/openGauss/cluster_config.xml

<?xml version="1.0" encoding="UTF-8"?>

<ROOT>

<!-- openGauss整体信息 -->

<CLUSTER>

<!-- 数据库名称 -->

<PARAM name="clusterName" value="dbCluster" />

<!-- 数据库节点名称(hostname) -->

<PARAM name="nodeNames" value="node6" />

<!-- 数据库安装目录-->

<PARAM name="gaussdbAppPath" value="/opengauss_soft/app" />

<!-- 日志目录-->

<PARAM name="gaussdbLogPath" value="/var/log/omm" />

<!-- 临时文件目录-->

<PARAM name="tmpMppdbPath" value="/opengauss_soft/tmp" />

<!-- 数据库工具目录-->

<PARAM name="gaussdbToolPath" value="/opengauss_soft/om" />

<!-- 数据库core文件目录-->

<PARAM name="corePath" value="/opengauss_soft/corefile" />

<!-- 节点IP,与数据库节点名称列表一一对应 -->

<PARAM name="backIp1s" value="192.0.2.6"/>

</CLUSTER>

<!-- 每台服务器上的节点部署信息 -->

<DEVICELIST>

<!-- 节点1上的部署信息 -->

<DEVICE sn="node6">

<!-- 节点1的主机名称 -->

<PARAM name="name" value="node6"/>

<!-- 节点1所在的AZ及AZ优先级 -->

<PARAM name="azName" value="AZ1"/>

<PARAM name="azPriority" value="1"/>

<!-- 节点1的IP,如果服务器只有一个网卡可用,将backIP1和sshIP1配置成同一个IP -->

<PARAM name="backIp1" value="192.0.2.6"/>

<PARAM name="sshIp1" value="192.0.2.6"/>

<!--dbnode-->

<PARAM name="dataNum" value="1"/>

<PARAM name="dataPortBase" value="15400"/>

<PARAM name="dataNode1" value="/opengauss_data/dn"/>

<PARAM name="dataNode1_syncNum" value="0"/>

</DEVICE>

</DEVICELIST>

</ROOT>

初始化安装环境

chown omm:dbgrp -R /opt/software/

/opt/software/openGauss/script/gs_preinstall -U omm -G dbgrp -X /opt/software/openGauss/cluster_config.xml

[root@node6 openGauss]# chown omm:dbgrp -R /opt/software/

[root@node6 openGauss]# /opt/software/openGauss/script/gs_preinstall -U omm -G dbgrp -X /opt/software/openGauss/cluster_config.xml

Parsing the configuration file.

Successfully parsed the configuration file.

Installing the tools on the local node.

Successfully installed the tools on the local node.

Setting host ip env

Successfully set host ip env.

Are you sure you want to create the user[omm] (yes/no)? yes

Preparing SSH service.

Successfully prepared SSH service.

Checking OS software.

Successfully check os software.

Checking OS version.

Successfully checked OS version.

Creating cluster's path.

Successfully created cluster's path.

Set and check OS parameter.

Setting OS parameters.

Successfully set OS parameters.

Warning: Installation environment contains some warning messages.

Please get more details by "/opt/software/openGauss/script/gs_checkos -i A -h node6 --detail".

Set and check OS parameter completed.

Preparing CRON service.

Successfully prepared CRON service.

Setting user environmental variables.

Successfully set user environmental variables.

Setting the dynamic link library.

Successfully set the dynamic link library.

Setting Core file

Successfully set core path.

Setting pssh path

Successfully set pssh path.

Setting Cgroup.

Successfully set Cgroup.

Set ARM Optimization.

No need to set ARM Optimization.

Fixing server package owner.

Setting finish flag.

Successfully set finish flag.

Preinstallation succeeded.

执行安装

su - omm

gs_install -X /opt/software/openGauss/cluster_config.xml

[root@node6 openGauss]# su - omm

上一次登录: 一 4月 15 23:33:24 CST 2024

[omm@node6 ~]$ gs_install -X /opt/software/openGauss/cluster_config.xml

Parsing the configuration file.

Check preinstall on every node.

Successfully checked preinstall on every node.

Creating the backup directory.

Successfully created the backup directory.

begin deploy..

Installing the cluster.

begin prepare Install Cluster..

Checking the installation environment on all nodes.

begin install Cluster..

Installing applications on all nodes.

Successfully installed APP.

begin init Instance..

encrypt cipher and rand files for database.

Please enter password for database:

Please repeat for database:

begin to create CA cert files

The sslcert will be generated in /opengauss_soft/app/share/sslcert/om

NO cm_server instance, no need to create CA for CM.

Non-dss_ssl_enable, no need to create CA for DSS

Cluster installation is completed.

Configuring.

Deleting instances from all nodes.

Successfully deleted instances from all nodes.

Checking node configuration on all nodes.

Initializing instances on all nodes.

Updating instance configuration on all nodes.

Check consistence of memCheck and coresCheck on database nodes.

Configuring pg_hba on all nodes.

Configuration is completed.

The cluster status is Normal.

Successfully started cluster.

Successfully installed application.

end deploy..

查看集群状态

[omm@node6 ~]$ gs_om -t status --detail

[ Cluster State ]

cluster_state : Normal

redistributing : No

current_az : AZ_ALL

[ Datanode State ]

node node_ip port instance state

-----------------------------------------------------------------------------------

1 node6 192.0.2.6 15400 6001 /opengauss_data/dn P Primary Normal

连接数据库查看信息

[omm@node6 ~]$ gsql -d postgres -p 15400

gsql ((openGauss 5.0.1 build 33b035fd) compiled at 2023-12-15 20:27:13 commit 0 last mr )

Non-SSL connection (SSL connection is recommended when requiring high-security)

Type "help" for help.

openGauss=# \l

List of databases

Name | Owner | Encoding | Collate | Ctype | Access privileges

-----------+-------+-----------+---------+-------+-------------------

postgres | omm | SQL_ASCII | C | C |

template0 | omm | SQL_ASCII | C | C | =c/omm +

| | | | | omm=CTc/omm

template1 | omm | SQL_ASCII | C | C | =c/omm +

| | | | | omm=CTc/omm

(3 rows)

  1. 调整数据库参数

vim /opengauss_data/dn/postgresql.conf

修改下列参数值

设置数据库最大会话连接数

max_connections=1000

设置一个数据库节点可用的最大物理内存,建议值物理内存*0.7

max_process_memory=5GB

设置openGauss使用的共享内存大小。增加此参数的值会使openGauss比系统默认设置需要更多的System V共享内存。建议值物理内存*0.35

shared_buffers=2867MB

大批量数据写入触发时(例如copy动作),该操作使用的环形缓冲区大小。

bulk_write_ring_size=512MB

设置列存所使用的共享缓冲区的大小

cstore_buffers=128MB

设置当前事务的同步方式

synchronous_commit = on

开启归档模式

archive_mode = on

归档命令copy目录

archive_command = ' cp --remove-destination %p /opengauss_arch/%f '

Xlog日志文件段数量。设置“pg_xlog”目录下保留事务日志文件的最小数目,备机通过获取主机的日志进行流复制。

wal_keep_segments = 64

开启wdr快照

enable_wdr_snapshot = on

vim pg_hba.conf

增加下列内容,任何IP都可以连接数据库服务,可根据需求调整

host all all 0.0.0.0/0 sha256

重启数据库使参数生效

gs_om -t restart

[omm@node6 ~]$ gs_om -t restart

Stopping cluster.

=========================================

Successfully stopped cluster.

=========================================

End stop cluster.

Starting cluster.

=========================================

[SUCCESS] node6

2024-04-16 00:12:56.148 661d5208.1 [unknown] 139740506873856 [unknown] 0 dn_6001 01000 0 [BACKEND] WARNING: could not create any HA TCP/IP sockets

2024-04-16 00:12:56.148 661d5208.1 [unknown] 139740506873856 [unknown] 0 dn_6001 01000 0 [BACKEND] WARNING: could not create any HA TCP/IP sockets

2024-04-16 00:12:56.150 661d5208.1 [unknown] 139740506873856 [unknown] 0 dn_6001 01000 0 [BACKEND] WARNING: Failed to initialize the memory protect for g_instance.attr.a

ttr_storage.cstore_buffers (128 Mbytes) or shared memory (3741 Mbytes) is larger.

  1. 配置物理备份脚本

使用gs_basebackup配置数据库全备脚本

全备脚本:gs_basebackup_full.sh

#!/bin/bash

source /home/omm/.bash_profile

DATE=$(date '+%Y%m%d%H%m%S')

pgpath=/opengauss_soft/app/bin/

port=15400

##pguser=postgres

bkpath=/opengauss_bak

bktmp=$bkpath/backups-tmp

#START BACKUP

echo "START BACKUP $DATE..............."

echo "................................."

##清空备份临时目录

rm -rf $bktmp

mkdir -p $bktmp

##数据库全备份,格式为tar,压缩级别9

$pgpath/gs_basebackup -D $bktmp -p $port -X fetch -F tar -Z 9

##从临时目录move全备份到备份目录并添加日志

mv $bktmp/base.tar.gz $bkpath/base_$DATE.tar.gz

echo "BACKUP END $DATE..............."

echo "................................."

sh /home/omm/gs_basebackup_full.sh >>/home/omm/gs_basebackup_full.log 2>&1

清理归档日志和全备份脚本:del_bak.sh

#!/bin/bash

source /home/omm/.bash_profile

DATE=$(date '+%Y%m%d%H%m%S')

#START DEL

echo "START DEL $DATE..............."

echo "................................."

##查询ARCH目录35天以前的归档文件

/usr/bin/find /opengauss_arch -mtime +35 -exec ls -l {} \;

##删除ARCH目录35天以前的归档文件

/usr/bin/find /opengauss_arch -mtime +35 -exec rm -rf {} \;

##查询BAK目录35天以前的归档文件

/usr/bin/find /opengauss_bak -mtime +35 -exec ls -l {} \;

##删除BAK目录35天以前的归档文件

/usr/bin/find /opengauss_bak -mtime +35 -exec rm -rf {} \;

echo "BACKUP DEL $DATE..............."

echo "................................."

sh /home/omm/del_bak.sh >>/home/omm/del_bak.sh.log 2>&1

操作系统定时任务:

crontab -e

00 01 * * 0 /usr/bin/sh /home/omm/gs_basebackup_full.sh >>/home/omm/gs_basebackup_full.log 2>&1

00 02 * * * /usr/bin/sh /home/omm/del_bak.sh >>/home/omm/del_bak.sh.log 2>&1

星期日01:00做数据库全备份

每天02:00做归档日志和数据库全备的过期文件删除操作

数据库全备加归档日志保留策略为28天。

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

评论