docker小白第九天

这篇具有很好参考价值的文章主要介绍了docker小白第九天。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

docker小白第九天

安装redis集群

cluster(集群)模式-docker版本,哈希槽分区进行亿级数据存储。如果1~2亿条数据需要缓存,请问如何设计这个存储案例。单机存储是不可能的,需要分布式存储,如果使用redis又该如何部署。

哈希取余分区

docker小白第九天,docker,容器,运维
优点:简单粗暴,直接有效,只需要预估好数据,规划好节点,例如3台、8台、10台,就能保证一段时间的数据支撑。使用Hash算法让固定的一部分请求落到同一台服务器上,这样每台服务器固定处理一部分请求(并维护这些请求的信息),起到负载均衡+分而治之的作用。
缺点:原来规划好的节点,进行扩容或者缩容就比较麻烦,不管扩缩,每次数据变动导致节点有变动,映射关系需要重新进行计算,在服务器个数固定不变时没有问题,如果需要弹性扩容或故障停机的情况下,原来的取模公式就会发生变化:Hash(key)/3会变成Hash(key)/?。此时地址经过取余运算的结果将发生很大变化,根据公式获取的服务器也会变得不可控。某个redis机器宕机了,由于机器台数数量变化,会导致hash取余全部数据重新洗牌。

一致性哈希算法分区

一致性哈希算法在1997年由麻省理工学院中提出的,设计目标是为了解决分布式缓存数据变动和映射问题,某个机器宕机了,分母数量改变了,自然取余数失效的问题。
三大步骤:

  • 算法构建一致性哈希环
  • 服务器lP节点映射
  • key落到服务器的落键规则

