Redis安装
https://redis.io/官网
下载最新版的redis:
wget http://download.redis.io/releases/redis-5.0.2.tar.gz
tar -xf redis-5.0.2.tar.gz
yum -y install tcl gcc-c++
make MALLOC=libc
make
make PREFIX=/usr/local/redis install
cd src/redis-5.0.2/utils/
cp redis_init_script /etc/init.d/redis
vim /etc/init.d/redis(脚本开头两个路径需要修改)
EXEC=/usr/local/redis/bin/redis-server
CLIEXEC=/usr/local/redis/bin/redis-cli
chmod +x /etc/init.d/redis
mkdir /etc/redis
cp /usr/local/src/redis-5.0.2/redis.conf /etc/redis/6379.conf
启动redis
/etc/init.d/redis start
设置后台启动
vim /etc/redis/6379.conf
daemonize yes
给经常用到的redis命令行工具redis-cli做一个软连接:
ln -s /usr/local/redis/bin/redis-cli /usr/local/bin/redis-cli
[[email protected] bin] pwd
/usr/local/redis/bin
[[email protected] bin] ll
总用量 54236
-rwxr-xr-x. 1 root root 9200267 11月 26 16:26 redis-benchmark
-rwxr-xr-x. 1 root root 12251863 11月 26 16:26 redis-check-aof
-rwxr-xr-x. 1 root root 12251863 11月 26 16:26 redis-check-rdb
-rwxr-xr-x. 1 root root 9564886 11月 26 16:26 redis-cli
lrwxrwxrwx. 1 root root 12 11月 26 16:26 redis-sentinel -> redis-server
-rwxr-xr-x. 1 root root 12251863 11月 26 16:26 redis-server
连接redis
[[email protected] bin] redis-cli
127.0.0.1:6379> exit
[[email protected] bin] redis-cli -h 10.3.45.233 -p 6379
10.3.45.233:6379>
解决ip不能连接redis服务的问题
vim /etc/redis/6379.conf
注释掉:bind 127.0.0.1
修改参数: protected-mode no
重启redis即可(先关闭再启动)。
修改配置文件中log存放位置
logfile "/var/log/redis.log"
Redis的2种持久化方式Snapshot(RDB)和Append-only file(AOF)的配置和对比
一种是Snapshot(RDB),就是保存某一时刻的数据在磁盘;另外一种是append-only file(AOF),就是以追加的方式记录所有写操作的命令到磁盘文件里面。
save <seconds> <changes>:在X秒内如果key有至少X次改变就触发持久化
指定本地持久化数据库文件名,默认值为dump.rdb
可自定义修改dbfilename dump_6379.rdb
指定本地持久化数据库存放目录
可自定义修改dir /usr/local/redis
改为yes就是AOF持久化开启:appendonly yes
指定更新日志文件名,默认为appendonly.aof
可自定义修改appendfilename appendonly_6379.aof
- snapshot在下一次触发前如果服务器crash了,在上次snapshot之后修改的数据会丢失,而AOF是记录所有的写操作,在数据完整性来说,AOF比snapshot要好;
或者同时使用2种方式(重启的时候会优先使用AOF)。
Windows安装redis:
http://www.cnblogs.com/jaign/articles/7920588.html
Redis复制
需要增加一个实例,就在同一台服务器上拷贝一个6380的配置
[[email protected] redis] cd /etc/redis/
[[email protected] redis] ll
总用量 64
-rw-r--r--. 1 root root 62296 11月 28 09:59 6379.conf
[[email protected] redis] cp 6379.conf 6380.conf
[[email protected] redis] ll
总用量 128
-rw-r--r--. 1 root root 62296 11月 28 09:59 6379.conf
-rw-r--r--. 1 root root 62296 11月 28 10:40 6380.conf
[[email protected] redis] vim 6380.conf
:%s/6379/6380/g
直接替换对比一下:
[[email protected] redis] diff 6379.conf 6380.conf
91c91
< Accept connections on the specified port, default is 6379 (IANA 815344).
---
> Accept connections on the specified port, default is 6380 (IANA 815344).
93c93
< port 6379
---
> port 6380
159c159
< pidfile /var/run/redis_6379.pid
---
> pidfile /var/run/redis_6380.pid
255c255
< dbfilename dump_6379.rdb
---
> dbfilename dump_6380.rdb
708c708
< appendfilename "appendonly_6379.aof"
---
> appendfilename "appendonly_6380.aof"
851c851
< cluster-config-file nodes-6379.conf
---
> cluster-config-file nodes-6380.conf
979c979
< cluster-announce-port 6379
---
> cluster-announce-port 6380
进入6380.conf的存放目录手动启动6380
[[email protected] redis] pwd
/etc/redis
[[email protected] redis] /usr/local/redis/bin/redis-server 6380.conf
查看端口是否正常
主从复制原理:
1 全量同步
Redis全量复制一般发生在Slave初始化阶段,这时Slave需要将Master上的所有数据都复制一份。具体步骤如下:
1)从服务器连接主服务器,发送SYNC命令;
2)主服务器接收到SYNC命名后,开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所有写命令;
3)主服务器BGSAVE执行完后,向所有从服务器发送快照文件,并在发送期间继续记录被执行的写命令;
4)从服务器收到快照文件后丢弃所有旧数据,载入收到的快照;
5)主服务器快照发送完毕后开始向从服务器发送缓冲区中的写命令;
6)从服务器完成对快照的载入,开始接收命令请求,并执行来自主服务器缓冲区的写命令;
2 增量同步
Redis增量复制是指Slave初始化后开始正常工作时主服务器发生的写操作同步到从服务器的过程。
增量复制的过程主要是主服务器每执行一个写命令就会向从服务器发送相同的写命令,从服务器接收并执行收到的写命令。
3 Redis主从同步策略
主从刚刚连接的时候,进行全量同步;全同步结束后,进行增量同步。当然,如果有需要,slave 在任何时候都可以发起全量同步。redis 策略是,无论如何,首先会尝试进行增量同步,如不成功,要求从机进行全量同步。
4 注意点
如果多个Slave断线了,需要重启的时候,因为只要Slave启动,就会发送sync请求和主机全量同步,当多个同时出现的时候,可能会导致Master IO剧增宕机。
主从同步配置:
分别用6379和6380的端口连上redis,然后输入info查看Replication的role状态,起初都是master
[[email protected] ~] redis-cli -h 10.3.45.233 -p 6379
10.3.45.233:6379> info
…
[[email protected] ~] redis-cli -h 10.3.45.233 -p 6380
slaveof命令
表示将10.3.45.233的6379配置为master
10.3.45.233:6380> slaveof 10.3.45.233 6379
在6380上再用info查看就看到自己变成了slave
10.3.45.233:6380> info
Redis cluster
redis集群起始于redis3.0版本以后
mkdir /opt
cd /opt
mkdir `seq 7001 7008`
cp /etc/redis/6379.conf ./
vim 6379.conf(pidfile要改,logfile要改,dbfilename要改,dir要改,还要加入集群需要的三行参数)
pidfile /var/run/redis_6379.pid
logfile "/var/log/redis_6379.log"
dbfilename dump_6379.rdb
dir /opt/6379
新内容一般插入到端口下面
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
统一替换
sed 's/6379/7008/g' 6379.conf >7008/redis.conf
sed 's/6379/7007/g' 6379.conf >7007/redis.conf
sed 's/6379/7006/g' 6379.conf >7006/redis.conf
sed 's/6379/7005/g' 6379.conf >7005/redis.conf
sed 's/6379/7004/g' 6379.conf >7004/redis.conf
sed 's/6379/7003/g' 6379.conf >7003/redis.conf
sed 's/6379/7002/g' 6379.conf >7002/redis.conf、
sed 's/6379/7001/g' 6379.conf >7001/redis.conf
启动用for循环命令:
for i in `seq 7001 7008` do cd /opt/$i && /usr/local/redis/bin/redis-server redis.conf;done
还可以依次去连接每个端口并info查看一定要保证全部启动正常
redis-cli -h 10.3.45.233 -p 7001
10.3.45.233:7001> info
redis-cli -h 10.3.45.233 -p 7002
10.3.45.233:7002> info
redis-cli -h 10.3.45.233 -p 7003
10.3.45.233:7003> info
redis-cli -h 10.3.45.233 -p 7004
10.3.45.233:7004> info
redis-cli -h 10.3.45.233 -p 7005
10.3.45.233:7005> info
redis-cli -h 10.3.45.233 -p 7006
10.3.45.233:7006> info
redis-cli -h 10.3.45.233 -p 7007
10.3.45.233:7007> info
redis-cli -h 10.3.45.233 -p 7008
10.3.45.233:7008> info
安装ruby
取消ssl验证参数:--no-check-certificate
cd /usr/local/src
wget --no-check-certificate https://cache.ruby-lang.org/pub/ruby/2.5/ruby-2.5.3.tar.gz
tar xf ruby-2.5.3.tar.gz
cd ruby-2.5.3
./configure --prefix=/usr/local/ruby
make
make install
添加环境变量:
vim /etc/profile
export PATH=$PATH:/usr/local/ruby/bin
source /etc/profilegem install redis
ruby管理工具gem安装redis
gem install redis
拷贝ruby脚本redis-trib这个脚本用来便于管理redis
cp /usr/local/src/redis-5.0.2/src/redis-trib.rb /usr/local/bin/redis-trib
创建集群使用 redis-trib 的 create 命令完成
redis-trib create –replicas 1 10.3.45.233:7001 10.3.45.233:7002 10.3.45.233:7003 10.3.45.233:7004 10.3.45.233:7005 10.3.45.233:7006
WARNING: redis-trib.rb is not longer available!
上面的警告,原因是因为redis5.0使用redis-cli作为创建集群的命令,使用c语言实现,不再使用ruby语言。也就是说上面的命令适用于redis5.0版本之前的,那么下面这条命令才是5.0版本以后的集群创建命令,所以说如果你用的redis5.0以上的版本就可以不用安装ruby。
redis5以后创建集群命令不再用redis-trib.rb,而是回归于redis-cli,于是用下面命令
cd /usr/local/bin
./redis-cli --cluster create --cluster-replicas 1 10.3.45.233:7001 10.3.45.233:7002 10.3.45.233:7003 10.3.45.233:7004 10.3.45.233:7005 10.3.45.233:7006
从结果看redis创建集群的时候回自动把后面三个IP设置成前三个IP的slave。
通过连接某一台集群内的服务是否配合正常
redis连接集群内的节点要加-c参数
[[email protected] ~]# redis-cli -c -h 10.3.45.233 -p 7001
10.3.45.233:7001> info
上面可以看到7001为master,7004分配为它的slave。
还可以在master上set一个key然后去slave查看数据是否同步完成
[[email protected] ~]# redis-cli -c -h 10.3.45.233 -p 7001
10.3.45.233:7001> set key 123
-> Redirected to slot [12539] located at 10.3.45.233:7003
OK
10.3.45.233:7003>
[[email protected] ~]# redis-cli -c -h 10.3.45.233 -p 7001
10.3.45.233:7001> get keys *
(error) ERR wrong number of arguments for 'get' command
10.3.45.233:7001> keys *
(empty list or set)
10.3.45.233:7001> exit
[[email protected] ~]# redis-cli -c -h 10.3.45.233 -p 7006
10.3.45.233:7006> keys *
1) "key"
10.3.45.233:7006> get key
-> Redirected to slot [12539] located at 10.3.45.233:7003
"123"
10.3.45.233:7003> exit
[[email protected] ~]# redis-cli -c -h 10.3.45.233 -p 7004
10.3.45.233:7004> keys *
(empty list or set)
10.3.45.233:7004> get key
-> Redirected to slot [12539] located at 10.3.45.233:7003
"123"
10.3.45.233:7003> set key1 abc
-> Redirected to slot [9189] located at 10.3.45.233:7002
OK
10.3.45.233:7002> exit
[[email protected] ~]# redis-cli -c -h 10.3.45.233 -p 7005
10.3.45.233:7005> get key1
-> Redirected to slot [9189] located at 10.3.45.233:7002
"abc"
10.3.45.233:7002> keys *
1) "key1"
10.3.45.233:7002>
细节发现客户端连接加-c选项的时候,存储和提取key的时候不断在7001和7003之间跳转,这个称为客户端重定向。之所以发生客户端重定向,是因为Redis Cluster中的每个Master节点都会负责一部分的槽(slot),存取的时候都会进行键值空间计算定位key映射在哪个槽(slot)上,如果映射的槽(slot)正好是当前Master节点负责则直接存取,否则就跳转到其他Master节点负的槽(slot)中存取,这个过程对客户端是透明的。继续看下面的集群分区原理。
Redis集群分区原理
槽(slot)的基本概念
从上面集群的简单操作中,我们已经知道redis存取key的时候,都要定位相应的槽(slot)。
Redis 集群键分布算法使用数据分片(sharding)而非一致性哈希(consistency hashing)来实现: 一个 Redis 集群包含 16384 个哈希槽(hash slot), 它们的编号为0、1、2、3……16382、16383,这个槽是一个逻辑意义上的槽,实际上并不存在。redis中的每个key都属于这 16384 个哈希槽的其中一个,存取key时都要进行key->slot的映射计算。
键-槽映射算法
和memcached一样,redis也采用一定的算法进行键-槽(key->slot)之间的映射。memcached采用一致性哈希(consistency hashing)算法进行键-节点(key-node)之间的映射,而redis集群使用集群公式来计算键 key 属于哪个槽:
集群分区好处
无论是memcached的一致性哈希算法,还是redis的集群分区,最主要的目的都是在移除、添加一个节点时对已经存在的缓存数据的定位影响尽可能的降到最小。redis将哈希槽分布到不同节点的做法使得用户可以很容易地向集群中添加或者删除节点
还可以在客户端直接查看集群信息和集群节点信息
cluster nodes
cluster info
集群添加节点
可以用redis-cli –cluster help查看帮助
语法:add-node new_host:new_port existing_host:existing_port
这是redis5.0版本的用法,5.0之前的版本应该只需去掉—cluster并且把redis-cli换成redis-trib.rh就可以。
添加7007节点
redis-cli –cluster add-node 10.3.45.233:7007 10.3.45.233:7001
从集群节点信息可以看出新添加的节点是没有分配任何槽位,这样的话在集群中是不能写入数据到这个节点的,也就是不会重定向到这个节点,除非单独连接这个节点,所以需要给新节点进行重新分片(迁移槽位)
节点重新分片命令用reshard
redis-cli --cluster reshard 10.3.45.233:7007
迁移槽位之后再看节点信息,0-332,5461-5794,10923-11255分配了1000个槽位如下正常
再添加一个从节点7008,并设置7007成为7008的master。
redis-cli --cluster add-node 10.3.45.233:7008 10.3.45.233:7001 --cluster-slave --cluster-master-id 69ed043676047f98c33c16ecce23bb26ad8d24a7
注意:如果是5.0以前的版本是不需要重新添加7008的,只要需要客户端连接到7008里面去执行命令 cluster replicate后面跟上主节点id就可以了。
删除节点
语法:redis-cli --cluster del-node 127.0.0.1:7000 <node-id>
注意:删除节点之前要先kill掉集群服务节点的进程。
redis几个管理工具
phpredisadmin
另外站在性能的角度上看,我不建议在线上redis环境中使用,毕竟PHPredisadmin是一款对海量大数据进行管理的web界面,会消耗比较大的系统资源
这个工具只有github上面有,并且需要编译安装redis模块会用到php和php-redis
安装启动httpd
yum -y install httpd
/etc/init.d/httpd start
先安装git
卸载自带的git
yum remove git -t
下载地址:https://mirrors.edge.kernel.org/pub/software/scm/git/
安装依赖
yum -y install curl-devel expat-devel gettext-devel openssl-devel zlib-devel libcurl4-gnutls-dev libexpat1-dev gettext libz-dev libssl-dev asciidoc xmlto docbook2x
下面一步是为了避免执行make all doc info时报:/bin/sh: line 1: docbook2x-texi: command not found
ln -s /usr/bin/db2x_docbook2texi /usr/bin/docbook2x-texi
wget https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.9.5.tar.gz
tar xf git-2.9.5.tar.gz
cd git-2.9.5
编译安装
make configure
./configure --prefix=/usr/local/git // 配置安装路径
make all doc info // 编译
make install install-doc install-html install-info // 安装
完成后,你可以使用 Git 来获取 Git 的升级: 可选
git clone git://git.kernel.org/pub/scm/git/git.git
修改环境变量
echo -e "# git\nexport PATH=/usr/local/git/bin:\$PATH"> /etc/profile.d/git.sh
查看是否安装成功
[[email protected] git-2.9.5]# git --version
git version 2.9.5
克隆安装phpredisadmin配置
cd /var/www/html
升级ssl证书
yum update -y nss curl libcurl openssh
执行克隆命令
git clone https://github.com/erikdubbelboer/phpRedisAdmin.git
继续执行
cd phpRedisAdmin
git clone https://github.com/nrk/predis.git vendor
mv phpRedisAdmin admin
yum install php-mbstring -y
/etc/init.d/httpd restart
浏览器访问:10.3.45.233/admin
配置添加多个server节点
[[email protected] ~]# cd /var/www/html/admin/includes/
[[email protected] includes]# ll
总用量 36
-rw-r--r--. 1 apache apache 3482 12月 7 17:18 common.inc.php
-rw-r--r--. 1 apache apache 992 12月 7 17:18 config.environment.inc.php
-rw-r--r--. 1 apache apache 3081 12月 7 17:18 config.sample.inc.php
-rw-r--r--. 1 apache apache 16 12月 7 17:18 footer.inc.php
-rw-r--r--. 1 apache apache 2775 12月 7 17:18 functions.inc.php
-rw-r--r--. 1 apache apache 1066 12月 7 17:18 header.inc.php
-rw-r--r--. 1 apache apache 5002 12月 7 17:18 login.inc.php
-rw-r--r--. 1 apache apache 310 12月 7 17:18 page.inc.php
[[email protected] includes]# cp config.sample.inc.php ./config.sample.inc.php.bak
[[email protected] includes]# vim config.sample.inc.php
工具rdbtools
生产中会用来分析内存
下载安装pip
wget --no-check-certificate https://bootstrap.pypa.io/3.2/get-pip.py
python get-pip.py
pip -V #查看pip版本
用pip安装rdbtools
pip install rdbtools
生成内存报告
运行时会 -c memory生成一个CSV报告,其中包含该**使用的大致内存。--bytes C并且'--largest N可用于将输出限制为大于C字节的键或N个最大键。
rdb -c memory /var/redis/6379/dump.rdb --bytes 128 -f memory.csv
或者rdb -c memory /var/redis/6379/dump.rdb >> memory.csv
cat memory.csv
还可以把生成的scv表格导入到本地查看。
.........
未完结,请稍等...