DM8读写分离集群实施方案(一主一备,确认监视器,实时主备)

1.系统(软硬件)环境

1.1服务器具体配置信息

名称cpu内存硬盘网卡
yzjdwp2c2G40G2块虚拟网卡
yzjdws2c2G40G2块虚拟网卡
yzjdwm2C2G40G2块虚拟网卡

1.2软件环境

操作系统数据库版本
CentOS Linux release 8.2.2004 (Core) dm8

 

1.3网络环境

2.安装前准备

2.1数据库存放路径规划

名称存放路径说明
安装路径/opt/dmdbmsDM安装程序文件和数据文件的路径,挂载在存储设备SSD上。
数据文件路径/data/dmdbms
归档日志文件路径/data/dmdbms/arch本地服务器的机械磁盘上,不要和上面存储设备在同一介质上。
备份文件路径/opt/dmbak

2.2网络及端口规划

ip规划

主机类型ip实例名
主库192.168.6.170(外部通信)GRP1_RT_01
172.16.6.170(内部通信)
备库192.168.6.171(外部通信)GRP1_RT_02
172.16.6.171(内部通信)
确认监视器192.168.6.172(外部通信) 
172.16.6.172(内部通信)

端口规划

实例名PORT_NUMMAL_INST_DW_PORTMAL_HOSTMAL_PORTMAL_DW_PORT
GRP1_RT_0152365336172.16.6.17054365536
GRP1_RT_0252365336172.16.6.17154365536
      

其中端口作用:
PORT_NUM:是数据库实例的监听端口,监听用户的连接请求,dmmal.ini中的[MAL_INST_NAME:MAL_INST_PORT]要与 dm.ini 中的[INSTANCE_NAME: PORT_NUM]保持一致。
MAL_INST_DW_PORT :实例对守护进程的监听端口,守护进程使用 MAL_HOST + MAL_INST_DW_PORT 创建到实例的 TCP 连接。
MAL_HOST:内网ip地址
MAL IP :地址,使用 MAL_HOST + MAL_PORT 创建 MAL 链路
MAL_PORT MAL: 监听端口,用于创建 MAL 链路,同一个实例的 MAL 配置项中,MAL_PORT 不能和实例 dm.ini 中的两个端口相同,避免端口绑定冲突。
MAL_DW_PORT: 守护进程监听端口,其他守护进程或监视器使用 MAL_HOST + MAL_DW_PORT 创建 TCP连接。监视器配置文件 dmmonitor.ini 中,MON_DW_IP 就是一组 MAL_HOST:MAL_DW_PORT。2.3配置操作系统环境

2.3.1关闭防火墙

