2022年4月份正式发布的redis 7.0,是目前历史上变化最大的版本,有超过50个以上的新增命令
官网:
https://redis.io
中文镜像
http://redis.cn
中文学习网:
https://redis.com.cn/
redis版本,建议升级到6.0.8版本以上,防止出现安全问题
查看自己的服务器操作系统位数,确保是64位:
getconf LONG_BIT
查看GCC版本,redis由C编写,所以需要由GCC环境
[root@psh redis-7.0.11]# gcc -v
使用内建 specs。
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/lto-wrapper
目标:x86_64-redhat-linux
配置为:../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --enable-languages=c,c++,objc,obj-c++,java,fortran,ada,go,lto --enable-plugin --enable-initfini-array --disable-libgcj --with-isl=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/isl-install --with-cloog=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/cloog-install --enable-gnu-indirect-function --with-tune=generic --with-arch_32=x86-64 --build=x86_64-redhat-linux
线程模型:posix
gcc 版本 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC)
下载安装包后,解压到自定义目录目录
cd /usr/local
tar -xzvf redis-7.0.11.tar.gz
进入redis目录
cd /usr/local/redis-7.0.11
执行安装命令
make && make install
出现It's a good idea to run 'make test' ;
说明安装成功
执行默认安装,会安装在
/usr/local/bin
文件说明
修改redis的配置文件:
cd /usr/local/redis-7.0.11
-- 备份原本的配置文件,防止配置错误
cp redis.conf /usr/local/redis-7.0.11/myredis.conf
vim myredis.conf
-- 查看文件的行数
set nu
做以下修改
vim /usr/local/redis-7.0.11/myredis.conf
将 daemonize no 改为 yes ,可以作为服务器后台启动
将 protected-mode yes 改为 no ,关闭保护模式
将bind 127.0.0.1 -::1 注释掉,否则只能本机访问
设置redis密码: requirepass 123456
开放端口
firewall-cmd --zone=public --add-port=6379/tcp --permanent
firewall-cmd --reload #重启
firewall systemctl stop firewalld.service #停止
firewall systemctl disable firewalld.service #禁止firewall开机启动
redis服务器启动
/usr/local/bin/redis-server /usr/local/redis-7.0.11/myredis.conf
/usr/local/bin/redis-cli
redis设置密码后,不使用密码也能登录,但是无法操作,会提示没有授权
可以使用 ./redis-cli -a 123456 ,带密码登录,会提示这样不安全,但是可以正常使用
也可以先连接,在授权,这样就没有警告了
关闭
在redis客户端直接使用 shutdown 就可以关闭服务器,然后在退出即可
127.0.0.1:6379> shutdown
not connected> quit
或者
/usr/local/bin/redis-cli -a 123456 shutdown
新建一个系统服务文件:
vi /etc/systemd/system/redis.service
[Unit]
Description=redis-server
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/bin/redis-server /usr/local/redis-7.0.11/myredis.conf
PrivateTmp=true
[Install]
WantedBy=multi-user.target
重载系统服务 systemctl daemon-reload
启动 systemctl start redis
停止 systemctl stop redis
重启 systemctl restart redis
查看状态 systemctl status redis
设置开机自启动 systemctl enable redis
vim /usr/local/redis-7.0.11/myredis.conf
redis7以前
# save m n 表示m秒内数据集存在n次修改,就会触发bgsave ,进行RDB持久化
save 900 1
save 300 10
save 60 10000
redis7对RDB的持久化规则做出了修改
# 默认为:
save 3600 1 300 100 60 10000
#为了方便测试,本地调整为:
save 60 100
#rdb文件路径默认为 dir ./ ,为了方便查看,文件夹设置为:(这里的文件夹不能为空)
mkdir dumpfiles
dir /usr/local/redis-7.0.11/dumpfiles
# 如果有当前机器有多个redis实例,建议修改rdb文件名称,这里没有改
dbfilename dump.rdb
重启redis,执行save,查看 /usr/local/redis-7.0.11/dumpfiles
文件夹,存在rdb文件
RDB文件修复
/usr/local/bin/redis-check-rdb /usr/local/redis-7.0.11/dumpfiles/dump.rdb
禁用rdb
# 只在本次运行过程中禁用rdb
/usr/local/bin/redis-cli config set save ""
# 更改配置文件
save ""
开启AOF
vim /usr/local/redis-7.0.11/myredis.conf
# 把appendonly no 改为 yes
appendonly yes
设置aof文件的路径
# 在redis6,aof保存文件的位置和RBD保存文件的位置一样,都是通过redis.conf配置文件的dir配置
# 在redis7的时候,新增了配置 appenddirname 配置,专门用来配置aof文件的保存位置,这里是在RDB文件下在新建appendonlydir文件夹
appenddirname "appendonlydir"
aof文件在redis6的时候是只有一个 appendonly.aof
文件
在redis7的时候变成了三个
appendonly.aof..base.rdb
是基础aof文件,由子进程通过重写产生,该文件最多只有一个appendonly.aof..incr.aof
是增量的aof文件,在aof重写的时候产生,可能会存在多个appendonly.aof..history.aof
是历史的aof,由base和incr变化而来,每次aof重写完成,之前的base和incr 都会变为history,history类型的aof文件是会被自动删除的appendonly.aof.manifest
清单文件用来跟踪和管理这些aof文件,方便定位和查找aof的修复命令,注意文件名
/usr/local/bin/redis-check-aof --fix /usr/local/redis-7.0.11/dumpfiles/appendonlydir/appendonly.aof.1.incr.aof
主从复制
可以配置到配置文件
-- 只配从库不配主库
replicaof 主库ip 主库端口号
也可以使用命令的方式临时切换
SLAVEOF 主库ip 主库端口号
SLAVEOF 192.168.158.168 6380
把自己切换为主机
SLAVEOF no one
这里的两台从机都是从已经配置好rdb和aof的主机拷贝过来的,所以就不在配aof和rdb
需要保证服务器间可以ping通,防火墙对应端口可以访问
vim /usr/local/redis-7.0.11/myredis.conf
修改从机的端口号
port 6380
修改进程id,可以不改,不会对主从造成影响,但是有歧义
pidfile /var/run/redis_6380.pid
修改日志文件目录(主从机都需要改)
logfile "/usr/local/redis-7.0.11/mylogs/redislog.log"
mkdir /usr/local/redis-7.0.11/mylogs
修改密码(最好主从机都改,可以只改主机)
requirepass 123456
配置主机,和从机访问主机的密码,这里主机不用配(如果要配置哨兵,主节点也要配)
replicaof 192.168.158.167 6379
masterauth "123456"
给从机开放新的端口
firewall-cmd --zone=public --add-port=6380/tcp --permanent
firewall-cmd --reload #重启
firewall systemctl stop firewalld.service #停止
firewall systemctl disable firewalld.service #禁止firewall开机启动
firewall-cmd --zone=public --add-port=6381/tcp --permanent
记得配置主机的,从机访问主机的密码
vim /usr/local/redis-7.0.11/myredis.conf
masterauth "123456"
进入哨兵机器
cd /usr/local/
#上传redis压缩包,并解压
tar -xzvf redis-7.0.11.tar.gz
#在三台哨兵上分别安装redis,参考上面redis的安装,不需要对redis配置文件进行修改
备份 sentinel.conf 配置文件,防止意外出现
cd /usr/local/redis-7.0.11
cp sentinel.conf sentinel.conf.bak
修改三台哨兵的配置文件
vim sentinel.conf
# 或者使用sz sentinel.conf ,把文件下载到本机进行编辑,最后再上传服务器
bind 0.0.0.0
# 默认就是关闭保护模式
protected-mode no
# 默认端口
port 26379
# 改为yes,可以后台启动
daemonize yes
# 进程id可以不改
pidfile /var/run/redis-sentinel.pid
# 日志文件位置
logfile "/usr/local/redis-7.0.11/sentinel.log"
# 工作目录, 要手动创建对应的文件夹 mkdir dir
dir /usr/local/redis-7.0.11/dir
# 设置要监控的服务器,参数为: masterName 主机的ip 主机端口 法定投票数(表示最少需要多少个哨兵认为客观下线,同意故障迁移)
sentinel monitor mymaster 192.168.158.167 6379 2
# 接主节点的密码
sentinel auth-pass mymaster 123456
# 以下配置使用默认即可
# 主节点多少毫秒没有应答哨兵,哨兵就会主观上认为主节点下线
sentinel down-after-milliseconds mymaster 30000
# 故障转移的超时时间
sentinel failover-timeout mymaster 180000
开放端口
firewall-cmd --zone=public --add-port=26379/tcp --permanent
firewall-cmd --reload #重启
firewall systemctl stop firewalld.service #停止
firewall systemctl disable firewalld.service #禁止firewall开机启动
启动哨兵
/usr/local/bin/redis-sentinel /usr/local/redis-7.0.11/sentinel.conf --sentinel
查看集群状态
info – Replication
关闭主机点,哨兵的选举日志如下:
启用哨兵后,哨兵会对redis的配置文件进行重写
集群配置:3主3从,为了节约资源,每个redis服务器启动两个redis实例,共需要3台服务器,一个以6380启动,一个以6381启动
mkdir /usr/local/redis-7.0.11/cluster
redis会根据制定的配置文件进行启动,在每个服务器上,新建两个集群的配置文件,并修改redis集群配置文件
cd /usr/local/redis-7.0.11/cluster/
vim /usr/local/redis-7.0.11/cluster/redisCluster6381.conf
vim /usr/local/redis-7.0.11/cluster/redisCluster6382.conf
文件内容
bind 0.0.0.0
# 默认就是关闭保护模式
protected-mode no
# 默认端口
port 6381
# 改为yes,可以后台启动
daemonize yes
# 进程id可以不改
pidfile /var/run/redis-6381.pid
# 日志文件位置
logfile "/usr/local/redis-7.0.11/redis6381.log"
# 工作目录, 要手动创建对应的文件夹 mkdir dir
dir /usr/local/redis-7.0.11/cluster
# RDB
dbfilename dump6381.rdb
# aof
appendonly yes
appenddirname "appendonly6381.aof"
requirepass 123456
masterauth 123456
# 打开集群
cluster-enabled yes
# 集群的配置文件
cluster-config-file nodes-6381.conf
cluster-node-timeout 5000
bind 0.0.0.0
# 默认就是关闭保护模式
protected-mode no
# 默认端口
port 6382
# 改为yes,可以后台启动
daemonize yes
# 进程id可以不改
pidfile /var/run/redis-6382.pid
# 日志文件位置
logfile "/usr/local/redis-7.0.11/redis6382.log"
# 工作目录, 要手动创建对应的文件夹 mkdir dir
dir /usr/local/redis-7.0.11/cluster
# RDB
dbfilename dump6382.rdb
# aof
appendonly yes
appenddirname "appendonly6382.aof"
requirepass 123456
masterauth 123456
# 打开集群
cluster-enabled yes
# 集群的配置文件
cluster-config-file nodes-6382.conf
cluster-node-timeout 5000
开放端口
firewall-cmd --zone=public --add-port=6381/tcp --permanent
firewall-cmd --zone=public --add-port=6382/tcp --permanent
firewall-cmd --reload #重启
firewall systemctl stop firewalld.service #停止
firewall systemctl disable firewalld.service #禁止firewall开机启动
启动
/usr/local/bin/redis-server /usr/local/redis-7.0.11/cluster/redisCluster6381.conf
/usr/local/bin/redis-server /usr/local/redis-7.0.11/cluster/redisCluster6382.conf
变更系统服务文件,因为使用集群了,之前自启的单节点就不要开机自启了:
vi /etc/systemd/system/redis.service
[Unit]
Description=redis-server
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/bin/redis-server /usr/local/redis-7.0.11/cluster/redisCluster6381.conf
PrivateTmp=true
[Install]
WantedBy=multi-user.target
vi /etc/systemd/system/redis01.service
[Unit]
Description=redis01-server
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/bin/redis-server /usr/local/redis-7.0.11/cluster/redisCluster6382.conf
PrivateTmp=true
[Install]
WantedBy=multi-user.target
重载系统服务 systemctl daemon-reload
启动 systemctl start redis
停止 systemctl stop redis
重启 systemctl restart redis
查看状态 systemctl status redis
设置开机自启动 systemctl enable redis systemctl enable redis01
执行以下命令创建集群,出现确认选项,输入yes
--cluster-replicas 1 表示给每个master创建一个slave
/usr/local/bin/redis-cli -a 123456 --cluster create --cluster-replicas 1 192.168.158.167:6381 192.168.158.167:6382 192.168.158.168:6381 192.168.158.168:6382 192.168.158.169:6381 192.168.158.169:6382
本次用到的ip:port
192.168.158.167:6381 192.168.158.167:6382
192.168.158.168:6381 192.168.158.168:6382
192.168.158.169:6381 192.168.158.169:6382
此时创建集群会出现一直等待的情况,因为没有开放总线端口
集群总线
firewall-cmd --zone=public --add-port=16381/tcp --permanent
firewall-cmd --zone=public --add-port=16382/tcp --permanent
firewall-cmd --reload #重启
firewall systemctl stop firewalld.service #停止
firewall systemctl disable firewalld.service #禁止firewall开机启动
开放端口后创建集群需要删除以下文件,重新创建集群
cd /usr/local/redis-7.0.11/cluster
rm -rf dump6382.rdb
rm -rf dump6381.rdb
rm -rf nodes-6381.conf
rm -rf nodes-6382.conf
rm -rf appendonly6381.aof
rm -rf appendonly6382.aof
集群创建成功
查看集群关系
cluster nodes
集群的主从情况需要看集体分配
查看集群环境
cluster info
连接集群是要加 c ,把key路由到正确的节点,如下图会把key路由到指定的节点
/usr/local/bin/redis-cli -a 123456 -p 6381 -c
cluster nodes 查看集群情况,当前节点是主节点,关闭主节点,再次查看集群情况,发现原本的主节点连接不上了,而且选举出了新的主节点
重启之前的主节点,再次查看集群情况,之前的主节点变成了从节点
手动故障转移,或者节点丛属关系的调整
# 登录到刚才宕机的主节点
/usr/local/bin/redis-cli -a 123456 -p 6382 -c
# 恢复原有集群结构
cluster failover
cluster nodes
扩容
把新节点加入集群
/usr/local/bin/redis-cli -a 123456 --cluster add-node ip:port
重新分配槽位
/usr/local/bin/redis-cli -a 123456 --cluster reshard ip:port
# 执行上面的命令后,还需要输入要迁移的槽的个数和目标节点的id
# 重新分配的成本很高,所以当有新节点加入集群,重新划分槽实际上是之前每一个主节点都分出一部分槽给新的主节点,而不是全部重新分配
为新的主节点分配从节点
/usr/local/bin/redis-cli -a 123456 --cluster add-node 新从节点ip:port 新主节点ip:port --cluster-salve --cluster-master-id 新主节点id
缩容
先清除从节点
/usr/local/bin/redis-cli -a 123456 --cluster del-node 从节点ip:port 从节点id
主节点归还槽号
/usr/local/bin/redis-cli -a 123456 --cluster reshard ip:port
在清除主节点
/usr/local/bin/redis-cli -a 123456 --cluster del-node 主节点ip:port 主节点id
下载地址
https://github.com/RedisInsight/RedisDesktopManager/releases