博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
高可用redis 缓存搭建
阅读量:5270 次
发布时间:2019-06-14

本文共 7594 字,大约阅读时间需要 25 分钟。

一、下载安装

yum install -y gcc-c++ tcl #依赖问题 wget http://download.redis.io/releases/redis-4.0.1.tar.gz #下载 tar xzf redis-4.0.1.tar.gz #解压 mv redis-4.0.0.1 /usr/local/redis #移动文件夹到usr localcd /usr/local/redis #进入目录安装 make #安装

二、环境变量配置

ln -s /usr/local/redis-4.0.1/src/redis-server /usr/bin/redis-server #建立软连接ln -s /usr/local/redis-4.0.1/src/redis-cli /usr/bin/redis-cli

三、配置文件解析

daemonize  yes               #redis进程是否以守护进程的方式运行,yes为是,no为否(不以守护进程的方式运行会占用一个终端)pidfile /var/run/redis.pid  #指定redis进程的PID文件存放位置port 6379                   #redis进程的端口号bind 127.0.0.1              #绑定的主机地址(一般修改为本机IP地址) logfile ""           #logfile /var/log/redis_6379.log log地址 #requirepass foobared    #取消注释 设置密码 requirepass "123456"timeout  300                #客户端闲置多长时间后关闭连接,默认此参数为0即关闭此功能loglevel verbose            #redis日志级别,可用的级别有debug.verbose.notice.warninglogfile stdout              #log文件输出位置,如果进程以守护进程的方式运行,此处又将输出文件设置为stdout的话,就会将日志信息输出到/dev/null里面去了databases 16                #设置数据库的数量,默认为0可以使用select 
命令在连接上指定数据库idsave
#指定在多少时间内刷新次数达到多少的时候会将数据同步到数据文件;rdbcompression yes #指定存储至本地数据库时是否压缩文件,默认为yes即启用存储;dbfilename dump.db #指定本地数据库文件名dir ./ #指定本地数据问就按存放位置;#slaveof
#指定当本机为slave服务时,设置master服务的IP地址及端口,在redis启动的时候他会自动跟master进行数据同步masterauth
#当master设置了密码保护时,slave服务连接master的密码;requirepass footbared #设置redis连接密码,如果配置了连接密码,客户端在连接redis是需要通过AUTH
命令提供密码,默认关闭maxclients 128 #设置同一时间最大客户连接数,默认无限制;redis可以同时连接的客户端数为redis程序可以打开的最大文件描述符,如果设置 maxclients 0,表示不作限制。当客户端连接数到达限制时,Redis会关闭新的连接并向客户端返回max number of clients reached错误信息maxmemory
#指定Redis最大内存限制,Redis在启动时会把数据加载到内存中,达到最大内存后,Redis会先尝试清除已到期或即将到期的Key,当此方法处理 后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。Redis新的vm机制,会把Key存放内存,Value会存放在swap区appendonly no #指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为 redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认为noappendfilename appendonly.aof #指定跟新日志文件名默认为appendonly.aofappendfsync everysec #指定更新日志的条件,有三个可选参数no:表示等操作系统进行数据缓存同步到磁盘(快),always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全), everysec:表示每秒同步一次(折衷,默认值);

四、使用与优化

1.常用操作

启动(必须跟随配置文件)

/usr/local/redis/bin/redis-server /etc/redis.conf

关闭(shutdown)

/usr/local/redis/bin/redis-cli -h 127.0.0.1 -p 6379 shutdown

 

2.运维配置

>开机启动

echo "/usr/local/redis/bin/redis-server /etc/redis.conf" >> /etc/rc.local

>防火墙端口

添加规则:iptables -I INPUT -p tcp -m tcp --dport 6379 -j ACCEPT

保存规则:service iptables save
重启 iptables:service iptables restart

>添加到系统服务

vi /etc/init.d/redis

