LAMP Redis实战

LAMP架构拆分的目的在于缓解单台服务器的压力,可以将PHP、MySQL单独安装至多台服务器。
实现LAP+MySQL的架构如下:
1、YUM安装LAMP多机方案
在ApacheWeb服务器上安装LAP:yum install httpd httpd-devel php-devel php php-mysql -y
在MySQL服务器上安装MySQL:yuminstall mysql-server mysql mysql-devel mysql-libs -y
2、源码安装LAMP多机方案
Apache与MySQL源码安装如上,PHP与Apache服务部署在一台服务器上,PHP编译参数时加入如下代码进行LAMP整合,mysqlnd为PHP远程连接MySQL数据库服务器的一种方式。
./configure--prefix=/usr/local/php --with-mysql=mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-apxs2=/usr/local/apache/bin/apxs
make
make install
 
LAMP+Redis企业实战
PHP的优化手段:PHP代码本身优化、PHP配置文件优化、为PHP添加缓存模块、将PHP网站数据存入缓存等。
Redis是一个开源的使用ANSIC语言编写、支持网络、可基于内存亦可持久化的日志型、key-value数据库,并提供多种语言的API。Redis是一个key-value存储系统。
Redis是内存数据库,数据保存在内存中,访问速度快。MySQL是关系型数据库,功能强大,存储在磁盘中,数据访问速度慢。像memcached,MongoDB,Redis等,都属于Nosql系列。
Redis支持存储的value类型包括string(字符串)、list(链表)、set(集合)、zset(有序集合)和hash(哈希类型)等。
Redis支持在服务器端计算集合的并、交和补集等,还支持多种排序功能,可以看成是一个数据结构服务器。
LAMP+Redis工作机制
户通过浏览器访问LAMP网站,并以用户名和密码登录到网站,默认Redis缓存中没有该用户名和密码对应列表,PHP程序会读取MYSQL数据库中的用户名和密码,然后将用户名和密码缓存至Redis中,下次用户通过浏览器再次使用同样的用户名和密码登录网站,PHP无需从数据库中读取该用户和密码信息,而是直接优先从Redis缓存中读取并返回,从而减轻MYSQL数据库的压力。
Redis除了可以缓存用户名、密码,还可以换成PHP论坛各种数据,例如用户帖子、用户动态等等
LAMP+Redis操作案例
LAMPPHP连接Redis,首先需安装Redis服务器,安装连接驱动,然后修改PHP网站配置文件,具体操作步骤如下:
(1) LAMP+Redis实战环境配置:
LAMP服务器:192.168.99.2
Redis主库:192.168.99.3
Redis从库:192.168.99.4
(2) 192.168.99.3服务器安装部署Redis服务:
yum install -y gccgcc-c++            需要gcc环境
wget  http://download.redis.io/releases/redis-5.0.0.tar.gz
tar zxfredis-5.0.0.tar.gz
cd redis-5.0.0
makePREFIX=/usr/local/redis  install
cp redis.conf  /usr/local/redis/
将/usr/local/redis/bin/目录加入至环境变量配置文件/etc/profile末尾,然后shell终端执行source/etc/profile让环境变量生效:
exportPATH=/usr/local/redis/bin:$PATH
nohup后台启动及停止Redis服务命令:
nohup/usr/local/redis/bin/redis-server /usr/local/redis/redis.conf &
/usr/local/redis/bin/redis-cli-p 6379 shutdown
vim/usr/local/redis/redis.conf    修改配置文件
bind 0.0.0.0     #在61行 原本是127.0.0.1 改为0.0.0.0这样才可以让lamp调用redis
daemonize yes    #在128行 找到这一行 原本为no 改为yes,yes表示以守护进程的方式启动
编辑/etc/sysctl.conf添加vm.overcommit_memory=1,然后sysctl -p 使配置文件生效
或者:
makePREFIX=/usr/local/redis install         安装
ln/usr/local/redis/bin/* /usr/local/bin/    软链接一下命令
cp/opt/redis-5.0.0/utils/redis_init_script /etc/init.d/redis  启动脚本
chmod +x/etc/init.d/redis
mkdir /etc/redis
cp redis.conf/etc/redis/6379.conf   配置文件
vi/etc/redis/6379.conf    修改配置文件
bind 0.0.0.0     #在61行 原本是127.0.0.1 改为0.0.0.0这样才可以让lamp调用redis
daemonize yes    #在128行 找到这一行 原本为no 改为yes,yes表示以守护进程的方式启动
编辑/etc/sysctl.conf添加vm.overcommit_memory=1,然后sysctl -p 使配置文件生效
#这个内核参数作用:表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
/etc/init.d/redisstart  #启动redis
netstat -antp
可以看到已经启动成功,端口号是6379
(3)安装PHP-Redis连接驱动
要确保PHP能够连接Redis缓存服务器,需添加PHPRedis扩展程序,也即是添加PHP安ext扩展模块,添加方法如下:
YUM安装方法:yum installphp-pecl-redis
修改php.ini  添加并保存
extension="/usr/lib64/php/modules/redis.so"
重启php -r
1、PHP与redis通过源码安装,源码安装方法:
wget https://github.com/phpredis/phpredis/archive/3.1.2.tar.gz
tar xzf 3.1.2.tar.gz
cd phpredis-3.1.2/
phpize
./configure--with-php-config=/usr/local/php/bin/php-config --enable-redis
make
make install
修改vim/usr/local/php/lib/php.ini配置文件,添加redis.so模块,代码如下:
extension_dir="/usr/local/php/lib/php/extensions/no-debug-zts-20090626"
extension=redis.so
重启Apache、redis服务,写入phpinfo测试页面,通过浏览器访问,检查到存在Redis模块即可。
2、PHP与redis通过YUM安装,源码安装方法:
tar xzf 3.1.2.tar.gz
cd phpredis-3.1.2/
phpize
./configure--with-php-config=/usr/bin/php-config --enable-redis
make
make install
vim/etc/redis.conf    修改redis配置文件
bind 0.0.0.0     #在61行 原本是127.0.0.1 改为0.0.0.0这样才可以让lamp调用redis
daemonize yes    #在128行 找到这一行 原本为no 改为yes,yes表示以守护进程的方式启动
修改php.ini  添加并保存
extension="/usr/lib64/php/modules/redis.so"
php -m |grep redis   #可以看到 redis模块
cd/var/www/html/config/ 或者 /usr/local/apache/htdcos/
vimconfig_global.php  #修改网站配置文件,查找CONFIGMEMORY段将['redis']['server']后改为Redis主服务器IP 192.168.99.3。
通过浏览器访问ApachePHP论坛网址,同时登录Redis服务器,执行命令redis-cli进入Redis命令行,运行命令KEYS*,存在以IOKLAN开头的key,则证明Redis成功缓存LAMP+Discuz网站信息数据。
mysql -uroot -p123
ues discuz;
drop tablepre_common_member;
退出登录用户依然可以登录说明redis缓存生效。
 
Redis配置文件详解
Redis是一个内存数据库,redis.conf常用参数如下:
#############################INCLUDES ##############################
# 假如说你有一个可用于所有的 redisserver 的标准配置模板,
# 但针对某些 server又需要一些个性化的设置,
# 你可以使用 include来包含一些其他的配置文件,这对你来说是非常有用的。
# 但是要注意哦,include 是不能被config rewrite 命令改写的
# 由于 redis总是以最后的加工线作为一个配置指令值,所以你最好是把 include 放在这个文件的最前面,
# include/path/to/local.conf
# include/path/to/other.conf
############################常用 ##################################
# 默认情况下 redis不是作为守护进程运行的,如果你想让它在后台运行,你就把它改成 yes。
daemonize no
# 当redis作为守护进程运行的时候,它会把pid 默认写到 /var/run/redis.pid 文件里面,
pidfile/var/run/redis.pid
# 监听端口号,默认为 6379,如果你设为0 ,redis 将不在 socket 上监听任何客户端连接。
port 6379
#在高并发的环境下,你需要把这个值调高以避免客户端连接缓慢的问题。
# Linux 内核会一声不响的把这个值缩小成/proc/sys/net/core/somaxconn 对应的值,
# 所以你要修改这两个值才能达到你的预期。
tcp-backlog 511
# 默认情况下,redis 在 server上所有有效的网络接口上监听客户端连接。
#你如果只想让它在一个网络接口上监听,那你就绑定一个IP或者多个IP。
# bind 192.168.1.10010.0.0.1
# bind 127.0.0.1
# 指定 unix socket 的路径。
# unixsocket/tmp/redis.sock
# unixsocketperm 755
# 指定在一个 client空闲多少秒之后关闭连接(0 就是不管它)
timeout 0
#在Linux上,指定值(s)用于发送ACKs的时间,注意关闭连接需要双倍的时间,默认为0
tcp-keepalive 0
# 定义日志级别。
# debug(记录很多信息,适用于开发或测试阶段)
# verbose(有用的信息,不像debug会记录那么多)
# notice (普通的verbose,适用于生产环境)
# warning(仅仅一些重要的消息被记录)
loglevel notice
# 指定日志文件的位置
logfile"/var/log/redis/redis.log"
# 要想把日志记录到系统日志,就把它改成yes,
# 也可以可选择性的更新其他的syslog参数以达到你的要求
# syslog-enabled no
# 设置 syslog 的 identity。
# syslog-ident redis
# 设置 syslog 的facility,必须是 USER 或者是 LOCAL0-LOCAL7 之间的值。
# syslog-facilitylocal0
# 设置数据库的数目。
# 默认数据库是 DB0,你可以在每个连接上使用 select <dbid> 命令选择一个不同的数据库,
# 但是 dbid 必须是一个介于 0 到databasees - 1 之间的值
databases 16
########################### 快照##############################
# 存 DB 到磁盘:
#   格式:save <间隔时间(秒)> <写入次数>
#   根据给定的时间间隔和写入次数将数据保存到磁盘
#   下面的例子的意思是:
#   900 秒内如果至少有 1 个 key 的值变化,则保存
#   300 秒内如果至少有 10 个 key 的值变化,则保存
#   60 秒内如果至少有 10000 个 key 的值变化,则保存
#   注意:你可以注释掉所有的 save 行来停用保存功能。
#   也可以直接一个空字符串来实现停用:
#   save ""
save 900 1
save 300 10
save 60 10000
# 默认情况下,如果 redis最后一次的后台保存失败,redis 将停止接受写操作,
#这样以一种强硬的方式让用户知道数据不能正确的持久化到磁盘,
# 否则就会没人注意到灾难的发生。
# 如果后台保存进程重新启动工作了,redis也将自动的允许写操作。
# 然而你要是安装了靠谱的监控,你可能不希望redis 这样做,那你就改成 no 好了。
stop-writes-on-bgsave-erroryes
#存储至本地数据库文件时(持久化到rdb文件)是否压缩数据,默认为yes
rdbcompression yes
# 是否校验rdb文件
rdbchecksum yes
# 设置 dump 的文件位置
dbfilename dump.rdb
# 工作目录
# 例如上面的 dbfilename只指定了文件名,
#但是它会写入到这个目录下。这个配置项一定是个目录,而不能是文件名。
dir ./
##########################主从复制 ################################
# 主从复制。使用 slaveof 来让一个redis 实例成为另一个reids 实例的副本。
# 注意这个只需要在 slave 上配置。
# slaveof<masterip> <masterport>
# 如果 master需要密码认证,就在这里设置
# masterauth<master-password>
# 当一个 slave 与 master失去联系,或者复制正在进行的时候,
# slave 可能会有两种表现:
# 1) 如果为 yes ,slave仍然会应答客户端请求,但返回的数据可能是过时,
#    或者数据可能是空的在第一次同步的时候
# 2) 如果为 no ,在你执行除了info he salveof 之外的其他命令时,
#    slave 都将返回一个 "SYNC with master inprogress" 的错误,
slave-serve-stale-datayes
# 从 redis 2.6 版起,默认slaves 都是只读的。
# 注意:只读的 slaves 没有被设计成在internet 上暴露给不受信任的客户端。
# 它仅仅是一个针对误用实例的一个保护层。
slave-read-only yes
# Slaves 在一个预定义的时间间隔内发送ping 命令到 server 。
# 你可以改变这个时间间隔。默认为 10 秒。
#repl-ping-slave-period 10
# 设置主从复制过期时间
# 这个值一定要比repl-ping-slave-period 大
# repl-timeout 60
# 在slavesocket的SYNC后禁用TCP_NODELAY
repl-disable-tcp-nodelayno
#设置主从复制的后台日志大小,复制的后台日志越大,slave断开连接及后来可能执行部分复制花的时间就越长
#后台日志在至少有一个slave连接时,仅仅分配一次
# repl-backlog-size 1mb
# 在某些时候,master 不再连接slaves,backlog 将被释放,如果设置为 0 ,意味着绝不释放 backlog 。
# repl-backlog-ttl 3600
# 当 master不能正常工作的时候,Redis Sentinel 会从 slaves 中选出一个新的 master,
# 这个值越小,就越会被优先选中,但是如果是0 , 那是意味着这个 slave 不可能被选中。
# 默认优先级为 100。
slave-priority 100
#如果少于N个slave连接,且延迟时间<=Ms,则master可配置停止接受写操作
#例如需要至少3个slave连接,且延迟<=10s 的配置
# min-slaves-to-write 3
# min-slaves-max-lag 10
# Setting one or theother to 0 disables the feature.   设置0为禁用
# By defaultmin-slaves-to-write is set to 0 (feature disabled) and
# min-slaves-max-lag isset to 10.
###############################安全 ################################
# 设置认证密码
# requirepass tang
# 命令重命名
# 把CONFIG重命名为一个不容易猜测的字符
# rename-command CONFIGb840fc02d524045429941cc15f59e41cb7be6c52  
#如果想删除一个命令,直接把它重命名为一个空字符“”即可。
# rename-command CONFIG"" 
##############################限制 #################################
# 一旦达到最大限制,redis将关闭所有的新连接
# 并发送一个‘max number ofclients reached’的错误。
# maxclients 10000
#如果你设置了这个值,当缓存的数据容量达到这个值, redis 将根据你选择的
# eviction 策略来移除一些keys。
# 如果 redis 不能根据策略移除keys ,或者是策略被设置为 ‘noeviction’,
# redis 将开始响应错误给命令,如set,lpush 等等,
# 并继续响应只读的命令,如 get
# 最大使用内存
# maxmemory<bytes>
# 最大内存策略,你有 5 个选择。
# volatile-lru -> 使用LRU 算法移除包含过期设置的 key 。
# allkeys-lru -> 根据LRU 算法移除所有的 key 。
# volatile-random ->移除设置过期时间的随机key
# allkeys-random ->移除随机key,任何key
# volatile-ttl ->移除即将过期的key(minor TTL)
# noeviction -> 不让任何key 过期,只是给写入操作返回一个错误
#注意:对于上面的策略,如果没有合适的key可以移除,当写的时候Redis会返回一个错误,默认是volatile-lru
# maxmemory-policynoeviction
# LRU和minimalTTL算法都不是精准的算法,但是是相对的精确的算法(节省内存),你可以随意选择样本大小进行检测。默认选3个样本检测。
# maxmemory-samples 3
#######################APPEND ONLY MODE #########################
# 数据库备份及灾难恢复方式,开启appendonly模式后,Redis会把所有接到的每一次写操作请求都追加到appendonly.aof文件中。
#当Redis重新启动后,会从该文件恢复出之前的状态,但容易超成appendonly.aof文件过大,所以Redis还支持了BGREWRITEAOF指令来理整。
appendonly no
#AOF文件名称(默认为"appendonly.aof")
appendfilename"appendonly.aof"
# Redis支持3种同步AOF文件的策略
# no:不进行同步,系统去操作.Faster
# always:每次对写操作进行累积,每秒同步一次.Slow,Safest
# everysec:表示对写操作进行累积,每秒同步一次.Compromise
# 默认是everysec
# appendfsync always
appendfsync everysec
# appendfsync no
#设置为always或者everysec时,后台处理进程会执行大量I/O操作,某些Linux配置中会阻止过长的fsync()请求,为缓解些情况可配置
no-appendfsync-on-rewriteno
#AOF自动重写,设为0表示关闭,日志超过设置的大小将调用BGREWRITEAOF对日志文件进行重写
auto-aof-rewrite-percentage100
auto-aof-rewrite-min-size64mb
###########################LUA SCRIPTING  #########################
#一个LUA脚本最长的执行时间为5000ms(5s),如果为0或者负数表示无限执行时间
lua-time-limit 5000
###########################REDIS 集群  ###########################
#
# 启用或停用集群
# cluster-config-filenodes-6379.conf
# cluster-node-timeout15000
#cluster-slave-validity-factor 10
#cluster-migration-barrier 1
#############################SLOW LOG ###########################
# Redis slowlog:记录超过特定执行时间的命令,记录执行超过多少时间被记录
#下面的时间以us为单位,因此1000000代表1秒,指定一个负数将关闭慢日志,设置为0强制每个命令都会记录。
slowlog-log-slower-than10000
#对日志消耗的内存进行限制,默认128,超过128时,最先进入队列的记录会被踢出
slowlog-max-len 128
 
Redis常用配置
Redis缓存服务器命令中常用命令如下:
Redis CONFIG命令格式如下:
redis127.0.0.1:6379>CONFIG GET | SET CONFIG_SETTING_NAME
详解如下:
CONFIG GET*                        获取Redis服务器所有配置信息
CONFIG SET loglevel"notice"        配置Redis服务器日志级别
CONFIG SET requirepass"tang"        配置Redis访问密码
AUTHtang                        登录Redis,执行AUTHtang
redis-cli -h host -p -apasswd         远程连接Redis数据库
CLIENTGETNAME                获取连接的名称
CLIENTSETNAME                设置当前连接的名称
CLUSTERSLOTS                        获取集群节点的映射数组
COMMAND                        获取Redis命令详情数组
COMMANDGETKEYS                获取给定命令的所有键
TIME                                返回当前服务器时间
CONFIG GETparameter                获取指定配置参数的值
CONFIG SET parametervalue        修改Redis配置参数,无须重启
CONFIGRESETSTAT                重置INFO命令中的某些统计数据
DBSIZE                                返回当前数据库的key的数量
DEBUG OBJECTkey                获取key的调试信息
DEBUGSEGFAULT                让Redis服务崩溃
FLUSHALL                        删除所有数据库的所有key
FLUSDB                                删除所有数据库的所有key
ROLE                                返回主从实例所属的角色
SAVE                                异步保存数据到硬盘
SHUTDOWN                        异步保存数据到硬盘,并关闭服务器
SLOWLOG                        管理Redis的慢日志
SET keysvalues                        设置key和value
DELtang                        删除key及值
INFOCPU                        查看服务器CPU占用信息
KEYS*                                查看Redis所有的key
KEYStang                        查看是存在tang的key
CONFIGREWRITE                启动Redis时所指定的redis.conf配置文件进行改写
INFO[section]                        获取Redis服务器的各种信息和统计数值
SYNC                                用于复制功能(replication)的内部命令
SLAVEOF host port                指定服务器的从服务器(slaveserver)
MONITOR                        实时打印出Redis服务器接收到的命令,调试用
LASTSAVE                        返回最近一次Redis成功将数据保存到磁盘上的时间
CLIENT PAUSEtimeout                指定时间内终止运行来自客户端的命令
BGREWRITEAOF                        异步执行一个AOF(appendonly file)文件重写操作
BGSAVE                        后台异步保存当前数据库的数据到磁盘
 
Redis集群主从实战
为了提高Redis高可用性。除了Redisdump数据之外,还需要配置Redis主从架构,可以利用主从架构将数据库持久化(即保存到磁盘上)。
Redis需要经常将内存中的数据同步到磁盘来保证持久化,Redis支持两种持久化方式:snapshotting(快照);appendonly file(AOF)。
Redis主从复制,当用户往master端写入数据时,通过Redissync机制将数据文件发送到slave,slave也会执行相同的操作确保数据一致。
Redis主从配置:只需要在Redis从库192.168.99.4配置中设置如下指令,slaveof表示指定主库的IP,192.168.99.3为master服务器,6379为master服务器Redis商品。配置方法如下:
1、192.168.99.3Redis主库redis.conf配置文件如下:
daemonize no
pidfile/var/run/redis.pid
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 0
loglevel notice
logfile ""
databases 16
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-erroryes
rdbcompression yes
rdbchecksum yes
dbfilename redis.rdb
dir /data/redis/
slave-serve-stale-datayes
slave-read-only yes
repl-disable-tcp-nodelayno
slave-priority 100
appendonly no
appendfilename"appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewriteno
auto-aof-rewrite-percentage100
auto-aof-rewrite-min-size64MB
lua-time-limit 5000
slowlog-log-slower-than10000
slowlog-max-len 128
latency-monitor-threshold0
notify-keyspace-events""
hash-max-ziplist-entries512
hash-max-ziplist-value64
list-max-ziplist-entries512
list-max-ziplist-value64
set-max-intset-entries512
zset-max-ziplist-entries128
zset-max-ziplist-value64
hll-sparse-max-bytes3000
activerehashing yes
chient-output-buffer-limitnormal 0 0 0
chient-output-buffer-limitslave 256MB 64MB 60
chient-output-buffer-limitpubsub 32MB 8MB 60
hz 10
aof-rewrite-incremental-fsyncyes
2、192.168.99.4Redis从库redis.conf配置文件如下:
daemonize no
pidfile/var/run/redis.pid
port 6379
slaveof 192.168.99.36379
tcp-backlog 511
timeout 0
tcp-keepalive 0
loglevel notice
logfile ""
databases 16
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-erroryes
rdbcompression yes
rdbchecksum yes
dbfilename redis.rdb
dir /data/redis/
slave-serve-stale-datayes
slave-read-only yes
repl-disable-tcp-nodelayno
slave-priority 100
appendonly no
appendfilename"appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewriteno
auto-aof-rewrite-percentage100
auto-aof-rewrite-min-size64MB
lua-time-limit 5000
slowlog-log-slower-than10000
slowlog-max-len 128
latency-monitor-threshold0
notify-keyspace-events""
hash-max-ziplist-entries512
hash-max-ziplist-value64
list-max-ziplist-entries512
list-max-ziplist-value64
set-max-intset-entries512
zset-max-ziplist-entries128
zset-max-ziplist-value64
hll-sparse-max-bytes3000
activerehashing yes
chient-output-buffer-limitnormal 0 0 0
chient-output-buffer-limitslave 256MB 64MB 60
chient-output-buffer-limitpubsub 32MB 8MB 60
hz 10
aof-rewrite-incremental-fsyncyes
3、重启Redis主库、从库服务,在Redis主库创建key及values,登录Redis从库查看。