Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。redis3.0.2开始支持了群集架构。

目前redis支持的cluster特性(已测试):

1):节点自动发现

2):slave->master 选举,集群容错

3):Hot resharding:在线分片

4):集群管理:cluster xxx

5):基于配置(nodes-port.conf)的集群管理

6):ASK 转向/MOVED 转向机制.


群集架构如图所示,为类似P2P的结构:

wKiom1XAHamAAKnaAAGEwXnBz08566.jpg

架构细节:

(1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.

(2)节点的fail是通过集群中超过半数的节点检测失效时才生效.

(3)客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可

(4)redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护node<->slot<->value



 redis-cluster选举:容错


wKiom1XAHZWAkiLtAAEcQpIDk1E806.jpg

(1)领着选举过程是集群中所有master参与,如果半数以上master节点与master节点通信超过(cluster-node-timeout),认为当前master节点挂掉.

(2):什么时候整个集群不可用(cluster_state:fail)? 

    a:如果集群任意master挂掉,且当前master没有slave.集群进入fail状态,也可以理解成集群的slot映射[0-16383]不完成时进入fail状态. ps : redis-3.0.0.rc1加入cluster-require-full-coverage参数,默认关闭,打开集群兼容部分失败.

    b:如果集群超过半数以上master挂掉,无论是否有slave集群进入fail状态.

  ps:当集群不可用时,所有对集群的操作做都不可用,收到((error) CLUSTERDOWN The cluster is down)错误


部署步骤:

2台服务器:10.10.0.1和10.10.0.2

redis集群每个机子都需要配置:

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

#tar -zxvf redis-3.0.2.tar.gz

#cd redis-3.0.2

#make

#make install

#echo vm.overcommit_memory = 1 >> /etc/sysctl.conf    修改内存检测方式允许使用所有物理内存,防止高负载时性能严重下降

#echo vm.dirty_bytes=33554432 >>  /etc/sysctl.conf    为了解决aof导致的busy问题,让系统从内存往硬盘刷数据的大小由默认的内存的10%减小到32M

#echo never > /sys/kernel/mm/transparent_hugepage/enabled   关闭巨透明页,centos6以上版本需要,如果改了需要重启,否则不用重启

#sysctl -p                                                                            立刻生效

#vim /etc/profile                                                                配置环境变量,方便快捷调用命令

export REDIS_HOME=/usr/local/redis

export PATH=$PATH:$REDIS_HOME/src

#source /etc/profile                                                            立刻生效

#mv /root/redis-3.0.2 /usr/local/redis

#cp  /usr/local/redis/redis{.conf,7000.conf}     复制成集群需要的端口号命名的conf,需要复制多份,注意用端口号区分,一台上起7000,7001,7002  3个redis实例

#vim /usr/local/redis/redis7000.conf 以其中一个配置文件为例,其他的conf就是改里面的端口号

daemonize yes                  修改作为后台服务启动
pidfile /var/run/redis7000.pid  单独的pid
port  7000                   集群时改成不同的端口号
bind  本机ip                    监听本机ip
tcp-keepalive 60                 改成官方建议值
logfile /var/log/redis7000.log   日志存放位置,以端口号命名
dbfilename   dump7000.db        快照文件名,改为以端口命名
dir  /usr/local/redis/          快照绝对路径
maxmemory 5000mb                 限制单redis最大内存,视情况改,要给系统留出4G左右的空余
maxmemory-policy volatile-lru   到达最大内存后的删除缓存策略为删除过期key
appendonly yes             开启AOF同步模式,类似于mysql的binlog
appendfilename "appendonly7000.aof" 同步文件名
cluster-enabled yes            开启集群
cluster-config-file /usr/local/redis/nodes-7000.conf 集群节点配置文件绝对路径,以端口号命名,由redis自动维护
cluster-node-timeout 5000        节点超时时间

#vim /etc/rc.local开机自动启动

echo never > /sys/kernel/mm/transparent_hugepage/enabled
/usr/local/redis/src/redis-server /usr/local/redis/redis7000.conf
/usr/local/redis/src/redis-server /usr/local/redis/redis7001.conf
/usr/local/redis/src/redis-server /usr/local/redis/redis7002.conf

#shutdown -r 0                                             如果设置了大页面,则需要重启

#yum install ruby rubygems -y                    安装创建群集命令依赖的ruby环境

#wget http://rubygems.global.ssl.fastly.net/gems/redis-3.2.1.gem

#gem install -l ./redis-3.2.1.gem


在任意一台机子上创建用集群的命令:

#/usr/local/redis/src/redis-trib.rb create --replicas 1 10.10.0.1:7000 10.10.0.1:7001 10.10.0.1:7002 10.10.0.2:7000 10.10.0.2:7001 10.10.0.2:7002

在任意一个节点上运行上面的命令创建集群,其中--replicas 1的意思是1主有1从,一共随机创建3主3从

运行成功会有提示预览主从状态,并等待输入yes

输入yes后会出现 [OK] All 16384 slots covered.  表示集群运行成功



日常维护:

#/usr/local/redis/src/redis-trib.rb check 10.10.0.1:7000                  查看集群状态,任意节点上看就行

#redis-cli -h 10.10.0.1 -p 7000 cluster nodes | grep master |sort -k2    看主节点状态

#redis-cli -h 10.10.0.1 -p 7000 info                                                           可以查看这个实例信息,可用于监控

动态调整redis参数:

#redis-cli -h 10.10.0.1  -p 7000         连接进redis实例 

>config get *                 查询所有可设置的项目和值

>config set x y         设置要改的项目x为值y

redis基准性能测试:

#redis-benchmark -q -h 10.10.0.1 -p 7000 -c 500 -n 100000 

500个并发连接,100000个请求,检测host为10.10.0.1端口为7000的redis实例性能


如果要重新创建群集:

只要把各个nodesxxxx.conf文件删掉就可以,注意重新创建的群集要都为空,清空已有数据进redis各个实例里运行flushall,然后再用创建群集的命令就可以重新创建。


需要扩容主节点和从节点的步骤略过,请参见官方文档