[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl disable firewalld

2.3.2关闭selinux

[root@localhost ~]# vim /etc/sysconfig/selinux
SELINUX=disabled

2.3.3重启操作系统

[root@localhost ~]# reboot

2.3.4修改主机名

[root@localhost ~]# hostname
localhost.localdomain    ##dm数据库的安装在生产中要慎重考虑主机名,避免二次修改。
[root@localhost ~]# hostnamectl set-hostname yzjdwp/yzjdws/yzjdwm
[root@localhost ~]# hostname    ##验证是否成功

2.3.5修改内核参数

[root@localhost ~]# cat /etc/sysctl.conf
fs.file-max = 6815744    
fs.aio-max-nr = 1048576   
kernel.shmall = 6710886   
kernel.shmmax = 27487790694    
kernel.shmmni = 4096    
kernel.sem = 250 32000 100 128
net.ipv4.ip_local_port_range = 9000 65500    
net.core.rmem_default = 4194304    
net.core.rmem_max = 4194304    
net.core.wmem_default = 262144    
net.core.wmem_max = 1048576

vm.swappiness = 0
vm.dirty_background_ratio = 3
vm.dirty_ratio = 80
vm.dirty_expire_centisecs = 500
vm.dirty_writeback_centisecs = 100


[root@localhost ~]# /sbin/sysctl -p   //执行生效

2.3.6添加下列参数到/etc/security/limits.conf 

* soft nproc  652141
* hard nproc  652141
* soft nofile  652141
* hard nofile  652141

2.3.7添加下列条目到/etc/pam.d/login

session    required        /lib64/security/pam_limits.so
session    required        pam_limits.so

2.3.8添加用户和用户组信息

[root@localhost ~]# groupdel dinstall
[root@localhost ~]# groupadd dinstall
[root@localhost ~]# useradd -g dinstall -m -d /home/dmdba -s /bin/bash dmdba
[root@localhost ~]# echo dmdba | passwd --stdin dmdba
Changing password for user dmdba.
passwd: all authentication tokens updated successfully.
[root@localhost ~]# id dmdba
uid=1001(dmdba) gid=1001(dinstall) 组=1001(dinstall)

2.3.9新增.bash_profile

export TMP=/tmp
export DM_INSTALL_TMPDIR=$TMP

2.3.10创建目录结构

[root@localhost ~]# mkdir /opt/{dmdbms,dmbak} -p
[root@localhost ~]# mkdir /data/dmdbms/arch -p
[root@localhost ~]# chown -R dmdba.dinstall /opt/dmdbms /opt/dmbak/ /data/dmdbms
[root@localhost ~]# chmod 775 /opt/dmdbms /opt/dmbak/ /data/dmdbms

2.3.11安装程序组件

yum -y install dstat
yum -y install expect
yum -y install perf
yum -y install kernel-devel
yum -y install kernel
yum -y install kernel-headers
yum -y install gdbm
yum -y install gdb
yum -y install cmake
yum -y install gdbm-devel
yum -y install binutils
yum -y install compat-libstdc++-33
yum -y install elfutils-libelf
yum -y install elfutils-libelf-devel
yum -y install gcc
yum -y install gcc-c++
yum -y install glibc
yum -y install glibc-common
yum -y install glibc-devel
yum -y install glibc-headers
yum -y install libaio
yum -y install libaio-devel
yum -y install libgcc-4.1.2
yum -y install libstdc++
yum -y install libstdc++-devel
yum -y install make
yum -y install unzip
yum -y install zip
yum -y install numactl-devel
yum -y install sysstat
yum -y install unixODBC     
yum -y install unixODBC-devel
yum -y install vnc
yum -y install xterm
yum -y install ksh
yum -y install pdksh

2.3.12上传数据安装包到/tmp/dmsoft

[root@localhost ~]# mkdir -p /tmp/dmsoft
[root@localhost ~]# chown -R dmdba.dinstall /tmp/dmsoft/DMInstall.bin

2.4安装数据库

[dmdba@yzjdwm dmsoft]$ ./DMInstall.bin -i
请选择安装语言(C/c:中文 E/e:英文) [C/c]:c
解压安装程序......... 
欢迎使用达梦数据库安装程序

是否输入Key文件路径? (Y/y:是 N/n:否) [Y/y]:n

是否设置时区? (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]:

安装类型:
1 典型安装
2 服务器
3 客户端
4 自定义
请选择安装类型的数字序号 [1 典型安装]:
所需空间: 1071M

请选择安装目录 [/home/dmdba/dmdbms]:/opt/dmdbms
可用空间: 29G
是否确认安装路径(/opt/dmdbms)? (Y/y:是 N/n:否)  [Y/y]:y

安装前小结
安装位置: /opt/dmdbms
所需空间: 1071M
可用空间: 29G
版本信息: 
有效日期: 
安装类型: 典型安装
是否确认安装? (Y/y:是 N/n:否):y
2020-10-02 21:13:40 
[INFO] 安装达梦数据库...
2020-10-02 21:13:41 
[INFO] 安装 基础 模块...
2020-10-02 21:13:44 
[INFO] 安装 服务器 模块...
2020-10-02 21:13:44 
[INFO] 安装 客户端 模块...
2020-10-02 21:13:46 
[INFO] 安装 驱动 模块...
2020-10-02 21:13:46 
[INFO] 安装 手册 模块...
2020-10-02 21:13:47 
[INFO] 安装 服务 模块...
2020-10-02 21:13:47 
[INFO] 移动ant日志文件。
2020-10-02 21:13:48 
[INFO] 安装达梦数据库完成。

请以root系统用户执行命令:
/opt/dmdbms/script/root/root_installer.sh

安装结束

[dmdba@yzjdwm dmsoft]$ exit
注销
[root@yzjdwm dmdba]# /opt/dmdbms/script/root/root_installer.sh
移动 /opt/dmdbms/bin/dm_svc.conf 到/etc目录
修改服务器权限
创建DmAPService服务
Created symlink /etc/systemd/system/multi-user.target.wants/DmAPService.service → /usr/lib/systemd/system/DmAPService.service.
创建服务(DmAPService)完成
启动DmAPService服务

2.5修改.bash_profile环境变量

export PATH="DM_HOME/bin:$DM_HOME/tool:$PATH"

2.6dmdba环境变量如下所示

# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
	. ~/.bashrc
fi


# User specific environment and startup programs

export TMP=/tmp
export DM_INSTALL_TMPDIR=$TMP
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/opt/dmdbms/bin"
export DM_HOME="/opt/dmdbms"
export PATH="$DM_HOME/bin:$DM_HOME/tool:$PATH"

3.初始化数据库

3.1初始化实例,分别在主库和备库初始化实例

[dmdba@yzjdwp ~]$ dminit PATH=/data/dmdbms INSTANCE_NAME=GRP1_RT_01 PAGE_SIZE=16 LOG_SIZE=1024 SYSDBA_PWD=SYSDBA123 MAL_FLAG=0 ARCH_FLAG=1
[dmdba@yzjdws ~]$ dminit PATH=/data/dmdbms INSTANCE_NAME=GRP1_RT_02 PAGE_SIZE=16 LOG_SIZE=1024 SYSDBA_PWD=SYSDBA123 MAL_FLAG=0 ARCH_FLAG=1

3.2注册服务

#root用户注册服务(GRP1_RT_01)
[root@yzjdwp ~]# /opt/dmdbms/script/root/dm_service_installer.sh -t dmserver -dm_ini /data/dmdbms/DAMENG/dm.ini -p GRP1_RT_01
#root用户注册服务(GRP1_RT_02)
[root@yzjdws ~]# /opt/dmdbms/script/root/dm_service_installer.sh -t dmserver -dm_ini /data/dmdbms/DAMENG/dm.ini -p GRP1_RT_02

4.脱机备份主库,备库还原

1. 正常关闭主库
[root@yzjdwp ~]#  su - dmdba
[dmdba@yzjdwp ~]$ DmServiceGRP1_RT_01 start
[dmdba@yzjdwp ~]$ DmServiceGRP1_RT_01 stop
2. 进行脱机备份
[dmdba@yzjdwp ~]$ dmrman CTLSTMT="BACKUP DATABASE '/data/dmdbms/DAMENG/dm.ini' FULL TO BACKUP_FILE1 BACKUPSET '/opt/dmbak/BACKUP_FILE_01'"
3. 拷贝备份文件到备库所在机器
[dmdba@yzjdwp ~]$ scp -r /opt/dmbak/BACKUP_FILE_01 dmdba@192.168.6.171:/opt/dmbak
4. 执行脱机数据库还原与恢复
[dmdba@yzjdws ~]$ dmrman CTLSTMT="RESTORE DATABASE '/data/dmdbms/DAMENG/dm.ini' FROM BACKUPSET '/opt/dmbak/BACKUP_FILE_01'"
[dmdba@yzjdws ~]$ dmrman CTLSTMT="RECOVER DATABASE '/data/dmdbms/DAMENG/dm.ini' FROM BACKUPSET '/opt/dmbak/BACKUP_FILE_01'"
[dmdba@yzjdws ~]$ dmrman CTLSTMT="RECOVER DATABASE '/data/dmdbms/DAMENG/dm.ini' UPDATE DB_MAGIC"

5.配置主库GRP1_RT_01

5.1配置dm.ini,主要修改ALTER_MODE_STATUS,ENABLE_OFFLINE_TS,MAL_INI ,ARCH_INI 

#实例名,建议使用―组名_守护环境_序号‖的命名方式,总长度不能超过 16
INSTANCE_NAME  = GRP1_RT_01
PORT_NUM  = 5236 				#数据库实例监听端口
DW_INACTIVE_INTERVAL  = 60 		#接收守护进程消息超时时间
ALTER_MODE_STATUS  = 0 		#不允许手工方式修改实例模式/状态/OGUID
ENABLE_OFFLINE_TS  = 2 			#不允许备库 OFFLINE 表空间
MAL_INI = 1 						#打开 MAL 系统
ARCH_INI  = 1 					#打开归档配置
RLOG_SEND_APPLY_MON = 64 		#统计最近 64 次的日志发送信息

5.2配置dmmal.ini(主库和备库一致)

MAL_CHECK_INTERVAL = 5 #MAL链路检测时间间隔 
MAL_CONN_FAIL_INTERVAL = 5 #判定MAL链路断开的时间 

[MAL_INST1] 
MAL_INST_NAME = GRP1_RT_01 #实例名和dm.ini中的INSTANCE_NAME一致 
MAL_HOST = 172.16.6.170 #MAL 系统监听TCP连接的IP地址 
MAL_PORT = 5436 #MAL  #系统监听TCP连接的端口 
MAL_INST_HOST = 192.168.6.170 #实例的对外服务IP地址 
MAL_INST_PORT = 5236 #实例的对外服务端口,和dm.ini中的PORT_NUM一致
MAL_DW_PORT = 5536 #实例对应的守护进程监听TCP连接的端口 
MAL_INST_DW_PORT = 5336

[MAL_INST2] 
MAL_INST_NAME = GRP1_RT_02 
MAL_HOST = 172.16.6.171 
MAL_PORT = 5436 
MAL_INST_HOST = 192.168.6.171
MAL_INST_PORT = 5236
MAL_DW_PORT = 5536
MAL_INST_DW_PORT = 5336

5.3配置主库dmarch.ini

[ARCHIVE_REALTIME]
ARCH_TYPE = REALTIME  #即时归档类型
ARCH_DEST = GRP1_RT_02  #即时归档目标实例名

[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL #本地归档类型
ARCH_DEST = /data/dmdbms/arch #本地归档文件存放路径
ARCH_FILE_SIZE = 512  #单位Mb,本地单个归档文件最大值
ARCH_SPACE_LIMIT  = 40960 #单位Mb,0表示无限制,范围1024~4294967294M

5.4配置主库dmwatcher.ini

[GRP1] 
DW_TYPE = GLOBAL #全局守护类型 
DW_MODE = AUTO #自动切换模式 
DW_ERROR_TIME = 10 #远程守护进程故障认定时间 
INST_RECOVER_TIME = 60 #主库检测备库故障恢复的时间间隔 
INST_ERROR_TIME = 10 #本地实例故障认定时间 
INST_OGUID = 453332 #守护系统唯一OGUID值
INST_INI = /data/dmdbms/DAMENG/dm.ini #dm.ini配置文件路径 
INST_AUTO_RESTART = 1 #实例自动重启 
INST_STARTUP_CMD = /opt/dmdbms/bin/dmserver #命令行方式启动 
RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阀值,默认关闭
RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阀值,默认关闭

5.5主库启动到mount状态

[dmdba@yzjdwp ~]$ dmserver /data/dmdbms/DAMENG/dm.ini mount 

5.6主库配置OGUID和修改数据库模式

[root@yzjdwp ~]# su - dmdba
[dmdba@yzjdwp ~]$ disql SYSDBA/SYSDBA123

服务器[LOCALHOST:5236]:处于普通配置状态
登录使用时间 : 3.514(ms)
disql V8
SQL> SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
DMSQL 过程已成功完成
已用时间: 8.164(毫秒). 执行号:0.
SQL> sp_set_oguid(453332);
DMSQL 过程已成功完成
已用时间: 5.304(毫秒). 执行号:1.
SQL> alter database primary;
操作已执行
已用时间: 1.698(毫秒). 执行号:0.
SQL> SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);
DMSQL 过程已成功完成
已用时间: 5.478(毫秒). 执行号:2.

6.将数据文件传输到备库,使用dmdba用户传输文件

[dmdba@yzjdwp DAMENG]$  scp dm.ini dmarch.ini dmmal.ini dmwatcher.ini dmdba@192.168.6.171:/data/dmdbms/DAMENG

7.配置备库GRP1_RT_02

7.1配置dm.ini

#实例名,建议使用―组名_守护环境_序号‖的命名方式,总长度不能超过 16
INSTANCE_NAME  = GRP1_RT_02
PORT_NUM  = 5236 				#数据库实例监听端口
DW_INACTIVE_INTERVAL  = 60 		#接收守护进程消息超时时间
ALTER_MODE_STATUS  = 0 		#不允许手工方式修改实例模式/状态/OGUID
ENABLE_OFFLINE_TS  = 2 			#不允许备库 OFFLINE 表空间
MAL_INI = 1 						#打开 MAL 系统
ARCH_INI  = 1 					#打开归档配置
RLOG_SEND_APPLY_MON = 64 		#统计最近 64 次的日志发送信息

7.2配置备库dmmal.ini(主备库一致)

MAL_CHECK_INTERVAL = 5 #MAL链路检测时间间隔 
MAL_CONN_FAIL_INTERVAL = 5 #判定MAL链路断开的时间 

[MAL_INST1] 
MAL_INST_NAME = GRP1_RT_01 #实例名和dm.ini中的INSTANCE_NAME一致 
MAL_HOST = 172.16.6.170 #MAL 系统监听TCP连接的IP地址 
MAL_PORT = 5436 #MAL  #系统监听TCP连接的端口 
MAL_INST_HOST = 192.168.6.170 #实例的对外服务IP地址 
MAL_INST_PORT = 5236 #实例的对外服务端口,和dm.ini中的PORT_NUM一致
MAL_DW_PORT = 5536 #实例对应的守护进程监听TCP连接的端口 
MAL_INST_DW_PORT = 5336

[MAL_INST2] 
MAL_INST_NAME = GRP1_RT_02 
MAL_HOST = 172.16.6.171 
MAL_PORT = 5436 
MAL_INST_HOST = 192.168.6.171
MAL_INST_PORT = 5236
MAL_DW_PORT = 5536
MAL_INST_DW_PORT = 5336

7.3配置备库dmarch.ini

[ARCHIVE_REALTIME]
ARCH_TYPE = REALTIME  #即时归档类型
ARCH_DEST = GRP1_RT_01  #即时归档目标实例名

[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL #本地归档类型
ARCH_DEST = /data/dmdbms/arch #本地归档文件存放路径
ARCH_FILE_SIZE = 512  #单位Mb,本地单个归档文件最大值
ARCH_SPACE_LIMIT  = 40960 #单位Mb,0表示无限制,范围1024~4294967294M

7.4配置备库dmwatcher.ini

[GRP1] 
DW_TYPE = GLOBAL #全局守护类型 
DW_MODE = AUTO #自动切换模式 
DW_ERROR_TIME = 10 #远程守护进程故障认定时间 
INST_RECOVER_TIME = 60 #主库检测备库故障恢复的时间间隔 
INST_ERROR_TIME = 10 #本地实例故障认定时间 
INST_OGUID = 453332 #守护系统唯一OGUID值
INST_INI = /data/dmdbms/DAMENG/dm.ini #dm.ini配置文件路径 
INST_AUTO_RESTART = 1 #实例自动重启 
INST_STARTUP_CMD = /opt/dmdbms/bin/dmserver #命令行方式启动 
RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阀值,默认关闭
RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阀值,默认关闭

7.5启动数据库到mount状态

[dmdba@yzjdws ~]$ dmserver /data/dmdbms/DAMENG/dm.ini mount 

7.6修改数据库oguid和数据库模式

[dmdba@yzjdws ~]$ disql SYSDBA/SYSDBA123

服务器[LOCALHOST:5236]:处于普通配置状态
登录使用时间 : 3.401(ms)
disql V8
SQL> SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
DMSQL 过程已成功完成
已用时间: 7.396(毫秒). 执行号:0.
SQL> sp_set_oguid(453332);
DMSQL 过程已成功完成
已用时间: 10.926(毫秒). 执行号:1.
SQL> alter database standby;
操作已执行
已用时间: 1.816(毫秒). 执行号:0.
SQL> SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);
DMSQL 过程已成功完成
已用时间: 2.641(毫秒). 执行号:2.
SQL>

8.注册并启动守护进程

#root用户注册服务(GRP1_RT_01)
/opt/dmdbms/script/root/dm_service_installer.sh -t dmwatcher -watcher_ini /data/dmdbms/DAMENG/dmwatcher.ini -p rt1
#root用户注册服务(GRP1_RT_02)
/opt/dmdbms/script/root/dm_service_installer.sh -t dmwatcher -watcher_ini /data/dmdbms/DAMENG/dmwatcher.ini -p rt2

9.执行并优化脚本

10配置监视器

1.配置dmmonitor.ini

MON_DW_CONFIRM = 1 #确认监视器模式 
MON_LOG_PATH = /data/dmdbms/log #监视器日志文件存放路径 
MON_LOG_INTERVAL = 60 #每隔 60s 定时记录系统信息到日志文件
MON_LOG_FILE_SIZE = 32 #每个日志文件最大32M 
MON_LOG_SPACE_LIMIT = 0 #不限定日志文件总占用空间 

[GRP1] 
MON_INST_OGUID = 453332 #组 GRP1 的唯一OGUID 值 
MON_DW_IP = 172.16.6.170:5536 
MON_DW_IP = 172.16.6.171:5536

2.注册监视器服务

#root用户注册服务
/opt/dmdbms/script/root/dm_service_installer.sh -t dmmonitor -monitor_ini /data/dmdbms/dmmonitor.ini -p m1
#后台启动监视器
systemctl start DmMonitorServicem1

11主备同步测试及主备切换

11.1主备同步

-----主库创建表test1
SQL> create table test1 as select * from sysobjects;
-----备库查询
SQL> select count(*) from test1;

11.2主备切换

dmmonitor /data/dmdbms/dmmonitor.ini
show
login
switchover GRP1.GRP1_RT_01
switchover GRP1.GRP1_RT_02

12定时备份策略

全备增备定时删除过期备份
每周六00:00每周日,周一至周五00:00增备每周五删除60天前的备份

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

竹蜻蜓vYv

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值