腾讯云开发者社区 上一套openGauss数据库,如何规划部署?(续)---一主二备一主一备一级联
cover

上一套openGauss数据库,如何规划部署?(续)---一主二备一主一备一级联

一.创建XML配置文件安装openGauss多机主从需要创建cluster_config.xml文件,cluster_config.xml文件包含部署openGauss的服务器信息、安装路径、IP地址以及端口号等。用于告知openGauss如何部署。用户需根据不同场景配置对应的XML文件。官方提供各种模版,详情见链接,如...

一.创建XML配置文件

安装openGauss多机主从需要创建cluster_config.xml文件,cluster_config.xml文件包含部署openGauss的服务器信息、安装路径、IP地址以及端口号等。用于告知openGauss如何部署。用户需根据不同场景配置对应的XML文件。 官方提供各种模版,详情见链接,如一主一备,一主一备一级联,一主二备,一主三备,一主四备等等。

1.一主二备官方配置文件案例

cat cluster_config.xml
<?xml version="1.0" encoding="UTF-8"?> 
<ROOT> 
    <!-- openGauss整体信息 --> 
    <CLUSTER> 
        <PARAM name="clusterName" value="Cluster_template" /> 
        <PARAM name="nodeNames" value="node1_hostname,node2_hostname,node3_hostname" /> 
        <PARAM name="gaussdbAppPath" value="/opt/huawei/install/app" /> 
        <PARAM name="gaussdbLogPath" value="/var/log/omm" /> 
        <PARAM name="tmpMppdbPath" value="/opt/huawei/tmp"/> 
        <PARAM name="gaussdbToolPath" value="/opt/huawei/install/om" /> 
        <PARAM name="corePath" value="/opt/huawei/corefile"/> 
        <PARAM name="backIp1s" value="192.168.0.1,192.168.0.2,192.168.0.3"/> 
     
    </CLUSTER> 
    <!-- 每台服务器上的节点部署信息 --> 
    <DEVICELIST> 
        <!-- node1上的节点部署信息 --> 
        <DEVICE sn="node1_hostname"> 
            <PARAM name="name" value="node1_hostname"/> 
            <PARAM name="azName" value="AZ1"/> 
            <PARAM name="azPriority" value="1"/> 
            <!-- 如果服务器只有一个网卡可用,将backIP1和sshIP1配置成同一个IP --> 
            <PARAM name="backIp1" value="192.168.0.1"/> 
            <PARAM name="sshIp1" value="192.168.0.1"/> 
            <!--CM节点部署信息--> 
            <PARAM name="cmsNum" value="1"/> 
            <PARAM name="cmServerPortBase" value="15000"/> 
            <PARAM name="cmServerListenIp1" value="192.168.0.1,192.168.0.2,192.168.0.3"/> 
            <PARAM name="cmServerHaIp1" value="192.168.0.1,192.168.0.2,192.168.0.3"/> 
            <PARAM name="cmServerlevel" value="1"/> 
            <PARAM name="cmServerRelation" value="node1_hostname,node2_hostname,node3_hostname"/> 
            <PARAM name="cmDir" value="/opt/huawei/data/cmserver"/> 
	    <!--dn--> 
            <PARAM name="dataNum" value="1"/> 
	    <PARAM name="dataPortBase" value="15400"/> 
	    <PARAM name="dataNode1" value="/opt/huawei/install/data/dn,node2_hostname,/opt/huawei/install/data/dn,node3_hostname,/opt/huawei/install/data/dn"/> 
            <PARAM name="dataNode1_syncNum" value="0"/> 
        </DEVICE> 
 
        <!-- node2上的节点部署信息,其中“name”的值配置为主机名称 --> 
        <DEVICE sn="node2_hostname"> 
            <PARAM name="name" value="node2_hostname"/> 
            <PARAM name="azName" value="AZ1"/> 
            <PARAM name="azPriority" value="1"/> 
            <!-- 如果服务器只有一个网卡可用,将backIP1和sshIP1配置成同一个IP --> 
            <PARAM name="backIp1" value="192.168.0.2"/> 
            <PARAM name="sshIp1" value="192.168.0.2"/> 
            <!-- cm --> 
            <PARAM name="cmServerPortStandby" value="15000"/> 
            <PARAM name="cmDir" value="/opt/huawei/data/cmserver"/> 
	</DEVICE> 
 
        <!-- node3上的节点部署信息,其中“name”的值配置为主机名称 --> 
        <DEVICE sn="node3_hostname"> 
            <PARAM name="name" value="node3_hostname"/> 
            <PARAM name="azName" value="AZ1"/> 
            <PARAM name="azPriority" value="1"/> 
            <!-- 如果服务器只有一个网卡可用,将backIP1和sshIP1配置成同一个IP --> 
            <PARAM name="backIp1" value="192.168.0.3"/> 
            <PARAM name="sshIp1" value="192.168.0.3"/> 
            <!-- cm --> 
            <PARAM name="cmServerPortStandby" value="15000"/> 
            <PARAM name="cmDir" value="/opt/huawei/data/cmserver"/> 
	</DEVICE> 
    </DEVICELIST> 
