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

找人做网站怎么做手机软件制作器下载

找人做网站怎么做,手机软件制作器下载,高端企业网站建设流程,东莞手机端网络推广1. 什么是集群 广义的集群#xff1a;只要是多台机器#xff0c;构成一个分布式系统#xff0c;就可以称为一个“集群”。像前面的主从结构#xff0c;哨兵模式都是“广义的集群”狭义的集群#xff1a;redis提供的集群模式#xff0c;这个集群模式主要解决存储空间不足… 1. 什么是集群 广义的集群只要是多台机器构成一个分布式系统就可以称为一个“集群”。像前面的主从结构哨兵模式都是“广义的集群”狭义的集群redis提供的集群模式这个集群模式主要解决存储空间不足的问题 例如整个数据全局是1TB引入三组Master/Slave来存储那么每一组Master/Slave存储数据全集的一部分从而构成一个更大的整体称为redis集群Cluster) 在上图中这三组机器存储的数据都不一样每个slave都是对应master的备份当master挂了就会选举一个slave成为新的master)。每个红框部分称为一个分片如果全量数据进一步增加只要再增加更多即可解决。 2.数据分片算法 2.1 哈希求余 借鉴哈希表的基本思想针对要插入的数据的keyredis都是键值对结构计算hash值比如使用MD5计算hash值)。再把这个hash值余上分片个数就得到一个下标。此时就可以把这个数据放到该下标对应的分片中。即hash(key) % N md5是一个非常广泛使用的hash算法 md5计算的结果是定长的无论输入的原字符串多长最终算出的结果都是固定长度md5计算的结果是分散的两个原字符串哪怕大部分都相同只有一小部分不同算出来的结果也会差别很大。因此使用md5作为hash函数可以有效避免hash冲突md5计算的结果是不可逆的给你原字符串很容易算出md5值给你md5值很难还原出原始字符串。因此常使用md5加密 优点 简单高效数据分配均匀 缺陷 随着业务增长数据变多现有分片不够使用。需要进行“扩容”需要重新进行hash计算新的下标。上图中一共20个数据只有3个数据不需要搬运如果是20亿的数据就需要搬运17亿并且每个分片中不止有主节点还有从节点需要进行主从同步开销特别大。 2.2 一致性哈希 使用hash求余中当前key属于哪个分片是交替的。像上图中102属于0号分片103属于1号分片104属于2号分片105又数据0号分片交替出现导致搬运成本非常高。而一致性哈希把交替出现改进成连续出现。 把0-2^32-1的数据空间映射到一个圆环上数据按照顺时针方向增长 假设当前存在三个分片就把分片放到圆环的某个位置上 假定有一个key计算得到的hash值为H那么这个key映射到哪个分片规则是从H所在位置顺时针往下找找到第一个分片就是该key所从属的分片 N个分片把整个圆环分成了N个管辖区间key的hash值落在某个区间内就归对应区间管理 扩容 从3个分片扩容到4个分片时此时只需要将0号分片上的部分数据给搬运到3号分片上即可12号分片管理的区间不变。 优点大大降低了扩容是数据搬运的规模提高了扩容操作的效率缺点数据分配不均匀会数据倾斜 2.3 哈希槽分区算法 这是redis采用的分片算法可以有效解决搬运成本高和数据分配不均的问题redis cluster引入哈希槽hash slots)算法。 :::tips hash_slot crc16(key) % 16384 ::: hash_slot 哈希槽 其中crc16也是一种hash算法 16384 16 * 1024 即16k 相当于把整个哈希值映射到16384个槽位上即[0,16383].然后再把这些槽位比较均匀的分配给每个分片每个分片的节点都需要记录自己持有的那些槽位。例如当前有三个分片可能的分配方式 0号分片[05461]共5462个槽位1号分片[5462,10923]共5463个槽位2号分片[10924,16383]共5460个槽位 :::success 每个分片会使用“位图”这样的数据结构表示出当前有多少槽位。16384个bit位,用每一位的0/1来区分自己这个分片当前是否持有该槽位号。16384%82048即2kb ::: 扩容 例如新增一个分片就需要针对原有的槽位进行重新分配 0号分片 【04095】共4096个槽位1号分片【54629557】共4096个槽位2号分片【1092415019】共4096个槽位3号分片【40965461】【955810923】【1502016383】共4096个槽位 在上述过程中只有被移动的槽位对应的数据才需要被搬运。并且分片上的槽位号不一定是连续的区间。 哈希槽分区算法的实质结合了哈希算法和一致性哈希的思想 问题1redis集群最多有16384个分片吗 一共有16384个槽位如果是16384个分片意味着一个分片一个槽位此时很难保证数据再各个分片的均衡性。key要先映射到槽位再映射到分片中。如果每个分片的包含的槽位比较多槽位个数相当就可以认为包含的key的数量也是相当的。如果每个分片包含的槽位非常少槽位个数不一定能直观反应到key的数目因为有的槽位有多个key有的槽位可能没有key.并且redis作者建议集群分片数不超过1000 问题2为什么是16384个槽位 redis作者答案https://github.com/antirez/redis/issues/2576节点之间通过心跳包通信心跳包中包含该节点持有拿下slots这个是使用位图表示表示1638416k)个slots需要位图大小是2kb。如果给定的slots数更多比如65536需要8kb位图表示8kb对于内存不算什么但是在频繁的网络心跳包中是一个不小的开销。另一方面redis集群不建议超过1000个分片所以16k对于最多1000个分片来说是足够用的同时也会使对应的槽位配置位图体积不至于很大。 3. 搭建redis集群 基于docker搭建一个集群每个节点都是一个容器拓扑结构如下 注意我们一共会创建11个redis节点其中前9个用来演示集群搭建后两个用来演示集群扩容 3.1创建目录和配置 创建redis-cluster目录内部创建两个文件docker-compose.yml和generate.sh 关掉所有启动的redis容器防止后续发生端口冲突 可以通过docker ps -a来查看是否全部关闭 执行shell脚本generate.sh内容如下 :::tips for port in KaTeX parse error: Undefined control sequence: \ at position 12: (seq 1 9); \̲̲br /do \br /…{port}/touch redis p o r t / r e d i s . c o n f b r / c a t E O F r e d i s {port}/redis.confbr /cat EOF redis port/redis.confbr/catEOFredis{port}/redis.confport 6379bind 0.0.0.0protected-mode noappendonly yescluster-enabled yescluster-config-file nodes.confcluster-node-timeout 5000cluster-announce-ip 172.30.0.10${port}cluster-announce-port 6379cluster-announce-bus-port 16379EOFdone# 注意 cluster-announce-ip 的值有变化.for port in KaTeX parse error: Undefined control sequence: \ at position 14: (seq 10 11); \̲̲br /do \br /…{port}/touch redis p o r t / r e d i s . c o n f b r / c a t E O F r e d i s {port}/redis.confbr /cat EOF redis port/redis.confbr/catEOFredis{port}/redis.confport 6379bind 0.0.0.0protected-mode noappendonly yescluster-enabled yescluster-config-file nodes.confcluster-node-timeout 5000cluster-announce-ip 172.30.0.1${port}cluster-announce-port 6379cluster-announce-bus-port 16379EOFdone ::: 执行命令 :::tips bash generate.sh ::: 生成目录如下其中每个redis.conf都不相同以redis1为例 区别在于每个配置中cluster-announce-ip是不同的其他部分都相同因为后续会给每个节点分配不同的ip地址 配置说明 cluster-enabled yes开启集群cluster-config-file nodes.conf集群节点生成的配置cluster-node-timeout 5000节点失联的时间cluster-announce-ip 172.30.0.101节点自身的ipcluster-announce-port 6379节点自身的业务端口cluster-announce-bus-port 16379管理端口用来给一些管理上的任务通信的。例如主节点挂了需要让从节点成为主节点就需要通过刚才管理端口来完成对应的操作 3.2 编写docker-compose.yml version: 3.3 networks:mynet:ipam:config:- subnet: 172.30.0.0/24 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.1113.3 启动容器 启动之前检查redis服务是否全部关闭 启动容器 :::tips docker-compose up -d ::: 验证是否启动 :::tips docker ps -a ::: 3.4 构建集群 此处把前9个主机构成集群3主6从。后两个主机用来演示后续扩容 :::tips 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 2172.30.0.105:6379 ::: 3.5 使用集群 此时使用客服端连上集群中的任何一个节点都相当于连上整个集群。使用命令redis-cli -h 172.30.0.101 -p 6379 -c 客服端后面要加上-c选项因为通过“哈希槽分区算法”计算出对应的哈希槽如果该哈希槽不在该分片而是在其他分片就访问不到。加上-c就会自动把请求重定向到对应的节点 使用cluster nodes可以查看整个集群的情况 如果在从节点进行写操作会重定向到master节点 4. 故障处理 4.1 主节点宕机 在上述的拓扑结构中redis1,redis2,redis3是主节点挑选一个停掉 :::tips docker stop redis1 ::: 重新启动redis1 :::tips docker start redis1 ::: 4.2 故障处理流程 1. 故障判定识别出某个节点是否挂了 节点A给节点B发送ping包B就给A返回pong包包含右集群的配置信息该节点的id该节点从属于哪个分片是主节点还是从节点属于哪个主节点持有那些slots的位图每个节点每秒钟都会随机给一些节点发送ping包而不是全发一遍。这样的设定是为了避免如果节点很多心跳包也会很多例如9个节点如果全发就是9*872组心跳包而且是按照N^2级别增长当节点A给节点B发送ping包B不能如期回应的时候此时A就会尝试重置和B的tcp连接看是否能连接成功如果仍然连接失败A就会把B设为PFALL状态主观下线A判定B为PFALL之后会通过redis内置的Gossip协议和其他节点进行沟通向其他节点确认B的状态每个节点都会维护一个自己的”下线列表“由于视角不同每个节点的下线列表也不一定相同此时A发现很多其他节点也认为B为PFALL,并且数目超过集群个数的一半那么A就会把B标记FALL客观下线并把消息同步给其他节点其他节点收到后也会把B标记为FALL 2. 故障迁移 如果B是从节点那么不需要进行故障迁移如果B是主节点那么就会从B的从节点中挑选一个比如C和D触发故障迁移从节点会判定自己是否具有参选资格如果从节点和主节点已经很久没有通信即很久没有同步过数据主从节点之间差异较大时间超过阈值就失去竞选资格具有资格的节点比如C和D就会先休眠一段时间休眠时间500ms基础时间[0,500ms]随机时间 排名 * 1000ms。offset值越大排名越靠前越小比如C的休眠时间到了C就会给集群中其他节点进行拉票操作但是只有主节点才有投票资格主节点就会把自己的票投给C每个主节点只有一票当C收到的票数超过主节点数目的一半C就会晋升为主节点。C自己负责执行slaveof no one,并且让D执行slaveof C)同时C还会将自己成为主节点的信息同步给集群的其他节点大家也会更新自己保存的集群结构信息。 哨兵模式是先投票竞选出一个leader让leader负责找一个从节点升级为主节点。而集群模式里直接投票选出新的主节点 4.3 出现集群宕机 某个分片所有的主节点和从节点都挂了某个分片主节点挂了但是没有从节点超过半数的master节点都挂了 5. 集群扩容 现在搭建的集群的主机号101-1099个主机构成了3主6从结构的集群。现在将主机号为110和111也加入集群中以110为master111为slave数据分片从3-4。 5.1 添加主节点 将新的主节点110加入到集群中 :::tips redis-cli --cluster add-node 172.30.0.110:6379 172.30.0.101:6379 ::: 172.30.0.110:6379新增节点的地址172.30.0.101:6379集群上任意一个节点的地址都可以表示要把这个新节点添加到这个集群上 重新分配slots :::tips redis-cli --cluster reshard 172.30.0.101:6379 ::: 172.30.0.101:6379集群中任意节点的地址都可以表示这个集群 此处是询问用户要移动多少的slots给新增的主节点我们这里分成4片即4096 这是问你要把这些哈希槽分配给谁,输入他的id 有两种分配方式让你选择 all,表示从其他每个持有slots的master节点都拿一些过来手动指定,从某一个/几个节点来移动slots,输入完他们的id,以done结尾 当输入yes才是真正开始搬运 问题:在搬运slots/key的过程中,此时客服端能否访问到redis集群 搬运key,大部分key是不用搬运的,针对这些未搬运的key,是可以正常访问的.针对这些正在搬运的key,是有可能出现访问出错的情况. 例如客服端访问key1,集群通过分片算法,得到key1是第一个分片的数据,就会重定向到第一个分片的节点,就可能在重定向过去之后,正好key1被搬走,自然就无法访问. 5.2 从节点添加到集群中 将主机号111添加到集群中,作为主机号110的从节点 :::tips redis-cli --cluster add-node 172.30.0.111:6379 172.30.0.101:6379 --cluster-slave --cluster-master-id [172.30.1.110节点的nodeid] :::
http://www.yayakq.cn/news/3630/

