redis5.X集群部署及使用

redis5.X集群部署及使用

Redis是现在最受欢迎的NoSQL数据库之一,Redis是一个使用ANSI C编写的开源、包含多种数据结构、支持网络、基于内存、可选持久性的键值对存储数据库,其具备如下特性:

基于内存运行,性能高效
支持分布式,理论上可以无限扩展
key-value存储系统
开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API

1.介绍

Redis Cluster是Redis官方在Redis 3.0版本正式推出的高可用以及分布式的解决方案。目前redis最新版本已是5.0.x,本文以redis5.0.5版本为例来搭建redis cluster。

官网Cluster介绍 https://redis.io/topics/cluster-tutorial

官网参考文档 https://redis.io/documentation

1.1 cluster架构

redis-cluster架构:

Redis Cluster由多个Redis实例组成的整体,数据按照槽(slot)存储分布在多个Redis实例上,通过Gossip协议来进行节点之间通信。

架构细节:

所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.

节点的fail是通过集群中超过半数的节点检测失效时才生效.

客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可

redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护node<->slot<->value

redis-cluster选举:

(1)选举过程是集群中所有master参与,如果半数以上master节点与master节点通信超过(cluster-node-timeout),认为当前master节点挂掉。

(2)什么时候整个集群不可用(cluster_state:fail)? 当集群不可用时,所有对集群的操作做都不可用,收到((error) CLUSTERDOWN The cluster is down)错误。

a:如果集群任意master挂掉,且当前master没有slave.集群进入fail状态,也可以理解成进群的slot映射[0-16383]不完成时进入fail状态。

b:如果进群超过半数以上master挂掉,无论是否有slave集群进入fail状态。

2. 机器规划

角色 版本 IP port 系统
node-1 redis-5.0.5 192.168.30.128 7000,7001 centos7.6
node-2 redis-5.0.5 192.168.30.129 7002,7003 centos7.6
node-3 redis-5.0.5 192.168.30.130 7004,7005 centos7.6

3、部署安装

下载地址: http://download.redis.io/releases/

$cd /home && wget http://download.redis.io/releases/redis-5.0.5.tar.gz
$tar -zxvf redis-5.0.5.tar.gz
$cd redis-5.0.5
#编译安装
$make
$make install
$cd /home && mkdir cluster-test
$cd cluster-test && mkdir 7000 7001 7002 7003 7004 7005
#拷贝redis.conf到6个不同文件7000-7005中
$cp -rf /home/redis-5.0.5/redis.conf /home/cluster-test/7000/
#编辑6个不同文件7000-7005
vim 7000/redis.conf
#监听ip,多个ip用空格分隔
bind 192.168.30.128
#监听端口                                                                      
port 7000
#如旧版本创建集群有问题需要修改关闭保护模式                                                                               
protected-mode no
#允许后台启动                                                                
daemonize yes
#当redis以守护模式启动时edis instance会将进程号pid写入默认文件/var/run/redis.pid可以修改                                                                       
pidfile /var/run/redis_7000.pid
#日志路径                                           
logfile /home/S2B/redis/cluster-test/7000/redis.log
#数据库备份文件存放目录           
dir /home/S2B/redis/redis-cluster/7000/
#slave连接master密码,master可省略  旧版如创建集群有问题需注释掉                               
masterauth 123456
#设置master连接密码,slave可省略      旧版如创建集群有问题需注释掉                                                                
requirepass 123456
#开实列集群模式                                                                
cluster-enabled yes
#保存节点配置文件的路径                                                                
cluster-config-file /home/S2B/redis/cluster-test/7000/nodes-7000.conf
#超时时间                                                
cluster-node-timeout 5000
#在dir指定目录生成appendonly.aof文件,将每一次写操作请求都追加到appendonly.aof 文件中                                                    
appendonly yes

#编译出可执行文件 redis-server , 并将文件复制到 cluster-test 文件夹
$cd /home/redis-5.0.5/src && cp redis-server /home/cluster-test/
$cd /home/cluster-test
#启动服务6个 7000-7005
$./redis-server /home/cluster-test/7000/redis.conf
。。。。。。。。。。

4.创建集群:

./redis-cli --cluster create 192.168.30.128:7000 192.168.30.128:7001 192.168.30.129:7002 192.168.30.129:7003 192.168.30.130:7004 192.168.30.130:7005 --cluster-replicas 1

可以看到:

192.168.30.128:7000是master,它的slave是192.168.30.129:7003;

192.168.30.129:7002是master,它的slave是192.168.30.130:7005;

192.168.30.130:7004是master,它的slave是192.168.30.128:7001;

