前言及思路:
这边的思路是以3作为主,4作为从,110作为VIP漂移地址,应用通过110的6379端口访问redis数据库。
正常运行下,当主节点3宕机后,VIP飘逸到4上,这时4就会接管3成为主节点,3就会成为从节点,继续提供读写操作。
当3恢复正常后,这时3会与4进行一次数据同步,3原有的数据不会丢失,还会同步宕机之间已经写入到4的数据,数据同步完成之后,
VIP会因为权重的原因重新回到3节点上并成为主节点,4会因为失去VIP会重新成为从节点,恢复到初始状态继续提供不间断的读写服务。
一、环境准备
centos7.X版本
master 192.168.114.3
slave 192.168.114.4
keepalive(vip) 192.168.114.110
二、安装
主从都分别安装好redis、keepalived
网上都是编译安装的,我这边尝试yum安装。简单方便!
yum install redis keepalived -y
三、修改redis配置文件
**主从机器都创建好目录及修改权限 mkdir -p /data/redis && chown redis:redis /data/redis
3.1配置redis的配置文件,PS:因为测试关系,我这边配置的都是极为简化的配置
(1)配置master的redis节点的配置文件
vim /etc/redis.conf
bind 0.0.0.0
port 6379
dbfilename redis_master.rdb
dir /data/redis
appendonly yes
appendfilename “redis_master.aof”
appendfsync everysec
daemonize yes
requirepass 123456
slave-serve-stale-data yes
slave-read-only no
(2)配置slave的redis节点的配置文件
vim /etc/redis.conf
bind 0.0.0.0
port 6379
dbfilename redis_slave.rdb
dir /data/redis
appendonly yes
appendfilename “redis_slave.aof”
appendfsync everysec
daemonize yes
slaveof 192.168.114.3 6379
masterauth 123456
slave-serve-stale-data yes
slave-read-only no
3.2分别启动master及slave节点的redis,验证其是否能正常使用
# systemctl start redis
(1)master节点测试(info信息太长,我这边选取Replication信息展示下)
[root@192-168-114-3 etc]# redis-cli -a 123456
127.0.0.1:6379> info
# Replication
role:master
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
这里很明显有问题connected_slaves:0 没有任何从节点连接上主节点!!(上面的配置文件我已经修改了,应该不会再出现这个错误了。下面附上我解决过程)画横线解决过程可以忽略
解决:先查看日志。由于我上面配置没有设置log路径,默认都在/var/log/messages里面
Apr 28 16:08:24 192-168-114-3 redis-server: 39905:C 28 Apr 16:08:24.751 # Failed opening the RDB file dump.rdb (in server root dir /) for saving: Permission denied
Apr 28 16:08:24 192-168-114-3 redis-server: 39894:M 28 Apr 16:08:24.768 # Background saving error
Apr 28 16:08:24 192-168-114-3 redis-server: 39894:M 28 Apr 16:08:24.768 # Connection with slave 192.168.114.4:6379 lost.
Apr 28 16:08:24 192-168-114-3 redis-server: 39894:M 28 Apr 16:08:24.768 # SYNC failed. BGSAVE child returned an error
分析:replication是redis提供的复制功能,用于master提供给slave的数据同步。
slave在连接master后,master端会在后台启动一个进程进行rdb文件的建立,当文件建立完成后,发送给slave端,slave端收到后,会通过rdb文件完成对master的复制。
我这边配置没有配置bgsave的路径,导致redis没有权限写入到root根目录,从而bgsave失败。导致从节点是同步到不数据。
修改下redis配置文件,增加下面3行做持久化配置
dbfilename redis_master.rdb
dir /data/redis
appendonly yes
appendfilename “redis_master.aof”
appendfsync everysec
注意创建好目录并修改权限
mkdir -p /data/redis
chown redis:redis /data/redis
配置文件以及修改好了,详情见上面的redis配置
再次查看master的info
[root@192-168-114-3 ~]# redis-cli -a 123456
127.0.0.1:6379> info Replication
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.114.4,port=6379,state=online,offset=29,lag=0
master_repl_offset:29
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:28
可以了,有1个从节点连接上来了,问题解决!
(2)slave节点测试
[root@192-168-114-4 etc]# redis-cli -a 123456
127.0.0.1:6379> info
# Replication
role:slave
master_host:192.168.114.3
master_port:6379
master_link_status:down
master_last_io_seconds_ago:-1
master_sync_in_progress:0
slave_repl_offset:1
master_link_down_since_seconds:1588060103
slave_priority:100
slave_read_only:0
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
(3) 测试redis主从是否正常同步
master节点写入一组key、value
127.0.0.1:6379> set ycy 18
OK
slave节点查看是否有这组key、value
[root@192-168-114-4 etc]# redis-cli -a 123456
127.0.0.1:6379> get ycy
“18”
很明显主从节点正常工作了。
四、keepalived的配置实现高可用
** 使用Keepalived实现VIP,并且通过notify_master、notify_backup、notify_fault、notify_stop来实现容灾。
4.1配置keepalived的配置文件
(1)配置master的keepalived的配置文件
# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf_bak
[root@192-168-114-4 etc]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
}
#vrrp_strict
router_id redis01
}
vrrp_script chk_redis {
script “/etc/keepalived/script/redis_check.sh”
interval 2
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_redis
}
virtual_ipaddress {
192.168.114.110
}
notify_master /etc/keepalived/script/redis_master.sh
notify_backup /etc/keepalived/script/redis_backup.sh
notify_fault /etc/keepalived/script/redis_fault.sh
notify_stop /etc/keepalived/script/redis_stop.sh
}
(2)配置slave的keepalived的配置文件
[root@192-168-114-4 etc]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
}
#vrrp_strict
router_id redis02
}
vrrp_script chk_redis {
script “/etc/keepalived/script/redis_check.sh”
interval 2
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_redis
}
virtual_ipaddress {
192.168.114.110
}
notify_master /etc/keepalived/script/redis_master.sh
notify_backup /etc/keepalived/script/redis_backup.sh
notify_fault /etc/keepalived/script/redis_fault.sh
notify_stop /etc/keepalived/script/redis_stop.sh
}
4.2配置keepalived相关脚本
(1)master节点
先创建好配置文件中脚本存放的目录
#mkdir -p /etc/keepalived/script/
redis存活判断脚本
#cd /etc/keepalived/script/
# cat redis_check.sh
#!/bin/bash
ALIVE=`/usr/bin/redis-cli -a 123456 PING`
if [ “$ALIVE” == “PONG” ];then
echo $ALIVE
exit 0
else
echo $ALIVE
exit 1
fi
redis主节点同步数据并让从变为主节点的脚本
# cat redis_master.sh
#!/bin/bash
REDISCLI=”/usr/bin/redis-cli -a 123456″
LOGFILE=”/var/log/keepalived-redis-state.log”
sleep 15
echo “[master]” >> $LOGFILE
date >> $LOGFILE
echo “Being master….” >>$LOGFILE 2>&1
echo “Run SLAVEOF cmd …”>> $LOGFILE
#同步数据到slave节点
$REDISCLI SLAVEOF 192.168.114.4 6379 >>$LOGFILE 2>&1
if [ $? -ne 0 ];then
echo “data rsync fail.” >>$LOGFILE 2>&1
else
echo “data rsync OK.” >> $LOGFILE 2>&1
fi
sleep 10 #延迟10秒以后待数据同步完成后再取消同步状态,这个时间大小视乎同步情况而定
# 从属服务器关闭复制功能,并从从属服务器转变回主服务器,原来同步所得的数据集不会被丢弃
echo “Run SLAVEOF NO ONE cmd …”>> $LOGFILE
$REDISCLI SLAVEOF NO ONE >> $LOGFILE 2>&1
if [ $? -ne 0 ];then
echo “Run SLAVEOF NO ONE cmd fail.” >>$LOGFILE 2>&1
else
echo “Run SLAVEOF NO ONE cmd OK.” >> $LOGFILE 2>&1
fi
两个日志标志记录脚本
# cat redis_stop.sh
#!/bin/bash
LOGFILE=/var/log/keepalived-redis-state.log
echo “[stop]” >> $LOGFILE
date >> $LOGFILE
# cat redis_fault.sh
#!/bin/bash
LOGFILE=/var/log/keepalived-redis-state.log
echo “[fault]” >> $LOGFILE
date >> $LOGFILE
最后把这5个脚本加上执行权限
cd /etc/keepalived/script/ && chmod +x *
(2)slave节点
redis_check.sh 、redis_fault.sh 、redis_stop.sh 这三个脚本完全是与主机器是一致的
redis_backup.sh 、redis_master.sh 需要修改下其中的ip地址(将从ip换成主的ip)
所以我这边先直接同步这5个脚本文件到从机器
rsync /etc/keepalived/script/* 192.168.114.4:/etc/keepalived/script/
再修改下redis_backup.sh 、redis_master.sh 即可。
五、启动keepalived并测试redis故障转移情况
5.1同时在master及slave启动并检查vip获取情况,再检查是否能通过vip连接redis主从集群
systemctl start keepalived
可以看到master的ens33网卡已经获取到了vip地址
5.2连接vip地址测试redis
发现不通,甚至ping都Ping不通vip地址
keepalived.conf配置中默认vrrp_strict打开了,需要把它注释掉。重启keepalived即可ping通。
还有一个问题需要注意下。当redis从节点先起来,可能会导致主节点获取不到从节点信息,导致主从架构失败。应该先启动redis主节点,再启动redis从节点。
(1)测试通过vip地址写入数据,主从节点是否都能读取到该数据
可以看到已经通过vip写入了一组 test:123信息
主节点获取信息正常
从节点该信息也获取到了。
(2)测试故障转移情况
关闭192.168.114.3主redis服务,查看从redis是否会接管VIP变成主?然后再新的主redis192.168.114.4上插入数据,测试当192.168.114.3恢复,数据是否存在?192.168.114.4的是否会变成从节点?
关闭主redis服务
# systemctl stop redis
可以看到主节点没有vip地址信息了
# redis-cli -a 123456
127.0.0.1:6379> info
可以看到从节点获取到了vip信息,并且通过info可以看到从节点成为master节点了
继续通过vip写入数据。
新的主节点也是可以能获取到的。
================下面我们将192.168.114.3机器的redis启动,模拟恢复,看看是否能获取到该数据,并且看看vip会不会漂移过来。====================
vip已经漂移过来了
主节点切换回来了,数据也是存在的,说明这个高可用是有效的,值得一说的是,主节点切换回来,需要时间同步数据,所以可能会延迟一会获取到新写入的数据。这个其实也是上面在脚本中定义的sleep时间来的。
编译安装及配置网上参考链接https://www.cnblogs.com/lywJ/p/10833496.html

转载自己的有道云笔记链接文档:http://note.youdao.com/noteshare?id=71bbff6507603d895a4f761ee495905e&sub=E0606431FCBB4EB09137926D51C3B780

为Kubernetes v1.5.2版本安装dashboard图形界面

一、前言 dashboard是一个图形化管理界面,由于我这边的Kubernetes v1.5.2比较老,按官网的安装方法没有效果,现在试试手动安装,使用下面2个yaml文件安装 ...

阅读全文

k8s简单部署

K8s中文手册地址:https://www.kuboard.cn/learning/k8s-basics/kubernetes-basics.html#kubernetes%E5%8A%9F%E8%83%BD   这边安装的Kubernetes v1.5.2 比较...

阅读全文

centos7上openvpn搭建详细教程

写在前面的前言: 因为工作需要安全连接公司的内网机器。对比了几个vpn的配置及工作模式。安全性:openvpn>l2tp/ipsec>pptp ,当然还有ss+代理的模式。...

阅读全文

欢迎留言