搭建PostgreSQL高可用集群(基于Patroni+Etcd)

搭建PostgreSQL高可用集群(基于Patroni+Etcd)

此文以PostgreSQL 10版本为例!

如未指定,下述命令在所有节点执行!

系统资源及组件规划

节点名称系统名称CPU/内存网卡磁盘IP地址OS节点角色
PGSQL1pgsql12C/4Gens33128G192.168.0.11CentOS7PostgreSQL、ETCD、Patroni
PGSQL2pgsql22C/4Gens33128G192.168.0.12CentOS7PostgreSQL、ETCD、Patroni
PGSQL3pgsql32C/4Gens33128G192.168.0.13CentOS7PostgreSQL、ETCD、Patroni

二、系统软件安装与设置

1、安装基本软件

yum -y install vim lrzsz bash-completion

在这里插入图片描述

2、设置名称解析

echo 192.168.0.11 pgsql1 >> /etc/hosts
echo 192.168.0.12 pgsql2 >> /etc/hosts
echo 192.168.0.13 pgsql3 >> /etc/hosts

在这里插入图片描述

3、设置NTP

yum -y install chrony

在这里插入图片描述

systemctl start chronyd
systemctl enable chronyd
systemctl status chronyd

在这里插入图片描述

chronyc sources

在这里插入图片描述

4、设置SELinux、防火墙

systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

在这里插入图片描述

三、搭建PostgreSQL高可用集群

1、部署ETCD集群

安装ETCD:

yum -y install etcd

在这里插入图片描述

在PGSQL1节点上创建ETCD配置文件:

cat > /etc/etcd/etcd.conf << EOF
ETCD_NAME=etcd1
ETCD_DATA_DIR="/var/lib/etcd/etcd1"
ETCD_LISTEN_PEER_URLS="http://192.168.0.11:2380"
ETCD_LISTEN_CLIENT_URLS="http://127.0.0.1:2379,http://192.168.0.11:2379"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.0.11:2380"
ETCD_INITIAL_CLUSTER="etcd1=http://192.168.0.11:2380,etcd2=http://192.168.0.12:2380,etcd3=http://192.168.0.13:2380"
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.0.11:2379"
EOF

在这里插入图片描述

在PGSQL2节点上创建ETCD配置文件:

cat > /etc/etcd/etcd.conf << EOF
ETCD_NAME=etcd2
ETCD_DATA_DIR="/var/lib/etcd/etcd2"
ETCD_LISTEN_PEER_URLS="http://192.168.0.12:2380"
ETCD_LISTEN_CLIENT_URLS="http://127.0.0.1:2379,http://192.168.0.12:2379"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.0.12:2380"
ETCD_INITIAL_CLUSTER="etcd1=http://192.168.0.11:2380,etcd2=http://192.168.0.12:2380,etcd3=http://192.168.0.13:2380"
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.0.12:2379"
EOF

在这里插入图片描述

在PGSQL3节点上创建ETCD配置文件:

cat > /etc/etcd/etcd.conf << EOF
ETCD_NAME=etcd3
ETCD_DATA_DIR="/var/lib/etcd/etcd3"
ETCD_LISTEN_PEER_URLS="http://192.168.0.13:2380"
ETCD_LISTEN_CLIENT_URLS="http://127.0.0.1:2379,http://192.168.0.13:2379"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.0.13:2380"
ETCD_INITIAL_CLUSTER="etcd1=http://192.168.0.11:2380,etcd2=http://192.168.0.12:2380,etcd3=http://192.168.0.13:2380"
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.0.13:2379"
EOF

在这里插入图片描述

启动ETCD,并设置自启动:

systemctl start etcd
systemctl enable etcd
systemctl status etcd

在这里插入图片描述

在任意节点上查看ETCD状态:

etcdctl cluster-health

在这里插入图片描述

在任意节点上查看ETCD成员:

etcdctl member list

在这里插入图片描述

2、部署PostgreSQL

配置YUM源:

