Redis高可用简易搭建

redis主从复制原理
, 1. 收到replication的指示
2. 建立socket连接到master,准备发送ping命令个master
3. 发送ping给master后,等待master的回复
4. 等待master传送rdb文件->收到rdb文件后,完成replication建立。额外的ping命令是redis应用层校验连接成功的额外过程。
Linux 安装 redis
tar -xf redis-2.8.17.tar.gz
cd redis-2.8.17
make
2,配置环境变量
vim /root/.bash_profile
REDIS=/softvare/redis-2.8.3/src PATH=$PATH:$MYSQL/bin:$REDIS export PATH

3,redis高可用架构搭建
1,环境
#redis
172.18.5.54:6379 主库
172.18.5.53:6379 从库
172.18.5.29:6379 从库
172.18.5.60 vip
#sentinel
172.18.5.54:26379 本地节点
172.18.5.53:26379 本地节点
172.18.5.29:26379 仲裁节点
2,部署(统一将配置文件放在/etc下)
vim /etc/redis.conf
daemonize  yes # redis起服务挂后台
pidfile  "/var/run/redis.pid" #redis pid文件位置
port 6379 #redis端口
tcp-backlog 65535 #传输日志时最大queue为65535
bind 0.0.0.0 #绑定主机ip 默认为127.0.0.1
timeout 0 #超时时间 默认300s
tcp-keepalive 0 #client和redis_server为长连接
loglevel notice #日志登记
logfile  "/var/log/redis/redis_6379.log" #日志路径
maxmemory 8gb #最大内存
maxmemory-policy allkeys-lru #设置过期key的处理方式 为删除lru算法的key
#volatile-lru 支队设置里过期时间的key进行lru volatile-random 随机删除即将过期key
#allkeys-random 随机删除 volatile-ttl 删除即将过期的 noeviction 永不过期 返回错误
databases 16 #可用数据库数
save 900 1 #save <seconds><changes> 在多长时间内,有多少次更新 将数据同步至数据文件
save 300 10
save 60 10000
stop-writes-on-bgsave-error  yes #在redis 持久化过程中出现问题 改参数不允许用户进行任何update 避免人为强制停止redis 快照
rdbcompression  yes #存储到本地数据库是否压缩数据
rdbchecksum  yes #开启文件校验 没有检验的rbd文件会有一个0检验位 告诉加载代码跳过校验检查
dbfilename  "dump.rdb" #本地redis数据库文件名
dir   "/data/redis/6379/" #本地redis数据库存放路径
slave-serve-stale-data  yes # slave仍会响应客户端请求,此时可能会有问题
slave- read -only  yes #slave设置为只读
repl-disable-tcp-nodelay no # no 代表redis master 会立即发送同步数据 没有延迟 yes代表redis会合并小的tcp包从而节省带宽 但会增加主从同步延迟 造成数据有差异
slave-priority 100 #主宕机后 slave端的优先级设置 数值越小优先级越高 0代表永远不会被选择
appendonly no #是否启用aof模式
appendfilename  "appendonly.aof" #设置aof的文件名
appendfsync everysec #每秒钟刷一次数据到数据文件
no-appendfsync-on-rewrite no #当主进程在想磁盘写操作时 将会阻止其他fsync操作
auto-aof-rewrite-percentage 100 #aof文件触发自动rewrite的百分比 0代表禁用rewrite
auto-aof-rewrite-min-size 64mb #aof文件触发自动rewrite的最小文件size
lua- time -limit 5000 #设置lua脚本的最大运行时间 ms单位
slowlog-log-slower-than 10000 #redis执行时长超过100000微妙会被计入slowlog
slowlog-max-len 128 #设置slowlog的长度 当一个新的slow_log被记录时 最久的命令会被移除
notify-keyspace-events  "" #事件通知默认不启用
hash -max-ziplist-entries 512 #当数据量少且最大不会超过阈值时 hash将会使用一个很高效的数据结构存储数据
hash -max-ziplist-value 64
list-max-ziplist-entries 512 #与hash类似
list-max-ziplist-value 64
set -max-intset-entries 512
zset-max-ziplist-entries 128

3,vim sentinel.conf (主从moniter设置)
daemonize  yes
port 26379
dir   "/data/redis/redis_sentinels"
pidfile  "/var/run/sentinel.pid"
logfile  "/var/log/sentinel.log"
sentinel monitor 主hostname 主ip 主端口 2 #2个以上判定主失效才会切换
sentinel down-after-milliseconds 主hostname 6000
sentinel failover-timeout 主hostname 18000
sentinel client-reconfig-script 主hostname /opt/notify_master6400.sh    ##仲裁节点无需添加这行配置,client-reconfig-script参数是在sentinel做failover的过程中调用脚本漂vip到新的master上
4,编写vip脚本(主从设置)
vim /opt/notify_master.sh
 
#!/bin/bash
MASTER_IP=$6
LOCAL_IP= '主库ip'   #从库修改为从库ip
VIP= '172.18.5.60 '
NETMASK= '24'          
INTERFACE= 'eth0'  
if   [ ${MASTER_IP} = ${LOCAL_IP} ];  then
          /sbin/ip   addr add ${VIP}/${NETMASK} dev ${INTERFACE}
          /sbin/arping   -q -c 3 -A ${VIP} -I ${INTERFACE}
         exit   0
else
          /sbin/ip   addr del ${VIP}/${NETMASK} dev ${INTERFACE}
         exit   0
fi
exit   1
5, chmod   +x /opt/notify_master.sh    #赋予可执行权限
这里大概说一下这个脚本的工作原理,sentinel在做failover的 过程中会传出6个参数,分别是<master-name>、 <role>、 <state>、 <from-ip>、 <from-port>、 <to-ip> 、<to-port>,其中第6个参数from-ip也就是新的master的ip,对应脚本中的MASTER_IP,下面的if判断大家应该都很了然了,如果MASTER_IP=LOCAL_IP,那就绑定VIP,反之删除VIP。

6,启动redis服务(master_slave)
redis-server /etc/redis.conf
7,初始化主从
redis-cli -p 6379 -h 172.18.5.53 slaveof 172.18.5.54 6379
8,绑定vip到master(172.18.5.54)
ip addr add 172.18.5.60/24 dev eth0
9,启动sentinel服务(master——slave,监听服务器)
redis-server /etc/sentinel.conf --sentinel

over 搭建完毕

10,检测高可用架构可行性
[root@mymaster redis-2.8.3]# redis-cli -h 172.18.5.54 -p 6379 info replication
# Replication
role:master
connected_slaves:2
slave0:ip=172.18.5.53,port=6379,state=online,offset=25110,lag=1
slave1:ip=172.18.5.29,port=6379,state=online,offset=25247,lag=0
master_repl_offset:25247
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:25246

猜你喜欢

转载自blog.csdn.net/lyk_for_dba/article/details/77154456