Redis3.x集群部署
程序员文章站
2022-05-21 17:13:00
...
1.实现目标
目标清单:
1)192.168.31.220、192.168.31.221和192.168.31.222为三台redis服务器的地址。初始状态下,所有服务器上6379端口的redis节点都为master,而6380端口的节点都为本机master的slave;
2)当某个master节点处于不可用时,则要求集群监控到后将某个slave(不一定是当前master主机上的slave)切换为新的master;
3)如果半数(及以上)节点挂掉,则整个集群进入fail状态。
2.实现过程
2.1安装Redis3.x
此步骤省略,可参考http://code727.iteye.com/blog/2251399
2.2安装cluster依赖工具
只需在任意一台主机上(如220)进行如下操作:
yum install ruby yum install rubygems gem install redis2.3cluster配置
# 为Master和Slave节点拷贝两个配置文件到/etc/redis目录 cp /usr/local/redis/redis.conf /etc/redis/redis-6379.conf cp /usr/local/redis/redis.conf /etc/redis/redis-6380.conf2.3.1修改master节点配置
vi /ect/redis/redis-6379.conf主要配置项如下:
# master节点服务端口 port 6379 # 开启集群 cluster-enabled yes # master节点的配置文件 cluster-config-file nodes-6379.conf # 集群节点互联超时时间(10秒) cluster-node-timeout 100002.3.2修改slave节点配置
vi /ect/redis/redis-6380.conf
# slave节点服务端口 port 6380 # 开启集群 cluster-enabled yes # slave节点的配置文件,名称与master的不一样 cluster-config-file nodes-6380.conf # 集群节点互联超时时间(10秒) cluster-node-timeout 10000完成后,将redis-6379.conf和redis-6380.conf两个配置拷贝到所有主机的/etc/redis/目录下
2.3.2启动redis服务
在所有主机上进行如下操作:
# 进入redis-server目录 cd /usr/local/redis/src # 启动master节点服务 ./redis-server /etc/redis/redis-6379.conf # 启动slave节点服务 ./redis-server /etc/redis/redis-6380.conf2.3.3创建集群环境
在2.2节中安装了cluster依赖工具的主机上进行如下操作:
cd /usr/local/redis/src ./redis-trib.rb create --replicas 1 192.168.31.220:6379 192.168.31.221:6379 192.168.31.222:6379 192.168.31.220:6380 192.168.31.221:6380 192.168.31.222:6380创建集群环境的命令格式为./redis-trib.rb create --replicas <slaveCount> masterNode1,masterNode2,masterNodeN,slaveNode1,slaveNode2,slaveNodeN
Node的格式为"IP:port",slaveCount表示每个masterNode对应的slaveNode个数,在集群环境中可以没有slave(在命令中省略掉slaveNode部分即可)。但如果有slave,则命令中,前n中个节点都为master,后n个节点都为slave,第n个master节点对应的slave应该是第n个。在上面的创建命令中,各节点的顺序正好满足目标清单中的第1)条需求。
从上图可看出,六个节点都处于"OK"状态,并且前三个6379端口的都为master,而都三个6380端口的都为slave。此时出现提示,键入yes后,各节点将会进行互联操作
从上图可看出16384个哈希槽已均匀分配给了三个master节点,分别为:
从上图可看出,六个节点都处于"OK"状态,并且前三个6379端口的都为master,而都三个6380端口的都为slave。此时出现提示,键入yes后,各节点将会进行互联操作
从上图可看出16384个哈希槽已均匀分配给了三个master节点,分别为:
192.168.31.220:6379(10923-16384)
192.168.31.221:6379(5461-10922)
192.168.31.222:6379(0-5460)
2.4定义服务
在所有的主机上进行如下操作:
2.4.1定义redis-6379服务
vi /etc/init.d/redis-6379输入如下内容:
PATH=/usr/local/bin:/sbin:/usr/bin:/bin REDISPORT=6379 EXEC=/usr/local/redis/src/redis-server REDIS_CLI=/usr/local/redis/src/redis-cli CONF="/etc/redis/redis-6379.conf" case "$1" in start) echo "Starting Redis-6379 server..." $EXEC $CONF sleep 1 echo "Redis-6379 is running..." ;; stop) echo "Stopping..." $REDIS_CLI -p $REDISPORT SHUTDOWN sleep 1 echo "Redis-6379 stopped" ;; restart|force-reload) ${0} stop ${0} start ;; *) echo "Usage: /etc/init.d/redis-6379 {start|stop|restart|force-reload}" >&2 exit 1 esac
chmod -R 755 /etc/rc.d/init.d/redis-6379
2.4.1定义redis-6380服务
vi /etc/init.d/redis-6380输入如下内容:
PATH=/usr/local/bin:/sbin:/usr/bin:/bin REDISPORT=6380 EXEC=/usr/local/redis/src/redis-server REDIS_CLI=/usr/local/redis/src/redis-cli CONF="/etc/redis/redis-6380.conf" case "$1" in start) echo "Starting Redis-6380 server..." $EXEC $CONF sleep 1 echo "Redis-6380 is running..." ;; stop) echo "Stopping..." $REDIS_CLI -p $REDISPORT SHUTDOWN sleep 1 echo "Redis-6380 stopped" ;; restart|force-reload) ${0} stop ${0} start ;; *) echo "Usage: /etc/init.d/redis-6380 {start|stop|restart|force-reload}" >&2 exit 1 esac
chmod -R 755 /etc/rc.d/init.d/redis-6380
2.5设置开机启动
在所有的主机上进行如下操作:
vi /etc/rc.d/rc.local加入如下内容:
service redis-6379 start service redis-6380 start
3.测试
3.1redis-cli连接
# 常规的连接命令 ./redis-cli -h 192.168.31.220 -p 6379 # redis set命令 set name daniele执行set命令后,将会返回MOVED错误,如下图:
这是因为键(name)应该映射到0-5460范围内,因此不能在220(10923-16384范围)上进行操作,将-h的后ip修改为222重新连接后再进行set操作将会成功处理。
3.2改良后的redis-cli连接
在redis-cli后加一个-c参数可以避免MOVED错误的发生,如下:
3.3宕机测试
# 具备重定向功能的连接 ./redis-cli -c -h 192.168.31.220 -p 6379 # redis set命令 set name daniele执行set命令后,将会自动重定向,并返回正确的结果:
3.3宕机测试
1)kill掉222的master节点,再进行3.2节的操作,此时将不会再重定向到已不可用的222的master节点上
此时重定向到了221的master节点上。这是因为同样的一个键,此时的slot值为5789而不是先前的4808,因此它将存储到221的master节点范围5461-10922内,可以通过如下命令查看到各节点状态
此时重定向到了221的master节点上。这是因为同样的一个键,此时的slot值为5789而不是先前的4808,因此它将存储到221的master节点范围5461-10922内,可以通过如下命令查看到各节点状态
# 查看220上node-6379.conf文件内容 ./redis-cli -h 192.168.31.220 -p 6379 cluster nodes
或
# 查看220上node-6380.conf文件内容 ./redis-cli -h 192.168.31.220 -p 6380 cluster nodes
上图展示的结果正好是220上node-6379.conf文件内容
有时在执行操作时会遇到“(error) CLUSTERDOWN The cluster is down”错误,见下图:
在这种情况下,221是可连接的(否则上图中最后一行的转向地址信息不可能会出现),需要对221:6379节点进行修复:
在这种情况下,221是可连接的(否则上图中最后一行的转向地址信息不可能会出现),需要对221:6379节点进行修复:
# 格式为./redis-trib.rb fix 被损节点ip:port ./redis-trib.rb fix 192.168.31.221:63792)kill掉半数(当前架构为3个)节点,再进行3.2节的操作,将同样会出现“(error) CLUSTERDOWN The cluster is down”错误:
见上图,最后一行的地址信息表明没有发生转向,说明整个集群环境down掉了。
3)重启被kill掉的节点,再进行3.2节的操作,此时又恢复了正常。
4.Jedis对Redis Cluster的支持
ShardedJedis是Jedis2.2+提供的基于一致性哈希算法实现的分布式Redis集群客户端,详情可参考http://www.cnblogs.com/liuling/p/2014-4-21-01.html和http://blog.csdn.net/xiaolang85/article/details/12655519
5.总结
在整个集群环境中,如果有半数的节点处于不可用状态时,会使整个集群系统都变为不可用,这是一个相当严重的问题。在上面章节的实施过程,都是人工值守的。对于可靠性高的系统来说,必须要加入自动检测恢复机制来实现,可以为每个节点加入keepalived来满足要求,当检测到某个redis节点不可用时,让它自动调用redis的重启脚本。
Redis Cluster目前不支持跨库操作,即在任意一个节点进行select操作是不允许的。个人认为,对于那种需要将数据按库进行分类的系统来说,还是采用Sentinel架构比较好,可参考http://code727.iteye.com/blog/2251399
上一篇: 分布式计算多机部署与配置
下一篇: Mercurial 1.6发布
推荐阅读
-
[MySQL] MySQL的自动化安装部署_MySQL
-
2017-08-21-myeclipse-没有部署文件到tomcat的webapps目录下
-
项目部署到tomcat服务器,在tomcat目录下找不到的问题
-
[转载] 解决eclipse中web项目部署至Tomcat在Tomcat安装目录下找不到项目问题
-
vue项目环境部署,在指定目录下搭建vue项目
-
eclipse中部署在tomcat上的项目能正常运行,但无法访问tomcat默认首页
-
hive的基本概念及部署
-
Windows Server2012 故障转移集群之动态仲裁(Dynamic Quorum)
-
在Linux系统上部署Apache+Python+Django+MySQL环境
-
nginx+apache+mysql+php+memcached+squid集群web环境 (1/6)_PHP教程