参考地址:https://www.postgresql.org/download

yum -y install https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm

在这里插入图片描述

安装PostgreSQL:

yum -y install postgresql10-server

在这里插入图片描述

配置环境变量:

su - postgres

在这里插入图片描述

修改.bash_profile,添加如下内容:

export PATH=$PATH:/usr/pgsql-10/bin

在这里插入图片描述

在PGSQL1节点上初始化PostgreSQL:

/usr/pgsql-10/bin/postgresql-10-setup initdb

在这里插入图片描述

在PGSQL1节点上配置远程登录和复制权限:

修改/var/lib/pgsql/10/data/postgresql.conf:

listen_addresses = '*'

在这里插入图片描述

修改/var/lib/pgsql/10/data/pg_hba.conf,修改添加如下内容:

# IPv4 local connections:
host all all 127.0.0.1/32 md5
host all all 0.0.0.0/0 md5

# replication privilege.
host replication repluser 192.168.0.0/24 md5

在这里插入图片描述

在PGSQL1节点上启动PostgreSQL:

su - postgres
pg_ctl start
pg_ctl status

在这里插入图片描述

在PGSQL1节点上修改数据库密码:

su - postgres
psql -U postgres
ALTER USER postgres WITH ENCRYPTED PASSWORD '111111';
\du
\q

在这里插入图片描述

在PGSQL1节点上创建复制用户:

su - postgres
psql
CREATE USER repluser WITH REPLICATION PASSWORD '111111';
\du
\q

在这里插入图片描述

在PGSQL1节点上创建槽位:

su - postgres
psql
SELECT * FROM pg_replication_slots;
SELECT * FROM pg_create_physical_replication_slot('pgsql_slot1');
SELECT * FROM pg_create_physical_replication_slot('pgsql_slot2');
SELECT * FROM pg_create_physical_replication_slot('pgsql_slot3');
SELECT * FROM pg_replication_slots;

在这里插入图片描述

在PGSQL2和PGSQL3节点上备份PGSQL1节点数据:

su - postgres
pg_basebackup -h pgsql1 -U repluser -D /var/lib/pgsql/10/data -P -v

在这里插入图片描述

3、部署Patroni

安装Python3:

yum install -y python3

在这里插入图片描述

安装pip:

curl https://bootstrap.pypa.io/pip/3.6/get-pip.py -o get-pip.py
python3 get-pip.py

在这里插入图片描述

安装Patroni:

pip install psycopg2-binary -i https://pypi.tuna.tsinghua.edu.cn/simple

在这里插入图片描述

pip install patroni[etcd,consul] -i https://pypi.tuna.tsinghua.edu.cn/simple

在这里插入图片描述

验证Patroni是否安装成功:

patroni --version

在这里插入图片描述

在PGSQL1节点上创建Patroni配置文件:

mkdir -p /usr/patroni/conf
cat > /usr/patroni/conf/patroni_postgresql.yml << EOF
scope: pgsql10
namespace: /pgsql/
name: pgsql_slot1
restapi:
  listen: 192.168.0.11:8008
  connect_address: 192.168.0.11:8008
etcd:
  host: 192.168.0.11:2379
bootstrap:
  dcs:
    ttl: 30
    loop_wait: 10
    retry_timeout: 10
    maximum_lag_on_failover: 1048576
    master_start_timeout: 300
    synchronous_mode: false
    postgresql:
      use_pg_rewind: true
      use_slots: true
      parameters:
        listen_addresses: "0.0.0.0"
        port: 5432
        wal_level: logical
        hot_standby: "on"
        wal_keep_segments: 1000
        max_wal_senders: 10
        max_replication_slots: 10
        wal_log_hints: "on"
postgresql:
  listen: 0.0.0.0:5432
  connect_address: 192.168.0.11:5432
  data_dir: /var/lib/pgsql/10/data
  bin_dir: /usr/pgsql-10/bin
  authentication:
    replication:
      username: repluser
      password: 111111
    superuser:
      username: postgres
      password: 111111
