redis主从复制
将一台redis服务器的数据,复制到其他redis服务器,复制是单向的,只能由主节点到从节点,master以写为主,slave以读为主。
一般来说,单台redis最大使用内存不应超过20G。
只配置从库,不用配置主库(不作详细演示)
slaveof 127.0.0.1 6379 #作为谁的从机,临时配置,建议配置文件中写入info replication #查看主从复制信息slaveof no one #从机成为主机
从机只能读取内容,当主机断开连接,恢复连接后,从机依然能获取到主机写的信息。
复制原理
1. slave启动成功连接到master后,会发送一个sync同步命令
2. master接到命令,启动后台的存盘进程,将传送整个数据文件到slave,并完成一次完全同步
3. 全量复制:slave接收到数据库文件数据后,将其存盘加载到内存中(slave重连主机)
4. 增量复制:master将新的修改命令依次传给slave(如set命令)
哨兵模式
哨兵是一个独立的进程,通过发送命令,等待redis服务响应,从而监控运行的多个redis实例。当哨兵监测到master宕机,自动将slave切换成master,然后通过发布订阅模式通知其他的从服务器,修改配置文件。
一个哨兵可能会出现问题,因此可以使用多个哨兵进行监控,哨兵之间还会进行监控,形成多哨兵模式。
1. 配置哨兵配置文件sentinel.conf
#sentinel monitor 被监控的名称 host 6379 1(代表主机挂了,slave投票让谁成为主机)sentinel monitor myredis 127.0.0.1 6379 1
2. 启动哨兵模式
redis-sentinel ../conf/sentinel.conf
如果主机宕机了,就从从机中随机选择一个服务器(投票算法)
如果主机恢复,只能归并到新主机下作为从机。
扩展-哨兵模式全部配置
# Example sentinel.conf# 哨兵sentinel实例运行的端口 默认26379port 26379# 哨兵sentinel监控的redis主节点的 ip port# master-name 可以自己命名的主节点名字 只能由字母A-z、数字0-9 、这三个字符".-_"组成。# quorum 当这些quorum个数sentinel哨兵认为master主节点失联 那么这时 客观上认为主节点失联了# sentinel monitor <master-name> <ip> <redis-port> <quorum>sentinel monitor mymaster 127.0.0.1 6379 2# 当在Redis实例中开启了requirepass foobared 授权密码 这样所有连接Redis实例的客户端都要提供密码# 设置哨兵sentinel 连接主从的密码 注意必须为主从设置一样的验证密码# sentinel auth-pass <master-name> <password>sentinel auth-pass mymaster MySUPER--secret-0123passw0rd# 指定多少毫秒之后 主节点没有应答哨兵sentinel 此时 哨兵主观上认为主节点下线 默认30秒# sentinel down-after-milliseconds <master-name> <milliseconds>sentinel down-after-milliseconds mymaster 30000# 这个配置项指定了在发生failover主备切换时最多可以有多少个slave同时对新的master进行 同步,这个数字越小,完成failover所需的时间就越长,但是如果这个数字越大,就意味着越 多的slave因为replication而不可用。可以通过将这个值设为 1 来保证每次只有一个slave 处于不能处理命令请求的状态。# sentinel parallel-syncs <master-name> <numslaves>sentinel parallel-syncs mymaster 1# 故障转移的超时时间 failover-timeout 可以用在以下这些方面:#1. 同一个sentinel对同一个master两次failover之间的间隔时间。#2. 当一个slave从一个错误的master那里同步数据开始计算时间。直到slave被纠正为向正确的master那里同步数据时。#3.当想要取消一个正在进行的failover所需要的时间。#4.当进行failover时,配置所有slaves指向新的master所需的最大时间。不过,即使过了这个超时,slaves依然会被正确配置为指向master,但是就不按parallel-syncs所配置的规则来了# 默认三分钟# sentinel failover-timeout <master-name> <milliseconds>sentinel failover-timeout mymaster 180000# SCRIPTS EXECUTION#配置当某一事件发生时所需要执行的脚本,可以通过脚本来通知管理员,例如当系统运行不正常时发邮件通知相关人员。#对于脚本的运行结果有以下规则:#若脚本执行后返回1,那么该脚本稍后将会被再次执行,重复次数目前默认为10#若脚本执行后返回2,或者比2更高的一个返回值,脚本将不会重复执行。#如果脚本在执行过程中由于收到系统中断信号被终止了,则同返回值为1时的行为相同。#一个脚本的最大执行时间为60s,如果超过这个时间,脚本将会被一个SIGKILL信号终止,之后重新执行。#通知型脚本:当sentinel有任何警告级别的事件发生时(比如说redis实例的主观失效和客观失效等等),将会去调用这个脚本, 这时这个脚本应该通过邮件,SMS等方式去通知系统管理员关于系统不正常运行的信息。调用该脚本时,将传给脚本两个参数,一个是事件的类型,一个是事件的描述。如果sentinel.conf配置文件中配置了这个脚本路径,那么必须保证这个脚本存在于这个路径,并且是可执行的,否则sentinel无法正常启动成功。#通知脚本# sentinel notification-script <master-name> <script-path>sentinel notification-script mymaster var/redis/notify.sh# 客户端重新配置主节点参数脚本# 当一个master由于failover而发生改变时,这个脚本将会被调用,通知相关的客户端关于master地址已经发生改变的信息。# 以下参数将会在调用脚本时传给脚本:# <master-name> <role> <state> <from-ip> <from-port> <to-ip> <to-port># 目前<state>总是“failover”,# <role>是“leader”或者“observer”中的一个。# 参数 from-ip, from-port, to-ip, to-port是用来和旧的master和新的master(即旧的slave)通信的# 这个脚本应该是通用的,能被多次调用,不是针对性的。# sentinel client-reconfig-script <master-name> <script-path>sentinel client-reconfig-script mymaster var/redis/reconfig.sh
集群模式
环境搭建
操作系统:centos 7
安装redis:在linux下安装redis
本文模拟实例:一台云服务器,模拟6个redis节点,3个master,3个slave
步骤
创建集群文件夹及对应的节点文件
mkdir usr/local/redis_clustercd usr/local/redis_clustermkdir -p 7001/data 7002/data 7003/data 7004/data 7005/data 7006/data
拷贝配置文件并修改相关配置信息
cd 7001/cp /root/packages/redis-5.0.4/redis.conf ./vim redis.conf
port 7001 # 节点端口号daemonize yes # 以后台进程的方式启动redis实例bind 127.0.0.1 # 实例绑定当前机器IP地址protected-mode yes # 开启保护模式pidfile /var/run/redis_6379.pid # 指定该进程pidfile,和port对应dir /usr/local/redis-cluster/7001/data/ #(redis实例数据文件存放位置)masterauth 密码 # replica同master交互密码requirepass 密码 # master开启密码保护cluster-enabled yes # 启动集群模式cluster-config-file nodes7001.conf # 和port要对应,集群中该实例的配置文件,该文件会在data目录下生成cluster-node-timeout 5000 # 超时时间5sappendonly yes # 开启aop日志
复制配置文件,批量替换信息
cp redis.conf ../7002/cp redis.conf ../7003/......vim ../7002/redis.conf:%s/替换旧内容/新内容/g #批量替换,如端口号
依次启动redis各个节点服务
方式1:逐个启动
./redis-server /usr/local/redis_cluster/7001/redis.conf
方式2:启动脚本写到sh文件中,修改文件权限后一次启动
vim start-all-redis.sh
cd /usr/local/redis/bin/./redis-server /usr/local/redis_cluster/7001/redis.conf./redis-server /usr/local/redis_cluster/7002/redis.conf./redis-server /usr/local/redis_cluster/7003/redis.conf./redis-server /usr/local/redis_cluster/7004/redis.conf./redis-server /usr/local/redis_cluster/7005/redis.conf./redis-server /usr/local/redis_cluster/7006/redis.conf
chmod +x start-all-redis.sh
./start-all-redis.sh
检查启动情况

创建集群
./redis-cli -a 密码 --cluster create --cluster-replicas 1 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006


客户端连接集群某个节点
./redis-cli -a 密码 -c -h 127.0.0.1 -p 7001
【-c:连接集群节点时使用,可防止move和ask异常,并可在节点间自动跳转】

查看集群节点信息:cluster nodes

cluster帮助指引:redis-cli --cluster help





