• 添加新的master
redis-trib.rb add-node 192.168.1.107:7007 192.168.1.107:7001
将一个新的配置好的7007实例添加到redis cluster中成为一个新的节点

redis-trib.rb check 192.168.1.107:7007
可以监测是否已经成功加入,发现新加入的master没有分配slots,毫无疑问是无法处理数据路由的,此时我们需要reshard来重新balance hash slots,执行如下命令:

redis-trib.rb reshard 192.168.1.107:7001  (redis cluster中的任意一个)
How many slots do you want to move (from 1 to 16384)? 4096  (需要输入slots的数量,用总共16384除以master节点数即可,16384/4=4096)
What is the receiving node ID? 0453f3cdd6ad45b52941c9635e834b20b7ce50c8  (之前check命令会在每个node前面有一个ID,这里需要输入新加入的为0的要接受slots的节点)
最后一步输入  all是对所有节点, 或者输入部分节点然后输入 done 来完成reshard操作
  • 添加新的slave

执行以下命令来添加一个slave节点:

redis-trib.rb add-node --slave --master-id 397bc7ae835720ff7ac3f2fc174bd5abdc8bb20d 192.168.1.105:7008 192.168.1.107:7001

前一个redis实例地址是需要加入的,后面的redis实例是redis cluster中已经存在的
  • 删除node
    需要先通过resharding将节点所保存的数据转移到其他节点,确保该node数据为空后,才能够执行remove操作
//省略上述reshard操作,同上
redis-trib.rb del-node 192.168.1.107:7007 0453f3cdd6ad45b52941c9635e834b20b7ce50c8

当remove掉slot为0的master后,对应的slave将会自动挂到其他master节点上。具体的redis-trib.rb的操作可以查看帮助命令

redis-trib.rb help

为了保障redis cluster的高可用性,我们可以添加一些冗余的slave,当有其他master的slave宕机,那些冗余的slave会自动迁移

优化思路以及linux内核参数优化:

  • fork耗时跟redis主进程的内存有关系,一般控制redis的内存在10GB以内
  • 优化硬盘写入速度,建议采用SSD,不要用普通的机械硬盘,SSD,大幅度提升磁盘读写的速度
  • 在info replication中,可以看到master和slave复制的offset,做一个差值就可以看到对应的延迟量,如果延迟过多,那么就进行报警
  • 如果一个master要挂载多个slave,考虑到全量复制占用带宽资源过多,尽量用树状结构,不要用星型结构
  • linux系统参数vm.overcommit_memory
0: 检查有没有足够内存,没有的话申请内存失败
1: 允许使用内存直到用完为止
2: 内存地址空间不能超过swap + 50%

如果是0的话,可能导致类似fork等操作执行失败,申请不到足够的内存空间

cat /proc/sys/vm/overcommit_memory
echo "vm.overcommit_memory=1" >> /etc/sysctl.conf
sysctl vm.overcommit_memory=1
  • linux系统参数swapiness
cat /proc/version,查看linux内核版本

如果linux内核版本<3.5,那么swapiness设置为0,这样系统宁愿swap也不会oom killer(杀掉进程)
如果linux内核版本>=3.5,那么swapiness设置为1,这样系统宁愿swap也不会oom killer

保证redis不会被杀掉

echo 0 > /proc/sys/vm/swappiness
echo vm.swapiness=0 >> /etc/sysctl.conf
  • 最大打开文件句柄
    ulimit -n 10032 10032,不同的操作系统,版本,设置的方式都不太一样
  • tcp backlog
    cat /proc/sys/net/core/somaxconn
    echo 511 > /proc/sys/net/core/somaxconn

对应的每个修改在redis启动日志里面基本上都可以看到警告的提示