一、Redis Cluster简单介绍
Redis集群搭建的方式有多种,例如使用Redis主从复制+Sentinel高可用集群、zookeeper等,但从Redis 3.0之后版本支持Redis-cluster集群,Redis-Cluster采用无中心结构,每个节点保存数据和整个集群状态,每个节点都和其他所有节点连接。
其Redis-cluster结构图如下:
Redis Cluster集群的运行机制:
所有的Redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽。
节点的Failover是通过集群中超过半数的节点检测失效时才生效。
客户端与Redis节点直连,不需要中间Proxy层。客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可(默认slave从节点只提供备份)。
Redis-cluster把所有的物理节点映射到[0-16383]Slot上(不一定是平均分配),Cluster 负责维护nodeslotvalue。
Redis集群预分好16384个桶,当需要在 Redis 集群中放置一个 key-value 时,根据 CRC16(key) mod 16384的值,决定将一个key放到哪个槽中。
二、背景
为了保证Redis集群的高可用性,即使使用Sentinel哨兵实现Failover自动切换,Redis每个实例也是全量存储,每个Redis存储的内容都是完整的数据,比较浪费内存。为了最大化利用内存,可以采用数据分片的形式,保存到不同的Redis实例上,这就是分布式存储。即每台redis存储不同的内容,Redis Cluster集群架构正是满足这种分布式存储要求的一种体现。
Redis Cluster集群提供了以下两个好处:
将数据自动切分(split)到多个节点的能力。
当集群中的一部分节点失效或者无法进行通讯时, 仍然可以继续处理命令请求的能力。
三、环境准备
3.1 主机环境
[[email protected] ~]# cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)
[[email protected] ~]# uname -m
x86_64
3.2 主机规划
每台主机安装两个Redis实例,一主、一从。
其缓存架构图如下:
四、部署Redis
4.1 安装Redis软件
#下载redis
[[email protected] server]# cd /server/tools && wget http://download.redis.io/releases/redis-3.2.12.tar.gz
#解压并进入src目录
[[email protected] server]# tar xf redis-3.2.12.tar.gz && cd redis-3.2.12
#编译软件,参数MALLOC=jemalloc,2.4.4以上版本默认的内存分配器(可省略)
[[email protected] redis-3.2.12]# make
#将软件安装到指定目录下
[[email protected] redis-3.2.12]# make PREFIX=/application/redis-3.2.12 install
#创建软链接
[[email protected] redis-3.2.12]# ln -s /application/redis-3.2.12 /application/redis
#修改PATH环境变量并使其生效
[[email protected] redis]# echo 'PATH=/application/redis/bin:$PATH'>>/etc/profile && source /etc/profile
#检查安装结果
[[email protected] redis]# ll bin
-rwxr-xr-x 1 root root 2432992 Apr 10 13:34 redis-benchmark
-rwxr-xr-x 1 root root 25176 Apr 10 13:34 redis-check-aof
-rwxr-xr-x 1 root root 5192440 Apr 10 13:34 redis-check-rdb
-rwxr-xr-x 1 root root 2586080 Apr 10 13:34 redis-cli
lrwxrwxrwx 1 root root 12 Apr 10 13:34 redis-sentinel -> redis-server
-rwxr-xr-x 1 root root 5192440 Apr 10 13:34 redis-server
命令解释:
redis-server:Redis 服务端的启动程序 。
redis-cli:Redis客户端程序,也可以用 telnet 根据其纯文本协议来操作Redis缓存。
redis-benchmark:Redis 性能测试工具,测试 Redis 在当前系统下的读写性能。
redis-check-aof:数据修复。
redis-check-dump:检查导出工具。
4.2 编辑Redis配置文件
[[email protected] redis]# mkdir /application/redis/conf
[[email protected] redis]# cp /server/tools/redis-3.2.12/redis.conf ./conf/
[[email protected] redis]# cd conf
[[email protected] redis]# vim redis.conf
#是否后台运行
daemonize yes
#默认端口
port 6379
#日志文件位置
logfile /var/log/redis.log
#持久化文件存储位置
dir /data/6379
#RDB持久化数据文件
dbfilename dump.rdb
4.3 启动Redis服务
4.3.1 启动前优化内存分配策略
有三种方法进行修改,但是需要root权限:
sysctl vm.overcommit_memory=1
echo ‘vm.overcommit_memory=1‘ >>/etc/sysctl.conf && sysctl -p
echo 1 >/proc/sys/vm/overcommit_memory
Overcommit_Memory参数可选值含义:
0 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
1 表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
2 表示内核允许分配超过所有物理内存和交换空间总和的内存。
4.3.2 启动redis-server
#启动服务
[[email protected] redis]# redis-server /application/redis/conf/redis.conf &
#追加启动命令到/etc/rc.local文件中
echo -e '#start redis-server\nredis-server /application/redis/conf/redis.conf &' >>/etc/rc.local
#添加执行权限
[[email protected] ~]# chmod +x /etc/rc.d/rc.local
4.3.3 检查服务
#默认端口6379
[[email protected] redis]# lsof -i :6379
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
redis-ser 10835 root 4u IPv4 26242 0t0 TCP localhost:6379 (LISTEN)
4.3.4 客户端连接测试
#交互式简单存取数据
[[email protected] redis]# redis-cli
127.0.0.1:6379> set name oldboy
OK
127.0.0.1:6379> get name
"oldboy"
#非交互式简单存取数据:类似mysql -e参数
[[email protected] redis]# /application/redis/bin/redis-cli set name oldboy
OK
[[email protected] redis]# /application/redis/bin/redis-cli get name
"oldboy"
#删除数据
[[email protected] redis]# /application/redis/bin/redis-cli del name
注:也可以通过telnet命令实现redis交互式存取数据,类似操作memcached缓存。
五、构建Redis Cluster集群
Redis Cluster集群正常工作至少需要3个主