#!/bin/sh  #  # redis - this script starts and stops the redis-server daemon  #  # chkconfig:   - 85 15  # description:  Redis is a persistent key-value database  # processname: redis-server  # config:      /usr/local/redis/bin/redis-server# config:      /etc/redis.conf  # Source function library.  . /etc/rc.d/init.d/functions  # Source networking configuration.  . /etc/sysconfig/network  # Check that networking is up.  [ "$NETWORKING" = "no" ] && exit 0  redis="/usr/local/redis/bin/redis-server" prog=$(basename $redis)  REDIS_CONF_FILE="/etc/redis.conf" [ -f /etc/sysconfig/redis ] && . /etc/sysconfig/redis  lockfile=/var/lock/subsys/redis  start() {      [ -x $redis ] || exit 5      [ -f $REDIS_CONF_FILE ] || exit 6      echo -n $"Starting $prog: "      daemon $redis $REDIS_CONF_FILE      retval=$?      echo      [ $retval -eq 0 ] && touch $lockfile      return $retval  }  stop() {      echo -n $"Stopping $prog: "      killproc $prog -QUIT      retval=$?      echo      [ $retval -eq 0 ] && rm -f $lockfile      return $retval  }  restart() {      stop      start  }  reload() {      echo -n $"Reloading $prog: "      killproc $redis -HUP      RETVAL=$?      echo  }  force_reload() {      restart  }  rh_status() {      status $prog  }  rh_status_q() {      rh_status >/dev/null 2>&1  }  case "$1" in      start)          rh_status_q && exit 0          $1          ;;      stop)          rh_status_q || exit 0          $1          ;;      restart|configtest)          $1          ;;      reload)          rh_status_q || exit 7          $1          ;;      force-reload)          force_reload          ;;      status)          rh_status          ;;      condrestart|try-restart)          rh_status_q || exit 0      ;;      *)          echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart| reload|orce-reload}"          exit 2  esac

五、主从架构搭建(两台)

优势:减少主库连接压力,持久化功能交给从库处理。

劣势:从库只读不可写

超过两台的主从架构需要注意

从库1配置连接主库,从库2配置连接从库1

主机配置文件采用正常单机配置

从机配置文件修改

slaveof 192.168.32.3 6379 修改为主机ip

然后连接机器输入INFO replication 可查询到相关主从信息

# Replicationrole:masterconnected_slaves:1slave0:ip=172.16.2.181,port=6379,state=online,offset=28,lag=1master_replid:625ae9f362643da5337835beaeabfdca426198c7master_replid2:0000000000000000000000000000000000000000master_repl_offset:28second_repl_offset:-1repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:1repl_backlog_histlen:28

从机

# Replicationrole:slavemaster_host:172.16.2.185master_port:6379master_link_status:upmaster_last_io_seconds_ago:3master_sync_in_progress:0slave_repl_offset:210slave_priority:100slave_read_only:1connected_slaves:0master_replid:625ae9f362643da5337835beaeabfdca426198c7master_replid2:0000000000000000000000000000000000000000master_repl_offset:210second_repl_offset:-1repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:1repl_backlog_histlen:210

六、Redis Sentinel 自动故障转移搭建

搭建至少需要3台

 vi /etc/sentinel.conf

protected-mode nosentinel monitor mymaster 172.16.2.185 6379 2# redis在搭建时设置了密码,所以要进行密码配置sentinel auth-pass mymaster “123456“#5秒内mymaster没有响应,就认为SDOWNsentinel down-after-milliseconds mymaster 5000  sentinel failover-timeout  mymaster 15000logfile /var/log/sentinel.logpidfile  /var/run/sentinel.piddaemonize yes1.port :当前Sentinel服务运行的端口2.dir : Sentinel服务运行时使用的临时文件夹3.sentinel monitor master001 192.168.110.10163792:Sentinel去监视一个名为master001的主redis实例,这个主实例的IP地址为本机地址192.168.110.101,端口号为6379,而将这个主实例判断为失效至少需要2个 Sentinel进程的同意,只要同意Sentinel的数量不达标,自动failover就不会执行4.sentinel down-after-milliseconds master001 30000:指定了Sentinel认为Redis实例已经失效所需的毫秒数。当实例超过该时间没有返回PING,或者直接返回错误,那么Sentinel将这个实例标记为主观下线。只有一个 Sentinel进程将实例标记为主观下线并不一定会引起实例的自动故障迁移:只有在足够数量的Sentinel都将一个实例标记为主观下线之后,实例才会被标记为客观下线,这时自动故障迁移才会执行5.sentinel parallel-syncs master001 1:指定了在执行故障转移时,最多可以有多少个从Redis实例在同步新的主实例,在从Redis实例较多的情况下这个数字越小,同步的时间越长,完成故障转移所需的时间就越长6.sentinel failover-timeout master001 180000:如果在该时间(ms)内未能完成failover操作,则认为该failover失败7.sentinel notification-script  :指定sentinel检测到该监控的redis实例指向的实例异常时,调用的报警脚本。该配置项可选,但是很常用

七、漂移VIP实现Redis故障转移

sentinel client-reconfig-script mymaster /opt/notify_mymaster.sh

脚本信息

vi /opt/notify_mymaster.sh#!/bin/bashecho "File Name: $0"echo "Quoted Values: $@"echo "Quoted Values: $*"echo "Total Number of Parameters : $#"MASTER_IP=${
6} #第六个参数是新主redis的ip地址LOCAL_IP='172.16.2.185' #当前服务器IP,主机172.16.2.185,从机172.16.2.181VIP='172.16.2.250'NETMASK='24'INTERFACE='eth1'if [ ${MASTER_IP} = ${LOCAL_IP} ]; then sudo /sbin/ip addr add ${VIP}/${NETMASK} dev ${INTERFACE} #将VIP绑定到该服务器上 sudo /sbin/arping -q -c 3 -A ${VIP} -I ${INTERFACE} exit 0else sudo /sbin/ip addr del ${VIP}/${NETMASK} dev ${INTERFACE} #将VIP从该服务器上删除 exit 0fiexit 1 #如果返回1,sentinel会一直执行这个脚本

 

chmod 755 /opt/notify_mymaster.sh

绑定vip

/sbin/ip  addr add 172.16.2.250/24 dev eth1

/sbin/arping -q   -c 3 -A 172.16.2.250 -I eth1

 

由于VIP只能绑定只有一台机子,所以建议将改为bind 0.0.0.0添加至redis.conf 中

INFO sentinel 查看哨兵信息

info memory 内存信息

mem_fragmentation_ratio rss/used  分配内存和已使用内存比例

 

参考:https://mp.weixin.qq.com/s/SjmDxGnnmhLUJgGAbLaszA

转载于:https://www.cnblogs.com/maoxianfei/p/8490025.html

你可能感兴趣的文章
CSS盒子模型
查看>>
City Tour
查看>>
在Ubuntu下安装PostgreSQL
查看>>
Ionic2学习笔记(2):自定义Component
查看>>
saltops 安装及相关环境安装
查看>>
LightOJ 1236 Pairs Forming LCM(算术基本定理)
查看>>
WPF DataGridTextColum 显示时间格式化
查看>>
js数组
查看>>
插入排序——java实现
查看>>
『jQuery』名称冲突
查看>>
SRF之数据字典
查看>>
[原]SQL_实验2.1.3 清华大学出版社
查看>>
jQuery 2.0.3 源码分析 回调对象
查看>>
Android Scrollview嵌套下listView动态加载数据,解决onScrollChanged执行多次数据重复问题...
查看>>
蓝桥杯 第三届C/C++预赛真题(4) 奇怪的比赛(递归)
查看>>
JsonArray和JsonObject遍历方法
查看>>
JavaScript中解析JSON数据的三种方法
查看>>
最新版的Chrome不能设置网页编码怎么解?
查看>>
java.lang.String 类的所有方法
查看>>
自己写的一个javascriptsort万能比较函数
查看>>