redis从入门到集群(主从,集群,哨兵)

1 篇文章 0 订阅
1 篇文章 0 订阅

Redis

1. NoSql概述

1.1 什么是Nosql

在这里插入图片描述

在这里插入图片描述

随着web2.0的快速发展,非关系型、分布式数据存储得到了快速的发展,它们不保证关系数据的ACID特性。NoSQL概念在2009年被提了出来。NoSQL最常见的解释是“non-relational”,“Not Only SQL”也被很多人接受。(“NoSQL”一词最早于1998年被用于一个轻量级的关系数据库的名字。)

1.2 为什么要使用Nosql

l 传统的数据库遇到的瓶颈

传统的关系数据库具有不错的性能,高稳定型,久经历史考验,而且使用简单,功能强大,同时也积累了大量的成功案例。在互联网领域,MySQL成为了绝对靠前的王者,毫不夸张的说,MySQL为互联网的发展做出了卓越的贡献。	

在90年代,一个网站的访问量一般都不大,用单个数据库完全可以轻松应付。在那个时候,更多的都是静态网页,动态交互类型的网站不多。

到了最近10年,网站开始快速发展。火爆的论坛、博客、sns、微博逐渐引领web领域的潮流。在初期,论坛的流量其实也不大,如果你接触网络比较早,你可能还记得那个时候还有文本型存储的论坛程序,可以想象一般的论坛的流量有多大。
  • 高并发读写

Web2.0网站,数据库并发负载非常高,往往达到每秒上万次的读写请求

  • 高容量存储和高效存储

Web2.0网站通常需要在后台数据库中存储海量数据,如何存储海量数据并进行高效的查询往往是一个挑战

1024T=1PB…

  • 高扩展性和高可用性

随着系统的用户量和访问量与日俱增,需要数据库能够很方便的进行扩展、维护

1.3 NoSql数据库的优势

  • 易扩展

NoSQL数据库种类繁多,但是一个共同的特点都是去掉关系数据库的关系型特性。数据之间无关系,这样就非常容易扩展。也无形之间,在架构的层面上带来了可扩展的能力。

  • 大数据量,高性能

NoSQL数据库都具有非常高的读写性能,尤其在大数据量下,同样表现优秀。这得益于它的无关系性,数据库的结构简单。一般MySQL使用Query Cache,每次表的更新Cache就失效,是一种大粒度的Cache,在针对web2.0的交互频繁的应用,Cache性能不高。而NoSQL的Cache是记录级的,是一种细粒度的Cache,所以NoSQL在这个层面上来说就要性能高很多了。

  • 灵活的数据模型

NoSQL无需事先为要存储的数据建立字段,随时可以存储自定义的数据格式。而在关系数据库里,增删字段是一件非常麻烦的事情。如果是非常大数据量的表,增加字段简直就是一个噩梦。这点在大数据量的web2.0时代尤其明显。

  • 高可用

NoSQL在不太影响性能的情况,就可以方便的实现高可用的架构。比如Cassandra,HBase模型,通过复制模型也能实现高可用。

高可用(High Availability)通常来描述一个系统经过专门的设计,从而减少停工时间,而保持其服务的高度可用性。

1.4 RDBMS vs NOSQL

RDBMS

  • 高度组织化结构化数据
  • 结构化查询语言(SQL)
  • 数据和关系都存储在单独的表中。
  • 数据操纵语言,数据定义语言
  • 严格的一致性
  • 基础事务

NoSQL

  • 代表着不仅仅是SQL
  • 没有声明性查询语言
  • 没有预定义的模式
    -键 - 值对存储,列存储,文档存储,图形数据库
  • 最终一致性,而非ACID属性
  • 非结构化和不可预知的数据
  • CAP定理
  • 高性能,高可用性和可伸缩性

1.5 常见的Nosql产品

redis,solor,mongodb等

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

2. Redis概述

2.1 什么是Redis

