memcache&redis构建缓存服务器

Posted 烈火吞噬

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了memcache&redis构建缓存服务器相关的知识,希望对你有一定的参考价值。

memcache&redis构建缓存服务器

前言

学习来源:https://www.bilibili.com/video/BV1eu411Z7Uz?p=1

  • 为什么要使用缓存服务器?
    1. 许多Web应用都将数据保存到RDBMS(关系数据库管理系统)中,应用服务器从中读取数据并在浏览器中显示。
    2. 但随着数据量的增大、访问的集中,就会出现RDBMS的负担加重、数据库响应恶化、网站显示延迟等重大影响。
    3. Memcached/redis是高性能的分布式内存缓存服务器,通过缓存数据库查询结果,减少数据库访问次数,以提高动Web等应用的速度、提高可扩展性

缓存服务器的作用

  • 加快访问速度,缓解数据库压力

NoSQL名词解释——Not Only SQL

  • 为弥补关系型数据库的不足,各种各样的NoSQL数据库应运而生
  • 以键值对的方式存储数据
  • 缓存服务器

NoSQL产品

  • Redis
  • Memcached
  • MongoDB

Memcached

特点:

  • 内置内存存储方式,重启操作系统导致全部数据消失
  • 简单key/value存储,服务器不关心数据本身的意义及结构,只要是可序列化数据即可,存储项由"键、过期时间、可选的标志及数据"四个部分组成;
  • 不互相通信的分布式:memcached尽管是“分布式"缓存服务器,但服务器端并没有分布式功能。各个memcached不会互相通信以共享信息。那么,怎样进行分布式呢?这完全取决于客户端的实现。

服务框架

  • 检查用户请求的数据是缓存中是否有存在,如果有存在的话,只需要直接把请求的数据返回,无需查询数据库。
  • 如果请求的数据在缓存中找不到,这时候再去查询数据库。返回请求数据的同时,把数据存储到缓存中一份。
  • 保持缓存的“新鲜性",每当数据发生变化的时候(比如,数据有被修改,或被删除的情况下),要同步的更新缓存信慎,确保用户不会在缓存取到旧的数据。
# 安装
yum install memcached -y

# 编译安装memcached启动方法 
/usr/local/memcached/bin/memcached -u memcached -p 11211 -m 1500 -c 1024
# 编译安装memcached开机启动
# 把启动命令写到rc.local里面
# 编写shell启动脚本# 修改配置文件
vim /etc/sysconfig/memcached
PORT="11211"      # 同台机编译安装多个memcached,多实例,默认监听端口11211
USER="memcached"  # 运行用户为memcached
MAXCONN="1024"    # 最大连接数1024
CACHESIZE="1500"  # 缓存区大小,单位MB
OPTIONS=""        # 监听网络地址

# 启动
systemctl start memcached
ps aux | grep memcached

# 测试
# 使用memcached原始命令
yum install telnet -y
telnet 192.168.93.11 11211
set name 0 900 5 # 设置名称为name的key name:key的名字自定义 0:key的id号需要和其他的key不一样 900:缓存过期时间单位为秒0为永远 5:字符串最大长度
pakho
# STORED表示存储成功
get name # 查询key给name的值

# 生产环境 web集群+memcached 
# 环境
# php,memcached分离部署
# 前端部署nginx,mysql和PHP服务器
# 需要安装memcached客户端(php-memcached扩展包)
wget http://pecl.php.net/get/memcache-2.2.7.tgz
tar xf memcache-2.2.7.tgz
cd memcache-2.2.7
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config
make && make install
# 独立部署memcached服务器

Redis

# 安装redis
wget http://download.redis.io/releases/redis-4.0.9.tar.gz
tar xf redis-4.0.9.tar.gz -C /usr/local/
cd /usr/local/redis-4.0.9/
make  # 编译安装

# 设置开机启动
mkdir /etc/redis
cp /usr/local/redis-4.0.9/redis.conf /etc/redis/6379.conf            # 拷贝redis配置文件
cp /usr/local/redis-4.0.9/utils/redis_init_script /etc/init.d/redis  # 拷贝redis初始化脚本
# 编写redis初始化配置文件
vim /etc/init.d/redis
5 # chkconfig: 2345 10 90
  # 2345决定redis能够在linux以什么模式启动 用户模式命令行模式图形模式都允许启动redis 10 90 为优先级
6 # description: start and stop redis

9 #EXEC=/usr/local/bin/redis-server     # 修改redis路径
10 EXEC=/usr/local/redis-4.0.9/src/redis-server

