实验环境:
server1:172.25.26.1 master
server2:172.25.26.2 slave
server3:172.25.26.3 slave
一、redis的主从复制
1.编译安装软件(server1,server2,server3都做)
(1)下载安装包,并解压
[root@server1 ~]# ls
redis-5.0.3.tar.gz
[root@server1 ~]# tar zxf redis-5.0.3.tar.gz
2.安装依赖包,并编译安装
[root@server1 ~]# cd redis-5.0.3
[root@server1 redis-5.0.3]# ls
00-RELEASENOTES COPYING Makefile redis.conf runtest-sentinel tests
BUGS deps MANIFESTO runtest sentinel.conf utils
CONTRIBUTING INSTALL README.md runtest-cluster src
[root@server1 redis-5.0.3]# yum install gcc -y
[root@server1 redis-5.0.3]# make && make install
3.执行redis安装脚本
[root@server1 redis-5.0.3]# cd utils/
[root@server1 utils]# ./install_server.sh
此时netstat -antlp会出现6379端口 (server1,2,3上都一样)
2.server1配置redis
[root@server1 utils]# vim /etc/redis/6379.conf
70 bind 0.0.0.0
[root@server1 utils]# systemctl restart redis_6379.service ##重启服务
在配置文件redis.conf中,默认的bind 接口是127.0.0.1,也就是本地回环地址。这样的话,访问redis服务只能通过本机的客户端连接,而无法通过远程连接,这样可以避免将redis服务暴露于危险的网络环境中,防止一些不安全的人随随便便通过远程连接到redis服务。如果将bind选项注释的话,那会接受所有来自于可用网络接口的连接。
3.server2和server3配置redis
[root@server2 utils]# vim /etc/redis/6379.conf
70 bind 0.0.0.0
282 slaveof 172.25.26.1 6379 ##添加salve指向master为server1
[root@server2 utils]# systemctl restart redis_6379.service
[root@server3 utils]# vim /etc/redis/6379.conf
70 #bind 0.0.0.0 ##注意这里的注释
282 slaveof 172.25.26.1 6379
[root@server3 utils]# systemctl restart redis_6379.service
4.测试
(1)在server1(master)添加key-value值
[root@server1 utils]# redis-cli
127.0.0.1:6379> set name westos
OK
(2)在server2,server3上可以看到添加的信息,表示主从复制成功
[root@server2 utils]# redis-cli
127.0.0.1:6379> get name
"westos"
[root@server3 utils]# redis-cli
127.0.0.1:6379> get name
"westos"
二.redis的主从切换实现高可用(哨兵机制)
1.server1(master),将 sentinel.conf复制到 /etc/redis/,并做相应编辑
[root@server1 ~]# cd redis-5.0.3
[root@server1 redis-5.0.3]# cp sentinel.conf /etc/redis/
[root@server1 redis-5.0.3]# cd /etc/redis/
[root@server1 redis]# vim sentinel.conf
17 protected-mode no ##关闭保护模式
#指定要监控的master,mymaster是定义的master名字,quorum为法定票数2,此处指的是sentinel的数,
只有指定的sentinel同意时才认为sentinel做的决策是有效的,一般大于sentinel数量的半数。可以有多
个master,一组sentinel集群可以监控N个主从复制架构
84 sentinel monitor mymaster 172.25.26.1 6379 2
#至少多长时间 连不上才认为主的离线了。单位为ms, 即连接超时时长
113 sentinel down-after-milliseconds mymaster 10000 (这里我设置为10秒)
#刚刚设定为新主时,允许同时有多少个从向主发起同步请求。
121 sentinel parallel-syncs mymaster 1
#当master故障时,把新的从提升为master,多长时间提不上就认为故障转移失败。
146 sentinel failover-timeout mymaster 180000
2.将写好的配置文件发到两个slave上的/etc/redis下
[root@server1 redis]# scp sentinel.conf 172.25.26.2:/etc/redis
[root@server1 redis]# scp sentinel.conf 172.25.26.3:/etc/redis
3.查看状态
在server1上,看到两个slave分别是server2和server3
[root@server1 redis]# redis-cli
127.0.0.1:6379> info
在slave2,3上查看指定master到server1上
[root@server2 redis]# redis-cli
127.0.0.1:6379> info
测试:
1.server4(任意一个主机上),执行监控命令,并打入后台
[root@server4 redis-5.0.3]# redis-server /etc/redis/sentinel.conf --sentinel
或者redis-sentinel /etc/redis/sentinel.conf &
2.宕掉server1(master)
[root@server1 redis]# redis-cli
127.0.0.1:6379> shutdown
not connected>
3.此时在server4上会输出一个switch参数,显示转换到了server2上
4.然后在server2上显示已经是master,有一个slave是server3
[root@server2 redis]# redis-cli
127.0.0.1:6379> info
5.在server3上显示是slave状态,master指向server2
[root@server2 redis]# redis-cli
127.0.0.1:6379> info