rsync服务的三种模式测试[通俗易懂]

2022-11-08 11:33:35 浏览数 (3)

大家好,又见面了,我是你们的朋友全栈君。

文章目录

  • 1 什么是rsync
    • 1.1 rsync简介
    • 1.2 rsync特性
    • 1.3 rsync的企业工作场景说明
  • 2 rsync三种模式:
    • 2.1 rsync 常用参数选项
    • 2.2 rsync 本地模式
    • 2.3 rsync shell模式
    • 2.4 rsync daemon模式
  • 3 rsync服务故障模拟
  • 4 rsync多模块实战
  • 5 rsync排除及无差异同步实战
  • 6 rsync优缺点
    • 6.1 优点
    • 6.2 缺点
  • 7 rsync小总结

1 什么是rsync

Rsync是一款开源的、快速的、多功能的、可实现全量及增量(全量备份是指全部备份,增量备份是在上一次备份的基础上只备份更新的内容)的本地货远程数据同步备份的优秀工具。Rsync软件适用于unix/linux/windows等多种操作系统平台。

官网:http://www.samba.org/ftp/rsync/rsync.html

1.1 rsync简介

Rsync英文全称为Remote synchronization,从软件的名称就可以看出来,Rsync具有可使本地和远程两台主机之间的数据快速复制同步镜像、远程备份的功能,这个功能类似ssh带的scp命令,但又优于scp命令的功能,scp每次都是全量拷贝,而rsync可以增量拷贝。当然,Rsync还可以在本地主机的不同分区或目录之间全量及增量的复制数据,这又类似cp命令,但同样也优于cp命令,cp每次都是全量拷贝,而rsync可以增量拷贝。

利用Rsync还可以实现删除文件和目录的功能,这又相当于rm命令!

一个rsync相当于scp,cp,rm,但是还优于他们每一个命令。

在同步备份数据时,默认情况下,Rsync通过其独特的“quick check’算法,它仅同步大小或者最后修改时间发生变化的文件或目录,当然也可根据权限,属主等属性的变化同步,但需要指定相应的参数,甚至可以实现只同步一个文件里有变化的内容部分,所以,可以实现快速的同步备份数据。

提示:传统的cp,scp工具拷贝每次均为完整的拷贝,而rsync除了可以完整拷贝外,还具备增量拷贝的功能,因此,从同步数据的性能及效率上,Rsync更胜一筹。

CentOS5,rsync2.x 比对方法,把所有的文件比对一遍,然后进行同步。

CentOS6,rysnc3.x 比对方法,一边比对差异,一边对差异的部分进行同步。

rsync –version可以查看当前安装rsync的版本

1.2 rsync特性

  • 支持拷贝特殊文件如链接文件、设备等
  • 可以有排除指定文件或目录同步的功能,相当于tar的排除功能
  • 可以做到保持原文件或目录的权限、时间、软硬链接、属主、组等所有属性均不改变-p
  • 可以实现增量同步,即指同步发生变化的数据,因此数据传输效率很高,tar -N
  • 可以使用rcp,rsh,ssh等方式来配合传输文件(rsync本身不对数据加密)
  • 可以通过socket(进程方式)传输文件和数据(服务端和客户端)*****。
  • 支持匿名的或认证(无须系统用户)的进程模式传输,可实现方便安全的进行数据备份及镜像

1.3 rsync的企业工作场景说明

全网服务器数据备份解决方案提出及负责实施

  1. 针对公司重要数据备份混乱状况对领导提出备份全网数据的解决方案。
  2. 通过本地打包备份,然后rsync结合inotify应用把全网数据统一备份到一个固定存储服务器,然后在存储服务器上通过脚本检查并报警管理员备份结果
  3. 定期将IDC机房的数据备份公司的内部服务器,防止机房地震及火灾等特殊情况导致数据丢失。

2 rsync三种模式:

代码语言:javascript复制
1、Local: rsync [OPTION...] SRC... [DEST]

2、Access via remote shell:
Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST]
Push: rsync [OPTION...] SRC... [USER@]HOST:DEST

3、Access via rsync daemon:
Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
Push: rsync [OPTION...] SRC... [USER@]HOST::DEST
rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST

2.1 rsync 常用参数选项

参数

含义

-v,–verbose

详细模式输出,传输时的进度等信息

-z,–compress

传输时进行压缩以提高传输效率,–compress-level=NUM可按级别压缩

-a,–archive

归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rtopgDl

-r,–recursive

对子目录以递归模式,即目录下的所有目录都同样传输,注意是小写r

-t,–times

保持文件时间信息

-o,–owner

保持文件属主信息

-p,-perms

保持文件权限

-g,–group

保持稳健属组信息

-P,–progress

显示同步的过程及传输时的进度等信息

-D,–devices

保持设备文件信息

-l,–links

保留软链接

-e,–rsh=COMMAND

使用的信道协议,指定替代rsh的shell程序。 例如:ssh –exclude=PATTERN指定排除不需要传输的文件模式(和tar参数一样) –exclude-from=file(文件名所在目录文件,和tar参数一样) –bwlimit=RATE limit socket I/O bandwidth (案例:某DBA做数据同步,导致用户无法访问网站) rsync、scp、ftp都有限速的功能

注意:备份的时候尽量在晚上或者选择业务并发访问小的时候,考虑是否限速

2.2 rsync 本地模式

代码语言:javascript复制
[root@backup ~]# cp /etc/hosts /tmp/
[root@backup ~]# rsync /etc/hosts /mnt/hosts
[root@backup ~]# cat /mnt/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6

rsync也可以保持属性拷贝

写定时任务的时候可以把-v参数去掉,不输出信息

代码语言:javascript复制
[root@backup ~]# rsync -vzrtopg /etc/hosts /var
sending incremental file list
hosts
sent 124 bytes received 31 bytes 310.00 bytes/sec
total size is 158 speedup is 1.02
[root@backup ~]# cat /var/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6

rsync保持对端目录和当前目录一致

代码语言:javascript复制
[root@backup ~]# ls /mnt/
hosts
[root@backup ~]# mkdir /tmp1
[root@backup ~]# rsync -avz --delete /tmp1/ /mnt/
sending incremental file list
./
deleting hosts
sent 29 bytes received 15 bytes 88.00 bytes/sec
total size is 0 speedup is 0.00
[root@backup ~]# ll /mnt/
总用量 0

说明:

代码语言:javascript复制
rsync -az /tmp1/ /mnt/
# 若/tmp1后边不加斜线,则会将tmp1目录给及目录内容拷贝过去
# 若/tmp1/ 后边加了斜线,则会将tmp1目录下的内容给拷贝过去,而不会拷贝tmp1目录

2.3 rsync shell模式

代码语言:javascript复制
[root@backup ~]# rsync -avz /etc/hosts -e 'ssh -p 22' root@192.168.90.31:/mnt
The authenticity of host '192.168.90.31 (192.168.90.31)' can't be established.
RSA key fingerprint is f1:16:60:e0:a2:3c:40:44:0b:3d:dd:54:52:7e:45:55.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.90.31' (RSA) to the list of known hosts.
Nasty PTR record "192.168.90.31" is set up for 192.168.90.31, ignoring
root@192.168.90.31's password:
sending incremental file list
hosts
sent 124 bytes received 31 bytes 28.18 bytes/sec
total size is 158 speedup is 1.02
[root@nfs01 ~]# ls /mnt/
hosts

调整ssh配置文件,可以关闭ssh访问时提示信息的出现,加快访问速度

代码语言:javascript复制
#vim /etc/ssh/ssh_config 把下面两行注释去掉
GSSAPIAuthentication no
GSSAPITrustDNS no

保存退出,重启sshd服务,再次测试

代码语言:javascript复制
[root@backup ~]# rsync -avz /etc/hosts -e 'ssh -p 22' root@192.168.90.31:/mnt
root@192.168.90.31's password:
sending incremental file list
sent 30 bytes received 12 bytes 12.00 bytes/sec
total size is 158 speedup is 3.76

2.4 rsync daemon模式

daemon模式是以守护进程(socket)的方式传输数据(熟练掌握部署服务) 把daemon搭载备份服务器上,客户端直接推送到备份服务器上就行

配置服务器端backup

手动创建rsync配置文件/etc/rsyncd.conf(默认是不存在的)

代码语言:javascript复制
#vim /etc/rsyncd.conf
#rsync_config_________________start
#created by rsq
##rsyncd.conf start##

uid = rsync #用户 远端的命令使用rsync访问共享目录
gid = rsync #用户组
use chroot = no #安全相关,目前了解即可
max connections = 200 #最大连接数
timeout = 300 #超时时间
pid file = /var/run/rsyncd.pid #进程对应的进程号文件
lock file = /var/run/rsync.lock #锁文件
log file = /var/log/rsyncd.log #日志文件 出错

[backup] #模块名称
path = /backup/ #服务器提供访问的目录
ignore errors #忽略错误
read only = false #可写
list = false #不能列表
hosts allow = 192.168.90.0/24 #允许哪些机器可以连
#host deny = 0.0.0.0/32
#拒绝哪些机器连,四个0表示谁都可以过来,allow之间最好只留一个
auth users = rsync_backup #虚拟用户,独立于系统用户之外的虚拟用户
secrets file = /etc/rsync.password #虚拟账号里面对应的用户和密码
#rsync_config_________________end

手动创建所需要的用户和目录文件

代码语言:javascript复制
[root@backup ~]# useradd rsync -s /sbin/nologin -M
rsync:x:501:501::/home/rsync:/sbin/nologin
[root@backup ~]# tail -1 /etc/passwd
rsync:x:501:501::/home/rsync:/sbin/nologin

启动服务

代码语言:javascript复制
[root@backup ~]# rsync --daemon
[root@backup ~]# ps -ef | grep rsync | grep -v grep
root 5970 1 0 22:34 ? 00:00:00 rsync --daemon

创建backup目录并修改属主和属组

代码语言:javascript复制
[root@backup ~]# mkdir /backup
[root@backup ~]# chown rsync.rsync /backup/
[root@backup ~]# ll -d /backup/
drwxr-xr-x. 2 rsync rsync 4096 1月 24 22:35 /backup/

编辑虚拟用户账号密码文件并修改文件权限位600

代码语言:javascript复制
[root@backup ~]# vim /etc/rsync.password
rsync_backup:123456	
[root@backup ~]# chmod 600 /etc/rsync.password	
[root@backup ~]# ls -l /etc/rsync.password	
-rw-------. 1 root root 20 1月 24 22:43 /etc/rsync.password	
[root@backup ~]# lsof -i :873	
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME	
rsync 5970 root 4u IPv4 29607 0t0 TCP *:rsync (LISTEN)	
rsync 5970 root 5u IPv6 29608 0t0 TCP *:rsync (LISTEN)

加入开机自启动

代码语言:javascript复制
[root@backup ~]# echo "/usr/bin/rsync --daemon" >>/etc/rc.local	
[root@backup ~]# tail -1 /etc/rc.local	
/usr/bin/rsync --daemon

配置客户端Client

先检查是否装有rsync服务,没有的话yum安装一下

代码语言:javascript复制
[root@nfs01 ~]# rpm -qa | grep rsync	
rsync-3.0.6-12.el6.x86_64

创建虚拟用户密码文件,只需要添加密码即可

代码语言:javascript复制
#vim /etc/rsync.password	
123456

修改密码文件权限位600

代码语言:javascript复制
[root@nfs01 ~]# chmod 600 /etc/rsync.password	
[root@nfs01 ~]# ls -l /etc/rsync.password	
-rw-------. 1 root root 7 1月 24 23:06 /etc/rsync.password

创建客户端临时备份目录

代码语言:javascript复制
[root@nfs01 ~]# mkdir -p /backup	
[root@nfs01 ~]# cd /backup	
[root@nfs01 backup]# touch stu{01..100}	
[root@nfs01 backup]# ls	
stu001 stu011 stu021 stu031 stu041 stu051 stu061 stu071 stu081 stu091	
stu002 stu012 stu022 stu032 stu042 stu052 stu062 stu072 stu082 stu092	
...

