环境说明
系统 | 主机名 | 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 格式,可读性较差。
- 我的微信
- 这是我的微信扫一扫
- 我的微信公众号
- 我的微信公众号扫一扫