redis主从简单安装
1·从redis官网下载redis-4.0.14.tag.gz
2.然后解压,并进入
3.进入后先安装
tar xzf redis--4.0.14.tar.gz
cd redis--4.0.14
make && make install
我们只有一台服务器,要配置主从结构,必须启动多实例,我们启动配置三个redis实例,端口分别为7379,8379,9379。
7379为主服务器,8379 和9379为从服务器。
执行完 make && make install 会在/usr/local/bin 目录下创建文件
我们将这些文件都移动到当前redis的bin目录下
cd /redis/redis7379
mkdir bin
cd /redis/redis7379/bin
mv /usr/local/bin/* ./
配置redis.conf 端口为7379
port 7379 ##修改端口
bind 172.31.123.211 ##绑定本机Ip 使用ifconfig命令查看
loglevel debug;//修改日志级别
logfile /redis/redis7379/log/redis_7379.log ;//日志的文件路径
pidfile /redis/redis7379/pid/redis_7379.pid ;//pid的文件路径 pid安装并没有 需要收到创建,默认制定为/var/run/redis_7379.pid
slaveof 172.31.123.211 7379;//配置主服务器为7379
配置完毕之后 进入到bin目录下
./redis-server ../redis.conf
ps -ef|grep redis 如果成功启动则会出现下面这种情况
root 29405 1 0 10:51 ? 00:00:41 ./redis-server 172.31.123.211:7379
再次解压一个redis 重命名为redis8379
配置redis.conf 端口为8379
port 8379 ##修改端口
bind 172.31.123.211 ##绑定本机Ip 使用ifconfig命令查看
loglevel debug;//修改日志级别
logfile /redis/redis7379/log/redis_8379.log ;//日志的文件路径
pidfile /redis/redis7379/pid/redis_8379.pid ;//pid的文件路径 pid安装并没有 需要收到创建,默认制定为/var/run/redis_8379.pid
slaveof 172.31.123.211 7379;//配置主服务器为7379
然后启动./redis-server ../redis.conf
再次解压一个redis 重命名为redis8379
配置redis.conf 端口为8379
port 8379 ##修改端口
bind 172.31.123.211 ##绑定本机Ip 使用ifconfig命令查看
loglevel debug;//修改日志级别
logfile /redis/redis8379/log/redis_8379.log ;//日志的文件路径
pidfile /redis/redis8379/pid/redis_8379.pid ;//pid的文件路径 pid安装并没有 需要收到创建,默认制定为/var/run/redis_8379.pid
slaveof 172.31.123.211 7379;//配置主服务器为7379
修改成功后调用./redis-cli -h 172.31.123.211 -p 7379 连接
[root@iZ8ykv3uxiy4adZ bin]# ./redis-cli -h 172.31.123.211 -p 7379
172.31.123.211:7379>
则表明连接成功。
使用info Replication 查看
role:master ;//表明为主库
master_host:172.31.123.211
master_port:7379
master_link_status:up
然后在主库设置值 从库读取值。是否会同步
哨兵模式配置
在redis 的目录下有sentinel.conf文件 修改redis7379目录下的文件
port 27379
sentinel monitor mymaster 172.31.123.211 7379 1
#设定5秒内没有响应,说明服务器挂了
sentinel down-after-milliseconds mymaster 5000
#设定15秒内master没有活起来,就重新选举主
sentinel failover-timeout mymaster 15000
redis8389 和redis9379中的sentinel.conf配置文件是差不多的。
Redis主从采用异步复制,那么当主节点挂掉时,从节点可能没有收到全部的同步消息,这部分未同步的消息可能就丢失了,如果主从延时过大,那么丢的消息可能会更多,sentinel(哨兵)无法保证消息不丢失,但是也可能保证消息少都是,他提供两个参数。可以限制主从延时过大
min-slaves-to-write 1 #主节点必须至少有一个从节点在进行正常复制,否则就停止对外服务丧失可用性,
min-slaves-max-lag 10 #什么时候下是正常复制或者是异常复制,如果10s内没有收到从节点的反馈,就意味着同步不正常了
Redis哨兵模式原理:
Redis Sentinel 是一个分布式系统,可以在一个架构中运行多个 Sentinel 进程(progress), 这些进程使用流言协议(gossip protocols)来 接收关于主服务器是否下线的信息, 并使用投票协议(agreement protocols)来决定是否执行自动故 障迁移, 以及选择哪个从服务器作为新的主服务器。
Redis Sentinel 的三个任务:
1.监控:哨兵会不定期检查主服务器和从服务器是否运作正常。
2.提醒:当被监控的某个主服务器出现异常,哨兵可以通过API向管理员发送通知。
3.故障迁移:当一个主服务器不能正常工作时,哨兵会进行自动故障迁移工作,它会是一个从服务器变成主服务器,当一个客户端尝试连接故障服务器的时候,它也会向新客户端返回新的地址。
Sentinel.conf配置文件介绍:
1.sentinel monitor <master-name> <ip> <port> <quorum>
意思是让哨兵做定期监控 master-name 为哨兵的名称 ip 和端口 quorum为当主服务器出现
2.sentinel down-after-milliseconds <master-name> <times>
每个哨兵节点会定期发送ping命令来判断Redis节点和其余的哨兵节点是否是可达的 如果超过了配置的times 时间就会认为是不可达的。times为毫秒
3.sentinel parallel-syncs <master-name> <nums>
当主服务器故障时,每次从服务器向新的主服务器发的复制节点的个数
4.sentinel failover-timeout <master-name> <times>
当发送故障迁移时,超过了配置的时间就会故障迁移失败
5.sentinel notification-script <master-name> <script-path>
当redis发生故障时,将会调用这个脚本 script-path为脚本路径
哨兵的定时监控
当启动一个哨兵(Sentinel)时会发生一下情况:
1.每隔一秒每隔哨兵都会向其余的哨兵节点和主节点以及从节点,发送一次Ping命令,做一次心跳检测。
2.每隔两秒redis的哨兵将所有监视的主丶从节点向指定频道上发送当前的主节点信息。
3.每隔哨兵都会每隔10秒都会向主节点和从节点发送info命令,获取最新的拓扑结构图。
主观下线:单个哨兵认为某个服务下线,sentinel配置文件中的down-after-milliseconds设置了判断主观下线的时间长度,如果超过了改时间,那么该哨兵会认为该实例以及下线了。
客观下线:当主观下线的节点是主节点时,该节点会根据sentinel is-masterdown-by-addr <quorum>命令哨兵会征求其他节点的哨兵的意见,如果认为主观下线的票数大于 quorum,此时哨兵节点就会认为该节点有问题,就会客观下线了。
哨兵主节点选取流程
如果主节点被判定为客观下线后,就要选取一个从节点来当主节点。
1.每隔从节点都可能成为主节点,当他确定主节点下线后,会向其他节点发送
is-master-down-by-addr 命令,来询问是否可以将自己设置为主节点,
2.当其它哨兵收到此命令时,可以同意或者拒绝它成为领导者;
3.如果哨兵3发现自己在选举的票数大于等于num(sentinels)/2+1时,将成为领导者,如果没有超过,继续选举…………
自动故障转移机制
sentinel状态数据结构中保存了主服务的所有从服务信息,领头sentinel按照如下的规则从服务列表中挑选出新的主服务过滤掉主观下线的节点
选择slave-priority最高的节点,如果由则返回没有就继续选择
选择出复制偏移量最大的系节点,因为复制便宜量越大则数据复制的越完整,如果由就返回了,没有就继续
选择run_id最小的节点