客户端测试,把本地/backup目录下的文件推送到备份服务器上的/backup目录下

法一:

代码语言:javascript复制
[root@nfs01 backup]# rsync -avz /backup/ rsync_backup@192.168.90.41::backup/ --password-file=/etc/rsync.password
#配置文件模块名[backup]
sending incremental file list
./	
stu001	
stu002	
stu003	
stu004	
......	
stu098	
stu099
stu100
sent 4427 bytes received 1911 bytes 12676.00 bytes/sec	
total size is 0 speedup is 0.00 

没出现errors即成功

去服务器端查看客户端是否备份成功

代码语言:javascript复制
[root@backup ~]# ls /backup/	
stu001 stu011 stu021 stu031 stu041 stu051 stu061 stu071 stu081 stu091	
stu002 stu012 stu022 stu032 stu042 stu052 stu062 stu072 stu082 stu092
...

法二:

先删除备份服务器/backup目录下内容

代码语言:javascript复制
[root@backup ~]# rm -f /backup/*
[root@backup ~]# ls /backup/

rsync传输文件

代码语言:javascript复制
[root@nfs01 ~]# rsync -avz /backup/ rsync://rsync_backup@192.168.90.41/backup/--password-file=/etc/rsync.password
sending incremental file list
./	
stu001	
stu002	
stu003	
stu004	
......	
stu098	
stu099	
stu100	
sent 4427 bytes received 1911 bytes 12676.00 bytes/sec	
total size is 0 speedup is 0.00

去备份服务器上查看是否有东西备份成功

代码语言:javascript复制
[root@backup ~]# ls /backup/	
stu001 stu011 stu021 stu031 stu041 stu051 stu061 stu071 stu081 stu091	
stu002 stu012 stu022 stu032 stu042 stu052 stu062 stu072 stu082 stu092
...

若修改为完配置文件后尽量重启(测试是好像不重启也可以生效)

代码语言:javascript复制
[root@backup ~]# pkill rsync
[root@backup ~]# lsof -i :873	
[root@backup ~]# rsync --daemon	
[root@backup ~]# netstat -lntup |grep 873	
tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 6884/rsync	
tcp 0 0 :::873 :::* LISTEN

3 rsync服务故障模拟

把服务器端的目录给删除,客户端在备份的时候会出现以下错误,创建目录即可

代码语言:javascript复制
[root@nfs01 ~]# rsync -avz /backup/ rsync://rsync_backup@192.168.90.41/backup/ --password-file=/etc/rsync.password
@ERROR: chdir failed
rsync error: error starting client-server protocol (code 5) at main.c(1503)
[sender=3.0.6]

创建完之后客户端在备份的时候会出现以下错误,提示权限不够,修改目录属主和属组都为rsync即可

代码语言:javascript复制
[root@nfs01 ~]# rsync -avz /backup/ rsync://rsync_backup@192.168.90.41/backup/ --password-file=/etc/rsync.password	
sending incremental file list	
./	
rsync: failed to set times on "." (in backup): Operation not permitted (1)	
......	
rsync: mkstemp ".stu099.gP8pYC" (in backup) failed: Permission denied (13)	
rsync: mkstemp ".stu100.7ucTza" (in backup) failed: Permission denied (13)	
sent 4427 bytes received 1911 bytes 12676.00 bytes/sec	
total size is 0 speedup is 0.00	
rsync error: some files/attrs were not transferred (see previous errors) (code
23) at main.c(1039) [sender=3.0.6]	
[root@backup ~]# chown rsync.rsync -R /backup/	
[root@backup ~]# ll -d /backup/	
drwxr-xr-x. 2 rsync rsync 4096 1月 25 04:24 /backup/

删除服务端用户rsync,客户端在备份的时候会出现以下错误,创建用户即可