</ROOT>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.

二.一主二备集群安装

上一套openGauss数据库,如何规划部署?(续)---一主二备一主一备一级联_数据库

创建XML配置文件---初始化安装环境---执行安装---安装验证

1.创建一主二备的XML配置文件

#master节点
cd /gauss/soft/
cat >>cluster_config.xml<<'EOF'
<?xml version="1.0" encoding="UTF-8"?> 
<ROOT> 
    <!-- openGauss整体信息 --> 
    <CLUSTER> 
        <PARAM name="clusterName" value="Cluster_alibaby" /> 
        <PARAM name="nodeNames" value="master,slave1,slave2" />     
        <PARAM name="gaussdbAppPath" value="/gauss/gaussdb/app" /> 
        <PARAM name="gaussdbLogPath" value="/gauss/gaussdb/log" /> 
        <PARAM name="tmpMppdbPath" value="/gauss/gaussdb/tmp"/> 
        <PARAM name="gaussdbToolPath" value="/gauss/gaussdb/om" /> 
        <PARAM name="corePath" value="/gauss/gaussdb/corefile"/> 
        <PARAM name="backIp1s" value="192.168.77.161,192.168.77.162,192.168.77.163"/> 
     
    </CLUSTER> 
    <!-- 每台服务器上的节点部署信息 --> 
    <DEVICELIST> 
        <!-- node1上的节点部署信息 --> 
        <DEVICE sn="master"> 
            <PARAM name="name" value="master"/> 
            <PARAM name="azName" value="AZ1"/> 
            <PARAM name="azPriority" value="1"/> 
            <!-- 如果服务器只有一个网卡可用,将backIP1和sshIP1配置成同一个IP --> 
            <PARAM name="backIp1" value="192.168.77.161"/> 
            <PARAM name="sshIp1" value="192.168.77.161"/> 
            <!--CM节点部署信息--> 
			<!--暂不配置
            <PARAM name="cmsNum" value="1"/> 
            <PARAM name="cmServerPortBase" value="15000"/> 
            <PARAM name="cmServerListenIp1" value="192.168.77.161,192.168.77.162,192.168.77.163"/> 
            <PARAM name="cmServerHaIp1" value="192.168.77.161,192.168.77.162,192.168.77.163"/> 
            <PARAM name="cmServerlevel" value="1"/> 
            <PARAM name="cmServerRelation" value="master,slave1,slave2"/> 
            <PARAM name="cmDir" value="/gauss/gaussdb/data/cmserver"/> 
			-->
	    <!--dn数据库主节点部署信息--> 
		    <!--DBnode-->
            <PARAM name="dataNum" value="1"/> 
			<!--数据库端口号-->
	        <PARAM name="dataPortBase" value="15400"/> 
			<!--数据库主节点上的数据目录,及备机数据目录-->
	        <PARAM name="dataNode1" value="/gauss/gaussdb/data/dn,slave1,/gauss/gaussdb/data/dn,slave2,/gauss/gaussdb/data/dn"/> 
            <!--数据库主节点上的xlog目录,及备机xlog目录-->
            <PARAM name="dataNodeXlogPath1" value="/gauss/gaussdb/gauss_xlog,/gauss/gaussdb/gauss_xlog,/gauss/gaussdb/gauss_xlog "/>
			<!--数据库节点上设定同步模式的节点数-->
			<PARAM name="dataNode1_syncNum" value="0"/> 
        
		</DEVICE> 
 
        <!-- node2上的节点部署信息,其中“name”的值配置为主机名称 --> 
        <DEVICE sn="slave1"> 
            <PARAM name="name" value="slave1"/> 
            <PARAM name="azName" value="AZ1"/> 
            <PARAM name="azPriority" value="1"/> 
            <!-- 如果服务器只有一个网卡可用,将backIP1和sshIP1配置成同一个IP --> 
            <PARAM name="backIp1" value="192.168.77.162"/> 
            <PARAM name="sshIp1" value="192.168.77.162"/> 
            <!-- cm --> 
			<!-- 暂不配置
            <PARAM name="cmServerPortStandby" value="15000"/> 
            <PARAM name="cmDir" value="/gauss/gaussdb/data/cmserver"/> 
			-->
	    </DEVICE> 
 
        <!-- node3上的节点部署信息,其中“name”的值配置为主机名称 --> 
        <DEVICE sn="slave2"> 
            <PARAM name="name" value="slave2"/> 
            <PARAM name="azName" value="AZ1"/> 
            <PARAM name="azPriority" value="1"/> 
            <!-- 如果服务器只有一个网卡可用,将backIP1和sshIP1配置成同一个IP --> 
            <PARAM name="backIp1" value="192.168.77.163"/> 
            <PARAM name="sshIp1" value="192.168.77.163"/> 
            <!-- cm --> 
			<!-- 暂不配置
            <PARAM name="cmServerPortStandby" value="15000"/> 
            <PARAM name="cmDir" value="/opt/huawei/data/cmserver"/> 
			-->
	</DEVICE> 
    </DEVICELIST> 
