1/27日学习笔记

在昨天跟今天,我完成了黑马课程的redis单点登录和使用linux配置一主二从的简单哨兵模式,搭建简单的集群模式,接下来我将依次讲述其中的过程,简略讲解第一项,也就是黑马课程的使用redis完成短信登录

1.黑马点评系统使用redis完成短信登录(由于难以再次完成所以截图来自黑马课程)

1.1首先,为什么使用redis来实现登录呢?

        在使用redis之前,我们是基于session的以下两种方法来获取验证码信息的

  • setAttribute(String name, Object value):将一个属性设置到 Session 中,属性由一个名称和一个对应的值组成。
  • getAttribute(String name):通过属性名获取在 Session 中存储的属性值。

        其中会触发session共享问题,指的是多台tomcat并不共享session存储空间,当请求切换到不同tomcat服务时会导致数据局丢失

        通常的解决方法:数据拷贝,但是缺点有两个:第一:但是多台tomcat互相拷贝数据,浪费内存空间,第二:数据拷贝需要时间,如果在拷贝的时候访问,依然会出现数据丢失

为什么使用reids:

        1.数据共享:每一台tomcat都能访问到redis,所以不会出现数据丢失的问题

        2.内存存储:redis的读写速度是微秒级的,非常快

        3.key.value结构:与session一致

1.2如何实现呢?

        首先这是基于session的流程

               

        其中,session不用考虑取的问题,因为创建session的时候会自动形成sessionid写到用户浏览器的cookie里,以后的每次请求都会带着cookieid这样就自然找到session了redis没有,那么redis该怎么解决呢?

        这时redis就要自己手动设置key值了,然后value是一个hash结构的数据,为了解决key值的重复性,我们使用token随机值当key值,之前的session是使用id来获取用户的,但是taoken没有id,tomcat不会自动帮我们写到浏览器上面,所以我们要手动把token返回到客户端

        第二步改为:

具体代码:

2.简单模拟实现redis哨兵模式和集群模式以及遇到的bug

2.1实现哨兵模式

预备工作:

2.1.1.打开哨兵配置文件

        protected-mode no

        port 26379#端口

        daemonize no

        pidfile /var/run/redis-sentinel.pid

        logfile ""

        dir /tmp

        sentinel monitor mymaster 127.0.0.1 6379 1 #设置主人端口,1代表至少需要一个线程同意

        sentinel down-after-milliseconds mymaster 30000

        acllog-max-len 128

        sentinel parallel-syncs mymaster 1

        sentinel failover-timeout mymaster 180000

        sentinel deny-scripts-reconfig yes

        SENTINEL resolve-hostnames no

        SENTINEL announce-hostnames no

2.1.2.将哨兵配置文件拷贝到自己的配置文件里

        第一步:先创建主从环境

        关键命令:SLAVEOF

        127.0.0.1:6379> info replication

        # Replication

        role:master

        connected_slaves:0

        master_failover_state:no-failover

        master_replid:2302f528cea94f8a6bee823f30b24a92f81e55bd

        master_replid2:0000000000000000000000000000000000000000

        master_repl_offset:0

        second_repl_offset:-1

        repl_backlog_active:0

        repl_backlog_size:1048576

        repl_backlog_first_byte_offset:0

        repl_backlog_histlen:0

先查看自己进程的信息

复制自己的redis配置文件,创建3个不同的配置文件,用其启动redis

 

默认情况下,三台都是主机

6381的信息

 

我们一般只配置丛机就好了

2.1.3配置丛机语句

SLAVEOF 主机名

真实的主从配置应该在配置文件中配置,这样的话是永久的,我们这里使用的是命令,是暂时的

在配置文件的这里更改

细节:

主机可以设置值,丛机不能写,只能读

 

 

第二步:修改哨兵配置,主要是修改sentinel monitor选项,1代表要进行切换,至少需要1个哨兵同意

 

 

[root@localhost bin]# redis-sentinel kconfig/sentinel-26379.conf

*** FATAL CONFIG FILE ERROR (Redis 7.0.15) ***

Reading the configuration file, at line 6

>>> 'logfile "".'

Unbalanced quotes in configuration line

出现错误

这个错误可能是由于配置文件中引号的不平衡引起的。检查一下引号是否正确闭合,特别是在 'logfile' 和 "" 之间的引号

*** FATAL CONFIG FILE ERROR (Redis 7.0.15) ***

Reading the configuration file, at line 6

>>> 'logfile "".'

Unbalanced quotes in configuration line

[root@localhost bin]# vim kconfig/sentinel-26379.conf

[root@localhost bin]# redis-sentinel kconfig/sentinel-26379.conf

*** FATAL CONFIG FILE ERROR (Redis 7.0.15) ***

Reading the configuration file, at line 7

>>> 'dir /redis-7.0.15/data'

No such file or directory

[root@localhost bin]# vim kconfig/sentinel-26379.conf

[root@localhost bin]# redis-sentinel kconfig/sentinel-26379.conf

*** FATAL CONFIG FILE ERROR (Redis 7.0.15) ***

Reading the configuration file, at line 7

>>> 'dir opt/ /redis-7.0.15/data'

wrong number of arguments

成功

这时候给主机赋一个值然后关机

[root@localhost ~]# redis-cli

