1 安装前准备
1.1 环境规划
实例信息 页大小:32
簇大小:32
字符集:GB18030
端口号:5236
日志文件大小:2048*2
服务名 DmServiceDMSERVER
安装路径 数据库安装文件路径:/opt/setup/
数据库安装路径:/opt/dmdbms/
数据库实例路径:/opt/dmmdbms/data
数据库归档路径:/opt/dmmdbms/data/arch
数据库备份路径:/opt/dmmdbms/data/bak
操作系统版本 Kylin Linux Advanced Server release V10 (Tercel)
DM8安装版本 v8.1.2.162-Build(2022.10.19-172201-20018)ent
说明:具体规划及部署方式以现场环境为准。
2 DM8安装
2.1 环境初始化
2.1.1 调整sysctl.conf
[root@~]# vi /etc/sysctl.conf
vm.overcommit_memory = 0
[root@~]# sysctl -p
[root@~]# sysctl -p /etc/sysctl.conf
2.1.2 调整limits.conf
[root@~]# ulimit -n65536
[root@~]# vi /etc/security/limits.conf
dmdba soft data unlimited
dmdba hard data unlimited
dmdba soft fsize unlimited
dmdba hard fsize unlimited
dmdba soft nofile 65536
dmdba hard nofile 65536
dmdba soft nproc 10240
dmdba hard nproc 10240
dmdba soft nice 0
dmdba hard nice 0
dmdba soft as unlimited
dmdba hard as unlimited
dmdba soft core unlimited
dmdba hard core unlimited
2.1.3 调整system.conf
[root@~]# vi /etc/systemd/system.conf
DefaultLimitFSIZE=unlimited
DefaultLimitDATA=unlimited
DefaultLimitCORE=unlimited
DefaultLimitNOFILE=65535
DefaultLimitAS=unlimited
DefaultLimitNPROC=10240
DefaultLimitNICE=0
2.1.4 调整profile
[root@~]# vi /etc/profile
ulimit -n 65536
[root@~]# source /etc/profile
2.1.5 关闭selinux
[root@~]# vi /etc/sysconfig/selinux
SELINUX = disabled
2.1.6 禁用透明大页&关闭numa
--编辑grub文件,如下图所示加上:transparent_hugepage=never numa=off
[root@~]# vi /etc/default/grub
[root@localhost ]# vi /etc/default/grub
[root@localhost ]# cat /etc/default/grub
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="crashkernel=auto rhgb quiet transparent_hugepage=never numa=off"
GRUB_DISABLE_RECOVERY="true"
[root@localhost ]#
重新生成/etc/grub2.cfg 文件:
[root@~]# grub2-mkconfig -o /etc/grub2.cfg
[root@localhost ]# grub2-mkconfig -o /etc/grub2.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-3.10.0-1160.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-1160.el7.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-782dda3ee35f470cab938d0f8a5ce9d3
Found initrd image: /boot/initramfs-0-rescue-782dda3ee35f470cab938d0f8a5ce9d3.img
done
[root@localhost ]#
--重启之后,确认是否禁用透明大页
[root@localhost ~]# cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]
[root@localhost ~]#
--重启之后,确认是否关闭numa
[root@~]# dmesg | grep -i numa
[root@localhost ~]# dmesg | grep -i numa
[ 0.000000] Command line: BOOT_IMAGE=/vmlinuz-3.10.0-1160.el7.x86_64 root=UUID=a1e8231d-db58-4d06-b9a1-1dfb37e8a7fb ro crashkernel=auto rhgb quiet transparent_hugepage=never numa=off
[ 0.000000] NUMA turned off
[ 0.000000] Kernel command line: BOOT_IMAGE=/vmlinuz-3.10.0-1160.el7.x86_64 root=UUID=a1e8231d-db58-4d06-b9a1-1dfb37e8a7fb ro crashkernel=auto rhgb quiet transparent_hugepage=never numa=off
[root@localhost ~]#
--重启之后,再次确认是否关闭numa
[root@~]# cat /proc/cmdline
[root@localhost ~]# cat /proc/cmdline
BOOT_IMAGE=/vmlinuz-3.10.0-1160.el7.x86_64 root=UUID=a1e8231d-db58-4d06-b9a1-1dfb37e8a7fb ro crashkernel=auto rhgb quiet transparent_hugepage=never numa=off
[root@localhost ~]#
2.1.7 关闭防火墙
(1)关闭防火墙
[root@~]# systemctl stop firewalld
(2)关闭防火墙自动启动
[root@~]# systemctl disable firewalld
2.1.8 调整MALLOC_ARENA_MAX
初始化完实例后,修改启动服务的文件
[dmdba@~]$ vi /opt/dmdbms/bin/DmServiceDMSERVER
找到:MALLOC_ARENA_MAX
修改为:export MALLOC_ARENA_MAX=1
2.2 用户与安装目录
2.2.1 创建用户与组
[root@localhost ~]# groupadd dinstall -g 2001
[root@localhost ~]# useradd -u 1001 -g dinstall dmdba
[root@localhost ~]# passwd dmdba
Changing password for user dmdba.
New password:
BAD PASSWORD: The password contains the user name in some form
Retype new password:
passwd: all authentication tokens updated successfully.
[root@localhost ~]#
注意:dmdba密码设置为:Dameng@1234
2.2.2 创建目录及授权
选择剩余存储空间最大的目录,安装数据库及初始化实例。
[root@localhost ~]# mkdir -p /opt/dmdbms /opt/setup
[root@localhost ~]# chown dmdba.dinstall /opt/dmdbms /opt/setup -R;chmod 777 /opt/dmdbms /opt/setup -R
2.3 安装数据库DM8
建议使用dmdba用户执行安装以及数据库相关操作。
2.3.1 命令行方式
数据库版本路径:/opt/setup
数据库安装路径:/opt/dmdbms
2.3.1.1 解压安装包
[dmdba@localhost dm8]$ cd /opt/setup/
[dmdba@localhost setup]$ ls -l
总用量 1171080
-rw-r--r-- 1 dmdba dinstall 1199181888 11月 8 18:25 'RH6.0_DB_v8.1.2.162-Build(2022.10.19-172201-20018)ent.zip'
[dmdba@localhost setup]$
[dmdba@localhost setup]$ unzip RH6.0_DB_v8.1.2.162-Build(2022.10.19-172201-20018)ent.zip
Archive: RH6.0_DB_v8.1.2.162-Build(2022.10.19-172201-20018)ent.zip
inflating: RH6.0_DB_v8.1.2.162-Build(2022.10.19-172201-20018)ent_dmdci.zip
inflating: RH6.0_DB_v8.1.2.162-Build(2022.10.19-172201-20018)ent_symbols.tar.gz
inflating: DMInstall.bin
[dmdba@localhost setup]$
[dmdba@localhost setup]$ ll
总用量 2363208
-rw-r--r-- 1 dmdba dinstall 983006084 10月 20 08:53 DMInstall.bin
-rw-r--r-- 1 dmdba dinstall 76699499 10月 24 11:30 'RH6.0_DB_v8.1.2.162-Build(2022.10.19-172201-20018)ent_dmdci.zip'
-rw-r--r-- 1 dmdba dinstall 161029769 10月 24 11:31 'RH6.0_DB_v8.1.2.162-Build(2022.10.19-172201-20018)ent_symbols.tar.gz'
-rw-r--r-- 1 dmdba dinstall 1199181888 11月 8 18:25 'RH6.0_DB_v8.1.2.162-Build(2022.10.19-172201-20018)ent.zip'
[dmdba@localhost setup]$
2.3.1.2 安装DM8软件
[dmdba@localhost setup]$ chmod 755 DMInstall.bin
[dmdba@localhost setup]$ ls -l
总用量 2363208
-rwxr-xr-x 1 dmdba dinstall 983006084 10月 20 08:53 DMInstall.bin
-rw-r--r-- 1 dmdba dinstall 76699499 10月 24 11:30 'RH6.0_DB_v8.1.2.162-Build(2022.10.19-172201-20018)ent_dmdci.zip'
-rw-r--r-- 1 dmdba dinstall 161029769 10月 24 11:31 'RH6.0_DB_v8.1.2.162-Build(2022.10.19-172201-20018)ent_symbols.tar.gz'
-rw-r--r-- 1 dmdba dinstall 1199181888 11月 8 18:25 'RH6.0_DB_v8.1.2.162-Build(2022.10.19-172201-20018)ent.zip'
[dmdba@~]$ /opt/dmsetup/DMInstall.bin -i
请选择安装语言(C/c:中文 E/e:英文) [C/c]:C
解压安装程序..........
欢迎使用达梦数据库安装程序
是否输入Key文件路径? (Y/y:是 N/n:否) [Y/y]:Y
请输入Key文件的路径地址 [dm.key]:/opt/setup/dm.key
有效日期: 2022-12-25
服务器颁布类型: 企业版
发布类型: 试用版
用户名称: 武汉达梦公司疫情期间临时授权
授权用户数: 无限制
并发连接数: 无限制
是否设置时区? (Y/y:是 N/n:否) [Y/y]:Y
设置时区:
[ 1]: GTM-12=日界线西
[ 2]: GTM-11=萨摩亚群岛
[ 3]: GTM-10=夏威夷
[ 4]: GTM-09=阿拉斯加
[ 5]: GTM-08=太平洋时间(美国和加拿大)
[ 6]: GTM-07=亚利桑那
[ 7]: GTM-06=中部时间(美国和加拿大)
[ 8]: GTM-05=东部部时间(美国和加拿大)
[ 9]: GTM-04=大西洋时间(美国和加拿大)
[10]: GTM-03=巴西利亚
[11]: GTM-02=中大西洋
[12]: GTM-01=亚速尔群岛
[13]: GTM=格林威治标准时间
[14]: GTM+01=萨拉热窝
[15]: GTM+02=开罗
[16]: GTM+03=莫斯科
[17]: GTM+04=阿布扎比
[18]: GTM+05=伊斯兰堡
[19]: GTM+06=达卡
[20]: GTM+07=曼谷,河内
[21]: GTM+08=中国标准时间
[22]: GTM+09=汉城
[23]: GTM+10=关岛
[24]: GTM+11=所罗门群岛
[25]: GTM+12=斐济
[26]: GTM+13=努库阿勒法
[27]: GTM+14=基里巴斯
请选择设置时区 [21]:21
安装类型:
1 典型安装
2 服务器
3 客户端
4 自定义
请选择安装类型的数字序号 [1 典型安装]:1
所需空间: 1010M
请选择安装目录 [/home/dmdba/dmdbms]:/opt/dmdbms
可用空间: 11G
是否确认安装路径(/opt/dmdbms)? (Y/y:是 N/n:否) [Y/y]:Y
安装前小结
安装位置: /opt/dmdbms
所需空间: 1010M
可用空间: 11G
版本信息: 企业版
有效日期: 2022-12-25
安装类型: 典型安装
是否确认安装? (Y/y:是 N/n:否):Y
2020-12-24 21:52:38 [INFO] 安装达梦数据库...
2020-12-24 21:52:39 [INFO] 安装 基础 模块...
2020-12-24 21:52:48 [INFO] 安装 服务器 模块...
2020-12-24 21:52:48 [INFO] 安装 客户端 模块...
2020-12-24 21:52:56 [INFO] 安装 驱动 模块...
2020-12-24 21:52:58 [INFO] 安装 手册 模块...
2020-12-24 21:53:00 [INFO] 安装 服务 模块...
2020-12-24 21:53:02 [INFO] 移动ant日志文件。
2020-12-24 21:53:03 [INFO] 安装达梦数据库完成。
请以root系统用户执行命令:
/opt/dmdbms/script/root/root_installer.sh
安装结束
[root@localhost setup]# /opt/dmdbms/script/root/root_installer.sh
移动 /opt/dmdbms/bin/dm_svc.conf 到/etc目录
修改服务器权限
创建DmAPService服务
Created symlink from /etc/systemd/system/multi-user.target.wants/DmAPService.service to /usr/lib/systemd/system/DmAPService.service.
创建服务(DmAPService)完成
启动DmAPService服务
[root@localhost setup]#
3 搭建TPCC测试环境
3.1 初始化数据库实例
1.初始化数据库实例,实例参数。
[dmdba@localhost bin]$ cd /opt/dmdbms/bin
[dmdba@localhost bin]$ /opt/dmdbms/bin/dminit path=/opt/dmdbms/data port_num=5236 PAGE_SIZE=32 EXTENT_SIZE=32 LOG_SIZE=2048
initdb V8
db version: 0x7000c
file dm.key not found, use default license!
License will expire on 2023-10-19
Normal of FAST
Normal of DEFAULT
Normal of RECYCLE
Normal of KEEP
Normal of ROLL
log file path: /opt/dmdbms/data/DAMENG/DAMENG01.log
log file path: /opt/dmdbms/data/DAMENG/DAMENG02.log
write to dir [/opt/dmdbms/data/DAMENG].
create dm database success. 2022-11-17 11:30:16
2.注册后台服务
[root@ ~]# cd /opt/dmdbms/script/root
[root@~ root]# ./dm_service_installer.sh -t dmserver -dm_ini /opt/dmdbms/data/DAMENG/dm.ini -p DMSERVER
Created symlink /etc/systemd/system/multi-user.target.wants/DmServiceDMSERVER.service → /usr/lib/systemd/system/DmServiceDMSERVER.service.
创建服务(DmServiceDMSERVER)完成
[root@localhost root]#
3.启动数据库服务
[root@localhost root]# su – dmdba
[dmdba@localhost setup]$ cd /opt/dmdbms/bin
[dmdba@localhost bin]$ ./DmServiceDMSERVER start
Starting DmServiceDMSERVER: [ OK ]
3.2 更换BenchMarkSql_v4.1.1数据库驱动
1.更换原BenchMarkSql_v4.1.1包中数据库驱动版本
达梦8 JDBC驱动版本说明
CREATE TABLE BENCHMARKSQL.DISTRICT (
D_W_ID INT NOT NULL,
D_ID INT NOT NULL,
D_YTD FLOAT,
D_TAX FLOAT,
D_NEXT_O_ID INT,
D_NAME VARCHAR(10),
D_STREET_1 VARCHAR(20),
D_STREET_2 VARCHAR(20),
D_CITY VARCHAR(20),
D_STATE CHAR(2),
D_ZIP CHAR(9),
CLUSTER PRIMARY KEY(D_W_ID,D_ID)
)STORAGE(FILLFACTOR 2,WITHOUT COUNTER);
CREATE TABLE BENCHMARKSQL.CUSTOMER (
C_W_ID INT NOT NULL,
C_D_ID INT NOT NULL,
C_ID INT NOT NULL,
C_DISCOUNT FLOAT,
C_CREDIT CHAR(2),
C_LAST VARCHAR(16),
C_FIRST VARCHAR(16),
C_CREDIT_LIM FLOAT,
C_BALANCE FLOAT,
C_YTD_PAYMENT FLOAT,
C_PAYMENT_CNT INT,
C_DELIVERY_CNT INT,
C_STREET_1 VARCHAR(20),
C_STREET_2 VARCHAR(20),
C_CITY VARCHAR(20),
C_STATE CHAR(2),
C_ZIP CHAR(9),
C_PHONE CHAR(16),
C_SINCE TIMESTAMP,
C_MIDDLE CHAR(2),
C_DATA VARCHAR(500),
CLUSTER PRIMARY KEY(C_W_ID,C_D_ID,C_ID)
)STORAGE(WITHOUT COUNTER);
CREATE SEQUENCE BENCHMARKSQL.HIST_ID_SEQ;
CREATE TABLE BENCHMARKSQL.HISTORY (
HIST_ID INT DEFAULT BENCHMARKSQL.HIST_ID_SEQ.NEXTVAL,
H_C_ID INT,
H_C_D_ID INT,
H_C_W_ID INT,
H_D_ID INT,
H_W_ID INT,
H_DATE TIMESTAMP,
H_AMOUNT FLOAT,
H_DATA VARCHAR(24)
)STORAGE(BRANCH(32,32),WITHOUT COUNTER);
CREATE TABLE BENCHMARKSQL.OORDER (
O_W_ID INT NOT NULL,
O_D_ID INT NOT NULL,
O_ID INT NOT NULL,
O_C_ID INT,
O_CARRIER_ID INT,
O_OL_CNT FLOAT,
O_ALL_LOCAL FLOAT,
O_ENTRY_D TIMESTAMP,
CLUSTER PRIMARY KEY(O_W_ID,O_D_ID,O_ID)
)STORAGE(WITHOUT COUNTER);
CREATE TABLE BENCHMARKSQL.NEW_ORDER (
NO_W_ID INT NOT NULL,
NO_D_ID INT NOT NULL,
NO_O_ID INT NOT NULL,
CLUSTER PRIMARY KEY(NO_W_ID,NO_D_ID,NO_O_ID)
)STORAGE(WITHOUT COUNTER);
CREATE TABLE BENCHMARKSQL.ORDER_LINE (
OL_W_ID INT NOT NULL,
OL_D_ID INT NOT NULL,
OL_O_ID INT NOT NULL,
OL_NUMBER INT NOT NULL,
OL_I_ID INT NOT NULL,
OL_DELIVERY_D TIMESTAMP,
OL_AMOUNT FLOAT,
OL_SUPPLY_W_ID INT,
OL_QUANTITY FLOAT,
OL_DIST_INFO CHAR(24),
CLUSTER PRIMARY KEY(OL_W_ID,OL_D_ID,OL_O_ID,OL_NUMBER)
)STORAGE(WITHOUT COUNTER);
CREATE TABLE BENCHMARKSQL.STOCK (
S_W_ID INT NOT NULL,
S_I_ID INT NOT NULL,
S_QUANTITY FLOAT,
S_YTD FLOAT,
S_ORDER_CNT INT,
S_REMOTE_CNT INT,
S_DATA VARCHAR(50),
S_DIST_01 CHAR(24),
S_DIST_02 CHAR(24),
S_DIST_03 CHAR(24),
S_DIST_04 CHAR(24),
S_DIST_05 CHAR(24),
S_DIST_06 CHAR(24),
S_DIST_07 CHAR(24),
S_DIST_08 CHAR(24),
S_DIST_09 CHAR(24),
S_DIST_10 CHAR(24),
CLUSTER PRIMARY KEY(S_I_ID,S_W_ID)
)STORAGE(WITHOUT COUNTER);
CREATE TABLE BENCHMARKSQL.ITEM (
I_ID INT NOT NULL,
I_NAME VARCHAR(24),
I_PRICE FLOAT,
I_DATA VARCHAR(50),
I_IM_ID INT,
CLUSTER PRIMARY KEY(I_ID)
)STORAGE(WITHOUT COUNTER);
3.4 修改props.dm参数
[root@localhost run]# vi /opt/BenchMarkSql_v4.1.1/run/props.dm
driver=dm.jdbc.driver.DmDriver #JDBC驱动串
conn=jdbc:dm://192.168.10.20:5236 #数据库URL
user=SYSDBA #数据库用户名
password= SYSDBA #数据库用户密码
warehouses=300 #待测仓库个数
terminals=300 #终端个数
runMins=10 #运行时间
runTxnsPerTerminal=0 #每个终端运行的固定事务数量
limitTxnsPerMin=0 #指定每分钟总事务数
#下面五个值的总和必须等于100,默认值为:45, 43, 4, 4 & 4 ,与TPC-C测试定义的比例一致,实际操作过程中,可以调整比重来适应各种场景
newOrderWeight=45
paymentWeight=43
orderStatusWeight=4
deliveryWeight=4
stockLevelWeight=4
3.5 装载数据
[root@localhost]# cd /opt/BenchMarkSql_v4.1.1/run/
[root@localhost]#./runLoader.sh props.dm numWarehouses 300
注:300表示要装载300个仓库
3.6 创建索引
创建索引脚本:
CREATE INDEX NDX_CUSTOMER_NAME ON BENCHMARKSQL.CUSTOMER
(C_W_ID,C_D_ID,C_LAST,C_FIRST);
3.6.1 dm.ini参数优化
说明:以下调优参数为虚拟机,现场环境根据实际服务器资源进行优化
SP_SET_PARA_VALUE(2,'WORKER_THREADS',8);
SP_SET_PARA_VALUE(2,'TASK_THREADS',4);
SP_SET_PARA_VALUE(2,'IO_THR_GROUPS',4);
SP_SET_PARA_VALUE(2,'MAX_OS_MEMORY', 100);
SP_SET_PARA_VALUE(2,'MEMORY_POOL', 300);
SP_SET_PARA_VALUE(2,'MEMORY_N_POOLS', 1);
SP_SET_PARA_VALUE(2,'MEMORY_TARGET', 1000);
SP_SET_PARA_VALUE(2,'BUFFER', 2000);
SP_SET_PARA_VALUE(2,'MAX_BUFFER', 2000);
SP_SET_PARA_VALUE(2,'BUFFER_POOLS', 7);
SP_SET_PARA_VALUE(2,'RECYCLE', 200);
SP_SET_PARA_VALUE(2,'RECYCLE_POOLS', 3);
SP_SET_PARA_VALUE(2,'FAST_POOL_PAGES', 3000);
SP_SET_PARA_VALUE(2,'FAST_ROLL_PAGES', 1000);
SP_SET_PARA_VALUE(2,'MEMORY_MAGIC_CHECK', 1);
SP_SET_PARA_VALUE(2,'ENABLE_FREQROOTS', 1);
SP_SET_PARA_VALUE(1,'HJ_BUF_GLOBAL_SIZE', 500);
SP_SET_PARA_VALUE(1,'HJ_BUF_SIZE', 50);
SP_SET_PARA_VALUE(1,'HAGR_BUF_GLOBAL_SIZE',500);
SP_SET_PARA_VALUE(1,'HAGR_BUF_SIZE', 50);
SP_SET_PARA_VALUE(2,'SORT_FLAG',0);
SP_SET_PARA_VALUE(2,'SORT_BLK_SIZE',1);
SP_SET_PARA_VALUE(2,'SORT_BUF_SIZE', 10);
SP_SET_PARA_VALUE(2,'SORT_BUF_GLOBAL_SIZE', 500);
SP_SET_PARA_VALUE(2,'RLOG_POOL_SIZE', 256);
SP_SET_PARA_VALUE(2,'CACHE_POOL_SIZE', 200);
SP_SET_PARA_VALUE(2,'DICT_BUF_SIZE', 50);
SP_SET_PARA_VALUE(2,'VM_POOL_TARGET', 16384);
SP_SET_PARA_VALUE(2,'SESS_POOL_TARGET', 16384);
SP_SET_PARA_VALUE(2,'USE_PLN_POOL', 1);
SP_SET_PARA_VALUE(2,'ENABLE_MONITOR', 1);
SP_SET_PARA_VALUE(2,'SVR_LOG', 0);
SP_SET_PARA_VALUE(2,'TEMP_SIZE', 1024);
SP_SET_PARA_VALUE(2,'TEMP_SPACE_LIMIT', 102400);
SP_SET_PARA_VALUE(2,'MAX_SESSIONS', 1500);
SP_SET_PARA_VALUE(2,'MAX_SESSION_STATEMENT', 20000);
SP_SET_PARA_VALUE(2,'PK_WITH_CLUSTER', 0);
SP_SET_PARA_VALUE(2,'ENABLE_ENCRYPT',0);
SP_SET_PARA_VALUE(2,'OLAP_FLAG',2);
SP_SET_PARA_VALUE(2,'VIEW_PULLUP_FLAG',1);
SP_SET_PARA_VALUE(2,'OPTIMIZER_MODE',1);
SP_SET_PARA_VALUE(2,'ADAPTIVE_NPLN_FLAG',0);
SP_SET_PARA_VALUE(2,'PARALLEL_PURGE_FLAG',1);
SP_SET_PARA_VALUE(2,'PARALLEL_POLICY',2);
SP_SET_PARA_VALUE(2,'UNDO_EXTENT_NUM',16);
SP_SET_PARA_VALUE(2,'ENABLE_INJECT_HINT',1);
3.7 重启数据库服务
[dmdba@localhost bin]$ ./DmServiceDMSERVER restart
Stopping DmServiceDMSERVER: [ OK ]
Starting DmServiceDMSERVER: [ OK ]
3.8 执行TPCC测试
[root@ localhost]$ cd /opt/BenchMarkSql_v4.1.1/run
[root@ localhost]$ ./runBenchmark.sh props.dm
文章
阅读量
获赞