</ROOT>
EOF
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.

2.初始化安装环境

#master节点
#软件包准备
su - root
cd /gauss/soft
wget https://opengauss.obs.cn-south-1.myhuaweicloud.com/3.0.0/x86/openGauss-3.0.0-CentOS-64bit-all.tar.gz
tar xf openGauss-3.0.0-CentOS-64bit-all.tar.gz 
tar xf openGauss-3.0.0-CentOS-64bit-om.tar.gz

#执行预安装 root用户执行
su - root
cd /gauss/soft/script
./gs_preinstall -U gauss -G gauss -X /gauss/soft/cluster_config.xml
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.

预安装过程提示:

...
Successfully installed the tools on the local node.
Are you sure you want to create trust for root (yes/no)?  输入yes
...
Please enter password for root
Password: 输入root密码
...
Are you sure you want to create the user[gauss] and create trust for it (yes/no)? 输入yes
...
Please enter password for current user[gauss].
Password: 输入gauss用户当前密码(准备阶段创建的gauss用户)
....
Preinstallation succeeded. 最后提示预安装完成
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.

3.执行安装

#master节点
su - gauss
gs_install -X /gauss/soft/cluster_config.xml  

#可选参数
--gsinit-parameter="--locale=en_US.utf8" 或
--gsinit-parameter="--encoding=UTF8"
#内存参数调整
--dn-guc="cstore_buffers=256MB"
--dn-guc="max_process_memory=4GB"
--dn-guc="shared_buffers=256MB" 
--dn-guc="bulk_write_ring_size=256MB

#安装执行成功之后,需要手动删除主机root用户(gauss用户互信没关系)的互信,即删除openGauss数据库各节点上的互信文件
#master
su - gauss
ssh slave1   #gauss用户免密登录可删除可不删除,,若要删除rm –rf ~/.ssh
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.

执行安装过程提示:

...
encrypt cipher and rand files for database.
Please enter password for database: 输入数据库初始密码
Please repeat for database:再次输入数据库初始密码
...
Successfully installed application.  安装完成
end deploy  结束部署
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

4.安装验证  主备节点状态查看

