Redis 是一个开源的 key-value 存储系统,由于出众的性能,大部分互联网企业都用来做服务器端缓存。Redis 在3.0版本前只支持单实例模式,虽然支持主从模式、哨兵模式部署来解决单点故障,但是现在互联网企业动辄大几百G的数据,可完全是没法满足业务的需求,所以,Redis 在 3.0 版本以后就推出了集群模式。
Redis 集群采用了P2P的模式,完全去中心化。Redis 把所有的 Key 分成了 16384 个 slot,每个 Redis 实例负责其中一部分 slot 。集群中的所有信息(节点、端口、slot等),都通过节点之间定期的数据交换而更新。
Redis 客户端可以在任意一个 Redis 实例发出请求,如果所需数据不在该实例中,通过重定向命令引导客户端访问所需的实例。
安装环境
OS: centos 7.2.1511
redis : 最新版 v4.0.1
单台redis安装
下载
wget http://download.redis.io/releases/redis-4.0.10.tar.gz
tar zxvf redis-4.0.10.tar.gz
mv redis-4.0.10 /usr/local/redis/
如果是离线安装,则需要从官网下载指定版本,然后上传到生产环境。这里安装的是最新版redis,指定安装路径 /usr/local/redis/
编译安装
cd /usr/local/redis
make
make install
安装完成,这时候会在/usr/local/bin/目录下看到redis-server、redis-cli等可执行脚本,进入看一下,如果没有,就要去解压目录复制进去了。
配置redis.conf
redis.conf在默认在安装目录下
$ vim /usr/local/redis/redis.conf
这里要修改两个地方,一个bind和daemonize就行。
要注意的点:
bind这里配置要注意,默认是只有一个127.0.0.1,这个时候只能自己连接,其他局域网内是连接不上的。所以,需要配置多个 IP ,这样就可以局域网内进行连接了。我设置的0.0.0.0,虽然这不太安全,方便我在其它地方连接。
daemonize是设置是否后台启动 Redis,默认no,正常都需要以服务形式启动 Redis,所以这里设置为yes。
可以设置密码 requirepass mypassord
redis v3.0+版本增加了保护机制,默认protected-mode yes, 这样目标机器调用可能会报错,需要设置为no
关于更多配置文件参数的解释,可以参考:https://github.com/linli8/cnblogs/blob/master/redis%E5%89%AF%E6%9C%AC.conf
启动redis
cd /usr/local/bin/
redis-server /usr/local/redis/redis.conf
测试redis服务
端口已开启:
netstat -anp | grep 6379
命令行连接:
复制代码
➜ redis redis-cli
127.0.0.1:6379> keys *
1) "city"
2) "usage"
3) "idc"
4) "region"
127.0.0.1:6379> set name jzhou
OK
127.0.0.1:6379> get name
"jzhou"
127.0.0.1:6379>
复制代码
关闭服务
可以通过杀进程的方式暴力关闭服务,也可以通过命令:
redis-cli shutdown
通过 netstat 可以看出来端口已经是TIME_WAIT状态了
以上是centos7单机部署redis的过程,下面集群搭建和上述类似,不过在目录结构和配置文件不同,当然,遇到的坑也多,主要配置集群依赖一些外部包,但说实话光搭建个集群是没有啥技术含量但。。
redis集群搭建
简介
redis-cluster架构设计
架构细节:
(1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.
(2)节点的fail是通过集群中超过半数的节点检测失效时才生效.
(3)客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可
(4)redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护node<->slot<->key
(5)Redis集群预分好16384个桶,当需要在 Redis 集群中放置一个 key-value 时,根据 CRC16(key) mod 16384的值,决定将一个key放到哪个桶中。
环境准备
Redis集群中要求奇数节点,所以至少要有三个节点,并且每个节点至少有一备份节点,所以至少需要6个redis服务实例。
这里演示的是我搭的生产环境redis集群,3台服务器,每台起3个服务,共9个节点,生产环境搭建的很顺利,但测试环境一台服务器开6个端口遇到了很多问题,各种依赖包问题,后续会说明。
三台服务器
172.28.37.29
172.28.37.30
172.18.38.219
(每台服务器redis三个端口号 7000~7002)
按照上面搭建单台redis服务的方式在三台服务器分别安装redis,从配置文件开始会有所不同。下面会说明搭建过程。
依赖包安装
注意,下述均安装最新版本,否则会和redis版本不匹配
复制代码
gcc 4.8.5 20150623 (Red Hat 4.8.5-4) (GCC)
gcc-c++
lib
zlib
ruby 2.4.4(>2.0.0)
rubugems 2.6.14.1
复制代码
撸起袖子集群搭建
1. 准备目录结构
三台机器一样,建立如下目录结构:
$ mkdir -p /usr/local/redis/redis-cluster/{7000,7001,7002}
分别进入每个端口目录创建配置文件:
cd /usr/local/redis/redis-cluster/7000 && touch redis.conf
2.redis.conf内容及解释:
复制代码
port 7000 # 端口7000,7001,7002,与目录对应
bind 172.28.37.29 #默认ip为127.0.0.1,需要改为其他节点机器可访问的ip,否则创建集群时无法访问对应的端口,无法创建集群
daemonize yes #redis后台运行
cluster-enabled yes #开启集群
cluster-config-file nodes_7000.conf #集群的配置,配置文件首次启动自动生成 7000,7001,7002
cluster-node-timeout 8000 #请求超时,默认15秒,可自行设置
appendonly yes #开启aof持久化模式,每次写操作请求都追加到appendonly.aof文件中
appendfsync always #每次有写操作的时候都同步
logfile "/data/redis/logs/redis.log" #redis服务日志
pidfile /var/run/redis_7000.pid #pidfile文件对应7000,7001,7002
复制代码
注意,上述有些配置项要对应服务和目录,三个目录按照上述配置好后,启动服务
3.启动/关闭集群服务
可以在每个服务器上写一个启动脚本start-redis.sh:
for((i=0;i<3;i++));
do /usr/local/bin/redis-server /usr/local/redis/redis-cluster/700$i/redis.conf;
done
关闭服务类似:
for((i=0;i<=2;i++));
do /usr/local/bin/redis-cli -c -h $IP -p 700$i shutdown;
done
$IP分别为三台服务器IP。
这时只是启动了9个单独的redis服务,它们还不是一个集群,下面就说明创建集群
4.创建集群
注意:在任意一台上运行 不要在每台机器上都运行,一台就够了
Redis 官方提供了 redis-trib.rb 这个工具,就在解压目录的 src 目录中
在其中一台执行:
$ cd /root/redis-4.0.10/src
$ ./redis-trib.rb create --replicas 1 172.28.37.29:7000 172.28.37.29:7001 172.28.37.29:7002 172.28.37.30:7000 172.28.37.30:7001 172.28.37.30:7002 172.18.38.219:7000 172.18.38.219:7001 172.18.38.219:7002
敲完这个命令后会提示是否按照默认的推荐方式配置集群主从,一般选yes就行了
截图中看出,推荐了4个masters,5个从节点
复制代码
>>> Creating cluster
>>> Performing hash slots allocation on 9 nodes...
Using 4 masters:
172.28.37.29:7000
172.28.37.30:7000
172.18.38.219:7000
172.28.37.29:7001
Adding replica 172.18.38.219:7001 to 172.28.37.29:7000
Adding replica 172.28.37.29:7002 to 172.28.37.30:7000
Adding replica 172.28.37.30:7002 to 172.18.38.219:7000
Adding replica 172.18.38.219:7002 to 172.28.37.29:7001
Adding replica 172.28.37.30:7001 to 172.28.37.29:7000
复制代码
下面这个显示了集群和slot分配结果
5.集群验证
参数 -C 可连接到集群,因为 redis.conf 将 bind 改为了ip地址,所以 -h 参数不可以省略,-p 参数为端口号
复制代码
[root@172-28-37-29 src]# redis-cli -c -p 7000 -h 172.28.37.29
172.28.37.29:7000> set name zhoujie
-> Redirected to slot [5798] located at 172.28.37.30:7000
OK
172.28.37.30:7000> get name
"zhoujie"
172.28.37.30:7000>
复制代码
可以看到在29的7000上设置了name,重定向到了30的7000节点。
到此为止集群搭建成功!
友情提示:
当出现集群无法启动时,删除集群配置文件,再次重新启动每一个redis服务,然后重新构件集群环境。
--------------------------------------------华丽的分割线----------------------------------------------------
redis-trib.rb命令常见用法
1)列出集群节点-cluster nodes
复制代码
[root@172-28-37-30 src]# redis-cli -h 172.28.37.30 -c -p 7000
172.28.37.30:7