redis-3.2.0编译安装(单个实例)

#参考链接:http://www.cnblogs.com/langtianya/p/5189234.html

提示:2.x版本的redis不支持集群模式

wget http://download.redis.io/releases/redis-3.2.6.tar.gz

yum -y install wget lrzsz tree openssl openssl-devel zlib zlib-devel pcre pcre-devel make gcc gcc-c++ libevent libevent-devel ncurses ncurses-devel

redis安装后,不需要安装tcl8.5也是可以使用的,但是要使用Redis的测试用例也就是tests目录下面用的是tcl脚本,就需要安装tcl8.5 或更高版本

cd /usr/local/src

wget -P cd /usr/local/src  https://nchc.dl.sourceforge.net/project/tcl/Tcl/8.6.6/tcl8.6.6-src.tar.gz

tar xf tcl8.6.6-src.tar.gz

cd /usr/local/src/tcl8.6.6/unix

./configure --prefix=/usr/local/tcl8.6.6 --enable-64bit

make -j 2 && make install

添加环境变量

echo "export PATH=/usr/local//tcl8.6.6/bin:$PATH" >>/etc/profil

source /etc/profile

运行tclsh检测安装结果:

[root@Allen2 unix]# tclsh

%

表示成功   如果出现command not found 可以重新编译或者yum -y install tcl

如果已经下载redis那上传到/usr/local/src

如果没有下载 那么如下:

cd /usr/local/src

wget -P /usr/local/src  http://download.redis.io/releases/redis-3.2.0.tar.gz

tar xf redis-3.2.0.tar.gz

cd redis-3.2.0

make PREFIX=/usr/local/redis install  #指定安装路径

这样安装完以后,在/usr/local/redis下面有一个/bin目录,里面有5个redis命令脚本

报错:

make时如果遇到zmalloc.h:50:31: error: jemalloc/jemalloc.h: No such file or directory错误,用

make MALLOC=libc && make install              #重新安装

#更改配置文件保证安全性

mkdir -p /usr/local/redis/{etc,logs}

#拷贝配置文件

cp /usr/local/src/redis-3.2.0/redis.conf /usr/local/redis/etc/redis.conf  

cp /usr/local/src/redis-3.2.0/sentinel.conf /usr/local/redis/etc/sentinel.conf

#备份配置文件

cp /usr/local/redis/etc/redis.conf /usr/local/redis/etc/redis.conf.bak  

cp /usr/local/redis/etc/sentinel.conf /usr/local/redis/etc/sentinel.conf.bak

#拷贝一些命令启动文件

