集群原理
redis-cluster架构图
-
所有的
redis
节点彼此互联(PING
-PONG
机制),内部使用二进制协议优化传输速度和带宽。 -
节点的
fail
是通过集群中超过半数的节点检测失效时才生效。 -
客户端与
redis
节点直连,不需要中间proxy
层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可。 -
redis-cluster
把所有的物理节点映射到[0-16383
]slot
上,cluster
负责维护node
<->slot
<->value
Redis
集群中内置了 16384
个哈希槽,当需要在 Redis
集群中放置一个 key-value
时,redis
先对key
使用 crc16
算法算出一个结果,然后把结果对 16384
求余数,这样每个 key
都会对应一个编号在 0-16383
之间的哈希槽,redis
会根据节点数量大致均等的将哈希槽映射到不同的节点
redis-cluster投票:容错
-
投票过程是集群中所有
master
参与,如果半数以上master
节点与master
节点通信超时(cluster-node-timeout
),认为当前master
节点挂掉. -
什么时候整个集群不可用(
cluster_state:fail
)?- 如果集群任意
master
挂掉,且当前master
没有slave
.集群进入fail
状态,也可以理解成集群的slot
映射[0-16383
]不完整时进入fail状态.redis-3.0.0.rc1
加入cluster-require-full-coverage
参数,默认关闭,打开集群兼容部分失败.
- 如果集群超过半数以上
master
挂掉,无论是否有slave
,集群进入fail
状态.
- 如果集群任意
一、安装Ruby和Remgem
1、安装rvm 【Ruby Version Manager】
到网站 https://rvm.io/ 看看安装命令提示
a.【安装密钥服务器】执行 #gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB
b.【安装rvm】执行 #\curl -sSL https://get.rvm.io | bash -s stable
按照输出提示,执行 # source /etc/profile.d/rvm.sh
2、安装 ruby
a. 执行 #rvm list known // list一下可以安装的版本
b. 执行 #rvm install [version] //可以看上一条命令列出的ruby 版本 ,[version] 代表版本号,如 2.5.1
c. 等待安装完成【快慢与网络有关】,安装完成查看版本,执行 #ruby -v
二、安装redis集群
1.下载tar.gz
http://www.redis.cn/
2.上传tar.gz到linux
#rz 选择tar.gz
3.解压
#tar -zxvf redis-4.0.10 -C [path] path:解压路径
4.编译
#make
5. 将src的以下文件拷贝到一个目录
redis-benchmark
redis-check-aof
redis-check-rdb
redis-cli
redis-sentinel
redis-server
redis-trib.rb
redis.conf //这个是解压的根目录文件
6. 修改配置文件 (去掉注解符#)
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 15000
bind 192.168.118.4 //绑定ip地址
protected-mode no //关掉保护模式
7.安装redis.x.x.x.gem
执行 # gem install redis 【安装时间与网络有关,会卡一下】
完成提示:
Fetching: redis-4.0.2.gem (100%)
Successfully installed redis-4.0.2
Parsing documentation for redis-4.0.2
Installing ri documentation for redis-4.0.2
Done installing documentation for redis after 2 seconds
1 gem installed
8、启动redis服务
执行 #./redes-server ./redis.conf
9、设置集群
执行 #./redis-trib.rb create --replicas 0 192.168.118.4:6379 --replicas 0 表示0个副本
提示:
>>> Creating cluster
*** ERROR: Invalid configuration for cluster creation.
*** Redis Cluster requires at least 3 master nodes.
*** This is not possible with 1 nodes and 0 replicas per node.
*** At least 3 nodes are required.
意思就是redis至少要3个主节点【现在我只有一个,所以创建不成功】
两种解决方案:
A、伪集群,在一台机器上,拷贝第5步创建的目录,用不同的端口启动redis服务(在redis.conf 的 port 6379 修改,每个目录的配置修改不同的端口)
B、真实集群,开机器【虚拟机】,拷贝第5步创建的目录到其他机器,修改bind (在redis.conf 的 bind 192.168.118.4 修改)
参考1:https://www.cnblogs.com/honger/p/5852005.html
1、使用虚拟机安装centos linux操作系统。
2、下载redis3.2.2.tar.gz,下载地址为http://redis.io/download。
2、安装gcc-c++,命令为yum -y install gcc-c++,因为安装redis的时候需要对它编译。
3、安装ruby环境,yum -y install ruby,yum -y install rubygems,这里的rubygems是gem文件的管理工具,安装gem需要用到它,如gem install xxx.gem,之所以安装这个是因为,redis集群管理工具redis-trib.rb依赖ruby环境,ruby是一种面向对象的语言。redis-trib.rb在redis-3.2.3.tar.gz源码包中。
4、下载gem文件https://rubygems.org/gems/redis/versions/3.3.1,点击右边的下载链接
5、安装redis,解压命令tar -zxvf redis-3.2.3.tar.gz,解压后进入解压后的文件夹redis-3.2.3,执行make命令,编译完后执行make install PREFIX=/usr/local/redis命令,prefix表示安装到/usr/local/redis,如果/usr/local/下没有redis文件夹,可先创建mkdir reids。
6、安装gem文件,gem install redis.3.3.1.gem
参考2:
Redis3伪分布式安装(1台Linux)
1.下载redis3的稳定版本,下载地址http://download.redis.io/releases/redis-3.0.7.tar.gz
2.上传redis-3.0.7.tar.gz到服务器
3.解压redis源码包
tar -zxvf redis-3.0.7.tar.gz -C /usr/local/src/
4.进入到源码包中,编译并安装redis
cd /usr/local/src/redis-3.0.7/
make && make install
5.在/usr/local/下创建一个redis目录,然后分别在/usr/local/redis目录创建6个文件夹7000,7001,7002,7003,7004,7005然后拷贝redis自带的配置文件redis.conf到这六个目录中
mkdir /usr/local/redis
mkdir /usr/local/redis/{7000,7001,7002,7003,7004,7005}
cp /usr/local/src/redis-3.0.7/redis.conf /usr/local/redis/7000
cp /usr/local/src/redis-3.0.7/redis.conf /usr/local/redis/7001
cp /usr/local/src/redis-3.0.7/redis.conf /usr/local/redis/7002
cp /usr/local/src/redis-3.0.7/redis.conf /usr/local/redis/7003
cp /usr/local/src/redis-3.0.7/redis.conf /usr/local/redis/7004
cp /usr/local/src/redis-3.0.7/redis.conf /usr/local/redis/7005
6.分别修改这六个目录中的配置文件
port 7000 #端口要与其所在的文件名一致 pidfile /var/run/redis-7000.pid #pid要与其所在的文件名一致 daemonize yes cluster-enabled yes appendonly yes |
cd /usr/local/redis/70007.分别进入到这六个目录启动redis进程
redis-server redis.conf
cd /usr/local/redis/7001
redis-server redis.conf
cd /usr/local/redis/7002
redis-server redis.conf
cd /usr/local/redis/7003
redis-server redis.conf
cd /usr/local/redis/7004
redis-server redis.conf
cd /usr/local/redis/7005
redis-server redis.conf