集群
定义:通过多个Redis实例来组成Redis集群。
特点:
1.每个实例上存储的数据都不同。
2.要求每个节点必须至少拥有一个从节点。以防止集群崩溃。
3.当主节点坏了的时候,从节点可以补上。
4.redis集群是为了强化redis的读写能力。
(1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.
(2)节点的fail是通过集群中超过半数的节点检测失效时才生效.
(3)客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可
(4)redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护node<->slot<->value
Redis集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value 时,redis 先对key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点
投票过程是集群中所有master参与,如果半数以上master节点与master节点通信超时(cluster-node-timeout),认为当前master节点挂掉.
什么时候整个集群不可用(cluster_state:fail)?
如果集群任意master挂掉,且当前master没有slave.集群进入fail状态,也可以理解成集群的slot映射[0-16383]不完整时进入fail状态.
如果集群超过半数以上master挂掉,无论是否有slave,集群进入fail状态.
Redis集群搭建
Redis集群中至少需要三个节点。要保证集群的高可用,每个节点有一个备份机。所以需要6台服务器。
可以使用一台虚拟机运行6个redis实例。 3个主 3个从 3个主组成集群。
第一步:redis1~redis6即可
- 创建文件夹
mkdir cluster
[root@localhost ~]# mkdir cluster
[root@localhost ~]# ls
1.txt d.avi movie
2.txt file redis-3.2.9.tar.gz
anaconda-ks.cfg game redis.conf
apache-tomcat-9.0.2.tar.gz home test.tar.gz
a.txt initial-setup-ks.cfg web.war
cluster jdk-8u191-linux-x64.tar.gz wordpress.zip
c.txt master-slave zhl
- 解压Redis到cluster目录下
tar -xvf redis-3.2.9.tar.gz -C ./cluster/
- 进入文件夹
cd cluster/
[root@localhost ~]# cd cluster/
[root@localhost cluster]#
-
修改redis-3.2.9文件夹名–>redis1
mv redis-3.2.9/ redis1复制redis1,复制5分,分别命名redis2~redis6
[root@localhost cluster]# mv redis-3.2.9/ redis1
[root@localhost cluster]# cp -r redis1/ redis2
[root@localhost cluster]# cp -r redis1/ redis3
[root@localhost cluster]# cp -r redis1/ redis4
[root@localhost cluster]# cp -r redis1/ redis5
[root@localhost cluster]# cp -r redis1/ redis6
[root@localhost cluster]#
第二步:修改配置文件
(1)打开配置文件
vim redis1/redis.conf
(2)修改配置文件内容
- 端口号 84行 port 7111
- 取消IP绑定 61行 #bind 127.0.0.1
- 关闭保护模式 80行 protected-mode no
(3)将redis1文件夹中的配置文件redis.conf赋值到redis2-6中
cp redis1/redis.conf redis2/
cp redis1/redis.conf redis3/
cp redis1/redis.conf redis4/
cp redis1/redis.conf redis5/
cp redis1/redis.conf redis6/
[root@localhost cluster]# cp redis1/redis.conf redis2/
cp:是否覆盖"redis2/redis.conf"? Y
[root@localhost cluster]# cp redis1/redis.conf redis3/
cp:是否覆盖"redis3/redis.conf"? y
[root@localhost cluster]# cp redis1/redis.conf redis4/
cp:是否覆盖"redis4/redis.conf"? y
[root@localhost cluster]# cp redis1/redis.conf redis5/
cp:是否覆盖"redis5/redis.conf"? y
[root@localhost cluster]# cp redis1/redis.conf redis6/
cp:是否覆盖"redis6/redis.conf"? y
(4) 然后再分别改一下redis2-redis6目录下的配置文件redis.conf中的端口号
vim redis2/redis.conf
84行
[root@localhost cluster]# vim redis2/redis.conf
[root@localhost cluster]# vim redis3/redis.conf
[root@localhost cluster]# vim redis4/redis.conf
[root@localhost cluster]# vim redis5/redis.conf
[root@localhost cluster]# vim redis6/redis.conf
第三步:创建启动文件
- 在安装cluster目录下安装ruby
yum -y install ruby
yum -y install rubygems
- 往服务器上传文件:redis-3.2.2.gem
[root@localhost cluster]# gem install redis-3.2.2.gem
Successfully installed redis-3.2.2
Parsing documentation for redis-3.2.2
Installing ri documentation for redis-3.2.2
1 gem installed
- 启动脚本的编写:
复制/usr/local/redis-3.2.9/src/redis-trib.rb文件到当前文件夹
cp /usr/local/redis-3.2.9/src/redis-trib.rb .
[root@localhost cluster]# cp /usr/local/redis-3.2.9/src/redis-trib.rb .
[root@localhost cluster]# ls
redis1 redis2 redis3 redis-3.2.2.gem redis4 redis5 redis6 redis-trib.rb
- 修改6个实例,后台运行redis.conf的128行no改成yes
[root@localhost cluster]# vim redis2/redis.conf
[root@localhost cluster]# vim redis3/redis.conf
[root@localhost cluster]# vim redis4/redis.conf
[root@localhost cluster]# vim redis5/redis.conf
[root@localhost cluster]# vim redis6/redis.conf
- 创建 start-all.sh文件:
在该文件中编辑以下内容
cd redis1
redis-server redis.conf
cd ..
cd redis2
redis-server redis.conf
cd ..
cd redis3
redis-server redis.conf
cd ..
cd redis4
redis-server redis.conf
cd ..
cd redis5
redis-server redis.conf
cd ..
cd redis6
redis-server redis.conf
cd ..
./redis-trib.rb create --replicas 1 192.168.222.128:7111 192.168.222.128:7112 192.168.222.128:7113 192.168.222.128:7114 192.168.222.128:7115 192.168.222.128:7116
--replicas 1 表示 自动为每一个master节点分配一个slave节点 上面有6个节点,程序会按照一定规则生成 3个master(主)3个slave(从)
128行改成后台运行
- 通过vim命令进入到redis.conf
- 修改cluster-enabled yes前的注释去掉
721行
[root@localhost cluster]# vim redis2/redis.conf
[root@localhost cluster]# vim redis3/redis.conf
[root@localhost cluster]# vim redis4/redis.conf
[root@localhost cluster]# vim redis5/redis.conf
[root@localhost cluster]# vim redis6/redis.conf
- 启动服务IQ并查看进程
[root@localhost cluster]# #sh start-all.sh
[root@localhost cluster]# ps -ef | grep redis
root 3967 1 0 00:42 ? 00:01:12 redis-server 127.0.0.1:6379
root 15138 14858 0 13:26 pts/1 00:00:00 vim redis6380.conf
root 15181 14858 0 13:29 pts/1 00:00:00 vim redis6382.conf
root 15191 14858 0 13:29 pts/1 00:00:00 vim redis6384.conf
root 15193 1 0 13:29 ? 00:00:23 redis-server 127.0.0.1:6380
root 15199 1 0 13:30 ? 00:00:22 redis-server 127.0.0.1:6382
root 15214 1 0 13:30 ? 00:00:22 redis-server 127.0.0.1:6384
root 21110 20061 0 22:08 pts/0 00:00:00 grep --color=auto redis
-
创建停止脚本:
touch shutdown-all.sh -
编辑关闭服务器的文件
redis-cli -p 7111 shutdown
redis-cli -p 7112 shutdown
redis-cli -p 7113 shutdown
redis-cli -p 7114 shutdown
redis-cli -p 7115 shutdown
redis-cli -p 7116 shutdown
rm -f redis*/dump.rdb
rm -f redis*/appendonly.aof
rm -f redis*/nodes.conf
- 关闭服务
sh shutdown-all.sh