1.集群
将相同应用部署在不同服务器上,增强应用可用性。例如多个收银台,都是收银功能,有多个,可以解决单点故障,实现应用高可用。每个应用都是一个整体,可以单独运作。这里可以使用nginx来实现多个应用间的调度(负载均衡),可以设置轮询(一个一次),IPhash,随机分配。nginx也可主备结构,防止nginx崩溃导致服务不可用,通过keepalived实现统一使用。
2.分布式
同一应用的不同模块,比如用户模块,订单模块,商品模块,分开来部署,多个模块合起来才是一个整体。此种情况,可以将大应用进行拆分。
3.Redis集群方案
- Redis为什么做集群
- redis数据存储在内存中,存储不了大量数据
- 防止单点故障
- 处理高并发,太多请求,一台服务器搞不定
- 方案一
主从复制
- 主从复制即主Redis服务可以读写,从Redis服务只可读,实现读写分离。可以解决
大量频繁读
的问题 - 图示
- 优缺点
- 支持主从复制,主机数据自动复制到从机,实现读写分离
- 不具备自动容错和恢复功能,主机和从机宕机都会导致部分读写请求失败,需要机器重启或者手动切换IP才可恢复
- 主机宕机,如果有数据未同步到从机,即使切换IP为从机,也会出现数据不一致的问题,降低了数据可用性
- 较难支持在线扩容,集群数量达到上限时在线扩容变得很复杂
- 方案二
哨兵模式
- 主要功能
监视主从服务器是否正常运行
主服务器出现问题时,自动将从服务器提升为主服务器
- 优点
主从可以自动切换
系统可用性更高
- 缺点
没有解决大量数据存储的问题
- 方案三
Redis-Cluster集群
- 多主多从的无中心结构
- 数据分布式存储
- 使用槽来确定数据分配在哪个主服务器上(16384分配在多个主服务器上),key根据CRC16的算法,再对16384求余,得到某个槽,放到槽所在的节点。
- 节点互联,可以相互获取状态,当半数主节点认为某个主节点宕机了,就认为该节点宕机了。
4.集群环境搭建
- 参考网站
- 配置6台Redis服务器
- 修改配置文件(修改6379)
port
cluster-enabled yes
cluster-config-file nodes-6379.conf
cluster-node-timeout 15000
appendonly yes
- 编写启动脚本bat(修改6379)
title redis-6379 redis-server.exe redis.windows.conf
- 安装Ruby rubyinstaller-2.6.3-1-x64.exe
redis集群脚本使用Ruby编写,所以需要安装Ruby - 安装Redis的Ruby驱动redis-xxxx.gem
下载地址
下载后,解压目录执行命令行ruby setup.rb
切换到Redis安装目录,命令行执行gem install redis
- 启动每个节点并执行集群构建脚本
点击之前编写的bat启动Redis服务器(6个)
拷贝redis-trib.rb到redis节点(一个节点即可)
执行redis-trib.rb create --replicas 1 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384
,命令中的IP端口根据实际情况进行修改 - 测试
启动一个redis-cli.exe,使用命令redis-cli.exe -c -h 127.0.0.1 -p 6379
使用redis命令如:set name 小小
,get name
- Jedis使用Redis集群
Set<HostAndPort> nodes = new HashSet<>();
nodes.add(new HostAndPort("127.0.0.1",6379));
nodes.add(new HostAndPort("127.0.0.1",6380));
nodes.add(new HostAndPort("127.0.0.1",6381));
nodes.add(new HostAndPort("127.0.0.1",6382));
nodes.add(new HostAndPort("127.0.0.1",6383));
nodes.add(new HostAndPort("127.0.0.1",6384));
//创建JedisCluster集群对象,通过集群对象进行Redis操作
JedisCluster jedisCluster = new JedisCluster(nodes);
String name = null;
try {
name = jedisCluster.get("name");
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(name);
5.面试题
1)简单说一下你对分布式理解?
2)简单说一下你对集群理解?
3)说一下分布式和集群联系和区别
4)redis集群方式有哪些?
5)简单说一下redis-cluster里面槽?
槽是存放数据,存放是要通过key计算槽位,选择对应的服务器来存储,获取也是同样的算法.
默认16384个槽位要均匀分布到主节点上面
为了槽里面数据安全要对主节点进行1-N从节点备份
6)简单说一下redis-cluster里面选举投票机制
所有主节点都参与投票,默认半数以上挂点,启动容错机制,提升从节点为主节点.
7)怎么通过命令连接redis集群 -c
8)怎么通过jedis连接集群