redis的安装和配置

概述

对redis来说,在学习和工作中,安装配置环节无疑是最简单的。无论是单机安装、sentinel主从还是cluster模式,都只需要一个安装包,每个节点给一个配置文件,然后使用配置文件启动就可以了。当然,在试验环节,我们可以连配置文件都省了,直接启动也是可以的。

这样说来,其实理解redis基础安装,主要在于理解配置文件,那么配置文件中有哪些内容呢?

  • 如果是单机安装,那么配置文件中规定了端口号、是否后台运行、log文件名称及存放位置、访问密码等。
  • 如果是主从模式,除了单机模式的参数外,还可以约定主从复制的相关规定,如主从切换的时间等。
  • 如果是集群cluster模式,那么还需要开启cluster功能,并描述cluster的相关约定。

这篇博文描述redis的单机、主从模式的安装配置,下一篇描述cluster模式的安装、配置及节点管理。

服务器环境准备

[root@redis ~]# cat /etc/redhat-release 
CentOS Linux release 7.5.1804 (Core) 
[root@redis ~]# uname -a
Linux redis 3.10.0-862.el7.x86_64 #1 SMP Fri Apr 20 16:44:24 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
[root@redis ~]# getenforce 
Disabled
[root@redis ~]# systemctl is-active firewalld.service 
unknown
[root@redis ~]# hostname -i|awk '{print $NF,$(NF-1)}'
172.16.1.101 10.0.0.101

目录规划

目录 内容
/application/redis-3.2.12 redis原始安装目录
/application/redis redis原始安装目录的软连接
/data/redis/{port-number} redis实例运行目录,port-number就是实例的端口号

 

最简单的安装

##创建基础目录
mkdir /application
cd /application

##上传安装包redis-3.2.12.tar.gz
rz -be
tar -zxf redis-3.2.12.tar.gz

##创建软链接
ln -s redis-3.2.12 redis

##make
cd redis
make

##后台启动
/application/redis/src/redis-server &
##连接验证
/application/redis/src/redis-cli 
##如果状态正常,会进入redis的命令行模式,如下(6379是redis的默认端口号):
127.0.0.1:6379> set name timmy OK 127.0.0.1:6379> get name "timmy" ##如上,可以连接,并正常读写,说明最基本的安装已经完成了
##可使用exit退出redis命令行模式
##关闭redis实例有两种方式
##1.在redis命令行输入shutdown,然后exit退出
##2.退出redis命令行后,使用redis-cli shutdown,有了后续配置后,使用这种方法时需要加上验证密码、端口号、host地址等参数,以后再说

修改环境变量

上面的启动、连接命令都在/application/redis/src/目录下,这个目录中还有很多其他的命令,是以后要经常使用的,为了方便,可以把这个路径添加到环境变量中。

echo 'export PATH=/application/redis/src:$PATH'>>/etc/profile
source /etc/profile

配置文件

写一个配置文件

写一个简单的配置文件吧,如下:

[root@redis application]# cat /data/redis/6379/6379.conf
daemonize yes
port 6379
logfile /data/redis/6379/redis.log
dir /data/redis/6379
dbfilename dump.rdb
bind 10.0.0.101  127.0.0.1
requirepass 123456

###配置逐行说明

配置逐行说明:

  1. 是否后台运行,设置yes表示默认后台运行,这样启动时就不用加&符号了
  2. 实例监听的端口号
  3. redis日志存放路径
  4. 持久化文件存放位置
  5. RDB持久化数据文件
  6. bind地址,设置以后,其他服务器可以通过这个地址访问redis实例
  7. 访问密码

理解保护模式

重点说明一下:redis默认是只允许本地访问,实现方式是把保护模式设置了一个参数:protected-mode yes/no (保护模式,是否只允许本地访问)。

想要让其他服务器也可以访问,最简单的方法是把这个参数设置为no,但这种方式不够安全,所以遵循官方建议的另外一种方法,就是上面配置文件中写道的给定bind IP和访问密码。

接下来就可以连接redis实例并验证了。

趁着之前的实例还没有关闭,有必要体验一下保护模式的阴影,请看

[root@redis application]# redis-cli -h 10.0.0.101
10.0.0.101:6379> get name
(error) DENIED Redis is running in protected mode because protected mode is enabled, no bind address was specified, no authentication password is requested to clients. In this mode connections are only accepted from the loopback interface. If you want to connect from external computers to Redis you may adopt one of the following solutions: 
1) Just disable protected mode sending the command 'CONFIG SET protected-mode no' from the loopback interface by connecting to Redis from the same host the server is running, however MAKE SURE Redis is not publicly accessible from internet if you do so. Use CONFIG REWRITE to make this change permanent.
2) Alternatively you can just disable the protected mode by editing the Redis configuration file, and setting the protected mode option to 'no', and then restarting the server. 
3) If you started the server manually just for testing, restart it with the '--protected-mode no' option.
4) Setup a bind address or an authentication password. NOTE: You only need to do one of the above things in order for the server to start accepting connections from the outside.

