二、集群版redis搭建
1.1. 集群原理
1.1.1. redis-cluster架构图
架构细节:
(1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.
(2)节点的fail是通过集群中超过半数的节点检测失效时才生效.
(3)客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可
(4)redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护node<->slot<->value
Redis 集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value 时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点
1.1.2. redis-cluster投票:容错
(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.安装ruby环境
redis集群管理工具redis-trib.rb依赖ruby环境,首先需要安装ruby环境:
安装ruby
yum install ruby
yum install rubygems
1.安装包下载
http://download.redis.io/releases/ 下载redis的压缩包,并放在/usr/soft文件夹下
2.解压压缩包:
tar -zxvf redis-3.0.7.tar.gz
3.把usr/soft下的redis-3.0.7文件夹移到usr,然后改名为redis
mv redis-3.0.7 /usr/
mv redis-3.0.7 redis
4.执行安装命令(使用PREFIX指定安装目录)
make PREFIX=/usr/redis/ install
这时候你就会发现redis下面会多出一个bin目标
3.集群节点的规划
这里在同一台服务器用不同的端口表示不同的redis服务器,如下:
主节点:192.168.198.130:7001 192.168.198.130:7002 192.168.198.130:7003
从节点:192.168.198.130:7004 192.168.198.130:7005 192.168.198.130:7006
在/usr/local下创建redis-cluster目录,其下创建7001、7002。。7006目录,然后再把/usr/redis/src下的redis-trib.rb复制到
/usr/redis/src/redis-trib.rb如下(我多建了两个7007,7008为了测试用)
这里(dump.rdb,nodes-7001.conf,是项目跑起来生成的读者那里应该暂时还没有这两文件)
操作到这步,读者应该每个700*文件都有以上文件夹内容了。
现在我们来修改配置
vi 打开每个7001文件夹下的 redis.conf
daemonize | yes | 是否作为守护进程运行 |
pidfile | /var/run/redis-7001.pid | 如以后台进程运行,则需指定一个 pid,默认为/var/run/redis.pid |
port | 7001 | 监听端口,默认为 6379 |
cluster-enabled | yes | 打开 redis 集群 |
cluster-config-file | nodes-7001.conf | 集群配置文件(启动自动生成),但我觉得要配置 |
dir | /usr/local/redis-cluster/7001 | 节点数据持久化存放目录(建议配置) |
以上几个是我认为要修改的,其他要修改的地方,读者可以自行去根据文档进行实际需求配置
然后wq保存退出
配置好每个700*文件夹下的redis.conf
gem 安装 redis ruby 接口:
# gem install redis
Successfully installed redis-3.2.1
1 gem installed
Installing ri documentation for redis-3.2.1...
Installing RDoc documentation for redis-3.2.1...
进入redis-cluster目录
然后再这个目录下启动每个文件夹下的redis
./7001/redis-server 7001/redis.conf
./7002/redis-server 7002/redis.conf
./7003/redis-server 7003/redis.conf
./7004/redis-server 7004/redis.conf
./7005/redis-server 7005/redis.conf
./7006/redis-server 7006/redis.conf
./redis-trib.rb create --replicas 1 192.168.198.130:7001 192.168.198.130:7002 192.168.198.130:7003 192.168.198.130:7004 192.168.198.130:7005 192.168.198.130:7006 //集群中redis的ip和脚本
现在我们进入redis客户端看下集群情况
就此redis的集群已经搭建好了
如果:读者是用不同服务器搭建的,再次先说一声,把启动的端口加入到防火墙当中
而且如果是不同服务器搭建集群,还要加上10000,意思是
如果你的端口是7001,那你要把7001加入防火墙可访问的端口,还要把17001也加入防火墙可访问的端口
ps:读者还碰到本机用redis客户端访问虚拟机的redis不能访问,因为你虚拟机开启的是127.0.0.1的本地ip
这个请修改redis.conf里的bind加上你虚拟机的ip 如下图:
这样你本地能访问此端口的redis,ip也能访问此端口的redis。
还有几篇我再学习redis集群中,有巨大帮助的几篇文也和大家分享下:
http://www.cnblogs.com/mouseIT/p/5288204.html
http://blog.csdn.net/hardworking0323/article/details/51213991
http://blog.csdn.net/truong/article/details/52531103(这个是讲端口要加上10000的)