网站建设同行抄袭大数据查询平台

张小明 2025/12/30 22:56:40
网站建设同行抄袭,大数据查询平台,英语培训网站源码,wordpress主题YEZITING一、Redis常用的三种集群模式主从#xff08;单体架构项目#xff09;通过持久化功能#xff0c;Redis保证了即使在服务器重启的情况下也不会丢失#xff08;或少量丢失#xff09;数据#xff0c;因为持久化会把内存中数据保存到硬盘上#xff0c;重启会从硬盘上加载数…一、Redis常用的三种集群模式主从单体架构项目通过持久化功能Redis保证了即使在服务器重启的情况下也不会丢失或少量丢失数据因为持久化会把内存中数据保存到硬盘上重启会从硬盘上加载数据。 但是由于数据是存储在一台服务器上的如果这台服务器出现硬盘故障等问题也会导致数据丢失。为了避免单点故障通常的做法是将数据库复制多个副本以部署在不同的服务器上这样即使有一台服务器出现故障其他服务器依然可以继续提供服务。为此Redis 提供了复制replication功能可以实现当一台数据库中的数据更新后自动将更新的数据同步到其他数据库上。在复制的概念中数据库分为两类一类是主数据库master另一类是从数据库(slave。主数据库可以进行读写操作当写操作导致数据变化时会自动将数据同步给从数据库。而从数据库一般是只读的并接受主数据库同步过来的数据。一个主数据库可以拥有多个从数据库而一个从数据库只能拥有一个主数据库。哨兵单体架构项目第一种主从同步/复制的模式当主服务器宕机后需要手动把一台从服务器切换为主服务器这就需要人工干预费事费力还会造成一段时间内服务不可用。这不是一种推荐的方式更多时候我们优先考虑哨兵模式。哨兵模式是一种特殊的模式首先Redis提供了哨兵的命令哨兵是一个独立的进程作为进程它会独立运行。其原理是哨兵通过发送命令等待Redis服务器响应从而监控运行的多个Redis实例。clusterRedis 的哨兵模式基本已经可以实现高可用读写分离 但是在这种模式下每台 Redis 服务器都存储相同的数据很浪费内存所以在redis3.0上加入了 Cluster 集群模式实现了 Redis 的分布式存储也就是说每台 Redis 节点上存储不同的内容。官方推荐的集群模式水平扩容更方便二、Redis ClusterRedis集群简介redis3.0版本之前只支持单例模式在3.0版本及以后才支持集群redis集群采用P2P模式是完全去中心化的不存在中心节点或者代理节点redis集群是没有统一的入口的客户端client连接集群的时候连接集群中的任意节点node即可集群内部的节点是相互通信的PING-PONG机制每个节点都是一个redis实例为了实现集群的高可用即判断节点是否健康能否正常使用redis-cluster有这么一个投票容错机制如果集群中超过半数的节点投票认为某个节点挂了那么这个节点就挂了fail。这是判断节点是否挂了的方法那么如何判断集群是否挂了呢? - 如果集群中任意一个节点挂了而且该节点没有从节点备份节点那么这个集群就挂了。这是判断集群是否挂了的方法那么为什么任意一个节点挂了没有从节点这个集群就挂了呢 - 因为集群内置了16384个slot哈希槽并且把所有的物理节点映射到了这16384[0-16383]个slot上或者说把这些slot均等的分配给了各个节点。1、当需要在Redis集群存放一个数据key-value时redis会先对这个key进行crc16算法然后得到一个结果。2、再把这个结果对16384进行求余这个余数会对应[0-16383]其中一个槽进而决定key-value存储到哪个节点中。3、所以一旦某个节点挂了该节点对应的slot就无法使用那么就会导致集群无法正常工作。1、集群搭建需要的环境1.1 Redis集群至少需要3个节点因为投票容错机制要求超过半数节点认为某个节点挂了该节点才是挂了所以2个节点无法构成集群。奇数个节点1.2 Redis集群至少需要6台服务器因为要保证集群的高可用需要每个节点都有从节点备份节点我没有那么多服务器而且启动那么多虚拟机会很卡所在这里搭建的是伪分布式集群一台服务器虚拟运行6个redis实例修改端口号为7001-7006当然实际生产环境的Redis集群搭建是一样的1.3 卸载之前redis改的东西太多在搭建集群之前最好还原redis最纯净的环境1、停止redis服务器#等同于 ps -ef | grep redis [rootD bin]# ps aux|grep redis ​ # 用于通过命令行连接 Redis 服务器并执行操作 [rootD bin]# redis-cli -p 6379 shutdown2、删除make的时候生成的redis相关文件[rootD local]# cd /usr/local/bin/ [rootD local]# rm -f /usr/local/bin/redis*3、删除掉解压后的文件目录及所有文件[rootD local]# cd /opt [rootD opt]# rm -rf redis-5.0.42、集群搭建具体步骤如下注意要关闭防火墙重新安装一遍reids#tar.gz先打包再压缩适用于linux平台 [rootD opt]# wget http://download.redis.io/releases/redis-5.0.4.tar.gz ​ # 解压到 /opt 目录下需确保目录存在 tar -zxvf filename.tar.gz -C /opt ​ # 解压名为 filename.tar.gz 的压缩包到当前目录有v会显示过程 [rootD opt]# tar -zxvf redis-5.0.4.tar.gz [rootD opt]# cd redis-5.0.4 ​ # 安装编译依赖 [rootD opt]# apt install -y build-essential gcc g libc6-dev tcl ​ # 修改sds.h文件作用域为外部声明,37行左右关键字改为:extern const char *SDS_NOINIT; [rootD redis-5.0.4]# nano /opt/redis-5.0.4/src/sds.h ​ # 根据 Makefile 中的规则将源码编译成可执行文件二进制程序。 [rootD redis-5.0.4]# make ​ #将编译好的二进制文件、配置文件、手册等复制到系统默认或自定义的安装目录完成软件的 “安装”。 [rootD redis-5.0.4]# make install2.1 在redis的安装目录下将redis.conf复制6份redis7001.confredis7002.confredis7003.conf...[rootD local]# cd /opt/redis-5.0.4 [rootD redis-5.0.4]# cp redis.conf redis7001.conf [rootD redis-5.0.4]# vim redis7001.conf2.2 修改配置文件port 7001 //端口7001,7002,7003 bind 0.0.0.0 //默认ip为127.0.0.1 需要改为其他节点机器可访问的ip 否则创建集群时无法访问对应的端口无法创建集群 daemonize yes //redis后台运行 pidfile /var/run/redis_7001.pid //pidfile文件对应7001,7002,7003 logfile redis7001.log dbfilename dump7001.rdb appendonly yes //aof日志开启 有需要就开启它会每次写操作都记录一条日志 appendfilename appendonly7001.aof cluster-enabled yes //开启集群 把注释#去掉 cluster-config-file nodes_7001.conf //集群的配置 配置文件首次启动自动生成 7001,7002,7003 把注释#去掉 cluster-node-timeout 15000 //请求超时 默认15秒可自行设置 把注释#去掉在/opt/redis-5.0.4/目录下创建脚本将redis7001.conf中所有7001替换成7002之后并生成新文件redis7002.conf~redis7006.conf[rootD redis-5.0.4]# nano run.shrun.sh内容如下#!/bin/bash # 批量生成Redis集群节点配置文件7002-7006基于redis7001.conf模板 ​ # 检查模板文件是否存在 if [ ! -f redis7001.conf ]; then echo 错误模板文件 redis7001.conf 不存在请确保在 /opt/redis-5.0.4/ 目录执行 exit 1 fi ​ # 循环生成7002-7006的配置文件 for port in {7002..7006} do # 替换端口和对应的集群配置文件nodes-端口.conf sed s/7001/$port/g redis7001.conf redis$port.conf # 验证文件是否生成成功 if [ -f redis$port.conf ]; then echo 成功生成redis$port.conf else echo 失败未生成 redis$port.conf fi done ​ echo 所有配置文件生成完成 给run.sh赋执行权限[rootD redis-5.0.4]# chmod x generate_redis_configs.sh执行脚本已经执行过下一次就不必执行./run.sh2.3 创建启动监本一个一个启动太麻烦写一个sh脚本启动[rootD local]# cd /usr/local/bin/ [rootD bin]# vim start-all-redis.sh脚本内容如下#! /bin/bash #启动 Redis 服务器并指定使用 /opt/redis-5.0.4/redis7001.conf 作为配置文件 redis-server /opt/redis-5.0.4/redis7001.conf redis-server /opt/redis-5.0.4/redis7002.conf redis-server /opt/redis-5.0.4/redis7003.conf redis-server /opt/redis-5.0.4/redis7004.conf redis-server /opt/redis-5.0.4/redis7005.conf redis-server /opt/redis-5.0.4/redis7006.conf [rootD bin]# chmod x start-all-redis.sh [rootD bin]# ./start-all-redis.sh [rootD bin]# ps aux|grep redis创建停止脚本nano stop.sh内容#!/bin/bash # 定义Redis集群节点端口范围根据实际集群修改 START_PORT7001 END_PORT7006 # 关闭指定端口的Redis节点 shutdown_node() { local port$1 echo 正在关闭节点 $port ... # 执行关闭命令若有密码添加 -a 密码参数如redis-cli -p $port -a your_password shutdown redis-cli -p $port shutdown # 检查是否关闭成功 if [ $? -eq 0 ]; then echo 节点 $port 关闭成功 else echo 警告节点 $port 关闭失败可能已关闭或连接异常 fi } # 遍历端口逐个关闭节点 for (( portSTART_PORT; portEND_PORT; port )); do shutdown_node $port done # 最终检查进程是否残留 echo -e \n检查是否有残留Redis进程... remaining$(ps -ef | grep redis-server | grep -v grep | wc -l) if [ $remaining -eq 0 ]; then echo 所有Redis集群节点已成功关闭 else echo 警告仍有 $remaining 个Redis进程残留需手动检查 ps -ef | grep redis-server | grep -v grep fi赋执行权限chmod x stop.sh运行脚本./stop.sh2.4 创建集群原生的集群步骤1、配置并开启集群的节点cluster-enabled yescluster-config-file nodes_7001.conf2、meetcluster meet ip port3、指派槽位通过命令计算key的槽位cluster keyslot key3主16384/3每个主机分配的槽位范围 0-5461 、 5462-10923 、 10923-163834主16384/4每个主机分配的槽位4096cluster addslots slot槽位下标4、分配主从cluster replicate node-id以上步骤全部继承到命令 redis-trib.rb 这个工具中但是目前已经废弃而5.0以后直接使用redis-cli先查看下集群命令的帮助参数--cluster-replicas 1数字是分配主从节点数量的比例11主1从21主2从#redis-cli 是 Redis 自带的命令行客户端工具用于与 Redis 服务器交互发送命令、管理数据、操作服务等是使用 Redis 最基础也最常用的工具。 [rootD bin]# redis-cli --cluster help # 使用 redis-cli 的集群模式创建一个 Redis 集群 # --cluster createredis-cli 的集群管理命令用于初始化新集群 # --cluster-replicas 1指定每个主节点master配备 1 个从节点slave改变数字1就会改变主节点的从节点数量。 # 后面的 IP:端口 是参与集群的 6 个 Redis 实例需提前启动并开启集群模式 #第一次时初始化集群使用创建一个 Redis 集群Redis Cluster通过 redis-cli 的集群管理功能将多个 Redis 实例组成一个分布式集群。这里换成自己的IP [rootD bin]# redis-cli --cluster create --cluster-replicas 1 192.168.145.128:7001 192.168.145.128:7002 192.168.145.128:7003 192.168.145.128:7004 192.168.145.128:7005 192.168.145.128:7006数据库中可能有数据所以无法集群#redis-cliRedis 命令行客户端工具。 #-p 7001指定连接的 Redis 节点端口为 7001需确保该端口是集群中的一个节点。 #-c开启 集群模式cluster mode [rootD bin]# redis-cli -p 7001 -c 127.0.0.1:7001 keys * 1) allStudent 127.0.0.1:7001 flushall OK 127.0.0.1:7001 exit集群成功如果出错一定要查看/usr/local/bin下的log日志3、测试集群测试存取值客户端连接集群redis-cli需要带上 -c以集群的身份登录 redis-cli -c -p 端口号如下[rootD bin]# redis-cli -c -p 7001 127.0.0.1:7001 set name laosun - Redirected to slot [5798] located at 192.168.204.144:7002 OK 192.168.204.144:7002 get name laosun 192.168.204.144:7002根据redis-cluster的key值分配name应该分配到节点7002[5461-10922]上上面显示redis cluster自动从7001跳转到了7002节点。对name进行CRC16算法求哈希值123%163845798这个值分配到具体的槽位上槽位的范围就是具体的7002服务器我们可以测试一下7006从节点获取name值192.168.204.144:7002 exit [rootD bin]# ./redis-cli -c -p 7006 127.0.0.1:7006 get name - Redirected to slot [5798] located at 192.168.204.144:7002 laosun 192.168.204.144:7002自动跳转至7002获取值这也是redis cluster的特点它是去中心化每个节点都是对等的连接哪个节点都可以获取和设置数据4、集群的选举集群节点信息[rootD bin]# redis-cli -p 7001 127.0.0.1:7001 cluster nodes从上面集群的情况可以看出4跟36跟25跟1如果将7003主节点挂掉按照redis-cluster原理会选举会将 7003的从节点7004选举为主节点[rootD bin]# redis-cli -p 7003 shutdown给redis一点开会选举的时间如果7003再次回归[rootD bin]# redis-server /opt/redis-5.0.4/redis7003.conf4已经成为老大3只好从小弟重新干起三、扩容sedLinux 下的流编辑器用于对文本进行批量替换、删除等操作。s/7001/7007/g:send的替换指令含义是s表示 “替换” 操作substitute。7001被替换的原始字符串这里是原配置文件中的端口号。7007替换后的新字符串新配置文件要使用的端口号。g全局替换global即替换文件中所有出现7001的地方而非仅第一个。/opt/redis-5.0.4/redis7001.conf源配置文件路径以 7001 端口的配置为模板。 /opt/redis-5.0.4/redis7007.conf输出重定向将替换后的内容写入新文件redis7007.conf若文件不存在则创建存在则覆盖。加入7007和7008两台机器[rootD bin]# sed s/7001/7007/g /opt/redis-5.0.4/redis7001.conf /opt/redis-5.0.4/redis7007.conf [rootD bin]# sed s/7001/7008/g /opt/redis-5.0.4/redis7001.conf /opt/redis-5.0.4/redis7008.conf [rootD bin]# redis-server /opt/redis-5.0.4/redis7007.conf [rootD bin]# redis-server /opt/redis-5.0.4/redis7008.conf [rootD bin]# ps aux|grep redis集群加入节点默认为主节点#redis-cli --cluster add-nodeRedis 集群管理的添加节点命令用于将新节点加入集群。 #192.168.145.128:7007新节点的地址IP: 端口需提前启动且配置文件中开启集群模式cluster-enabled yes。 #192.168.145.128:7001集群中已存在的任意节点地址用于让新节点通过它获取整个集群的信息如其他节点地址、槽位分配等。 [rootD bin]# redis-cli --cluster add-node 192.168.145.128:7007 192.168.145.128:7001 #连接任意节点如 7001查看 7007 是否已加入集群 redis-cli -p 7001 -c cluster nodes | grep 7007集群加入节点以从节点身份加入唯一标识码6ba9是7007的[rootD bin]# redis-cli --cluster add-node 192.168.145.128:7008 192.168.145.128:7001 --cluster-slave --cluster-master-id 6ba982a4367d7e4ab1d888502270e586b15c76167008跟随7007但此时这个集群虽然成立了但是并没有分配槽位所以无法保存数据必须要分配槽位从集群中分片出多少个槽位[rootD bin]# redis-cli --cluster reshard 192.168.145.128:7001参数输入需要分配的槽数量例如从现有主节点各迁移部分如 1000 个槽。输入接收槽位的主节点 ID7007 的节点 ID从cluster nodes中获取。输入源节点 ID指定从哪些主节点迁移或输入all从所有主节点分配。输入yes确认执行。1000个槽位是7001和7002共同 提供的如果有问题# 完整命令格式redis-cli --cluster reshard 主节点IP:端口 --cluster-to 接收节点ID --cluster-slots 迁移槽数 --cluster-from 源节点ID --cluster-yes redis-cli --cluster reshard 192.168.145.128:7001 --cluster-to 47b6738f3bd538c44c4043307280a2ca1804e02c --cluster-slots 1000 --cluster-from all --cluster-yes槽位就分配过来了注意槽位分配过来槽位上的数据也跟随过来了四、缩容redis-cli --cluster reshard 192.168.145.128:7001redis-cli --cluster reshard 192.168.145.128:7001 \ # 1. 集群入口节点任意存活节点的IP:端口用于连接集群 --cluster-from 47b6738f3bd538c44c4043307280a2ca1804e02c \ # 2. 源节点的nodeid要迁出槽位的节点ID这里是7007的ID --cluster-to e9e238e8e3a88c8408894ca70dc92c2aa016cca4 \ # 3. 目标节点的nodeid要接收槽位的节点ID --cluster-slots 336 \ # 4. 要迁移的槽位数量本次迁移336个槽位 --cluster-yes # 5. 自动确认迁移无需交互式输入yes直接执行 # redis-cli --cluster reshard 集群任意节点 --cluster-from 7007的nodeid --cluster-to 7001的nodeid --cluster-slots 槽位数 [rootD bin]# redis-cli --cluster reshard 192.168.145.128:7001 --cluster-from 47b6738f3bd538c44c4043307280a2ca1804e02c --cluster-to e9e238e8e3a88c8408894ca70dc92c2aa016cca4 --cluster-slots 336 --cluster-yes从集群中移除7007和7008# 先停止 [rootD bin]# redis-cli -p 7007 shutdown [rootD bin]# redis-cli -p 7008 shutdown #移除redis-cli --cluster del-node host:port node_id连接其他在运行的节点比如7001进行删除 [rootD bin]# redis-cli --cluster del-node 192.168.145.128:7001 ae13225645268253446511d53526882fbb19e41d [rootD bin]# redis-cli --cluster del-node 192.168.145.128:7001 47b6738f3bd538c44c4043307280a2ca1804e02c #如果停止节点后不能移除随便进入一个在线的节点进入交互模式forget手动移除CLUSTER FORGET 节点ID [rootD bin]# redis-cli -p 7001 -c # 查看集群所有节点信息 127.0.0.1:7001 cluster nodes # 查看槽位分配情况 127.0.0.1:7001 cluster slots移除成功五、FAQ1、如果一组主从宕机集群是否可用 之前说一个节点挂掉没有从节点那么集群不可用默认为yes如果修改下面的配置属性则宕机的1组不可用而其他组的机器可用往1组保存数据失败导致数据丢失往2组或3组保存数据正产运行## 表示当负责一个槽位的主机下线且没有相应的从机进行故障修复是否整个集群不可用 ### yes整个集群不可用 ### no别的主机可以正常使用。 # cluster-require-full-coverage yes主机和从机一定部署在不同的机器上所以同时挂掉的几率很小万分之一的几率如果同时挂掉高可用则被打破所以不存在100%的高可用只存在99%2、搭建集群时候--cluster-replicas 1 的意思是什么主从比例为1即1台主1台从所以集群的主机数量最好是3以上的奇数而集群全部的机器最好是主机数量的倍数2倍3倍都可以如果想让1号机带3台从机让2号机带2台从机该如何编写命令一键构建集群的自动化命令无法达到要求而且就算是形成集群后也可以通过原生的命令随意更改。如果有上述要求可以使用原生的命令进行集群的搭建。虽然麻烦但非常灵活随意搭配3、主机挂掉从机会自动升为主机是哨兵吗 redis-cluster集群从机升主机确实具备哨兵的功能但不是哨兵因为并没有依赖哨兵的节点。而是本身的晋级不是哨兵让其晋级全自动晋级机制4、jedis提供的CRC16算法在 Redis 集群中CRC16是哈希算法用于计算键对应的槽位槽位 CRC16(key) % 16384先对key得到hash值然后再和16384取余得到存储槽位先对键key计算 CRC16 哈希值得到一个 16 位整数范围 0~65535 再将这个哈希值与 16384 取余数%最终得到 0~16383 之间的一个整数即该键对应的槽位slot。作用将键映射到 0~16383 中的某个槽位而槽位绑定到具体主节点实现数据分片存储。特殊键中{}内的字符串会被单独计算如a{user}b仅用user计算确保关联键同槽。验证用cluster keyslot key可直接查看键对应的槽位。dependency groupIdredis.clients/groupId artifactIdjedis/artifactId version3.1.0/version /dependency System.out.println( JedisClusterCRC16.getCRC16(hello) );
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