如上,在没有配置关闭保护模式,和bind IP、访问密码的时候,虽然可以连接redis实例,但读取内容时会报错,并且给出几条解决方案。其中前三条大同小异,就是用各种方式关闭保护模式,我们采用的是第四种。

这里,如果把-h后的地址写成127.0.0.1,就可以正常读写了,所以他真的是只允许本地访问的,没错吧。

好了,接下来就正式验证通过配置文件启动的redis实例是不是可以正常运行了。

###关闭之前的实例,然后通过配置文件开启新的实例
redis-cli shutdown
redis-server /data/redis/6379/6379.conf

###连接并验证
##方式1
[root@redis application]# redis-cli 
127.0.0.1:6379> get name
(error) NOAUTH Authentication required.
127.0.0.1:6379> auth 123456
OK
127.0.0.1:6379> CONFIG GET port
1) "port"
2) "6379"
127.0.0.1:6379> exit

###方式2
[root@redis application]# redis-cli -a 123456
127.0.0.1:6379> CONFIG GET port
1) "port"
2) "6379"
127.0.0.1:6379> exit

如上,可以通过两种方式通过验证,方式一、连接成功后,用“auth password”验证;方式二、在连接实例时添加验证参数“-a passwor”。

上蒙面的config get是在线查看配置的命令,可以在redis命令行中查看配置,也可以用config set来修改配置,这些有机会的话,以后的博文中再说。

配置持久化

数据持久化的实现,很大程度保障了数据安全,这个是redis被广泛应用的最重要原因之一。redis的持久化方式有RDB和AOF两种。

RDB持久化

实现方式:在指定的时间间隔内生成数据集的时间点快照,把内存数据保存在磁盘中。

优点:速度快

缺点:可能会丢失数据

应用场景:主从复制就是基于RDB持久化实现的

配置参数: 

###在配置文件中加入以下语句,前两行是已经配置过的
dir /data/redis/6379
dbfilename dump.rdb

save 900 1
save 300 10
save 60 10000

 后三行配置解读:指定时间间隔内,有指定数量的更改就把数据保存都磁盘

  1. 900秒(15分钟)内有1个更改
  2. 300秒(5分钟)内有10个更改
  3. 60秒内有10000个更改

 AOF持久化

实现方式:记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集。AOF 文件中的命令全部以 Redis 协议的格式来保存,新命令会被追加到文件的末尾。

优点:安全性更好,最大程度保留数据

缺点:日志可能会很大,不过在生产环境中,多用点磁盘空间也不算啥大问题。

配置参数:

###在配置文件中加入以下参数:
appendonly yes
appendfsync everysec 

 

参数解读:

  1. 开启AOF持久化功能
  2. 设置AOF持久化同步频率,这个参数有三种模式,如下
    appendfsync always:每执行一处修改,立即同步到AOF
    appendfsync everysec:每秒钟执行一次同步动作
    appendfsync no:由操作系统判断何时同步

验证

可以按照“最简单的安装”一节中的方式,设定一个变量。如果不配置持久化,每次重启实例,数据就会丢失,自然就读取不到了;设置持久化后,如果是RDB,会在时间间隔达到后被永久保存;如果是AOF,则会按照配置的同步方式进行保存。无论是哪种持久化,一旦触发了同步条件,数据就是安全的了,这时重启实例后,依然可以正常读取数据。

主从复制

有了上面的基础,搭建主从复制就很简单了。这里使用三个实例来搭建一主二从的环境,主库端口6380,从库端口6381和6382

准备三个实例的配置文件

mkdir /data/redis/638{0..2}

###这里贴出主库的配置文件,两个从库只需要修改文件路径和端口号即可
[root@redis redis]# cat 6380/redis.conf     
port 6380
daemonize yes
pidfile /data/redis/6380/redis.pid
loglevel notice
logfile "/data/redis/6380/redis.log"
dbfilename dump.rdb
dir /data/redis/6380
protected-mode no

启动三个实例

redis-server /data/redis/6380/redis.conf
redis-server /data/redis/6381/redis.conf
redis-server /data/redis/6382/redis.conf

开启主从复制

登录从库,执行一条命令即可开启主从复制,操作如下

###此时端口并不是默认的6379了。登录时需要用-p指定端口哦
redis-cli -p 6381
SLAVEOF 127.0.0.1 6380
redis-cli -p 6382
SLAVEOF 127.0.0.1 6380

验证

