搭建Redis集群(Redis cluster)

概述:

1.为什么使用redis?

redis是一种典型的no-sql 即非关系数据库 像python的字典一样 存储key-value键值对 工作在memory中
所以很适合用来充当整个互联网架构中各级之间的cache 比如lvs的4层转发层 nginx的7层代理层
尤其是lnmp架构应用层如php-fpm或者是Tomcat到mysql之间 做一个cache 以减轻db的压力
因为有相当一部分的数据 只是简单的key-value对应关系,而且在实际的业务中常常在短时间内迅速变动 
如果用关系数据库mysql之类存储 会大大增加对db的访问 导致db的负担很重 因为所有的require中的大部分最后都要汇聚到db
所以如果想要业务稳定 那么解决db的压力 就是关键 所以现在大部分的解决方案就是在db层之上的各级使用多级的no-sql ,像memcache redis 等 来为db提供缓冲  

2.为什么使用redis-cluster?

为了在大流量访问下提供稳定的业务,集群化是存储的必然形态。未来的发展趋势肯定是云计算和大数据的紧密结合 只有分布式架构能满足要求,如果没有集群化 何来的分布式?

实验:

实验前提:

已经源码编译安装好了redis

点击此处即可查看redis的源码编译安装详细过程

安装包:

redis-5.0.3.tar.gz

1.分配内存

内核参数:overcommit_memory,它是内存分配策略,可选值:0、1、2
0   #表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
1   #表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
2   #表示内核允许分配超过所有物理内存和交换空间总和的内
[root@server1 ~]# sysctl vm.overcommit_memory
vm.overcommit_memory = 0
#设定为1表示内核允许分配所有的物理内存,而不管当前的内存状态如何
[root@server1 ~]# sysctl vm.overcommit_memory=1
vm.overcommit_memory = 1

2.创建redis实例

(1).创建目录

[root@server1 ~]# cd /usr/local/
[root@server1 local]# mkdir rediscluster
[root@server1 local]# cd rediscluster/
[root@server1 rediscluster]# ls
[root@server1 rediscluster]# mkdir 700{1..6}
[root@server1 rediscluster]# ls
7001  7002  7003  7004  7005  7006

(2).编写文件

[root@server1 rediscluster]# cd 7001
[root@server1 7001]# ls
[root@server1 7001]# vim redis.conf
###################
port 7001                                             #设定redis实例的端口
cluster-enabled yes                                   #开启集群功能;此redis实例作为集群的一个节点,否则,它是一个普通的单一的redis实例                 
cluster-config-file nodes.conf                        #集群配置文件;注意:此配置文件不能人工编辑,它是集群节点自动维护的文件,主要用于记录集群中有哪些节点、他们的状态以及一些持久化参数等,方便在重启时恢复这些状态。通常是在收到请求之后这个文件就会被更新。
cluster-node-timeout 5000                             #集群中的节点能够失联的最大时间;超过这个时间,该节点就会被认为故障
appendonly yes                                        #开启AOF模式 
pidfile "/usr/local/rediscluster/7001/redis.pid"      #存放pid文件路径
logfile "/usr/local/rediscluster/7001/redis.log"      #存放log日志路径
dir "/usr/local/rediscluster/7001"                    #数据目录路径
daemonize yes                                         #打入后台

在这里插入图片描述
(3).开启redis-server(7001)

[root@server1 7001]# redis-server redis.conf
[root@server1 7001]# ps ax | grep redis

(4).拷贝文件并开启其他的redis-server

[root@server1 7001]# ls
appendonly.aof  nodes.conf  redis.conf  redis.log  redis.pid
#1.拷贝文件
[root@server1 7001]# cp redis.conf ../7002
[root@server1 7001]# cp redis.conf ../7003
[root@server1 7001]# cp redis.conf ../7004
[root@server1 7001]# cp redis.conf ../7005
[root@server1 7001]# cp redis.conf ../7006
[root@server1 7001]# cd ..
[root@server1 rediscluster]# ls
7001  7002  7003  7004  7005  7006
[root@server1 rediscluster]# cd 7002
[root@server1 7002]# ls
redis.conf
#2.更改文件
[root@server1 7002]# vim redis.conf 
####################
:%s/7001/7002/g    #全文替换