tags:
    nofailover: false
    noloadbalance: false
    clonefrom: false
    nosync: false
EOF

在这里插入图片描述

在PGSQL2节点上创建Patroni配置文件:

mkdir -p /usr/patroni/conf
cat > /usr/patroni/conf/patroni_postgresql.yml << EOF
scope: pgsql10
namespace: /pgsql/
name: pgsql_slot2
restapi:
  listen: 192.168.0.12:8008
  connect_address: 192.168.0.12:8008
etcd:
  host: 192.168.0.12:2379
bootstrap:
  dcs:
    ttl: 30
    loop_wait: 10
    retry_timeout: 10
    maximum_lag_on_failover: 1048576
    master_start_timeout: 300
    synchronous_mode: false
    postgresql:
      use_pg_rewind: true
      use_slots: true
      parameters:
        listen_addresses: "0.0.0.0"
        port: 5432
        wal_level: logical
        hot_standby: "on"
        wal_keep_segments: 1000
        max_wal_senders: 10
        max_replication_slots: 10
        wal_log_hints: "on"
postgresql:
  listen: 0.0.0.0:5432
  connect_address: 192.168.0.12:5432
  data_dir: /var/lib/pgsql/10/data
  bin_dir: /usr/pgsql-10/bin
  authentication:
    replication:
      username: repluser
      password: 111111
    superuser:
      username: postgres
      password: 111111
tags:
    nofailover: false
    noloadbalance: false
    clonefrom: false
    nosync: false
EOF

在这里插入图片描述

在PGSQL3节点上创建Patroni配置文件:

mkdir -p /usr/patroni/conf
cat > /usr/patroni/conf/patroni_postgresql.yml << EOF
scope: pgsql10
namespace: /pgsql/
name: pgsql_slot3
restapi:
  listen: 192.168.0.13:8008
  connect_address: 192.168.0.13:8008
etcd:
  host: 192.168.0.13:2379
bootstrap:
  dcs:
    ttl: 30
    loop_wait: 10
    retry_timeout: 10
    maximum_lag_on_failover: 1048576
    master_start_timeout: 300
    synchronous_mode: false
    postgresql:
      use_pg_rewind: true
      use_slots: true
      parameters:
        listen_addresses: "0.0.0.0"
        port: 5432
        wal_level: logical
        hot_standby: "on"
        wal_keep_segments: 1000
        max_wal_senders: 10
        max_replication_slots: 10
        wal_log_hints: "on"
postgresql:
  listen: 0.0.0.0:5432
  connect_address: 192.168.0.13:5432
  data_dir: /var/lib/pgsql/10/data
  bin_dir: /usr/pgsql-10/bin
  authentication:
    replication:
      username: repluser
      password: 111111
    superuser:
      username: postgres
      password: 111111
tags:
    nofailover: false
    noloadbalance: false
    clonefrom: false
    nosync: false
EOF

在这里插入图片描述

在所有节点上配置systemd管理Patroni:

vim /usr/lib/systemd/system/patroni.service
[Unit]
Description=patroni - a high-availability PostgreSQL
Documentation=https://patroni.readthedocs.io/en/latest/index.html
After=syslog.target network.target etcd.target
Wants=network-online.target

[Service]
Type=simple
User=postgres
Group=postgres
PermissionsStartOnly=true
ExecStart=/usr/local/bin/patroni /usr/patroni/conf/patroni_postgresql.yml
ExecReload=/bin/kill -HUP $MAINPID
LimitNOFILE=65536
KillMode=process
KillSignal=SIGINT
Restart=on-abnormal
RestartSec=30s
TimeoutSec=0

[Install]
WantedBy=multi-user.target

在这里插入图片描述

在所有节点上启动Patroni,并设置自启动:

systemctl start patroni
systemctl enable patroni
systemctl status patroni

在这里插入图片描述

在任意节点上查看Patroni集群状态:

