单点部暑
服务器:test11 & ip:192.168.37.11
系统版本:centos 7.6
redis版本:redis 5.0.5
下载安装包:
wget http://download.redis.io/releases/redis-5.0.5.tar.gz
解压安装包:
tar zxf redis-5.0.5.tar.gz -C /usr/local/
进入解压后目录编译
[root@test11 ~]# cd /usr/local/redis-5.0.5/
[root@test11 ~]# make
- 启动redis服务:
nohup ./src/redis-server >/dev/null 2>&1 &
- 简单测试redis
[root@test11 redis-5.0.5]# ./src/redis-cli
127.0.0.1:6379> set key01 HelloWord #设置一个key
OK
127.0.0.1:6379>keys * #列出所有key
1) "key01"
127.0.0.1:6379> get key01 #获取指定key的值
"HelloWord"
192.168.37.11:7006> del foo #删除key值
-> Redirected to slot [12182] located at 192.168.37.11:7003
(integer) 1
集群部暑
简介
redis有三种集群方式:主从复制,哨兵模式和Redis-Cluster集群。Redis-Cluster集群模式是从redis 3.0开始提供了,目前redis最新版本已经到了5.0了,建议最新安装redis集群的直接采用Redis-Cluster集群模式。主从模式和哨兵模式缺点相对明显,这里就不介绍了,下面将着重介绍Redis-Cluster集群模式。
Redis-Cluster采用无中心结构,它的特点如下:
所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽。
节点的fail是通过集群中超过半数的节点检测失效时才生效。
客户端与redis节点直连,不需要中间代理层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可
工作方式
在redis的每一个节点上,都有这么两个东西,一个是插槽(slot),它的的取值范围是:0-16383。还有一个就是cluster,可以理解为是一个集群管理的插件。当我们的存取的key到达的时候,redis会根据crc16的算法得出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,通过这个值,去找到对应的插槽所对应的节点,然后直接自动跳转到这个对应的节点上进行存取操作。
为了保证高可用,redis-cluster集群引入了主从模式,一个主节点对应一个或者多个从节点,当主节点宕机的时候,就会启用从节点。当其它主节点ping一个主节点A时,如果半数以上的主节点与A通信超时,那么认为主节点A宕机了。如果主节点A和它的从节点A1都宕机了,那么该集群就无法再提供服务了。
部暑
要创建集群,我们首先要做的是在集群模式下运行一些空的Redis实例,本实验中,我们在一台test11服务器上搭建6个节点的Redis集群(实际生产环境,需要3台Linux服务器分布存放3个Master),如下:
- 批量创建6个节点的文件夹,以端口号命名:
mkdir cluster-test/700{1,2,3,4,5,6} -p
- 拷贝redis-server redis-cli到cluster-test文件夹下(上面单点部暑生成的服务端与客户端)
[root@test11 redis-5.0.5]# cd src/
[root@test11 src]# cp redis-server redis-cli ../cluster-test/
- 拷贝redis.conf文件到cluster-test/7001下,并修改配置文件如下:
bind 192.168.37.11 #连入主机的ip地址,不修改外部无法连入你的redis缓存服务器中
port 7001
dir ./7001/ #数据存放路径
pidfile /usr/local/redis-5.0.5/cluster-test/7001/redis_7001.pid
appendonly yes #指定是否在每次更新操作后进行日志记录
cluster-enabled yes #开启集群模式
cluster-config-file 7001/nodes-7001.conf #存储此节点配置的文件路径,只是在Redis Cluster实例启动时生成,并在每次需要时更新
cluster-node-timeout 5000 #集群超时时间,节点超过这个时间没反应就断定是宕机
daemonize yes #开启守护进程模式
把7001目录下的redis.conf文件复制到其余700x的目录下,并更改配置文件里的端口号
写一个启动集群实例redis的脚本
[root@test11 cluster-test]# cat start-cluster.sh
#! /bin/bash
cd /usr/local/redis-5.0.5/cluster-test/
for ((i=1;i<=6;i++))
do
./redis-server 700$i/redis.conf
done
- 给脚本赋执行权限,并启动脚本
[root@test11 cluster-test]# chmod +x start-cluster.sh
[root@test11 cluster-test]# ./start-cluster.sh
[root@test11 cluster-test]# ps aux|grep redis
root 19645 0.1 0.0 153892 2832 ? Ssl 16:48 0:00 ./redis-server 192.168.37.11:7001 [cluster]
root 19647 0.1 0.0 153892 2832 ? Ssl 16:48 0:00 ./redis-server 192.168.37.11:7002 [cluster]
root 19649 0.1 0.0 156964 2856 ? Ssl 16:48 0:00 ./redis-server 192.168.37.11:7003 [cluster]
root 19654 0.1 0.0 156964 2856 ? Ssl 16:48 0:00 ./redis-server 192.168.37.11:7004 [cluster]
root 19665 0.1 0.0 153892 2836 ? Ssl 16:48 0:00 ./redis-server 192.168.37.11:7005 [cluster]
root 19667 0.1 0.0 153892 2836 ? Ssl 16:48 0:00 ./redis-server 192.168.37.11:7006 [cluster]
- 创建集群,在redis 5版本后创建很简单,因为可以用redis-cli直接创建集群,对于Redis版本3或4,有一个名为redis-trib.rb非常相似的工具,具体安装办法请另行搜索文档,集群创建如下:
[root@test11 cluster-test]# ./redis-cli --cluster create 192.168.37.11:7001 192.168.37.11:7002 192.168.37.11:7003 192.168.37.11:7004 192.168.37.11:7005 192.168.37.11:7006 --cluster-replicas 1
#--cluster-replicas 1 意味着我们希望每个创建的主服务器都有一个从服 其他参数是我要用于创建新集群的实例的地址列表
#按照提示输入yes,等一会后看到屏幕输出 “[OK] All 16384 slots covered.”,即证明集群创建成功
- 简单测试一下Redis Cluster,以下是使用redis-cli命令行的交互示例
[root@test11 cluster-test]# ./redis-cli -h 192.168.37.11 -c -p 7001
192.168.37.11:7001> set foo bar
-> Redirected to slot [12182] located at 192.168.37.11:7003
OK
192.168.37.11:7003> set hello world
-> Redirected to slot [866] located at 192.168.37.11:7001
OK
192.168.37.11:7001> get foo
-> Redirected to slot [12182] located at 192.168.37.11:7003
"bar"
192.168.37.11:7003> get hello
-> Redirected to slot [866] located at 192.168.37.11:7001
"world"
192.168.37.11:7001>
#退出redis-cli命令行,并把7001的redis关掉,再进去看下原来存放在7001的节点hello的key值,如下:
192.168.37.11:7001> quit
[root@test11 cluster-test]# ./redis-cli -h 192.168.37.11 -c -p 7001 shutdown
[root@test11 cluster-test]# ps aux|grep redis #7001已经被关掉了
root 22600 0.1 0.0 156964 3344 ? Ssl 7月10 1:15 ./redis-server 192.168.37.11:7002 [cluster]
root 22605 0.1 0.0 159012 3344 ? Ssl 7月10 1:19 ./redis-server 192.168.37.11:7003 [cluster]
root 22610 0.1 0.0 161060 3384 ? Ssl 7月10 1:22 ./redis-server 192.168.37.11:7004 [cluster]
root 22615 0.1 0.0 161060 3372 ? Ssl 7月10 1:23 ./redis-server 192.168.37.11:7005 [cluster]
root 22620 0.1 0.0 161060 3384 ? Ssl 7月10 1:23 ./redis-server 192.168.37.11:7006 [cluster]
root 29738 0.0 0.0 112728 988 pts/0 R+ 10:14 0:00 grep --color=auto redis
[root@test11 cluster-test]# ./redis-cli -h 192.168.37.11 -c -p 7002
192.168.37.11:7002> get hello
-> Redirected to slot [866] located at 192.168.37.11:7004 #原来存放在7001的key值存放到7004上了
"world"
#重新启动一下7001节点
[root@test11 cluster-test]# ./redis-server 7001/redis.conf
#再查看一下节点状态
192.168.37.11:7004> cluster nodes
bcba724b6e97da7cd7c650ace2b02ad68d0cb75a 192.168.37.11:7002@17002 master - 0 1562811393000 2 connected 5461-10922
fc48836459091a72854e9334b2cb946ff63a0e9b 192.168.37.11:7003@17003 master - 0 1562811393000 3 connected 10923-16383
e3d3ec5d1b4b0616ffdcee93d0c5ad4114f84efe 192.168.37.11:7001@17001 slave fb9a846bb1f82622c4a728bfe4e2ad6749ce8d19 0 1562811392002 7 connected
a015b4fb0c20ad986abaa91d7d6a803171eacf75 192.168.37.11:7005@17005 slave bcba724b6e97da7cd7c650ace2b02ad68d0cb75a 0 1562811392505 5 connected
6ce44274e68c47446040ead84b8e077f7e3890ea 192.168.37.11:7006@17006 slave fc48836459091a72854e9334b2cb946ff63a0e9b 0 1562811393005 6 connected
fb9a846bb1f82622c4a728bfe4e2ad6749ce8d19 192.168.37.11:7004@17004 myself,master - 0 1562811391000 7 connected 0-5460 #原来7001是master节点的,由于shutdown后,7004节点由slave节点变为master节点
管理集群
- 添加新节点
创建一个7007的空白实例节点,创建步骤参考上面,启动节点后,把节点加入集群
#使用add-node命令将新节点的地址指定为第一个参数,并将集群中***随机***存在节点的地址指定为第二个参数
[root@test11 cluster-test]# ./redis-cli --cluster add-node 192.168.37.11:7007 192.168.37.11:7002
#进入集群,查看节点状态:
[root@test11 cluster-test]# ./redis-cli -h 192.168.37.11 -c -p 7007
192.168.37.11:7007> cluster nodes
fb9a846bb1f82622c4a728bfe4e2ad6749ce8d19 192.168.37.11:7004@17004 master - 0 1562815745275 7 connected 0-5460
fc48836459091a72854e9334b2cb946ff63a0e9b 192.168.37.11:7003@17003 master - 0 1562815746585 3 connected 10923-16383
bcba724b6e97da7cd7c650ace2b02ad68d0cb75a 192.168.37.11:7002@17002 master - 0 1562815746281 2 connected 5461-10922
a015b4fb0c20ad986abaa91d7d6a803171eacf75 192.168.37.11:7005@17005 slave bcba724b6e97da7cd7c650ace2b02ad68d0cb75a 0 1562815744572 2 connected
e3d3ec5d1b4b0616ffdcee93d0c5ad4114f84efe 192.168.37.11:7001@17001 slave fb9a846bb1f82622c4a728bfe4e2ad6749ce8d19 0 1562815745000 7 connected
6ce44274e68c47446040ead84b8e077f7e3890ea 192.168.37.11:7006@17006 slave fc48836459091a72854e9334b2cb946ff63a0e9b 0 1562815746080 3 connected
335c44207c90db737d2848d0b302e751b10c8fab 192.168.37.11:7007@17007 myself,master - 0 1562815746000 0 connected
- 将新副本分配给特定的主副本,如下将7007节点设置为7002节点的从节点
./redis-cli --cluster add-node 192.168.37.11:7007 192.168.37.11:7002 --cluster-slave --cluster-master-id bcba724b6e97da7cd7c650ace2b02ad68d0cb75a
- 删除节点,例下面将删除新添加的7007节点
命令:redis-cli - -cluster del-node 127.0.0.1:7001 “node-id”
[root@test11 cluster-test]# ./redis-cli --cluster del-node 192.168.37.11:7001 335c44207c90db737d2848d0b302e751b10c8fab