redis集群
1、redis集群安装
部署节点信息
192.168.10.11:7000, 192.168.10.12:7000, 192.168.10.13:7000, 192.168.10.14:7000, 192.168.10.15:7000, 192.168.10.16:7000
下载、解压和编译安装
wget https://download.redis.io/releases/redis-4.0.14.tar.gz tar xzf redis-4.0.14.tar.gz cd redis-4.0.14 make make PREFIX=/usr/local/redis install mkdir /usr/local/redis/conf cp redis-4.0.14/redis.conf /usr/local/redis/conf
修改各节点的配置文件
bind 192.168.10.11
port 7000
daemonize yes
pidfile /var/run/redis_7000.pid
logfile "/usr/local/redis/logs/redis_7000.log"
dbfilename dump_7000.rdb
dir /usr/local/redis/dump
appendonly yes
appendfilename "appendonly_7000.aof"
cluster-enabled yes
cluster-config-file nodes-7000.conf
创建日志、数据目录,启动redis服务
mkdir -p /usr/local/redis/logs mkdir -p /usr/local/redis/dump cd /usr/local/redis/bin/ ./redis-server ../conf/redis.conf
通过命令手动创建reids集群
创建新的集群环境
./redis-cli -h 192.168.10.11 -p 7000 -c
192.168.10.11:7000> CLUSTER MEET 192.168.10.11:7000
192.168.10.11:7000> CLUSTER MEET 192.168.10.12:7000
192.168.10.11:7000> CLUSTER MEET 192.168.10.13:7000
192.168.10.11:7000> CLUSTER MEET 192.168.10.14:7000
192.168.10.11:7000> CLUSTER MEET 192.168.10.15:7000
192.168.10.11:7000> CLUSTER MEET 192.168.10.16:7000
192.168.10.11:7000> CLUSTER NODES
为三个主节点分配虚拟槽点
./redis-cli -h 192.168.10.11 -p 7000 cluster addslots {0..5461} ./redis-cli -h 192.168.10.12 -p 7000 cluster addslots {5462..10922} ./redis-cli -h 192.168.10.13 -p 7000 cluster addslots {10923..16383}
设置主从关系
./redis-cli -h 192.168.10.14 -p 7000 cluster replicate b3435b6445e68286f75240bf42a2a49f19aa9d93 #192.168.10.11的ID ./redis-cli -h 192.168.10.15 -p 7000 cluster replicate 538666dff80471622e2dce6ad19fded56d4b571c #192.168.10.12的ID ./redis-cli -h 192.168.10.16 -p 7000 cluster replicate 9021cfc9e79eeefb5d2ee14f202d51df29c63740 #192.168.10.13的ID
利用redis-trib.rb自动创建redis集群
安装ruby环境
wget https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.8.tar.gz tar -zxvf ruby-2.3.8.tar.gz ./configure --prefix=/usr/local/ruby && make && make install ln -s /usr/local/ruby/bin/* /usr/local/bin/ wget https://rubygems.org/downloads/redis-3.3.5.gem gem install redis-3.3.0.gem gem list redis
创建集群,redis-trib.rb在redis源码包src目录下
./redis-trib.rb create --replicas 1 192.168.10.11:7000 192.168.10.12:7000 192.168.10.13:7000 192.168.10.14:7000 192.168.10.15:7000 192.168.10.16:7000
2、redis键值过期
Keys的过期时间使用Unix时间戳存储,即使实例不可用,当前时间戳也不会停止。
主动过期:redis会每秒10次利用一个基于概率的算法进行主动删除,随机选取20个keys,删除所有已过期的keys,如果expired keys超过25%,继续选取20个keys。
被动过期:当客户端访问已过期的key时,redis会立即将它删除。
RDB:执行SAVE或BGSAVE时,过期键不会被保存在rdb文件中。
AOF:当key过期但未删除,会被正常记录到aof文件中,当过期key被释放,DEL也会被同步到aof文件中;执行 BGREWRITEAOF时 ,数据库键中过期的键不会被记录到aof文件中。
复制:为了保持一致性,当key被过期时,DEL将会随着AOF文字整合到所有slaves。slaves连接到master不会独立过期keys,当slave被选为master时能够独立地过期key,然后成为master。
3、redis复制
配置:
配置项:slaveof <masterip> <masterport>
信息查询:INFO REPLICATION
完全重新同步:
当从实例第一次连接到主实例时,总是需要进行完全重新同步。在进行完全重新同步时,为了将所有数据复制到从实例中,主实例将数据转储到一个RDB文件(保存到磁盘,占用内存),然后发送给从实例;从实例接受到RDB文件后,会先将内存中的数据清空,然后将RDB文件中的数据导入。主实例上的复制过程时完全异步的,因此不会阻碍请求的处理。
部分重新同步:
当主实例与从实例断开连接后,主实例会将期间所做的操作记录到命令积压缓冲区replication backlog中;当从实例重连后使用PSYNC命令来发送最后一个的master_replid和最后一个master_repl_offset;主实例首先会检查请求中的master_replid是否与自己的一致,然后再检查请求中的offset能否从replication backlog中获取,如果master_repl_offset在缓冲区范围内,主实例将从master_repl_offset开始到队列结束的数据传给slave,从而达到同步,降低了使用全量复制的开销。否则,如果主实例在连接断开期间,写入的命令数量超出了缓冲区的容量,那么部分重新同步就会被拒绝,完全重新同步将会开启。
backlog缓冲区的大小默认事1M,可以利用以下公式估算缓冲区合适大小:
t*(master_repl_offset2-master_repl_offset1)/(t2-t1)
t是断开连接的时间。公式是先用两个时间节点的偏移量除以时间差算出平均流量,然后乘以断开时间。
4、持久化
RDB持久化方式:
save 60 10000,60秒内有1000个键发生了改变,则进行一次RDB快照,可以使用多条策略来控制持久化频率。
RDB可以看作是redis在某一时间点上的快照,适用于备份和灾难恢复。在执行持久化保存rdb文件时,redis调用fork创建出一个子进程,子进程将数据保存到一个临时文件(tem-<redis-pid>.rdb)中,当子进程完成转储过程后,这个临时文件会被重命名为dbfilename定义的名字并覆盖旧rdb文件。由于使用了写时复制(copy-on-write),所有子进程不会使用redis占用同等的内存。
AOF持久化方式:
appendonly yes,开启AOF功能
AOF的运作方式是不断地将命令追加到aof文件的末尾。首先命令会被写入缓冲区,然后通过系统调用fsync()将缓冲区命令刷新到磁盘中,这是一个阻塞调用,只有磁盘设备反馈缓冲区命令写入完成后才会返回。redis可以在不打断客户端情况下,对aof文件重写。
RDB和AOF结合使用(redis4.x):
aof-use-rdb-preamble yes,开启rdb和aof混合功能。
在重写aof文件时,redis首先会把数据集以RDB格式转储到内存中并作为aof文件的开始部分,在重写之后,redis继续使用传统的AOF格式记录写入的命令。
RDB优劣性:
- RDB文件是一个很简洁的单文件,它保存了某个时间点的Redis数据,很适合用于做备份。你可以设定一个时间点对RDB文件进行归档,这样就能在需要的时候很轻易的把数据恢复到不同的版本。
- RDB很适合用于灾备。单文件很方便就能传输到远程的服务器上。
- RDB的性能很好,需要进行持久化时,主进程会fork一个子进程出来,然后把持久化的工作交给子进程,自己不会有相关的I/O操作。
- 比起AOF,在数据量比较大的情况下,RDB的启动速度更快。
- RDB容易造成数据的丢失。假设每5分钟保存一次快照,如果Redis因为某些原因不能正常工作,那么从上次产生快照到Redis出现问题这段时间的数据就会丢失了。
- RDB使用
fork()
产生子进程进行数据的持久化,如果数据比较大的话可能就会花费点时间,造成Redis停止服务几毫秒。如果数据量很大且CPU性能不是很好的时候,停止服务的时间甚至会到1秒。
AOF优劣性:
- 可以制定不同的fsync策略:no fsync、everysec fsync一次和always fsync。默认是每秒fsync一次。这意味着你最多丢失一秒钟的数据。
- AOF日志文件是一个只进行追加的文件。即使由于某些原因(磁盘空间已满,写的过程中宕机等等)未执行完整的写入命令,你也也可使用redis-check-aof工具修复这些问题。
- 当AOF文件太大时,Redis会自动在后台进行重写。重写很安全,因为重写是在一个新的文件上进行,同时Redis会继续往旧的文件追加数据。新文件上会写入能重建当前数据集的最小操作命令的集合。当新文件重写完,Redis会把新旧文件进行切换,然后开始继续把数据写到新文件上。
- AOF把操作命令以简单易懂的格式一条接一条的保存在文件里,很容易导出来用于恢复数据。假设你不小心执行了FLUSHALL命令,但只要AOF文件未被重写,那么只要停止服务器,移除AOF文件末尾的FLUSHALL命令,并重启Redis,就可以将数据集恢复到FLUSHALL执行之前的状态。
- 对于相同的数据集来说,AOF 文件的体积通常要大于 RDB 文件的体积。
- 根据所使用的 fsync 策略,AOF的速度可能会慢于RDB。在一般情况下,每秒fsync的性能依然非常高,而关闭fsync可以让AOF的速度和RDB一样快,即使在高负荷之下也是如此。
5、redis阻塞
6、Linux优化
# 内核可以超量使用内存直到用完为止 vm.overcommit_memory = 1 # 物理内存使用90%后,才被允许使用swap vm.swappiness = 10 # 关闭大内存页THP,开启可以加快fork子进程的速度,但会大幅度加重写期间父进程内存消耗 echo never > /sys/kernel/mm/transparent_hugepage/enabled # 最大连接数,TCP backlog,连接队列深度 echo 65535 > /proc/sys/net/core/somaxconn # 资源限制 ulimit 设置
7、安全优化
不要暴漏在外网
不要使用默认端口6379
不要以root用户启动
设置强规则密码
bind不要设置为0.0.0.0或""