全称:**R**Emote **D**Ictionary **S**erver(远程字典服务器)。是完全开源免费的,用C语言编写的, 遵守BCD协议。**是一个高性能的key/value)分布式内存数据库**,

基于内存运行并支持持久化的NoSQL数据库,是当前最热门的NoSql数据库之一,也被人们称为数据结构服务器。Redis的上一代产品 *Memcached* !!!

Redis 与其他 key - value 缓存产品有以下三个特点

i)Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用!!!

ii)Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储

iii)Redis支持数据的备份,即master-slave(主从)模式的数据备份,也可以集群!!!

2.2 Redis优势

  • 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
  • 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
  • 原子 – Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。
  • 丰富的特性 – Redis还支持 publish/subscribe(发布订阅), 通知, key 过期等等特性

2.3 Redis应用场景

在这里插入图片描述

2.3 Redis下载

(1)Http://redis.io/

(2)Http://www.redis.cn/

3 Redis的环境和安装

3.1 环境准备

  • 虚拟机

在这里插入图片描述

  • Linux系统

在这里插入图片描述

  • SSH客户端

在这里插入图片描述

3.2 Redis的安装

3.2.1 Redis的编译环境
Redis是C语言开发的,安装redis需要先去官网下载源码进行编译,编译需要依赖于GCC编译环境,如果CentOS上没有安装gcc编译环境,需要提前安装,安装命令如下:

[root@bruce1 ~]# yum install gcc-c++

在这里插入图片描述

如果提示是否安装,选择: y
在这里插入图片描述

3.2.2 Redis的安装

l 使用filezilla上传Redis安装文件到Linux目录

在这里插入图片描述

l 上传Redis安装文件

在这里插入图片描述

l 解压redis文件

[root@bruce1 myapps]# tar -zxvf redis-3.0.0.tar.gz

在这里插入图片描述

l 编译Redis(编译,将.c文件编译为.o文件)

进入解压文件夹,cd redis-3.0.0/

执行 make

在这里插入图片描述

编译成功!如果编译过程中出错,先删除安装文件目录,后解压重新编译

l 安装

[root@szl redis-3.0.0]# make PREFIX=/root/myapps/redis install

在这里插入图片描述

l 安装之后的bin目录

在这里插入图片描述

在这里插入图片描述

l Copy文件

Redis启动需要一个配置文件,可以修改端口号信息。

[root@bruce1 redis-3.0.0]# cp redis.conf /root/myapps/redis

在这里插入图片描述

3.3 Redis的启动

3.3.1 Redis的前端模式启动

在这里插入图片描述

在这里插入图片描述

前台启动:界面停住,不能进行别的操作!!

下面是启动界面

在这里插入图片描述

使用ctrl+c退出前端启动。

3.3.2 Redis的后端启动

l 修改redis.conf配置文件,daemonize yes以后端模式启动

[root@szl redis]# vi redis.conf

在这里插入图片描述

l 启动时,制定配置文件

[root@szl redis]# ./redis-server ./redis.conf

这里只需要指定redis-server的位置和配置文件的位置就行了,并不一定要按照我的命令来

在这里插入图片描述

l 查看进程

在这里插入图片描述

可以看到已经启动成功了。

3.3.3 Redis的停止

l 强制结束程序。强制终止Redis进程可能会导致redis持久化数据丢失。

在这里插入图片描述

l 正确停止Redis的方式应该是向Redis发送SHUTDOWN命令,方法为(关闭默认的端口)

[root@bruce1 redis]# ./bin/redis-cli shutdown

在这里插入图片描述

3.4 Redis的连接

3.4.1 连接客户端

在这里插入图片描述

3.4.2 向Redis服务器发送命令

l Ping,测试客户端与Redis的连接是否正常,如果连接正常,回收到pong

在这里插入图片描述

4. Redis的数据结构

4.1 Redis的数据结构介绍

Redis简单理解就是个一个Map结构 key–value 根据key操作value!

在这里插入图片描述