Could not connect to Redis at 127.0.0.1:6379: Connection refused

not connected> redis-server

Could not connect to Redis at 127.0.0.1:6379: Connection refused

关掉重新连,报错了

使用[root@localhost ~]# /usr/local/redis/bin/redis-server /usr/local/redis/bin/redis.conf这种方式重连上了

16526:X 26 Jan 2024 19:30:39.358 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo

16526:X 26 Jan 2024 19:30:39.358 # Redis version=7.0.15, bits=64, commit=00000000, modified=0, pid=16526, just started

16526:X 26 Jan 2024 19:30:39.358 # Configuration loaded

16526:X 26 Jan 2024 19:30:39.359 * Increased maximum number of open files to 10032 (it was originally set to 1024).

16526:X 26 Jan 2024 19:30:39.359 * monotonic clock: POSIX clock_gettime

16526:X 26 Jan 2024 19:30:39.359 # Warning: Could not create server TCP listening socket *:26379: bind: Address already in use

16526:X 26 Jan 2024 19:30:39.359 # Failed listening on port 26379 (TCP), aborting.

刚才没有设置好主从机,现在设置好了,也能在sentinel上看到了

这时在6379设置一个值然后关掉6379端口

20134:X 26 Jan 2024 22:29:36.913 # -failover-abort-no-good-slave master mymaster 127.0.0.1 6379

20134:X 26 Jan 2024 22:29:36.985 # Next failover delay: I will not start a failover before Fri Jan 26 22:35:37 2024

报错了,显示Redis 当前处于一个故障转移的等待状态,因为没有可用的从节点来接管主节点。

可是不是有两个从节点吗,为什么不能专移到从节点呢

我猜测可能的原因是从节点设置了密码

于是我把两个从节点都以命令取消了密码

CONFIG SET requirepass ""

成功了

这时端口6381成为了主人

主机这时回来,也只能当丛机

2.2搭建集群

第一步:先创建六个线程的配置文件

主要是改变以下的配置,可以用:g/^#/d命令消除注释行,也可以使用vim命令/搜索

配置完,给他们全部启动

这时进程显示就带集群标记了

执行此次结果,出现这个反映

这个反映表示

Redis 集群正在执行哈希槽分配,并显示了每个主节点控制的哈希槽范围。此外,它还显示了将要添加的副本节点和它们所对应的主节点。副本节点用于提供冗余和高可用性。

接下来的句子 "Trying to optimize slaves allocation for anti-affinity" 意味着集群正在尝试对副本节点进行优化,以使它们与主节点尽可能分布在不同的主机上,以提高容错能力。

最后一行显示了一个提示,询问你是否接受上述配置。如果你确认配置正确且满意,输入 "yes" 来接受配置并继续创建集群。

简而言之,上述输出是关于 Redis 集群节点和槽分配的详细信息,并在最后确认你是否接受这些配置。

又输出了这些

>>> 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.40.128:8001)

M: 0b4615a3a5f9db6b4b93365e43735bb5a9773ac9 192.168.40.128:8001

   slots:[0-5460] (5461 slots) master

   1 additional replica(s)

S: 173bd898325bad2127f44b75e1d9ead1e171eb06 192.168.40.128:8004

   slots: (0 slots) slave

   replicates d746ed3b5ebdd774ffe9e50797c605c913edbc86

S: 0d5e06d960396e904b9e7d700632414b4b7d501d 192.168.40.128:8005

   slots: (0 slots) slave

   replicates 0b4615a3a5f9db6b4b93365e43735bb5a9773ac9

S: d4861a1ac0ef84c9d2f9881a5425f931582edf3d 192.168.40.128:8006

   slots: (0 slots) slave

   replicates 060d7ebfac9d800e46db0ace6690320b1f00577c

M: d746ed3b5ebdd774ffe9e50797c605c913edbc86 192.168.40.128:8003

   slots:[10923-16383] (5461 slots) master

   1 additional replica(s)

M: 060d7ebfac9d800e46db0ace6690320b1f00577c 192.168.40.128:8002

   slots:[5461-10922] (5462 slots) master

   1 additional replica(s)

[OK] All nodes agree about slots configuration.

>>> Check for open slots...

>>> Check slots coverage...

[OK] All 16384 slots covered.

在上述输出中,首先更新了节点配置,并为每个节点分配了不同的配置纪元(config epoch)。然后,发送了 CLUSTER MEET 消息以加入集群,并等待集群加入完成。

接下来进行集群检查,使用的节点是 192.168.40.128:8001。输出列出了每个节点的信息,包括节点的角色(主节点或从节点)、节点的地址和端口、节点控制的哈希槽范围,以及副本节点的信息。

最后进行了一些检查,包括检查是否存在未分配的哈希槽和检查哈希槽的覆盖情况。输出显示所有 16384 个哈希槽都得到了覆盖,符合预期。

 

redis-cli -c -h 192.168.40.128 -p 8001

使用这条命令连接集群

再使用cluster info查看信息,让我们试试

再使用cluster nodes查看每个结点的信息

搭建完成

借鉴资料:

轻松搭建redis缓存高可用集群_哔哩哔哩_bilibili

实战篇-08.短信登录-session共享的问题分析_哔哩哔哩_bilibili

34、哨兵模式详解_哔哩哔哩_bilibili

  • 20
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值