DM数据库读写分离集群搭建

目录

1、环境说明

1.1 数据准备

(1)正常关闭数据库:前台+后台

(2)进行脱机备份

(3)拷贝备份文件到备机

(4)备机进行脱机数据库还原与恢复

2、配置主库DM_P

2.1 配置dm.ini

2.2 配置dmmal.ini

2.3 配置dmarch.ini

2.4 配置dmwatcher.ini

2.5 以mount配置启动主库

2.6 设置OGUID值

2.7 修改数据库模式

3、配置备库DW_S1

3.1 配置dm.ini

3.2 配置dmmal.ini

3.3 配置dmarch.ini

3.4 配置dmwatcher.ini

3.5 以mount配置启动备库

3.6 设置OGUID值

3.7 修改数据库模式

4、配置备库PW_S2

4.1 配置dmmal.ini

4.2 配置dmarch.ini

4.3 配置dmwatcher.ini

4.4 以mount配置启动备库

4.5 设置OGUID值

4.6 修改数据库模式

5、配置监视器

6、启动守护进程

7、启动监视器


配置读写分离集群,有以下几种配置方案,可以根据实际情况部署:

1.只配置主库和最多8个即时备库。
2.只配置主库和最多8个实时备库。

3.只配置主库和最多8个异步备库。
4.配置主库、最多8个即时备库和最多8个异步备库。

5.配置主库、最多8个实时备库和最多8个异步备库。
在实际应用中,如果数据库规模很大,并且对数据的实时性要求不是很严格,则可以配置多个异步备库用于分担统计报表等任务。

读写分离集群实现读写分离的基本思路是:利用备库提供只读服务、无法修改数据的特性,优先将所有操作发送到备库执行,一旦备库执行报错,则发送到主库重新执行。通过备库“试错”这么一个步骤,自然地将只读操作分流到备库执行。并且,备库“试错”由接口层自动完成,对应用透明。

读写分离集群语句分发流程

1.接口收到用户的请求。

2.接口优先将 SQL 发送到备库执行。

3.备库执行并返回执行结果。如果接口收到的是备库执行成功消息,则转到第 6 步,如果接口收到的是备库执行失败消息,则转到第 4 步。

4.重新将执行失败的 SQL 发送到主库执行。只要第 3 步中的 SQL 在备库执行失败,则同一个事务后续的所有操作(包括只读操作)都会直接发送到主库执行。

5.主库执行并返回执行结果给接口。一旦主库上执行的写事务提交,则下次继续从第1 步开始执行。

6.接口响应用户并将执行结果返回给用户。

1、环境说明

  准备四台机器DW_P、DW_S1、DW_S2、DW_M,DW_P、DW_S1和 DW_S2用来部署主备库,DW_M用来部署确认监视器。其中 DW_P、DW_S1和 DW_S2配置两块网卡,一块接入内部网络交换模块,一块接入到外部交换机,DW_M接入内部网络。
  四台机器事先都安装了DM,安装路径为’/ dm8',执行程序保存在'/dm8/bin'目录中,数据存放路径为’/dm8/data'。
本示例中组名为“GRP1”,配置为读写分离集群,主库命名为“DMDB1”,备库分别命名为“DMDB2”和“DMDB3”。

机器名IP地址初始状态操作系统
DM_P

192.168.174.130(外网)

192.168.158.130(内网)

主库

DMDB1

CentOS-7-x86_64-DVD-2009
DM_S1

192.168.174.131(外网)

192.168.158.131(内网)

备库

DMDB2

CentOS-7-x86_64-DVD-2009
DM_S2

192.168.174.132(外网)

192.168.158.132(内网)

备库

DMDB3

CentOS-7-x86_64-DVD-2009
DM_M

192.168.174.134(外网)

监视器CentOS-7-x86_64-DVD-2009

1.1 数据准备

