redis包含三种集群策略
1 主从模式 Slave从节点服务启动并连接到Master之后,它将主动发送一个SYNC命令。Master服务主节点收到同步命令后将启动后台存盘进程,同时收集所有接收到的用于修改数据集的命令,在后台进程执行完毕后,Master将传送整个数据库文件到Slave,以完成一次完全同步。而Slave从节点服务在接收到数据库文件数据之后将其存盘并加载到内存中。此后,Master主节点继续将所有已经收集到的修改命令,和新的修改命令依次传送给Slaves,Slave将在本次执行这些数据修改命令,从而达到最终的数据同步。
如果Master和Slave之间的链接出现断连现象,Slave可以自动重连Master,但是在连接成功之后,一次完全同步将被自动执行。
主从配置示例(采用一主一从)
准备:
redis的bin目录:/usr/local/redis/bin
redis的bin目录结构:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 [root@izbp12c0zpe8t4yri0xphiz bin]# ll total 21916 -rw-r--r-- 1 root root 0 Jan 8 13 :34 appendonly.aof -rw-r--r-- 1 root root 93 Dec 28 15 :08 dump.rdb -rw-r--r-- 1 root root 114 Jan 8 13 :34 nodes_7000.conf -rw-r--r-- 1 root root 114 Jan 8 13 :35 nodes_7001.conf -rw-r--r-- 1 root root 114 Jan 8 13 :36 nodes_7002.conf -rwxr-xr-x 1 root root 2451640 Dec 27 21 :55 redis-benchmark -rwxr-xr-x 1 root root 5775928 Dec 27 21 :55 redis-check-aof -rwxr-xr-x 1 root root 5775928 Dec 27 21 :55 redis-check-rdb -rwxr-xr-x 1 root root 2617720 Dec 27 21 :55 redis-cli drwxr-xr-x 5 root root 4096 Jan 8 11 :48 redis_cluster -rw-r--r-- 1 root root 33 Dec 28 15 :00 redis.conf lrwxrwxrwx 1 root root 12 Dec 27 21 :55 redis-sentinel -> redis-server -rwxr-xr-x 1 root root 5775928 Dec 27 21 :55 redis-server
1.1 主节点配置 redis提供给我们了一个默认的配置文件redis.conf 把它复制到/usr/local/redis/conf
目录下,并改名为6379.conf
1 cp redis.conf /usr/local/redis/bin/conf/6379. conf
修改如下配置:
1 2 3 4 5 6 7 8 daemonize no 修改为: daemonize yes (后台程序方式运行) pidfile /var /run/redis_6379.pid 修改为: pidfile /usr/local/redis/bin/redis_6379.pid (把pidfile生成到有权限的目录下)
1.2 从节点配置
修改6380.conf 修改对应的端口和pid配置 然后加入slaveof 127.0.0.1 6379
1 2 3 4 5 6 7 8 9 10 port 6379 修改为: port 6380 pidfile /usr/local/redis/redis_6379.pid 修改为: pidfile /usr/local/redis/redis_6380.pid 增加一行: slaveof 127.0 .0.1 6379
如果master设置了密码。需要配置:
1.3 启动服务及查看 启动:
1 2 ./redis-server /usr/local/redis/bin/conf/6379. conf ./redis-server /usr/local/redis/bin/conf/6380. conf
查看服务:
1 2 3 4 [root@izbp12c0zpe8t4yri0xphiz bin]# ps -ef | grep redis root 14366 1 0 13 :57 ? 00 :00 :00 ./redis-server *:6379 root 14367 1 0 13 :57 ? 00 :00 :00 ./redis-server *:6380 root 14377 14126 0 13 :57 pts/1 00 :00 :00 grep --color=auto redis
1.4 启动客户端 连接6379那个实例
1 2 cd /usr/local/redis/bin/ ./redis-cli -h 127.0 .0.1 -p 6379
查看服务信息:
1 2 3 info replication NOAUTH Authentication required. auth "redis" # 密码验证
1 2 3 role:master # 本机是『主』 connected_slaves:1 # 有1个『奴隶』 slave0:ip=127.0.0.1,port=6380,state=online,offset=11957,lag=1 # "从"服务器iP地址和端口是
新增 读取
1 2 3 4 127.0 .0.1 :6379 > set name zhangsanOK 127.0 .0.1 :6379 > get name"zhangsan"
连接6380那个实例
1 ./redis-cli -h 127.0 .0.1 -p 6380
读取 新增
1 2 3 4 127.0 .0.1 :6380 > get name"zhangsan" 127.0 .0.1 :6380 > set name lisi(error) READONLY You can't write against a read only slave.
2 哨兵模式 2.1 添加sentinel.conf配置文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 #sentinel端口 port 26379 #工作路径,注意路径不要和主重复 dir "/usr/local/redis-6379" # 守护进程模式 daemonize yes #关闭保护模式 protected -mode no# 指明日志文件名 logfile "./sentinel.log" #哨兵监控的master,主从配置一样,这里只用输入redis主节点的ip/port和法定人数。 sentinel monitor mymaster 192.168 .125.128 6379 1 # master或slave多长时间(默认30秒)不能使用后标记为s_down状态。 sentinel down-after-milliseconds mymaster 5000 #若sentinel在该配置值内未能完成failover操作(即故障时master/slave自动切换),则认为本次failover失败。 sentinel failover-timeout mymaster 18000 #设置master和slaves验证密码 sentinel auth-pass mymaster 123456 sentinel parallel-syncs mymaster 1
2.2 启动哨兵 1 2 方式一:redis-sentinel /path/to/sentinel.conf(推荐,这种方式启动和redis实例没有任何关系) 方式二:redis-server /path/to/sentinel.conf --sentinel
2.3 启动客户端查看集群信息 1 2 3 4 5 sentinel master mymaster SENTINEL slaves mymaster SENTINEL sentinels mymaster SENTINEL get-master-addr-by-name mymaster info sentinel
2.4 哨兵的作用 哨兵的作用是监控 redis系统的运行状况,他的功能如下:
监控主从数据库是否正常运行
master出现故障时,自动将slave转化为master
多哨兵配置的时候,哨兵之间也会自动监控
多个哨兵可以监控同一个redis
2.5 哨兵工作机制 哨兵进程启动时会读取配置文件的内容,通过sentinel monitor master-name ip port quorum查找到master的ip端口。一个哨兵可以监控多个master数据库,只需要提供多个该配置项即可。
同时配置文件还定义了与监控相关的参数,比如master多长时间无响应即即判定位为下线。
哨兵启动后,会与要监控的master建立俩条连接:
一条连接用来订阅master的sentinel :hello频道与获取其他监控该master的哨兵节点信息
另一条连接定期向master发送INFO等命令获取master本身的信息
与master建立连接后,哨兵会执行三个操作,这三个操作的发送频率都可以在配置文件中配置:
定期向master和slave发送INFO命令
定期向master个slave的sentinel:hello频道发送自己的信息
定期向master、slave和其他哨兵发送PING命令
这三个操作的意义非常重大,发送INFO命令可以获取当前数据库的相关信息从而实现新节点的自动发现。所以说哨兵只需要配置master数据库信息就可以自动发现其slave信息。获取到slave信息后,哨兵也会与slave建立俩条连接执行监控。通过INFO命令,哨兵可以获取主从数据库的最新信息,并进行相应的操作,比如角色变更等
当实现了自动发现slave和其他哨兵节点后,哨兵就可以通过定期发送PING命令定时监控这些数据库和节点有没有停止服务。发送频率可以配置,但是最长间隔时间为1s,可以通过sentinel down-after-milliseconds mymaster 600
设置。
如果被ping的数据库或者节点超时未回复,哨兵任务其主观下线。如果下线的是master,哨兵会向其他哨兵点发送命令询问他们是否也认为该master主观下线,如果达到一定数目(即配置文件中的quorum)投票,哨兵会认为该master已经客观下线,并选举领头的哨兵节点对主从系统发起故障恢复
如上文所说,哨兵认为master客观下线后,故障恢复的操作需要由选举的领头哨兵执行,选举采用Raft算法:
发现master下线的哨兵节点(我们称他为A)向每个哨兵发送命令,要求对方选自己为领头哨兵
如果目标哨兵节点没有选过其他人,则会同意选举A为领头哨兵
如果有超过一半的哨兵同意选举A为领头,则A当选
如果有多个哨兵节点同时参选领头,此时有可能存在一轮投票无竞选者胜出,此时每个参选的节点等待一个随机时间后再次发起参选请求,进行下一轮投票精选,直至选举出领头哨兵 选出领头哨兵后,领头者开始对进行故障恢复,从出现故障的master的从数据库中挑选一个来当选新的master,选择规则如下:
所有在线的slave中选择优先级最高的,优先级可以通过slave-priority配置
如果有多个最高优先级的slave,则选取复制偏移量最大(即复制越完整)的当选
如果以上条件都一样,选取id最小的slave
挑选出需要继任的slaver后,领头哨兵向该数据库发送命令使其升格为master,然后再向其他slave发送命令接受新的master,最后更新数据。将已经停止的旧的master更新为新的master的从数据库,使其恢复服务后以slave的身份继续运行。
3 集群模式 Redis 是一个开源的 key-value 存储系统,由于出众的性能,大部分互联网企业都用来做服务器端缓存。Redis 在3.0版本前只支持单实例模式,虽然支持主从模式、哨兵模式部署来解决单点故障,但是现在互联网企业动辄大几百G的数据,可完全是没法满足业务的需求,所以,Redis 在 3.0 版本以后就推出了集群模式。
Redis 集群采用了P2P的模式,完全去中心化。Redis 把所有的 Key 分成了 16384 个 slot,每个 Redis 实例负责其中一部分 slot 。集群中的所有信息(节点、端口、slot等),都通过节点之间定期的数据交换而更新。 Redis 客户端可以在任意一个 Redis 实例发出请求,如果所需数据不在该实例中,通过重定向命令引导客户端访问所需的实例。
Redis
集群提供了以下两个好处:
将数据自动切分split
到多个节点的能力。
当集群中的一部分节点失效或者无法进行通讯时, 仍然可以继续处理命令请求的能力。
3.0 集群原理
所有的redis
节点彼此互联(PING
-PONG
机制),内部使用二进制协议优化传输速度和带宽。
节点的fail
是通过集群中超过半数的节点检测失效时才生效。
客户端与redis
节点直连,不需要中间proxy
层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可。
redis-cluster
把所有的物理节点映射到[0-16383
]slot
上,cluster
负责维护node
<->slot
<->value
Redis
集群中内置了 16384
个哈希槽,当需要在 Redis
集群中放置一个 key-value
时,redis
先对key
使用 crc16
算法算出一个结果,然后把结果对 16384
求余数,这样每个 key
都会对应一个编号在 0-16383
之间的哈希槽,redis
会根据节点数量大致均等的将哈希槽映射到不同的节点
redis-cluster投票:容错
投票过程是集群中所有master
参与,如果半数以上master
节点与master
节点通信超时(cluster-node-timeout
),认为当前master
节点挂掉.
什么时候整个集群不可用(cluster_state:fail
)?
如果集群任意master
挂掉,且当前master
没有slave
.集群进入fail
状态,也可以理解成集群的slot
映射[0-16383
]不完整时进入fail状态.
如果集群超过半数以上master
挂掉,无论是否有slave
,集群进入fail
状态.
搭建一个集群
3.1 创建文件夹 集群中 Redis 节点的端口号为 9001-9006
,端口号即集群下各实例文件夹。数据存放在 端口号/data
文件夹中。
1 2 3 mkdir /usr/local/redis-cluster cd redis-cluster/ mkdir -p 9001 /data 9002 /data 9003 /data 9004 /data 9005 /data 9006 /data
查看文件:
1 2 3 4 5 6 7 8 9 [root@izbp12c0zpe8t4yri0xphiz redis]# cd redis-cluster/ [root@izbp12c0zpe8t4yri0xphiz redis-cluster]# ll total 27564 drwxr-xr-x 3 root root 4096 Jan 8 16 :50 9001 drwxr-xr-x 3 root root 4096 Jan 8 16 :50 9002 drwxr-xr-x 3 root root 4096 Jan 8 16 :50 9003 drwxr-xr-x 3 root root 4096 Jan 8 16 :50 9004 drwxr-xr-x 3 root root 4096 Jan 8 16 :50 9005 drwxr-xr-x 3 root root 4096 Jan 8 16 :50 9006
3.2 复制执行脚本 在 对应的文件夹下新建相对应的redis.conf文件
1 cp redis.conf /usr/local/redis-cluster/9001 /redis
注意,修改 redis.conf
配置和单点唯一区别是下图部分,其余还是常规的这几项:
1 2 3 4 5 6 7 8 9 port 9001 #(每个节点的端口号) daemonize yes bind 192.168.119.131 #(绑定当前机器 IP) dir /usr/local/redis-cluster/9001/data/ #(数据文件存放位置) pidfile /var/run/redis_9001.pid #(pid 9001和port要对应) cluster-enabled yes #(启动集群模式) cluster-config-file nodes9001.conf #(9001和port要对应) cluster-node-timeout 15000 appendonly yes
3.3 其余 redis.conf 文件 1 2 vim redis.conf :%s/9001 /9002 g
其实我们也就是替换了下面这四行:
1 2 3 4 port 9002 dir /usr/local/redis-cluster/9002 /data/ cluster-config-file nodes-9002. conf pidfile /var /run/redis_9002.pid
3.4 启动 9001-9006 六个节点 1 2 3 4 5 [root@izbp12c0zpe8t4yri0xphiz bin]# ./redis-server ../redis-cluster/9002/redis.conf [root@izbp12c0zpe8t4yri0xphiz bin]# ./redis-server ../redis-cluster/9003/redis.conf [root@izbp12c0zpe8t4yri0xphiz bin]# ./redis-server ../redis-cluster/9004/redis.conf [root@izbp12c0zpe8t4yri0xphiz bin]# ./redis-server ../redis-cluster/9005/redis.conf [root@izbp12c0zpe8t4yri0xphiz bin]# ./redis-server ../redis-cluster/9006/redis.conf
查看服务配置情况:
1 2 3 4 5 6 7 8 [root@izbp12c0zpe8t4yri0xphiz bin]# ps -ef | grep redis root 14895 1 0 17 :11 ? 00 :00 :00 ./redis-server 127.0 .0.1 :9001 [cluster] root 14911 1 0 17 :13 ? 00 :00 :00 ./redis-server 127.0 .0.1 :9002 [cluster] root 14916 1 0 17 :13 ? 00 :00 :00 ./redis-server 127.0 .0.1 :9003 [cluster] root 14921 1 0 17 :13 ? 00 :00 :00 ./redis-server 127.0 .0.1 :9004 [cluster] root 14926 1 0 17 :13 ? 00 :00 :00 ./redis-server 127.0 .0.1 :9005 [cluster] root 14931 1 0 17 :13 ? 00 :00 :00 ./redis-server 127.0 .0.1 :9006 [cluster] root 14936 14760 0 17 :13 pts/5 00 :00 :00 grep --color=auto redis
3.5 节点测试 1 2 3 [root@izbp12c0zpe8t4yri0xphiz bin]# ./redis-cli -h 127.0.0.1 -p 9001 127.0 .0.1 :9001 > set name chen(error) CLUSTERDOWN Hash slot not served
虽然我们配置并启动了 Redis 集群服务,但是他们暂时还并不在一个集群中,互相直接发现不了,而且还没有可存储的位置,就是所谓的slot(槽) 。
3.6 安装集群所需软件 由于 Redis 集群需要使用 ruby 命令,所以我们需要安装 ruby 和相关接口。
1 2 3 yum install ruby yum install rubygems gem install redis
该命令可能出现的报错:
1 2 3 4 5 6 7 8 9 [root@izbp12c0zpe8t4yri0xphiz bin]# yum install rubygems Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile Package rubygems-2.0 .14.1 -34. el7_6.noarch already installed and latest version Nothing to do [root@izbp12c0zpe8t4yri0xphiz bin]# gem install redis Fetching: redis-4.1 .0. gem (100 %) ERROR: Error installing redis: redis requires Ruby version >= 2.2 .2.
redis requires Ruby version >= 2.2.2的报错,查了资料发现是Centos默认支持ruby到2.0.0,可gem 安装redis 需要最低是2.2.2
解决办法是 先安装rvm,再把ruby版本提升至2.3.3
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 1. 安装curl yum install curl 2. 安装RVM curl -L get.rvm.io | bash -s stable # 该命令可能出现报错的解决方案参考 (4.gpg无对应公钥问题) 3 source /usr/local/rvm/scripts/rvm 4 查看rvm库中已知的ruby版本rvm list known 5. 安装一个ruby版本 rvm install 2.3 .3 6. 使用一个ruby版本 rvm use 2.3 .3 7. 卸载一个已知版本rvm remove 2.0 .0 8. 查看当前版本ruby --version 9. 再安装redisgem install redis
3.7 创建集群 1 ./redis-trib.rb create --replicas 1 127.0 .0.1 :9001 127.0 .0.1 :9002 127.0 .0.1 :9003 127.0 .0.1 :9004 127.0 .0.1 :9005 127.0 .0.1 :9006
该命令执行结果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 [root@izbp12c0zpe8t4yri0xphiz src]# ./redis-trib.rb create --replicas 1 127.0.0.1:9001 127.0.0.1:9002 127.0.0.1:9003 127.0.0.1:9004 127.0.0.1:9005 127.0.0.1:9006 >>> Creating cluster >>> Performing hash slots allocation on 6 nodes... Using 3 masters: 127.0 .0.1 :9001 127.0 .0.1 :9002 127.0 .0.1 :9003 Adding replica 127.0 .0.1 :9005 to 127.0 .0.1 :9001 Adding replica 127.0 .0.1 :9006 to 127.0 .0.1 :9002 Adding replica 127.0 .0.1 :9004 to 127.0 .0.1 :9003 >>> Trying to optimize slaves allocation for anti-affinity [WARNING] Some slaves are in the same host as their master M: ea16e1218bb5eb0ae35b1d5de17362ac7d223007 127.0 .0.1 :9001 slots:0 -5460 (5461 slots) master M: c0cf115bc513aa6ed07045c73866d18f4a72ef08 127.0 .0.1 :9002 slots:5461 -10922 (5462 slots) master M: a45b310b0957f33f1156ce20493ec1d02f15c7da 127.0 .0.1 :9003 slots:10923 -16383 (5461 slots) master S: 8f 1a9ad5408edd85037651e82882c00587e0c409 127.0 .0.1 :9004 replicates ea16e1218bb5eb0ae35b1d5de17362ac7d223007 S: 19f 23f64e28dbd9138689eb8a39609f0074cd2c7 127.0 .0.1 :9005 replicates c0cf115bc513aa6ed07045c73866d18f4a72ef08 S: 8950 edb8b990b3dc4ee4c01e48d70df8b8820116 127.0 .0.1 :9006 replicates a45b310b0957f33f1156ce20493ec1d02f15c7da Can I set the above configuration? (type 'yes' to accept):
简单解释一下这个命令:调用 ruby 命令来进行创建集群,--replicas 1
表示主从复制比例为 1:1,即一个主节点对应一个从节点;然后,默认给我们分配好了每个主节点和对应从节点服务,以及 solt 的大小,因为在 Redis 集群中有且仅有 16383 个 solt ,默认情况会给我们平均分配,当然你可以指定,后续的增减节点也可以重新分配。
M: 10222dee93f6a1700ede9f5424fccd6be0b2fb73
为主节点Id
S: 9ce697e49f47fec47b3dc290042f3cc141ce5aeb 192.168.119.131:9004 replicates 10222dee93f6a1700ede9f5424fccd6be0b2fb73
从节点下对应主节点Id
目前来看,9001-9003
为主节点,9004-9006
为从节点,并向你确认是否同意这么配置。
输入 yes
后,会开始集群创建。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 Can I set the above configuration? (type 'yes' to accept): yes >>> Nodes configuration updated >>> Assign a different config epoch to each node >>> Sending CLUSTER MEET messages to join the cluster Waiting for the cluster to join..... >>> Performing Cluster Check (using node 127.0 .0 .1 :9001 ) M: ea16e1218bb5eb0ae35b1d5de17362ac7d223007 127.0.0.1:9001 slots:0-5460 (5461 slots) master 1 additional replica (s) S: 8950edb8b990b3dc4ee4c01e48d70df8b8820116 127.0.0.1:9006 slots: (0 slots) slave replicates a45b310b0957f33f1156ce20493ec1d02f15c7da M: a45b310b0957f33f1156ce20493ec1d02f15c7da 127.0.0.1:9003 slots:10923-16383 (5461 slots) master 1 additional replica (s) S: 19f23f64e28dbd9138689eb8a39609f0074cd2c7 127.0.0.1:9005 slots: (0 slots) slave replicates c0cf115bc513aa6ed07045c73866d18f4a72ef08 M: c0cf115bc513aa6ed07045c73866d18f4a72ef08 127.0.0.1:9002 slots:5461-10922 (5462 slots) master 1 additional replica (s) S: 8f1a9ad5408edd85037651e82882c00587e0c409 127.0.0.1:9004 slots: (0 slots) slave replicates ea16e1218bb5eb0ae35b1d5de17362ac7d223007 [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered.
3.8 验证 依然是通过客户端命令连接上,通过集群命令看一下状态和节点信息等
1 2 3 ./redis-cli -c -h 127.0 .0.1 -p 9001 cluster info cluster nodes
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 [root@izbp12c0zpe8t4yri0xphiz src]# ./redis-cli -c -h 127.0.0.1 -p 9001 127.0 .0.1 :9001 > cluster infocluster_state:ok cluster_slots_assigned:16384 cluster_slots_ok:16384 cluster_slots_pfail:0 cluster_slots_fail:0 cluster_known_nodes:6 cluster_size:3 cluster_current_epoch:6 cluster_my_epoch:1 cluster_stats_messages_ping_sent:202 cluster_stats_messages_pong_sent:195 cluster_stats_messages_sent:397 cluster_stats_messages_ping_received:190 cluster_stats_messages_pong_received:202 cluster_stats_messages_meet_received:5 cluster_stats_messages_received:397 127.0 .0.1 :9001 > cluster nodes8950 edb8b990b3dc4ee4c01e48d70df8b8820116 127.0 .0.1 :9006 @19006 slave a45b310b0957f33f1156ce20493ec1d02f15c7da 0 1546942881000 6 connecteda45b310b0957f33f1156ce20493ec1d02f15c7da 127.0 .0.1 :9003 @19003 master - 0 1546942883000 3 connected 10923 -16383 19f 23f64e28dbd9138689eb8a39609f0074cd2c7 127.0 .0.1 :9005 @19005 slave c0cf115bc513aa6ed07045c73866d18f4a72ef08 0 1546942882765 5 connectedea16e1218bb5eb0ae35b1d5de17362ac7d223007 127.0 .0.1 :9001 @19001 myself,master - 0 1546942882000 1 connected 0 -5460 c0cf115bc513aa6ed07045c73866d18f4a72ef08 127.0 .0.1 :9002 @19002 master - 0 1546942882000 2 connected 5461 -10922 8f 1a9ad5408edd85037651e82882c00587e0c409 127.0 .0.1 :9004 @19004 slave ea16e1218bb5eb0ae35b1d5de17362ac7d223007 0 1546942883766 4 connected
通过命令,可以详细的看出集群信息和各个节点状态,主从信息以及连接数、槽信息等。这么看到,我们已经把 Redis 集群搭建部署成功!
**设置一个 key **
1 2 3 127.0 .0.1 :9001 > set name mafly-> Redirected to slot [5798 ] located at 127.0 .0.1 :9002 OK
当我们 set name mafly
时,出现了 Redirected to slot
信息并自动连接到了9002
节点。这也是集群的一个数据分配特性。
###4 gpg无对应公钥问题
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 [root@izbp12c0zpe8t4yri0xphiz bin]# curl -L get.rvm.io | bash -s stable % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 194 100 194 0 0 37 0 0 :00 :05 0 :00 :05 --:--:-- 53 100 24173 100 24173 0 0 2003 0 0 :00 :12 0 :00 :12 --:--:-- 7523 Downloading https: Downloading https: gpg: Signature made Fri 04 Jan 2019 06 :01 :48 AM CST using RSA key ID 39499 BDB gpg: Can't check signature: No public key GPG signature verification failed for ' /usr/local/rvm/archives/rvm-1.29 .7. tgz' - ' https: gpg2 --keyserver hkp: or if it fails: command curl -sSL https: command curl -sSL https: In case of further problems with validation please refer to https:
错误信息提示 ,无法检查签名:无公钥
解决方法如下(下载公钥):
参考博客
参考博客