在这里插入图片描述

#3.开启redis-server
[root@server1 7002]# redis-server redis.conf
[root@server1 7002]# cd ../7003
[root@server1 7003]# vim redis.conf 

在这里插入图片描述

[root@server1 7003]# redis-server redis.conf
[root@server1 7003]# cd ../7004
[root@server1 7004]# vim redis.conf 

在这里插入图片描述

[root@server1 7004]# redis-server redis.conf
[root@server1 7004]# cd ../7005/
[root@server1 7005]# vim redis.conf 

在这里插入图片描述

[root@server1 7005]# redis-server redis.conf
[root@server1 7005]# cd ../7006/
[root@server1 7006]# vim redis.conf 

在这里插入图片描述

[root@server1 7006]# redis-server redis.conf

(5).查看进程

#查看进程;这就相当于创建了6个reids实例
[root@server1 7006]# ps ax | grep redis

在这里插入图片描述
3.创建redis集群

#将创建的6个实例添加到redis集群中,会自动分配3个master和3个slave;create表示创建集群
[root@server1 ~]# redis-cli --cluster create --cluster-replicas 1 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006

在这里插入图片描述
4.检测集群完整性

集群完整性是指所有的哈希槽都分配到存活的redis主节点(master)上,只要16384个哈希槽中有一个未被分配,则表示集群不完整
#127.0.0.1表示本机ip
[root@sever1 ~]# redis-cli --cluster check 127.0.0.1:7001

在这里插入图片描述
5.查看集群信息

#info表示查看信息 ,端口7001-7006均可(访问任何一个入口都能进入reis集群,即无中心化)
[root@server1 ~]# redis-cli --cluster info 127.0.0.1:7001
[root@server1 ~]# redis-cli --cluster info 127.0.0.1:7002

在这里插入图片描述
6.远程登陆集群

redis集群:是去中心化的,每个节点都是对等的,连接哪个节点都可以获取和设置数据。
[root@server1 ~]# redis-cli -p 7001
127.0.0.1:7001> set name westos
(error) MOVED 5798 127.0.0.1:7002
127.0.0.1:7001> get name
(error) MOVED 5798 127.0.0.1:7002
127.0.0.1:7001> exit

在这里插入图片描述

#必须加-c才能识别
[root@server1 ~]# redis-cli  -c -p 7001
127.0.0.1:7001> set name westos
-> Redirected to slot [5798] located at 127.0.0.1:7002   
OK
127.0.0.1:7002> exit

从

[root@server1 ~]# redis-cli -c -p 7006
127.0.0.1:7006> get name
-> Redirected to slot [5798] located at 127.0.0.1:7002
"westos"
127.0.0.1:7002> exit

在这里插入图片描述
7.自动故障切换

注意:要测试自动故障切换,首先需要先搞清楚redis集群的主从关系

先进一步检测主从关系:

[root@sever1 ~]# redis-cli -c -p 7001
127.0.0.1:7001> info

在这里插入图片描述

[root@sever1 ~]# redis-cli -c -p 7002
127.0.0.1:7002> info

在这里插入图片描述

[root@sever1 ~]# redis-cli -c -p 7003
127.0.0.1:7003> info

在这里插入图片描述
redis集群的主从关系如下:

master slave
7001 7006
7002 7004
7003 7003

(1)模拟master(7002)宕机

[root@sever1 ~]# redis-cli -c -p 7002
127.0.0.1:7002> shutdown
not connected> exit

在这里插入图片描述

#发现7002端口消失
[root@sever1 ~]# ps ax | grep redis

在这里插入图片描述
(2)发现7004接管master(在7002宕机之前,7004是7002的slave)

[root@server1 ~]# redis-cli --cluster info 127.0.0.1:7001

在这里插入图片描述
(3)再模拟7004宕机

[root@sever1 ~]# redis-cli -c -p 7004
127.0.0.1:7004> shutdown
not connected> exit

在这里插入图片描述

#发现7004端口消失
[root@sever1 ~]# ps ax | grep redis

在这里插入图片描述
(4)此时发现这个master会彻底崩溃,因此redis集群中便少了一个master