patronictl -c /usr/patroni/conf/patroni_postgresql.yml list

在这里插入图片描述

在任意节点上查看ETCD信息:

etcdctl ls /pgsql/pgsql10
etcdctl get /pgsql/pgsql10/members/pgsql_slot1
etcdctl get /pgsql/pgsql10/members/pgsql_slot2
etcdctl get /pgsql/pgsql10/members/pgsql_slot3

在这里插入图片描述

4、部署Keepalived

安装Keepalived:

yum -y install keepalived

在这里插入图片描述

在PGSQL1节点上创建Keepalived配置文件:

cat > /etc/keepalived/keepalived.conf << EOF
global_defs {
   router_id LVS_DEVEL
}

vrrp_script check_haproxy {
    script "/etc/keepalived/check_haproxy.sh"
    interval 2
    weight 5
    fall 3
    rise 5
    timeout 2
}

vrrp_instance VI_1 {
    state Master
    interface ens33
    virtual_router_id 80
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 111111
    }
    virtual_ipaddress {
        192.168.0.10/24
    }
    track_script {
        check_haproxy
    }
}
EOF

在这里插入图片描述

在PGSQL2节点上创建Keepalived配置文件:

cat > /etc/keepalived/keepalived.conf << EOF
global_defs {
   router_id LVS_DEVEL
}

vrrp_script check_haproxy {
    script "/etc/keepalived/check_haproxy.sh"
    interval 2
    weight 5
    fall 3
    rise 5
    timeout 2
}

vrrp_instance VI_1 {
    state Slave
    interface ens33
    virtual_router_id 80
    priority 50
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 111111
    }
    virtual_ipaddress {
        192.168.0.10/24
    }
    track_script {
        check_haproxy
    }
}
EOF

在这里插入图片描述

在PGSQL3节点上创建Keepalived配置文件:

cat > /etc/keepalived/keepalived.conf << EOF
global_defs {
   router_id LVS_DEVEL
}

vrrp_script check_haproxy {
    script "/etc/keepalived/check_haproxy.sh"
    interval 2
    weight 5
    fall 3
    rise 5
    timeout 2
}

vrrp_instance VI_1 {
    state Slave
    interface ens33
    virtual_router_id 80
    priority 30
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 111111
    }
    virtual_ipaddress {
        192.168.0.10/24
    }
    track_script {
        check_haproxy
    }
}
EOF

在这里插入图片描述

在所有节点上创建检查脚本:

vim /etc/keepalived/check_haproxy.sh
#!/bin/bash
count=`ps aux | grep -v grep | grep haproxy | wc -l`
if [ $count -eq 0 ]; then
    exit 1
else
    exit 0
fi

在这里插入图片描述

chmod a+x /etc/keepalived/check_haproxy.sh

在这里插入图片描述

启动Keepalived,并设置自启动:

systemctl start keepalived
systemctl enable keepalived
systemctl status keepalived

在这里插入图片描述

在PGSQL1节点上查看Keepalived工作状态:

ip addr

在这里插入图片描述

在ens33网卡绑定了192.168.0.10虚拟IP

5、部署HAProxy

安装HAProxy:

yum -y install haproxy

在这里插入图片描述

在所有节点上创建HAProxy配置文件:

cat > /etc/haproxy/haproxy.cfg << EOF
global
    log         127.0.0.1 local2
    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon
    stats socket /var/lib/haproxy/stats

defaults
    mode                    tcp
    log                     global
    option                  tcplog
    option                  dontlognull
    option                  redispatch
    retries                 3
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout check           10s
    maxconn                 3000

listen status
    bind *:1080
    mode http
    log global
    stats enable
    stats refresh 30s
    stats uri /
    stats realm Private lands
    stats auth admin:admin

