一、案例概述
1.1 单节点Redis服务器带来的问题
●单点故障,服务不可用
●无法处理大量的并发数据请求
●数据丢失一大灾难
1.2 解决方法
●搭建Redis集群
二、案例前置知识点
2.1 Redis集群介绍
●Redis集群是一个提供在多个Redis间节点间共享数据的程序集
●Redis集群并不支持处理多个keys的命令,因为这需要在不同的节点间移动数据,从而达不到像Redis那样的性能,在高负载的情况下可能会导致不可预料的错误
●Redis集群提供分区来提供一定程度的可用性,在实际环境中当某个节点宕机或者不可达的情况下可继续处理命令
2.2 Redis集群的优势
●自动分割数据到不同的节点上
●整个集群的部分节点失败或者不可达的情况下能够继续处理命令
2.3 Redis集群的实现方法
●有客户端分片
●代理分片
●服务器端分片
2.4 Redis-Cluster数据分片
2.5 Redis-Cluster的主从复制模型
2.6 案例实施
三、实验
实验环境:
1.两台服务器:模拟六个节点
2.需要每个服务器上面配置三个网卡
3.1 安装Redis(master)
*yum install gcc gcc-c++ make -y
cd /opt
tar zxvf redis-5.0.7.tar.gz
cd redis-5.0.7/
make
make PREFIX=/usr/local/redis install
ln -s /usr/local/redis/bin/ /usr/local/bin/
cd utils
./install_server.sh
*//一路回车,到额外路径需要手动配置
Please select the redis executable path [/usr/local/bin/redis-server] //输入下面配置,然后再回车
/usr/local/redis/bin/redis-server
netstat -natp | grep 6379
tcp 0 0 127.0.0.1:6379 0.0.0.0: LISTEN 16457/redis-server
3.2 安装Redis(slave)
yum install gcc gcc-c++ make -y
cd /opt
tar zxvf redis-5.0.7.tar.gz
cd redis-5.0.7/
make
make PREFIX=/usr/local/redis install
ln -s /usr/local/redis/bin/ /usr/local/bin/*
cd utils
./install_server.sh
//一路回车,到额外路径需要手动配置
Please select the redis executable path [/usr/local/bin/redis-server] //输入下面配置,然后再回车
/usr/local/redis/bin/redis-server
netstat -natp | grep 6379
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 16457/redis-server
3.3 修改配置文件(master)
hostnamectl set-hostname master
su
vim /etc/redis/6379.conf
70 #bind 127.0.0.1 #注释掉bind,即监听所有
89 protected-mode no #关闭保护功能
93 port 6379
137 daemonize yes #以独立进程启动
700 appendonly yes #开启aof持久化
833 cluster-enabled yes #开启群集
841 cluster-config-file nodes-6379.conf #群集的配置文件
847 cluster-node-timeout 15000 #群集超时时间设置
cd /var/lib/redis/6379/
/etc/init.d/redis_6379 restart
//重启服务
3.4 修改配置文件(slave)
hostnamectl set-hostname master
su
vim /etc/redis/6379.conf
70 #bind 127.0.0.1 #注释掉bind,即监听所有
89 protected-mode no #关闭保护功能
93 port 6379
137 daemonize yes #以独立进程启动
700 appendonly yes #开启aof持久化
833 cluster-enabled yes #开启群集
841 cluster-config-file nodes-6379.conf #群集的配置文件
847 cluster-node-timeout 15000 #群集超时时间设置
cd /var/lib/redis/6379/
/etc/init.d/redis_6379 restart
//重启服务
3.5 安装rvm,RUBY控制集群软件(master)
cd /opt
tar zxvf rvm-master.tar.gz
cd rvm-master/
./install
source /etc/profile.d/rvm.sh
//按照提示,启用环境变量
rvm list known
//列出可以安装的ruby版本
rvm install 2.4.1
rvm use 2.4.1
ruby -v
ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-linux]
gem install redis
//再次安装redis
3.6 添加网卡(master)
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 20.0.0.18 netmask 255.255.255.0 broadcast 20.0.0.255
ens36: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 20.0.0.181 netmask 255.255.255.0 broadcast 20.0.0.255
ens37: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 20.0.0.182 netmask 255.255.255.0 broadcast 20.0.0.255
systemctl restart network
3.7 添加网卡(slave)
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 20.0.0.19 netmask 255.255.255.0 broadcast 20.0.0.255
ens36: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 20.0.0.191 netmask 255.255.255.0 broadcast 20.0.0.255
ens37: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 20.0.0.192 netmask 255.255.255.0 broadcast 20.0.0.255
systemctl restart network
3.8 主服务器创建群集
redis-cli --cluster create 20.0.0.18:6379 20.0.0.181:6379 20.0.0.182:6379 20.0.0.19:6379 20.0.0.191:6379 20.0.0.192:6379 --cluster-replicas 1
//反馈的信息输入yes回车,以下为反馈信息
Performing hash slots allocation on 6 nodes…
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 20.0.0.191:6379 to 20.0.0.18:6379
Adding replica 20.0.0.192:6379 to 20.0.0.181:6379
Adding replica 20.0.0.19:6379 to 20.0.0.182:6379
M: a7eee9a641cee397945f06ac4c21ecac971a6f15 20.0.0.18:6379
slots:[0-5460] (5461 slots) master
M: a7eee9a641cee397945f06ac4c21ecac971a6f15 20.0.0.181:6379
slots:[5461-10922] (5462 slots) master
M: a7eee9a641cee397945f06ac4c21ecac971a6f15 20.0.0.182:6379
slots:[10923-16383] (5461 slots) master
S: 26a71138d1246f4a311a0d3ea172a39738e9cd32 20.0.0.19:6379
replicates a7eee9a641cee397945f06ac4c21ecac971a6f15
S: 26a71138d1246f4a311a0d3ea172a39738e9cd32 20.0.0.191:6379
replicates a7eee9a641cee397945f06ac4c21ecac971a6f15
S: 26a71138d1246f4a311a0d3ea172a39738e9cd32 20.0.0.192:6379
replicates a7eee9a641cee397945f06ac4c21ecac971a6f15
Can I set the above configuration? (type ‘yes’ to accept): yesNodes configuration updated
Assign a different config epoch to each node
Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
Performing Cluster Check (using node 20.0.0.18:6379)
M: a7eee9a641cee397945f06ac4c21ecac971a6f15 20.0.0.18:6379
slots:[0-16383] (16384 slots) master
1 additional replica(s)
S: 26a71138d1246f4a311a0d3ea172a39738e9cd32 20.0.0.19:6379
slots: (0 slots) slave
replicates a7eee9a641cee397945f06ac4c21ecac971a6f15
[OK] All nodes agree about slots configuration.Check for open slots…
Check slots coverage…
[OK] All 16384 slots covered.
//一主一从的绑定关系是随机的
3.9 主从数据验证
[root@master rvm-master]# redis-cli -h 20.0.0.18 -p 6379
创建一个键值
20.0.0.18:6379> set user zhangsan
OK
20.0.0.18:6379> keys *
- “user”
20.0.0.18:6379> get user
“zhangsan”
20.0.0.18:6379> exit
[root@master rvm-master]# redis-cli -h 20.0.0.181 -p 6379
到181节点查看
20.0.0.181:6379> keys *
- “user”
20.0.0.181:6379> get user
“zhangsan”
20.0.0.181:6379> exit
[root@master rvm-master]# redis-cli -h 20.0.0.182 -p 6379
20.0.0.182:6379> get user
“zhangsan”
20.0.0.182:6379> quit
[root@slave opt]# redis-cli -h 20.0.0.192 -p 6379
20.0.0.192:6379> get user
(error) MOVED 14124 20.0.0.18:6379
3.10 测试hash方式存储的值验证与设置键的自动删除时间
[root@master rvm-master]# redis-cli -h 20.0.0.18 -p 6379
20.0.0.18:6379> hset users name zhangsan
(integer) 1
20.0.0.18:6379> keys *
- “user”
- “users”
20.0.0.18:6379> hget users
(error) ERR wrong number of arguments for ‘hget’ command
20.0.0.18:6379> hget users name
“zhangsan”
20.0.0.18:6379> expire user 10
(integer) 1
//设置user的缓存时间为10s
//过了10秒后
20.0.0.18:6379> get user
(nil)
//查看user信息,无法显示
20.0.0.18:6379> keys *
- “users”
//查看键值,发现user已经消失
20.0.0.18:6379> quit