给网站做伪静态网络营销的特点包括什么

Venera漫画阅读器:跨平台阅读终极解决方案 【免费下载链接】venera A comic app 项目地址: https://gitcode.com/gh_mirrors/ve/venera 你是否厌倦了在不同设备间切换阅读漫画时的种种不便?手机上的阅读进度无法同步到电脑,平板上的收…

张小明 2025/12/30 22:56:07 网站建设

微信服务号绑定网站什么是网站主机

YOLO目标检测服务上线!支持按Token计费调用 在智能制造车间的传送带上,一个微小的划痕正随着产品快速移动——如果靠人工质检,这样的缺陷很可能被忽略;而若部署传统视觉系统,高昂的成本和复杂的维护又让中小企业望而却…

张小明 2025/12/30 22:55:33 网站建设

鹤壁网站seo优化最好的免费的黄页网站

第一章:Open-AutoGLM如何重塑未来Web生态?Open-AutoGLM 作为新一代开源自动语言生成模型,正在以前所未有的方式推动Web内容生态的智能化演进。其核心优势在于深度集成语义理解与动态生成能力,使开发者能够构建自适应、高交互性的W…

张小明 2025/12/30 22:54:57 网站建设

南充网站建设网站网站延迟加载

华为鸿蒙系统pc版 12月11日,对于商用办公产业而言,或许是一个值得被反复提及的日子。在这一天召开的鸿蒙办公产业峰会上,我们见证鸿蒙终于完成了从消费领域到商用领域“跨越山海”的关键一步,华为开启鸿蒙电脑企业版Beta、新一代鸿…

张小明 2025/12/30 22:54:23 网站建设

高端大气的医院网站石家庄做网站设计

PaddlePaddle镜像能否用于宠物品种识别?社交App功能扩展 在今天的社交App中,用户早已不满足于简单的“点赞”和“评论”。他们希望看到更智能、更懂自己的交互体验——比如上传一张宠物照片,App就能自动识别出这是英短还是布偶猫,…

张小明 2025/12/30 22:53:14 网站建设

12345东莞网站文化传播公司网站建设需求

今年DeepSeek的爆火,如同给生成式AI与大模型技术赛道添了一把猛火,让整个领域呈现出爆发式增长态势。在这股浪潮下,算法工程师岗位重新回到大众视野中心,成为炙手可热的“香饽饽”。从薪资水平来看,算法工程师岗位薪资…

张小明 2025/12/30 22:52:40 网站建设