#master节点
su - gauss
#查看集群状态
gs_om -t status
gs_om -t status --detail
#查看slvae的状态
gs_om -t status -h slave1
#关闭开启重启集群maser操作
gs_om -t stop|start|restart 
#登录验证,数据库主节点端口15400
#非SSL连接登录
gsql -d postgres -p 15400
#SSL安全连接登录
gsql -h 127.0.0.1 -p 15400 -U gauss -W Alibaby@007 -d postgres
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.

5.测试

#登录
su - gauss
gsql -h 127.0.0.1 -p 15400 -U gauss -W Alibaby@007 -d postgres
#创建用户并授权
create user alibaby with password 'Alibaby@007';
grant all privileges to alibaby;
create database alibabydb owner alibaby;
grant all privileges on all tables in schema public to alibaby;
grant all privileges on database alibabydb to alibaby;
\q
#增加alibaby用户的访问控制,只需master节点,其他节点会同步
gs_guc reload -I all -N all -h "host alibabydb alibaby 192.168.77.0/24 sha256"
#验证访问控制是否写进配置文件
grep alibaby  /gauss/gaussdb/data/dn/pg_hba.conf
#alibaby用户登录
gsql -h 192.168.77.161 -p 15400 -U alibaby -W Alibaby@007 -d alibabydb

#创建测试数据
#创建表
CREATE TABLE student
(
    std_id INT PRIMARY KEY,
    std_name VARCHAR(20) NOT NULL,
    std_sex VARCHAR(6),
    std_birth DATE,
    std_in DATE NOT NULL,
    std_address VARCHAR(100)
);
#插入数据
INSERT INTO student(std_id,std_name,std_sex,std_birth,std_in,std_address) VALUES (1,'张一','男','1993-01-01','2011-09-01','江苏省南京市雨花台区');
INSERT INTO student(std_id,std_name,std_sex,std_birth,std_in,std_address) VALUES (2,'张二','男','1993-01-02','2011-09-01','江苏省南京市雨花台区');
INSERT INTO student(std_id,std_name,std_sex,std_birth,std_in,std_address) VALUES (3,'张三','男','1993-01-03','2011-09-01','江苏省南京市雨花台区');
INSERT INTO student(std_id,std_name,std_sex,std_birth,std_in,std_address) VALUES (4,'张四','男','1993-01-04','2011-09-01','江苏省南京市雨花台区');
#查询
select * from student;
#退出
\q

#登录slave1 slave2验证是否同步
#alibaby用户登录slave1
gsql -h 192.168.77.162 -p 15400 -U alibaby -W Alibaby@007 -d alibabydb
#查询验证
select * from student;

#alibaby用户登录slave2
gsql -h 192.168.77.163 -p 15400 -U alibaby -W Alibaby@007 -d alibabydb
#查询验证
select * from student;
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.

三.一主一备一级联集群安装

上一套openGauss数据库,如何规划部署?(续)---一主二备一主一备一级联_服务器_02

1.创建一主一备一级联的XML配置文件

节点3增加 <PARAM name="cascadeRole" value="on"/>    其他都一样,不再部署。