4.2 存储String

在这里插入图片描述

4.2.1 常用命令
赋值

在这里插入图片描述

在这里插入图片描述

     取值

在这里插入图片描述
在这里插入图片描述

取值的同时赋值

在这里插入图片描述
删除

在这里插入图片描述

在这里插入图片描述

数值的增减

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

4.2.2 扩展的命令

在这里插入图片描述

在这里插入图片描述

4.3 存储Hash

在这里插入图片描述

4.3.1 常用命令
  1. 赋值和取值

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2 删除

在这里插入图片描述

在这里插入图片描述

  1. 增加数字

    1543315828793

在这里插入图片描述

4.3.2 扩展的命令

在这里插入图片描述

hexists key field

在这里插入图片描述

在这里插入图片描述

hlen key:

在这里插入图片描述

hkeys key

在这里插入图片描述

4.4 存储List

!在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

4.4.1常用命令

两端添加

在这里插入图片描述

lpush key values[…]

在这里插入图片描述

rpush key values[…]

在这里插入图片描述

查看列表
在这里插入图片描述

lrange key [start,end]

在这里插入图片描述

两端弹出

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

获取元素的个数

在这里插入图片描述

在这里插入图片描述

4.4.2 扩展的命令

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

4.5. Keys通用操作

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

5. Redis的多数据库

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

切换至0数据库下面

在这里插入图片描述

将newkey移动到1号数据库

在这里插入图片描述

6 Redis的常见服务器命令

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

7 Redis集群

7.1. Redis的主从复制

7.1.1 什么是主从复制
持久化保证了即使redis服务重启也不会丢失数据,因为redis服务重启后会将硬盘上持久化的数据恢复到内存中,但是当redis服务器的硬盘损坏了可能会导致数据丢失,如果通过redis的主从复制机制就可以避免这种单点故障,如下图:

说明:

  • 主redis中的数据有两个副本(replication)即从redis1和从redis2,即使一台redis服务器宕机其它两台redis服务也可以继续提供服务。

  • 主redis中的数据和从redis上的数据保持实时同步,当主redis写入数据时通过主从复制机制会复制到两个从redis服务上。

  • 只有一个主redis,可以有多个从redis。

  • 主从复制不会阻塞master,在同步数据时,master 可以继续处理client 请求

7.1.2 主从配置
  • 主节点的配置

    无需特殊配置,保持和之前的单机配置方式。

  • 从redis配置

    • 第一步:复制出一个从机
    [root@bruce1 myapps]# cp redis/ redis1 -r
    [root@bruce1 myapps]# ll
    总用量 40
    drwxr-xr-x. 3 root root  4096 7月   1 09:26 redis
    drwxr-xr-x. 3 root root  4096 7月   1 09:27 redis1
    drwxr-xr-x. 9 root root  4096 6月  28 23:26 tomcat
    
    • 第二步:修改从机的redis.conf

    语法:slaveof

在这里插入图片描述

	第三步:修改从机的port地址为6380

	在从机redis.conf中修改

在这里插入图片描述

	第四步:清除从机中的持久化文件
[root@bruce1 bin]# rm -rf appendonly.aof dump.rdb
[root@bruce1 bin]# ll
总用量 15440
-rwxr-xr-x. 1 root root 4588902 7月   1 09:27 redis-benchmark
-rwxr-xr-x. 1 root root   22225 7月   1 09:27 redis-check-aof
-rwxr-xr-x. 1 root root   45443 7月   1 09:27 redis-check-dump
-rwxr-xr-x. 1 root root 4691809 7月   1 09:27 redis-cli
lrwxrwxrwx. 1 root root      12 7月   1 09:27 redis-sentinel -> redis-server
-rwxr-xr-x. 1 root root 6450337 7月   1 09:27 redis-server

       第五步:启动从机

	[root@bruce1 redis1]# ./bin/redis-server ./redis.conf    


	第六步:启动6380的客户端
[root@bruce1 redis1]# ./bin/redis-cli -p 6380
127.0.0.1:6380> keys *
1) "mylist"
2) "num"
3) "bookCate1"
4) "newbook"
5) "company"
127.0.0.1:6380>

     注意:
  • 主机一旦发生增删改操作,那么从机会将数据同步到从机中
  • 从机不能执行写操作
127.0.0.1:6380> get username
"hehe"
127.0.0.1:6380> set username haha
(error) READONLY You can't write against a read only slave.

7.2 Redis集群搭建

7.2.1 redis-cluster架构图

在这里插入图片描述

架构细节:

(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 会根据节点数量大致均等的将哈希槽映射到不同的节点!

示例如下:

在这里插入图片描述

7.2.2 redis-cluster投票:容错

在这里插入图片描述

(1) 集群中所有master参与投票,如果半数以上master节点与其中一个master节点通信超过(cluster-node-timeout),认为该master节点挂掉.

(2) 什么时候整个集群不可用(cluster_state:fail)?

   **如果集群任意master挂掉,且当前master没有slave,则集群进入fail状态**。**也可以理解成集群的[0-16383]slot映射不完全时进入fail状态。**

   **如果集群超过半数以上master挂掉,无论是否有slave,集群进入fail状态。**
7.2.3 搭建Rubby环境

集群管理工具(redis-trib.rb)是使用ruby脚本语言编写的。

  第一步: 安装ruby
[root@redis1 bin]# yum install ruby
[root@redis1 bin]# yum install rubygems
 第二步:将以下文件上传到linux系统

![1543319088135](/1543319088135.png)

第三步:安装ruby和redis接口
-rw-r--r--. 1 root root 22301 8月  18 2016 dangdang.sql
drwxr-xr-x. 3 root root  4096 7月   1 10:00 redis
drwxr-xr-x. 3 root root  4096 7月   1 09:54 redis1
drwxrwxr-x. 6 root root  4096 4月   1 2015 redis-3.0.0
-rw-r--r--. 1 root root 57856 7月   1 10:03 redis-3.0.0.gem
drwxr-xr-x. 9 root root  4096 6月  28 23:26 tomcat
[root@bruce1 myapps]# gem install redis-3.0.0.gem

 第四步:将redis-3.0.0包下src目录中的以下文件拷贝到redis-cluster/
[root@bruce1 myapps]# mkdir redis-cluster
[root@bruce1 myapps]# cd redis-3.0.0/src/
[root@bruce1 src]# cp redis-trib.rb ~/myapps/redis-cluster/
[root@bruce1 src]# ll ~/myapps/redis-cluster/
总用量 48
-rwxr-xr-x. 1 root root 48141 7月   1 10:20 redis-trib.rb

在这里插入图片描述

7.2.4 集群的搭建过程(单机)

搭建集群最少也得需要3台主机,如果每台主机再配置一台从机的话,则最少需要6台机器。

设计端口如下:创建6个redis实例,需要端口号7001~7006

第一步:复制出一个7001实例
[root@bruce1 myapps]# cp redis/ redis-cluster/7001 -r 
[root@bruce1 myapps]# cd redis-cluster/7001
[root@bruce1 7001]# ll
总用量 52
drwxr-xr-x. 2 root root  4096 7月   1 10:22 bin
-rw-r--r--. 1 root root  3446 7月   1 10:22 dump.rdb
-rw-r--r--. 1 root root 41404 7月   1 10:22 redis.conf

第二步:如果存在持久化文件,则删除

[root@bruce1 bin]# rm -rf appendonly.aof dump.rdb     




第三步:修改redis.conf配置文件,打开cluster-enable yes

在这里插入图片描述

第四步:修改端口

在这里插入图片描述

第五步:复制出7002-7006机器

	[root@bruce1 redis-cluster]# cp 7001/ 7002 -r

	[root@bruce1 redis-cluster]# cp 7001/ 7003 -r

	[root@bruce1 redis-cluster]# cp 7001/ 7004 -r

	[root@bruce1 redis-cluster]# cp 7001/ 7005 -r

	[root@bruce1 redis-cluster]# cp 7001/ 7006 –r

在这里插入图片描述

    第六步:修改7002-7006机器的端口

 第七步:启动7001-7006这六台机器,写一个启动脚本
cd 7001
./bin/redis-server ./redis.conf
cd ..
cd 7002
./bin/redis-server ./redis.conf 
cd ..
cd 7003
./bin/redis-server ./redis.conf
cd ..
cd 7004
./bin/redis-server ./redis.conf
cd ..
cd 7005
./bin/redis-server ./redis.conf
cd ..
cd 7006
./bin/redis-server ./redis.conf
cd ..

第八步:修改start-all.sh文件的权限

[root@bruce1 redis-cluster]# chmod u+xstart-all.sh



 第九步:启动所有的实例

[root@bruce1 redis-cluster]# ./start-all.sh



 第十步:创建集群
[root@bruce1 redis-cluster]# ./redis-trib.rb create --replicas 1 192.168.221.128:7001 192.168.221.128:7002 192.168.221.128:7003 192.168.221.128:7004 192.168.221.128:7005  192.168.221.128:7006
>>> Creating cluster
Connecting to node 192.168.221.128:7001: OK
Connecting to node 192.168.221.128:7002: OK
Connecting to node 192.168.221.128:7003: OK
Connecting to node 192.168.221.128:7004: OK
Connecting to node 192.168.221.128:7005: OK
Connecting to node 192.168.221.128:7006: OK
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
192.168.221.128:7001
192.168.221.128:7002
192.168.221.128:7003
Adding replica 192.168.221.128:7004 to 192.168.221.128:7001
Adding replica 192.168.221.128:7005 to 192.168.221.128:7002
Adding replica 192.168.221.128:7006 to 192.168.221.128:7003
M: e7fb45e74f828b53ccd8b335f3ed587aa115b903 192.168.221.128:7001
   slots:0-5460 (5461 slots) master
M: 4a312b6fc90bfee187d43588ead99d83b407c892 192.168.221.128:7002
   slots:5461-10922 (5462 slots) master
M: 713218b88321e5067fd8ad25c3bf7db88c878ccf 192.168.221.128:7003
   slots:10923-16383 (5461 slots) master
S: 4f8c7455574e2f0aab1e2bb341eae319ac065039 192.168.221.128:7004
   replicates e7fb45e74f828b53ccd8b335f3ed587aa115b903
S: 8879c2ed9c141de70cb7d5fcb7d690ed8a200792 192.168.221.128:7005
   replicates 4a312b6fc90bfee187d43588ead99d83b407c892
S: b1183545245b3a710a95d669d7bbcbb5e09896a0 192.168.221.128:7006
   replicates 713218b88321e5067fd8ad25c3bf7db88c878ccf
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes 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 192.168.221.128:7001)
M: e7fb45e74f828b53ccd8b335f3ed587aa115b903 192.168.221.128:7001
   slots:0-5460 (5461 slots) master
M: 4a312b6fc90bfee187d43588ead99d83b407c892 192.168.221.128:7002
   slots:5461-10922 (5462 slots) master
M: 713218b88321e5067fd8ad25c3bf7db88c878ccf 192.168.221.128:7003
   slots:10923-16383 (5461 slots) master
M: 4f8c7455574e2f0aab1e2bb341eae319ac065039 192.168.221.128:7004
   slots: (0 slots) master
   replicates e7fb45e74f828b53ccd8b335f3ed587aa115b903
M: 8879c2ed9c141de70cb7d5fcb7d690ed8a200792 192.168.221.128:7005
   slots: (0 slots) master
   replicates 4a312b6fc90bfee187d43588ead99d83b407c892
M: b1183545245b3a710a95d669d7bbcbb5e09896a0 192.168.221.128:7006
   slots: (0 slots) master
   replicates 713218b88321e5067fd8ad25c3bf7db88c878ccf
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

7.2.5 集群的搭建过程(多台服务器)

搭建rubby环境

第一步: 安装ruby

[root@redis1 bin]# yum install ruby
[root@redis1 bin]# yum install rubygems

第二步:将以下文件上传到linux系统

在这里插入图片描述

我们有六台机器,可以通过scp命令来进行拷贝

scp -r [本机的文件路径] 对方用户@[对方ip]:对方保存地址
-r 表示递归文件

scp -r /home/mysoft/redis-3.0.0.gem root@192.168.159.139:/home/mysoft/

在这里插入图片描述

输入密码后会传输,在139服务器上的指定位置就可以看到该文件

在这里插入图片描述

第三步:安装ruby和redis接口

[root@bruce1 myapps]# gem install redis-3.0.0.gem

第四步:将redis-3.0.0包下src目录中的redis-trib.rb拷贝到redis-cluster/

集群环境搭建:

在这里插入图片描述

第一步

我们需要准备好六台服务器,并且分别为其配置好ip和安装好redis

第二步

删除redis中的持久化文件

第三步:修改redis.conf配置文件,打开cluster-enable yes

在这里插入图片描述
第四步:启动这六台机器,我们可以通过xshell的以下功能

在这里插入图片描述

在这里插入图片描述

通过勾选全部会话来为所有连接统一执行启动命令

第五步:创建集群

./redis-trib.rb create --replicas 1 192.168.159.131:6379 192.168.159.135:6379 192.168.159.136:6379 192.168.159.137:6379 192.168.159.138:6379  192.168.159.139:6379


>>> Creating cluster
Connecting to node 192.168.159.131:6379: OK
Connecting to node 192.168.159.135:6379: OK
Connecting to node 192.168.159.136:6379: OK
Connecting to node 192.168.159.137:6379: OK
Connecting to node 192.168.159.138:6379: OK
Connecting to node 192.168.159.139:6379: OK
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
192.168.159.139:6379
192.168.159.138:6379
192.168.159.137:6379
Adding replica 192.168.159.136:6379 to 192.168.159.139:6379
Adding replica 192.168.159.135:6379 to 192.168.159.138:6379
Adding replica 192.168.159.131:6379 to 192.168.159.137:6379
S: 30a30868e0b227f4dc8b5394a19fce50e00d8df7 192.168.159.131:6379
   replicates b87164c67e325df80444c654be485494d5387892
S: 3a2f71ae76e845e2119ddf5f2fc26e05b013e05d 192.168.159.135:6379
   replicates 66fef89d846ec69298eb700c9397563f054cc485
S: 3108303270af663892168b90765abdda9f599d8d 192.168.159.136:6379
   replicates 8afd61f0ed562e1186b1e3b6b1ca0c8f8558fbd3
M: b87164c67e325df80444c654be485494d5387892 192.168.159.137:6379
   slots:10923-16383 (5461 slots) master
M: 66fef89d846ec69298eb700c9397563f054cc485 192.168.159.138:6379
   slots:5461-10922 (5462 slots) master
M: 8afd61f0ed562e1186b1e3b6b1ca0c8f8558fbd3 192.168.159.139:6379
   slots:0-5460 (5461 slots) master
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes 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 192.168.159.131:6379)
M: 30a30868e0b227f4dc8b5394a19fce50e00d8df7 192.168.159.131:6379
   slots: (0 slots) master
   replicates b87164c67e325df80444c654be485494d5387892
M: 3a2f71ae76e845e2119ddf5f2fc26e05b013e05d 192.168.159.135:6379
   slots: (0 slots) master
   replicates 66fef89d846ec69298eb700c9397563f054cc485
M: 3108303270af663892168b90765abdda9f599d8d 192.168.159.136:6379
   slots: (0 slots) master
   replicates 8afd61f0ed562e1186b1e3b6b1ca0c8f8558fbd3
M: b87164c67e325df80444c654be485494d5387892 192.168.159.137:6379
   slots:10923-16383 (5461 slots) master
M: 66fef89d846ec69298eb700c9397563f054cc485 192.168.159.138:6379
   slots:5461-10922 (5462 slots) master
M: 8afd61f0ed562e1186b1e3b6b1ca0c8f8558fbd3 192.168.159.139:6379
   slots:0-5460 (5461 slots) master
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.


通过以上返回的结果信息我们可以看出系统随机分配的主从关系

在这里插入图片描述

可以看出

131是137的从

135是138的从

136是139的从

7.2.6 连接集群

命令: ./redis-cli -h 192.168.159.137 -p 6379 -c

-c :指定是集群连接

./redis-cli -h 192.168.159.137 -p 6379 -c
192.168.159.137:6379> set username 12345
-> Redirected to slot [14315] located at 192.168.159.137:6379
OK
7.2.7 查看集群中节点信息

在这里插入图片描述

8 Jedis使用

8.1 Jedis介绍

在这里插入图片描述

8.2 Java连接Redis

8.2.1 导入maven依赖
<!--redis-->
<dependency>
  <groupId>redis.clients</groupId>
  <artifactId>jedis</artifactId>
  <version>2.9.0</version>
</dependency>
8.2.2 单实例连接
@Test
	public void testJedisSingle() {
		// 1.设置IP地址和端口
		Jedis jedis = new Jedis("192.168.221.128", 6379);
		// 2.设置数据
		jedis.set("name", "szl");
		// 3.获得数据
		String name = jedis.get("name");
		System.out.println("name=" + name);
		jedis.close();
	}

如果连接不上,需要事先把服务器端端口在防火墙中打开。

也可以选择关闭防火墙测试。service iptables stop

8.2.3 连接池的连接方式
@Test
	public void testJedisPool() {
		// 1.获取连接池配置对象,设置配置项
		JedisPoolConfig config = new JedisPoolConfig();
		// 1.1最大的连接数
		config.setMaxTotal(30);
		// 1.2最大的空闲
		config.setMaxIdle(10);
		// 2.获取连接池
		JedisPool jedisPool = new JedisPool(config, "192.168.221.128", 6379);

		Jedis jedis = null;
		try {
			jedis = jedisPool.getResource();
			// 4.设置数据e
			jedis.set("name", "bruceLiu");
			String name = jedis.get("name");
			System.out.println("name=" + name);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (jedis != null) {
				jedis.close();
			}
			// 虚拟机关闭的时候,释放资源
			if (jedisPool != null) {
				jedisPool.close();
			}
		}
	}

8.3 Java连接Redis集群

8.3.1 代码实现
/*
	 * 01-测试向集群中新增数据
	 */
	@Test
	public void testJedisCluster() throws Exception {
		// 创建一连接,JedisCluster对象,在系统中是单例存在
		Set<HostAndPort> nodes = new HashSet<>();
		nodes.add(new HostAndPort("192.168.159.131", 6379));
		nodes.add(new HostAndPort("192.168.159.135", 6379));
		nodes.add(new HostAndPort("192.168.159.136", 6379));
		nodes.add(new HostAndPort("192.168.159.137", 6379));
		nodes.add(new HostAndPort("192.168.159.138", 6379));
		nodes.add(new HostAndPort("192.168.159.139", 6379));
		JedisCluster cluster = new JedisCluster(nodes);
		// 执行JedisCluster对象中的方法,方法和redis一一对应。
		cluster.set("cluster-test", "This is my jedis cluster test!!");
		// String result = cluster.get("cluster-test");
		// System.out.println(result);
		// 程序结束时需要关闭JedisCluster对象
		cluster.close();
		System.out.println("集群测试成功!");
	}
	/*
	 * 02-测试获取集群中的数据
	 */
	@Test
	public void testJedisGet() {
		// 创建一连接,JedisCluster对象,在系统中是单例存在
		Set<HostAndPort> nodes = new HashSet<>();
		nodes.add(new HostAndPort("192.168.221.128", 7001));
		nodes.add(new HostAndPort("192.168.221.128", 7002));
		nodes.add(new HostAndPort("192.168.221.128", 7003));
		nodes.add(new HostAndPort("192.168.221.128", 7004));
		nodes.add(new HostAndPort("192.168.221.128", 7005));
		nodes.add(new HostAndPort("192.168.221.128", 7006));
		JedisCluster cluster = new JedisCluster(nodes);
		String result = cluster.get("cluster-test");
		System.out.println(result);
		// 程序结束时需要关闭JedisCluster对象
		cluster.close();
		System.out.println("集群测试成功!");
	}