11 #CLIEXEC=/usr/local/bin/redis-cli    # 修改redis客户端路径
12 CLIEXEC=/usr/local/redis-4.0.9/src/redis-cli

24                 #$EXEC $CONF         # 不让redis占用前台
25                 $EXEC $CONF &

chmod +x /etc/init.d/redis
chkconfig --add redis   # 添加redis进开机启动项
chkconfig redis on
systemctl daemon-reload #  重载进程管理
systemctl start redis

# 测试,使用redis客户端程序
/usr/local/redis-4.0.9/src/redis-cli
127.0.0.1:6379> set name pakho
OK
127.0.0.1:6379> get name
"pakho"

Redis持久化

开启持久化功能后,重启redis后,数据会自动通过持久化文件恢复
方式一:

  • RDB (Redis DataBase),在不同的时间点,将redis存储的数据生成快照并存储到磁盘等介质上

特点:

  • 周期性
  • 不影响数据写入,RDB会启动子进程,备份所有数据,当前进程,继续提供数据的写入,当备份完成,才替换老的备份文件
  • 高效,一次性还原所有数据
  • 完整性较差,故障点到上一次备份,之间的数据无法恢复

方式二:

  • AOF (Append Only File),换了一个角度来实现持久化,那就是将redis执行过的所有写指令(秒钟)记录在日志中,在下次redis重新启动时,只要把这些写指令从前到后再重复执行一遍,就可以实现数据恢复了

特点:

  • 实时性
  • 完整性较好
  • 体积大

配置持久化

  • RDB默认开启
  • AOF默认关闭
# rdb方式
vim /usr/local/redis-4.0.9/redis.conf
# dbfilename :持久化数据存储在本地的文件
253 dbfilename dump.rdb

# dir:持久化数据存储在本地的路径,如果是在/redis/redis-4.0.9/src下启动的redis-cli,则数据会存储在当前src目录下
263 dir ./

# snapshot触发的时机save <seconds> <changes>
# 如下为900秒后,至少有一个变更操作,才会snapshot(快照)
# 对于此值的设置,需要谨慎,评估系统的变更操作密集程度
# 可以通过“save""来关闭snapshot功能
# save时间,以下分别表示更改了1个key时间隔900s进行持久化存储;更改了10个key300s进行存储;更改1000O个key60s

218 save 900 1
219 save 300 10
220 save 60 10000
# 当snapshot时出现错误无法继续时,是否阻塞客户端"变更操作",“错误"可能因为磁盘已满/磁盘故障/OS级别异常等
235 stop-writes-on-bgsave-error yes
# 是否启用rdb文件压缩,默识为yes",压缩往往意味着"额外的cpu消耗",存储时压缩
241 rdbcompression yes


# 客户端使用命令进行持久化数据save存储
./redis-cli -h ip -p port save
./redis-cli -h ip -p port bgsave
# aof 方式
修改配置文件redis.conf: appendonly yes

# 此选项为aof功能的开关,默认为“no",可以通过"yes"来开启aof功能
# 只有在"yes”下,aof重写/文件同步等特性才会生效
672 appendonly yes

# 指定aof文件名称
676 appendfilename "appendonly.aof"
# 指定aof操作中文件同步策略,有三个合法值: always everysec no,默认为 everysec 
702 appendfsync everysec	
# 在aof-rewrite期间,appendfisync是否暂缓文件同步,"no"表示"不暂缓",“yes"表示"暂缓",默认为"no”
724 no-appendfsync-on-rewrite no

744 auto-aof-rewrite-min-size 64mb
# 触发aof-rewrite的最小文件尺寸

743 auto-aof-rewrite-percentage 100
# 当Aoflog增长超过指定比例时,重写log file,设置为0表示不自动重写Aof日志,重写是为了使aof体积保持最小,而确保保存最完整的数据

Redis主从集群

简介:

  • 像MySQL一样,redis是支持主从同步的,而且也支持一主多从以及多级从结构。
  • 主从结构,一是为了纯粹的冗余备份,二是为了提升读性能,比如很消耗性能的分类就可以由从服务器来承担
  • redis的主从同步是异步进行的,这意味着主从同步不会影响主逻辑,也不会降低redis的处理性能。
  • 主从架构中,可以考虑关闭主服务器的数据持久化功能,只让从服务器进行持久化,这样可以提高主服务器的处理性能。
  • 在主从架构中,从服务器通常被设置为只读模式,这样可以避免从服务器的数据被误修改。但是从服务器仍然可以接受CONFIG等指令,所以还是不应该将从服务器直接暴露到不安全的网络环境中。如果必须如此,那可以考虑给重要指令进行重命名,来避免命令被外人误执行

