redis cluster采用投票容错机制,集群角色有master和slave。master之间分配slots,slave向它指定的master同步数据,实现备份。master用于写数据,slave用于读数据,向slave写数据会发生错误。当其中一个master无法提供服务时,该master的slave提升为master,代替master提供服务。保证集群中slot的完整性,即集群数据的完整性。一旦集群中其中一个master和它的所有slave全部失效,导致slot不完整,那么集群将会不可用,这是就需要人工去处理了。
投票过程是集群中所有master参与,如果半数以上的节点与节点之间的通讯时间超过cluster-node-timeout,则认为当前节点挂掉。所以一般master节点数量均为奇数个,且不少于3个。
什么情况下整个集群不可用?
a.如果集群中任一master节点挂掉且没有slave节点顶替,集群进入不可用状态;
当集群不可用时,对集群中的任何操作都不可用。
集群搭建:
我们这里搭建一个伪分布式的集群,集群中有3个节点,每个节点有一主一备,理论需要6台虚拟机,我们采用6个redis实例来模拟创建。
注意:这里的集群环境ruby环境是用于后面创建集群命令的运行环境,但是在高版本例如redis-5.0.5版本及以上就不需要安装此环境了,因为高版本创建集群已经不用redis-trib.rb这个脚本,而是使用自带的redis-cli创建。(呜呜,环境坑了我一下午,最后创建集群时才发现...)
1.安装集群环境ruby安装ruby,执行命令
yum install ruby rubygems -y
安装redis与ruby的连接包,执行命令
gem install redis
如果提示ruby版本过低,需要升级ruby版本,需要安装rvm(命令行工具,提供ruby环境管理和版本切换),安装rvm前需要安装curl(文件传输工具),执行命令
yum install curl -y
使用curl安装rvm,执行命令
curl -L get.rvm.io | bash -s stable
安装会报错,并产生一串公钥,执行命令
gpg --keyserver hkp://keys.gnupg.net --recv-keys (这里跟上上面的公钥)
再次执行命令,一次不行多执行几次
curl -sSL https://get.rvm.io | bash -s stable
安装完成后会在/user/local目录下发现rvm目录,将命令放入shell,执行命令
source /usr/local/rvm/scripts/rvm
查看rvm管理的ruby版本,执行命令
rvm list known
安装新版本,可以参照安装连接包时提示的最低版本安装,我这里安装2.5.7版本,执行命令
rvm install ruby-2.5.7
等待ruby安装完成,查看已安装的版本,
rvm list
使用此版本
rvm use ruby-2.5.7
检查一下当前使用的版本,ruby -v
最后再次执行命令
gem install redis
环境安装完成!!
2.创建集群目录进入/usr/local目录,执行命令
mkdir redis_cluster
3.复制redis实例将redis目录复制到redis_cluster中,执行命令
cp -r /usr/local/redis /usr/local/redis_cluster/redis7001
ps:这里注意一点,如果此时数据库中有数据,那么将rdb文件一起复制时会导致后面集群创建失败,有数据时不能创建集群。解决:删除实例下rdb备份文件以及后面会生成的nodes.conf文件。
4.更改配置更改redis7001中配置redis.conf参数
port 7001 修改端口号
cluster-enabled yes 开启集群支持
将redis7001实例复制6份到当前文件夹,
cp redis7001 redis7002
cp redis7001 redis7003
......
修改各个实例下的端口号
5.把创建集群的ruby脚本复制到集群目录进入redis的src目录,执行命令
cp redis-trib.rb /usr/local/redis_cluster/
6.创建集群启动6个redis实例,这里为了方便编写一个启动脚本,在redis_cluste目录下新建文件
touch start-all.sh
编辑输入如下内容:
cd ./redis7001
./bin/redis-server redis.conf
echo "启动redis7001成功..."
cd ../redis7002
./bin/redis-server redis.conf
echo "启动redis7002成功..."
cd ../redis7003
./bin/redis-server redis.conf
echo "启动redis7003成功..."
cd ../redis7004
./bin/redis-server redis.conf
echo "启动redis7004成功..."
cd ../redis7005
./bin/redis-server redis.conf
echo "启动redis7005成功..."
cd ../redis7006
./bin/redis-server redis.conf
echo "启动redis7006成功..."
赋予执行权限
chmod +x start-all.sh
新建关闭redis集群脚本
touch stop-all.sh
编辑输入如下内容:
cd ./redis7001
bin/redis-cli -p 7001 shutwodn
echo "关闭redis7001成功..."
cd ../redis7002
bin/redis-cli -p 7002 shutdown
echo "关闭redis7002成功..."
cd ../redis7003
bin/redis-cli -p 7003 shutdown
echo "关闭redis7003成功..."
cd ../redis7004
bin/redis-cli -p 7004 shutdown
echo "关闭redis7004成功..."
cd ../redis7005
bin/redis-cli -p 7005 shutdown
echo "关闭redis7005成功..."
cd ../redis7006
bin/redis-cli -p 7006 shutdown
echo "关闭redis7006成功..."
创建集群命令:
进入到集群中某个实例下的bin目录,高版本执行
./redis-cli --cluster create --cluster-replicas 1 192.168.2.75:7001 192.168.2.75:7002 192.168.2.75:7003 192.168.2.75:7004 192.168.2.75:7005 192.168.2.75:7006
低版本执行
./redis-trib.rb create --replicas 1 192.168.2.75:7001 192.168.2.75:7002 192.168.2.75:7003 192.168.2.75:7004 192.168.2.75:7005 192.168.2.75:7006
注:replicas参数表示一个master有接个slave
然后就会按照默认的方式进行分配matser,主从关系。
7.测试使用命令连接上集群某个节点
./redis-cli -p 7001
使用命令 cluster info 和 cluster nodes可查看集群信息。
至此,集群版搭建完成!!
好累,歇会~~~
如有错误,感谢您的指正!