Centos7搭建redis5.0.5集群
Redis是一个开源(BSD许可),内存数据结构存储,用作数据库,缓存和消息代理。它支持数据结构,如字符串,散列,列表,集合,带有范围查询的排序集,位图,超级日志,具有半径查询和流的地理空间索引。Redis具有内置复制,Lua脚本,LRU驱逐,事务和不同级别的磁盘持久性,并通过Redis Sentinel提供高可用性并使用Redis Cluster自动分区。
一、集群方案比较
1、redis3.0之前版本的哨兵模式
在Redis3.0以前的版本要实现集群一般是借助哨兵sentinel工具来监控master节点的状态,如果master节点异常,则会做主从切换,将某一台slave作为master,哨兵的配置略微复杂,并且性能和高可用性等各方面表现一般,特别是在主从切换的瞬间存在访问瞬断的情况,而且哨兵模式只有一个主节点对外提供服务,没法支持很高的并发,且单个主节点内存也不宜设置得过大,否则会导致持久化文件过大,影响数据恢复或主从同步的效率。
2、Redis官方 Cluster集群模式
Redis Cluster是一种服务器Sharding技术,3.0版本开始正式提供。
redis集群是一个由多个主从节点群组成的分布式服务器群,它具有复制、高可用和分片特性。Redis集群不需要sentinel哨兵也能完成节点移除和故障转移的功能。需要将每个节点设置成集群模式,这种集群模式没有中心节点,可水平扩展,据官方文档称可以线性扩展到上万个节点(官方推荐不超过1000个节点)。redis集群的性能和高可用性均优于之前版本的哨兵模式,且集群配置非常简单。
3、Jedis sharding集群
Redis Sharding可以说是在Redis cluster出来之前业界普遍的采用方式,其主要思想是采用hash算法将存储数据的key进行hash散列,这样特定的key会被定为到特定的节点上。
Java Redis客户端驱动Jedis已支持Redis Sharding功能,即ShardedJedis以及结合缓存池的ShardedJedisPool
Jedis的Redis Sharding实现具有如下特点:
1.采用一致性哈希算法,将key和节点name同时hashing,然后进行映射匹配,采用的算法是MURMUR_HASH。采用一致性哈希而不是采用简单类似哈希求模映射的主要原因是当增加或减少节点时,不会产生由于重新匹配造成的rehashing。一致性哈希只影响相邻节点key分配,影响量小。
2.为了避免一致性哈希只影响相邻节点造成节点分配压力,ShardedJedis会对每个Redis节点根据名字(没有,Jedis会赋予缺省名字)会虚拟化出160个虚拟节点进行散列。根据权重weight,也可虚拟化出160倍数的虚拟节点。用虚拟节点做映射匹配,可以在增加或减少Redis节点时,key在各Redis节点移动再分配更均匀,而不是只有相邻节点受影响。
3.ShardedJedis支持keyTagPattern模式,即抽取key的一部分keyTag做sharding,这样通过合理命名key,可以将一组相关联的key放入同一个Redis节点,这在避免跨节点访问相关数据时很重要。
当然,Redis Sharding这种轻量灵活方式必然在集群其它能力方面做出妥协。比如扩容,当想要增加Redis节点时,尽管采用一致性哈希,毕竟还是会有key匹配不到而丢失,这时需要键值迁移。
作为轻量级客户端sharding,处理Redis键值迁移是不现实的,这就要求应用层面允许Redis中数据丢失或从后端数据库重新加载数据。但有些时候,击穿缓存层,直接访问数据库层,会对系统访问造成很大压力。
4、利用中间件代理
中间件的作用是将我们需要存入redis中的数据的key通过一套算法计算得出一个值。然后根据这个值找到对应的redis节点,将这些数据存在这个redis的节点中。
常用的中间件有这几种
- Twemproxy
- Codis
- nginx
具体用法就不赘述了,可以自行百度。
二、安装Redis
1、安装gcc环境
1 | yum install gcc |
2、下载redis-5.0.5.tar.gz,并解压到/usr/local文件夹下
1 | wget http://download.redis.io/releases/redis-5.0.5.tar.gz |
3、编译
1 | make & make install |
4、启动并指定配置文件
1 | src/redis-server redis.conf |
注意要使用后台启动,所以修改redis.conf里的daemonize改为yes。
5、验证启动是否成功
1 | ps -ef | grep redis |
6、进入redis客户端
1 | cd /usr/local/redis/redis-5.0.2/src |
7、退出客户端
1 | exit |
8、退出redis服务:
1 | pkill redis-server |
三、搭建Redis官方 Cluster集群模式
redis集群需要至少要三个master节点,我们这里搭建三个master节点,并且给每个master再搭建一个slave节点,总共6个redis节点,这里用一台机器(可以多台机器部署,修改一下ip地址就可以了)部署6个redis实例,三主三从,搭建集群的步骤如下:
1、在/usr/local下创建文件夹redis-cluster,然后在其下面创建6个文件夹如下
1 | mkdir -p /usr/local/redis-cluster |
2、把之前的redis.conf配置文件copy到8001下,修改如下内容
1 | (1) daemonize yes (后台启动) |
3、把修改后的配置文件,copy到8002-8006,修改配置文件中(2)、(3)、(5)的端口号
1 | vim批量替换: |
4、分别启动6个redis实例
1 | /usr/local/redis-5.0.5/src/redis-server /usr/local/redis-cluster/8001/redis.conf |
查看是否启动成功
1 | [root@localhost local]# ps -ef|grep redis |
5、用redis-cli创建整个redis集群(redis5以前的版本集群是依靠ruby脚本redis-trib.rb实现)
1 | 带密码 |
启动成功
6、验证集群
1)连接任意一个客户端即可
1 | 带密码 |
说明:-a访问服务端密码,-c表示集群模式,指定ip地址和端口号
2)进行验证: cluster info(查看集群信息)、cluster nodes(查看节点列表)
1 | 192.168.84.35:8001> cluster info |
3)进行数据操作验证
在任意一个redis客户端里set一个值,在其他的redis里都能get到这个值。
4)关闭集群则需要逐个进行关闭,使用命令:
1 | /usr/local/redis-5.0.5/src/redis-cli -c -h 192.168.84.35 -p 8001 shutdown |
四、集群启动、重启可能出现的问题
1 | [root@localhost redis-cluster]# /usr/local/redis-5.0.5/src/redis-cli --cluster create --cluster-replicas 1 192.168.84.35:8001 192.168.84.35:8002 192.168.84.35:8003 192.168.84.35:8004 192.168.84.35:8005 192.168.84.35:8006 |
解决方法:关闭所有的redis进程,依次删除8001-8006文件夹下的dump.rdb、nodes-8001.conf文件,再按照上面的方式启动集群。
五、简单的启动脚本,不然启动一次得累成狗
1 | #!/bin/sh |
参考文档: