当前位置: 首页 > news >正文

织梦网站建设实训总结抖音seo是什么意思

织梦网站建设实训总结,抖音seo是什么意思,wordpress go,如何在手机上做网站目录 一、基于 Docker、DockerCompose 搭建 Redis 集群 1.1、前言 1.2、编写 shell 脚本 1.3、执行 shell 脚本#xff0c;创建集群配置文件 1.4、编写 docker-compose.yml 文件 1.5、启动容器 1.6、构建集群 1.7、使用集群 1.8、如果集群中#xff0c;有节点挂了创建集群配置文件 1.4、编写 docker-compose.yml 文件 1.5、启动容器 1.6、构建集群 1.7、使用集群 1.8、如果集群中有节点挂了怎么办 二、集群故障、扩容处理 2.1、集群故障处理 a故障判定 b故障迁移 2.2、集群宕机 2.3、集群扩容 a分析 b将新的主节点 110 加入到集群中 c重新分配 slots 问题如果在搬运 slots / key 的过程中客户端能否访问 redis 集群呢 一、基于 Docker、DockerCompose 搭建 Redis 集群 1.1、前言 当前阶段由于我只有一个 云服务器搞分布式系统就比较麻烦而实际工作中一般是通过多个主机的方式来搭建集群的. 因此这里我会 基于 docker、docker-compose容器编排 来搭建 redis 集群. Ps搭建前一定要把之前启动的 redis 容器停止. 1.2、编写 shell 脚本 在 linux 上以 .sh 为后缀的文件称为 “shell 脚本” 通过这个文件我们就可以把平时在 linux 上执行的指令批量化执行同时还能加入 条件、循环、函数等机制. 这里我们创建 11 个 redis 节点. 这些 redis 的配置文件内容大同小异因此这里使用 脚本来批量生成也可以不使用脚本手动一个一个改. for port in $(seq 1 9); \ do \ mkdir -p redis${port}/ touch redis${port}/redis.conf cat EOF redis${port}/redis.conf port 6379 bind 0.0.0.0 protected-mode no appendonly yes cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 cluster-announce-ip 172.30.0.10${port} cluster-announce-port 6379 cluster-announce-bus-port 16379 EOF done# 注意 cluster-announce-ip 的值有变化和上面分开写也是因为这个原因for port in $(seq 10 11); \ do \ mkdir -p redis${port}/ touch redis${port}/redis.conf cat EOF redis${port}/redis.conf port 6379 bind 0.0.0.0 protected-mode no appendonly yes cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 cluster-announce-ip 172.30.0.1${port} cluster-announce-port 6379 cluster-announce-bus-port 16379 EOF done for port in $(seq 1 9)表示一个循环seq 是一个 linux 命令生成 [1, 9] 数字依次赋值给变量 port. do、done在 shell 中 { } 用来表示变量不是代码块对于 for 就是使用 do 和 done 来表示 代码块 开始 和 结束 的上古时期的编程语言就是这样的. \表示续航符就是把下一行的内容和当前行合并成一行.  shell 默认情况下要求把所有代码都写到一行里但是可以使用续航符来换行继续补充. 第一个循环体的内容第二个循环体思想也一样通过 mkdir 创建 9 个名字分别为 redis1、redis2、redis3......的文件夹接着通过 touch redis${port} 在每个文件夹下创建 redis.conf 文件. 文件的内容从 EOF 开始到 EOF 结束通过  cat  写入到每个 redis.conf 文件中. 字符串拼接shell 中拼接字符串是直接写在一起的不需要使用 . cluster-enabled yes开启集群 cluster-config-file后续启动节点后自动生成的节点配置文件会配置一些 redis 集群信息. cluster-node-timeout 5000心跳包的超时时间设置为 5000 ms. cluster-announce-ip表示当前 redis 节点所在的主机 ip 地址当前是使用 docker 容器模拟的主机此处因该是 docker 容器的 ip. cluster-announce-port表示当前 redis 节点自身绑定的端口容器内的端口.  不同容器内部可以有相同端口后续进行端口映射再把容器外的端口不同端口映射到容器内的端口即可. cluster-announce-bus-port一个服务器可以绑定多个端口号当前这个表示管理端口刚刚上面讲的是业务端口是用来进行业务数据通信的用来完成一些管理以上任务进行通信的如果某个 分片 中的 redis 主节点挂了就需要让从节点成为主节点就需要通过 管理端口 来完成. 1.3、执行 shell 脚本创建集群配置文件 通过以下命令执行 shell 脚本 centos 执行 shell 脚本命令 sh generate.sh ubuntu 执行 shell 脚本命令 bash generate.sh 执行后会得到 11 个目录每个目录里都有一个配置文件配置文件中ip 地址各不相同 1.4、编写 docker-compose.yml 文件 在配置文件中需要先手动创建 networks 网络然后分配 网段 给后续创建 redis 集群中每一个节点的静态ip. Ps这里配置静态 ip固定 ip是为了后续观察. version: 3.3 networks:mynet:ipam:config:- subnet: 172.30.0.0/24 接着创建 redis 集群中每一个节点 services:redis1:image: redis:5.0.9container_name: redis1restart: alwaysvolumes:- ./redis1/:/etc/redis/ports:- 6371:6379- 16371:16379command:redis-server /etc/redis/redis.confnetworks:mynet:ipv4_address: 172.30.0.101redis2:image: redis:5.0.9container_name: redis2restart: alwaysvolumes:- ./redis2/:/etc/redis/ports:- 6372:6379- 16372:16379command:redis-server /etc/redis/redis.confnetworks:mynet:ipv4_address: 172.30.0.102redis3:image: redis:5.0.9container_name: redis3restart: alwaysvolumes:- ./redis3/:/etc/redis/ports:- 6373:6379- 16373:16379command:redis-server /etc/redis/redis.confnetworks:mynet:ipv4_address: 172.30.0.103redis4:image: redis:5.0.9container_name: redis4restart: alwaysvolumes:- ./redis4/:/etc/redis/ports:- 6374:6379- 16374:16379command:redis-server /etc/redis/redis.confnetworks:mynet:ipv4_address: 172.30.0.104redis5:image: redis:5.0.9container_name: redis5restart: alwaysvolumes:- ./redis5/:/etc/redis/ports:- 6375:6379- 16375:16379command:redis-server /etc/redis/redis.confnetworks:mynet:ipv4_address: 172.30.0.105redis6:image: redis:5.0.9container_name: redis6restart: alwaysvolumes:- ./redis6/:/etc/redis/ports:- 6376:6379- 16376:16379command:redis-server /etc/redis/redis.confnetworks:mynet:ipv4_address: 172.30.0.106redis7:image: redis:5.0.9container_name: redis7restart: alwaysvolumes:- ./redis7/:/etc/redis/ports:- 6377:6379- 16377:16379command:redis-server /etc/redis/redis.confnetworks:mynet:ipv4_address: 172.30.0.107redis8:image: redis:5.0.9container_name: redis8restart: alwaysvolumes:- ./redis8/:/etc/redis/ports:- 6378:6379- 16378:16379command:redis-server /etc/redis/redis.confnetworks:mynet:ipv4_address: 172.30.0.108redis9:image: redis:5.0.9container_name: redis9restart: alwaysvolumes:- ./redis9/:/etc/redis/ports:- 6379:6379- 16379:16379command:redis-server /etc/redis/redis.confnetworks:mynet:ipv4_address: 172.30.0.109redis10:image: redis:5.0.9container_name: redis10restart: alwaysvolumes:- ./redis10/:/etc/redis/ports:- 6380:6379- 16380:16379command:redis-server /etc/redis/redis.confnetworks:mynet:ipv4_address: 172.30.0.110redis11:image: redis:5.0.9container_name: redis11restart: alwaysvolumes:- ./redis11/:/etc/redis/ports:- 6381:6379- 16381:16379command:redis-server /etc/redis/redis.confnetworks:mynet:ipv4_address: 172.30.0.111 - subnet: 172.30.0.0/24此处 172.30.0 是网络号并且 ip 是内网 ip这就要求 不能和你当前主机上现有的其他网段冲突每个人主机上已有的网段具体不一定一样. ipv4_address: 172.30.0.101此处配置静态 ip。注意网路号部分要和前面的网一致主机号部分可以在(1~255 之间随意配置不重复就行)但是这里我们需要按照之前在配置文件中写的 cluster-announce-ip 要对应的上如下图 1.5、启动容器 通过 docker-compose up -d 启动 yml 中配置的所有容器. 1.6、构建集群 此处是把前 9 个主机构建成集群, 3 主 6 从. 后 2 个主机暂时不⽤. 通过以下命令构建即可 redis-cli --cluster create 172.30.0.101:6379 172.30.0.102:6379 172.30.0.103:6379 172.30.0.104:6379 172.30.0.105:6379 172.30.0.106:6379 172.30.0.107:6379 172.30.0.108:6379 172.30.0.109:6379 --cluster-replicas 2 --cluster create表⽰建⽴集群. 后⾯填写每个节点的 ip 和地址确保这个命令的 IP 和实际环境一致. --cluster-replicas 2 表⽰每个主节点需要两个从节点备份.  这个配置设置了以后redis 就知道 3 个节点是一伙的一个分片上的一共 9 个节点一共是 3 个分片. 输入 yes 后如下 1.7、使用集群 现在从 101 - 109 九个节点是一个集群使用客户端端连上任意一个节点本质上都是等价的每个集群分别存储 “全集” 数据中的一部分连接任意一个客户端时加上 -c 选项都可以访问到全集数据. 建立号集群后连接客户端可以通过 -h -p 连接、可以通过 -h 连接也可以直接通过 -p 连接对外端口如下以下都是连接 172.30.0.103:6379 : 通过 cluster nodes 查看当前集群的信息. 在集群中存储数据 上图 error 的原因是 k1 这个 key 通过 hash 计算后得到 slot 是 12706 这个槽位号在刚刚查看的集群信息中是属于 3 号分片的. 报错信息中提示我们要把客户端请求转发给 103 这个节点. 这样岂不是很麻烦 实际上我们可以在启动 redis-cli 的时候加上 -c 选项此时 redis 客户端就会根据当前 key 计算出的槽位号自动找到匹配的分片主机进一步完成操作. 注意上图重定向后redis 连接的客户端也会改变. 另外如果尝试在从节点上写操作也会自动重定向到指定的主节点上. Ps实际上以前所讲到的 redis 相关命令基本上都是都是适用的除了个别例如 msetmget...... 这种可以操作多个 key 的是不可用的因为 key 可能都是分散在不同分片上的. 1.8、如果集群中有节点挂了怎么办 如果挂了的节点是从节点没事~ 如果挂了的事主节点写操作就不能进行了此时集群做的工作和 哨兵 做的有点类似了会自动从主节点下的从节点挑一个出来提拔成主节点. 这里我让 redis1 这个主节点挂掉 docker stop redis1 redis1 挂掉前集群信息如下 redis1 挂掉后集群信息如下 可以看出集群机制也能处理故障转移. 二、集群故障、扩容处理 2.1、集群故障处理 a故障判定 1. 每个节点每秒钟都会给一些随机的节点发送 ping 包这里既包含了集群的配置信息如 id、属于哪个分片、是主节点还是从节点、持有哪些 slots......收到的节点会返回一个 pong 包.  这里的 ping 包不是全发一遍这样设定是为了避免在节点很多的时候心跳包也是非常多的严重消耗网络带宽. 2. 当节点 A 给节点 B 发送 ping 包 B 不能如期回应的时候A 就会重置和 B 的 TCP 连接如果重连失败A 就会把 B 设为 PFAIL 相当于主观下线。 3. A 判定 B PFAIL 后会通过 redis 内置的 Gossip 协议和其他节点沟通向其他节点确认 B 的状态. 4. 如果 A 发现其他还跟多节点也认为 B 为 PFAIL并且数目超过集群个数的一般那么 A 就会把 B 标记为 FAIL相当于客观下线并且把这个消息同步给其他节点让其他节点也把 B 标记为 FAIL. b故障迁移 首先会有个判定 如果 B 是从节点就不需要进行故障迁移.如果 B 是主节点那么就会由 B 的从节点比如 C 和 D触发故障迁移. 具体的 1. 从节点判定自己是否具有参选资格如果从节点太久没和主节点通信太久没有同步数据差异太大就会失去竞选资格. 2. 有资格的节点比如 C 和 D 就会先休眠一定的时间休眠时间 500ms 基础时间 [0, 500ms] 随机时间 排名 * 1000msoffset 值越大表明数据越接近主节点排名越靠前休眠时间越短也就是说休眠时间主要取决于排名. 3. 此时如果 C 的休眠时间到了C 就会给所有集群中的节点进行拉票操作但是只有主节点才有投票资格.谁休眠时间短大概率就是新的主节点了. 4. 主节点会把自己的票投给 C每个主节点只有 1 票当 C 收到的票数超过主节点数目的一半C 就会晋升成为主节点C 自己执行 slaveof no one并且让 D 执行 slaveof C. 5. 同时C 还会把自己成为主节点的消息同步给其他集群的节点大家都会更新自己保存的集群结构信息. 6. 最后如果之前宕机的主机点恢复了就会变成从节点接入到集群中. 2.2、集群宕机 以下三种情况会出现集群宕机 某个分片所有的主节点和从节点都挂了这个时候分片就无法提供数据服务了. 某个分片主节点挂了但是没有从节点也无法提供数据服务了. 超过半数的 master 节点挂了说明集群遇到了非常严重的情况就得感觉停止下来检查看是不是有什么问题 Ps如果集群中有一个节点挂了无论是什么节点我们程序员都因该尽快处理好最晚也是第二天上班之前处理好. 2.3、集群扩容 a分析 上述操作已经将 101 ~ 109  9 个主机构成了 3 主 6 从结构的集群了. 接下来为了演示扩容就把 110 和 111 也加入到集群中. 以 110 为 master 111 为 slave把数据分片从 3 - 4. b将新的主节点 110 加入到集群中 redis-cli --cluster add-node 172.30.0.110:6379 172.30.0.101:6379 add-node第一个 ip 和 端口号 表示新增的节点是什么第二个 ip 和端口号 表示集群上任意一个节点任何一个都行只要是你想加入的某一个集群中的节点即可表示要把新节点加入到哪个集群中. 之后通过 cluster nodes 就可以看到 redis10 主节点加入集群但是并没有分配 slots. c重新分配 slots 把之前的三组 master 上面的 slots 拎出来分配给新的 master  redis-cli --cluster reshard 172.30.0.101:6379 输入命令后会先打印出当前集群每个机器的情况然后要求用户输入要切分多少个 slots 4 个分片一共是 16384除以 4 得到的就是 4096因此这里填 4096 即可给 redis10 切分出 4096 个槽位号. 紧接着会询问让哪个节点来接收直接粘贴 redis10 这个主机的 id 即可. 接着就让你选择从哪些节点且分出 slots all表示从其他每个持有 slots 的 master 都点过来.手动指定从某一个或者某几个节点来移动 slots以 done 为结尾. 输入 all 之后不会真正的搬运而是先给出搬运的计划. 当输入 yes 之后搬运真正开始此时不仅仅是 slots 重新划分也会把 slots 上对应的数据也搬运到新的主机上.这是比较重量级的操作 d给新的主节点添加从节点 redis-cli --cluster add-node 172.30.0.111:6379 172.30.0.101:6379 --cluster-slave 执⾏完毕后, 从节点就已经被添加完成了. 问题如果在搬运 slots / key 的过程中客户端能否访问 redis 集群呢 之前咱们了解到哈希槽分区算法可以知道 大部的 key 是不用搬运的 针对这些未搬运的 key此时可以正常访问的. 针对正在搬运中的 key是有可能会出现访问出错的情况. 假设 客户端 访问 k1集群通过分片算法得到的 k1 是第一个分片的数据就会重定向到第一个分片的节点那么就有一种可能在重定向过去之后正好 k1 被搬走了自然就无法访问了. 如果像针对生产环境进行扩容操作还是得悠着点比如找个夜深人静的时候没啥客户端访问集群的时候进行扩容就可以把损失降到最低. 很明显要想追求更高的可用性让扩容对于用户影响更小就需要搞一组新的机器重新搭建集群并且把数据导进来使用新集群代替旧集群但是成本是最高的. Ps关于集群的缩容就是把一些节点拿掉减少分片的数量. 不过一般都是进行扩容很少缩容.
http://www.tj-hxxt.cn/news/143830.html

