linux7安装分布式GreenPlum 5.28+6.13教程完整版

1.安装说明

GreenPlum6.X目前支持以下版本操作系统:

  • Red Hat Enterprise Linux 64-bit 7.x
  • Red Hat Enterprise Linux 64-bit 6.x
  • Redhat 64-bit 7.x
  • Redhat 64-bit 6.x
  • Ubuntu 18.04 LTS
    建议采用7.3以上的7系列版本
    本次安装使用1个master节点两个segment的节点.每个节点配置为2核心8GB,操作
    系统是Redhat7.6
  • 5.28 主机名 、 ip地址如下:

主机名

ip地址

操作系统

硬件配置

规划

mdw

192.168.56.10(业务地址)

Redhat7.6

2C8G

Master

sdw1

192.168.56.11

Redhat7.6

2C8G

seg1,mirror seg1

sdw2

192.168.56.12

Redhat7.6

2C8G

seg2,mirror seg2

sdw3

192.168.56.13

Redhat7.6

2C8G

seg3,mirror seg3

smdw

192.168.56.14

Redhat7.6

2C8G

Standby

  • 6.13 主机名 、 ip地址如下:

主机名

ip地址

操作系统

硬件配置

规划

mdw6

192.168.56.20(业务地址)

Redhat7.6

2C8G

Master

sdw61

192.168.56.21

Redhat7.6

2C8G

seg1,mirror seg1

sdw62

192.168.56.22

Redhat7.6

2C8G

seg2,mirror seg2

sdw63

192.168.56.23

Redhat7.6

2C8G

seg3,mirror seg3

smdw6

192.168.56.24

Redhat7.6

2C8G

Standby

安装部署GP主要分为三个步骤:

  • 准备工作:包括操作系统安装,系统参数修改等
  • 安装验证
  • 初始化数据库

安装时间

2021-01-21

安装版本

6.13.0

下载地址

Download VMware Greenplum® — VMware Tanzu Network
或者中文下载地址:
Releases · greenplum-db/gpdb · GitHub

文档说明

https://gpdb.docs.pivotal.io/6-13/install_guide/platform-requirements.html
或者中文文档地址:
关于此文档 | Greenplum Database Docs

2.准备工作

操作系统的安装和主机名,ip地址的配置这里就不进行讲解了.注意这里使用了一个专门用来节点之间数据交互的网段,下面的所有配置,需要在每个节点进行配置

2.1 配置host

修改/etc/hosts文件,添加每个节点信息

--5.28.4版本

cat > /etc/hosts<<done
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.56.10 mdw
192.168.56.11 sdw1
192.168.56.12 sdw2
192.168.56.13 sdw3
192.168.56.14 smdw
done

--6.13版本

cat > /etc/hosts<<done
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.56.20 mdw6
192.168.56.21 sdw61
192.168.56.22 sdw62
192.168.56.23 sdw63
192.168.56.24 smdw6

done

2.2 配置sysctl.conf文件

配置内核参数/etc/sysctl.conf,配置完成后sysctl -p生效

echo "

kernel.shmmax = $(expr $(getconf _PHYS_PAGES) / 2 \* $(getconf PAGE_SIZE))            

#注意这里查看说明Shared Memory Pages

kernel.shmmni = 4096

kernel.shmall = $(expr $(getconf _PHYS_PAGES) / 2)

vm.overcommit_memory = 2        # 注意这里查看说明Segment Host Memory

vm.overcommit_ratio = 95           # 注意这里查看说明Segment Host Memory

net.ipv4.ip_local_port_range = 10000 65535     # See Port Settings

kernel.sem = 500 2048000 200 4096

kernel.sysrq = 1

kernel.core_uses_pid = 1

kernel.msgmnb = 65536

kernel.msgmax = 65536

kernel.msgmni = 2048

net.ipv4.tcp_syncookies = 1

net.ipv4.conf.default.accept_source_route = 0

net.ipv4.tcp_max_syn_backlog = 4096

net.ipv4.conf.all.arp_filter = 1

net.core.netdev_max_backlog = 10000

net.core.rmem_max = 2097152

net.core.wmem_max = 2097152

vm.swappiness = 10

vm.zone_reclaim_mode = 0

vm.dirty_expire_centisecs = 500

vm.dirty_writeback_centisecs = 100

vm.dirty_background_ratio = 3      # 注意这里查看说明System Memory

vm.dirty_ratio = 10

#vm.dirty_background_bytes = 1610612736

#vm.dirty_bytes = 4294967296

" > /etc/sysctl.conf

sysctl -p

下面的上面几个关键参数配置的说明,根据不同的场景自行进行配置:

  • Shared Memory Pages

Greenplum数据库使用共享内存进行 Postgres 进程和 Postgres 实例之间的通信。 kernel.shmall可以在系统范围内使用的共享内存总量(以页为单位)。kernel.shmmax 设置单个共享内存段的最大大小(以字节为单位)。
kernel.shmall 和 kernel.shmmax值取决于系统的物理内存和页面大小。通常,两个参数的值都应为系统物理内存的一半。
使用操作系统变量 _PHYS_PAGES 和 页面大小 设置参数。

kernel.shmall =(_PHYS_PAGES / 2)
kernel.shmmax =(_PHYS_PAGES / 2)* PAGE_SIZE

计算的值 kernel.shmall 和 kernel.shmmax,使用以下命令运行以下命令 getconf 命令,该命令返回操作系统变量的值。

$ echo $(expr $ {(getconf _PHYS_PAGES)/ 2) 
$ echo $ {expr $ {(getconf _PHYS_PAGES)/ 2 \ * $ {getconf PAGE_SIZE))

作为最佳做法,我们建议您在 /etc/sysctl.conf使用计算值的文件。例如,主机系统安装了1583 GB的内存,并返回以下值:_PHYS_PAGES = 395903676和PAGE_SIZE = 4096。内核 和 内核 值:

kernel.shmall = 197951838
kernel.shmmax = 810810728448

如果Greeplum Database master的共享内存配置与段主机不同,则_PHYS_PAGES和PAGE_SIZE值可能会有所不同,并且 内核 和 内核 主主机上的值将与段主机上的值不同。

  • Segment Host Memory
    的 vm.overcommit_memoryOS使用Linux内核参数来确定可以为进程分配多少内存。对于Greenplum数据库,此参数应始终设置为2。
    vm.overcommit_ratio是用于应用程序进程的RAM的百分比,其余部分保留给操作系统。在Red Hat Enterprise Linux上,默认值为50。
    对于 vm.overcommit_ratio有关基于资源组的资源管理或基于资源队列的资源管理的调整和计算建议,请参阅《Geenplum数据库管理员指南》中的“ 配置段主机内存的选项”。另请参阅Greenplum数据库服务器配置参数 gp_vmem_protect_limit在“ Greenplum数据库参考指南”中
  • Port Settings
    为避免在Greenplum初始化期间Greenplum数据库与其他应用程序之间的端口冲突,请记下操作系统参数指定的端口范围 net.ipv4.ip_local_port_range。使用初始化Greenplum时gpinitsystem群集配置文件,请不要在该范围内指定Greenplum数据库端口。例如,如果net.ipv4.ip_local_port_range = 10000 65535,将Greenplum数据库基本端口号设置为这些值。
PORT_BASE = 6000
MIRROR_PORT_BASE = 7000
  • System Memory
    对于内存超过64GB的主机系统,建议以下设置:
vm.dirty_background_ratio = 0
vm.dirty_ratio = 0
vm.dirty_background_bytes = 1610612736#1.5GB
vm.dirty_bytes = 4294967296#4GB

对于具有64GB或更少内存的主机系统,请卸下 vm.dirty_background_bytes 和 vm.dirty_bytes 并设置两个这些值的参数:

vm.dirty_background_ratio = 3
vm.dirty_ratio = 10

增加 vm.min_free_kbytes 确保 PF_MEMALLOC 来自网络和存储驱动程序的请求很容易满足。这对于具有大量系统内存的系统尤其重要。在这些系统上,默认值通常太低。使用此awk命令进行设置vm.min_free_kbytes 到建议的系统物理内存的3%:

awk'BEGIN {OFMT =“%.0f”;} / MemTotal / {打印“ vm.min_free_kbytes =”,$ 2 * .03;}'
               / proc / meminfo >> /etc/sysctl.conf 

不设置 vm.min_free_kbytes 超过系统内存的5%,因为这样做可能会导致内存不足情况。

2.3 配置limits.conf

配置资源使用限制/etc/security/limits.conf和/etc/security/limits.d/20-nproc.conf

echo "
* soft nofile 65536
* hard nofile 65536
* soft nproc 131072
* hard nproc 131072
" >> /etc/security/limits.conf
echo "
# Default limit for number of user's processes to prevent
# accidental fork bombs.
# See rhbz #432903 for reasoning.
*          soft    nproc     10132
root       soft    nproc     unlimited
"  >/etc/security/limits.d/20-nproc.conf

2.4 关闭防火墙和selinux

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

2.5 创建gp用户

需要创建一个特定的用户运行gp,一般为gpadmin:

groupadd gpadmin;useradd -g gpadmin gpadmin
echo "gpadmin" |passwd --stdin gpadmin
#设置gpadmin用户环境变量设置
cat > /home/gpadmin/.bash_profile<<done
source /usr/local/greenplum-db/greenplum_path.sh
export MASTER_DATA_DIRECTORY=/data/master/gpseg-1
export PGPORT=5432
export PGUSER=gpadmin
export PGDATABASE=postgres
done

配置visudo(可选择配置)

visudo  #找到%wheel  ALL=(ALL)  NOPASSWD: ALL 取消其注释
usermod -aG wheel gpadmin   #将gpadmin加入到wheel组

2.6 安装依赖包

除了对操作系统的要求外,还需要安装一些常用的软件包或工具,例如sed,perl,tar等,这里你需要先配置yum源:

yum install -y apr apr-util bash bzip2 curl krb5 libcurl libevent libevent2 libxml2 libyaml zlib openldap openssh openssl openssl-libs perl readline rsync sed tar zip apr apr-util libyaml libevent java ntp

2.7 创建数据目录

我们这里使用的磁盘为/dev/sdb 大小为50GB,挂载目录为/data

注意:
The only file system supported for running Greenplum Database is the XFS file system. All other file systems are explicitly not supported by Pivotal.
官网提示,gp只支持xfs文件系统,不支持其它文件系统

pvcreate /dev/sdb

vgcreate datavg /dev/sdb

lvcreate -L +49.9G -n datalv datavg

mkfs.xfs  /dev/datavg/datalv

mkdir /data

echo "/dev/datavg/datalv      /data                   xfs     nodev,noatime,nobarrier,inode64  0 0" >> /etc/fstab

mount -a

chown -R gpadmin:gpadmin /data

建议,挂载使用nodev,noatime,nobarrier,inode64 参数

2.8 磁盘IO配置

  • 预读值
    每个磁盘设备文件都应预读(块设备)值16384。要验证磁盘设备的预读值,请执行以下操作:
/sbin/blockdev --getra devname
例如,我们这里是sdb
[root@gp2 ~]# /sbin/blockdev --getra /dev/sdb
8192

要在设备上设置blockdev(预读):

/sbin/blockdev --setra bytes devname
例如:
/sbin/blockdev --setra 16384 /dev/sdb

需要将此配置添加到开机自动启动中:

echo "/sbin/blockdev --setra 16384 /dev/sdb" >>/etc/rc.local
chmod +x /etc/rc.d/rc.local
  • 磁盘IO调度
    用于磁盘访问的Linux磁盘I / O调度程序支持不同的策略,例如 CFQ, AS, deadline。
    建议使用deadline调度程序选项。要在下一次系统重新引导之前指定调度程序,请运行以下命令:
echo schedulername > /sys/block/devname/queue/scheduler
例如:
echo deadline > /sys/block/sdb/queue/scheduler

永久生效,7.X中使用grup命令进行修改

grubby --update-kernel=ALL --args="elevator=deadline"
查看
grubby --info=ALL
或者使用下面查看:
cat  /sys/block/sdb/queue/scheduler

2.9 关闭透明大页(THP)

同样的,在7.X系列中使用grup命令进行修改

grubby --update-kernel=ALL --args="transparent_hugepage=never"
检查是否修改成功:
$ cat /sys/kernel/mm/*transparent_hugepage/enabled
always [never]

重启服务器之后生效.

2.10 IPC对象删除

禁用RHEL 7.2或Redhat 7.2或Ubuntu的IPC对象删除。默认值 系统的 设置 RemoveIPC =YES 非系统用户帐户注销时删除IPC连接。这将导致Greenplum数据库实用程序 gpinitsystem因信号错误而失败。请执行以下操作之一以避免出现此问题
修改/etc/systemd/logind.conf

echo "RemoveIPC=no" >>/etc/systemd/logind.conf
systemctl restart systemd-logind

2.11 SSH连接阈值

某些Greenplum数据库管理实用程序包括 gpexpand, gpinitsystem和 gpaddmirrors,请使用系统之间的SHELL(SSH)连接来执行其任务。在大型Greenplum数据库部署,云部署或每台主机具有大量分段的部署中,这些实用程序可能会超出主机的未认证连接的最大阈值。发生这种情况时,您会收到以下错误:ssh_exchange_identification:连接被远程主机关闭。
要增加Greenplum数据库系统的此连接阈值,请更新SSH MaxStartups 和 最大会话数 配置参数之一 /etc/ssh sshd_config 要么 /etc/sshd_config SSH守护程序配置文件。
如果指定 MaxStartups 和 最大会话数 使用单个整数值,您可以确定并发未认证连接的最大数量(MaxStartups)以及每个网络连接允许的最大外壳程序,登录或子系统会话数(最大会话数)。例如:

MaxStartups 200
MaxSessions 200

如果指定 MaxStartups使用“ start:rate:full ”语法,可以通过SSH守护程序启用随机的早期连接删除。start标识允许的最大未经身份验证的SSH连接尝试次数。一旦达到未经身份验证的连接尝试的起始次数,SSH守护程序将拒绝后续连接尝试的速率百分比。“完全”标识未经身份验证的连接尝试的最大数量,之后所有尝试都将被拒绝。例如:

echo "
MaxStartups 10:30:200
MaxSessions 200
" >> /etc/ssh/sshd_config
systemctl restart sshd

2.12 时钟同步(NTP)

您应该使用NTP(网络时间协议)来同步组成Greenplum数据库系统的所有主机上的系统时钟。有关NTP的更多信息,请参见www.ntp.org。
在segment主机上的NTP应该配置为将master主机用作主要时间源,将备用主控机用作辅助时间源。在主备主机上,将NTP配置为指向首选时间服务器。

ntp服务器端配置

cat > /etc/ntp.conf <<done

driftfile /var/lib/ntp/drift

restrict default kod nomodify notrap 

restrict -6 default kod nomodify notrap

restrict 127.0.0.1

restrict -6 ::1

server 127.127.1.0

fudge 127.127.1.0 stratum 8

done

systemctl restart ntpd

ntp服务器端配置客户端配置

ntpdate  192.168.56.10

echo "OPTIONS=\"-x -u ntp:ntp -p /var/run/ntpd.pid -g\"" > /etc/sysconfig/ntpd

cat > /etc/ntp.conf <<done

driftfile /var/lib/ntp/drift

restrict default kod nomodify notrap nopeer noquery

restrict -6 default kod nomodify notrap nopeer noquery

restrict 127.0.0.1

restrict -6 ::1

server 192.168.56.10  iburst

SYNC_HWCLOCK=yes

includefile /etc/ntp/crypto/pw

keys /etc/ntp/keys

done

systemctl restart ntpd

sleep 10; ntpq -p

3.安装GP数据库软件

3.1 安装GP软件包

您必须在Greenplum数据库系统的每台主机上安装Greenplum数据库。Pivotal将Greenplum数据库软件作为可下载的软件包分发,您可以使用操作系统的软件包管理系统将其安装在每个主机系统上。

#使用yum默认会将软件安装到/usr/local/greenplum-db-<版本>下
yum install -y greenplum-db-5.28.4-rhel7-x86_64.rpm
yum install -y greenplum-db-6.13.0-rhel7-x86_64.rpm
#或者使用rpm
rpm -ivh greenplum-db-5.28.4-rhel7-x86_64.rpm
#如果想将软件安装到指定目录下,必须使用rpm安装,并且指定安装目录
rpm -ivh greenplum-db-6.10.1-rhel7-x86_64.rpm --prefix=/usr/local/gp6.10

使用 yum将会自动安装所依赖的软件包,并且将Greenplum数据库软件文件复制到版本特定的目录下 /usr/lcoal, /usr/local/greenplum-db-<版本>,并创建符号链接/usr/local/greenplum-db 到安装目录。

将所有者和已安装文件的组更改为 gpadmin:

chown -R gpadmin:gpadmin /usr/local/greenplum*

3.2 配置SSH等价

1、创建文件all_hosts(所有主机名)和 all_segs(数据节点主机名)(三台主机)

路径可以自选,这里用/home/all_hosts和/home/all_segs

--5.28.4版本

cat > /home/all_hosts<<done
mdw
sdw1
sdw2
sdw3
smdw
done
文件/home/all_segs:
cat > /home/all_segs<<done
sdw1
sdw2
sdw3
done

--6.13版本

cat > /home/all_hosts<<done
mdw6
sdw61
sdw62
sdw63
smdw6
done
#文件/home/all_segs:
cat > /home/all_segs<<done
sdw61
sdw62
sdw63

done

2、配置master节点可以免密登录到其他节点

ssh-keygen  --每台上执行root和gpadmin用户

在master上执行,root和gpadmin用户

ssh-copy-id mdw6

ssh-copy-id sdw61

ssh-copy-id sdw62

ssh-copy-id sdw63

ssh-copy-id smdw6

3、使用gpadmin登录到master节点



开始执行互信脚本--root用户
source /usr/local/greenplum-db/greenplum_path.sh
gpssh-exkeys -f /home/all_hosts
--gpadmin用户
su - gpadmin
gpssh-exkeys -f /home/all_hosts

3、使用gpssh确认免密码登录配置成功
要确保正确安装和配置了Greenplum软件,请从Greenplum master主机运行以下确认步骤。如有必要,请纠正任何问题,然后再继续执行下一个任务。

gpssh -f /home/all_hosts -e 'ls -l /usr/local/greenplum-db'

3.3 安装文件说明

关Greenplum数据库安装文件说明如下:

  • greenplum_path.sh—该文件包含Greenplum数据库的环境变量。请参阅设置Greenplum环境变量。
  • bin-此目录包含Greenplum数据库管理实用程序。此目录还包含PostgreSQL客户端和服务器程序,其中大多数也在Greenplum数据库中使用。
  • docs / cli_help-此目录包含Greenplum数据库命令行实用程序的帮助文件。
  • docs / cli_help / gpconfigs-此目录包含示例 gpinitsystem 在安装和初始化Greenplum数据库系统时可以修改和使用的配置文件和主机文件。
  • ext —一些Greenplum Database实用程序使用的捆绑程序(例如Python)。
  • influde — Greenplum数据库的C头文件。
  • lib — Greenplum数据库和PostgreSQL库文件。
  • sbin —支持/内部脚本和程序。
  • share — Greenplum数据库的共享文件

4.创建数据存储区域

描述如何为每个master实例,standby实例和segment实例创建存储Greenplum数据库数据的目录位置。

4.1 在master和standby上创建存储区域

Greenplum数据库master数据库和standby主数据库主机上都需要一个数据存储区,以存储Greenplum数据库系统数据,例如目录数据和其他系统元数据。

主目录上的数据目录位置与段上的数据目录位置不同。主服务器不存储任何用户数据,只有系统目录表和系统元数据存储在主服务器实例上,因此您不需要指定与段上一样多的存储空间。

使用gpssh工具在所有segment主机上创建主数据和镜像数据目录:

mkdir -p /data/master;chown -R gpadmin:gpadmin /data/
-- 主节点备用机
su - gpadmin
gpssh -h smdw -e 'sudo mkdir -p /data/master'
gpssh -h smdw -e 'sudo chown -R gpadmin:gpadmin /data/'
-- 数据节点
gpssh -f /home/all_hosts -e 'sudo chown -R gpadmin:gpadmin  /usr/local/greenplum-db/'
gpssh -f /home/all_segs -e 'sudo mkdir /data'
gpssh -f /home/all_segs -e 'sudo mkdir /data/primary'
gpssh -f /home/all_segs -e 'sudo mkdir /data/mirror'
gpssh -f /home/all_segs -e 'sudo chown -R gpadmin:gpadmin /data/'

5.验证系统(6.13版本可用)

验证您的硬件和网络性能。
Greenplum提供了一个名为 gpcheckperf,可用于识别Greenplum数据库阵列中计算机上的硬件和系统级问题。 gpcheckperf 在指定的主机上启动会话并运行以下性能测试:

  • 网络性能(gpnetbench *)
  • 磁盘I / O性能(dd 测试)
  • 内存带宽(流测试)
    使用之前 gpcheckperf,您必须在性能测试所涉及的主机之间建立受信任的主机设置。您可以使用该实用程序gpssh-exkeys更新已知的主机文件并在主机之间交换公钥(如果尚未这样做)。注意 gpcheckperf 调用 gpssh 和 gpscp,因此这些Greenplum实用程序必须位于您的 $ PATH。

5.1 验证网络性能

要测试网络性能,请运行 gpcheckperf 使用网络测试运行选项之一:并行对测试(r),串行对测试(-rn)或全矩阵测试(-R M)。
该实用程序运行一个网络基准程序,该程序将5秒钟的数据流从当前主机传输到测试中包括的每个远程主机。默认情况下,数据以并行方式传输到每个远程主机,最小,最大,平均和中值网络传输速率以每秒兆字节(MB)报告。如果结果传输速率比预期的慢(小于100 MB / s),则可以使用以下命令连续运行网络测试-rn选项以获得每个主机的结果。要运行全矩阵带宽测试,您可以指定-RM这将导致每个主机从指定的每个其他主机发送和接收数据。此测试最适合用来验证交换结构是否可以承受全矩阵工作负载。
Greenplum数据库阵列中的大多数系统都配置有多个网络接口卡(NIC),每个NIC都位于其自己的子网上。测试网络性能时,单独测试每个子网很重要。例如,我们目前的环境有两个网段分别为业务网端192.168.56.0和内部网段19.19.19.10 那么就需要测试这两个网段的性能:
这里我们master上创建2个单独的主机文件,分别存放两个网段的主机名:

echo "sdw2
sdw3" >~/seg_host1

使用gpcheckperf 进行网络测试:
gpcheckperf -f /home/all_segs -r N -d /tmp

##网段测试:
Netperf bisection bandwidth test
sdw61 -> sdw62 = 725.430000
sdw63 -> sdw61 = 727.890000
sdw62 -> sdw61 = 600.770000
sdw61 -> sdw63 = 726.670000
 
 
Summary:
sum = 2780.76 MB/sec
min = 600.77 MB/sec
max = 727.89 MB/sec
avg = 695.19 MB/sec
median = 726.67 MB/sec

5.2 验证磁盘IO和内存带宽

要测试磁盘和内存带宽性能,请运行 gpcheckperf 带有磁盘和流测试运行选项(-r ds)。磁盘测试使用dd命令(标准UNIX实用程序)以测试逻辑磁盘或文件系统的顺序吞吐性能。内存测试使用STREAM基准程序来测量可持续的内存带宽。结果以MB /秒(MB / s)报告。



2.执行gpcheckperf 实用程序使用 hostfile_gpcheckperf您刚创建的文件。使用 -d选项以指定要在每个主机上测试的文件系统(您必须具有对这些目录的写访问权)。您将要测试所有主要和镜像段数据目录位置。例如我们这里:

gpcheckperf -f /home/all_segs -r ds -D \
-d /data/primary -d  /data/mirror 
##如果有多个目录需要测试,则继续使用-d选项接目录位置
##下面是执行结果:
====================
==  RESULT 2021-01-22T11:01:44.623129
====================
 
 
 disk write avg time (sec): 131.04
 disk write tot bytes: 100210311168
 disk write tot bandwidth (MB/s): 729.30
 disk write min bandwidth (MB/s): 242.86 [sdw63]
 disk write max bandwidth (MB/s): 243.36 [sdw61]
 -- per host bandwidth --
    disk write bandwidth (MB/s): 242.86 [sdw63]
    disk write bandwidth (MB/s): 243.08 [sdw62]
    disk write bandwidth (MB/s): 243.36 [sdw61]
 
 
 
 
 disk read avg time (sec): 117.27
 disk read tot bytes: 100210311168
 disk read tot bandwidth (MB/s): 827.79
 disk read min bandwidth (MB/s): 248.43 [sdw62]
 disk read max bandwidth (MB/s): 326.69 [sdw61]
 -- per host bandwidth --
    disk read bandwidth (MB/s): 252.66 [sdw63]
    disk read bandwidth (MB/s): 248.43 [sdw62]
    disk read bandwidth (MB/s): 326.69 [sdw61]
 
 
 
 
 stream tot bandwidth (MB/s): 11211.00
 stream min bandwidth (MB/s): 3655.50 [sdw62]
 stream max bandwidth (MB/s): 3852.80 [sdw61]
 -- per host bandwidth --
    stream bandwidth (MB/s): 3702.70 [sdw63]
    stream bandwidth (MB/s): 3655.50 [sdw62]
    stream bandwidth (MB/s): 3852.80 [sdw61]

6.初始化数据库

介绍如何初始化Greenplum数据库数据库系统。

6.1 初始化步骤说明

因为Greenplum数据库是分布式的,所以初始化Greenplum数据库管理系统(DBMS)的过程涉及初始化几个单独的PostgreSQL数据库实例(在Greenplum中称为segment实例)。
每个数据库实例(master数据库和所有segment)都必须在系统中的所有主机之间进行初始化,以使它们都可以作为统一的DBMS一起工作。Greenplum提供了自己的版本初始化数据库 叫 gpinitsystem,它负责在主数据库和每个段实例上初始化数据库,并以正确的顺序启动每个实例。
初始化并启动Greenplum数据库数据库系统后,您可以通过连接到Greenplum主数据库,像在常规PostgreSQL DBMS中一样创建和管理数据库。
初始化Greenplum数据库步骤
1.确保已完成配置系统和安装Greenplum数据库软件中描述的所有安装任务
2.创建一个包含文件segment主机地址的主机文件 。例如前面配置~/hostfile_gpssh_segonly
3.创建您的Greenplum数据库系统配置文件。请参阅创建Greenplum数据库配置文件。
4.默认情况下,Greenplum数据库将使用master主机系统的语言环境进行初始化。确保这是您要使用的正确语言环境,因为某些语言环境选项在初始化后无法更改。有关更多信息,请参见配置时区和本地化设置。
5.在主控主机上运行Greenplum数据库初始化实用程序。请参阅 运行初始化实用程序。
6.设置Greenplum数据库时区。请参阅设置Greenplum数据库时区。
7.Greenplum数据库用户设置环境变量。请参阅设置Greenplum环境变量。

6.2 创建初始化主机文件

直接使用3.2节创建的 /home/all_hosts和/home/all_segs

6.3 创建gp配置文件

1.拷贝gpinitsystem_config文件

mkdir -p /home/gpadmin/gpconfigs
cp $GPHOME/docs/cli_help/gpconfigs/gpinitsystem_config \
     /home/gpadmin/gpconfigs/gpinitsystem_config
  1. 根据实际环境修改配置文件
    创建gpinitsystem_config文件
cat > /home/gpadmin/gpinitsystem_config<<done
ARRAY_NAME="Greenplum Data Platform"
SEG_PREFIX=gpseg
PORT_BASE=40000
declare -a DATA_DIRECTORY=(/data/primary /data/primary)
##6.13版本记得修改下面主机名为mdw6
MASTER_HOSTNAME=mdw
MASTER_DIRECTORY=/data/master
MASTER_PORT=5432
TRUSTED_SHELL=ssh
CHECK_POINT_SEGMENTS=8
ENCODING=UNICODE
MIRROR_PORT_BASE=7000
REPLICATION_PORT_BASE=8000
MIRROR_REPLICATION_PORT_BASE=9000
declare -a MIRROR_DATA_DIRECTORY=(/data/mirror /data/mirror)
done

6.4 执行初始化程序

gpinitsystem 实用程序将使用配置文件中定义的值来创建Greenplum数据库系统。
这些步骤假定您以 gpadmin 用户,并已来源 greenplum_path.sh 文件来设置Greenplum数据库环境变量。
# 主节点有备份主机5.28版本初始化命令

su - gpadmin

gpinitsystem -c /home/gpadmin/gpinitsystem_config -h /home/all_segs -s smdw -S

主节点有备份主机6.13版本初始化命令

su - gpadmin

gpinitsystem -c /home/gpadmin/gpinitsystem_config -h /home/all_segs

安装完成后手工增加备库

gpinitstandby -s smdw6
安装完成后可以使用psql连接数据库:

psql -d postgres
postgres=# \l
输入查询语句
postgres=# select datname,datdba,encoding,datacl from pg_database;

在GP中gpadmin为超级用户,修改gpadmin用户的密码:

postgres=# \du
postgres=# alter user gpadmin with password 'gpadmin';
ALTER ROLE

6.7 设置数据库时区

最佳做法是,将Greenplum数据库和主机系统配置为使用已知的受支持时区。Greenplum数据库使用一组内部存储的PostgreSQL时区中的时区。设置Greenplum数据库时区可防止Greenplum数据库在每次重新启动集群时选择时区,并设置Greenplum数据库master实例和segment实例的时区。
使用 gpconfig实用程序来显示和设置Greenplum数据库时区。例如,这些命令显示Greenplum数据库时区,并将时区设置为 美国/太平洋。

gpconfig -s TimeZone
gpconfig -c TimeZone -v 'Asia/Shanghai'
#更改时区后,您必须重新启动数据库后生效
gpstop -ra
gpconfig -s TimeZone

目录视图 pg_timezone_names 提供Greenplum数据库时区信息。

6.6 解决初始化问题

如果该实用程序在设置实例时遇到任何错误,则整个过程将失败,并可能使您无法使用部分创建的系统。请参阅错误消息和日志,以确定故障原因以及故障发生在何处。日志文件创建于~/gpAdminLogs。
根据过程中发生错误的时间,您可能需要清理然后尝试 gpinitsystem再次实用。例如,如果创建了一些细分实例,但有些失败,则可能需要停止Postgres 处理并从您的数据存储区中删除任何实用程序创建的数据目录。如有必要,将创建一个退出脚本来帮助进行此清理。

  • 使用退出脚本

如果gpinitsystem实用程序失败,它将使您的系统处于部分安装状态,它将创建以下回退脚本:

?/gpAdminLogs/backout_gpinitsystem_ <用户> _ <时间戳>

您可以使用此脚本清除部分创建的Greenplum数据库系统。该退出脚本将删除所有实用程序创建的数据目录, Postgres进程和日志文件。更正了引起的错误之后gpinitsystem 要失败并运行退出脚本,您应该准备好重新尝试初始化Greenplum数据库阵列。
以下示例显示了如何运行回退脚本:

$ sh backout_gpinitsystem_gpadmin_20071031_121053

如果需要删除实例,使用gpdeletesystem工具进行删除:

gpdeletesystem -d /data/master/gpseg-1 -f

8.配置gp参数

8.1配置pg_hba.conf

gp安装完成之后和postgresql一样,默认只允许本地登录:

psql -h 192.168.56.20 -Ugpadmin -dpostgres -W
Password:
psql: error: could not connect to server: FATAL:  no pg_hba.conf entry for host "192.168.56.1", user "gpadmin", database "postgres", SSL off

修改pg_hba.conf配置允许远程登录,配置文件在master seg目录下/data/master/gpseg-1:

#新增配置命令:

echo "host     all         all    0.0.0.0/0   md5">>/data/master/gpseg-1/pg_hba.conf

echo "host   all  gpmon  192.168.0.0/24   md5">>/data/master/gpseg-1/pg_hba.conf

scp -rp /data/master/gpseg-1/pg_hba.conf gpadmin@smdw6:/data/master/gpseg-1/

使用pgstop -u选项重载配置文件:

gpstop -u
psql -h 192.168.56.20 -Ugpadmin -dpostgres -W
postgres=#

8.2配置postgresql.conf

postgresql.conf是gp的主要的配置文件,可以修改一些常用参数:
使用gpconfig来配置参数

[gpadmin@gp1 ~]$ gpconfig --help
COMMAND NAME: gpconfig
Sets server configuration parameters on all segments within 
a Greenplum Database system.
*****************************************************
SYNOPSIS
*****************************************************
gpconfig -c <param_name> -v <value> [-m <master_value> | --masteronly]
       | -r <param_name> [--masteronly]
       | -l 
   [--skipvalidation] [--verbose] [--debug]
gpconfig -s <param_name> [--file | --file-compare] [--verbose] [--debug]

9、GPCOPY安装使用

首先这款工具是两个greenplum集群之间迁移数据的时候使用的,可以迁移完整的数据库,或者是表,可以跨版本迁移,兼容Greenplum Database 4.3.26 以上版本, 以及5.9 以上, 6.x版本。

效率上面要比之前的gptransfer要高,因为是segment之间可以实现并行对拷,但是我这里不会做比对。目前最新版本为2.2版本。

下载地址:https://network.pivotal.io/products/gpdb-data-copy

1.解压安装包

tar xzvf gpcopy-2.3.0.tar.gz;cd gpcopy-2.3.0/

2.拷贝到bin目录

在master节点,复制gpcopy和gpcopy_helper到相应的bin目录

cp gpcopy $GPHOME/bin 

cp gpcopy_helper $GPHOME/bin

3.赋予权限

chmod 755 $GPHOME/bin/gpcopy

chmod 755 $GPHOME/bin/gpcopy_helper

4.拷贝到segment节点

在segment节点的操作如下,只拷贝gpcopy_helper到相应目录下并赋予权限即可。

cd /usr/local/greenplum-db/bin

gpscp -h smdw gpcopy =:/usr/local/greenplum-db/bin

gpscp -h sdw1 -h sdw2 -h sdw3 -h smdw gpcopy_helper =:/usr/local/greenplum-db/bin

gpssh -f /home/all_hosts -e 'chmod 755 /usr/local/greenplum-db/bin/gpcopy_helper'

5 迁移测试

这里只迁移一张表测试,在源端发起gpcopy命令迁移一张名为book_info的表,这里打开debug选项,可以看到具体的执行过程,也方便排错。

gpcopy --source-host 127.0.0.1 --source-user gpadmin  --source-port 1921 --dest-host 192.168.xxx.xxx  --dest-user gpadmin --dest-port 5432 --include-table warehouse.read30.book_info --drop  --dest-table warehouse.read30.book_info --debug

10、gpdb-command-center安装使用

10.1下载地址:

https://network.pivotal.io/products/gpdb-command-center/

10.2 创建gpmon数据库

su - gpadmin

gpperfmon_install --enable --port 5432 --password gpadmin

gpstop -r

scp -rp /data/master/gpseg-1/pg_hba.conf gpadmin@smdw6:/data/master/gpseg-1/

scp -rp ~/.pgpass gpadmin@smdw6:~/.pgpass

scp -rp /data/master/gpseg-1/pg_hba.conf gpadmin@smdw:/data/master/gpseg-1/

scp -rp ~/.pgpass gpadmin@smdw:~/.pgpass

10.3创建数据文件夹(以root在master执行)

source /usr/local/greenplum-db/greenplum_path.sh

gpssh -f /home/all_hosts

=>

mkdir -p /usr/local/gpcc

chown -R gpadmin:gpadmin  /usr/local/gpcc

exit

10.3初始化安装

su - gpadmin

cd /tmp/greenplum-cc-web-6.3.1-gp6-rhel7-x86_64/ 

./gpccinstall-6.3.1 

初始化过程如下:

Do you agree to the Pivotal Greenplum Command Center End User License Agreement? Yy/Nn (Default=Y)

Y

Where would you like to install Greenplum Command Center? (Default=/usr/local)

 /usr/local/gpcc     《=====自定义安装路径         

What would you like to name this installation of Greenplum Command Center? (Default=gpcc)

What port would you like gpcc webserver to use? (Default=28080)

Would you like to enable kerberos? Yy/Nn (Default=N)

Would you like enable SSL? Yy/Nn (Default=N)

Would you like enable SSL? Yy/Nn (Default=N)

Please choose a display language (Default=English)

1.  English

2.  Chinese

3.  Korean

4.  Russian

5.  Japanese

2

10.4 添加环境变量:

设置gpadmin账户的环境并使之生效 gpadmin账户操作(master,standby 节点都配置)

修改.bash_profile

cat >>/home/gpadmin/.bash_profile<<-EOF

GPCC_HOME=/usr/local/gpcc/greenplum-cc

PATH=/usr/local/gpcc/greenplum-cc/bin:$PATH

export PATH

export GPCC_HOME

EOF

source ~/.bash_profile

增加访问权限

vim /usr/local/gpdata/gpmaster/gpseg-1/pg_hba.conf

10.5启动 gpcc-web

gpcc start

登陆用户密码存放位置:

/home/gpadmin/.pgpass

访问

http://19.19.19.20:28080

11、安装其它的扩展模块

例如安装dblink扩展,和pg使用方法一致:

postgres=# CREATE EXTENSION dblink;
CREATE EXTENSION
postgres=# drop extension dblink;
DROP EXTENSION

12、GP实用工具

Greenplum数据库已经修改了某些PostgreSQL后端服务器程序,以处理Greenplum数据库系统的并行性和分发。您只能通过Greenplum数据库管理工具和实用程序访问这些程序。不要直接运行这些程序。
下表列出了某些PostgreSQL后端服务器程序以及要运行的Greenplum数据库实用程序命令。

表1. Greenplum数据库后端服务器程序

PostgreSQL程式名称

描述

使用代替

initdb

该程序被称为 gpinitsystem初始化Greenplum数据库阵列时。它在内部用于创建各个段实例和主实例。

gpinitsystem

ipcclean

未在Greenplum数据库中使用

不适用

pg_basebackup

该程序为单个数据库实例创建二进制副本。Greenplum数据库将其用于诸如创建备用主实例或在需要完整副本时恢复镜像段之类的任务。不要使用此实用程序备份Greenplum数据库段实例,因为它不会产生与MPP一致的备份。

gpinitstandby, gprecoverseg

pg_controldata

未在Greenplum数据库中使用

gpstate

pg_ctl

该程序被称为 gpstart 和 gpstop启动或停止Greenplum数据库阵列时。它在内部用于使用正确的选项并行地停止和启动各个段实例和主实例。

gpstart, gpstop

pg_resetxlog

不使用

警告:此程序可能会导致数据丢失或导致数据不可用。如果使用此程序,则不支持Pivotal Greenplum数据库群集。该 群集必须重新初始化并恢复由客户。

不适用

Postgres

的 Postgres 可执行文件是处理查询的实际PostgreSQL服务器进程。

主要的 Postgres 流程(邮件管理员)创建其他 Postgres 子流程和 Postgres 会话以处理客户端连接。

postmaster

postmaster 开始 Postgres 接受客户端连接的数据库服务器侦听器进程。在Greenplum数据库中,Postgres 数据库侦听器进程在Greenplum主实例和每个细分实例上运行。

在Greenplum数据库中,您使用 gpstart 和 gpstop 启动所有postmaster(Postgres 系统以正确的顺序和正确的选项立即进行处理)。

13、GP常用管理命令

  • 启动
    gpstart
  • 停止
    gpstop
    gpstop -M fast
  • 重启
    gpstop -r
  • 重新加载配置文件
    gpstop -u
  • 以维护模式启动master
    只启动Master来执行维护或者管理任务而不影响Segment上的数据。
    例如,可以用维护模式连接到一个只在Master实例上的数据库并且编辑系统目录设置。 更多有关系统目录表的信息请见Greenplum Database Reference Guide
    gpstart -m #维护模式打开数据库
    PGOPTIONS=’-c gp_session_role=utility’ psql postgres #以维护模式连接到master
    gpstop -mr #停止维护模式,以正常模式重启数据库
  • 查看gp配置参数
    psql -c ‘show all’
    或者
    gpconfig -s <参数名>
  • 修改gp参数
    设置max_connections,在master上设置为10, 在segment上设置为100
    gpconfig -c max_connections -v 100 -m 10
    -v指定所有节点,包括master,standby,segment
    -m指定master节点
    –master-only指定只修改master节点
    -r移除参数的配置
    -l显示所有可配置的参数
  • 查看gp状态
    gpstate #查看简要信息
    gpstate -s #查看详细信息
    gpstate -m #查看镜像配置
    gpstate -c #查看镜像的映射关系
    gpstate -f #查看standby状态
  • 查看磁盘空间
    查看节点主机磁盘空闲空间
SELECT * FROM gp_toolkit.gp_disk_free 
   ORDER BY dfsegment;
  • 查看数据库的使用空间
SELECT * FROM gp_toolkit.gp_size_of_database 
ORDER BY sodddatname;
  • 查看表的磁盘使用空间
SELECT relname AS name, sotdsize AS size, sotdtoastsize 
   AS toast, sotdadditionalsize AS other 
   FROM gp_toolkit.gp_size_of_table_disk as sotd, pg_class 
   WHERE sotd.sotdoid=pg_class.oid ORDER BY relname
  • 查看索引的使用空间
SELECT soisize, relname as indexname
   FROM pg_class, gp_toolkit.gp_size_of_index
   WHERE pg_class.oid=gp_size_of_index.soioid 
   AND pg_class.relkind='i';
  • 查看表的分布键
\d+ table_name
  • 查看表的数据分布
SELECT gp_segment_id, count(*) 
   FROM table_name GROUP BY gp_segment_id;
  • 查看当前正在运行的会话
select pid,usename,datname,waiting_reason,query,client_addr from pg_stat_activity where state='active';
  • 查看当前等待的会话
select pid,usename,datname,query,client_addr,waiting_reason from pg_stat_activity where waiting ;
  • 杀死会话
    使用pg_terminate_backend()或者pg_cancel_backend()指定PID进行kill,例如:
select pg_cancel_backedn(111);

可以使用下面的批量kill脚本

select pg_terminate_backend(pid) from pg_stat_activity where ;   -- 必须要接条件,而且最好先查出你需要的杀的会话.
select 'select pg_terminate_backend('||pid||');' from pg_stat_activity where    ;   --必须要接条件
select 'select pg_cancel_backend('||pid||');' from pg_stat_activity where    ;   --

14、GP建库、建表空间、建表等操作命令

一 创建文件空间

1 创建目录

gpssh -f /home/all_segs -e 'mkdir /data/primary/gpfilep1'

gpssh -f /home/all_segs -e 'mkdir /data/primary/gpfilep2'

gpssh -f /home/all_segs -e 'mkdir /data/mirror/gpfilem1'

gpssh -f /home/all_segs -e 'mkdir /data/mirror/gpfilem2'

gpssh -h mdw -h smdw -e 'mkdir /data/master/gpmaster'

2 规划

文件空间名称 :myfilespace

/data/primary/gpfilep1

/data/primary/gpfilep2

/data/mirror/gpfilem1

/data/mirror/gpfilem2

/data/master/gpmaster

3 生成空间配置文件

gpfilespace -o gpfilespace_config

20210122:16:06:17:020904 gpfilespace:mdw:gpadmin-[INFO]:-

A tablespace requires a file system location to store its database

files. A filespace is a collection of file system locations for all components

in a Greenplum system (primary segment, mirror segment and master instances).

Once a filespace is created, it can be used by one or more tablespaces.

20210122:16:06:17:020904 gpfilespace:mdw:gpadmin-[INFO]:-getting config

Enter a name for this filespace

> myfilespace

Checking your configuration:

Your system has 3 hosts with 2 primary and 2 mirror segments per host.

Your system has 2 hosts with 0 primary and 0 mirror segments per host.

Configuring hosts: [sdw1, sdw2, sdw3]

Please specify 2 locations for the primary segments, one per line:

primary location 1> /data/primary/gpfilep1

primary location 2> /data/primary/gpfilep2

Please specify 2 locations for the mirror segments, one per line:

mirror location 1> /data/mirror/gpfilem1

mirror location 2> /data/mirror/gpfilem2

Configuring hosts: [smdw, mdw]

Enter a file system location for the master

master location> /data/master/gpmaster

20210122:16:27:45:020904 gpfilespace:mdw:gpadmin-[INFO]:-Creating configuration file...

20210122:16:27:45:020904 gpfilespace:mdw:gpadmin-[INFO]:-[created]

20210122:16:27:45:020904 gpfilespace:mdw:gpadmin-[INFO]:-

To add this filespace to the database please run the command:

   gpfilespace --config /tmp/gpcopy-2.3.0/gpfilespace_config

4 执行创建文件空间命令  

gpfilespace --config /tmp/gpcopy-2.3.0/gpfilespace_config

生成的文件gpfilespace_config内容如下:

filespace:myfilespace

mdw:1:/data/master/gpmaster/gpseg-1

smdw:14:/data/master/gpmaster/gpseg-1

sdw1:2:/data/primary/gpfilep1/gpseg0

sdw1:3:/data/primary/gpfilep2/gpseg1

sdw1:11:/data/mirror/gpfilem1/gpseg3

sdw1:12:/data/mirror/gpfilem2/gpseg4

sdw2:4:/data/primary/gpfilep1/gpseg2

sdw2:5:/data/primary/gpfilep2/gpseg3

sdw2:8:/data/mirror/gpfilem1/gpseg0

sdw2:13:/data/mirror/gpfilem2/gpseg5

sdw3:6:/data/primary/gpfilep1/gpseg4

sdw3:7:/data/primary/gpfilep2/gpseg5

sdw3:9:/data/mirror/gpfilem1/gpseg1

sdw3:10:/data/mirror/gpfilem2/gpseg2

--登录数据库

su - gpadmin

psql

--创建数据表空间

CREATE TABLESPACE myspace FILESPACE myfilespace;

--创建数据库并指定表空间

create database mydb tablespace myspace;

--登录数据库

\c mydb

--显示当前数据库编码

\encoding

--创建普通用户

create role dbdream password 'dbdream' createdb login;

--使用户默认就使用新建的表空间作为默认表空间

alter role dbdream set default_tablespace='myspace';

--授权给普通的数据库用户GRANT CREATE命令

GRANT CREATE ON TABLESPACE myspace TO dbdream;

--创建特权账户

create role admin superuser password 'dbdream' createdb login;

--为CREATE TABLE 和CREATE INDEX命令设定默认的表空间

SET default_tablespace = myspace;

--通过pg_roles字典开查看数据库的用户信息。

select rolname,oid,rolconfig from pg_roles;

--使用普通用户登录

\q

psql -h 127.0.0.1 -d mydb -U dbdream

--创建表

create table t_test(id int,name varchar(10)) DISTRIBUTED BY(id);

--插入数据

insert into t_test values(1,'tom'),(2,'jack'),(3,'Bob');

--验证索引对执行计划影响

--创建索引

create index myindex  on t_test(id);

CREATE INDEX

mydb=> explain select * from t_test;

                                  QUERY PLAN                                 

------------------------------------------------------------------------------

 Gather Motion 6:1  (slice1; segments: 6)  (cost=0.00..431.00 rows=3 width=8)

   ->  Table Scan on t_test  (cost=0.00..431.00 rows=1 width=8)

 Optimizer status: PQO version 3.114.0

(3 rows)

--创建索引后的执行计划

explain select * from t_test where id =1;

                                 QUERY PLAN                                

----------------------------------------------------------------------------

 Gather Motion 1:1  (slice1; segments: 1)  (cost=0.00..6.00 rows=1 width=8)

   ->  Index Scan using myindex on t_test  (cost=0.00..6.00 rows=1 width=8)

         Index Cond: id = 1

 Optimizer status: PQO version 3.114.0

(4 rows)

--删除索引

drop index myindex;

DROP INDEX

--删除索引后的执行计划

explain select * from t_test where id =1;

                                  QUERY PLAN                                 

------------------------------------------------------------------------------

 Gather Motion 1:1  (slice1; segments: 1)  (cost=0.00..431.00 rows=1 width=8)

   ->  Table Scan on t_test  (cost=0.00..431.00 rows=1 width=8)

         Filter: id = 1

 Optimizer status: PQO version 3.114.0

(4 rows)

--查看表空间情况

SELECT spcname as tblspc, fsname as filespc,

fsedbid as seg_dbid, fselocation as datadir

FROM pg_tablespace pgts, pg_filespace pgfs,

pg_filespace_entry pgfse

WHERE pgts.spcfsoid=pgfse.fsefsoid

AND pgfse.fsefsoid=pgfs.oid

ORDER BY tblspc, seg_dbid;

--查看数据库和用户角色

select datname,datdba,dattablespace from pg_database;

select rolname,oid from pg_roles;

datdba字段表示的是数据库的所有者(创建者),这里存的是用户的oid,10是gpadmin用户,17446是dbdream用户,

--删除表空间和文件空间

--删除之前检查确认tablespace必须为空

select * from pg_tables where tablespace = 'myspace';

--删除数据表空间

DROP TABLESPACE myspace

--删除对应的文件表空间

DROP FILESPACE myfilespace

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

力哥讲技术

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

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

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

打赏作者

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

抵扣说明:

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

余额充值