标签 redis 下的文章

PHP7使用Redis保存session

PHP默认就支持保存session到redis,不需任何额外代码,首先安装redis,参考 redis快速安装
PHP默认使用文件存储session,如果并发量大,效率非常低,如项目同时运行在多台服务器上做了分布式部署,就无法使用常规的Session记录方式来记录用户的会话了,否则用户在服务器1上完成登录,我们下次在服务器2上访问其他模块就无法获取到该用户的信息。
php-redis.png



---阅读剩余部分---

Keepalived 2.0.9 + Redis5.0部署redis主从高可用

项目需要部署搭建redis主从高可用环境,对外使用VIP提供服务,以下是实现步骤:
Keepalived 实现VRRP(虚拟路由冗余)协议,从路由级别实现VIP切换,可以完全避免类似heartbeat脑裂问题,可以很好的实现主从、主备、互备方案。
实现切换逻辑如下:A和B两台机器

1)A 、B机器依次启动,A机作为主、B机为从。
2)主A挂掉,B接管业务并作为主。
3)A机起来,作为从SLAVEOF B。
4)B机挂掉,A机再切回主。

在Keepalived 有两个角色:Master(一个)、Backup(多个),如果设置一个为Master,但Master挂了后再起来,必然再次业务又一次切换,这对于有状态服务是不可接受的。解决方案就是两台机器都设置为Backup,而且优先级高的Backup设置为nopreemt 不抢占主。
服务器环境:




---阅读剩余部分---

WARNING: The TCP backlog setting of 511 ......报错解决

安装好redis后,如果系统没有调优,启动的时候会报错:

WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
警告:TCP backlog的值设定是511,这是无法启动的,因为/proc/sys/net/core/somaxconn的设定值是128,比你的511要低。

解决方法:

echo 2048 > /proc/sys/net/core/somaxconn
echo 'net.core.somaxconn=1024' >> /etc/sysctl.conf
sysctl -p

在重启redis服务即可,log里面无报错了·
net.core.somaxconn参数说明:

net.core.somaxconn是linux中的一个kernel参数,表示socket监听(listen)的backlog上限。
backlog是socket的监听队列,当一个请求(request)尚未被处理或建立时,他会进入backlog。
而socket server可以一次性处理backlog中的所有请求,处理后的请求不再位于监听队列中。
当server处理请求较慢,以至于监听队列被填满后,新来的请求会被拒绝。
所以说net.core.somaxconn限制了接收新 TCP 连接侦听队列的大小。
对于一个经常处理新连接的高负载 web服务环境来说,默认的 128 太小了。
大多数环境这个值建议增加到 2048 或者更多。

Docker环境下安装部署Redis5.0挂载外部配置和数据

作为一种新兴的虚拟化方式,Docker 跟传统的虚拟化方式相比具有众多的优势。
docker-redis.png
本文记录docker下安装部署redis5.0的过程:
os版本centos7.5
先更新 yum 软件管理器,然后再安装 Docker

[root@localhost /] yum -y update
[root@localhost /] yum install -y docker

验证安装,查看 Docker 版本信息

[root@localhost /] docker -v
Docker version 1.13.1, build 8633870/1.13.1
You have new mail in /var/spool/mail/root

启动、停止、重启docker服务、加入开机启动

systemctl start docker
systemctl stop docker
systemctl restart docker
systemctl enable docker

安装redis5.0镜像

[root@sso-nginx-b ~]# systemctl start docker
[root@sso-nginx-b ~]# docker pull redis:5.0
Trying to pull repository docker.io/library/redis ... 
5.0: Pulling from docker.io/library/redis
f17d81b4b692: Pull complete 
b32474098757: Pull complete 
8980cabe8bc2: Pull complete 
2719bdbf9516: Pull complete 
f306130d78e3: Pull complete 
3e09204f8155: Pull complete 
Digest: sha256:481678b4b5ea1cb4e8d38ed6677b2da9b9e057cf7e1b6c988ba96651c6f6eff3
Status: Downloaded newer image for docker.io/redis:5.0

创建redis运行目录及文件

mkdir -p /data/docker/redis
touch /data/docker/redis/redis.conf

redis.conf文件内容如下:

bind 172.17.0.2 127.0.0.1
#bind 0.0.0.0
protected-mode yes
port 6380
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize no   #如果daemonize yes无法启动容器
supervised no
pidfile /data/docker/redis/6380.pid
loglevel notice
logfile "6380.log"
databases 16
always-show-logo yes
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir ./
slave-serve-stale-data yes
slave-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
slave-priority 100
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
slave-lazy-flush no
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble no
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes

创建redis实例:

docker run -d --privileged=true --restart=always -p 6380:6380 -v /data/docker/redis/redis.conf:/etc/redis/redis.conf -v /data/docker/redis:/data --name redistest1 redis:5.0 redis-server /etc/redis/redis.conf --appendonly yes

实例说明如下:

--privileged=true 容器内的root拥有真正root权限,否则容器内root只是外部普通用户权限
--restart=always 开机启动容器
-p 6380:6380 映射宿主机6380端口到docker端口6380
-v /data/docker/redis/redis.conf:/etc/redis/redis.conf   映射配置文件
-v /data/docker/redis:/data  映射数据目录地址
--name redistest1 redis:5.0 redis-server /etc/redis/redis.conf   #docker名字 redis实例名 配置文件
--appendonly yes:开启持久化

查看redistest1容器的IP地址:

docker inspect redistest1 | grep -i address
            "LinkLocalIPv6Address": "",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "GlobalIPv6Address": "",
            "IPAddress": "172.17.0.2",
            "MacAddress": "02:42:ac:11:00:02",
                    "IPAddress": "172.17.0.2",
                    "GlobalIPv6Address": "",
                    "MacAddress": "02:42:ac:11:00:02"

将/data/docker/redis/redis.conf里面的bind地址修改为

bind 172.17.0.2 127.0.0.1

重启redistest1容器:

docker restart redistest1

进入redis控制台:

redis-cli -h 172.17.0.2 -p 6380  #172.17.0.2是redistest1容器的IP地址,也可以用宿主机IP地址进入

启动另外一个redis实例:

docker run -d --privileged=true --restart=always -p 6381:6381 -v /data/docker/redis-6381/redis.conf:/etc/redis/redis.conf -v /data/docker/redis-6381:/data --name redistest2 redis:5.0 redis-server /etc/redis/redis.conf --appendonly yes

至此,docker上安装部署redis完毕.

Redis主从复制

redis主从复制,当用户往Master端写入数据时,通过Redis Sync机制将数据文件发送至Slave,Slave也会执行相同的操作确保数据一致;且实现Redis的主从复制非常简单。
redis的复制功能可以很好的实现数据库的读写分离,提高服务器的负载能力。主数据库主要进行写操作,而从数据库负责读操作。

过程:
1:当一个从数据库启动时,会向主数据库发送sync命令,

2:主数据库接收到sync命令后会开始在后台保存快照(执行rdb操作),并将保存期间接收到的命令缓存起来

3:当快照完成后,redis会将快照文件和所有缓存的命令发送给从数据库。

4:从数据库收到后,会载入快照文件并执行收到的缓存的命令。

注意:redis2.8之前的版本:当主从数据库同步的时候从数据库因为网络原因断开重连后会重新执行上述操作,不支持断点续传。
redis2.8之后支持断点续传,推荐安装最新版;

配置
Redis主从结构支持一主多从
主节点:172.17.11.35
从节点:172.17.11.36
注意:所有从节点的配置都一样

手动修改配置文件
只需要修改从节点中redis的配置文件中的slaveof属性启动redis节点即可

slaveof 172.17.11.35 6379

运行redis-cli 登录控制台info后可看到信息:

redis-cli 
127.0.0.1:6379> INFO
# Replication
role:slave
master_host:172.17.11.35
master_port:6379
master_link_status:up
master_last_io_seconds_ago:10
master_sync_in_progress:0
slave_repl_offset:21490
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:d5370a33ed6b49a24111ebac3e5d8f0a56a8a4aa
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:21490
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:21490

当然也可以动态设置
通过redis-cli 连接到从节点服务器,执行下面命令即可。

slaveof 172.17.11.35 6379

演示结果和手动方式一致。
同理在Master上用redis-cli登录控制台,使用info查看

# Replication
role:master
connected_slaves:1
slave0:ip=172.17.11.36,port=6379,state=online,offset=21644,lag=0
master_replid:d5370a33ed6b49a24111ebac3e5d8f0a56a8a4aa
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:21644
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:21644

注意事项
如果使用主从复制,那么要确保master激活了持久化,或者确保它不会在当掉后自动重启。
原因:
slave是master的完整备份,因此如果master通过一个空数据集重启,slave也会被清掉。
在配置redis复制功能的时候如果主数据库设置了密码,需要在从数据的配置文件中通过masterauth参数设置主数据库的密码,这样从数据库在连接主数据库时就会自动使用auth命令认证了。相当于做了一个免密码登录。

redis overcommit memory (oom) 问题报错解决方法