相关文章:

  • 网站建设现在主要做些什么WordPress 任务悬赏插件
  • 网站公司设计订阅号怎么弄
  • 网站设计好了如何上传到自己搭建的网上去小程序api抓取
  • icp备案 网站首页怎样给自己网站做反链
  • wordpress 整站语言企业展示设计公司
  • 网站开启伪静态需要编写什么代码互联网网页设计流程
  • 成都装修网站建设网站建设人才招聘
  • 制作个简单公司网站要多少钱产品网络营销方案
  • 网站开发小程序开发公司大学生创新创业大赛观后感
  • 网站制作心得体会200字本人做静态网站开发
  • 帝国文章网站模板缩短网址生成器
  • 网站整体规划织梦做的网站打开慢
  • 电话投放小网站app定制小程序开发
  • 永兴县网站建设哪个好阿里服务器怎么做网站服务器吗
  • 网站内容维护合同淘宝客网站主机
  • 网站推广无锡如何黑网站
  • wordpress子站点打不开旅游网站建设外现状
  • 从做系统后以前的网站打不开了东莞阳光网站建设成效
  • 自己想做网站动画形式的h5在哪个网站做
  • 信阳网站建设公司网站域名到期后不续费会怎样
  • 做网站框架显示不出来网站开发整体制作流程
  • 做网站搞流量互联网网站商标
  • 网站建设制作找哪家公司网页设计公司宣传事例
  • 网站建设脱颖而出搭建平台吸引人才
  • 荆门网站制作公司佛山微网站建设哪家专业
  • 杭州网站建设seo优化营销制作手机上怎么赚钱啊 正规
  • 淘宝站内推广方式有哪些沈阳免费网站建站模板
  • 三门峡集团网站建设女生学建筑选择什么专业
  • 珠海市官网网站建设价格网站建设08keji
  • 建设网站需要什么信息wordpress用户登录设置