[root@sever1 ~]# redis-cli --cluster info 127.0.0.1:7001

在这里插入图片描述
8.恢复集群结点

[root@sever1 ~]# cd /usr/local/rediscluster/
[root@sever1 rediscluster]# ls
7001  7002  7003  7004  7005  7006
[root@sever1 rediscluster]# cd 7002
#1.启动redis-server(7002)
[root@sever1 7002]# redis-server redis.conf 
[root@sever1 7002]# cd ../7004
#2.启动redis-server(7004)
[root@sever1 7004]# redis-server redis.conf
#3.查看进程
[root@sever1 7004]# ps ax | grep redis

在这里插入图片描述

[root@sever1 ~]# redis-cli --cluster info 127.0.0.1:7001

在这里插入图片描述

#发现此时7004是7002的master
[root@sever1 ~]# redis-cli -c -p 7004
127.0.0.1:7004> info

在这里插入图片描述
9.添加新结点到redis集群

(1).创建实例

[root@sever1 ~]# cd /usr/local/rediscluster/
[root@sever1 rediscluster]# ls
7001  7002  7003  7004  7005  7006
#创建目录
[root@sever1 rediscluster]# mkdir 7007
[root@sever1 rediscluster]# mkdir 7008
[root@sever1 rediscluster]# ls
7001  7002  7003  7004  7005  7006  7007  7008
[root@sever1 rediscluster]# cd 7006
[root@sever1 7006]# ls
appendonly.aof  dump.rdb  nodes.conf  redis.conf  redis.log  redis.pid
#拷贝文件
[root@sever1 7006]# cp redis.conf ../7007/
[root@sever1 7006]# cp redis.conf ../7008/
[root@sever1 7006]# cd ../7007/
#更改文件
[root@sever1 7007]# vim redis.conf 

在这里插入图片描述

#开启redis-server(7007)
[root@sever1 7007]# redis-server redis.conf
[root@sever1 7007]# cd ../7008/
[root@sever1 7008]# vim redis.conf 

在这里插入图片描述

#开启redis-server(7008)
[root@sever1 7008]# redis-server redis.conf
#查看进程
[root@sever1 7008]# ps ax | grep redis

在这里插入图片描述
(2).将实例添加到集群中

1.默认添加的是master

#add-node表示添加结点
[root@sever1 ~]# redis-cli --cluster add-node 127.0.0.1:7007 127.0.0.1:7001

在这里插入图片描述

#检测集群
[root@sever1 ~]# redis-cli --cluster check 127.0.0.1:7001

在这里插入图片描述
2.指定添加为7007的slave

#80eacc52833072df793c1d948cccfa191c3ec058为7007的id
[root@sever1 ~]# redis-cli --cluster add-node --cluster-slave --cluster-master-id "80eacc52833072df793c1d948cccfa191c3ec058" 127.0.0.1:7008 127.0.0.1:7001

在这里插入图片描述

#检测集群
[root@sever1 ~]# redis-cli --cluster check 127.0.0.1:7001

在这里插入图片描述
在这里插入图片描述
3.迁移数据槽

#从所有的结点上,迁移300个数据槽到7007结点上;80eacc52833072df793c1d948cccfa191c3ec058 为7007的id
[root@sever1 ~]# redis-cli --cluster reshard --cluster-from all --cluster-to 80eacc52833072df793c1d948cccfa191c3ec058 --cluster-slots 300 --cluster-yes 127.0.0.1:7001

--cluster-from all       #所有节点
--cluster-slots 300      #迁移数据槽的个数
127.0.0.1:7001           #进入集群的一个接口,集群中任意一个成员都可以

在这里插入图片描述
在这里插入图片描述

#检测集群
[root@sever1 ~]# redis-cli --cluster check 127.0.0.1:7001

在这里插入图片描述
4.均衡数据槽

[root@sever1 ~]# redis-cli --cluster rebalance --cluster-threshold 1 --cluster-use-empty-masters 127.0.0.1:7001

rebalance                        #重新进行均衡
--cluster-use-empty-masters      #忽略空的master

在这里插入图片描述

#检测集群
[root@sever1 ~]# redis-cli --cluster check 127.0.0.1:7001

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/lilygg/article/details/88033282