一,什么是overcommit or oom问题
Linux对大部分申请内存的请求都回复"yes",以便能跑更多更大的程序。因为申请内存后,并不会马上使用内存。这种技术叫做Overcommit。当linux发现内存不足时,会发生OOM killer(OOM=out-of-memory)。它会选择杀死一些进程(用户态进程,不是内核线程),以便释放内存。


---阅读剩余部分---

php扩展redis模块

1、到https://github.com/nicolasff/phpredis/下载phpredis最新版
2、将刚下好的压缩包解压到php源码目录下的ext中,即/opt/php-NN/ext/phpredis
mv phpredis-NN /opt/php-NN/ext/phpredis
3、将phpredis加入php拓展模块

cd /opt/php-NN/ext/phpredis
/usr/local/php5/bin/phpize  (如果在编译php时configure没有加足够的参数可能会在目录下缺少phpize)
./configure --with-php-config=/usr/local/php5/bin/php-config (同样后面参数也很重要)
make 
make install

Installing shared extensions: /usr/local/php5/lib/php/extensions/no-debug-non-zts-20121212/

编辑php.ini
加入参数:

extension_dir = "/usr/local/php5/lib/php/extensions/no-debug-non-zts-20121212/"
extension=redis.so

重启php-fpm和nginx即可

Redis配置文件redis.conf参数详解

Redis配置文件redis.conf参数详解,基本兼容4.x及5.0版本:

/********************************* GENERAL *********************************/
// 是否作为守护进程运行
daemonize yes 

// 如以后台进程运行,则需指定一个pid,默认为/var/run/redis.pid
pidfile /var/run/redis.pid 

// Redis默认监听端口
port 6379 

tcp-backlog 511 

// 客户端闲置多少秒后,断开连接
timeout 0 

tcp-keepalive 0 

// 日志记录等级,有4个可选值,debug,verbose,notice,warning
loglevel notice 

// 指定日志输出的文件名,可设为/dev/null屏蔽日志
logfile "" 

// 可用数据库数,默认值为16,默认数据库为0
databases 16 

/****************************** SNAPSHOTTING 快照 *********************************/
// 保存数据到disk的策略
// 900 秒有 1 条改变保存到disk
save 900 1
// 300 秒有 10 条改变保存到disk
save 300 10
// 60 秒有 10000 条改变保存到disk
save 60 10000 

stop-writes-on-bgsave-error yes 

// 当dump .rdb数据库的时候是否压缩数据对象
rdbcompression yes 

rdbchecksum yes 

// 本地数据库文件名,默认值为dump.rdb
dbfilename dump.rdb 

// 本地数据库存放路径,默认值为 ./
dir ./ 

/*************************** REPLICATION Redis的复制配置 *********************************/ 

// 当本机为从服务时,设置主服务的IP及端口
// slaveof <masterip> <masterport> 

// 当本机为从服务时,设置主服务的连接密码
// masterauth <master-password> 

// 当从库同主机失去连接或者复制正在进行,从机库有两种运行方式
// 1) 如果slave-serve-stale-data设置为yes(默认设置),从库会继续相应客户端的请求
// 2) 如果slave-serve-stale-data是指为no,出去INFO和SLAVOF命令之外的任何请求都会返回一个错误"SYNC with master in progress"
slave-serve-stale-data yes 

slave-read-only yes 

repl-diskless-sync no 

repl-diskless-sync-delay 5 

// 从库会按照一个时间间隔向主库发送PINGs.可以通过repl-ping-slave-period设置这个时间间隔,默认是10秒
repl-ping-slave-period 10 

// repl-timeout 设置主库批量数据传输时间或者ping回复时间间隔,默认值是60秒
// 一定要确保repl-timeout大于repl-ping-slave-period
repl-timeout 60 

// 采用无延迟同步 默认no
repl-disable-tcp-nodelay yes 

slave-priority 100 

/********************************* SECURITY 安全 *********************************/ 

// 设置客户端连接后进行任何其他指定前需要使用的密码。
// 警告:因为redis速度相当快,所以在一台比较好的服务器下,一个外部的用户可以在一秒钟进行150K次的密码尝试,
这意味着你需要指定非常非常强大的密码来防止暴力破解
// requirepass foobared 

// 命令重命名.
// 在一个共享环境下可以重命名相对危险的命令。比如把CONFIG重名为一个不容易猜测的字符。
// 举例:
// rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52
// 如果想删除一个命令,直接把它重命名为一个空字符""即可,如下:
// rename-command CONFIG "" 

/********************************* LIMITS 约束 *********************************/
// 最大可用内存 maxmemory <bytes> 536870912,即512M
maxmemory 536870912 

// 当内存达到最大值的时候Redis会选择删除哪些数据?有五种方式可供选择
//
// volatile-lru -> 利用LRU算法移除设置过过期时间的key (LRU:最近使用 Least Recently Used )
// allkeys-lru -> 利用LRU算法移除任何key
// volatile-random -> 移除设置过过期时间的随机key
// allkeys->random -> remove a random key, any key
// volatile-ttl -> 移除即将过期的key(minor TTL)
// noeviction -> 不移除任何可以,只是返回一个写错误
maxmemory-policy allkeys-lru 

// LRU 和 minimal TTL 算法都不是精准的算法,但是相对精确的算法(为了节省内存),随意你可以选择样本大小进行检测。
// Redis默认的灰选择3个样本进行检测,你可以通过maxmemory-samples进行设置
maxmemory-samples 3 

/********************************* APPEND ONLY MODE *********************************/ 

// 启用aof持久化方式
// 因为redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认值为no
appendonly yes 

// 更新日志文件名,默认值为appendonly.aof
appendfilename "appendonly.aof" 

// 收到写命令立即写入磁盘,最慢,保证完全的持久化
appendfsync always
// 每秒写入一次
appendfsync everysec
// 完全依赖OS,性能最好,持久化没保证
appendfsync no 

// 部署在同一机器的redis实例,把auto-aof-rewrite打开,因为cluster环境下内存占用基本一致
#关闭在aof rewrite的时候对新的写操作进行fsync
no-appendfsync-on-rewrite yes 

// Automatic rewrite of the append only file.
// AOF 自动重写
// 当AOF文件增长到一定大小的时候Redis能够调用 BGREWRITEAOF 对日志文件进行重写
//
// 它是这样工作的:Redis会记住上次进行些日志后文件的大小(如果从开机以来还没进行过重写,那日子大小在开机的时候确定)
//
// 基础大小会同现在的大小进行比较。如果现在的大小比基础大小大制定的百分比,重写功能将启动
// 同时需要指定一个最小大小用于AOF重写,这个用于阻止即使文件很小但是增长幅度很大也去重写AOF文件的情况
// 设置 percentage 为0就关闭这个特性
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb 

aof-load-truncated yes 

/********************************* LUA SCRIPTING *********************************/
lua-time-limit 5000 

/********************************* REDIS CLUSTER 集群*********************************/
// 打开redis集群
cluster-enabled yes 

// cluster配置文件(启动自动生成)
cluster-config-file nodes-6379.conf 

// 节点互连超时的阀值
cluster-node-timeout 15000 

cluster-slave-validity-factor 10 

cluster-migration-barrier 1 

// 集群兼容部分失败
cluster-require-full-coverage yes 

/********************************* SLOW LOG *********************************/

// Redis Slow Log 记录超过特定执行时间的命令。执行时间不包括I/O计算比如连接客户端,返回结果等,只是命令执行时间
//
// 可以通过两个参数设置slow log:一个是告诉Redis执行超过多少时间被记录的参数slowlog-log-slower-than(微妙),
// 另一个是slow log 的长度。当一个新命令被记录的时候最早的命令将被从队列中移除 

// 下面的时间以微妙微单位,因此1000000代表一分钟。
// 注意制定一个负数将关闭慢日志,而设置为0将强制每个命令都会记录
slowlog-log-slower-than 10000 

// 对日志长度没有限制,只是要注意它会消耗内存
// 可以通过 SLOWLOG RESET 回收被慢日志消耗的内存
slowlog-max-len 128 

/********************************* LATENCY MONITOR *********************************/ 

latency-monitor-threshold 0 

/********************************* EVENT NOTIFICATION *********************************/

notify-keyspace-events "" 

/********************************* ADVANCED CONFIG *********************************/ 

// 当hash中包含超过指定元素个数并且最大的元素没有超过临界时,
// hash将以一种特殊的编码方式(大大减少内存使用)来存储,这里可以设置这两个临界值
// Redis Hash对应Value内部实际就是一个HashMap,实际这里会有2种不同实现,
// 这个Hash的成员比较少时Redis为了节省内存会采用类似一维数组的方式来紧凑存储,
而不会采用真正的HashMap结构,对应的value redisObject的encoding为zipmap, 

// 当成员数量增大时会自动转成真正的HashMap,此时encoding为ht。 

hash-max-ziplist-entries 512
hash-max-ziplist-value 64 