代码语言:javascript复制
useradd rsync -s /sbin/nologin -M	
[root@nfs01 ~]# rsync -avz /backup/ rsync://rsync_backup@192.168.90.41/backup/ --password-file=/etc/rsync.password	
@ERROR: invalid uid rsync	
rsync error: error starting client-server protocol (code 5) at main.c(1503)
[sender=3.0.6]

模拟客户端错误,修改/etc/rsync.password配置文件,在第一行后边追加一个空格,再测试会有以下错误

代码语言:javascript复制
[root@nfs01 ~]# rsync -avz /backup/ rsync://rsync_backup@192.168.90.41/backup/ --password-file=/etc/rsync.password	
@ERROR: auth failed on module backup	
rsync error: error starting client-server protocol (code 5) at main.c(1503)
[sender=3.0.6]

排错必备思想:

  1. 部署流程步骤熟练
  2. rsync原理理解
  3. 学会看日志,rsync命令行输出,日志文件/var/log/rsyncd.log

rsync服务端排错思路:

  1. 查看rsync服务配置文件路径是否正确,正确的默认路径为:/etc/rsyncd.conf
  2. 查看配置文件里host allow,host deny,允许的ip网段是否是允许客户端访问的ip网段。
  3. 查看配置文件中path参数里的路径是否存在,权限是否正确(正常应为配置文件中的UID参数对应的属主和组)。
  4. 查看rsync服务是否启动(是否有监听端口)。查看进程命令为(ps -ef|grep rsync)端口是存在(netstat -lntup|grep 873)
  5. 查看iptables防火墙和selinux是否开启允许rsync服务通过,也可考虑关闭。
  6. 查看服务端rsync配置的密码文件是否为600的权限,密码文件格式是否正确,正确格式 用户名:密码 ,文件路径和配置文件里的secrect files参数对应。
  7. 如果是推送数据,要查看下,配置rsyncd.conf文件中用户是否对模块下目录有可读写的权限。

rsync客户端排错思路:

  1. 查看客户端rsync配置的密码文件是否为600的权限,密码文件格式是否正确,注意:仅需要有密码,并且和服务端的密码一致。
  2. 用telnet连接rsync服务器ip地址873端口,查看服务是否启动(可测试服务端防火墙是否阻挡)。 telnet 192.168.90.41
  3. 客户端执行命令时: rsync -avzP rsync_backup@192.168.90.41::backup/test /test/ --password-file=/etc/rsync.password 此命令的细节要记清楚,尤其是192.168.90.41::backup/test/处的双冒号和其后的backup为配置文件中定义的模块名称。 可以自我模拟错误,增长经验。

4 rsync多模块实战

代码语言:javascript复制
[root@backup ~]# cp /etc/rsyncd.conf{,.bak} #配置文件做备份	
[root@backup ~]# vim rsyncd.conf #追加以下内容	
[oldboy]	
path = /oldboy	
ignore errors	
read only = false	
list = false	
hosts allow = 192.168.90.0/24	
#host deny = 0.0.0.0/32	
#auth users = rsync_backup	
#secrets file = /etc/rsync.password	
[root@backup ~]# mkdir /oldboy	
[root@backup ~]# chown -R rsync.rsync /oldboy/

客户端测试

代码语言:javascript复制
[root@nfs01 ~]# rsync -avz /backup/ rsync://rsync_backup@192.168.90.41/oldboy/ --password-file=/etc/rsync.password	
[root@backup ~]# ls /oldboy/	
stu001 stu011 stu021 stu031 stu041 stu051 stu061 stu071 stu081 stu091	
stu002 stu012 stu022 stu032 stu042 stu052 stu062 stu072 stu082 stu092
...

工作中多模块使用可以修改服务器配置文件如下,方便:

代码语言:javascript复制
#rsync_config_________________start	
#created by rsq	
##rsyncd.conf start##	
uid = rsync	
gid = rsync	
use chroot = no	
max connections = 200	
timeout = 300	
pid file = /var/run/rsyncd.pid	
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log	
ignore errors	
read only = false	
list = false	
hosts allow = 192.168.90.0/24	
host deny = 0.0.0.0/32	
auth users = rsync_backup	
secrets file = /etc/rsync.password	
[backup] #模块1	
path = /backup/	
[oldboy] #模块2	
path = /oldboy	
#rsync_config_________________end

