当前位置: 首页 > 后端技术 > PHP

Redis集群的三种搭建方法

时间:2023-03-29 23:32:12 PHP

1.单节点实例单节点实例比较简单,平时做个测试,如果需要用到缓存写个小程序,起个Redis还是很容易的,作为key/value数据库也能胜任2.主从模式(master/slaver)redis主从模式配置主从模式:redis的主从模式,采用异步复制,从节点异步复制数据从master节点获取,并且master节点提供readWrite服务,slave节点只提供read服务(这是默认配置,可以通过修改配置文件slave-read-only来控制)。一个主节点可以有多个从节点。配置slave节点只需要在redis.conf文件中指定slaveofmaster-ipmaster-port即可。从节点启动主从复制有3种方式:配置文件在从服务器的配置文件中加入:slaveof启动命令redis-server启动命令并加入:slaveof客户端命令Redis服务器启动后,直接通过客户端执行命令:slaveof,则Redis实例成为从节点。以上三种方法是等价的。下面以客户端命令方式为例,看看slaveof执行后Redis主从节点的变化。本例:一个主节点有两个从节点配置:1、cd/usr/local/redis/redis-4.0.2切换到当前redis安装路径2、mkdirconfig新建文件夹存放redis配置文件3、在config下新建三个配置文件,如下:cdconfigvimaster-6739.confbind0.0.0.0port6379logfile"6379.log"dbfilename"dump-6379.rdb"daemonizeyesrdbcompressionyesvislave-6380.confbind0.0.0.0端口6380logfile“6380.log”dbfilename“dump-6380.rdb”daemonizeyesrdbcompressionyesslaveof192.168.81.1356379vislave-6381.confbind0.0.0.0port6381logfile“6381.log”dbfilename“dump-6381.rdb”daemonizeyesrdb1.slaveof8192yesslave81.1356379master-6739.conf,主节点配置文件,slave-6380.conf,slave-6381.conf是从节点配置文件,从节点配置文件中使用:slaveof指定主节点4,启动三个reids服务[root@localhostredis-4.0.2]#./src/redis-serverconfig/master-6379.conf[root@localhostredis-4.0.2]#./src/redis-serverconfig/slave-6380.conf[root@localhostredis-4.0.2]#./src/redis-serverconfig/slave-6381.conf查看redis服务,测试主从模式:a、先分别连接三个redis服务,获取key为name的value,通过-p指定连接该端口的redis服务[root@localhostredis-4.0.2]#./src/redis-cli-p6379127.0.0.1:6379>获取名称(nil)[root@localhostredis-4.0.2]#./src/redis-cli-p6380127.0.0.1:6380>getname(nil)[root@localhostredis-4.0.2]#./src/redis-cli-p6381127.0.0.1:6381>getname(nil)#获取的值全为空b,给masternodesetAkey[root@localhostredis-4.0.2]#./src/redis-cli-p6379127.0.0.1:6379>setnamecmyOK127.0.0.1:6379>getname"cmy"c,从机node直接读取key是name[root@localhostredis-4.0.2]的值#./src/redis-cli-p6380127.0.0.1:6380>getname"cmy"[root@localhostredis-4.0.2]#./src/redis-cli-p6381127.0.0.1:6381>getname"cmy"d,从节点只提供读服务,不能进行写操作127.0.0.1:6381>setage23(error)READONLY你不能写一个只读的奴隶。注意,在使用主从模式时,需要注意matser节点的持久化操作。如果matser节点没有使用持久化就宕机,自动重启服务,从服务器就会丢失数据首先禁止matser服务持久化127.0.0.1:6379>CONFIGSETsave""OKsetavalueonmasternode127.0.0.1:6379>setage23OK从节点可以获取age的值127.0.0.1:6380>getage"23"关闭主节点服务127.0.0.1:6379>shutdownnotconnected>从节点此时仍然可以获取age的值127.0.0.1:6380>getage"23"重启master服务,并且此时无法获取age的值[root@localhostredis-4.0.2]#./src/redis-serverconfig/master-6379.conf[root@localhostredis-4.0.2]#./src/redis-cli-p6379127.0.0.1:6379>getage(nil)此时slave节点获取的age值为空,数据丢失[root@localhostredis-4.0.2]#./src/redis-cli-p6380127.0.0.1:6380>getage(nil)数据丢失原因:master服务挂掉重启服务后,slave节点会和master节点进行一次完整的重新同步操作,所以因为主节点不是持久的,从节点上的数据也会丢失。因此,在配置Redis的主从模式时,需要开启主服务器的持久化功能。至此,redis的主从模式已经完成。说说我认为主从模式的必要性:主从模式的一个作用就是备份数据,这样当一个节点损坏(指不可恢复的硬件损坏)时,数据会因为以下原因丢失有备份方便恢复。另一个功能是负载平衡。所有客户端访问一个节点,肯定会影响Redis的效率。有了master-slave,可以通过查询slave节点来完成查询操作。master-slave模式的必要理解(结论已经验证,可以自己验证):一个Master可以有多个Slave。默认配置下,主节点可以读写,从节点只能进行读写操作,禁止。修改配置让从节点支持写操作是没有意义的。第一个原因是写入的数据不会同步到其他节点。第二个原因是当主节点修改同一条数据时,从节点的数据会被覆盖。从节点挂掉为了不影响其他从节点的读取和主节点的读写,重启后会从主节点同步数据。主节点挂掉后,不会影响从节点的读取。Redis将不再提供写服务。启动后Redis会重新对外提供写服务。主节点挂掉后,从节点不会重新选举主节点。用密码说明情况。当master节点设置密码时:client需要密码才能访问master,启动slave。需要密码,client在配置Slave中配置即可访问,不需要密码。主从节点的缺点。master-slave模式的缺点其实从上面的描述就可以得出:master节点挂掉后,redis无法对外提供写服务,因为剩下的slave无法成为master。很大,尤其是生产环境,服务一刻也不能停,所以一般的生产环境不会只有主从模式。所以有了下面的哨兵模式。3、哨兵模式Redis的哨兵模式,用现在流行的话来说,可以说是一个“哨兵机器人”。对“哨兵机器人”进行相应配置后,这个“机器人”可以7*24小时工作,自动帮你做监控、告警、故障自动处理等事情。Redis-sentinel简介Redis-sentinel是Redis的作者antirez,因为Redis集群被各大公司使用,每个公司都需要写自己的集群管理工具,所以antirez花了几周的时间写了Redis-sentinel。Redis的Sentinel系统用于管理多个Redis服务器(实例),Redis的Sentinel为Redis提供高可用。使用哨兵模式创建一个Redis部署,可以在无人干预的情况下处理各种故障。系统执行以下三个任务:监控(Monitoring):Sentinel会不断检查你的主服务器和从服务器是否允许正常工作。通知:当被监控的Redis服务器出现问题时,Sentinel可以通过API向管理员或其他应用发送通知。自动故障转移(Automaticfailover):(1)当一个主服务器出现故障无法正常工作时,Sentinel会启动一个自动故障转移操作,将故障主服务器的其中一台从服务器升级为新的主服务器,并让故障主服务器的其他从服务器被更改为复制新的主服务器;(2)当客户端尝试连接失败的主服务器时,集群也会将新主服务器的地址返回给客户端。是的,集群可以使用新的主服务器而不是发生故障的一台服务器。Sentinel的分布式特性RedisSentinel是一个分布式系统,可以在一个架构中运行多个Sentinel进程(进程),这些进程使用八卦协议(gossipprotocols)接收主服务器是否离线的信息,并使用投票协议(agreementprotocols))来决定是否执行自动故障转移以及选举哪个从服务器作为新的主服务器。单个sentinel进程监控redis集群是不可靠的。当sentinel进程宕机(sentinel本身也存在单点问题,single-point-of-failure),整个集群系统将无法正常运行。所以需要对sentinel进行集群,这样有几个好处:如果有一些sentinel进程挂了,redis集群的主备切换仍然可以进行;如果只有一个sentinel进程,如果进程运行不正常或者网络阻塞,则无法实现redis集群的主备切换(单点问题);如果有多个哨兵,redis客户端可以随意连接任意一个哨兵,获取redis集群的信息。一个健壮的部署至少需要三个哨兵实例。三个Sentinel实例应放置在客户已独立确定故障的计算机或虚拟机上。示例包括不同可用性区域中的不同物理机或虚拟机。【本解说是建立在机器上的,多层次是一个道理。最近项目需求背景,接触到Redis的搭建,简单记录一下搭建过程中遇到的坑的整体配置192.168.1.100:6379->master192.168.1.101:6379->slave192。168.1.102:6379->slave192.168.1.100:26379->sentinel192.168.1.101:26379->sentinel192.168.1.102:26379->sentinel构建步骤1.安装redis#Unziptar-xvf/usr/local/redis-3.2.11.tar.gzmkdir-p/usr/local/redis/bincp/usr/local/redis/src/{redis-benchmark,redis-check-aof,redis-check-rdb,redis-cli,redis-sentinel,redis-server,redis-trib.rb}/usr/local/redis/binmkdir-p/u01/redis/{6379/{log,data,pid,conf},26379/{log,data,pid,conf}#添加环境变量echo"exportPATH=/usr/local/redis/bin:$PATH">>/etc/profilesource/etc/profile2.redis-6379configureredis节点配置基本如下,其中以下配置分别cp到三台虚拟机/u01/redis/6379/conf/redis_6379.confbind0.0.0.0protected-modenodaemonizeyespidfile"/u01/redis/6379/pid/redis_6379.pid"port6379tcp-backlog511timeout0tcp-keepalive0loglevelnoticelogfile"/u01/redis/6379/log/redis_6379.log"databases16停写s-on-bgsave-erroryesrdbcompressionyesrdbchecksumyesdbfilename"dump.rdb"dir"/u01/redis/6379/data"slave-serve-stale-datayesslave-read-onlyyesrepl-diskless-syncnorepl-diskless-sync-delay5repl-disable-tcp-nodelaynoslave-priority100min-slaves-to-write1min-slaves-max-lag10appendonlynoappendfilename"appendonly.aof"appendfsynceverysecno-appendfsync-on-rewritenoauto-aof-rewrite-percentage100auto-aof-重写最小大小64mbaof-load-truncatedyeslua-time-limit5000slowlog-log-slower-than10000slowlog-max-len128latency-monitor-threshold0notify-keyspace-events""hash-max-ziplist-entries512hash-max-ziplist-value64list-max-ziplist-entries512启动服务#在三台虚拟机上执行redis-server/u01/redis/6379/conf/redis_6379.conf建立主从关系#at192.168.1.101redis-cli-p6379SLAVEOF192.168.1.1006379#at192.168.1.102redis-cli-p6379SLAVEOF192.168.1.1006379ViewReplication192.168.1.101:6379>inforeplication#Replicationrole_ods_minslavesconnected:2goves:2slave0:ip=192.168.1.102,port=6379,state=online,offset=9577826,lag=1slave1:ip=192.168.1.103,port=6379,state=online,offset=9577965,lag=0master_repl_offset:9577965repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:8529390repl_backlog_histlen:1048576192.168.1.102:6379>inforeplication#Replicationrole:slavemaster_host:192.168.1.101master_port:6379master_link_status:upmaster_last_io_seconds_ago:0master_sync_in_progress:0slave_repl_offset:9600220slave_priority:100slave_read_only:1connected_slaves:0min_slaves_good_slaves:0master_repl_offset:0repl_backlog_active:0repl_backlog_size:1048576repl_backlog_first_byte_offset:0repl_backlog_histlen:0192.168.1.103:6379>信息复制#Replicationrole:slavemaster_host:192.168.1.101master_port:6379master_link_status:upmaster_last_io_seconds_ago:0master_sync_in_progress:0slave_repl_offset:9612675slave_priority:100slave_read_maste_slaves:0connectr_repl_offset:0repl_backlog_active:0repl_backlog_size:1048576repl_backlog_first_byte_offset:0repl_backlog_histlen:03.sentinel-6379配置sentinel节点配置基本如下,cp下面的配置到三台虚拟机/u01/redis/26379ster/conf/sentinel_26379.monitor后监控mymasterredis中的master节点,也就是192.168.1.100,所以三台机器上这个文件是一样的。port26379bind0.0.0.0daemonizeyesprotected-modenodir"/u01/redis/26379/tmp"logfile"/u01/redis/26379/log/sentinel_26379.log"sentinelmonitormymaster192.168.1.10063791等待启动完成并观察/u01/redis/26379/conf/sentinel_26379.conf文件的变化,查看sentinel的状态。使用infosentinelredis-cli-h192.168.1.100-p26379infosentinel#sentinelsentinel_masters:1sentinel_tilt:0sentinel_running_scripts:0sentinel_scripts_queue_length:0sentinel_simulate_failure_flags:0master0:name=zhuanche01,status=ok,address=192.1068:snel7.1068.13总结我搭建的时候遇到了192.168.1.101,192.168.1.102上的Sentinel有一段时间开始报错。后来发现master没有被监控,然后就出问题了。看看日志。4.集群模式 集群的出现就是为了解决单机Redis容量有限的问题。Redis的数据按照一定的规则分布到多个一台机器对集群的理解:集群可以说是sentinel和master-slave模式的结合。通过集群可以实现主从和主重选功能,所以如果配置两副本三分片,需要6个Redis实例。由于Redis的数据是按照一定的规则分配到集群的不同机器上的,当数据量过大时,可以增加新的机器进行扩容  这种模式适用于数据量巨大的缓存需求,当数据量不是很大的时候用sentinel就可以了。