(1)正常关闭数据库:前台+后台

 如果是克隆的已经安装达梦数据库,初始化过实例的虚拟机,脱机备份前需要先关闭数据库。

后台关闭:

systemctl stop DmServiceDMSERVER.service

数据库在初始化实例之后必须前台启动刷新一下!不然会出现守护进程无法自动将数据库转变为open状态,数据库将一直处于mount状态。

前台打开:切换到达梦数据库安装的bin目录下执行下面语句,我的达梦数据库bin目录路径为:/dm8/bin

./dmserver /dm8/data/DAMENG/dm.ini

前台关闭:Ctrl+C

(2)进行脱机备份

到bin目录下使用dmrman工具进行脱机备份。

./dmrman.sh    


RMAN> backup database '/dm8/data/DAMENG/dm.ini' full backupset '/dm8/fullbak';

(3)拷贝备份文件到备机

[dmdba@localhost ~]$ scp -r 192.168.174.130:/dm8/fullbak /dm8/

(4)备机进行脱机数据库还原与恢复

执行/dm8/bin目录下的dmrman工具

restore database '/dm8/data/DAMENG/dm.ini' from backsupset '/dm8/fullbak';
recover database '/dm8/data/DAMENG/dm.ini' from backupset '/dm8/fullbak';
recover database '/dm8/data/DAMENG/dm.ini' update db_magic;

2、配置主库DM_P

2.1 配置dm.ini

DW_P 机器上配置主库的实例名为 DMDB 1 dm.ini 参数修改如下:
只修改前面四个即可。
MAL_INI  =	1	#打开 MAL 系统
ARCH_INI  =	1	#打开 归档
ALTER_MODE_SATUS=	0	#不允许手工方式修改实例模式/状态/OGUID
ENABLE_OFFLINE_TS=	2	#不允许备库 OFFLINE 表空间
RLOG_SEND_APPLY_MON =  	64	#统计最近 64 次的日志发送信息
INSTANCE_NAME = 	DMDB1	#实例名
PORT_NUM = 	5236	#数据库实例监听端口
DW_INACTIVE_INTERVAL =	60 	#接收守护进程消息超时时间

2.2 配置dmmal.ini

配置 MAL 系统,各主备库的 dmmal.ini 配置必须完全一致, MAL_HOST 使用内部网
IP MAL_PORT dm.ini PORT_NUM 使用不同的端口值, MAL_DW_PORT 是各实例
对应的守护进程之间,以及守护进程和监视器之间的通信端口,配置如下:
MAL_CHECK_INTERVAL = 5 #MAL 链路检测时间间隔
MAL_CONN_FAIL_INTERVAL = 5 #判定 MAL 链路断开的时间
[MAL_INST1]
MAL_INST_NAME = DMDB1 #实例名,和 dm.ini 中的 INSTANCE_NAME 一致
MAL_HOST = 192.168.158.130 #MAL 系统监听 TCP 连接的 IP 地址
MAL_PORT = 61141 #MAL 系统监听 TCP 连接的端口
MAL_INST_HOST = 192.168.174.130 #实例的对外服务 IP 地址
MAL_INST_PORT = 5236 #实例的对外服务端口,和 dm.ini 中的 PORT_NUM 一致
MAL_DW_PORT = 52141 #实例本地的守护进程监听 TCP 连接的端口
MAL_INST_DW_PORT = 33141 #实例监听守护进程 TCP 连接的端口
[MAL_INST2]
MAL_INST_NAME = DMDB2 #实例名,和 dm.ini 中的 INSTANCE_NAME 一致
MAL_HOST = 192.168.158.131
MAL_PORT = 61142
MAL_INST_HOST = 192.168.174.131 #实例的对外服务 IP 地址
MAL_INST_PORT = 5236
MAL_DW_PORT = 52142 #实例本地的守护进程监听 TCP 连接的端口
MAL_INST_DW_PORT = 33142 #实例监听守护进程 TCP 连接的端口
[MAL_INST3]
MAL_INST_NAME = DMDB3 #实例名,和 dm.ini 中的 INSTANCE_NAME 一致
MAL_HOST = 192.168.158.132 #MAL 系统监听 TCP 连接的 IP 地址
MAL_PORT = 61143 #MAL 系统监听 TCP 连接的端口
MAL_INST_HOST = 192.168.174.132 #实例的对外服务 IP 地址
MAL_INST_PORT = 5236 #实例的对外服务端口,和 dm.ini 中的 PORT_NUM 一致
MAL_DW_PORT = 52143 #实例本地的守护进程监听 TCP 连接的端口
MAL_INST_DW_PORT = 33143 #实例监听守护进程 TCP 连接的端口