5.登录集群:

#-c,使用集群方式登录	
redis-cli -c -h 192.168.30.128 -p 7001 -a 123456   

6.查看集群信息:

192.168.30.128:7001> CLUSTER INFO 

7.列出节点信息:

192.168.30.128:7001> CLUSTER NODES

8.写入数据:

192.168.30.128:7001> set key111 aaa
-> Redirected to slot [13680] located at 192.168.30.130:7005                
OK

192.168.30.130:7005> set key222 bbb
-> Redirected to slot [2320] located at 192.168.30.128:7001                
OK

192.168.30.128:7001> set key333 ccc
-> Redirected to slot [7472] located at 192.168.30.129:7003                 
OK

192.168.30.129:7003> get key111
-> Redirected to slot [13680] located at 192.168.30.130:7005
"aaa"

192.168.30.130:7005> get key333
-> Redirected to slot [7472] located at 192.168.30.129:7003
"ccc"

可以看出redis cluster集群是去中心化的,每个节点都是平等的,连接哪个节点都可以获取和设置数据。

当然,平等指的是master节点,因为slave节点根本不提供服务,只是作为对应master节点的一个备份

9.增加节点:

192.168.30.129上增加一节点

192.168.30.130上增加一节点

请参考第三步部署

10.集群中增加节点:

192.168.30.129:7003> CLUSTER MEET 192.168.30.129 7007

192.168.30.129:7003> CLUSTER MEET 192.168.30.130 7008

192.168.30.129:7003> CLUSTER NODES

可以看到,新增的节点都是以master身份加入集群的

11.更换节点身份:

将新增的192.168.30.130:7008节点身份改为192.168.30.129:7007的slave

redis-cli -c -h 192.168.30.130 -p 7008 -a 123456 cluster replicate e51ab166bc0f33026887bcf8eba0dff3d5b0bf14

cluster replicate后面跟node_id,更改对应节点身份。也可以登入集群更改

redis-cli -c -h 192.168.30.130 -p 7008 -a 123456

192.168.30.130:7008> CLUSTER REPLICATE e51ab166bc0f33026887bcf8eba0dff3d5b0bf14
OK

192.168.30.130:7008> CLUSTER NODES

查看相应的nodes.conf文件,可以发现有更改,它记录当前集群的节点信息
cat /data/redis/cluster/redis_7001/nodes-7001.conf

12.删除节点:

192.168.30.130:7008> CLUSTER FORGET 1a1c7f02fce87530bd5abdfc98df1cffce4f1767
(error) ERR I tried hard but I can't forget myself...           #无法删除登录节点

192.168.30.130:7008> CLUSTER FORGET e51ab166bc0f33026887bcf8eba0dff3d5b0bf14
(error) ERR Can't forget my master!                 #不能删除自己的master节点

192.168.30.130:7008> CLUSTER FORGET 6788453ee9a8d7f72b1d45a9093838efd0e501f1
OK              #可以删除其它的master节点

192.168.30.130:7008> CLUSTER NODES

192.168.30.130:7008> CLUSTER FORGET b4d3eb411a7355d4767c6c23b4df69fa183ef8bc
OK              #可以删除其它的slave节点

13.保存配置:

192.168.30.130:7008> CLUSTER SAVECONFIG                 #将节点配置信息保存到硬盘
OK

可以看到,之前删除的节点又恢复了,这是因为对应的配置文件没有删除,执行CLUSTER SAVECONFIG恢复。

14.模拟master节点挂掉:

192.168.30.128节点:
netstat -lntp |grep 7001
kill -9 id
192.168.30.130:7008> CLUSTER NODES

对应7001的一行可以看到,master fail,状态为disconnected;而对应7004的一行,slave已经变成master

重新启动7001节点:
redis-server /usr/local/redis/cluster/redis_7001.conf

192.168.30.130:7008> CLUSTER NODES

可以看到,7001节点启动后为slave节点,并且是7004的slave节点。即master节点如果挂掉,它的slave节点变为新master节点继续对外提供服务,而原来的master节点如果重启,则变为新master节点的slave节点

另外,如果这里是拿7007节点做测试的话,会发现7008节点并不会切换,这是因为7007节点上根本没数据。集群数据被分为三份,采用哈希槽 (hash slot)的方式来分配16384个slot的话,它们三个节点分别承担的slot 区间是:

节点7004覆盖0-5460

节点7003覆盖5461-10922

节点7005覆盖10923-16384
上一篇:centos8平台redis5日志按天分割


下一篇:设计模式七大原则——单一职责原则