5 rsync排除及无差异同步实战

客户端测试从备份服务器上拉取备份内容

备份服务器上

代码语言:javascript复制
[root@backup backup]# ll	
总用量 0	
[root@backup backup]# touch {a..e}	
[root@backup backup]# ls	
a b c d e

客户端上

代码语言:javascript复制
[root@nfs01 ~]# rsync -avz rsync_backup@192.168.90.41::backup/ /backup/ --password-file=/etc/rsync.password	
receiving incremental file list	
./	
a	
b	
c	
d	
e	
sent 162 bytes received 328 bytes 980.00 bytes/sec	
total size is 0 speedup is 0.00	
#排除单个文件

服务器端删除/backup目录下的所有内容,由客户端推送

代码语言:javascript复制
[root@backup backup]# ls	
a b c d e	
[root@backup backup]# rm -f ./*	
[root@backup backup]# ls

客户端推送当前/backup文件下内容,可以排除某个文件( – -exclude=)

代码语言:javascript复制
[root@nfs01~]# ls /backup	
a b c d e	
[root@nfs01 ~]# rsync -avz --exclude=a /backup/ rsync_backup@192.168.90.41::backup/ --password-file=/etc/rsync.password	
sending incremental file list	
./	
b	
c	
d	
e	
sent 205 bytes received 87 bytes 194.67 bytes/sec	
total size is 0 speedup is 0.00

服务器端查看,可以发现除了a文件外都推送过来了

代码语言:javascript复制
[root@backup backup]# ls	
b c d e

排除多个文件

代码语言:javascript复制
rsync -avz --exclude={a,b} /backup/ rsync_backup@192.168.90.41::backup/ --password-file=/etc/rsync.password	
rsync -avz --exclude=a --exclude=b /backup/ rsync_backup@192.168.90.41::backup/ --password-file=/etc/rsync.password	
rsync -avz --exclude={a..e} /backup/ rsync_backup@192.168.90.41::backup/ --password-file=/etc/rsync.password

文件排除

代码语言:javascript复制
rsync -avz --exclude={a..e} /backup/ rsync_backup@192.168.90.41::backup/ --password-file=/etc/rsync.password

也可以在服务端排除修改配置文件参数(服务端排除不灵活)

代码语言:javascript复制
exclude = a b c d

无差异同步(有缺点,若目标目录下有其它内容会把多余的内容给删除掉,及无差异同步)

代码语言:javascript复制
rsync -avz --delete /backup/ rsync_backup@192.168.90.41::backup/ --password-file=/etc/rsync.password

6 rsync优缺点

6.1 优点

  1. 增量备份、支持socket(daemon),集中备份(支持推拉,都是以客户端为参照物)。
  2. 远程SHELL通道模式还可以加密(SSH)传输,socket(daemon)需要加密传输,可以利用vpn服务或ipsec服务。

6.2 缺点

  1. 大量小文件同步的时候,比对时间较长,有的时候,rsync进程有可能会停止。
  2. 同步大文件,如10G这样的大文件有时候也会有中断问题。未完整同步前,是隐藏文件,可以通过续传等参数实现传输。
  3. 一次性远程拷贝可以使用scp。

7 rsync小总结

1、local:rsync(cp、rm)

2、通道模式

代码语言:javascript复制
rsync -avzP -e 'ssh -p 22' /etc root@192.168.90.41:/tmp
一般配合ssh-key免密钥使用,可结合定时任务使用

3、daemon模式

内网不需要,加密性能有损失 若跨机房使用备份,即跨内网,建议使用rsync vpn(pptp,openvpn、ipsec)

4、rsync相关参考资料

http://rsync.samba.org/ 客户端命令帮助 man rsync 服务端配置帮助 man rsyncd.conf http://www.samba.org/ftp/rsync/rsync.html http://www.samba.org/ftp/rsync/rsyncd.conf.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/182438.html原文链接:https://javaforall.cn

0 人点赞