概述:
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-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