网站设计与开发公司,网站开发 设置背景图片,房产信息网查不到楼盘信息,eyoucms模板前言#xff1a;数据库读取速度较慢一直是无法解决的问题#xff0c;大型网站应对的方式主要是使用缓存服务器来缓解这种情况#xff0c;减少数据库访问次数#xff0c;以提高动态Web等应用的速度、提高可扩展性。
1、简介
Memcached/redis是高性能的分布式内存缓存服务器…前言数据库读取速度较慢一直是无法解决的问题大型网站应对的方式主要是使用缓存服务器来缓解这种情况减少数据库访问次数以提高动态Web等应用的速度、提高可扩展性。
1、简介
Memcached/redis是高性能的分布式内存缓存服务器,通过缓存数据库查询结果减少数据库访问次数以提高动态Web等应用的速度、 提高可扩展性。
2、memcache
2.1、memcache简介
memcache特点如下
内置内存存储方式数据完全不走硬盘重启操作系统会导致全部数据消失。简单key/value存储服务器不关心数据本身的意义及结构只要是可序列化数据即可所以极其方便读取。 存储项由“键、过期时间、可选的标志及数据”四个部分组成不互相通信的分布式memcached尽管是“分布式”缓存服务器但服务器端并没有分布式功能。 各个memcached不会互相通信以共 享信息由客户端决策信息存放位置。
memcache工作流程
检查用户请求的数据是缓存中是否有存在如果有存在的话只需要直接把请求的数据返回无需查询数据库。如果请求的数据在缓存中找不到这时候再去查询数据库。返回请求数据的同时把数据存储到缓存中一份。保持缓存的“新鲜性”每当数据发生变化的时候比如数据有被修改或被删除的情况下要同步的更新缓存信息确保用户不会在缓存取到旧的数据。
2.2、memcache部署
下述环境已提前更换阿里基础仓房epel源关闭防火墙和selinux
[rootlocalhost ~]# yum install -y memcached修改配置文件
[rootlocalhost ~]# vim /etc/sysconfig/memcached
[rootlocalhost ~]# cat /etc/sysconfig/memcached
PORT11211 # Memcached服务监听的端口号
USERmemcached # 运行Memcached服务的用户
MAXCONN1024 # 允许的最大并发连接数
CACHESIZE64 # Memcached的缓存大小单位为MB可以根据内存大小进行调整
OPTIONS # 其他启动选项例如可用于设置内存分配策略或其他配置启动memcache
[rootlocalhost ~]# systemctl start memcached[rootlocalhost ~]# ps aux | grep memcache
memcach 62086 0.0 0.1 344100 1688 ? Ssl 22:20 0:00 /usr/bin/memcached -u memcached -p 11211 -m 64 -c 1024
root 62095 0.0 0.0 112824 988 pts/0 R 22:21 0:00 grep --colorauto memcache尝试简单的memcache的使用实际功能中此处为应用程序逻辑设计和运维无关此处仅为测试memcache功能使用
[rootlocalhost ~]# yum install -y telnet
[rootlocalhost ~]# telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is ^].
set name 0 900 9
liumuquan
STORED
get name
VALUE name 0 9
liumuquan
END
^]
telnet quit
Connection closed.# 此处set参数解释# set key的名字 key的id号 缓存过期时间(0为无限) 字符串最大长度
memcache这里简单整理了一下主要重心还是放在redis上redis对于memcache优势太明显了。
3、redis
3.1、redis简介
redis是一个开源的、使用C语言编写的、支持网络交互的、可基于内存也可持久化的Key-Value数据库。目前Vmware在资助着redis项目的开发和维护。目前使用redis公司主要有暴雪、github、digg等。
redis特点丰富的数据结构、支持持久化、支持事务可以做集群分布式保证数据安全、支持主从。
3.2、redis部署
基础环境
IP角色192.168.188.128master1
安装redis
[rootlocalhost ~]# wget http://download.redis.io/releases/redis-4.0.9.tar.gz -O /redis-
[rootlocalhost ~]# cd /
[rootlocalhost /]# tar zxf redis-4.0.9.tar.gz
[rootlocalhost /]# cd redis-4.0.9
[rootlocalhost redis-4.0.9]# pwd
/redis-4.0.9
[rootlocalhost redis-4.0.9]# make
配置开机启动
[rootlocalhost redis-4.0.9]# mkdir /etc/redis
[rootlocalhost redis-4.0.9]# cp /redis-4.0.9/redis.conf /etc/redis/6379.conf
[rootlocalhost redis-4.0.9]# cp /redis-4.0.9/utils/redis_init_script /etc/init.d/redis编辑启动文件此处尽量全文复制后台运作容易遗忘
[rootlocalhost redis-4.0.9]# vim /etc/init.d/redis
[rootlocalhost redis-4.0.9]# cat /etc/init.d/redis
#!/bin/sh
#
# Simple Redis init.d script conceived to work on Linux systems
# as it does use of the /proc filesystem.
# chkconfig: 2345 10 90
# description: Start and Stop redisREDISPORT6379
#EXEC/usr/local/bin/redis-server
EXEC/redis-4.0.9/src/redis-server
#CLIEXEC/usr/local/bin/redis-cli
CLIEXEC/redis-4.0.9/src/redis-cliPIDFILE/var/run/redis_${REDISPORT}.pid
CONF/etc/redis/${REDISPORT}.confcase $1 instart)if [ -f $PIDFILE ]thenecho $PIDFILE exists, process is already running or crashedelseecho Starting Redis server...$EXEC $CONF fi;;stop)if [ ! -f $PIDFILE ]thenecho $PIDFILE does not exist, process is not runningelsePID$(cat $PIDFILE)echo Stopping ...$CLIEXEC -p $REDISPORT shutdownwhile [ -x /proc/${PID} ]doecho Waiting for Redis to shutdown ...sleep 1doneecho Redis stoppedfi;;*)echo Please use start or stop as first argument;;
esac
[rootlocalhost redis-4.0.9]# chmod x /etc/init.d/redis
[rootlocalhost redis-4.0.9]# chkconfig --add redis# 这个命令是老版本centos添加开机启动项用的这里是按照官方文档选用的这种方式[rootlocalhost redis-4.0.9]# chkconfig redis on# 设置redis开机启动[rootlocalhost redis-4.0.9]# chkconfig --list注该输出结果只显示 SysV 服务并不包含
原生 systemd 服务。SysV 配置数据
可能被原生 systemd 配置覆盖。 要列出 systemd 服务请执行 systemctl list-unit-files。查看在具体 target 启用的服务请执行systemctl list-dependencies [target]。netconsole 0:关 1:关 2:关 3:关 4:关 5:关 6:关
network 0:关 1:关 2:开 3:开 4:开 5:开 6:关
redis 0:关 1:关 2:开 3:开 4:开 5:开 6:关# 这里的0-6对应的是centos的0-6状态1是单用户模式[rootlocalhost redis-4.0.9]# systemctl daemon-reload# 重新加载自启动信息[rootlocalhost redis-4.0.9]# systemctl start redis
[rootlocalhost redis-4.0.9]# systemctl status redisredis测试
[rootlocalhost redis-4.0.9]# /redis-4.0.9/src/redis-cli
127.0.0.1:6379 set name liumuquan
OK
127.0.0.1:6379 get name
liumuquan
127.0.0.1:6379 3.3、redis持久化
3.3.1、持久化简介
Redis 持久化是指将 Redis 内存中的数据持久化保存到硬盘上以防止服务器重启或宕机时数据丢失。在 Redis 中有两种主要的持久化方式RDBRedis DataBase和 AOFAppend Only File。 RDB 持久化 RDB 持久化通过定期将 Redis 内存中的数据快照写入磁盘来实现。管理员可以配置 Redis 定期将内存中的数据以快照的形式保存到一个 .rdb 文件中。这种方式类似于拍照Redis 在指定的时间点将当前的数据状态保存下来。这种方式适合用于备份恢复较大数据集时速度较快因为只需要读取一个文件即可还原数据。 AOF 持久化 AOF 持久化则是通过记录 Redis 服务器所执行的写命令例如 SET、INCR 等来记录数据变化。这些命令以追加的方式写入一个文件中称为 AOF 文件。这种方式类似于录制操作日志Redis 在执行写命令时将其追加到文件末尾。当服务器需要恢复时会重新执行 AOF 文件中的命令从而重建数据状态。AOF 文件通常比 RDB 文件更大因为它记录了每个写操作但它提供了更精细的数据恢复和更小的数据丢失风险。
大概可以这么理解 RDB 类比想象你在玩一个游戏游戏允许你在每个关卡结束时保存进度。这样即使你在下一个关卡失败你可以重新加载上一个关卡的进度并继续游戏。 AOF 类比而 AOF 则像你在玩一个没有保存功能的游戏但它可以记录下你每一步的操作。如果你因为失误或游戏崩溃而需要重新开始你可以根据你的操作日志重新执行每一步从而恢复到你离开的地方虽然过程有点麻烦但是保证了你不会丢失任何进度。
两种方法虽然有不同但是由于实际使用中的特殊性当不需要数据安全时两个全关就行需要时双开因RDB数据不实时但同时使用两者时服务器只会找AOF文件,所以RDB留作万一的手段。
3.3.2、配置redis持久化
RDB默认开启查看配置
[rootlocalhost ~]# vim /redis-4.0.9/redis.confdbfilename dump.rdb
#使用RDB时持久化存在本地的文件叫dump.rdbdir ./
#持久化数据存储在本地的路径save 900 1
save 300 10
save 60 10000
#触发快照的时机
#save 多少时间内 被改过多少次
#出发以上条件就会被拍摄快照stop-writes-on-bgsave-error yes
#当snapshot时出现错误无法继续时是否阻塞客户端“变更操作”“错误”可能因为磁盘已满/磁盘故障/OS级别异常等这里配置的是报错拒绝继续写入rdbcompression yes
#是否启用rdb文件压缩默认为“yes”压缩很占用cpu同时同时可以节省存储空间和减少网络传输时间
客户端使用命令进行持久化save存储
[rootlocalhost ~]#./redis-cli -h ip -p port save
#前台进行存储
[rootlocalhost ~]#./redis-cli -h ip -p port bgsave
#后台进行存储#每次快照持久化都是将内存数据完整写入到磁盘一次并不是增量的只同步脏数据。如果数据量大的话而且写操作比较多必然会引起大量的磁盘io操作可能会严重影响性能。
AOF默认关闭开启方式
[rootlocalhost ~]# vim /redis-4.0.9/redis.conf##此选项为aof功能的开关默认为“no”可以通过“yes”来开启aof功能
##只有在“yes”下aof重写/文件同步等特性才会生效
appendonly yes appendfilename appendonly.aof
#指定aof文件名称appendfsync everysec
#指定aof操作中文件同步策略有三个合法值always everysec no,默认为everysec
#这行指令设置了 AOF 文件的同步方式。everysec 表示每秒钟将 AOF 文件同步到磁盘一次以确保即使系统崩溃最多丢失一秒钟的数据。no-appendfsync-on-rewrite no
#在aof-rewrite(重写)期间appendfsync是否暂缓文件同步no表示“不暂缓”“yes”表示“暂缓”默认为“no”auto-aof-rewrite-min-size 64mb
#触发aof rewrite的最小文件尺寸auto-aof-rewrite-percentage 100
#这行指令设置了触发自动 AOF 重写的增长百分比。100 表示当当前 AOF 文件大小比上一次重写时的大小增长了 100%即翻倍时触发自动 AOF 重写。重写是为了使aof体积保持最小而确保保存最完整的数据。
3.4、redis主从
3.4.1、redis主从简介 用法 Redis支持类似于MySQL的主从结构允许配置一主多从甚至多级从结构。主从结构旨在提供冗余备份和增强读性能例如将性能消耗较大的SORT操作分担给从服务器。Redis的主从同步是异步进行的不会影响主服务器的主要逻辑或性能。在主从架构中可以考虑关闭主服务器的数据持久化由从服务器承担这一任务以提高主服务器的处理性能。通常情况下从服务器设置为只读以防止误修改数据但仍可接受CONFIG等命令。对于不安全的网络环境建议重命名重要命令以避免误操作。 原理 从服务器通过发送SYNC指令向主服务器请求同步。主服务器收到SYNC指令后会执行BGSAVE命令生成RDB文件进行数据持久化。在持久化期间主服务器将所有写操作缓存在内存中。BGSAVE完成后主服务器将RDB文件发送给从服务器从服务器将文件存储到磁盘并加载到内存。然后主服务器以Redis协议格式将缓存的写操作发送给从服务器。即使多个从服务器同时发出SYNC指令主服务器也只执行一次BGSAVE并将生成的RDB文件发送给所有从服务器。在Redis 2.8版本之前主从断开连接后会进行全量数据同步而2.8版本后支持高效的增量同步显著降低了连接断开恢复成本。主服务器在内存中维护缓冲区用于存储将发送给从服务器的内容。如果从服务器与主服务器连接断开从服务器会尝试重新连接成功后发送“希望同步的主服务器ID”和“希望请求的复制偏移量”。主服务器验证ID匹配后检查缓冲区中是否存在请求的偏移量并根据需要向从服务器发送增量内容。增量同步功能需要服务器端支持全新的PSYNC指令该指令从Redis 2.8版本开始提供。
3.4.2、 redis主从部署
3.4.2.1、基础环境
IP角色192.168.188.128master192.168.188.129slave1192.168.188.130slave2
在slave1和slave2上部署上redis
slave1操作如下
[rootlocalhost /]# tar xf redis-4.0.9.tar.gz
[rootlocalhost /]# cd /redis-4.0.9
[rootlocalhost redis-4.0.9]# make
[rootlocalhost redis-4.0.9]# mkdir /etc/redis
[rootlocalhost redis-4.0.9]# cp /redis-4.0.9/redis.conf /etc/redis/6379.conf
[rootlocalhost redis-4.0.9]# cp /redis-4.0.9/utils/redis_init_script /etc/init.d/redis
[rootlocalhost redis-4.0.9]# vim /etc/init.d/redis
[rootlocalhost redis-4.0.9]# vim /etc/init.d/redis
[rootlocalhost redis-4.0.9]# cat /etc/init.d/redis
#!/bin/sh
#
# Simple Redis init.d script conceived to work on Linux systems
# as it does use of the /proc filesystem.
# chkconfig: 2345 10 90
# description: Start and Stop redisREDISPORT6379
#EXEC/usr/local/bin/redis-server
EXEC/redis-4.0.9/src/redis-server
#CLIEXEC/usr/local/bin/redis-cli
CLIEXEC/redis-4.0.9/src/redis-cliPIDFILE/var/run/redis_${REDISPORT}.pid
CONF/etc/redis/${REDISPORT}.confcase $1 instart)if [ -f $PIDFILE ]thenecho $PIDFILE exists, process is already running or crashedelseecho Starting Redis server...$EXEC $CONF fi;;stop)if [ ! -f $PIDFILE ]thenecho $PIDFILE does not exist, process is not runningelsePID$(cat $PIDFILE)echo Stopping ...$CLIEXEC -p $REDISPORT shutdownwhile [ -x /proc/${PID} ]doecho Waiting for Redis to shutdown ...sleep 1doneecho Redis stoppedfi;;*)echo Please use start or stop as first argument;;
esac[rootlocalhost redis-4.0.9]# scp /etc/init.d/redis 192.168.188.130:/etc/init.d/
[rootlocalhost redis-4.0.9]# chmod x /etc/init.d/redis
[rootlocalhost redis-4.0.9]# chkconfig --add redis
[rootlocalhost redis-4.0.9]# chkconfig redis on
[rootlocalhost redis-4.0.9]# systemctl daemon-reload
[rootlocalhost redis-4.0.9]# systemctl start redisslave2操作同slave1
3.4.2.2、master配置
[rootlocalhost ~]# vim /etc/redis/6379.conf#bind 127.0.0.1
#注释掉
bind 0.0.0.0
#增加监听地址为所有ip#protected-mode yes
protected-mode no
#关闭保护模式[rootlocalhost ~]# systemctl restart redis
3.4.2.3、salve1配置
[rootlocalhost redis-4.0.9]# vim /etc/redis/6379.confslaveof 192.168.188.128 6379
#bind 127.0.0.1
bind 0.0.0.0
#protected-mode yes
protected-mode no[rootlocalhost redis-4.0.9]# systemctl restart redis
3.4.2.3、salve2配置
同slave1
3.4.3、redis主从测试
在master上
[rootlocalhost ~]# /redis-4.0.9/src/redis-cli
127.0.0.1:6379 set your_id 1210
OK
127.0.0.1:6379 get your_id
1210
#查询主从状态
127.0.0.1:6379 info replication
# Replication
role:master
connected_slaves:2
slave0:ip192.168.188.129,port6379,stateonline,offset1557,lag1
slave1:ip192.168.188.130,port6379,stateonline,offset1557,lag0
master_replid:65eda2694558d007f08f5645d92fb67c4423c265
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1557
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:1557
127.0.0.1:6379
在slave1上
[rootlocalhost redis-4.0.9]# /redis-4.0.9/src/redis-cli
127.0.0.1:6379 get your_id
1210
127.0.0.1:6379 info replication
# Replication
role:slave
master_host:192.168.188.128
master_port:6379
master_link_status:up
master_last_io_seconds_ago:8
master_sync_in_progress:0
slave_repl_offset:1669
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:65eda2694558d007f08f5645d92fb67c4423c265
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1669
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:253
repl_backlog_histlen:1417
127.0.0.1:6379 主从架构实现可以保持数据同步但此时集群无法实现灾备冗余主服务器宕机时从服务器此时无法承担主服务器角色需要使用redis-sentine来实现。
3.5、redis-sentinel
3.5.1、redis-sentinel简介
Redis Sentinel是Redis官方推荐的高可用性HA解决方案允许你创建一个能够自动处理各种故障的Redis部署无需人工干预。
作用
检测Master状态。在Master异常时进行Master-Slave切换将一个Slave提升为新的Master原Master降级为Slave。切换后会自动更新配置文件master_redis.conf会新增slaveof配置sentinel.conf中的监控目标也会相应调整。
工作方式
每个Sentinel每秒向已知的Master、Slave和其他Sentinel实例发送PING命令。如果一个实例超过配置的down-after-milliseconds时间未响应PING命令Sentinel会将其标记为主观下线。Sentinel持续检查主观下线的Master状态确认是否达到客观下线条件。当足够多的Sentinel在指定时间内确认主观下线状态时Master会被标记为客观下线。
3.5.2、redis-sentinel部署
继续使用上面的环境
1)每台机器上修改redis主配置文件设置bind 0.0.0.0略
2每台机器上修改sentinel配置文件
master如下
[rootlocalhost ~]# vim /redis-4.0.9/sentinel.conf
#sentinel monitor mymaster 127.0.0.1 6379 2
sentinel monitor mymaster 192.168.188.128 6379 2# 当集群中有2个超过半数sentinel认为master死了时才能真正认为该master已经不可用了。#sentinel down-after-milliseconds mymaster 30000
sentinel down-after-milliseconds mymaster 3000# 3秒内没收到有效回复后认定主服务器离线默认30秒#sentinel failover-timeout mymaster 180000
sentinel failover-timeout mymaster 10000# 故障发生后10秒内完成选举若sentinel在该配置值内未能完成failover(故障转移)操作即故障时master/slave自动切换则认为本次failover失败。# protected-mode no
protected-mode no# 关闭保护模式
slave1、slave2同上
3启动哨兵三台都要启动
[rootlocalhost ~]# cd /redis-4.0.9
[rootlocalhost redis-4.0.9]# ./src/redis-sentinel sentinel.conf
3.5.3、redis-sentinel测试
关闭主服务器观察从服务器改变状态
在master上使用ctrlc停止当前进程
[rootlocalhost redis-4.0.9]# systemctl stop redis
观察从服务器返回信息 选举slave2成为主服务器slave2状态如下
[rootlocalhost redis-4.0.9]# /redis-4.0.9/src/redis-cli
127.0.0.1:6379 info replication
# Replication
role:master
connected_slaves:2
slave0:ip192.168.188.129,port6379,stateonline,offset63531,lag0
slave1:ip192.168.188.128,port6379,stateonline,offset63531,lag0
master_replid:b417e01353b4a576aaba97987acd33602ba5d9df
master_replid2:bd33fbabce342aeb3ec5c5aa85aaf1a2e5a02b23
master_repl_offset:63676
second_repl_offset:4257
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:63676
127.0.0.1:6379 3.6、redis使用经验
Master的工作不应包括持久化任务如RDB快照和AOF日志文件。如果数据非常重要可以让某个Slave开启AOF备份数据设置为每秒同步一次。为了提高主从复制的速度和连接稳定性最好将Master和Slave部署在同一个局域网内。在主库压力较大时应尽量避免增加从库可以通过为现有从库增加从库来缓解压力。主从复制应采用单向链表结构而不是树状结构例如Master写 - Slave1读 - Slave2读 - Slave3读... 这种结构有助于提高稳定性和处理单点故障问题。如果Master宕机可以立即将Slave1提升为新的Master其他从库保持不变。