2024年最新实战Centos系统部署Codis集群服务_codis 18087端口是干啥的

cp extern/redis-test/conf/6379.conf /opt/codis/redis_conf/
cp extern/redis-test/conf/6380.conf /opt/codis/redis_conf/


![实战Centos系统部署Codis集群服务实战Centos系统部署Codis集群服务](http://www.linuxprobe.com/wp-content/uploads/2016/08/8-28-07.png "实战Centos系统部署Codis集群服务实战Centos系统部署Codis集群服务")



**2、编辑codis配置文件**


[root@linux-node3 codis]# egrep -v “#|$” config.ini



coordinator=zookeeper
zk=192.168.1.148:2181,192.168.1.149:2181,192.168.1.150:2181
product=test
dashboard_addr=192.168.1.150:18087
password=
backend_ping_period=5
session_max_timeout=1800
session_max_bufsize=131072
session_max_pipeline=1024
zk_session_timeout=30000
proxy_id=proxy_3


该配置文件中,我们需要注意三个参数:zk、dashboard\_addr、proxy\_id。


其中zk是表示zookeeper集群的服务器IP地址,dashboard\_addr表示codis web管理的IP地址及端口,proxy\_id表示codis的id,注意每台codis服务器该值要唯一。



**#linux-node1**

![实战Centos系统部署Codis集群服务实战Centos系统部署Codis集群服务](http://www.linuxprobe.com/wp-content/uploads/2016/08/8-28-08.png "实战Centos系统部署Codis集群服务实战Centos系统部署Codis集群服务")



**#linux-node2**

![实战Centos系统部署Codis集群服务实战Centos系统部署Codis集群服务](http://www.linuxprobe.com/wp-content/uploads/2016/08/8-28-09.png "实战Centos系统部署Codis集群服务实战Centos系统部署Codis集群服务")



**#linux-node3**

![实战Centos系统部署Codis集群服务实战Centos系统部署Codis集群服务](http://www.linuxprobe.com/wp-content/uploads/2016/08/8-28-10.png "实战Centos系统部署Codis集群服务实战Centos系统部署Codis集群服务")



**3、编辑redis配置文件**

每台codis服务器上,启动两个redis实例(也可以启动多个redis实例),配置两个redis,如下:



daemonize no
pidfile /var/run/redis.pid
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 0
loglevel notice
logfile /var/log/redis/6379.log
databases 16
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump6379.rdb
dir /opt/codis/
slave-serve-stale-data yes
slave-read-only yes
repl-disable-tcp-nodelay no
slave-priority 100
appendonly no
appendfilename “appendonly.aof”
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events “”
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-entries 512
list-max-ziplist-value 64
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes


#注意红线标注的一个参数,配置第二个redis实例



\cp /opt/codis/redis_conf/6379.conf 6380.conf
sed -i ‘s/6379/6380/g’ /opt/codis/redis_conf/6380.conf
mkdir -p /var/log/redis/


#上面操作需要在每台codis服务上面都执行。



echo 512 > /proc/sys/net/core/somaxconn
sysctl vm.overcommit_memory=1


注:优化系统的参数



**4、 初始化 slots**

执行 bin/codis-config slot init,该命令会在zookeeper上创建slot相关信息



/opt/codis/bin/codis-config -c /opt/codis/config.ini slot init


#linux-node3、linux-node1、linux-node2



/opt/codis/bin/codis-server /opt/codis/redis_conf/6379.conf &
/opt/codis/bin/codis-server /opt/codis/redis_conf/6380.conf &
ps -ef | grep codis-server


![实战Centos系统部署Codis集群服务实战Centos系统部署Codis集群服务](http://www.linuxprobe.com/wp-content/uploads/2016/08/8-28-11.png "实战Centos系统部署Codis集群服务实战Centos系统部署Codis集群服务")


#在三台codis-proxy上面分别启动redis实例



**5、启动codis dashboard**

#尽量在redis安装目录或者让redi的log目录下启动dashboard,这样方便查看启动产生的日志,nohup.out



nohup /opt/codis/bin/codis-config -c /opt/codis/config.ini dashboard &


![实战Centos系统部署Codis集群服务实战Centos系统部署Codis集群服务](http://www.linuxprobe.com/wp-content/uploads/2016/08/8-28-12.png "实战Centos系统部署Codis集群服务实战Centos系统部署Codis集群服务")


#从图中可以看出dashboard已经启动完成,然后去web页面访问,codis dashboard访问端口是18087


#查看codis dashboard,浏览器访问http://192.168.1.150:18087/,如下:  
 ![实战Centos系统部署Codis集群服务实战Centos系统部署Codis集群服务](http://www.linuxprobe.com/wp-content/uploads/2016/08/08-28-13.png "实战Centos系统部署Codis集群服务实战Centos系统部署Codis集群服务")


#codis dashboard启动完成之后默认页面如上图所示,我们可以通过web页面新建redis\_group,把刚刚启动好的redis实例加到不同的组当中、也可以通过命令行执行创建redis\_group的操作。



**6、添加 Redis Server Group**

# 每一个 Server Group 作为一个Redis服务器组存在, 只允许有一个master, 可以有多个slave, group id仅支持大于等于1的整数


#在codis dashboard上使用命令新建server group



[root@linux-node3 ~]# cd /opt/codis/
[root@linux-node3 codis]# ./bin/codis-config server -h
usage:
codis-config server list
codis-config server add
codis-config server remove
codis-config server promote
codis-config server add-group
codis-config server remove-group


#如: 添加三个 server group, 每个 group 有两个 redis 实例,group的id分别为1和2, redis实例为一主一从。


#注:这里我把linux-node3,linux-node2,linux-node1上面的两个redis实例分别加到不同的server group当中,详细如下:



group_1: linux-node3 redis_6379 linux-node2 redis_6380
group_2: linux-node2 redis_6379 linux-node1 redis_6380
group_3: linux-node1 redis_5379 linux-node3 redis_6380


其中redis的6379端口作为redis master,6380作为slave


#添加一个group,group的id为1, 并添加一个redis master(192.168.1.150:6379)到该group



./bin/codis-config server add 1 192.168.1.150:6379 master


#添加一个redis slave(192.168.1.149:6380)到该group



./bin/codis-config server add 1 192.168.1.149:6380 slave


![实战Centos系统部署Codis集群服务实战Centos系统部署Codis集群服务](http://www.linuxprobe.com/wp-content/uploads/2016/08/8-28-13.png "实战Centos系统部署Codis集群服务实战Centos系统部署Codis集群服务")


#添加一个group,group的id为2, 并添加一个redis master(192.168.1.149:6379)到该group



./bin/codis-config server add 2 192.168.1.149:6379 master


#添加一个redis slave(192.168.1.148:6380)到该group



./bin/codis-config server add 2 192.168.1.148:6380 slave


#添加一个group,group的id为3, 并添加一个redis master(192.168.1.148:6379)到该group



./bin/codis-config server add 3 192.168.1.148:6379 master


#添加一个redis slave(192.168.1.150:6380)到该group



./bin/codis-config server add 3 192.168.1.150:6380 slave


![实战Centos系统部署Codis集群服务实战Centos系统部署Codis集群服务](http://www.linuxprobe.com/wp-content/uploads/2016/08/8-28-14.png "实战Centos系统部署Codis集群服务实战Centos系统部署Codis集群服务")  
 ![实战Centos系统部署Codis集群服务实战Centos系统部署Codis集群服务](http://www.linuxprobe.com/wp-content/uploads/2016/08/8-28-15.png "实战Centos系统部署Codis集群服务实战Centos系统部署Codis集群服务")


注意:每组添加的第一个redis实例不能被删除,因为codis默认把该redis实例设置为master。


#从图中我们可以看出server group 已经创建成功,到codis dashboard上面查看:  
 ![实战Centos系统部署Codis集群服务实战Centos系统部署Codis集群服务](http://www.linuxprobe.com/wp-content/uploads/2016/08/08-28-16.png "实战Centos系统部署Codis集群服务实战Centos系统部署Codis集群服务")



**7、设置 server group 服务的 slot 范围,**


https://github.com/CodisLabs/codis/blob/master/doc/FAQ_zh.md


Codis 采用 Pre-sharding 的技术来实现数据的分片, 默认分成 1024 个 slots (0-1023), 对于每个key来说, 通过以下公式确定所属的 Slot Id : SlotId = crc32(key) % 1024 每一个 slot 都会有一个且必须有一个特定的 server group id 来表示这个 slot 的数据由哪个 server group 来提供.



[root@linux-node3 codis]# ./bin/codis-config slot -h
usage:
codis-config slot init [-f]
codis-config slot info
codis-config slot set
codis-config slot range-set
codis-config slot migrate [–delay=]
codis-config slot rebalance [–delay=]


#设置编号为[0, 340]的 slot 由 server group 1 提供服务, 编号 [341, 682] 的 slot 由 server group 2 提供服务,编号[683, 1023] 的 slot 由 server group 3 提供服务



./bin/codis-config slot range-set 0 340 1 online
./bin/codis-config slot range-set 341 682 2 online
./bin/codis-config slot range-set 683 1023 3 online


![实战Centos系统部署Codis集群服务实战Centos系统部署Codis集群服务](http://www.linuxprobe.com/wp-content/uploads/2016/08/8-28-17.png "实战Centos系统部署Codis集群服务实战Centos系统部署Codis集群服务")



**#查看slot的信息**


/opt/codis/bin/codis-config -c /opt/codis/config.ini slot info 1
/opt/codis/bin/codis-config -c /opt/codis/config.ini slot info 2
/opt/codis/bin/codis-config -c /opt/codis/config.ini slot info 3


#slot操作完成可以到codis dashboard查看状态。如下:


![实战Centos系统部署Codis集群服务实战Centos系统部署Codis集群服务](http://www.linuxprobe.com/wp-content/uploads/2016/08/8-28-19.png "实战Centos系统部署Codis集群服务实战Centos系统部署Codis集群服务")



**8、启动 codis-proxy**


./bin/codis-proxy -c config.ini -L ./log/proxy.log --cpu=1 --addr=0.0.0.0:19000 --http-addr=0.0.0.0:11000


![实战Centos系统部署Codis集群服务实战Centos系统部署Codis集群服务](http://www.linuxprobe.com/wp-content/uploads/2016/08/8-28-20.png "实战Centos系统部署Codis集群服务实战Centos系统部署Codis集群服务")


nohup /opt/codis/bin/codis-proxy -c /opt/codis/config.ini --log-level=error -L /opt/codis/log/proxy.log --cpu=1 --addr=0.0.0.0:19000 --http-addr=0.0.0.0:11000 &


#下面对以上命令中的参数进行解释:



-c 配置文件地址。
-L 日志输出文件地址。
–log-level= 输出日志级别(debug –cpu= proxy占用的cpu核数,默认1,最好设置为机器的物理cpu数的一半到2/3左右。
–addr= proxy的redis server监听的地址, 格式:, 如: localhost:9000, :9001。
–http-addr= proxy的调试信息启动的http server,可以访问 http://debug_http_server_addr/debug/vars。


![实战Centos系统部署Codis集群服务实战Centos系统部署Codis集群服务](http://www.linuxprobe.com/wp-content/uploads/2016/08/8-28-21.png "实战Centos系统部署Codis集群服务实战Centos系统部署Codis集群服务")


#codis-proxy启动后,我们可以在dashboard上进行查看,如下:


![实战Centos系统部署Codis集群服务实战Centos系统部署Codis集群服务](http://www.linuxprobe.com/wp-content/uploads/2016/08/8-28-22.png "实战Centos系统部署Codis集群服务实战Centos系统部署Codis集群服务")


#到此codis集群搭建完毕,为了性能需求,建议redis实例和codis-proxy放到不同的服务器上面。



**9、连接codis集群**

codis集群搭建完毕后,测试连接codis集群。要连接codis集群,我们只需要连接codis-proxy即可。codis-proxy服务器地址:192.168.1.150,然后加19000端口。使用redis-cli命令连接,如下:


#在某台已安装redis实例的服务器上面测试:  
 ![实战Centos系统部署Codis集群服务实战Centos系统部署Codis集群服务](http://www.linuxprobe.com/wp-content/uploads/2016/08/8-28-23.png "实战Centos系统部署Codis集群服务实战Centos系统部署Codis集群服务")


通过上图,我们可以很明显的看到连接codis集群是ok的。



**10、codis集群压测**

我们现在对codis集群做一些压力测试,同时在dashboard上观察键值对的情况。如下:



./redis-benchmark -h 192.168.1.150 -p 19000 -c 1000 -d 1000 -t set -n 100000 -r 100000


上述命令的意思是,使用redis-benchmark压力测试命令连接codis集群,同时并发10000个(-c),测试set操作(-t),每个测试数据集是100字节(-d),请求数是100000(-n),使用使用随机数插入数值(-r)



**11、数据迁移**

安全和透明的数据迁移是 Codis 提供的一个重要的功能, 也是 Codis 区别于 Twemproxy 等静态的分布式 Redis 解决方案的地方  
 数据迁移的最小单位是 key, 我们在 codis redis 中添加了一些指令, 实现基于key的迁移, 如 SLOTSMGRT等 (命令列表), 每次会将特定 slot 一个随机的 key 发送给另外一个 codis redis 实例, 这个命令会确认对方已经接收, 同时删除本地的这个 k-v 键值, 返回这个 slot 的剩余 key 的数量, 整个操作是原子的.


在 codis-config 管理工具中, 每次迁移任务的最小单位是 slot  
 如: 将slot id 为 [0-340] 的slot的数据, 迁移到 server group 2上, --delay 参数表示每迁移一个 key 后 sleep 的毫秒数, 默认是 0, 用于限速.


#codis dashboard上面查看每个组中的数据状态,  
 ![实战Centos系统部署Codis集群服务实战Centos系统部署Codis集群服务](http://www.linuxprobe.com/wp-content/uploads/2016/08/8-28-24.png "实战Centos系统部署Codis集群服务实战Centos系统部署Codis集群服务")


#可以看出刚刚我们做过压测之后,每个redis组处理的key基本一致,然后我们把group\_1中slot上的数据迁移到group\_2上,--delay 参数表示每迁移一个 key 后 sleep 的毫秒数, 默认是 0, 用于限速.



$ bin/codis-config slot migrate 0 511 2 --delay=10


![实战Centos系统部署Codis集群服务实战Centos系统部署Codis集群服务](http://www.linuxprobe.com/wp-content/uploads/2016/08/8-28-25.png "实战Centos系统部署Codis集群服务实战Centos系统部署Codis集群服务")



/opt/codis/bin/codis-config -c /opt/codis/config.ini slot migrate 0 340 2 --delay=10


#查看codis dashboard上,group状态:  
 ![实战Centos系统部署Codis集群服务实战Centos系统部署Codis集群服务](http://www.linuxprobe.com/wp-content/uploads/2016/08/8-28-26.png "实战Centos系统部署Codis集群服务实战Centos系统部署Codis集群服务")


#再次刷新,3s后  
 ![实战Centos系统部署Codis集群服务实战Centos系统部署Codis集群服务](http://www.linuxprobe.com/wp-content/uploads/2016/08/8-28-27.png "实战Centos系统部署Codis集群服务实战Centos系统部署Codis集群服务")


#对比group中两次的key变化,我们可以看出group\_1中的slot数据正在向group\_2迁移。


迁移的过程对于上层业务来说是安全且透明的, 数据不会丢失, 上层不会中止服务.


注意, 迁移的过程中打断是可以的, 但是如果中断了一个正在迁移某个slot的任务, 下次需要先迁移掉正处于迁移状态的 slot, 否则无法继续 (即迁移程序会检查同一时刻只能有一个 slot 处于迁移状态).



**Auto Rebalance**

Codis 支持动态的根据实例内存, 自动对slot进行迁移, 以均衡数据分布.



$ bin/codis-config slot rebalance


要求:



所有的codis-server都必须设置了maxmemory参数
所有的 slots 都应该处于 online 状态, 即没有迁移任务正在执行
所有 server group 都必须有 Master



**五、Codis集群架构模拟故障测试**

Server group实现主从切换,当同一个组中的某一台redis实例停止的时候,组中的其它redis实例自动切换为master角色,提供服务。


需要安装codis-ha插件,codis-ha可以安装在任意节点即可,只需要在一个节点上面安装。(本实验安装在linux-node2上)



go get github.com/ngaut/codis-ha
[root@linux-node2 ~]# cd /opt/codis/src/github.com/ngaut/
[root@linux-node2 ngaut]# cp -r codis-ha /opt/
[root@linux-node2 ngaut]# cd /opt/codis-ha/
[root@linux-node2 codis-ha]# go build



**1、启动codis-ha服务**


nohup $codis_ha_home/codis-ha -codis-config=192.168.1.150:18087 -log-level=info -productName=test &> /opt/codis-ha/codis-ha.log


注:-codis-config后跟dashboard所在服务器ip


重新启动codis-proxy服务


注:(以150机器配置为例,其余codis-proxy只需要修改下名称即可)


**先停掉codis-proxy**



[root@linux-node3 ~]# /opt/codis/bin/codis-config -c /opt/codis/config.ini proxy offline codis_proxy_3


#不同的机器只需要更改codis\_proxy即可(本实验之重启了一台codis-proxy,且codis-ha服务已生效)


**重新启动codis-proxy**



nohup /opt/codis/bin/codis-proxy -c /opt/codis/config.ini --log-level=error -L /opt/codis/log/proxy.log --cpu=1 --addr=0.0.0.0:19000 --http-addr=0.0.0.0:11000 &


**设置codis-proxy状态为online**



[root@linux-node3 ~]# /opt/codis/bin/codis-config -c /opt/codis/config.ini proxy online codis_proxy_3


注:如果重启一台codis-proxy之后codis-ha服务没生效,需要重启三台codis-proxy


停止任意节点的zookeeper,检查codis-proxy,dashboard是否正常>


以zookeeper状态为leader那台服务器测试(linux-node2)


**查看zookeeper状态确认是否为leader**



[root@linux-node2 ~]# /opt/zookeeper/bin/zkServer.sh status


停止linux-node2上面的zookeeper节点,让其他zookeeper节点自动选择leader节点并提供服务



[root@linux-node2 ~]# /opt/zookeeper/bin/zkServer.sh stop


![实战Centos系统部署Codis集群服务实战Centos系统部署Codis集群服务](http://www.linuxprobe.com/wp-content/uploads/2016/08/08-30-1.png "实战Centos系统部署Codis集群服务实战Centos系统部署Codis集群服务")


#随机检测其他节点的zookeeper状态,检测到linux-node2的zookeeper节点已经被选为leader,开始提供服务


![实战Centos系统部署Codis集群服务实战Centos系统部署Codis集群服务](http://www.linuxprobe.com/wp-content/uploads/2016/08/08-30-2.png "实战Centos系统部署Codis集群服务实战Centos系统部署Codis集群服务")


#重启刷新codis dashboard可以看到dashboard是正常的。


**检测redis客户端是否能正常访问codis-proxy**


以linux-node3为例:



[root@linux-node3 ~]# cd /opt/codis/src/github.com/CodisLabs/codis/extern/redis-2.8.21/src/


**#新建scripts目录,存放redis常用命令**



[root@linux-node3 src]# mkdir -p /opt/codis/scripts/
[root@linux-node3 src]# cp redis-cli redis-server redis-benchmark redis-check-dump /opt/codis/scripts/


![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传](https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=http%3A%2F%2Fwww.linuxprobe.com%2Fwp-content%2Fuploads%2F2016%2F08%2F08-30-3.png%20%22%E5%AE%9E%E6%88%98Centos%E7%B3%BB%E7%BB%9F%E9%83%A8%E7%BD%B2Codis%E9%9B%86%E7%BE%A4%E6%9C%8D%E5%8A%A1%E5%AE%9E%E6%88%98Centos%E7%B3%BB%E7%BB%9F%E9%83%A8%E7%BD%B2Codis%E9%9B%86%E7%BE%A4%E6%9C%8D%E5%8A%A1%22&pos_id=img-hZkoBIAw-1714515691278)


从上面可以看出我之前set的两个key都能正常get到


停止任意group中的redis master实例,检查redis slave是否自动切换为master模拟linux-node1(192.168.1.148)上面的redis-master 6379端口挂掉  
 ![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传](https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=http%3A%2F%2Fwww.linuxprobe.com%2Fwp-content%2Fuploads%2F2016%2F08%2F08-30-9.png%20%22%E5%AE%9E%E6%88%98Centos%E7%B3%BB%E7%BB%9F%E9%83%A8%E7%BD%B2Codis%E9%9B%86%E7%BE%A4%E6%9C%8D%E5%8A%A1%E5%AE%9E%E6%88%98Centos%E7%B3%BB%E7%BB%9F%E9%83%A8%E7%BD%B2Codis%E9%9B%86%E7%BE%A4%E6%9C%8D%E5%8A%A1%22&pos_id=img-Eo5ES14T-1714515691279)


**先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前在阿里**

**深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**

**因此收集整理了一份《2024年最新Linux运维全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。**
![img](https://img-blog.csdnimg.cn/img_convert/3846d36260cc3be661c342d1e20aa450.png)
![img](https://img-blog.csdnimg.cn/img_convert/5dbb0c9d4b0204ddfd4a16f53d54aabf.png)
![img](https://img-blog.csdnimg.cn/img_convert/4636a061bba4a14cb2c54a94aaec3c16.png)
![img](https://img-blog.csdnimg.cn/img_convert/b89dc53ccf1234ea0775d28ddff1579e.png)
![img](https://img-blog.csdnimg.cn/img_convert/53c50c47c8a0f0c1761ba8c71448b616.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上运维知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[需要这份系统化的资料的朋友,可以点击这里获取!](https://bbs.csdn.net/topics/618542503)**



**先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前在阿里**

**深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**

**因此收集整理了一份《2024年最新Linux运维全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。**
[外链图片转存中...(img-fH5pdJml-1714515691279)]
[外链图片转存中...(img-73v4Ry6e-1714515691280)]
[外链图片转存中...(img-FiP9zGFN-1714515691280)]
[外链图片转存中...(img-ooMDvvhq-1714515691280)]
[外链图片转存中...(img-pBRxxRGl-1714515691280)]

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上运维知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[需要这份系统化的资料的朋友,可以点击这里获取!](https://bbs.csdn.net/topics/618542503)**

  • 13
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值