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环境
yum install gcc
2、下载redis-5.0.5.tar.gz,并解压到/usr/local文件夹下
wget http://download.redis.io/releases/redis-5.0.5.tar.gz
tar -zxvf redis-5.0.5.tar.gz -C /usr/local/
cd redis-5.0.5
3、编译
make & make install
4、启动并指定配置文件
src/redis-server redis.conf
注意要使用后台启动,所以修改redis.conf里的daemonize改为yes。
5、验证启动是否成功
ps -ef | grep redis
6、进入redis客户端
cd /usr/local/redis/redis-5.0.2/src
./redis-cli
7、退出客户端
exit
8、退出redis服务:
pkill redis-server
kill 进程号
src/redis-cli shutdown
三、搭建Redis官方 Cluster集群模式
redis集群需要至少要三个master节点,我们这里搭建三个master节点,并且给每个master再搭建一个slave节点,总共6个redis节点,这里用一台机器(可以多台机器部署,修改一下ip地址就可以了)部署6个redis实例,三主三从,搭建集群的步骤如下:
1、在/usr/local下创建文件夹redis-cluster,然后在其下面创建6个文件夹如下
mkdir -p /usr/local/redis-cluster
mkdir 8001 8002 8003 8004 8005 8006
2、把之前的redis.conf配置文件copy到8001下,修改如下内容
(1) daemonize yes (后台启动)
(2) port 8001(分别对每个机器的端口号进行设置)
(3) dir /usr/local/redis-cluster/8001/(指定数据文件存放位置,必须要指定不同的目录位置,不然会丢失数据)
(4) cluster-enabled yes(启动集群模式)
(5) cluster-config-file nodes-8001.conf(集群节点信息文件,这里800x最好和port对应上)
(6) cluster-node-timeout 5000
(7) bind 127.0.0.1(去掉bind绑定访问ip信息)
(8) protected-mode no (关闭保护模式)
(9) appendonly yes (持久化)
(10) 如果要设置密码需要增加如下配置:
requirepass xxx (设置redis访问密码)
masterauth xxx (设置集群节点间访问密码,跟上面一致)
3、把修改后的配置文件,copy到8002-8006,修改配置文件中(2)、(3)、(5)的端口号
vim批量替换:
%s/源字符串/目的字符串/g
4、分别启动6个redis实例
/usr/local/redis-5.0.5/src/redis-server /usr/local/redis-cluster/8001/redis.conf
/usr/local/redis-5.0.5/src/redis-server /usr/local/redis-cluster/8002/redis.conf
/usr/local/redis-5.0.5/src/redis-server /usr/local/redis-cluster/8003/redis.conf
/usr/local/redis-5.0.5/src/redis-server /usr/local/redis-cluster/8004/redis.conf
/usr/local/redis-5.0.5/src/redis-server /usr/local/redis-cluster/8005/redis.conf
/usr/local/redis-5.0.5/src/redis-server /usr/local/redis-cluster/8006/redis.conf
查看是否启动成功
[root@localhost local]# ps -ef|grep redis
root 4337 1 0 12:03 ? 00:00:47 /usr/local/redis-5.0.5/src/redis-server *:8001 [cluster]
root 4344 1 0 12:04 ? 00:00:48 /usr/local/redis-5.0.5/src/redis-server *:8002 [cluster]
root 4349 1 0 12:04 ? 00:00:47 /usr/local/redis-5.0.5/src/redis-server *:8003 [cluster]
root 4354 1 0 12:04 ? 00:00:47 /usr/local/redis-5.0.5/src/redis-server *:8004 [cluster]
root 4359 1 0 12:04 ? 00:00:48 /usr/local/redis-5.0.5/src/redis-server *:8005 [cluster]
root 4364 1 0 12:04 ? 00:00:46 /usr/local/redis-5.0.5/src/redis-server *:8006 [cluster]
root 5021 4646 0 15:44 pts/1 00:00:00 grep --color=auto redis
5、用redis-cli创建整个redis集群(redis5以前的版本集群是依靠ruby脚本redis-trib.rb实现)
带密码
/usr/local/redis-5.0.5/src/redis-cli -a xxx密码 --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
不带密码
/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
启动成功
6、验证集群
1)连接任意一个客户端即可
带密码
/usr/local/redis-5.0.5/src/redis-cli -c -a xxx密码 -h 192.168.84.35 -p 8001
不带密码
/usr/local/redis-5.0.5/src/redis-cli -c -h 192.168.84.35 -p 8001
说明:-a访问服务端密码,-c表示集群模式,指定ip地址和端口号
2)进行验证: cluster info(查看集群信息)、cluster nodes(查看节点列表)
192.168.84.35:8001> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:323
cluster_stats_messages_pong_sent:321
cluster_stats_messages_sent:644
cluster_stats_messages_ping_received:316
cluster_stats_messages_pong_received:323
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:644
192.168.84.35:8001> cluster nodes
00e6622cf5a2debc7583ad8d866a7157c10e5422 192.168.84.35:8001@18001 myself,master - 0 1567757255000 1 connected 0-5460
f8893e64f40eca387502e2979b1757d352e93768 192.168.84.35:8004@18004 slave 1499bd2f7cb8c799fa95bd1d0b364cc246a6601d 0 1567757256713 4 connected
f293db111b06ca7592dbf67b0d30b96e116d9fba 192.168.84.35:8006@18006 slave 00e6622cf5a2debc7583ad8d866a7157c10e5422 0 1567757256000 6 connected
1499bd2f7cb8c799fa95bd1d0b364cc246a6601d 192.168.84.35:8002@18002 master - 0 1567757254000 2 connected 5461-10922
d3b5ec2e393216b8c62f675a079d8a724d957d48 192.168.84.35:8005@18005 slave c5ab6955898839266680d9d307ef848f6b0ed53d 0 1567757257000 5 connected
c5ab6955898839266680d9d307ef848f6b0ed53d 192.168.84.35:8003@18003 master - 0 1567757257730 3 connected 10923-16383
192.168.84.35:8001>
3)进行数据操作验证
在任意一个redis客户端里set一个值,在其他的redis里都能get到这个值。
4)关闭集群则需要逐个进行关闭,使用命令:
/usr/local/redis-5.0.5/src/redis-cli -c -h 192.168.84.35 -p 8001 shutdown
四、集群启动、重启可能出现的问题
[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
[ERR] Node 192.168.84.35:8001 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.
解决方法:关闭所有的redis进程,依次删除8001-8006文件夹下的dump.rdb、nodes-8001.conf文件,再按照上面的方式启动集群。
五、简单的启动脚本,不然启动一次得累成狗
#!/bin/sh
# shutdown redis 8001-8006
/usr/local/redis-5.0.5/src/redis-cli -c -h 192.168.84.35 -p 8001 shutdown
/usr/local/redis-5.0.5/src/redis-cli -c -h 192.168.84.35 -p 8002 shutdown
/usr/local/redis-5.0.5/src/redis-cli -c -h 192.168.84.35 -p 8003 shutdown
/usr/local/redis-5.0.5/src/redis-cli -c -h 192.168.84.35 -p 8004 shutdown
/usr/local/redis-5.0.5/src/redis-cli -c -h 192.168.84.35 -p 8005 shutdown
/usr/local/redis-5.0.5/src/redis-cli -c -h 192.168.84.35 -p 8006 shutdown
# clean redis
rm -rf /usr/local/redis-cluster/800*/dump.rdb
rm -rf /usr/local/redis-cluster/800*/nodes-800*.conf
# start redis 8001-8006
/usr/local/redis-5.0.5/src/redis-server /usr/local/redis-cluster/8001/redis.conf
/usr/local/redis-5.0.5/src/redis-server /usr/local/redis-cluster/8002/redis.conf
/usr/local/redis-5.0.5/src/redis-server /usr/local/redis-cluster/8003/redis.conf
/usr/local/redis-5.0.5/src/redis-server /usr/local/redis-cluster/8004/redis.conf
/usr/local/redis-5.0.5/src/redis-server /usr/local/redis-cluster/8005/redis.conf
/usr/local/redis-5.0.5/src/redis-server /usr/local/redis-cluster/8006/redis.conf
# check redis
ps -ef|grep redis-server
# start 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
# connect 8001 redis-cli test
/usr/local/redis-5.0.5/src/redis-cli -c -h 192.168.84.35 -p 8001
参考文档: