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或""

posted @ 2021-01-12 09:33  houyongchong  阅读(110)  评论(0编辑  收藏  举报