安装redis主从模式+Sentinel哨兵+漂移VIP模式

环境说明

系统 主机名 ip redis版本
Ubuntu 18.04.4 LTS redis01 172.40.11.18,172.40.11.21(vip) redis5.0.5
Ubuntu 18.04.4 LTS redis02 172.40.11.19 redis5.0.5
Ubuntu 18.04.4 LTS redis03 172.40.11.20 redis5.0.5

1 安装redis服务

1.1 配置基础环境

apt install make      
apt install make-guile
apt install gcc

1.2 优化操作系统

关闭内存大页
echo never |sudo tee /sys/kernel/mm/transparent_hugepage/defrag
echo never |sudo tee /sys/kernel/mm/transparent_hugepage/enabled
sed -i '/^exit/i\echo never > /sys/kernel/mm/transparent_hugepage/defrag' /etc/rc.local
sed -i '/^exit/i\echo never  > /sys/kernel/mm/transparent_hugepage/enabled'  /etc/rc.local

最大打开文件数
 ulimit -SHn 65535
 echo "ulimit -SHn 65535" >> /etc/rc.local
 echo "*           soft  nofile       65535" >>/etc/security/limits.conf
 echo "*           hard  nofile       65535" >>/etc/security/limits.conf
 echo "*           soft  nproc       65535" >>/etc/security/limits.conf
 echo "*           hard  nproc       65535" >>/etc/security/limits.conf
 TCP积压值过小优化
 echo "net.core.somaxconn = 1024" > /etc/sysctl.d/redis.conf
 sysctl -p /etc/sysctl.d/redis.conf   #刷新使其生效
 net.core.somaxconn = 1024
 内存使用策略优化
echo "vm.overcommit_memory = 1" >> /etc/sysctl.d/redis.conf
sysctl -p /etc/sysctl.d/redis.conf   #刷新使其生效
vm.overcommit_memory = 1

1.3 编译安装redis

wget http://download.redis.io/releases/redis-5.0.5.tar.gz
tar zxf redis-5.0.5.tar.gz 
cd redis-5.0.5/
make &&  make install PREFIX=/usr/local/redis 

1.4 配置redis

1.5 创建redis启动脚本

 vim /etc/systemd/system/redis.service

[Unit]
Description=redis-server
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf
PrivateTmp=true

[Install]
WantedBy=multi-user.target

启动redis

systemctl daemon-reload
systemctl start redis.service

2 配置redis主从

主从复制的安全性

对于数据比较重要的节点,主节点会通过设置requirepass参数进行设置密码,这时,所有的client访问都需要使用auth进行认证,因此,在配置主从时,需要配置slave节点的masterauth参数与master的requirepass参数一致,这样从节点才可以正确的连接到主节点并发起复制流程。
slave设置只读

默认情况下,slave使用slave-read-only=yes配置为只读模式。由于复制只能从master到slave,对于slave的任何修改master都无法感知,修改slave节点数据会造成主从数据不一致。因此建议线上不要修改从节点的只读模式。

在从的redis.conf中添加如下
replicaof 172.40.11.18 6379 #启动主从复制
requirepass "111111"
masterauth "111111"
slave-read-only yes

查看主从信息
127.0.0.1:6379> KEYS *
(error) NOAUTH Authentication required.
127.0.0.1:6379>  auth 111111
OK
127.0.0.1:6379> INFO replication
# Replication
role:slave
master_host:172.40.11.18
master_port:6379
master_link_status:up
master_last_io_seconds_ago:5
master_sync_in_progress:0
slave_repl_offset:308
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:4349917446005cf2e4eff8dd06821bbfbcbcf7c1
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:308
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:127
repl_backlog_histlen:182

主从手动切换 

先在slave执行如下命令
SLAVEOF NO ONE
然后在slave执行如下命令
 slaveof 172.40.11.19 6379 #指定新的主
 在原来的主上也执行这个命令

3 配置Sentinel哨兵模式

Redis的哨兵机制存在的意义就是当主从架构中,master发生宕机,无需人工干预,自动实现故障转移。 Redis的Sentinel系统用于管理多个Redis示例,该系统执行以下三个任务: 1.监控(Monitoring): Sentinel 会不断地检查你的master和slave是否运作正常。 2.提醒(Notification): 当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。 3.自动故障迁移(Automatic failover): 当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作, 它会将失效master的其中一个slave升级为新的master,并让失效master的其他slave改为复制新的master;当客户端试图连接失效的master时,集群也会向客户端返回新master的地址, 使得集群可以使用新master代替失效服务器。

配置Sentinel哨兵模式

4 redis漂移VIP

这里可以使用redis sentinel的一个参数client-reconfig-script,这个参数配置执行脚本,sentinel在做failover的时候会执行这个脚本,并且传递6个参数<master-name>、 <role>、 <state>、 <from-ip>、 <from-port>、 <to-ip> 、<to-port>,其中<to-ip>是新主redis的IP地址,可以在这个脚本里做VIP漂移操作。

 sentinel client-reconfig-script mymaster /opt/redis/failover.sh

 脚本内容
#########################################################################
# File Name: /opt/redis/failover.sh
#########################################################################
# 一定要用root用户运行
#!/bin/bash
MY_IP='172.40.11.18'   # 每个Server本身的IP
VIP='172.40.11.21'     # VIP
NETMASK='24'          # Netmask
INTERFACE='bond0'      # 接口

while true;do
    MASTER_IP=(redis-cli -h 127.0.0.1 -p 26379 info sentinel | grep address | cut -d, -f3 | cut -d= -f2 | cut -d: -f1)
    if [{MASTER_IP} = {MY_IP} ]; then
        ip -4 addr | grepVIP || (/sbin/ip addr add {VIP}/{NETMASK} dev {INTERFACE};/sbin/arping -q -c 3 -A{VIP} -I {INTERFACE})
    else
        ip -4 addr | grepVIP && /sbin/ip addr del {VIP}/{NETMASK} dev ${INTERFACE}
    fi
    sleep 10;
done

添加执行权限chmod 755 /opt/redis/failover.sh
需要注意的是,当你第一次使用脚本的时候,要在主节点上手动创建VIP
ip addr add 172.40.11.21/24 dev bond0
arping -q -c 3 -A 172.40.11.21 -I em1

总结:
使用redis主从 + 哨兵(sentinel)+ 漂移VIP的方案搭建了一个redis高可用系统,但这个系统保证的是单个redis实例的高可用,所以适合业务比较小的应用。如果业务比较大,并发量比较高,建议搭建redis集群,比如官方redis cluster,还有开源的codings集群。

5 redis持久化

Redis 4.0 开始支持 RDB 和 AOF 的混合持久化(默认关闭,可以通过配置项 aof-use-rdb-preamble 开启)。
如果把混合持久化打开,AOF 重写的时候就直接把 RDB 的内容写到 AOF 文件开头。这样做的好处是可以结合 RDB 和 AOF 的优点, 快速加载同时避免丢失过多的数据。当然缺点也是有的, AOF 里面的 RDB 部分就是压缩格式不再是 AOF 格式,可读性较差。
  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的微信公众号
  • 我的微信公众号扫一扫
  • weinxin
avatar

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: