Redis Cluster 3.0.5 集群实战

来源:互联网 发布:终极斗士 知乎 编辑:程序博客网 时间:2024/06/10 13:06

一、说明


redis 3.0 集群功能出来已经有一段时间了,目前最新稳定版是3.0.5,我了解到已经有很多互联网公司在生产环境使用,比如唯品会、美团等等,刚好公司有个新项目,预估的量单机redis无法满足,开发又不想在代码层面做拆分,所以就推荐他们尝试一下redis集群,下面做了一些相关笔记,以备后用。


二、环境


1、redis节点


10.10.2.70:6300 10.10.2.70:6301 主从

10.10.2.71:6300 10.10.2.71:6301 主从

10.10.2.85:6300 10.10.2.85:6301 主从


2、redis版本


Redis version 3.0.5


三、安装配置


1、安装redis


wget http://download.redis.io/releases/redis-3.0.5.tar.gz

tar -zxvf redis-3.0.5.tar.gz

cd redis-3.0.5

make

cp redis-3.0.5/src/redis-trib.rb /bin/

cp redis-3.0.5/src/redis-server /bin/

cp redis-3.0.5/src/redis-cli /bin/


2、安装ruby及ruby的redis模块


yum -y install ruby rubygems

gem install redis --version 3.0.5


3、内核调优


echo never > /sys/kernel/mm/transparent_hugepage/enabled

echo "vm.overcommit_memory = 1" >> /etc/sysctl.conf

sysctl -p


4、建立目录


mkdir /data/redis/6300 -p

mkdir /data/redis/6301


5、撰写redis配置文件(cp配置文件注意修改端口)


vim /etc/redis_6300.conf

daemonize yes

port 6300

tcp-backlog 511

timeout 0

tcp-keepalive 0

loglevel notice

maxmemory 10gb

databases 16

dir /data/redis/6300

slave-serve-stale-data yes

loglevel notice

logfile "/data/redis/6300/redis_6300.log"

#slave只读

slave-read-only yes

#not use default

repl-disable-tcp-nodelay yes

slave-priority 100

#打开aof持久化

appendonly yes

#每秒一次aof写

appendfsync everysec

#关闭在aof rewrite的时候对新的写操作进行fsync

no-appendfsync-on-rewrite yes

auto-aof-rewrite-min-size 64mb

lua-time-limit 5000

#打开redis集群

cluster-enabled yes

cluster-config-file /data/redis/6300/nodes-6300.conf

#节点互连超时的阀值(单位毫秒)

cluster-node-timeout 15000

#一个主节点在拥有多少个好的从节点的时候就要割让一个从节点出来给其他没有从节点或者从节点挂掉的主节点

cluster-migration-barrier 1

#如果某一些key space没有被集群中任何节点覆盖,最常见的就是一个node挂掉,集群将停止接受写入

cluster-require-full-coverage no

#部署在同一机器的redis实例,把auto-aof-rewrite搓开,防止瞬间fork所有redis进程做rewrite,占用大量内存

auto-aof-rewrite-percentage 80-100

slowlog-log-slower-than 10000

slowlog-max-len 128

notify-keyspace-events ""

hash-max-ziplist-entries 512

hash-max-ziplist-value 64

list-max-ziplist-entries 512

list-max-ziplist-value 64

set-max-intset-entries 512

zset-max-ziplist-entries 128

zset-max-ziplist-value 64

activerehashing yes

client-output-buffer-limit normal 0 0 0

client-output-buffer-limit slave 256mb 64mb 60

client-output-buffer-limit pubsub 32mb 8mb 60

hz 10

aof-rewrite-incremental-fsync yes


6、启动服务


redis-server /etc/redis_6300.conf

redis-server /etc/redis_6301.conf

echo "redis-server /etc/redis_6300.conf" >> /etc/rc.local

echo "redis-server /etc/redis_6301.conf" >> /etc/rc.local


7、初始化集群


#节点角色由顺序决定,先master之后是slave,本文中6300是master,6301是slave


redis-trib.rb create --replicas 1 10.10.2.70:6300 10.10.2.71:6300 10.10.2.85:6300 10.10.2.70:6301 10.10.2.71:6301 10.10.2.85:6301


8、查看集群状态


redis-trib.rb check 10.10.2.70:6300


PS:redis-trib.rb是一个ruby工具,封装了redis集群的一些命令,用这个工具操作集群非常方便,比如上面初始化集群,查看集群状态,还有添加、删除节点,迁移slot等等功能。


四、redis集群维护


A、场景1


线上的集群已经有瓶颈,集群需要扩容,比如我们已经准备了一主一从(10.10.2.85:6302、10.10.2.85:6303),如下:


1、添加一个主节点



10.10.2.85:6302是要加的新节点,10.10.2.70:6300是集群中已存在的任意节点。


2、给主节点添加从节点




--slave 指定要加的是从节点,--master-id 指定这个从节点的主节点ID,10.10.2.85:6303是需要新加的从节点,10.10.2.70:6300是集群已存在的任意节点。


3、迁移一些slot给新节点




B、场景二


上面的例子是集群扩容,相对的,由于各种原因集群可能也需要缩容,下面的例子把上文扩容的节点下线,步骤如下:


1、迁移这个节点的slot到其他节点(有slot的节点是不可以直接下线的)




2、然后查看10.10.2.85:6302这个maser上已经没有slot了




3、下线slave节点




4、下线master节点




C、场景三


集群中一个节点的master挂掉,从节点提升为主节点,还没有来的急给这个新的主节点加从节点,这个新的主节点就又挂掉了,那么集群中这个节点就彻底不可以用了,为了解决这个问题,我们至少保证每个节点的maser下面有两个以上的从节点,这样一来,需要的内存资源或者服务器资源就翻倍了,有没有一个折中的方法呢,答案是肯定的,还节点上文配置文件中的cluster-migration-barrier参数不,我们只需要给集群中其中一个节点的master挂多个从库,当其他节点的master下没有可用的从库时,有多个从库的master会割让一个slave给他,保证整个集群的可用性。


1、给10.10.2.70:6300 10.10.2.70:6301 这组节点下面加一个从库10.10.2.85:6302




2、把10.10.2.71:6300 10.10.2.71:6301这组的从节点停掉


redis-cli -h 10.10.2.71 -p 6301 shutdown


3、查看10.10.2.85:6302这个节点是否成为10.10.2.71:6300的从库




五、cluster相关命令




参考文章:

http://www.redis.cn/topics/cluster-tutorial.html

http://www.redis.cn/topics/cluster-spec.html

http://redisdoc.com/topic/cluster-tutorial.html