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、部署安装
$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