// list数据类型多少节点以下会采用去指针的紧凑存储格式。
// list数据类型节点值大小小于多少字节会采用紧凑存储格式。
list-max-ziplist-entries 512
list-max-ziplist-value 64 

// set数据类型内部数据如果全部是数值型,且包含多少节点以下会采用紧凑格式存储。
set-max-intset-entries 512 

// zsort数据类型多少节点以下会采用去指针的紧凑存储格式。
// zsort数据类型节点值大小小于多少字节会采用紧凑存储格式。
zset-max-ziplist-entries 128
zset-max-ziplist-value 64 

hll-sparse-max-bytes 3000 

// Redis将在每100毫秒时使用1毫秒的CPU时间来对redis的hash表进行重新hash,可以降低内存的使用
//
// 当你的使用场景中,有非常严格的实时性需要,不能够接受Redis时不时的对请求有2毫秒的延迟的话,把这项配置为no。
//
// 如果没有这么严格的实时性要求,可以设置为yes,以便能够尽可能快的释放内存
activerehashing yes 

client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60 

hz 10 

aof-rewrite-incremental-fsync yes 

/********************************* VM *********************************/

// 是否使用虚拟内存,默认值为no
vm-enabled yes

// 虚拟内存文件路径,默认值为/tmp/redis.swap,不可多个Redis实例共享
vm-swap-file /tmp/redis.swap

// 将所有大于vm-max-memory的数据存入虚拟内存,无论vm-max-memory设置多小,所有索引数据都是内存存储的
(Redis的索引数据就是keys),也就是说,当vm-max-memory设置为0的时候,其实是所有value都存在于磁盘。默认值为0。
vm-max-memory 0

// 虚拟内存文件以块存储,每块32bytes
vm-page-size 32

// 虚拟内在文件的最大数
vm-pages 134217728

// 可以设置访问swap文件的线程数,设置最好不要超过机器的核数,如果设置为0,那么所有对swap文件的操作都是串行的.
可能会造成比较长时间的延迟,但是对数据完整性有很好的保证.
vm-max-threads 4

/********************************* INCLUDES *********************************/
// 包含通用配置
include /etc/redis/redis-common.conf 

/********************************* GENERAL *********************************/
// 如以后台进程运行,则需指定一个pid,默认为/var/run/redis.pid
pidfile /var/run/redis_6379.pid 

// Redis默认监听端口
port 6379 

// 指定日志输出的文件名,可设为/dev/null屏蔽日志
logfile /var/log/redis_6379.log 

/********************************* SNAPSHOTTING 快照 *********************************/ 

// 本地数据库文件名,默认值为dump.rdb
dbfilename dump6379.rdb 

// 本地数据库存放路径,默认值为 ./
dir /var/redis/6379 

/********************************* REPLICATION Redis的复制配置 *********************************/ 

// 当本机为从服务时,设置主服务的IP及端口
// slaveof <masterip> <masterport> 

// 当本机为从服务时,设置主服务的连接密码
// masterauth <master-password> 

/********************************* APPEND ONLY MODE *********************************/ 

// 更新日志文件名,默认值为appendonly.aof
appendfilename "appendonly6379.aof" 

/********************************* REDIS CLUSTER 集群 *********************************/

// cluster配置文件(启动自动生成)
cluster-config-file nodes-6379.conf

redis快速安装

确保机器能连外网,直接root登录执行:

wget http://download.redis.io/releases/redis-3.2.6.tar.gz
tar xvf redis-3.2.6.tar.gz
mv redis-3.2.6 /usr/local/redis
cd /usr/local/redis
make

安装完毕·
建立软连接:

ln -s /usr/local/redis/src/redis-cli /usr/bin/

按业务需求修改下redis.conf配置文件,常用需修改的参数有binddaemonizelogfileDIRvm.overcommit_memory等;
增加下面三个参数,防止redis因内存问题挂掉

maxmemory 5368709120
maxmemory-policy allkeys-lru
maxmemory-samples 3

使用redis用户启动redis进程:

useradd redis
chown -R redis.redis /usr/local/redis/
su - redis
/usr/local/redis/src/redis-server /usr/local/redis/redis.conf

完成.

最新

分类

归档

评论

  • 安安: 都是af
  • Liang: 嗯,有点不通顺·
  • 王庭威: “MySQL互为主从...
  • Liang: 贴下编译参数和步骤,...
  • shao3911: 您好,为什么我在编译...
  • aliang: 先看是yum安装还是...
  • aliang: 将原来的nginx安...
  • yen: 3、如果要回滚的话,...
  • yen: 刚好需要升级ngin...
  • 文雨: 一些新的method...

其它