同步原理:

  • 从服务器会向主服务器发出SYNC指令,当主服务器接到此命令后,就会调用BGSAVE指令来创建一个子进程专门进行数据持久化工作,也就是将主服务器的数据写入RDB文件中。在数据持久化期间,主服务器将执行的写指令都缓存在内存中
  • 在BGSAVE指令执行完成后,主服务器会将持久化好的RDB文件发送给从服务器,从服务器接到此文件后会将其存储到磁盘上,然后再将其读取到内存中。这个动作完成后,主服务器会将这段时间缓存的写指令再以redis协议的格式发送给从服务器
  • 另外,要说的一点是,即使有多个从服务器同时发来SYNC指令,主服务器也只会执行一次BGSAVE,然后把持久化好的RDB文件发给多个下游。在redis28版本之前,如果从服务器与主服务器因某些原因断开连接的话,都会进行一次主从之间的全量的数据同步;而在2.8版本之后,redis支持了效率更高的增量同步策略,这大大降低了连接断开的恢复成本
  • 主服务器会在内存中维护一个缓冲区,缓冲区中存储着将要发给从服务器的内容。从服务器在与主服务器出现网络瞬断之后,从服务器会尝试再次与主服务器连接,一旦连接成功,从服务器就会把"希望同步的主服务器ID"和"希望请求的数据的偏移位置( replication offset)"发送出去。主服务器接收到这样的同步请求后,首先会验证主服务器ID是否和自己的ID匹配,其次会检查"请求的偏移位置"是否存在于自己的缓冲区中,如果两者都满足的话,主服务器就会向从服务器发送增量内容。
主机角色
192.168.93.11master
192.168.93.12slave1
192.168.93.13slave2
# master
vim /etc/redis/6379.conf
# 69 bind 127.0.0.1
69 bind 0.0.0.0        # 绑定IP地址

# 88 protected-mode yes
88 protected-mode no   # 关闭保护模式

systemctl restart redis

# slave1
vim /etc/redis/6379.conf
69 bind 0.0.0.0
88 protected-mode no
282 slaveof 192.168.93.11 6379
systemctl restart redis

# slave2
vim /etc/redis/6379.conf
69 bind 0.0.0.0
88 protected-mode no
282 slaveof 192.168.93.11 6379
systemctl restart redis
# 测试

# 数据一致性
/usr/local/redis-4.0.9/src/redis-cli
# 主服务器写入
127.0.0.1:6379> set name lilei
OK
127.0.0.1:6379> get name
"lilei"
# 从服务器查看
/usr/local/redis-4.0.9/src/redis-cli
127.0.0.1:6379> get name
"lilei"

# master检查集群状态信息
127.0.0.1:6379> info replication

Redis哨兵模式

# 每台机器上修改redis主配置文件设置: bind 0.0.0.0
# 每台机器上修改sentinel配置文件
# masternode
vim /usr/local/redis-4.0.9/sentinel.conf
69 sentinel monitor mymaster 192.168.93.11 6379 2 # 2:票

# 如果在down-after-millisecondes毫秒内,没有收到有效的回复,则会判定该节点为主观下线
98 sentinel down-after-milliseconds mymaster 3000

# 若sentinel在该配置值内未能完成failover(故障转移)操作(即故障时masterlslave自动切换),则认为本次failover失败
131 sentinel failover-timeout mymaster 10000

17  protected-mode no

# slave
vim /usr/local/redis-4.0.9/sentinel.conf
69 sentinel monitor mymaster 192.168.93.11 6379 2
98 sentinel down-after-milliseconds mymaster 3000
131 sentinel failover-timeout mymaster 10000
17  protected-mode no

# 每台机器启动服务
cd /usr/local/redis-4.0.9/
./src/redis-sentinel sentinel.conf

Redis工具

find /usr/local/redis-4.0.9/src -type f -exec utable
./redis-benchmark  # 用于进行redis性能测试的工具
./redis-check-dump # 用于修复出问题的dump.rdb文件
./redis-cli        # redis客户端
./redis-server     # redis服务端
./redis-check-aof  # 用于修复出问题的AOF文件
./redis-sentinel   # 同于集群管理

以上是关于memcache&redis构建缓存服务器的主要内容,如果未能解决你的问题,请参考以下文章

memcache&redis构建缓存服务器

27期预告memcached&redis等分布式缓存的实现原理

Memcached & Redis使用

缓存技术PK:选择Memcached还是Redis?

企业做数据缓存是使用Memcached还是选Redis?

Memcache和Redis复习总结