2.3 配置dmarch.ini

修改dmarch.ini,配置本地归档和即时归档。

除了本地归档外,其他归档配置项中的 ARCH_DEST 表示实例是 Primary 模式时,需
要同步归档数据的目标实例名。
当前实例 DMDB1 是主库,需要向即时备库DMDB2,DMDB3同步数据,因此即时归档的 ARCH_DEST 分别配置为DMDB2和DMDB3。
vi /dm8/data/DAMENG/dmarch.ini
[ARCHIVE_TIMELY1]
ARCH_TYPE = TIMELY #即时归档类型
ARCH_DEST = DMDB2 #即时归档目标实例名
[ARCHIVE_TIMELY2]
ARCH_TYPE = TIMELY  #即时归档类型
ARCH_DEST = DMDB3 #即时归档目标实例名
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL #本地归档类型
ARCH_DEST = /dm8/data/DAMENG/arch #本地归档文件存放路径
ARCH_FILE_SIZE = 128 #单位 Mb,本地单个归档文件最大值
ARCH_SPACE_LIMIT = 0 #单位 Mb, 0 表示无限制,范围 1024~4294967294M

2.4 配置dmwatcher.ini

修改dmwatcher.ini配置守护进程,配置为全局守护类型,使用自动切换模式。

vi /dm8/data/DAMENG/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 = /dm8/data/DAMENG/dm.ini #dm.ini 配置文件路径
INST_AUTO_RESTART = 1 #打开实例的自动启动功能
INST_STARTUP_CMD = /dm8/bin/dmserver #命令行方式启动
RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阀值,默认关闭
RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阀值,默认关闭


2.5 以mount配置启动主库

./dmserver /dm8/data/DAMENG/dm.ini mount

注意:一定要以 Mount 方式启动数据库实例,否则系统启动时会重构回滚表空间, 生成 Redo 日志;并且,启动后应用可能连接到数据库实例进行操作,破坏主 备库的数据一致性。数据守护配置结束后,守护进程会自动 Open 数据库。

2.6 设置OGUID值

启动命令行工具disql,登录主库设置oguid值。

SP_SET_PARA_VALUE(1, ‘ALTER_MODE_STATUS’, 1);
sp_set_oguid(453332);
SP_SET_PARA_VALUE(1, ‘ALTER_MODE_STATUS’, 0);

2.7 修改数据库模式

启动命令行工具 DIsql ,登录主库修改数据库为 Primary
alter database primary;

3、配置备库DW_S1

配置备库的实例名为DMDB2

3.1 配置dm.ini

DW_S1 机器上配置备库的实例名为 GRP1_RWW_02 dm.ini 参数修改如下:
vi /dm8/data/DAMENG/dm.ini
MAL_INI  =	1	#打开 MAL 系统
ARCH_INI  =	1	#打开 归档
ALTER_MODE_SATUS=	0	#不允许手工方式修改实例模式/状态/OGUID
ENABLE_OFFLINE_TS=	2	#不允许备库 OFFLINE 表空间
RLOG_SEND_APPLY_MON =  	64	#统计最近 64 次的日志发送信息
INSTANCE_NAME = 	DMDB2	#实例名
PORT_NUM = 	5236	#数据库实例监听端口
DW_INACTIVE_INTERVAL =	60 	#接收守护进程消息超时时间

