redis 主从+keepalived
前言
一主多从
在这种架构模式下,Master 节点和Slave 节点的数据完全一致,Master 节支持数据的写入和读取等各项操作,而Slave 节点则只支持与Master 节点数据的同步和读取。也就是说,客户端将数据写入到Master 节点,由Master 节点自动将数据的写入操作同步到Slave 节点。(当主节点的数据发生变化时,会将变化的数据同步给从节点,这样从节点的数据就可以和主节点的数据保持一致了)。
主从模式很好的解决了数据备份问题,并且由于主从服务数据几乎是一致的,因而可以将写入数据的命令发送给主机执行,而读取数据的命令发送给不同的从机执行,从而达到读写分离的目的
环境信息
系统 | IP/Port | Server |
---|---|---|
Centos7.6 | 192.168.67.100 | VIP |
Centos7.6 | 192.168.67.130/6379 | redis-5.0.9、keepalived-1.3.5 |
Centos7.6 | 192.168.67.131/6389 | redis-5.0.9、keepalived-1.3.5 |
一,redis主从部署
1.1下载安装redis master
yum -y install gcc
tar -zxf redis-5.0.7.tar.gz
wget https://download.redis.io/releases/redis-5.0.7.tar.gz
make PREFIX=/usr/local/redis install
mkdir /usr/local/redis/{etc,logs,data}
cd /usr/local/redis/
cp redis.conf /usr/local/redis/etc/
修改Master的redis.conf配置文件
bind 127.0.0.1 # 正式部署请设为合适的 IP
port 6379 #修改端口 根据节点修改
protected-mode no #关闭保护模式(开启要设置bind和密码)
daemonize yes #以独立进程启动
pidfile /var/run/redis_6379.pid #服务ID文件名称及地址更改防止冲突
dir /tmp/redis-ms # Redis 的工作目录(若不存在需手建否则无法启动),logfile 与 dbfilename 受其影响
logfile "/usrlocal/redis/logs/redis-6389.log" #Redis 日志名称(默认不配置,表示输出到 stdout),正式部署请设置为合适的名称
appendonly yes //开启AOF持
appendfilename "appendonly.aof" #配置AOF持久化文件名
dbfilename no #RDB持久化
dbfilename dump-6379.rdb # Redis 数据持久化时的存储位置,正式部署请设置为合适的名称
masterauth password # 密码一样
requirepass password # 密码
启动redis
./bin/redis-server /etc/redis.conf
设置systemctl启动
vim /usr/lib/systemd/system/redis.service
[Unit]
Description=redis
After=network.target
[Service]
Type=forking
PIDFile=/var/run/redis_6379.pid #自行变更
ExecStartPost=/bin/sleep 0.1
ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf #自行变更
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
1.2 按照2.1安装redis slave
修改slave的redis.conf配置文件
bind 127.0.0.1 # 正式部署请设为合适的 IP
port 6379 #修改端口 根据节点修改
protected-mode no #关闭保护模式(开启要设置bind和密码)
daemonize yes #以独立进程启动
pidfile /var/run/redis_6379.pid #服务ID文件名称及地址更改防止冲突
dir /tmp/redis-ms # Redis 的工作目录(若不存在需手建否则无法启动),logfile 与 dbfilename 受其影响
logfile "/usrlocal/redis/logs/redis-6379.log" #Redis 日志名称(默认不配置,表示输出到 stdout),正式部署请设置为合适的名称
appendonly yes //开启AOF持
appendfilename "appendonly.aof" #配置AOF持久化文件名
dbfilename no #RDB持久化
dbfilename dump-6379.rdb # Redis 数据持久化时的存储位置,正式部署请设置为合适的名称
masterauth password # 密码一样
requirepass password # 密码
slaveof 127.0.0.1 6379 # 标注所从属的主机,一般不建议写配置文件
1.3 做redis主从
登录从机器,是当前服务器对130机器同步
redis-cli -h 192.168.67.131 -p 6389 # 连接到 Redis 从机
slaveof 192.168.67.130 6379 #
或
replicaof 192.168.67.130 6379
info replication #查看主从
1.4 测试
登录master服务器
redis-cli -h 192.168.67.130 -p 6389 # 连接到 Redis 主机
现在在 Redis Master 的客户端写入数据(执行set 命令,为键 name设置数据)
192.168.67.130:6389> set name1 ap
OK
登录从机器查看数据是否同步过去
info replication #查看状态
192.168.67.131:6389> get name1
"ap"
在从机器能获取到刚刚在master写入的key,完成主从部署。
1.5 知识点
1.5.1 Redis实现主从同步可以有两种方式
- 配置命令的方式
./redis-server --slaveof 192.168.1.10 6379 #启动从节点时,通过参数--slaveof指定主节点是谁。
slaveof <Redis主库IP> <Redis主库端口> #通过redis-cli的命令行执行slaveof
replicaof <Redis主库IP> <Redis主库端口>
- 配置文件方式
vim redis.conf
slaveof 127.0.0.1 6379 # 标注所从属的主机,一般不建议写配置文件
1.5.2 主从同步相关参数
1、slave-serve-stale-data
在Redis主从同步中,当Redis从服务器发现Redis主服务器不可用时,无法判断自己的数据是否已经过期,如果此时Redis从服务器收到读的请求,则可以会响应过期的数据。如果此参数为yes,则表示Redis从服务器仍然会以可能过期的数据进行响应,但是如果此参数为no,则表示Redis从服务器不会响应读请求。
2、slave-read-only
当此参数为yes时,则此Redis服务器将只会响应读请求,该参数默认关闭,在Redis从库上回默认开启。
3、repl-diskless-sync
该参数表示是否开去无磁盘交互模式,默认为no,即不开启,也可以手动更改为yes,表示开启。所谓无磁盘交互模式,就是指Redis主和Redis从在进行主从同步时,Redis主同步给Redis从的数据文件不会被写入磁盘中,Redis从服务器会直接将该数据文件读取处理后放入内存,而如果该参数不开启,则Redis从库会将数据文件放入磁盘中,然后再读入内存。
4、repl-diskless-sync-delay
该参数表示在进行无磁盘交互模式下Redis从库的延迟时间,该参数默认单位为秒,默认为5.
5、slave-priority
该参数指定Redis从库的优先级,通常用于主从同步结合Redis sentinel进行高可用配置时使用,该优先级数值越小,表示优先级越高,在默认情况下,该参数值为100.
6、min-slaves-to-write
该参数表示在Redis主从同步过程中,一个Redis主库所对应的最少的从库数量,当少于该参数指定的数量时,Redis主库将拒绝从库读取数据的请求。该参数在默认情况下处于关闭状态。
7、min-slaves-max-lag
表示Redis主库与Redis从库之间的最大时差,当时差超过该值时,就无法进行主从同步。该参数在默认情况下处于关闭状态。
参数 protected-mode no
我们想要其他机连接我们的Redis服务,有三种方式:
- 想办法让Redis运行在protected-mode为no的模式,
- 如果protected-mode为yes,那么我们可以在Redis服务上设置bind,也就是我们的一台机器有几个ip,指定我们的服务绑定监听本机的哪个ip。
- 如果protected-mode为yes,除了设置bind外,亦可通过设置密码的形式,也即是设置参数requirepass,从而达到可以从其他机器访问的目标。
二,Keepalived吧部署
2.1 下载keepalived-1.3.5.tar.gz ,上传到/home/
tar zxf keepalived-1.3.5.tar.gz
cd keepalived-1.3.5
./configure u --prefix=/usr/local/keepalived
make && make install
mkdir -p /etc/keepalived/scripts
mkdir -p /etc/keepalived/log
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
cp /home/keepalived-1.3.5/keepalived/etc/init.d/keepalived /etc/init.d/
2.2 修改配置文件
redis-master
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
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_s33
}
track_script {
chk_redis
}
virtual_ipaddress {
192.168.67.100
}
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
}
redis-slave
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
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.67.100 ##更改VIP
}
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.3 设置systemctl启动
增加系统服务
chkconfig --add keepalived
正在将请求转发到“systemctl enable keepalived.service”
chkconfig keepalived on
修改启动文件
vim /usr/lib/systemd/system/keepalived.service
PIDFile=/var/run/keepalived.pid
启动
systemctl start keepalived
2.4 模拟故障VIP漂移测试
主130关闭redis
查看131上有无vip
新master节点131插入数据
启动130节点
131变成Slave节点,130变回了Master。
在130上能查看到刚刚在131上插入的数据。
总结:Maste(130)节点宕机,VIP漂到Slave(131)节点,Slave(131)节点变成新Master(131)节点。新Master(131)节点插入数据,130节点启动后,130变回Master(130)节点,可以查到在131插入的数据。