RedLock-红锁

RedLock-红锁,第1张

RedLock是什么?

RedLock是基于redis实现的分布式锁,它能够保证以下特性:

互斥性:在任何时候,只能有一个客户端能够持有锁;

避免死锁:当客户端拿到锁后,即使发生了网络分区或者客户端宕机,也不会发生死锁;(利用key的存活时间)

容错性:只要多数节点的redis实例正常运行,就能够对外提供服务,加锁或者释放锁;

而非redLock是无法满足互斥性的,上面已经阐述过了原因。

RedLock算法

假设有N个redis的master节点,这些节点是相互独立的(不需要主从或者其他协调的系统)。N推荐为奇数~

客户端在获取锁时,需要做以下 *** 作:

获取当前时间戳,以微妙为单为。

使用相同的lockName和lockValue,尝试从N个节点获取锁。(在获取锁时,要求等待获取锁的时间远小于锁的释放时间,如锁的lease_time为10s,那么wait_time应该为5-50毫秒;避免因为redis实例挂掉,客户端需要等待更长的时间才能返回,即需要让客户端能够fast_fail;如果一个redis实例不可用,那么需要继续从下个redis实例获取锁)

当从N个节点获取锁结束后,如果客户端能够从多数节点(N/2 + 1)中成功获取锁,且获取锁的时间小于失效时间,那么可认为,客户端成功获得了锁。(获取锁的时间=当前时间戳 - 步骤1的时间戳)

客户端成功获得锁后,那么锁的实际有效时间 = 设置锁的有效时间 - 获取锁的时间。

客户端获取锁失败后,N个节点的redis实例都会释放锁,即使未能加锁成功。

为什么N推荐为奇数呢?

原因1:本着最大容错的情况下,占用服务资源最少的原则,2N+1和2N+2的容灾能力是一样的,所以采用2N+1;比如,5台服务器允许2台宕机,容错性为2,6台服务器也只能允许2台宕机,容错性也是2,因为要求超过半数节点存活才OK。

原因2:假设有6个redis节点,client1和client2同时向redis实例获取同一个锁资源,那么可能发生的结果是——client1获得了3把锁,client2获得了3把锁,由于都没有超过半数,那么client1和client2获取锁都失败,对于奇数节点是不会存在这个问题。

0Redis主从架构的问题
1哨兵服务介绍
2架构图
3主从服务搭建
4配置哨兵服务
5启动哨兵服务
6验证哨兵服务

对于Redis的主从架构而言,无法实现 master 和 slave 角色的自动切换, 即当 master 出现 redis 服务异常、主机断电、磁盘损坏等问题导致 master 无法使用,而 redis 高可用无法实现自故障转移(将 slave 提升为 master),需要手动改环境配置才能切换到 slave redis 服务器。另外无法横向扩展 Redis 服务的并行写入性能, 当单台 Redis 服务器性能无法满足业务写入需求的时候就必须需要一种方式解决此问题。
1master和slave角色的无缝切换,让业务无感知从而不影响业务使用
2可以横向动态扩展Redis服务器, 从而实现多台服务器并行写入以实现更高并发的目的。

Sentinel进程是用于监控redis集群中Master主服务器工作的状态,在Master主服务器发生故障的时候,可以实现Master和Slave服务器的切换,保证系统的高可用,其已经被集成在 redis26+的版本中,Redis的哨兵模式到了28版本之后就稳定了下来。一般在生产环境也建议使用Redis28以后版本。哨兵(Sentinel)是一个分布式系统,你可以在一个架构中运行多个哨兵(sentinel) 进程,这些进程使用流言协议(gossipprotocols)来接收关于Master主服务器是否下线的信息,并使用投票协议(Agreement Protocols)来决定是否执行自动故障迁移,以及选择哪个 Slave 作为新的 Master。每个哨兵(Sentinel)进程会向其它哨兵(Sentinel)、Master、Slave定时发送消息,以确认对方是否”活”着,如果发现对方在指定配置时间(可配置的)内未得到回应,则暂时认为对方已掉线,也就是所谓的”主观认为宕机” ,英文名称:Subjective Down,简称SDOWN。有主观宕机,肯定就有客观宕机。当“哨兵群”中的多数 Sentinel 进程在对 Master 主服务器做出 SDOWN 的判断,并且通过SENTINEL is-master-down-by-addr 命令互相交流之后,得出的Master Server下线判断,这种方式就是“客观宕机”,英文名称是: Objectively Down, 简称 ODOWN。通过一定的 vote 算法,从剩下的 slave 从服务器节点中,选一台提升为 Master 服务器节点,然后自动修改相关配置,并开启故障转移(failover)。Sentinel 机制可以解决 master 和 slave 角色的切换问题。

安装

修改配置文件

启动服务

192168177139

192168177140

其他地方配置和主服务器一致

启动服务

查看主从状态
MASTER

SLAVE1

SLAVE2

MASTER

SLAVE1

SLAVE2

主服务器

SLAVE1:升级为主服务器

SLAVE2:主服务器变为node10

主服务器

从服务器

本文会以 最简单 最直接 最完整 的方式记录kubernetes(下面统称K8S)单master多工作节点(worker nodes)的集群步骤

首先要简单了解一下本文的3个核心概念:

内存建议至少4G

问:如何查看主机名?

答:执行命令hostname

问:如何修改主机名?

答:永久生效的做法:执行命令vi /etc/hostname,把第一行去掉(不能注释掉,要去掉),然后重新写上自定义的主机名(注意命名规范),保存并重启后生效;