cp /usr/local/redis/bin/* /usr/bin/     或者是到/usr/sbin下

#更改配置文件

vim /usr/local/redis/etc/redis.conf

bind 192.168.1.106          #这个bind意思是绑定ip   一般生产线我们写成内网的ip 防止外网ip暴露  或者0.0.0.0允许所有,然后阿里云后台做端口限制

注意:如果这里没有允许0.0.0.0  执行redis-cli -h 127.0.0.1 -p 6379 这样可能本地都登陆不上的

port 6379               #默认端口6379   (线上可以参考别的服务器上的端口)

#设置密码,提供远程登录(可以不设置,看具体需求):

打开redis.conf文件(一般是我们启动redis时候指定的那个文件了

vim /usr/local/redis/etc/redis.conf

requirepass 123456                  #找到requirepass 取消注释  密码改成123456

更改配置文件:

timeout 30

daemonize yes

pidfile /usr/local/redis/logs/redis.pid     #这个根据自己需求和个人习惯

logfile /usr/local/redis/logs/redis.log   #需要mkdir一下这个目录

dir /usr/local/redis

#指定配置文件方式启动redis(一般公司生产线采用这样的方法启动):

/usr/local/redis/bin/redis-server  /usr/local/redis/etc/redis.conf

然后启动:

nohup  /usr/local/redis/bin/redis-server  /usr/local/redis/etc/redis.conf > /dev/null 2>&1 &

写到/etc/rc.local里面,让他开机自启:

echo "/usr/bin/nohup /usr/local/redis/bin/redis-server  /usr/local/redis/etc/redis.conf > /dev/null 2>&1 &" >>/etc/rc.local

在bin下的可执行程序:

redis-server:  redis服务器

redis-cli:  命令行客户端

redis-benchmark:  redis的性能测试工具

redis-check-aof:  AOF文件修复工具

redis-check-dump:  RDB文件检测工具

redis.conf   :  redis的配置文件

sentinel.conf:redis哨兵的配置文件

这两个文件在redis包解压目录下

采用默认配置文件方式启动redis(一般不这样启动)

/usr/local/redis/bin/redis-server

我们可以把/usr/local/redis/bin下面的命令拷贝到/usr/bin下面 这样就可以直接使用命令不需要进去redis安装目录了

如果需要安装多个实例的redis在一个服务器上,可以拷贝redis.conf 更改里面的配置文件 监听端口 日志文件 数据文件等路径改成不一样的 然后用redis-server指定配置文件启动即可

主从redis设置:

# slaveof <masterip> <masterport>

slaveof 192.168.20.126 6379          #指定主的ip和端口

如果master设置了验证密码,还需配置masterauth

# masterauth <master-password>

主redis设置密码是:

requirepass    123456   #设置连接密码为123456

然后在master执行set age 24

在slave执行get age,看是否能得到24,如果能够得到值则说明配置成功

可以在master禁用数据持久化,只需要注释掉master 配置文件中的所有save配置,然后只在slave上配置数据持久化

master配置文件中的save就是:

#save 900 1

#save 300 10

#save 60 10000

注释掉上面三个save就行了

拥有主从服务器的好处(从服务器是只读的,可以一主多从)

1.    主服务器进行读写时,会转移到从读,减轻服务器压力

2.    热备份 主从都可以设置密码,也可以密码不一致

关闭redis客户端:

/usr/local/redis/bin/redis-cli -h 127.0.0.1 -p 6379 shutdown

如果做了redis主从,并且redis-master设置了连接密码:

redis-master上 连接:

[root@Allen redis]# redis-cli  -p 6379

127.0.0.1:6379> info replication

NOAUTH Authentication required.

127.0.0.1:6379> exit

我们会看到你报错,就是提示你 需要认证

[root@Allen redis]# redis-cli  -p 6379 -a 123456          #用-a参数指定 设置的密码登录

127.0.0.1:6379> info replication

# Replication

role:master

connected_slaves:1

slave0:ip=192.168.20.126,port=7379,state=online,offset=351,lag=0

master_repl_offset:351

repl_backlog_active:1

repl_backlog_size:1048576

repl_backlog_first_byte_offset:2

repl_backlog_histlen:350

127.0.0.1:6379>

红色的代表redis-slave  有一个从redis已经连上,ip是: 192.168.20.126 端口是: 7379  状态:online 在线

在redis-slave上,远程连接redis-master:

[root@Allen2 logs]# redis-cli -h 192.168.20.125 -p 6379  #redis-master的ip  端口

192.168.20.125:6379> info replication

NOAUTH Authentication required.            #没有用-a指定连接密码,同样提示需要认证

192.168.20.125:6379>

[root@Allen2 logs]# redis-cli -h 192.168.20.125 -p 6379 -a 123456    #-a指定远程的密码

192.168.20.125:6379> info replication

# Replication

role:master

connected_slaves:1

slave0:ip=192.168.20.126,port=7379,state=online,offset=729,lag=1

master_repl_offset:729

repl_backlog_active:1

repl_backlog_size:1048576

repl_backlog_first_byte_offset:2

repl_backlog_histlen:728

192.168.20.125:6379>

登录redis-slave:

[root@Allen2 logs]# redis-cli  -p 7379

127.0.0.1:7379> info replication

# Replication

role:slave                                     #redis-slave

master_host:192.168.20.125      #redis-master的ip

master_port:6379                        #redis-master的端口

master_link_status:up                #redis-master的状态

master_last_io_seconds_ago:6

master_sync_in_progress:0

slave_repl_offset:1023

slave_priority:100                         #redis-slave的优先级

slave_read_only:1

connected_slaves:0

master_repl_offset:0

repl_backlog_active:0

repl_backlog_size:1048576

repl_backlog_first_byte_offset:0

repl_backlog_histlen:0

127.0.0.1:7379>

验证主从同步:

redis-master:192.168.20.125

redis-slave:192.168.20.126

登录redis-master:

[root@Allen redis]# redis-cli  -h 127.0.0.1 -p 6379 -a 123456

127.0.0.1:6379>

127.0.0.1:6379> set name allen

OK

127.0.0.1:6379> get name

"allen"

登录redis-slave:

[root@Allen2 redis]# redis-cli -h 127.0.0.1 -p 7379

127.0.0.1:7379> get name

"allen"

看到主从已经同步

默认 redis主从是分离的:

登录redis-slave:

[root@Allen2 redis]# redis-cli -h 127.0.0.1 -p 7379

127.0.0.1:7379> set name abc

(error) READONLY You can't write against a read only slave.

127.0.0.1:7379>

可以看到 redis-slave 不能使用set  提示只能读,不能写

主从切换:

停止主redis:

[root@Allen redis]#redis-cli -h 127.0.0.1 -p 6379  shutdown    #如果这个命令没用,那就kill -9 杀死redis进程

[root@Allen redis]# redis-cli -h 127.0.0.1 -p 6379 -a 123456 shutdown   #由于我们设置了验证密码,所以我们登陆或者杀死进程需要使用-a指定验证密码,并且在shutdown的时候-a指定密码一定要在shutdown前面,否则不会生效

Could not connect to Redis at 127.0.0.1:6379: Connection refused

not connected>

将从redis设置成主redis:

[root@Allen2 redis]# redis-cli -p 7379 slaveof NO ONE

OK

测试主从redis是否切换:

[root@Allen2 redis]# redis-cli -p 7379

127.0.0.1:7379> set name kkk

OK

127.0.0.1:7379> get name

"kkk"

127.0.0.1:7379>

当原来的主redis恢复了以后,要将他切换回去:

1)将现在的主redis的数据进行保存

[root@Allen2 redis]# redis-cli -p 7379

127.0.0.1:7379> set name kkk

OK

127.0.0.1:7379> get name

"kkk"

127.0.0.1:7379> set name 123

OK

127.0.0.1:7379> get name

"123"

127.0.0.1:7379> save

OK

127.0.0.1:7379> get name

"123"

127.0.0.1:7379> exit

 2)将现在的主redis根目录下dump.rdb文件拷贝覆盖到原来主redis的根目录

如果数据量大的话就用tar打包然后传过去到原先的主redis的根目录。这里的根目录是/usr/local/redis 目录。以为这是我的安装目录,我配置文件里面dump.rdb也在这个目录下,因为我启动redis就在这个目录下启动的。如果我们的redis-master上dump.rdb不是这个名字,那么我们拷贝过来后,要mv改成原来redis-master的rdb文件的名字,我这里直接scp了

[root@Allen2 redis]# scp dump.rdb  192.168.20.125:/usr/local/redis

The authenticity of host '192.168.20.125 (192.168.20.125)' can't be established.

RSA key fingerprint is 2c:cd:a9:58:f0:32:79:66:a2:48:ab:de:a8:59:7a:d9.

Are you sure you want to continue connecting (yes/no)? yes

Warning: Permanently added '192.168.20.125' (RSA) to the list of known hosts.

root@192.168.20.125's password:

dump.rdb

3)启动原来的主redis

[root@Allen redis]# redis-server ./redis6379.conf

[root@Allen redis]# ps -ef | grep redis

root       8176      1  0 22:52 ?        00:00:00 redis-server 0.0.0.0:6379    

root       8180   7760  0 22:52 pts/0    00:00:00 grep redis

  4)在现在的主redis中切换

[root@Allen redis]# redis-cli -h 192.168.20.126 -p 7379  slaveof 192.168.20.125 6379

OK

注意:redis-cli -h 192.168.20.126 -p 7379 指定从redis,slaveof 后面 是原先主redis的ip和端口192.168.20.125 6379

[root@Allen redis]# redis-cli -p 6379

127.0.0.1:6379> info

NOAUTH Authentication required.

127.0.0.1:6379> exit

[root@Allen redis]# redis-cli -p 6379 -a 123456

127.0.0.1:6379> info replication

# Replication

role:master

connected_slaves:1

slave0:ip=192.168.20.126,port=7379,state=online,offset=29,lag=1

master_repl_offset:29

repl_backlog_active:1

repl_backlog_size:1048576

repl_backlog_first_byte_offset:2

repl_backlog_histlen:28

127.0.0.1:6379>