在Linux(CentOS7)下进行Redis主从配置
概述
redis的复制功能是支持多个数据库之间的数据同步。一类是主数据库(master)一类是从数据库(slave),主数据库可以进行读写操作,当发生写操作的时候自动将数据同步到从数据库,而从数据库一般是只读的,并接收主数据库同步过来的数据,一个主数据库可以有多个从数据库。
通过redis的复制功能可以很好的实现数据库的读写分离,提高服务器的负载能力。主数据库主要进行写操作,而从数据库负责读操作。
redis主从复制过程
当启动slave后,slave与master建立连接,然后发送sync命令。无论是第一次连接还是重新连接,master都会启动一个后台进程,将数据库快照保存到文件中,同时master主进程会开始收集新的写命令并缓存。后台进程完成写快照文件后,master就会发送文件和缓存给slave,slave将 文件保存到硬盘上,再加载到内存中,后续master将收到的写命令发送给slave。
如果master同时收到多个slave发来的同步连接命令,master只会启动一个进程来写数据库镜像,然后发送给所有的slave。master同步数据时是非阻塞式的,可以接收用户的读写请求。然而在slave端是阻塞模式的,slave在同步master数据时,并不能够响应客户端的查询。
可以在master禁用数据持久化,只需要注释掉master 配置文件中的所有save配置,然后只在slave上配置数据持久化
拥有主从服务器的好处(从服务器是只读的,可以一主多从)
- 主服务器进行读写时,会转移到从读,减轻服务器压力
- 热备份 主从都可以设置密码,也可以密码不一致
哨兵(Sentinel)机制
Sentinel(哨兵)进程是用于监控redis集群中Master主服务器工作的状态,在Master主服务器发生故障的时候,可以实现Master和Slave服务器的切换,保证系统的高可用,其已经被集成在redis2.6+的版本中,Redis的哨兵模式到了2.8版本之后就稳定了下来。一般在生产环境也建议使用Redis的2.8版本的以后版本。哨兵(Sentinel) 是一个分布式系统,你可以在一个架构中运行多个哨兵(sentinel) 进程,这些进程使用流言协议(gossipprotocols)来接收关于Master主服务器是否下线的信息,并使用投票协议(Agreement Protocols)来决定是否执行自动故障迁移,以及选择哪个Slave作为新的Master。每个哨兵(Sentinel)进程会向其它哨兵(Sentinel)、Master、Slave定时发送消息,以确认对方是否”活”着,如果发现对方在指定配置时间(可配置的)内未得到回应,则暂时认为对方已掉线,也就是所谓的”主观认为宕机” ,英文名称:Subjective Down,简称SDOWN。有主观宕机,肯定就有客观宕机。当“哨兵群”中的多数Sentinel进程在对Master主服务器做出 SDOWN 的判断,并且通过 SENTINEL is-master-down-by-addr 命令互相交流之后,得出的Master Server下线判断,这种方式就是“客观宕机”,英文名称是:Objectively Down, 简称 ODOWN。通过一定的vote算法,从剩下的slave从服务器节点中,选一台提升为Master服务器节点,然后自动修改相关配置,并开启故障转移(failover)。哨兵(sentinel) 虽然有一个单独的可执行文件 redis-sentinel ,但实际上它只是一个运行在特殊模式下的 Redis 服务器,可以以启动一个普通 Redis 服务器的方式通过给定 –sentinel 选项来启动哨兵(sentinel)。
哨兵(Sentinel)进程的作用
- 监控(Monitoring): 哨兵(sentinel) 会不断地检查你的Master和Slave是否运作正常。
- 提醒(Notification):当被监控的某个Redis节点出现问题时, 哨兵(sentinel) 可以通过 API
向管理员或者其他应用程序发送通知。 - 自动故障迁移(Automatic failover):当一个Master不能正常工作时,哨兵(sentinel)
会开始一次自动故障迁移操作,它会将失效Master的其中一个Slave升级为新的Master,
并让失效Master的其他Slave改为复制新的Master;当客户端试图连接失效的Master时,集群也会向客户端返回新Master的地址,使得集群可以使用现在的Master替换失效Master。Master和Slave服务器切换后,Master的redis.conf、Slave的redis.conf和sentinel.conf的配置文件的内容都会发生相应的改变,即Master主服务器的redis.conf配置文件中会多一行slaveof的配置,sentinel.conf的监控目标会随之调换。
哨兵(Sentinel)进程的工作方式:
- 每个Sentinel(哨兵)进程以每秒钟一次的频率向整个集群中的Master主服务器,Slave从服务器以及其他Sentinel(哨兵)进程发送一个
PING 命令。 - 如果一个实例(instance)距离最后一次有效回复 PING 命令的时间超过 down-after-milliseconds
选项所指定的值, 则这个实例会被 Sentinel(哨兵)进程标记为主观下线(SDOWN)。 - 如果一个Master主服务器被标记为主观下线(SDOWN),则正在监视这个Master主服务器的所有Sentinel(哨兵)进程要以每秒一次的频率确认Master主服务器的确进入了主观下线状态。
- 当有足够数量的Sentinel(哨兵)进程(大于等于配置文件指定的值)在指定的时间范围内确认Master主服务器进入了主观下线状态(SDOWN),则Master主服务器会被标记为客观下线(ODOWN)。
- 在一般情况下, 每个 Sentinel(哨兵)进程会以每 10 秒一次的频率向集群中的所有Master主服务器、Slave从服务器发送INFO 命令。
- 当Master主服务器被 Sentinel(哨兵)进程标记为客观下线(ODOWN)时,Sentinel(哨兵)进程向下线的Master主服务器的所有 Slave从服务器发送 INFO 命令的频率会从 10 秒一次改为每秒一次。
- 若没有足够数量的 Sentinel(哨兵)进程同意 Master主服务器下线, Master主服务器的客观下线状态就会被移除。若
Master主服务器重新向 Sentinel(哨兵)进程发送 PING 命令返回有效回复,Master主服务器的主观下线状态就会被移除。
准备
在Linux(CentOS7)下安装Redis
Redis是一款非关系型存储数据库。
下载软件归档压缩包
从redis官网上下载软件归档压缩包
wget http://download.redis.io/releases/redis-3.2.11.tar.gz
解压缩解归档
gunzip redis-3.2.11.tar.gz
tar -xvf redis-3.2.11.tar.gz
安装
切换至redis解压目录,执行下列命令进行配置和安装
make && make install
配置redis.conf配置文件
配置redis.conf配置文件,注意备份
绑定ip
在命令模式下, 61gg 定位至61行,进行绑定ip [注意:使用内网ip,可以在末行模式下输入 :!ifconfig 查看内网ip]
配置端口
在命令模式下, 84gg 定位至84行,配置端口,默认是 6379
配置连接密码
在命令模式下输入 /requirepass 查找,按 n 查找下一个,大概在480行,修改后
保存退出
后台启动服务,并设置日志文件
redis-server 配置文件的路径/配置文件名 > 日志文件 &
需要停止后台服务,请先把redis放在前台运行 (使用jobs查看后台运行编号num,再使用fg %num就将编号是num的服务放在前台运行了),再使用 Ctrl C 停止redis服务。或者使用 kill 进程编号
同样,如果要将前台运行的服务放到后台运行,先使用Ctrl Z,再使用jobs查看状态,是处于Stopped停止状态,之后使用bg %num就可以将编号是num的服务放在后台运行了
基准测试
redis-benchmark -h ip -p 端口 -a 密码
连接redis
redis-cli -h ip [-p 端口号] - 端口号为默认的6379可以不写
auth 密码 - 输入密码
ping - 测试连接,回复pong成功
一个Master,两个Slave,一个哨兵(sentinel)
配置主从库
先从安装的redis目录下复制三份redis.conf,分别命名为redis-6379.conf、redis-6380.conf、redis-6381.conf。
其中 redis-6379.conf 配置成主库,redis-6380.conf、redis-6381.conf 配置成从库。
对主库配置进行如下修改:
...
bind 172.19.92.129 # 这里配置成主机的ip
...
port 6379 # 运行端口
...
...
# daemonize no # 是否以守护进程启动,yes表示是
...
requirepass "redis" # 认证密码
...
对从库配置进行如下修改:
# redis-6380.conf
...
bind 172.19.92.129 # 这里配置成主机的ip
...
port 6380 # 运行端口
...
# daemonize no # 是否以守护进程启动,yes表示是
...
slaveof 172.19.92.129 6379 # 设置为 172.19.92.129 6379 的slave
masterauth redis # 连接master的认证密码
...
requirepass "redis" # 认证密码
...
# redis-6381.conf
...
bind 172.19.92.129 # 这里配置成主机的ip
...
port 6381 # 运行端口
...
# daemonize no # 是否以守护进程启动,yes表示是
...
slaveof 172.19.92.129 6379 # 设置为 172.19.92.129 6379 的slave
masterauth redis # 连接master的认证密码
...
requirepass "redis" # 认证密码
...
配置哨兵
先从redis的安装目录下复制一份sentinel.conf,命名为sentinel-26379.conf。
port 26379 # 运行端口
sentinel monitor mymaster 172.19.92.129 6379 1 # Sentinel Monitor 设置
sentinel down-after-milliseconds mymaster 3000 # 哨兵程序sentinel实例认定为失效的间隔时间
sentinel failover-timeout mymaster 10000 # failover过期时间。当failover开始后,在此时间内仍然没有触发任何failover操作,当前sentinel将会认为此次failoer失败。
sentinel auth-pass mymaster redis # Master认证密码
启动
redis-server redis-6379.conf > redis-6379.log & # 启动主库
redis-server redis-6380.conf > redis-6380.log & # 启动从库
redis-server redis-6381.conf > redis-6381.log & # 启动从库
redis-sentinel sentinel-26379.conf > sentinel-26379.log & # 启动哨兵
测试
1、查看节点信息:
进入redis客户端 redis-cli -h ip -p port
使用 info replication 查看信息
主库信息:
从库信息:
2、kill 掉主库之后,再查看哨兵日志信息(sentinel-26379.log)以及节点的信息