部署环境
3.127.33.159 | redis,keepalived |
---|---|
3.127.33.158 | redis,sentinel,keepalived |
3.127.33.172 | redis,sentinel,keepalived |
3.127.33.174 | sentinel |
一、redis主从搭建
目前环境部署为三台redis,一主两从
修改redis.conf
# redis官网下载二进制包并上传到服务器
tar xzf redis-6.2.6.tar.gz -C /home/install/
mv redis-6.2.6 redis
cd redis
make
# 在解压目录下找到redis.conf下进行如下修改
# 注释掉bind,不注释只能本机访问,bind绑定本机的某个网卡,只要通过这个网卡地址来的redis请求都可以访问redis
# bind 127.0.0.1
# 开启后台启动,默认为no
daemonize yes
# 新增密码,此处设置123456
requirepass 123456
# 现在来安装和后台启动redis
cd src
make install #安装到指定目录 make install PREFIX=/home/install/redis/bin
# 通过配置文件启动redis,因为我们配置了后台启动,所以本次启动为后台启动
redis-server ../redis.conf
# 根据提示修改内存参数后再启动
sysctl vm.overcommit_memory=1
0,:表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
1:表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
2: 表示内核允许分配超过所有物理内存和交换空间总和的内存。
# 配置主从复制
# 注意:老版本使用slaveof指定主机的IP和端口,新版本使用replicaof指定主机的IP和端口
# 在从redis配置文件末尾加上一下信息,使其成为主redis的slave,会自动保持和master的数据保持一致
replicaof 3.127.33.159 6379
# 为了保证数据的一致性,从节点不提供写功能,配置文件中要添加一项`slave-read-only yes`,一般默认配置项会有,不需要更改
slave-read-only yes
# 如果设置了密码的话,需要进行主节点密码认证
#主节点跟从节点都要设置,否则主从切换的时候会提示身份验证错误
masterauth 123456
# 登录redis进行主从数据验证
./src/redis-cli -a 123456 //登录成功
# 或者
./src/redis-cli
# 进入后输入
auth 123456 //登录成功
# 验证数据
set master master //主
get master //从,查看数据是否复制过来
protected-mode是redis本身的一个安全层,这个安全层的作用:就是只有【本机】可以访问redis,其他任何都不可以访问redis。这个安全层开启必须满足三个条件,不然安全层处于关闭状态:
(1)protected-mode yes(处于开启)
(2)没有bind指令。原文:The server is not binding explicitly to a set of addresses using the “bind” directive.
(3)没有设置密码。原文:No password is configured。密码的优先级高。
这时redis的保护机制就会开启。开启之后,只有本机才可以访问redis。 如果上面三个条件任何一个不满足,就不会开启保护机制
二、哨兵配置
修改sentinel.conf
# 检查主redis节点的地址和端口信息,2代表至少两个个sentinel节点认 为主节点宕机才算宕机
sentinel monitor mymaster 3.127.33.159 6379 2
# 主节点失联30秒后,认为主节点不可达,默认30s
sentinel down-after-milliseconds mymaster 30000
# 主节点的密码,如有的话
sentinel auth-pass mymaster 123456
# sentinel后台运行
daemonize yes
# 解决哨兵之间不能通信,不能进行主结节客观下线的判断,以及failover 它启用的条件,有两个:
# 1) 没有bind IP
# 2) 没有设置访问密码
# 如果启用了,则只能够通过lookback ip(127.0.0.1)访问Redis cache,如果从外网访问,则会返回相应的错误信息:
protected-mode no
# sentinel的端口,默认26379
port 26379
# 主备切换时,最多有多少个slave同时对新的master进行同步,这里设置为默认的1。
sentinel parallel-syncs mymaster 1
# 故障转移的超时时间,这里设置为三分钟。
sentinel failover-timeout mymaster 180000
# sentinel集群都修改完成后启动
./src/redis-sentinel sentinel.conf
主从切换演示
关闭主节点redis-cli stop
两台redis从节点查看redis-cli info replication
看是否提升为主节点,继续去重启刚刚停掉的节点
查看从节点配置文件发现其中一台的replicaof配置已经被删除 查看哨兵日志
主从已经切换完毕
部署keepalived
因为主从切换后ip地址也会改变,所以需要个keepalived绑定一个vip来解决ip地址变动的问题
该环境为离线环境,keepalived所需依赖包也较多,所以通过在能联网的服务器上提前下载好各种依赖包然后上传到内网服务器上
yum install --downloadonly --downloaddir=/home/ gcc openssl-devel libnl3-devel net-snmp-devel libmnl libnfnetlink-devel ipvsadm
# 上传至内网服务器中
rpm -Uvh *.rpm --nodeps --force
cd /home/upload/keepalived
./configure --prefix=/home/utry/utry_workspace/keepalived
make && make install
使用systemctl管理
[Unit]
Description=LVS and VRRP High Availability Monitor
After=network-online.target syslog.target
Wants=network-online.target
Documentation=man:keepalived(8)
Documentation=man:keepalived.conf(5)
Documentation=man:genhash(1)
Documentation=https://keepalived.org
[Service]
Type=forking
PIDFile=/run/keepalived.pid
KillMode=process
EnvironmentFile=-/home/utry/utry_workspace/keepalived/etc/sysconfig/keepalived
ExecStart=/home/utry/utry_workspace/keepalived/sbin/keepalived $KEEPALIVED_OPTIONS
ExecReload=/bin/kill -HUP $MAINPID
[Install]
WantedBy=multi-user.target
修改配置文件及日志路径
keepalived日志会默认输出到/var/log/messages中,不方便查看
在/home/install/keepalived/etc/sysconfig/keepalived中的KEEPALIVED_OPTIONS修改为:
KEEPALIVED_OPTIONS="-f [配置文件路径] -D -S 2"
修改/etc/rsyslog.conf文件
在下面加上一行
local2.* /home/utry/utry_workspace/keepalived/logs/keepalived.log
重启日志服务
systemctl restart rsyslog
启动keepalived
systemctl start keepalived
systemctl enable keepalived
keepalived主从配置
主配置
! Configuration File for keepalived
global_defs {
router_id redis-159
# 添加如下内容
script_user root
enable_script_security
}
# 检测脚本
vrrp_script check_redis {
script "/home/install/redis/src/redis-cli -a 123456 -p 6379 info | grep role:master >/dev/null 2>&1" # 检测脚本
interval 3
fall 3
rise 1
}
vrrp_instance VI_1 {
state BACKUP # MASTER
interface eth0 # 本机网卡名
virtual_router_id 76 //虚拟路由id 要保持一致
priority 100 # 权重100
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass 1111
}
unicast_src_ip 3.127.33.xxx (本地ip)
unicast_peer {
#对象IP 发送vrrp包给备服务器
3.127.33.xxx
3.127.33.xxx
}
virtual_ipaddress {
3.127.33.244/24 # 虚拟IP
}
# 脚本
track_script {
check_redis # 模块
}
}
从配置(两台从节点除了ip需要改变其他一致)
! Configuration File for keepalived
global_defs {
router_id redis-80
# 添加如下内容
script_user root
enable_script_security
}
# 检测脚本
vrrp_script check_redis {
script "/home/install/redis/src/redis-cli -a 123456 -p 6379 info | grep role:master >/dev/null 2>&1" # 检测脚本
interval 3
fall 3
rise 1
}
vrrp_instance VI_1 {
state BACKUP # MASTER
interface eth0 # 本机网卡名
virtual_router_id 76 //虚拟路由id 要保持一致
priority 100 # 权重100
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass 1111
}
unicast_src_ip 3.127.33.xxx (本地ip)
unicast_peer {
#对象IP 发送vrrp包给备服务器
3.127.33.xxx
3.127.33.xxx
}
virtual_ipaddress {
3.127.33.244/24 # 虚拟IP
}
# 脚本
track_script {
check_redis # 模块
}
}
没错,主从权重一样的,实际上不分主从全是BACKUP,并且权重不会改变,让他们通过检测redis的主从状态来进行vip的漂移
注:
- fall:定义检测失败的最大次数,如设置为3表示当请求失败两次时就认为节点资源故障
- rise:定义请求成功的次数,如设置为1表示当进行一次请求成功后就认为节点资源恢复正常
- 检测脚本那里是通过返回一个0或者非0的值来判断进程是否为master节点,为master节点则返回0,非0则判断该节点master已经不在运行,vip漂移到检测master运行的redis主节点上
vip漂移验证
关闭redis的主节点,在从节点提升为主节点后,查看该节点的keepalived日志
检测脚本执行成功,vip成功漂移到该节点,查看原本节点会发现vip已经移除