在这里插入图片描述

在这里插入图片描述

9 Redis哨兵解决方案

在这里插入图片描述

9.1 环境准备

准备两台虚拟机服务器,安装好Redis

这是我的环境目录

在这里插入图片描述

redis:Master的启动目录---->redis.conf配置文件

send1,send2:从机的启动目录---->sentinel1.conf sentinel2.conf

sendServer:Sentinel的启动目录---->sentinel.conf csentinel.conf

9.2 启动主机redis

./redis/redis-server ./redis.conf

在这里插入图片描述

配置从机,如果使用配置文件启动从机需要将配置文件中的slaveof打开

在这里插入图片描述
并填上主机的ip和端口号

启动从机1 从机2

./sen1/redis-server ./sentinel1.conf
./sen2/redis-server ./sentinel2.conf

在这里插入图片描述

此时,我们可以看到6379,6380,6381都已经启动,然后以同样的方式去配置服务器2

在这里插入图片描述

配置成功后,接下来配置哨兵设置

9.3 哨兵配置

服务器一,我们配置两个哨兵,服务器二配置一个哨兵,与上面的架构图相吻合

创建哨兵配置文件

vi sentinel.conf

#配置端口
port 26379
#配置监听服务器1
sentinel monitor s2 192.168.159.139 6379 2
#配置监听服务器2
sentinel monitor s1 192.168.159.138 6379 2

port :指定启动服务的端口号;

Sentinel monitor

name :redis主服务名称,可以自行命名,但是在一个sentinel网络中,一个redis主服务只能有一个名称;
本次在两个服务器分别有一个master,分别命名为s1,s2。

ip和port :redis主服务的IP地址和端口号;

quorum :表示要将这个主服务器判断为失效并下线至少需要2个sentinel同意;
本次使用了三个sentinel来构成sentinel网络,所以在这里设置为2,一般要启动奇数个sentinel,以保证不会出现正反方投票数相等的情况。

protected-mode :关闭保护模式(默认情况下,redis node和sentinel的protected-mode都是yes,在搭建集群时,若想从远程连接redis集群,需要将redis node和sentinel的protected-mode修改为no,若只修改redis node,从远程连接sentinel后,依然是无法正常使用的,且sentinel的配置文件中没有protected-mode配置项,需要手工添加。依据redis文档的说明,若protected-mode设置为no后,需要增加密码证或是IP限制等保护机制,否则是极度危险的。)

以同样的方法在两个服务器中分别新建三个sentinel的配置文件。

服务器1的端口号分别为26379,26380 服务器2的端口为26379

分别启动三个服务

服务器一启动监听器1:

在这里插入图片描述

新开一个连接窗口,服务器一启动监听器2:

在这里插入图片描述

启动服务器二的监听器1:

在这里插入图片描述

9.4 模拟主机宕机

此时,我们通过杀掉master进程,来观察哨兵选出新master的过程:

在这里插入图片描述

我们已经将主机1的6379Master进程强制去掉了,此时看控制台,哨兵经过评选,选用138:6381作为新Master

在这里插入图片描述

此时,简单的哨兵机制搭建完毕

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DragonnAi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值