- 添加新的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启动日志里面基本上都可以看到警告的提示