#master节点
cd /gauss/soft/
cat >>cluster_config.xml<<'EOF'
<?xml version="1.0" encoding="UTF-8"?> 
<ROOT> 
    <!-- openGauss整体信息 --> 
    <CLUSTER> 
        <PARAM name="clusterName" value="Cluster_alibaby" /> 
        <PARAM name="nodeNames" value="master,slave1,slave2" />     
        <PARAM name="gaussdbAppPath" value="/gauss/gaussdb/app" /> 
        <PARAM name="gaussdbLogPath" value="/gauss/gaussdb/log" /> 
        <PARAM name="tmpMppdbPath" value="/gauss/gaussdb/tmp"/> 
        <PARAM name="gaussdbToolPath" value="/gauss/gaussdb/om" /> 
        <PARAM name="corePath" value="/gauss/gaussdb/corefile"/> 
        <PARAM name="backIp1s" value="192.168.77.161,192.168.77.162,192.168.77.163"/> 
     
    </CLUSTER> 
    <!-- 每台服务器上的节点部署信息 --> 
    <DEVICELIST> 
        <!-- node1上的节点部署信息 --> 
        <DEVICE sn="master"> 
            <PARAM name="name" value="master"/> 
            <PARAM name="azName" value="AZ1"/> 
            <PARAM name="azPriority" value="1"/> 
            <!-- 如果服务器只有一个网卡可用,将backIP1和sshIP1配置成同一个IP --> 
            <PARAM name="backIp1" value="192.168.77.161"/> 
            <PARAM name="sshIp1" value="192.168.77.161"/> 
            <!--CM节点部署信息--> 
			<!--暂不配置
            <PARAM name="cmsNum" value="1"/> 
            <PARAM name="cmServerPortBase" value="15000"/> 
            <PARAM name="cmServerListenIp1" value="192.168.77.161,192.168.77.162,192.168.77.163"/> 
            <PARAM name="cmServerHaIp1" value="192.168.77.161,192.168.77.162,192.168.77.163"/> 
            <PARAM name="cmServerlevel" value="1"/> 
            <PARAM name="cmServerRelation" value="master,slave1,slave2"/> 
            <PARAM name="cmDir" value="/gauss/gaussdb/data/cmserver"/> 
			-->
	    <!--dn数据库主节点部署信息--> 
		    <!--DBnode-->
            <PARAM name="dataNum" value="1"/> 
			<!--数据库端口号-->
	        <PARAM name="dataPortBase" value="15400"/> 
			<!--数据库主节点上的数据目录,及备机数据目录-->
	        <PARAM name="dataNode1" value="/gauss/gaussdb/data/dn,slave1,/gauss/gaussdb/data/dn,slave2,/gauss/gaussdb/data/dn"/> 
            <!--数据库主节点上的xlog目录,及备机xlog目录-->
            <PARAM name="dataNodeXlogPath1" value="/gauss/gaussdb/gauss_xlog,/gauss/gaussdb/gauss_xlog,/gauss/gaussdb/gauss_xlog "/>
			<!--数据库节点上设定同步模式的节点数-->
			<PARAM name="dataNode1_syncNum" value="0"/> 
        
		</DEVICE> 
 
        <!-- node2上的节点部署信息,其中“name”的值配置为主机名称 --> 
        <DEVICE sn="slave1"> 
            <PARAM name="name" value="slave1"/> 
            <PARAM name="azName" value="AZ1"/> 
            <PARAM name="azPriority" value="1"/> 
            <!-- 如果服务器只有一个网卡可用,将backIP1和sshIP1配置成同一个IP --> 
            <PARAM name="backIp1" value="192.168.77.162"/> 
            <PARAM name="sshIp1" value="192.168.77.162"/> 
            <!-- cm --> 
			<!-- 暂不配置
            <PARAM name="cmServerPortStandby" value="15000"/> 
            <PARAM name="cmDir" value="/gauss/gaussdb/data/cmserver"/> 
			-->
	    </DEVICE> 
 
        <!-- node3上的节点部署信息,其中“name”的值配置为主机名称 --> 
        <DEVICE sn="slave2"> 
            <PARAM name="name" value="slave2"/> 
            <PARAM name="azName" value="AZ1"/> 
            <PARAM name="azPriority" value="1"/> 
            <!-- 如果服务器只有一个网卡可用,将backIP1和sshIP1配置成同一个IP --> 
            <PARAM name="backIp1" value="192.168.77.163"/> 
            <PARAM name="sshIp1" value="192.168.77.163"/> 
            <PARAM name="cascadeRole" value="on"/>
            <!-- cm --> 
			<!-- 暂不配置
            <PARAM name="cmServerPortStandby" value="15000"/> 
            <PARAM name="cmDir" value="/opt/huawei/data/cmserver"/> 
			-->
	</DEVICE> 
    </DEVICELIST> 
</ROOT>
EOF
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
原创作者: alibaby 转载于: https://blog.51cto.com/alibaby/11511811
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐

  • 浏览量 70
  • 收藏 0
  • 0

所有评论(0)

查看更多评论 
已为社区贡献1条内容