相关文章:

  • 软件开发网站四川省建设部网站
  • 南宁工程建设网站有哪些html做网站例子
  • 好看的单页南山网站seo
  • 企业如何做好网站运营成都高新区国土规划建设局网站
  • 建设网站需要哪些流程图网站桥页怎么找
  • 生活常识网站源码网站在百度上搜索不到
  • c 网站开发工程师招聘网站建设有前景吗
  • 如何设计营销 网站建设wordpress漂流瓶插件
  • 上海专业做网站建设方法wordpress 免费自媒体
  • 只选设计师的网站重庆可做网站 APP
  • 网站头部 标签wordpress 没有外观
  • 无锡网站建设书生商友怎么创建网站卖东西
  • 长沙房地产市场情况分析图片网站优化
  • 12306 网站开发网站seo优化主要有哪些手段
  • 网站全站模板中国人在俄罗斯做网站需要多少卢布
  • 一学一做专题网站建设网站总结
  • 服装网站建设风格罗湖田贝社区网站建设
  • 百度四川建设厅网站dw网站大学生代做
  • 张家港外贸型网站制作学网站开发月薪多少钱
  • 南阳网站推广公司广东网站建设模版
  • 高端网站策划公司网站空间不续费
  • 全国设计网站建设大连博硕网站建设
  • 网站开发,自定义首页显示html静态网站模板简单单页
  • 自己做黑彩网站网站版建设
  • 网页设计的网网页设计的网站建设什么企业需要网站建设
  • 西安网站制作资源公司网站建设设计方案
  • 网站提交做外链有什么作用阿里云网络服务器
  • 去除网址中 wordpress想建网站做优化
  • 自己动手建设公司门户网站电脑淘宝网页版
  • 公司网站的建设怎么做网络营销方案内容