一、Redis-Cluster简介
1.1简介
RedisCluster是redis的分布式解决方案,有效地解决了Redis分布式的需求,当一个服务挂了可以快速的切换到另外一个服务,当遇到单机内存、并发等瓶颈时,可使用此方案来解决这些问题。建议Redis实例为redis-5.x以上版本进行集群模式配置。
1.2分布式概念
分布式数据库把整个数据按分区规则映射到多个节点,即把数据划分到多个节点上,每个节点负责整体数据的一个子集。比如我们库有900条用户数据,有3个redis节点,将900条分成3份,分别存入到3个redis节点。
1.3数据存储槽位
Redis Cluster是通过哈希槽进行管理的,每个节点可以分配到一个连续的哈希槽。
1.4架构方案
以6个节点集群为例,该集群由A,B,C,A1,B1,C1组成,具有3个主节点和3个从节点。还有一个客户,我们将其称为Z1。假设如果节点B发生故障,群集会将节点B1提升为新的主节点,系统将能够继续运行。架构图如下:
1.5缺陷
因redis cluster主从节点采用异步复制,所以无法保证数据的强一致性。例如Z1客户端往B节点写入数据,B节点收到请求并确认,此事B节点宕机而B1从节点未完成数据复制则该部分数据丢失无法再进行恢复。
二、配置Redis集群
2.1安装redis
2.1.1 安装remi-release源
[root@test1 ~]# rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
2.1.2 安装redis
[root@test1 ~]# yum --enablerepo=remi install -y redis
[root@test1 ~]# systemctl start redis
[root@test1 ~]# systemctl enable redis
2.1.3 redis配置文件
以下仅供参考
[root@test-db ~]# egrep -v "#|^$" /data/redis/conf/redis-6380.conf
daemonize yes
pidfile "/var/run/redis-6380.pid"
bind 0.0.0.0
port 6380
tcp-backlog 511
timeout 300
tcp-keepalive 0
loglevel notice
logfile "/data/redis/log/redis-6380.log"
databases 16
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename "dump-6380.rdb"
dir "/data/redis/data"
requirepass "123456"
masterauth "123456"
slave-serve-stale-data yes
slave-read-only yes
repl-ping-slave-period 10
repl-timeout 60
repl-disable-tcp-nodelay no
repl-backlog-size 1mb
repl-backlog-ttl 3600
slave-priority 100
maxclients 5000
maxmemory 1953125kb
appendonly yes
appendfilename "appendonly-6380.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
lua-time-limit 5000
slowlog-log-slower-than 5000
slowlog-max-len 1024
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-entries 512
list-max-ziplist-value 64
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 4gb 2gb 1800
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes
2.2实例配置
redis-cluser-01
redis-cluser-02
2.3配置文件修改
[root@localhost tmp]# cd /data/redis/conf/
[root@localhost conf]# vim redis-6380.conf //每个实例都需要修改
cluster-enabled yes
cluster-config-file nodes-6380.conf
cluster-node-timeout 15000
2.4配置cluster集群
手动进行配置集群
redis-cli --cluster create \
192.168.10.88:6380 \
192.168.10.88:6381 \
192.168.10.88:6382 \
192.168.10.89:6380 \
192.168.10.89:6381 \
192.168.10.89:6382 \
--cluster-replicas 1
三、Cluster管理
3.1管理集群
[root@redis-cluser-01 ~]# redis-cli -h 192.168.10.88 -c -p 6380
192.168.10.88:6380> set foo bar //在集群中创建一个foo的key,可以看到值保存在6381哈希槽上
-> Redirected to slot [12182] located at 192.168.10.88:6381
OK
192.168.10.88:6381> set hello world //在集群中创建一个hello的key,可以看到值保存在6380哈希槽上
-> Redirected to slot [866] located at 192.168.10.88:6380
OK
192.168.10.88:6380> get foo
-> Redirected to slot [12182] located at 192.168.10.88:6381
"bar"
192.168.10.88:6381> get hello
-> Redirected to slot [866] located at 192.168.10.88:6380
"world"
3.2哈希槽分片重新配置
以下为特殊需求,实际应用场景中如无需要则无需重新配置分片
3.2.1查看哈希槽位
[root@redis-cluser-02 conf]# redis-cli -p 6380 cluster nodes|grep master
3.2.2修改哈希槽位置
[root@redis-cluser-02 conf]# redis-cli --cluster reshard 192.168.10.89:6380
检查槽位修改后进行了变化
3.3添加一个新节点及副本
3.3.1添加一个新节点
[root@redis-cluser-02 ~]# redis-cli --cluster add-node 192.168.10.88:6383 192.168.10.88:6380
查看cluster节点信息
备注:
由于没有分配的哈希槽,因此不保存任何数据。
因为它是没有分配插槽的主机,所以当从机要成为主机时,它不会参与选举过程。
如果要将该节点配置哈希槽位则可以使用cluster分片配置
3.3.2添加一个新节点作为副本
//新增一个节点192.168.10.89:6383作为192.168.10.88:6383节点的副本
[root@redis-cluser-01 ~]# redis-cli --cluster add-node 192.168.10.89:6383 192.168.10.88:6383 --cluster-slave --cluster-master-id 2a660178c3f1dfbf5a68c406cf8737af1014f09d
备注:
2a660178c3f1dfbf5a68c406cf8737af1014f09d 表示节点信息
3.3.3分配哈希槽位
可参照3.2.2进行重新分配哈希槽位
3.4删除节点
3.4.1移除哈希槽位
//192.168.10.88:6380 表示随机集群节点
[root@redis-cluser-01 ~]# redis-cli --cluster reshard 192.168.10.88:6380
How many slots do you want to move (from 1 to 16384)? 2000 //移除2000个哈希槽
What is the receiving node ID? 89dd2c4ce70202f67da1e18393cb7ea7b58fd977 //接收哈希槽的ID
Source node #1: 2a660178c3f1dfbf5a68c406cf8737af1014f09 //移除的ID
Source node #2: done
3.4.2删除从节点
//删除192.168.10.88:6383实例的从节点
[root@redis-cluser-01 ~]# redis-cli --cluster del-node 192.168.10.89:6383 870b69f82cf1abed4d2fd42c573f321d28c73303
>>> Removing node 870b69f82cf1abed4d2fd42c573f321d28c73303 from cluster 192.168.10.89:6383
>>> Sending CLUSTER FORGET messages to the cluster...
>>> SHUTDOWN the node.
3.4.3删除主节点
[root@redis-cluser-01 ~]# redis-cli --cluster del-node 192.168.10.88:6383 2a660178c3f1dfbf5a68c406cf8737af1014f09d
>>> Removing node 2a660178c3f1dfbf5a68c406cf8737af1014f09d from cluster 192.168.10.88:6383
>>> Sending CLUSTER FORGET messages to the cluster...
>>> SHUTDOWN the node.
四、故障转移测试
redis cluster默认都是一组主从复制状态
4.1随机宕机一个主节点
[root@redis-cluser-01 ~]# systemctl stop redis-6381.service
4.2随机宕机一个从节点
[root@redis-cluser-01 ~]# systemctl stop redis-6382.service
五、附
- Redis cluster有实例运行端口和集群总线端口(常规端口加10000,用于集群节点访问)
-
集群节点之间可以配置firewalld授信模式,配置firewalld防火墙trusted区域
[root@redis-cluser-01 ~]# vim /etc/firewalld/zones/trusted.xml <?xml version="1.0" encoding="utf-8"?> <zone target="ACCEPT"> <short>Trusted</short> <description>All network connections are accepted.</description> <interface name="ens192"/> <source address="192.168.10.88/32"/> <source address="192.168.10.89/32"/> </zone> [root@redis-cluser-01 ~]# firewall-cmd --reload
- Redis实例密码配置
Redis建议配置密码。如果开启密码认证则需要添加以下参数
requirepass “intel.com”
masterauth “intel.com”
-
以上为redis-cluster系统架构,程序连接redis程序需通过实际情况进行连接。
-
官方文档:https://redis.io/topics/cluster-tutorial
留言