3.2 配置dmmal.ini

配置 MAL 系统,各主备库的 dmmal.ini 配置必须完全一致, MAL_HOST 使用内部网络 IP, MAL_PORT dm.ini PORT_NUM 使用不同的端口值, MAL_DW_PORT 是各实例
对应的守护进程之间,以及守护进程和监视器之间的通信端口,配置如下:
MAL_CHECK_INTERVAL = 5 #MAL 链路检测时间间隔
MAL_CONN_FAIL_INTERVAL = 5 #判定 MAL 链路断开的时间
[MAL_INST1]
MAL_INST_NAME = DMDB1 #实例名,和 dm.ini 中的 INSTANCE_NAME 一致
MAL_HOST = 192.168.158.130 #MAL 系统监听 TCP 连接的 IP 地址
MAL_PORT = 61141 #MAL 系统监听 TCP 连接的端口
MAL_INST_HOST = 192.168.174.130 #实例的对外服务 IP 地址
MAL_INST_PORT = 5236 #实例的对外服务端口,和 dm.ini 中的 PORT_NUM 一致
MAL_DW_PORT = 52141 #实例本地的守护进程监听 TCP 连接的端口
MAL_INST_DW_PORT = 33141 #实例监听守护进程 TCP 连接的端口
[MAL_INST2]
MAL_INST_NAME = DMDB2 #实例名,和 dm.ini 中的 INSTANCE_NAME 一致
MAL_HOST = 192.168.158.131
MAL_PORT = 61142
MAL_INST_HOST = 192.168.174.131 #实例的对外服务 IP 地址
MAL_INST_PORT = 5236
MAL_DW_PORT = 52142 #实例本地的守护进程监听 TCP 连接的端口
MAL_INST_DW_PORT = 33142 #实例监听守护进程 TCP 连接的端口
[MAL_INST3]
MAL_INST_NAME = DMDB3 #实例名,和 dm.ini 中的 INSTANCE_NAME 一致
MAL_HOST = 192.168.158.132 #MAL 系统监听 TCP 连接的 IP 地址
MAL_PORT = 61143 #MAL 系统监听 TCP 连接的端口
MAL_INST_HOST = 192.168.174.132 #实例的对外服务 IP 地址
MAL_INST_PORT = 5236 #实例的对外服务端口,和 dm.ini 中的 PORT_NUM 一致
MAL_DW_PORT = 52143 #实例本地的守护进程监听 TCP 连接的端口
MAL_INST_DW_PORT = 33143 #实例监听守护进程 TCP 连接的端口

3.3 配置dmarch.ini

修改dmarch.ini文档,配置本地归档和即时归档。

[ARCHIVE_TIMELY1]
ARCH_TYPE = TIMELY #即时归档类型
ARCH_DEST = DMDB1 #即时归档目标实例名
[ARCHIVE_TIMELY2]
ARCH_TYPE = TIMELY  #即时归档类型
ARCH_DEST = DMDB3 #即时归档目标实例名
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL #本地归档类型
ARCH_DEST = /dm8/data/DAMENG/arch #本地归档文件存放路径
ARCH_FILE_SIZE = 128 #单位 Mb,本地单个归档文件最大值
ARCH_SPACE_LIMIT = 0 #单位 Mb, 0 表示无限制,范围 1024~4294967294M

3.4 配置dmwatcher.ini

修改dmwatcher.ini配置守护进程,配置为全局守护类型,使用自动切换模式。

vi /dm8/data/DAMENG/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 = /dm8/data/DAMENG/dm.ini #dm.ini 配置文件路径
INST_AUTO_RESTART = 1 #打开实例的自动启动功能
INST_STARTUP_CMD = /dm8/bin/dmserver #命令行方式启动
RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阀值,默认关闭
RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阀值,默认关闭

3.5 以mount配置启动备库

./dmserver /dm8/data/DAMENG/dm.ini mount

3.6 设置OGUID值

进入DM安装目录的bin目录下,启动命令行工具disql,登录主库设置oguid值。

SP_SET_PARA_VALUE(1, ‘ALTER_MODE_STATUS’, 1);
sp_set_oguid(453332);
SP_SET_PARA_VALUE(1, ‘ALTER_MODE_STATUS’, 0);

3.7 修改数据库模式

alter database standby;

4、配置备库PW_S2

配置备库的实例名为DMDB3

vi /dm8/data/DAMENG/dm.ini
MAL_INI  =	1	#打开 MAL 系统
ARCH_INI  =	1	#打开 归档
ALTER_MODE_SATUS=	0	#不允许手工方式修改实例模式/状态/OGUID
ENABLE_OFFLINE_TS=	2	#不允许备库 OFFLINE 表空间
RLOG_SEND_APPLY_MON =  	64	#统计最近 64 次的日志发送信息
INSTANCE_NAME = 	DMDB3	#实例名
PORT_NUM = 	5236	#数据库实例监听端口
DW_INACTIVE_INTERVAL =	60 	#接收守护进程消息超时时间

4.1 配置dmmal.ini

vi /dm8/data/DAMENG/dmmal.ini
MAL_CHECK_INTERVAL = 5 #MAL 链路检测时间间隔
MAL_CONN_FAIL_INTERVAL = 5 #判定 MAL 链路断开的时间
[MAL_INST1]
MAL_INST_NAME = DMDB1 #实例名,和 dm.ini 中的 INSTANCE_NAME 一致
MAL_HOST = 192.168.158.130 #MAL 系统监听 TCP 连接的 IP 地址
MAL_PORT = 61141 #MAL 系统监听 TCP 连接的端口
MAL_INST_HOST = 192.168.174.130 #实例的对外服务 IP 地址
MAL_INST_PORT = 5236 #实例的对外服务端口,和 dm.ini 中的 PORT_NUM 一致
MAL_DW_PORT = 52141 #实例本地的守护进程监听 TCP 连接的端口
MAL_INST_DW_PORT = 33141 #实例监听守护进程 TCP 连接的端口
[MAL_INST2]
MAL_INST_NAME = DMDB2 #实例名,和 dm.ini 中的 INSTANCE_NAME 一致
MAL_HOST = 192.168.158.131
MAL_PORT = 61142
MAL_INST_HOST = 192.168.174.131 #实例的对外服务 IP 地址
MAL_INST_PORT = 5236
MAL_DW_PORT = 52142 #实例本地的守护进程监听 TCP 连接的端口
MAL_INST_DW_PORT = 33142 #实例监听守护进程 TCP 连接的端口
[MAL_INST3]
MAL_INST_NAME = DMDB3 #实例名,和 dm.ini 中的 INSTANCE_NAME 一致
MAL_HOST = 192.168.158.132 #MAL 系统监听 TCP 连接的 IP 地址
MAL_PORT = 61143 #MAL 系统监听 TCP 连接的端口
MAL_INST_HOST = 192.168.174.132 #实例的对外服务 IP 地址
MAL_INST_PORT = 5236 #实例的对外服务端口,和 dm.ini 中的 PORT_NUM 一致
MAL_DW_PORT = 52143 #实例本地的守护进程监听 TCP 连接的端口
MAL_INST_DW_PORT = 33143 #实例监听守护进程 TCP 连接的端口

4.2 配置dmarch.ini

修改dmarch.ini文档,配置本地归档和即时归档。

vi /dm8/data/DAMENG/dmarch.ini
[ARCHIVE_TIMELY1]
ARCH_TYPE = TIMELY #即时归档类型
ARCH_DEST = DMDB1 #即时归档目标实例名
[ARCHIVE_TIMELY2]
ARCH_TYPE = TIMELY  #即时归档类型
ARCH_DEST = DMDB2 #即时归档目标实例名
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL #本地归档类型
ARCH_DEST = /dm8/data/DAMENG/arch #本地归档文件存放路径
ARCH_FILE_SIZE = 128 #单位 Mb,本地单个归档文件最大值
ARCH_SPACE_LIMIT = 0 #单位 Mb, 0 表示无限制,范围 1024~4294967294M

4.3 配置dmwatcher.ini

修改dmwatcher.ini配置守护进程,配置为全局守护类型,使用自动切换模式。

vi /dm8/data/DAMENG/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 = /dm8/data/DAMENG/dm.ini #dm.ini 配置文件路径
INST_AUTO_RESTART = 1 #打开实例的自动启动功能
INST_STARTUP_CMD = /dm8/bin/dmserver #命令行方式启动
RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阀值,默认关闭
RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阀值,默认关闭

4.4 以mount配置启动备库

./dmserver /dm8/data/DAMENG/dm.ini mount

4.5 设置OGUID值

进入DM安装目录的bin目录下,启动命令行工具disql,登录主库设置oguid值。

SP_SET_PARA_VALUE(1, ‘ALTER_MODE_STATUS’, 1);
sp_set_oguid(453332);
SP_SET_PARA_VALUE(1, ‘ALTER_MODE_STATUS’, 0);

4.6 修改数据库模式

alter database standby;

5、配置监视器

由于主库和实时备库的守护进程配置为自动切换模式,因此这里选择配置确认监视器。
和普通监视器相比,确认监视器除了相同的命令支持外,在主库发生故障时,能够自动通知
实时备库接管为新的主库,具有自动故障处理的功能。
注意:故障自动切换模式下,必须配置确认监视器,且确认监视器最多只能配置一
个。
修改 dmmonitor.ini 配置确认监视器,其中 MON_DW_IP 中的 IP PORT 和dmmal.ini 中的 MAL_HOST MAL_DW_PORT 配置项保持一致。
vi /dm8/data/dmmonitor.ini
MON_DW_Confirm 			= 1  	#确认监视器模式
MON_LOG_PATH 			= /dm8/data/log		#监视器日志文件存放路径
MON_LOG_INTERVAL		= 60	#每隔60s定时记录系统信息到日志文件
MON_LOG_FILE_SIZE 		= 32	#每个日志文件最大32M
MON_LOG_SPACE_LIMIT 	= 0		#不限定日志文件总占用空间
[GRP1]
	MON_INST_OGUID 			= 453331 #组GRP1的唯一OGUID值
#以下配置为监视器到组GRP1的守护进程的连接信息,以“IP:PORT”的形式配置
#IP对应dmmal.ini中的MAL_HOST,PORT对应dmmal.ini中的MAL_DW_PORT
	MON_DW_IP 				= 192.168.158.130:52141
	MON_DW_IP 				= 192.168.158.131:52142
	MON_DW_IP 				= 192.168.158.132:52143

6、启动守护进程

启动各个主备库上的守护进程:
./dmwatcher /dm8/data/DAMENG/dmwatcher.ini
守护进程启动后,进入 Startup 状态,此时实例都处于 Mount 状态。守护进程开始广播自身和其监控实例的状态信息,结合自身信息和远程守护进程的广播信息,守护进程将本地实例 Open ,并切换为 Open 状态。

7、启动监视器

./dmmonitor /dm8/data/dmmonitor.ini
监视器提供一系列命令,支持当前守护系统状态查看以及故障处理,可输入 help 命令,
查看各种命令使用说明,结合实际情况选择使用。
至此读写分离集群搭建完毕,在搭建步骤和各项配置都正确的情况下,在监视器上执行
show 命令,可以监控到所有实例都处于 Open 状态,如果实例为mount状态就是不正常的,所有守护进程也都处于 Open 状态,
即为正常运行状态。
更多详细信息请参考达梦数据库官方社区: https://eco.dameng.com
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值