为了方便讲解,笔者在实操过程中全部使用的是默认配置。
通过.conf文件配置(建议)
运行交互命令配置
节点配置
因配置文件内容比较多,读者可自行查看/usr/local/etc/redis.conf文件,下面章节只描述一些重要配置参数的作用。读者可自行试验。
服务相关
在单机环境时当建立连接后,默认选择编号为0的数据库,可以通过select命令来选择,但集群环境只有一个库。所以这个配置只适用于单机环境。
快照相关
redis快照功能,是可以被关闭的,关闭后节省了磁盘空间,但在主宕机时也增大了丢数据的风险,所以一般不是非必要情况不要关闭快照功能,redis在以下三种情况下会创建快照:
- 通过bgsave, save,shutdown命令,其中save,shutdown这两个命令是阻塞的,其间不会接收用户请求,bgsave命令会新开一个线程,异步创建快照,其间不会阻塞用户请请求;
- 当有新节点加入时,主节点也会创建快照,主节点会先执行bgsave然后再sync同步;
- flushall命令,这个命令会清除数据库中的所有数据,但如果配置了快照功能则会先生成快照,再执行fluashall命令;
save配置,触发的是bgsave命令,可以配置多个触发条件,这些条件是或的关系,用逗号分隔,redis会依次检查,只要满足前面的条件就不会再检查下一条规则是否满足了,默认配置解读如下:
- save 900 1: 如果超过每1秒有900个key发生变化(新增、修改和删除),则重写rdb文件;
- save 300 10: 如果每10秒有300个key发生变化(新增、修改和删除),则重写rdb文件;
- save 60 3600: 表示如果每60秒有10000个key发生变化(新增、修改和删除),则重写rdb文件。
增量文件
aof与rdb的区别和作用就不在细述了,可自行在网上查询,这里只提一点容易被忽略的内容,这个文件它缓存的是命令,命令会追加到AOF文件结尾。
主从相关
上面描述的的是单机配置,如果在高负载还需要多机,redis间采用的是主从复制(master-slave模式),不支持主主复制。但slave节点可以有自己的slave节点。
节点:分布式环境,会弱化服务器的概念,都会采用节点这个术语来描述,在多数分布式系统中不会存在混合部署的情况,所以可以认为节点==服务器或节点==容器。笔者在以后的文章里也都会采用节点这个术语。
性能相关
这个比较简单,多数是和数据存储方式相关,看一下下面的注释就可以理解了,后面章节会详细描述。
哨兵配置
在集群环境中,可以用哨兵监控哨兵、也可以用一个哨兵监控多个master节点(需要配置多个下面第一条的配置)、还可以用多个哨兵监控一个主数据库。配置过程如下:
- 建立sentinel.conf文件,内容为sentinel monitor mymaster 127.0.0.1 6379 30000。mymaster表示主数据库名字,启动后会自动识别从数据库,所以不需要配置从数据库。后两个参数表示IP和PORT。30000表示执行故障恢复操作需要几个哨兵同意。
- 将上述.conf路径传递给sentinel进程。redid-sentinel /path/to/sentinel.conf
集群配置
- 配置cluster-enabled yes;集群会将当前节点记录的集群状态持久化到指定文件中,默认为当前工作目录下的nodes.conf。每个节点对应的文件必须不同,必须通过cluster-config-file来修改此文件的名字;
- 通过info cluster来查看节点信息,此时节点还是孤立的;
- redis提供了redis-trib.rb的RUBY程序配置集群,它依赖gem的redis包,通过gem install redis来安装;
- 执行命令:/path/to/redis-trib.rb create —replicas 1 127.0.0.1:6380 127.0.0.1:6381……(至少6个),—replicas 1表示每个主数据库拥有的从数据库的数量;
- 执行cluster nodes可以获得集群中所有节点的信息;
- 通过cluster meet ip port向集群中添加新节点;
- 分配插槽(插槽就是key和实例的对应关系,其实现规则可参考CRC16算法实现。redis集群会分为16384个插槽)。可以用cluster slots查看插槽的分配情况,在已连接的节点上用cluster addslots 100 101 102,重新分配插槽命令如下:/path/to/redis-trib.rb reshard ip:port。(通过cluster nodes)可以获取redis实例运行的ID;
- 如果一个至少负责一个插槽的主数据库下线且没有相应的从数据库可以进行故障恢复,则整个集群就认为下线了。可以通过修改cluster-require-full-coverage no为解决这个问题;