目录
Redis简介
Redis 是一个开源、支持网络、基于内存、键值对存储数据库,使用 ANSI C 编写,可以在所有POSIX系统(如Linux, *BSD, Mac OS X, Solaris等)上安装运行。而且Redis并不依赖任何非标准库,也没有编译参数必需添加。编译安装Redis,我们唯一需要的就是make。其开发由 VMware 主持。根据月度排行网站 DB-Engines.com 的数据显示,Redis 是最流行的键值对存储数据库。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)和zset(有序集合)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类keyvalue存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Python,Ruby,Erlang,PHP客户端,使用很方便。
开启6379端口
vi /etc/sysconfig/iptables #编辑防火墙配置文件
-A INPUT -m state –state NEW -m tcp -p tcp –dport 6379 -j ACCEPT(允许6379端口通过防火墙)
#特别提示:很多网友把这一条规则添加到防火墙配置的最后一行,导致防火墙启动失败 #正确的应该是添加到默认的22端口这条规则的下面,添加好之后防火墙规则如下所示: ######################################################### # Firewall configuration written by system-config-firewall # Manual customization of this file is not recommended. *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -A INPUT -p icmp -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 6379 -j ACCEPT -A INPUT -j REJECT --reject-with icmp-host-prohibited -A FORWARD -j REJECT --reject-with icmp-host-prohibited COMMIT ######################################################### /etc/init.d/iptables restart #最后重启防火墙使配置生效
关闭SELINUX
vim /etc/selinux/config #编辑 #SELINUX=enforcing #注释掉 #SELINUXTYPE=targeted #注释掉 SELINUX=disabled #增加 :wq #保存退出 shutdown -r now #重启系统
物理环境
Master:192.168.1.249 CentOS 6.5
Slave:192.168.1.244 Centos 6.5
系统约定
源码包下载存放位置:/usr/local/src/软件包名字
源码包编译安装位置:/usr/local/软件包名字
源码包下载
在redis的官方网站(http://www.redis.io)下载最新的稳定版本redis-2.8.14.tar.gz。
cd /usr/local/src wget -c http://download.redis.io/releases/redis-2.8.14.tar.gz
安装配置Redis主服务
编译安装Redis
用tar -zxvf解压软件包。
tar -zxvf redis-2.8.14.tar.gz
用make && make install 编译安装Redis服务。
注:不用configure,在打包前代码已经被编译了
cd redis-2.8.14 make #编译,编译完成后就可以测试使用了,但是为了做成后台服务,最好把它安装到系统上 make test make install #安装会把redis的命令被拷贝到/usr/local/bin下面
在make成功以后,需要make test。在make test出现异常。
异常一:
You need tcl 8.5 or newer in order to run the Redis test
异常原因:没有安装tcl
解决方案:yum install -y tcl。
make命令已经包含了redis安装过程,执行完成后,会在src目录下生成5个可执行文件,分别是redis-server、redis-cli、redis-benchmark、redis-check-aof、redis-check-dump,它们的作用如下:
redis-server:Redis服务器的daemon启动程序
redis-cli:Redis命令行操作工具。当然,你也可以用telnet根据其纯文本协议来操作
redis-benchmark:Redis性能测试工具,测试Redis在你的系统及你的配置下的读写性能
redis-check-aof:更新日志检查
redis-check-dump:用于本地数据库检查
测试通过后安装,安装后会自动把redis-server,redis-cli,redis-benchmark,redis-check-aof,redis-check-dump复制到/usr/local/bin目录下。也可以把这些文件手工复制到其它目录,以使Redis相关的资源更好的统一管理。
成功安装Redis后,直接执行redis-server即可运行 Redis,此时它是按照默认配置来运行的(默认配置不是后台运行)。如果我们希望Redis按我们的要求运行,则需要修改配置文件。
创建Redis主配置文件目录,并复制redis.conf到该目录下面。
注:也可以不用创建Redis主配置文件目录,直接把redis.conf复制到/etc目录下即可
mkdir -p /etc/redis/ cp redis.conf /etc/redis/
建立用户与日志目录
第一次启动Redis前,建议为Redis单独建立一个用户,并新建data和日志文件夹
useradd redis mkdir -p /data/redis # 创建redis数据存放位置 mkdir -p /data/logs/redis/ # 日志文件存放位置 chown redis.redis /data/redis #db文件放在这里,要修改redis.conf chown redis.redis /data/logs/redis/
redis配置文件部分说明
根据需要,参考如下配置说明进行修改
[root@Redis249 redis]# vim /etc/redis/redis.conf #是否作为守护进程运行,默认为NO daemonize yes #如以后台进程运行,则需指定一个pid,默认为/var/run/redis.pid pidfile /data/logs/redis/redis.pid #绑定主机IP,默认值为127.0.0.1 bind 192.168.1.249 #redis监听的端口,默认为6379 port 6379 #客户端闲置多少秒后,断开连接,默认为300(秒) timeout 300 #日志记录等级,有4个可选值,debug,verbose(默认值),notice,warning loglevel notice #日志文件存放位置,默认为stdout,也可设为/dev/null屏蔽日志 logfile /data/logs/redis/redis.log #可用数据库数,默认为16 databases 16 #保存数据到disk的策略 #当有一条Keys数据被改变是,900秒刷新到disk一次 save 900 1 #当有10条Keys数据被改变时,300秒刷新到disk一次 save 300 10 #当有1w条keys数据被改变时,60秒刷新到disk一次 save 60 10000 #存储到本地数据库是否压缩,默认为yes rdbcompression yes #本地数据库文件名,默认为dump.rdb dbfilename yanzi_dump.rdb #本地数据库存放路径,默认值为 ./ dir /data/redis/ ########### Replication ##################### #Redis的复制配置 # slaveof <masterip> <masterport> 当本机为从服务时,设置主服务的IP及端口 # masterauth <master -password> 当本机为从服务时,设置主服务的连接密码 #redis slave连接密码 requirepass foobared #最大客户端连接数,默认不限制 # maxclients 128 #最大内存使用设置,达到最大内存设置后,Redis会先尝试清除已到期或即将到期的Key,当此方法处理后,如果到达最大内存设置,将无法再进行写入操作。 # maxmemory <bytes> #是否在每次更新操作后进行日志记录,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认值为no appendonly yes #更新日志文件名,默认值为appendonly.aof #更新日志文件名,默认为appendonly.aof appendfilename yanzi_update.aof #更新日志条件,共有3个可选值。no表示等操作系统进行数据缓存同步到磁盘,always表示每次更新操作后手动调用fsync()将数据写到磁盘,everysec表示每秒同步一次(默认值)。 # appendfsync always appendfsync everysec # appendfsync no no-appendfsync-on-rewrite no auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb slowlog-log-slower-than 10000 slowlog-max-len 1024 really-use-vm yes ################ VIRTUAL MEMORY ########### #是否开启VM(虚拟内存)功能,默认值为no vm-enabled 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文件的线程数 vm-max-threads 4 ############# ADVANCED CONFIG ############### glueoutputbuf yes #指定在超过一定数量或者最大元素超过某一临界时,采用一种特殊的哈希算法 hash-max-zipmap-entries 512 hash-max-zipmap-value 64 list-max-ziplist-entries 512 list-max-ziplist-value 64 set-max-intset-entries 512 zset-max-ziplist-entries 128 zset-max-ziplist-value 64 #是否重置Hash表 activerehashing yes
如果不配置主从,也可以只修改daemonize no改成yes即可。
注意:Redis官方文档对VM的使用提出了一些建议:
** 当你的key很小而value很大时,使用VM的效果会比较好。因为这样节约的内存比较大。
** 当你的key不小时,可以考虑使用一些非常方法将很大的key变成很大的value,比如你可以考虑将key,value组合成一个新的value。
** 最好使用linux ext3 等对稀疏文件支持比较好的文件系统保存你的swap文件。
** vm-max-threads这个参数,可以设置访问swap文件的线程数,设置最好不要超过机器的核数。如果设置为0,那么所有对swap文件的操作都是串行的。可能会造成比较长时间的延迟,但是对数据完整性有很好的保证。
调整内存分配使用方式
调整内存分配使用方式是通过调整系统内核参数来实现
如果内存情况比较紧张的话,需要设定内核参数:
echo 1 > /proc/sys/vm/overcommit_memory
或者
echo "vm.overcommit_memory=1" >> /etc/sysctl.conf # 使其生效 sysctl -p
这里说一下这个配置的含义:/proc/sys/vm/overcommit_memory
该文件指定了内核针对内存分配的策略,其值可以是0、1、2。
0,表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
1,表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
2,表示内核允许分配超过所有物理内存和交换空间总和的内存
Redis在dump数据的时候,会fork出一个子进程,理论上child进程所占用的内存和parent是一样的,比如parent占用的内存为 8G,这个时候也要同样分配8G的内存给child, 如果内存无法负担,往往会造成redis服务器的down机或者IO负载过高,效率下降。所以这里比较优化的内存分配策略应该设置为 1(表示内核允许分配所有的物理内存,而不管当前的内存状态如何)。
运行Redis
启动Redis主服务
启动Redis主服务,并设置开机自动重启
此步也可以不用操作,直接通过下文的init.d脚本进行控制
redis-server /etc/redis/redis.conf echo "redis-server /etc/redis/redis.conf" >> /etc/rc.local
即可在后台启动redis服务,确认运行了之后,可以用redis-benchmark命令测试看看,还可以通过redis-cli命令实际操作一下,比如:
redis-cli set foo bar OK redis-cli get foo bar
关闭服务
redis-cli shutdown
如果端口变化可以指定端口:
redis-cli -p 6380 shutdown
保存/备份
数据备份可以通过定期备份该文件实现。
因为redis是异步写入磁盘的,如果要让内存中的数据马上写入硬盘可以执行如下命令:
redis-cli save 或者 redis-cli -p 6380 save(指定端口)
注意,以上部署操作需要具备一定的权限,比如复制和设定内核参数等。
执行redis-benchmark命令时也会将内存数据写入硬盘。
同步机制
redis实现的同步机制相对简单,缺少同步机制常见的check point和校验机制。
在运行时,如果master -> slave同步请求转发被丢弃, slave将无法恢复该请求的相关信息,直到slave重启时从master全量加载数据时才能修复。因此,建议使用redis尽量利用其 key/value和value支持多种类型的特性,存储一些相对不重要的数据。
查看Redis端口是否监听
netstat -antlp | grep "redis"
编写自启动脚本
########################### #chkconfig: 2345 10 90 #description: Start and Stop redis PATH=/usr/local/bin:/sbin:/usr/bin:/bin REDISPORT=6379 EXEC=/usr/local/bin/redis-server REDIS_CLI=/usr/local/bin/redis-cli PIDFILE=/var/run/redis.pid CONF="/etc/redis.conf" case "$1" in start) if [ -f $PIDFILE ] then echo "$PIDFILE exists, process is already running or crashed" else echo "Starting Redis server..." $EXEC $CONF fi if [ "$?"="0" ] then echo "Redis is running..." fi ;; stop) if [ ! -f $PIDFILE ] then echo "$PIDFILE does not exist, process is not running" else PID=$(cat $PIDFILE) echo "Stopping ..." $REDIS_CLI -p $REDISPORT SHUTDOWN while [ -x ${PIDFILE} ] do echo "Waiting for Redis to shutdown ..." sleep 1 done echo "Redis stopped" fi ;; restart|force-reload) ${0} stop ${0} start ;; *) echo "Usage: /etc/init.d/redis {start|stop|restart|force-reload}" >&2 exit 1 esac ##############################
用这个脚本管理之前,需要先配置下面的内核参数,否则Redis脚本在重启或停止redis时,将会报错,并且不能自动在停止服务前同步数据到磁盘上:
vi /etc/sysctl.conf # 在文件末尾添加 vm.overcommit_memory = 1
然后使应用生效:
sysctl -p
出现error执行以下2个命令即可:
modprobe bridge lsmod|grep bridge
再次执行
sysctl -p
添加可执行权限
chmod +x /etc/init.d/redis
设置开机自动启动服务
chkconfig redis on
查看自动启动服务列表
chkconfig --list redis
启动服务:
service redis start 或者 /etc/init.d/redis start
停止服务:
service redis stop 或者 /etc/init.d/redis stop
查看redis进程是否启动
ps -aux | grep redis 或者 netstat -tnlp |grep redis
Redis主从配置
Redis主从复制特点
1、同一个Master可同步多个Slaves。
2、Slave可接受其它Slaves的连接和同步请求,有效分载Master的同步压力。因此可将Redis的Replication架构视为图结构。
3、Master Server以非阻塞的方式为Slaves提供服务。在Master-Slave同步期间,客户端仍可提交查询或修改请求。
4、Slave Server以非阻塞的方式完成数据同步,在首次同步数据时会阻塞不能处理客户端请求。之后在同步期间,客户端提交查询请求,Slave Server返回同步之前的数据。
5、主从复制可以用来提高系统的可伸缩性, 可将多个Slave服务器专门提供只读请求,如可用来做sort操作或做简单的数据冗余。
6、可禁用Master数据持久化操作,数据持久化操作交给Slaves完成,避免在Master中要有独立的进程来完成此操作。只需要注释掉master 配置文件中的所有save配置,然后只在slave上配置数据持久化。
redis主从复制原理
在Slave启动并连接到Master后,将主动发送SYNC命令。此后Master将启动后台存盘进程,将数据库快照保存到文件中,同时收集新的写命令(增、删、改)并缓存起来,在后台进程执行写文件。完毕后,Master将传送整个数据库文件到Slave,以完成一次完全同步。而Slave服务器在接收到数据库文件数据之后将其存盘并加载到内存恢复数据库快照到slave上。此后,Master继续将所有已经收集到的修改命令,和新的修改命令依次传送给Slaves,Slave将在本次执行这些数据修改命令,从而达到最终的数据同步。从master到slave的同步数据的命令和从 client发送的命令使用相同的协议格式。
如果Master和Slave之间的链接出现断连现象,Slave可以自动重连Master,但是在连接成功之后,一次完全同步将被自动执行。
如果master同时收到多个 slave发来的同步连接命令,只会使用启动一个进程来写数据库镜像,然后发送给所有slave。
redis主从复制配置
对于Redis的主从结构的配置相对比较简单,只需修改redis.conf文件,配置上主结点对应的IP及端口。具体如下所示:
requirepass redis123 (此项在主服务器上设置,从服务器连接所用的密码)
Port 6380 bind 10.20.150.205 slaveof 10.20.150.205 6379 masterauth redis123
port 6380表示当前该Redis服务对应的端口号;
bind 10.20.150.205 表示当前Redis绑定的主结点的IP地址。从服务器,此处默认是127.0.0.1,请修改成本机的IP地址,要不然,客户端无法进行访问;
slaveof 10.20.150.205 6379 表示当前Redis是哪个主结点的从结点,其中包括IP及端口号。
masterauth redis123(连接主服务器所用的密码,如果主服务器不设置密码,此项可不用开启)
在本例中,我们只需把主服务器/etc/redis/redis.conf配置文件复制到从服务器的/etc/redis/目录里面,把配置文件的bind地址修改成从服务器的IP地址,并添加或修改下面两行即可。
masterauth foobared slaveof 192.168.1.249 6379
重启主和从的Redis服务
redis-cli shutdown redis-server /etc/redis/redis.conf
Redis 主从配置测试
在Redis主服务器上面用redis-cli登陆服务器,用set命令给sfzhang赋值一串字符,可以用get命令获取该字符串的值。
[root@Redis249 ~]# redis-cli -h 192.168.1.249 -p 6379 192.168.1.249:6379> set sfzhang "i am from ningxia!" OK 192.168.1.249:6379> get sfzhang "i am from ningxia!" 192.168.1.249:6379> exit
在从服务器上面直接用get获取该字符串的值,如果没有报错且两者的值相同,说明Redis主从配置是OK的,其中的-a参数表示连接密码,密码为sfzhang。
[root@Redis244 ~]# redis-cli -h 192.168.1.244 -p 6379 -a sfzhang 192.168.1.244:6379> get sfzhang "i am from ningxia!"
Redis PHP扩展phpredis的安装配置
获取phpredis软件包
在redis官方网站clients里面下载PHP扩展所需要的软件包(https://github.com/nicolasff/phpredis)。
[root@Redis249 ~]# cd software [root@Redis249 software]# wget -c https://github.com/nicolasff/phpredis/archive/master.zip
安装配置phpredis
安装phpize
phpredis属于php扩展,所以需要phpize,如果你的服务器没有安装phpize,要先安装
#安装phpize yum install php-devel
phpize是什么东西呢?php官方的说明:http://php.net/manual/en/install.pecl.phpize.php
phpize是用来扩展php扩展模块的,通过phpize可以建立php的外挂模块
比如你想在原来编译好的php中加入memcached或者ImageMagick等扩展模块,可以使用phpize。
安装unzip
下面要解压zip文件,首先,你要有个unzip....
yum install unzip
编译php扩展
[root@Redis249 software]# unzip master.zip [root@Redis249 software]# cd phpredis-master [root@Redis249 software]#/usr/bin/phpize Configuring for: PHP Api Version: 20090626 Zend Module Api No: 20090626 Zend Extension Api No: 220090626 # ls就会发现文件夹中多了几个配置文件 [root@Redis249 software]#./configure -with-php-config=/usr/bin/php-config # 这个步骤会将上一步准备好的配置文件进行执行 [root@Redis249 software]#make && make install # 编译完成 Build complete. Don't forget to run 'make test'. Installing shared extensions: /usr/lib/php/modules/ 进入/usr/lib/php/modules 文件夹,发现redis.so的扩展。
加载redis模块
php.ini中添加extension=redis.so,重启PHP的php-fpm服务。如果是Apache服务器,则重启Apache服务即可。
service httpd restart
检查redis模块是否加载。
php -m |grep redis
或者查看phpinfo
编写PHP测试页
编写PHP测试页,测试php和redis是否能协同工作。
<?php $redis = new Redis(); $redis->connect('192.168.1.249', 6379); $redis->set('sfzhang', 'i am sfzhang, i am from ningxia!!'); echo $redis->get('sfzhang');
浏览器访问测试
浏览器访问测试,如果出现I am sfzhang,I come from ningxia!!,说明PHP连接Redis 成功。
redis-cli基本操作
redis 127.0.0.1:6379> info #查看server版本内存使用连接等信息 redis 127.0.0.1:6379> client list #获取客户连接列表 redis 127.0.0.1:6379> client kill 127.0.0.1:33441 #终止某个客户端连接 redis 127.0.0.1:6379> dbsize #当前保存key的数量 redis 127.0.0.1:6379> save #立即保存数据到硬盘 redis 127.0.0.1:6379> bgsave #异步保存数据到硬盘 redis 127.0.0.1:6379> flushdb #当前库中移除所有key redis 127.0.0.1:6379> flushall #移除所有key从所有库中 redis 127.0.0.1:6379> lastsave #获取上次成功保存到硬盘的unix时间戳 redis 127.0.0.1:6379> monitor #实时监测服务器接收到的请求 redis 127.0.0.1:6379> slowlog len #查询慢查询日志条数 (integer) 3 redis 127.0.0.1:6379> slowlog get #返回所有的慢查询日志,最大值取决于slowlog-max-len配置 redis 127.0.0.1:6379> slowlog get 2 #打印两条慢查询日志 redis 127.0.0.1:6379> slowlog reset #清空慢查询日志信息
附录
1、make时,出现入下错误:
Error 1:make[2]: cc: Command not found
异常原因:没有安装gcc
解决方案:yum install gcc
Error 2:zmalloc.h:51:31: error: jemalloc/jemalloc.h: No such file or directory
异常原因:一些编译依赖或原来编译遗留出现的问题
解决方案:make MALLOC=libc
【未验证】make distclean。清理一下,然后再make。
2、在make成功以后,需要make test。在make test出现如下错误。
[root@fiona redis-2.8.13.tar.gz]# make test
Error:couldn't execute "tclsh8.5": no such file or directory
异常原因:没有安装tcl
解决方案:yum install -y tcl。
3、安装到指定目录(/usr/local/redis)
[root@fiona redis-2.8.13.tar.gz]# make PREFIX=/usr/local/redis install
PREFIX可以自定义安装目录,注意一定要大写。
4、让Redis以后台进程的形式运行
修改配置文件里的daemonize。vim redis.conf --> daemonize yes
参考资料:
Redis主从及其PHP扩展安装配置:http://www.linuxidc.com/Linux/2012-11/73979.htm
CentOS Linux 下安装redis:http://blog.cnwyhx.com/centos-linux-install-redis/ (主要参考安装到非默认目录的方法)
CentOS下的Redis2.8.9编译安装以及相关配置:http://www.mudbest.com/centos%E4%B8%8B%E7%9A%84redis2-8-9%E7%BC%96%E8%AF%91%E5%AE%89%E8%A3%85%E4%BB%A5%E5%8F%8A%E7%9B%B8%E5%85%B3%E9%85%8D%E7%BD%AE/
Redis安装及主从配置:http://www.linuxidc.com/Linux/2012-08/67087.htm
Redis主从配置详细过程:http://sofar.blog.51cto.com/353572/861276
0 条评论。