redis 是一个用c语言编写的高性能k/v存储数据库,支持持久存储,是非关系型数据库。redis默认使用TCP的6379端口监听请求,单进程的模型。
配置文件
redis配置文件为/etc/redis.conf,下面我们挑出一些经常需要配置的参数来看看:
1.INCLUDES段
include :跟文件或者路径,表示配置文件包含的子配置文件
2.NETWORK段,网络相关设置
bind :跟ip地址,表示次服务通过哪个网卡监听请求,写0.0.0.0表示监听本机所有地址,默认为127.0.0.1
protected-mode :保护模式,默认为yes,开启后如果没有设置requirepass项目和bind仍然是默认的127.0.0.1,就进入了保护模式,只能从本地进行连接
port :监听的端口,默认为6379
tcp-backlog 511:后援队列长度,此处默认为511,就是达到最大负载时,允许多少请求可以处于等待状态
timeout 0:客户端连接空闲的超时时长,就是客户端多久没有操作,服务端就会自动断开,默认为0表示不断开
tcp-keepalive 300:tcp的持久连接,用来实现复用的,三次握手建立连接后在多少时间之内可以一直使用这个连接。
3.SECURITY段,安全相关的配置
requirepass :设置密码认证,默认注释,设置密码直接跟在后边就行,不过这个密码是明文的,所以要注意配置文件不能被不想关的人读取
rename-command CONFIG "":用来给命令设置别名的,CONFIG命令可以直接设置各项参数,可以查看,所以为了安全可以将命令设置为别的名字
4.LIMITS段,设置限制
maxclients 10000:最大并发连接
maxmemory <bytes>:最大使用的内存空间,不限制就默认能用多少用多少
maxmemory-policy noeviction:内存空间满时的处理策略,有以下几种:
- volatile-lru:在拥有过期时间的键中,使用LRU方式淘汰
- allkeys-lru:全部键使用LRU方式淘汰
- volatile-random:拥有过期时间的键中随机淘汰
- allkeys-random:全部键随机淘汰
- volatile-ttl:按生命周期所剩时间进行淘汰
- noeviction:不淘汰,要将redis作为存储时可以使用这一项,做缓存时别用这一项
maxmemory-samples 5:每一批选出几个样本,再去按照上面的策略进行淘汰,默认为5
此外,redis参数支持运行时修改,使用CONFIG命令可以在交互界面中修改参数:
1.CONFIG GET:后边跟参数名,可以获取参数当前的设置信息
2.CONFIG SET:后边跟参数名=值,设定参数的值
3.REWRITE:将设定成功的参数同步到配置文件中,如果之前这个参数有值,会覆盖之前的值
4.RESET STAT:重置计数器
redis持久机制
redis是一种内存型数据库,而他支持的持久存储是通过将数据备份到磁盘上的方式实现的,这个存储方式有两种:
1.RDB方式:就是snapshotting(快照)的方式,这种方式是redis的默认机制,特点是高效但数据容易丢失。在程序交互界面中使用两个命令可以实现这个种机制
- SAVE命令:主进程往磁盘中写入快照,此时redis服务由于主进程被占用,其他什么事都做不了了
- BGSAVE命令:开子进程在后台执行写入快照,主程序能继续提供服务
下面是配置文件中对应这种方式的配置项,放在SNAPSHOTTING段中
save 900 1
save 300 10
save 60 10000:这三段的意思就是在多久的时间内,变化的键达到多少次就执行快照,第一个参数为时间,第二个参数为次数,用这三段即达到长时间变化少时快照,也能达到短时间内变化量很大时去快照的效果
stop-writes-on-bgsave-error yes:快照失败时拒绝写入,与其丢失数据,不如先拒绝提供服务的好,yes为开启
rdbcompression yes:快照要不要压缩,yes为压缩,这个就看时磁盘空间开销大还是cpu开销大了,视情况而定
rdbchecksum yes:快照做完要不要校验,这个还是有必要的
dbfilename dump.rdb:快照名字,默认为dump.rdb
dir /var/lib/redis:快照存放路径,默认为/var/lib/redis
2.AOF方式:就是用追加的方式,类似于mysql的二进制日志方式,BGREWRITEAOF命令为执行AOF方式的备份,这个方式的机制为AOF文件重写,他会直接读取内存,将多次执行的命令转换为一个简单实现结果的命令,再去存入磁盘,比如让一个数自增1000次,挺麻烦,而结果却是一个简单的数字,这时就将这个自增1000次的指令,重写成直接生成这个数字的命令,在重放时会大大缩短执行时间。
下面为AOF的相关配置,在配置文件中的APPEND ONLY MODE段
appendonly no:AOF功能默认时关闭的,要使用时改为yes即可
appendfilename "appendonly.aof":快照名,存放的位置是在SNAPSHOTTING段中的dir定义的
appendfsync always|everysec|no:每次执行追加的时间,always表示有改变就去同步到磁盘,everysec表示每秒钟保存一次,no表示内核决定什么时候保存
no-appendfsync-on-rewrite no:在rewrite时不同步,no为同步,yes为不同步,同步会增加写入操作,因为rewrite完之后还得再次去同步,但是不同步万一数据丢失了就不太好了,所以为了数据安全还是最好将这项目设定为no
auto-aof-rewrite-percentage 100:100表示百分之百,就是变化量达到元数据的百分之百时自动同步
auto-aof-rewrite-min-size 64mb:上面这个设定有个弊端就是当数据量很小时候变化量很容易达到100,所以同步的频率会很高,但是没有这个必要,所以这条加个限定就是当数据量小于64m时不去同步,两个条件一起满足才会去同步
redis的主从
redis也可以像mysql一样实现主从,过程相对于Mysql来说更加简单,步骤如下:
1.环境:
- 时间同步,关闭selinux和firewalld
- 主节点:172.16.200.108,使用centos7.3系统,redis-3.2.3
- 从节点1:172.16.200.109,其他同上
- 从节点2:172.16.200.120,同上
- 从节点3:172.16.200.107,同上
2.在主节点上设置认证
[root@localhost ~]# vim /etc/redis.conf
bind 0.0.0.0
[root@localhost ~]# service redis start
[root@localhost ~]# redis-cli
127.0.0.1:6379> CONFIG SET requirepass "123"
127.0.0.1:6379> CONFIG REWRITE
3.在几个从节点上添加主节点
[root@localhost ~]# vim /etc/redis.conf
bind 0.0.0.0
[root@localhost ~]# service redis start
[root@localhost ~]# redis-cli
127.0.0.1:6379> CONFIG SET masterauth 123
127.0.0.1:6379> CONFIG REWRITE
OK
4.验证
在主节点上执行info replication命令,查看复制集群状态
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:3
slave0:ip=172.16.200.107,port=6379,state=online,offset=365,lag=1
slave0:ip=172.16.200.120,port=6379,state=online,offset=365,lag=1
slave1:ip=172.16.200.109,port=6379,state=online,offset=365,lag=1
master_repl_offset:365
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:364
可以看到,此节点为主,三个从节点的信息都显示的很清楚,证明配置成功了。
我们来看下配置文件中关于主从的配置,在REPLICATION段中
slave-serve-stale-data yes:表示当主节点宕机时,从节点的数据还能不能继续提供服务
slave-read-only yes:从节点只读
repl-diskless-sync no:是否做基于磁盘的同步,yes为无磁盘复制,内存中将数据构建好就直接可以同步给从了,不需要像保存到磁盘中
repl-diskless-sync-delay 5:延迟5秒凑够一波数据后在发送给从
slave-priority 100:表示当前从节点的优先级,这个优先级用于主节点宕机时,对比别的从节点,谁的优先级高谁就成为主节点,优先级数字越小越高,0表示不能当主节点。
min-slaves-to-write 3:至少有三个从节点在线才允许主节点写入
min-slaves-max-lag 10:落后10秒的从节点不算做一个在线的从节点,对应上面这条配置,这两条默认是注释的,所以不必在意从节点会少于3个
slave-announce-ip 5.5.5.5和slave-announce-port 1234:表示集群中向别的节点发送数据时候使用的ip和端口,这两条默认是注释的,所以系统自动选择使用哪个ip和端口。
redis高可用
redis主节点高可用服务有自带的,叫做redis-sentinel,他的配置文件为/etc/redis-sentinel.conf ,这个配置文件会根据集群的环境自动修改,不过一些参数还是要配置的。当主节点宕机时,会自动我们需要在每个节点上配置好,然后启用redis-sentinel服务。
步骤
1.环境,还是刚才的主从环境
2.在每个节点上配置/etc/redis-sentinel.conf,大致需要配置的选项都写在了下边:
- bind 0.0.0.0 :这个默认没有,但是不写的话会自动启用安全机制,限制互相之间的通信,所以将他写在prot选项下面就行,这里就奔放的写0.0.0.0了
- sentinel monitor mymaster 172.16.200.108 6379 2 :设置监控的集群名字叫mymaster,然后主节点的ip和端口,2表示有几个从节点同意一个从节点可以成为主节点,这个节点才能成功成为主节点。
- sentinel auth-pass mymaster 123 :设置监控集群的密码
- sentinel down-after-milliseconds mymaster 50 :主观down,就是这个节点多久没有收到一个另一个节点的消息,就认为他宕了
- sentinel parallel-syncs mymaster 1:并行同步的从节点个数,设置高了
- sentinel failover-timeout mymaster 180000:故障转移多少时间没成功,就去开始下一轮转移
- sentinel notification-script <master-name> <script-path>:通知脚本设置,当有节点宕掉时,通过什么方式通知管理员,可以时邮件短信等方式,这里就不设置了
- logfile /var/log/redis/sentinel.log:日志位置
3.每个节点都启动redis-sentinel
[root@localhost ~]# service redis-sentinel start
[root@localhost ~]# ss -tnl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:26379 *:*
LISTEN 0 128 127.0.0.1:6379 *:*
此时,我们看到redis的6379端口和sentinel的26379端口都已经启动了。
4.验证
我们可以使用redis-cli -h 26379 去连上sentinel管理端口去查看当前的信息,有如下几个命令:
SENTINEL masters:查看当前主节点信息
SENTINEL slaves <MASTER_NAME>:查看当前集群名称中从节点的信息
SENTINEL failover <MASTER_NAME>:手动切换集群的主节点
SENTINEL get-master-addr-by-name <MASTER_NAME>:
所以我们从主节点登陆上去验证以下:
[root@localhost etc]# redis-cli -p 26379
127.0.0.1:26379> sentinel masters
1) 1) "name"
2) "mymaster"
3) "ip"
4) "172.16.200.108"
5) "port"
6) "6379"
...
从显示信息可以看出来,现在只有一个集群(因为只有一个1))当前的主节点为172.16.200.108,集群名字叫做mymaster,还有很多信息这里就不显示了
查看从节点信息:
127.0.0.1:26379> sentinel slaves mymaster
1) 1) "name"
2) "172.16.200.120:6379"
3) "ip"
4) "172.16.200.120"
...
2) 1) "name"
2) "172.16.200.109:6379"
3) "ip"
4) "172.16.200.109"
可以看到当前从节点有三个,各自的信息都列了出来
我们还可以手动切换主节点
127.0.0.1:26379> sentinel failover mymaster
OK
127.0.0.1:26379> sentinel masters
1) 1) "name"
2) "mymaster"
3) "ip"
4) "172.16.200.109"
5) "port"
6) "6379"
...
127.0.0.1:26379> sentinel slaves mymaster
1) 1) "name"
2) "172.16.200.108:6379"
3) "ip"
4) "172.16.200.108"
切换完成后我们看到当前的主节点变成172.16.200.109了,而之前的主节点变为从节点了。
5.模拟故障
当前的主节点为172.16.200.109,我们将之上的redis服务手动关闭,然后查看高可用系统的处理情况:
在172.16.200.109上,关闭redis
[root@localhost ~]# service redis stop
然后查看当前集群主节点
127.0.0.1:26379> sentinel masters
1) 1) "name"
2) "mymaster"
3) "ip"
4) "172.16.200.107"
我们看到主节点已经变成200.107了,再次重启手动宕掉的节点,查看从节点
127.0.0.1:26379> sentinel slaves mymaster
1) 1) "name"
2) "172.16.200.109:6379"
3) "ip"
4) "172.16.200.109"
5) "port"
6) "6379"
7) "runid"
...
看到之前宕机的109节点上线后变为从节点继续运行了,工作一切正常,实验成功!@=