listen master
    bind *:5000
    mode tcp
    option tcplog
    balance roundrobin
    option httpchk OPTIONS /master
    http-check expect status 200
    default-server inter 3s fall 3 rise 2 on-marked-down shutdown-sessions
    server pgsql1 192.168.0.11:5432 maxconn 1000 check port 8008 inter 5000 rise 2 fall 2
    server pgsql2 192.168.0.12:5432 maxconn 1000 check port 8008 inter 5000 rise 2 fall 2
    server pgsql3 192.168.0.13:5432 maxconn 1000 check port 8008 inter 5000 rise 2 fall 2

listen replicas
    bind *:5001
    mode tcp
    option tcplog
    balance roundrobin
    option httpchk OPTIONS /replica
    http-check expect status 200
    default-server inter 3s fall 3 rise 2 on-marked-down shutdown-sessions
    server pgsql1 192.168.0.11:5432 maxconn 1000 check port 8008 inter 5000 rise 2 fall 2
    server pgsql2 192.168.0.12:5432 maxconn 1000 check port 8008 inter 5000 rise 2 fall 2
    server pgsql3 192.168.0.13:5432 maxconn 1000 check port 8008 inter 5000 rise 2 fall 2
EOF

在这里插入图片描述

启动HAProxy,并设置自启动:

systemctl start haproxy
systemctl enable haproxy
systemctl status haproxy

在这里插入图片描述

6、PostgreSQL故障演示

在任意节点上查看Patroni集群状态:

patronictl -c /usr/patroni/conf/patroni_postgresql.yml list

在这里插入图片描述

PGSQL1节点为Leader节点

通过虚IP的5000端口连接数据库:

psql -U postgres -h 192.168.0.10 -p 5000

在这里插入图片描述

创建数据库和表:

CREATE DATABASE db;

在这里插入图片描述

\c db
CREATE TABLE tb (
   id int NOT NULL,
   name varchar(255) NULL,
   PRIMARY KEY (id)
);

在这里插入图片描述

插入数据:

INSERT INTO tb (id,name) VALUES (1,'MySQL');

在这里插入图片描述

查看数据:

SELECT * FROM tb;

\q

在这里插入图片描述

关闭PGSQL1节点,模拟节点故障

在任意健康节点上查看Patroni集群状态:

patronictl -c /usr/patroni/conf/patroni_postgresql.yml list

在这里插入图片描述

此时PGSQL3节点为Leader节点

通过虚IP的5000端口连接数据库:

psql -U postgres -h 192.168.0.10 -p 5000

在这里插入图片描述

插入数据:

\c db

INSERT INTO tb (id,name) VALUES (2,'Redis');

在这里插入图片描述

查看数据:

SELECT * FROM tb;

\q

在这里插入图片描述

数据库读写正常

  • 1
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: PostgreSQL是一种开源的关系型数据库管理系统,它支持高可用集群部署,可以提供数据的持久性和可用性。以下是关于PostgreSQL高可用集群的装指南简述: 1. 集群环境准备:首先需要准备一组具有相同操作系统和网络配置的物理或虚拟机。确保集群中的所有节点都可以互相通信。 2. 安装和配置PostgreSQL:在每个节点上安装PostgreSQL软件,并在配置文件中设置适当的参数。确保所有节点的配置文件保持一致。 3. 数据同步和复制:为实现高可用性,需要使用PostgreSQL内置的复制功能。使用流复制或逻辑复制将数据从主节点复制到备份节点。 4. 主备切换和故障恢复:在主节点发生故障时,需要手动或自动触发主备切换。保证备份节点可以接管主节点的功能,并尽快恢复服务。 5. 自动化监控和管理:为了更好地管理和监控集群,可以使用一些工具和脚本来自动化任务,例如监控节点状态、日志检查和备份。 6. 容灾和故障转移:为了应对更严重的故障,可以在不同的地理位置设置多个节点,以实现容灾和故障转移。在这种情况下,需要考虑数据同步的延迟和网络带宽等因素。 7. 安全性和权限管理:在配置高可用集群时,务必考虑数据的安全性。设置适当的访问权限并实施加密和身份验证措施。 总之,PostgreSQL高可用集群的装指南包括安装和配置PostgreSQL、数据同步和复制、主备切换和故障恢复、自动化监控和管理、容灾和故障转移以及安全性和权限管理等内容。通过合理地设置和管理,可以确保PostgreSQL数据库具备高可用性和可靠性。 ### 回答2: PostgreSQL是一个开源的关系型数据库管理系统,它支持高可用集群配置,以确保数据库系统的可用性和容错性。以下是一个关于PostgreSQL高可用集群配置的装指南。 1.选择合适的架构:在配置PostgreSQL高可用集群之前,首先需要选择适合你的架构。常见的架构包括主-从复制、主-主复制和基于分布式数据库的架构。根据你的需求和资源预算选择适合的架构。 2.配置主-从复制:主-从复制是最简单和常见的PostgreSQL高可用架构。配置主-从复制需要设置一个主数据库和一个或多个从数据库。主数据库接收写入操作,并将更新传播给从数据库。配置主-从复制需要在主数据库和从数据库之间设置流复制。 3.配置主-主复制:主-主复制架构允许多个节点同时接收写入操作。这种架构可以提高系统的容错性和可用性。配置主-主复制需要设置多个相互同步的节点,并使用流复制来实现数据同步。需要注意的是,主-主复制可能导致数据冲突,因此需要进行一些额外的配置和管理。 4.配置自动故障转移:为了实现高可用性,当主节点遇到故障时,需要配置自动故障转移。自动故障转移可以自动将故障节点替换为备用节点,以确保数据库系统的连续性。可以使用软件工具或自定义脚本来实现自动故障转移。 5.监控和管理集群:为了确保高可用集群的稳定性和性能,需要定期监控和管理集群。可以使用PostgreSQL提供的监控工具,如pg_stat_replication和pg_stat_activity,来监控数据库状态和查询性能。另外,还可以使用第三方的监控工具来监控集群的运行状况。 以上是关于PostgreSQL高可用集群配置的一些基本指南。具体的配置方法和工具选择可能会因环境和需求而异,建议在实际操作中参考官方文档和相关资料,以确保配置正确和可靠。 ### 回答3: PostgreSQL是一种非常强大的开源数据库管理系统,在构建高可用集群时,可以采用以下指南: 1. 安装和配置PostgreSQL:首先,需要在每个节点上安装和配置PostgreSQL。可以从官方网站下载适用于您的操作系统的最新版本,并按照说明进行安装。确保在每个节点上进行相同的配置,包括数据库路径、监听地址和端口等。 2. 设置主从复制:在高可用集群中,通常会将一个节点作为主节点,其他节点作为从节点。主节点负责处理写操作,而从节点负责处理读操作。在主节点上进行设置,以使其将更改记录到WAL(Write-Ahead Log)并发送给从节点,从节点可以通过流复制技术将更改同步到自己的本地数据库。 3. 配置复制流:在从节点上配置复制流以接收主节点发送的更改。可以使用PostgreSQL提供的pg_basebackup工具来进行复制流设置。确保在从节点上指定主节点的地址和端口,并指定复制流的用户名和密码。 4. 配置故障切换:在高可用集群中,当主节点发生故障时,必须能够实现自动故障切换。这可以通过使用PostgreSQL的流复制和触发器来实现。可以编写一个触发器,当检测到主节点故障时,自动将一个从节点提升为新的主节点,并将其他从节点重新配置为复制新的主节点。 5. 监控和管理:在构建高可用集群时,需要定期监测各个节点的状态和性能。可以使用PostgreSQL自带的工具,如pg_stat_replication和pg_stat_activity来监控复制状态和数据库活动。此外,还可以使用第三方监控工具,如Zabbix或Nagios来实时监测集群的运行状态,并及时采取措施应对潜在的故障。 在配置和管理PostgreSQL高可用集群时,请确保备份数据库,定期更新软件版本,并遵循最佳实践和安全措施,以确保数据的完整性和可用性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值