临时生效的做法:执行以下命令

问:如何查看MAC地址?

答:执行命令ip link,然后看你的第一网卡

问:如何查看product_uuid?

答:执行命令sudo cat /sys/class/dmi/id/product_uuid

注意:30000-32767这个端口范围是我们创建服务的端口必须要设置的一个范围(如果设置范围以外的会有限制提示并创建失败),这是K8S规定的。

另外,如果你要直接关闭防火墙可以执行

⑥必须禁用Swap

Swap total大于0,说明Swap分区是开启的

问:如何关闭Swap?

答:编辑文件/etc/fstab,在swap行前面加上#号注释, 保存并重启服务器

再次查看分区状态,已生效

常见的容器引擎(Container runtime,简称runtime):

本文使用的容器引擎是Docker

安装完成后查看版本:

当出现可能跟Docker引擎相关的奇怪异常时可以尝试把Docker卸载干净并重新安装,但一定要注意镜像、容器、卷或配置文件这些是否需要备份。

下面记录卸载Docker引擎的步骤:

①卸载 Docker Engine、CLI 和 Containerd 包:

②主机上的映像、容器、卷或自定义配置文件不会自动删除。删除所有镜像、容器和卷:

③配置文件如果有不合法的字符时会导致启动失败,我们需要将其删除然后重建

此时Docker引擎已卸载干净

官网用的是谷歌的yum源,因为国内是连不上的,所以这里替换成阿里提供的yum源

①安装

从安装信息中可以看到版本号是122

Installing:

kubeadm x86_64 1224-0 kubernetes 93 M

kubectl x86_64 1224-0 kubernetes 97 M

kubelet x86_64 1224-0 kubernetes 20 M

②启动



这就是一个驱动程序,注意cgroup和cgroupfs不要混淆了

引用官方的一段话

“由于 kubeadm 把 kubelet 视为一个系统服务来管理,所以对基于 kubeadm 的安装, 我们推荐使用 systemd 驱动,不推荐 cgroupfs 驱动。”

kubeadm默认是使用systemd 驱动,而我们的Docker默认驱动是cgroupfs(docker info可以查看),所以需要将Docker的驱动改成systemd

①编辑Docker配置文件

②重启Docker服务

再次docker info查看驱动信息已变成了systemd

工作节点(worker nodes)的最小配置就到这里了

①镜像源参数说明

默认情况下, kubeadm 会从 k8sgcrio 仓库拉取镜像,国内是拉不了的。官方文档明确表示允许你使用其他的 imageRepository 来代替 k8sgcrio。

--image-repository 你的镜像仓库地址

接下来我找了一些国内的镜像源,并简单做了下分析

综合上述统计,我选择阿里云的镜像源

②ip地址范围参数说明

--pod-network-cidr =19216800/16

注意:如果19216800/16已经在您的网络中使用,您必须选择一个不同的pod网络CIDR,在上面的命令中替换19216800/16。

集群初始化命令:

因为我用的是演示机器,所以这里把完整的执行信息都贴出来方便查阅,平时工作中一定要注意保护好敏感的信息(我的ip地址范围是自定义的便于下面的功能演示,另外初次init需要下载镜像文件,一般需要等几分钟)

如上所示,集群初始化成功,此时一定要注意看上面执行结果最后的那部分 *** 作提示,我已用标明了初始化成功后还需要执行的3个步骤

注意:如果init成功后发现参数需要调整,可以执行kubeadm reset,它的作用是尽最大努力恢复kubeadm init 或者 kubeadm join所做的更改。

To start using your cluster, you need to run the following as a regular user:

翻译:开始使用集群前,如果你是普通用户(非root),你需要执行以下的命令:

Alternatively, if you are the root user, you can run:

翻译:或者,如果你使用的是root,你可以执行以下命令:

(注意:export只是临时生效,意味着每次登录你都需要执行一次)

网络配置配的就是Pod的网络,我的网络插件选用calico

cidr就是ip地址范围,如果您使用 pod CIDR 19216800/16,请跳到下一步。

但本文中使用的pod CIDR是19210000/16,所以我需要取消对清单中的 CALICO_IPV4POOL_CIDR 变量的注释,并将其设置为与我选择的 pod CIDR 相同的值。(注意一定要注意好格式,注意对齐)

可根据需求自定义清单,一般不需要的就直接跳过这步

在所有的工作节点上执行join命令(复制之前初始化成功后返回的加入集群命令到所有的工作节点执行即可)

master上查看所有节点的状态

到这里集群已经创建完成

最后我再安装K8S的可视化界面kubernetes-dashboard,方便我们日常使用

①下载yaml文件

②修改yaml文件,新增type和nodePort,使服务能够被外部访问

③安装并查看运行情况

④新建用户

文件创建完成后保存并apply

⑤获取Token,用于界面登录

⑥登录dashboard

192168189128是我的master服务器ip,另外要注意必须使用>一、集群搭建

1前置 *** 作

若克隆已有的es虚拟机,一定要清空一下文件:

2配置集群,修改elasticsearchyml

# 配置集群名称,保证每个节点的名称相同,如此就能都处于一个集群之内了

clustername: imooc-es-cluster

# 每一个节点的名称,必须不一样

nodename: es-node1

# >

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10754472.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-11
下一篇 2023-05-11

发表评论

登录后才能评论

评论列表(0条)

保存