验证可以从两方面进行:一是查看主从状态;二是主库写入数据,在从库尝试读取。

  1.  查看主从状态(连接实例,进入命令行模式后,使用info replication获取主从状态)
    ###从库返回信息
    127.0.0.1:6381> info replication
    # Replication
    role:slave
    master_host:10.0.0.101
    master_port:6380
    master_link_status:up
    master_last_io_seconds_ago:4
    master_sync_in_progress:0
    slave_repl_offset:15
    slave_priority:100
    slave_read_only:1
    connected_slaves:0
    master_repl_offset:0
    repl_backlog_active:0
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:0
    repl_backlog_histlen:0
    
    ###主库返回信息
    127.0.0.1:6380> info replication
    # Replication
    role:master
    connected_slaves:2
    slave0:ip=10.0.0.101,port=6381,state=online,offset=169,lag=0
    slave1:ip=10.0.0.101,port=6382,state=online,offset=169,lag=0
    master_repl_offset:169
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:2
    repl_backlog_histlen:168

     

  2. 从库读取数据验证
    ###主库写
    127.0.0.1:6380> get name
    (nil)
    127.0.0.1:6380> set name timmy
    OK
    127.0.0.1:6380> get name 
    "timmy"
    
    ###从库读
    127.0.0.1:6382> get name
    "timmy"

主从切换

主从切换也很简单,比如我们环境里的主库down了,先关闭实例6381、6382的从库属性,然后把6382的主库设为6381即可。其中涉及一条新的命令:关闭从库属性。下面的代码可以模拟这个过程

redis-cli -p 6380
shutdown

redis-cli -p 6381
slaveof no one

6382连接到6381:
[root@db03 ~]# redis-cli -p 6382
127.0.0.1:6382> SLAVEOF no one
127.0.0.1:6382> SLAVEOF 127.0.0.1 6381

 

 

设置完成记得验证。

sentinel

上面的主从切换是人工完成的,显然不适用于生产环境,想要自动切换就可以考虑sentinel,这是官方推荐的工具,简要介绍一下:

  1. 首先,像redis实例一样,它是一个独立运行的进程,同样也需要一个配置文件
  2. 可以实时监测主从环境的运行状态,如果master节点down了,可以自动进行切换

 更详细的资料这里就并不写了。

sentinel的配置文件

1 mkdir /data/redis/26380
2 cat /data/redis/26380/sentinel.conf
3 port 26380
4 dir "/data/redis/26380"
5 sentinel monitor mymaster 127.0.0.1 6380 1 
6 sentinel down-after-milliseconds mymaster 5000
7 daemonize yes

 配置文件解读:

  1. 第5行:Sentinel 去监视一个名为 mymaster(名字可以随意取)的主服务器, 这个主服务器的 IP 地址为 127.0.0.1 , 端口号为 6380 , 而将这个主服务器判断为失效至少需要1个Sentinel 同意 (只要同意 Sentinel的数量不达标,自动故障迁移就不会执行)。不过要注意, 无论你设置要多少个 Sentinel 同意才能判断一个服务器失效, 一个 Sentinel 都需要获得系统中多数(majority) Sentinel 的支持, 才能发起一次自动故障迁移, 并预留一个给定的配置纪元 (configuration Epoch ,一个配置纪元就是一个新主服务器配置的版本号)。换句话说, 在只有少数(minority) Sentinel 进程正常运作的情况下, Sentinel 是不能执行自动故障迁移的。
  2. 第6行:主节点断线超过5s就判定它down掉了

启动sentinel

redis-sentinel /data/redis/26380/sentinel.conf

验证

关闭主节点,查看是否自动切换;再次开启主节点,查看三个实例的主从状态。

我第一次测试的时候,主节点重新启动时,状态显示为down,将rdb文件从另一个从节点复制过来,重新启动后显示为正常的slave状态。但是重新测试的时候,是可以自动恢复正常salve状态的。

sentinel管理命令

redis-cli -p 26380连接到sentinel后,可以使用一下命令查看、管理主从环境。

  • SENTINEL masters :列出所有被监视的主服务器
  • SENTINEL slaves <master name>
  • SENTINEL get-master-addr-by-name <master name> : 返回给定名字的主服务器的 IP 地址和端口号。
  • SENTINEL reset <pattern> : 重置所有名字和给定模式 pattern 相匹配的主服务器。
  • SENTINEL failover <master name> : 当主服务器失效时, 在不询问其他 Sentinel 意见的情况下, 强制开始一次自动故障迁移。

附:redis服务管理命令

序号 命令 描述
1 info 获取redis相关状态,比如上文提到的主从状态
2 Clinet list  
3 Client kill ip:port  
4 config get * 查看相关配置,比如config get port,用*表示查看所有配置
5 CONFIG RESETSTAT 重置统计
6 CONFIG GET/SET 动态修改配置(临时生效)
7 Dbsize 查看数据总量(即redis中存储了多少个key)
8 FLUSHALL  清空所有数据
9 select 1 进入1号库,redis有0-15共计16个库,默认使用0号库,集群模式只能使用0号库
10 FLUSHDB 清空当前库
11 MONITOR 监控实时指令
12 SHUTDOWN 关闭服务器
13 save 保存当前数据
14 SLAVEOF host port 主从配置
15 SLAVEOF NO ONE 取消主从配置
16 sync 主从同步
17 role 返回主从角色



posted @ 2019-04-07 11:55  Go_Timmy_Go  阅读(395)  评论(0编辑  收藏  举报