1.Redis 集群
集群的概念:
集群是一种计算机系统,它通过一组松散集成的计算机软件和/或硬件连接起来高度紧密地协作完成计算工作。在某种意义上,他们可以被看作是一台计算机。集群系统中的单个计算机通常称为节点,通常通过局域网连接,但也有其它的可能连接式。集群计算机通常用来改进单个计算机的计算速度和/或可靠性。一般情况下集群计算机比单个计算机,比如工作站或超级计算机性能价格比要高得多
集群拥有以下两个特点:
- 可扩展性:集群的性能不限制于单一的服务实体,新的服务实体可以动态的添加到集群,从而增强集群的性能。
- 高可用性:集群当其中一个节点发生故障时,这台节点上面所运行的应用程序将在另一台节点被自动接管,消除单点故障对于增强数据可用性、可达性和可靠性是非常重要的。
集群必须拥有以下两大能力:
- 负载均衡:负载均衡把任务比较均匀的分布到集群环境下的计算和网络资源,以提高数据吞吐量。
- 错误恢复:如果集群中的某一台服务器由于故障或者维护需要无法使用,资源和应用程序将转移到可用的集群节点上。这种由于某个节点的资源不能工作,另一个可用节点中的资源能够透明的接管并继续完成任务的过程,叫做错误恢复。负载均衡和错误恢复要求各服务实体中有执行同一任务的资源存在,而且对于同一任务的各个资源来说,执行任务所需的信息视图必
须是相同的。
集群与分布式的区别
说到集群,可能大家会立刻联想到另一个和它很相近的一个词----“分布式”。那么集群和分布式是一回事吗?有什么联系和区别呢?
相同点:
分布式和集群都是需要有很多节点服务器通过网络协同工作完成整体的任务目标。
不同点:
分布式是指将业务系统进行拆分,即分布式的每一个节点都是实现不同的功能。而集群每个节点做的是同一件事情。每个人都有不同的分工,一起协作干一件事,叫做“分布式”。
2. Redis Cluster 集群
为何要搭建 Redis 集群。Redis 是在内存中保存数据的,而我们的电脑一般内存都不大,这也就意味着Redis 不适合存储大数据,适合存储大数据的是 Hadoop 生态系统的 Hbase 或者是 MogoDB。Redis 更适合处理高并发,一台设备的存储能力是很有限的,但是多台设备协同合作,就可以让内存增大很多倍,这就需要用到集群。
Redis 集群搭建的方式有多种,例如使用客户端分片、Twemproxy、Codis 等,但从 redis 3.0 之后版本支持 redis-cluster 集群,它是 Redis 官方提出的解决方案,Redis-Cluster 采用无中心结构,每个节点保存数据和整个集群状态,每个节点都和其他所有节点连接。其 redis-cluster 架构图如下:
客户端与 redis 节点直连,不需要中间 proxy 层.客户端不需要连接集群所有节点连接集群中任何一个可用节点即可。所有的redis 节点彼此互联(PING-PONG 机制),内部使用二进制协议优化传输速度和带宽。
3. 搭建 Redis-Cluster
1.需要 6 台 redis 服务器。搭建伪集群。
2.需要 6 个 redis 实例。
3.需要运行在不同的端口 7001-7006
4.搭建集群详细步骤:
下载地址:
GitHub下载地址:https://github.com/MicrosoftArchive/redis/releases
准备工作:将 redis 源码包上传到 linux 系统 ,解压 redis 源码包到
*/usr/local 目录中:(提示:解压代码:tar zxvf .tar.gz)
(1)安装 gcc
yum install gcc-c++
(2)使用 yum 命令安装 ruby (我们需要使用 ruby 脚本来实现集群搭建)
yum install ruby
(3)使用 yum 命令安装 ruby (我们需要使用 ruby 脚本来实现集群搭建):
**yum install rubygems **
(4)编译 redis 源码 ,进入 redis-3.0.0 源码文件夹
make
看到以下输出结果,表示编译成功
(5)创建目录/usr/local/redis-cluster 目录
(6)安装6 个 redis 实例,分别安装在以下目录:
以第一个 redis 实例为例,命令如下:
make install PREFIX=/usr/local/redis-cluster/redis-1
出现下图提示表示成功
按此方法安装其余 5 个 redis 实例:
**/usr/local/redis-cluster/redis-1 **
**/usr/local/redis-cluster/redis-2 **
**/usr/local/redis-cluster/redis-3 **
/usr/local/redis-cluster/redis-4
**/usr/local/redis-cluster/redis-5 **
/usr/local/redis-cluster/redis-6
注意:这六个实例就是使用上面的命令进行安装得到的,不是复制得到的
6.配置集群
(1)修改每个 redis 节点的配置文件 redis.conf
修改运行端口为 7001 7002 7003 7004 7005 7006
并将cluster-enabled yes 前的注释去掉(632 行)
(提示:最好在(redis-*/bin文件下redis.conf)下载下来:Ctrl+F搜索:port就能找到)
(提示:若再springboot运行要配置端口号:7001~7006)
(2)启动每个 redis 实例
以第一个实例为例,命令如下
**cd /usr/local/redis-cluster/redis-1/bin/ **
./redis-server redis.conf
把其余的 5 个也启动起来,然后查看一下是不是都启动起来了
(提示:每启动一个开一个链接)
[root@localhost ~]# ps -ef | grep redis
(3)上传 redis-3.0.0.gem ,安装 ruby 用于搭建 redis 集群的脚本
**[root@localhost ~]# gem install redis-3.0.0.gem **
**显示如下:**Successfully installed redis-3.0.0
1 gem installed
Installing ri documentation for redis-3.0.0…
Installing RDoc documentation for redis-3.0.0…
(4)使用 ruby 脚本搭建集群。
进入redis-3.0.0 源码目录中的 src 目录 执行下面的命令:**192.168.137.128 你的虚拟机 ip **
**./redis-trib.rb create --replicas 1 192.168.137.128:7001 192.168.137.128:7002 192.168.137.128:7003 192.168.137.128:7004 192.168.137.128:7005 192.168.137.128:7006 **
如果看到下图提示:表示成功搭建集群!
7.连接 Redis-Cluster
客户端工具连接
Redis-cli 连接集群:
-c:代表连接的是 redis 集群
**测试值的存取: **
(1)从本地连接到集群 redis 使用 7005 端口 加 -c 参数(表示集群!!!)
(如果不是本机还需要参数:-h 192.168.137.128)
(2)存入 uname 值为 admin,系统提示此值被存入到了 7002 端口所在的 redis (槽是 10359)
(3)提取 uname 的值,可以提取。
(4)退出(quit 命令);
(5)再次以 7001 端口进入 ,不带-c
(6)查询 uname 值,无法获取,因为值在 7002 端口的 redis 上
(7)我们以 7002 端口进入,获取 uname 值发现是可以获取的,而以其它端口进入均不能获取 !
登录任意一个端口后再取数据uname:
原因是7002 有备份!!!(有备份端口链接)
SpringBoot 集成 Redis-Cluster
pom.xml 文件配置:
<!-- Spring Boot 启动父依赖 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
</parent>
<dependencies>
<!--配置热启动-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
<!--redis框架-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--wagger测试-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
<!-- Spring Boot Web 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Spring Boot Test 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
</exclusion>
</exclusions>
<scope>test</scope>
</dependency>
<!-- Spring Boot Mybatis 依赖 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<!-- MySQL 连接驱动依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.40</version>
</dependency>
<!-- mybatis 的分页插件与 spring-boot 整合 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.10</version>
</dependency>
<!--通用 mapper 与 spring-boot 整合 -->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>2.1.0</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<!--<version>RELEASE</version>-->
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-test</artifactId>
</dependency>
<!--jsp 的相关依赖-->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
</dependencies>
application.properties 文件配置:
server.port=8989
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql:///testtable?useUnicode=true&characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=root
spring.redis.database=0
spring.redis.jedis.pool.max-active=8
spring.redis.jedis.pool.max-wait=1ms
spring.redis.jedis.pool.max-idle=8
spring.redis.jedis.pool.min-idle=0
spring.redis.timeout=10000ms
spring.redis.cluster.nodes=192.168.192.128:7001,192.168.192.128:7002,192.168.192.128:7003,192.168.192.128:7004,192.168.192.128:7005,192.168.192.128:7006
放开所有端口访问权限:
保存编辑后再重新启动防火墙,并查看端口状态!!!
查看redis 集群是否正常工作状态?查看6 个进程:
Junit 单元测试:
打印出值,测试成功!
SpringBoot 集成 Reids 集群完美成功!
各位看官》创作不易,点个赞!!!
诸君共勉:万事开头难,只愿肯放弃。
免责声明:本文章仅用于学习参考