1、构建哈希环:一致性哈希算法必然有个hash函数,并按照算法产生hash值,这个算法的所有可能哈希值构成一个全量集合,这个集合可以成为一个hash空间【0,(2^32)-1】,这个是一个线性空间,但是在算法中,我们通过适当的逻辑控制将它首尾相连(0=2*32),这样让它逻辑上形成了一个环形空间。
一致性哈希也是按照使用取模的方法,前面笔记介绍的节点取模法是对节点(服务器)的数量进行取模。而一致性Hash算法是对2’32取模,简单来说,一致性Hash算法将整个哈希值空间组织成一个虚拟的圆环,如假设某哈希函数H的值空间为0到(2^ 32)-1(即哈希值是一个32位无符号整形),整个哈希环如下图:整个空间按顺时针方向组织,圆环的正上方的点代表0,0点右侧的第一个点代表1,以此类推,2、3、4、……直到2^ 32-1,也就是说O点左侧的第一个点代表2^ 32-1,0和2^ 32-1在零点中方向重合,我们把这个由2^32个点组成的圆环称为Hash环。
2、IP节点映射:
将集群中各个IP节点映射到环上的某一个位置。将各个服务器使用Hash进行一个哈希,具体可以选择服务器的IP或主机名作为关键字进行哈希,这样每台机器就能确定其在哈希环上的位置。假如4个节点NodeA、B、C、D,经过IP地址的哈希函数计算(hash(ip)),使用IP地址哈希后在环空间的位置如下:
docker小白第九天,docker,容器,运维
3、key落到服务器的落键规则:当我们需要存储一个kv键值对时,首先计算key的hash值,hash(key),将这个key使用相同的函数Hash计算出哈希值并确定此数据在环上的位置,从此位置沿环顺时针“行走”,第一台遇到的服务器就是其应该定位到的服务器,并将该键值对存储在该节点上。如我们有Object A、Object B、Object C、Object D四个数据对象,经过哈希计算后,在环空间上的位置如下。根据一致性Hash算法,数据A会被定为到Node A上,B被定为到Node B上,C被定为到Node C上,D被定为到Node D上。
docker小白第九天,docker,容器,运维
优点:假设Node c宕机,可以看到此时对象A、B、D不会受到影响,只有object C对象被重定位到Node D。一般的,在一致性Hash算法中,如果一台服务器不可用,则受影响的数据仅仅是此服务器到其环空间中前一台服务器(即沿着逆时针方向行走遇到的第一台服务器〉之间数据,其它不会受到影响。就是C宕机,受到影响的只是B、C之间的数据,并且这些数据会转移到D进行存储。假设数据量增加了,需要增加一台节点Nodex,X的位置在A和B之间,那收到影响的也就是A到X之间的数据,重新把A到X的数据录入到X上即可,不会导致hash取余全部数据重新洗牌。

缺点:一致性哈希算法的数据倾斜问题,在服务节点太少时,容易因为节点分布不均匀而造成数据倾斜(被缓存的对象大部分集中缓存在某一台服务器上),例如系统中只有两合服务器:

docker小白第九天,docker,容器,运维

哈希槽分区

哈希槽实质就是一个数组,数组[0,(2^14)-1]形成hash slot空间。解决缓存数据均匀分配的问题,在数据和节点之间又加入了一层,把这层称为哈希槽(slot),用于管理数据和节点之间的关系,现在就相当于节点node上放的是槽,槽里放的是数据。

docker小白第九天,docker,容器,运维
槽解决的是粒度问题,相当于把粒度变大了,这样便于数据移动(即一堆数据算做一类,以前是一个数据算做一类)。哈希解决的是映射问题,使用key的哈希值来计算所在的槽,便于数据分配。节点数1000以内的redis集群,槽位最多16384个。这些槽会分配给集群中的所有主节点,分配策略没有要求。可以指定哪些编号的槽分配给哪个主节点。集群会记录节点和槽的对应关系。解决了节点和槽的关系后,接下来就需要对key求哈希值,然后对16384取余,余数是几key就落入对应的槽里。slot =CRC16(key) % 16384。以槽为单位移动数据,因为槽的数目是固定的,处理起来比较容易,这样数据移动问题就解决了。
Redis集群中内置了16384个哈希槽、redis会根据节点数量大致均等的将哈希槽映射到不同的节点。当需要在Redis集群中放置一个key-valuel时,redis先对 key使用crc16算法算出一个结果,然后把结果对16384求余数,这样每个key都会对应一个编号在0-16383之间的哈希槽,也就是映射到某个节点上。如下代码,kéy取A、取B时在Node2, key取C时落在Node3上。
docker小白第九天,docker,容器,运维

3主3从配置redis集群

关闭防火墙+启动docker后台服务

先关闭防火墙,并确认dokcer是启动状态的

systemctl stop firewalld
systemctl start docker

然后开启新建redis集群容器

docker run -d --name redis-node-1 --net host --privileged=true -v /data/redis/share/redis-node-1:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6381
# --cluster-enabled yes 是开启集群配置
# 创建并运行docker容器实例 docker run
# 容器名字--name redis-node-1
# 使用宿主机的IP和端口,默认--net host
# 获取宿主机root用户权限 --privileged=true
# 挂载容器卷,-v 宿主机地址:docker内部地址地
# redis镜像和版本号redis:6.0.8
# 开启持久化 --appendonly yes
# redis端口号--port 6381

依次修改节点的数字和端口的数字,执行六次新建容器命令
docker小白第九天,docker,容器,运维

docker ps

查看启动后的容器
docker小白第九天,docker,容器,运维
进入redis节点1的容器命令行配置,注意其中的ip要换为自己的真实ip地址。–cluster-replicas 1表示为每个master创建一个slave节点。

docker exec -it redis-node-1 /bin/bash
redis-cli --cluster create 192.168.0.175:6381 192.168.0.175:6382 192.168.0.175:6383 192.168.0.175:6384 192.168.0.175:6385 192.168.0.175:6386 --cluster-replicas 1

可以看到,自动创建了三个hash slots(哈希槽),分配给了三个主redis节点,另外新建了三个备redis节点,与主节点对应。
docker小白第九天,docker,容器,运维
在redis节点1的命令行,查看集群状态

redis-cli -p 6381
# 连接到节点1的端口
cluster info
# 查看集群信息

docker小白第九天,docker,容器,运维

cluster nodes
# 更详细的3主3从集群信息

注意,这里的主从对应的序号,是不固定的,是随机的,有可能1号机与4号机,做主从关系,有可能1号机与5号机,做主从关系。
docker小白第九天,docker,容器,运维

redis集群读写error,优化路由案例

# 进入第一个redis节点的容器命令行
docker exec -it redis-node-1 /bin/bash
# 客户端进入redis节点1,通过端口6381
redis-cli -p 6381
# 输入命令查看里边是否有数据
keys *

可以看到里边数据为空。
docker小白第九天,docker,容器,运维
输入以下命令存储数据,发现会报错。是因为经过哈希运算,需要分配给该数据的槽位是12706,超过了redis节点1的最大槽位5460,通过端口6383判断,该数据应该被存至redis节点3。

set k1 v1

docker小白第九天,docker,容器,运维
可以通过修改连接集群的命令,新增数据。不通过redis-cli -p 6381这种单机的方式连接,造成数据只访问redis节点1。为防止数据自动跳转路由失效,加参数-c,代表使用的是集群环境,并新增两个key,测试

# 在redis节点1容器的命令行,输入如下命令
redis-cli -p 6381 -c
set k1 v1
set k2 v2

可以看到都存储成功了,并且经过哈希计算后,若待分配的槽位不在节点1时,自动redicrt重定向数据到对应的节点。
docker小白第九天,docker,容器,运维

# 在节点1容器的命令行界面,查看集群信息
redis-cli --cluster check 192.168.0.175:6381

可以看到刚刚存储的两个键值对,分别在哪。还有其他一些集群信息。
docker小白第九天,docker,容器,运维文章来源地址https://www.toymoban.com/news/detail-786308.html

到了这里,关于docker小白第九天的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • K8S自动化运维容器化(Docker)集群程序

    1.什么是K8S K8S全程为Kubernetes,由于K到S直接有8个字母简称为K8S。 版本:目前一般是1.18~1.2.0,后续可能会到1.24-1.26,1.24版本后丢弃了docker(如需要使用需要第三方插件配合),目前最新版本是1.27 官网:https://kubernetes.io GitHub:GitHub - kubernetes/kubernetes: Production-Grade Container Schedul

    2024年02月10日
    浏览(44)
  • 基于Jenkins自动打包并部署docker、PHP环境,ansible部署-------从小白到大神之路之学习运维第86天

    第四阶段提升 时  间:2023年8月23日 参加人:全班人员 内  容: 基于Jenkins部署docker、PHP环境 目录 一、环境部署 (一)实验环境,服务器设置 (二)所有主机关闭防火墙和selinux,修改主机名 (三)配置git主机 (四)配置jenkins主机 (五)Jenkins配置 二、基于Jenkins自动打包

    2024年02月11日
    浏览(46)
  • 【运维知识大神篇】运维人必学的Docker教程1(Docker安装部署+Docker镜像管理+容器管理常用命令+搭建docker的本地yum源+windows系统安装docker环境)

    本篇文章开始给大家介绍Docker,这个是我非常喜欢的一个服务,介绍给大家,希望大家也能喜欢! 目录 何为容器 Docker环境安装部署 一、yum安装(CentOS7.9) 二、rpm包安装(CentOS) 三、卸载docker环境 四、安装指定的docker版本 五、Ubuntu安装docker环境 六、使用deb安装docker 七、

    2024年01月18日
    浏览(78)
  • K8S:K8S自动化运维容器Docker集群

    (1)K8S全程为Kubernetes,由于K到S直接有8个字母简称为K8S。 (2)版本:目前一般是1.18~1.2.0,后续可能会到1.24-1.26,1.24版本后丢弃了docker(如需要使用需要第三方插件配合),目前最新版本是1.27 (3)官网:https://kubernetes.io GitHub:GitHub - kubernetes/kubernetes: Production-Grade Container S

    2024年02月10日
    浏览(58)
  • K8S:K8S自动化运维容器化(Docker)集群程序

    目录 一、K8S概述 1、什么是K8S 2、为什么要用K8S 3、作用及功能 二、K8S的特性 1、弹性伸缩 2、自我修复 3、服务发现和复制均衡 5、自动发布和回滚 6、集中化配置管理和秘钥管理 7、存储编排 8、任务批量处理运行 三、K8S的集群架构 四、K8S的核心组件 1、Master组件 ①Kube-apis

    2024年02月12日
    浏览(42)
  • 新手小白安装aio小主机布置家庭网络-4-proxmox-ve安装LXC、pve创建ct容器安装docker。

    PVE是使用Debian系统作为底层。我们创建Debian LXC容器。 下载Debian11DE  ct模板 创建CT,一定把无特权容器前面的勾去掉。我们需要一个特权的容器。勾选嵌套。完成后不要启动! 。 开启ct102容器前,进入pve shell 设置ct102容器设置 添加代码 ctrl+x保存配置,y确认,回车。

    2024年02月15日
    浏览(35)
  • 【运维小知识】(一)——centos系统安装(小白入门级)

    目录 1.制作系统U盘 2.安装centos系统 3.系统配置 3.1【语言】配置​编辑 3.2【软件选择】配置  3.3【安装位置】配置 3.4【主机名、root密码、网络】配置         首先下载软件ventoy,制作系统U盘,买个新U盘。先在笔记本电脑安装ventoy软件,打开软件,然后把u盘插在笔记本电

    2024年02月17日
    浏览(30)
  • 运维小知识(一)——centos系统安装(小白入门级)

    目录 1.制作系统U盘 2.安装centos系统 3.系统配置 3.1【语言】配置​编辑 3.2【软件选择】配置  3.3【安装位置】配置 3.4【主机名、root密码、网络】配置         首先下载软件ventoy,制作系统U盘,买个新U盘。先在笔记本电脑安装ventoy软件,打开软件,然后把u盘插在笔记本电

    2024年02月16日
    浏览(36)
  • 小白到运维工程师的自学之路 第五十四集 (ansible自动化运维工具)

    Ansible是一种开源的自动化工具,用于自动化任务的执行、配置管理和应用部署。它采用基于Python编写的简单、轻量级的语法,可以通过SSH协议远程管理和配置多台计算机。 Ansible的主要特点包括: 1、简单易用:设计简单,语法清晰,无需特殊培训即可上手使用。 2、基于模块

    2024年02月16日
    浏览(26)
  • 从小白到大神之路之学习运维第61天--------Ansible自动化运维工具(playbook配置文件深入了解)

    第三阶段基础 时  间:2023年7月14日 参加人:全班人员 内  容: playbook配置文件 目录 playbook配置文件 一、playbook配置文件概念 修改hosts文件 建立playbook配置文件 yml脚本写法注释: 二、Playbook的核心元素 三、Playbook的用法 四、实验案例: (一)工作流程 1、语法检查   2.预测

    2024年02月16日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包