首页 / REDIS / Redis高可用安装笔记
Redis高可用安装笔记
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Redis高可用安装笔记,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含11144字,纯文字阅读大概需要16分钟。
内容图文
![Redis高可用安装笔记](/upload/InfoBanner/zyjiaocheng/1156/0a97fb0ce1544affbae7d1af59b0dad4.jpg)
redis是一个键值(key-value)存储系统。和Memcached类似,它支持存储的value类型有很多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。redis还会周期性把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
redis主从复制原理:
在Slave启动并连接到Master之后,它将主动发送一个SYNC命令。此后Master将启动后台存盘进程,同时收集所有接收到的用于修改数据集的命令,在后台进程执行完毕后,Master将传送整个数据库文件到Slave,以完成一次完全同步。而Slave服务器在接收到数据库文件数据之后将其存盘并加载到内存中。此后,Master继续将所有已经收集到的修改命令,和新的修改命令依次传送给Slaves,Slave将在本次执行这些数据修改命令,从而达到最终的数据同步。
如果Master和Slave之间的链接出现断连现象,Slave可以自动重连Master,但是在连接成功之后,一次完全同步将被自动执行。
redis主从复制的特点:
(1).同一个Master可以同步多个Slaves。
(2).Slave同样可以接受其它Slaves的连接和同步请求,这样可以有效的分载Master的同步压力。因此我们可以将Redis的Replication架构视为图结构。
(3).Master Server是以非阻塞的方式为Slaves提供服务。所以在Master-Slave同步期间,客户端仍然可以提交查询或修改请求。
(4).Slave Server同样是以非阻塞的方式完成数据同步。在同步期间,如果有客户端提交查询请求,Redis则返回同步之前的数据。
(5).为了分载Master的读操作压力,Slave服务器可以为客户端提供只读操作的服务,写服务仍然必须由Master来完成。即便如此,系统的伸缩性还是得到了很大的提高。
(6).Master可以将数据保存操作交给Slaves完成,从而避免了在Master中要有独立的进程来完成此操作。
Redis主从复制方式:配置文件中设置;Redis客户端中进行设置
有两种方式可以用来完成进行主从Redis服务器的同步设置。都需要针对slave服务器上进行,指定slave需要连接的Redis服务器(可能是master,也可能是slave)。
(1)在配置文件中设置
在作为slave的Redis服务器的配置文件(redis.conf)中设置。
slaveof 192.168.10.161 6379 #指定master的ip和端口
(2)在Redis客户端中进行设置
这里以Redis官方推荐的Jedis为例来说明,后文中的测试也基于Jedis来进行。这里jedis对象实例是属于slave的,参数是服务器的地址和端口。
slaveJdedis.slaveOf("192.168.10.161", 6379); #指定master的ip和端口
补充:slaveJdedis.slaveofNoOne(); # 取消指定master,自己成为一个master了。
环境规划:
master:192.168.10.161 6379
slave:192.168.10.160 6379
auth:system
1.在master和slave上安装redis
在160(M),161(S)都执行下面操作:
vi /etc/sysctl.conf
添加一行: vm.overcommit_memory=1
[root@test ~]# mkdir /usr/local/redis
[root@test ~]# mkdir /usr/local/redis/log
[root@test ~]# mkdir /usr/local/redis/db
[root@test ~]# mkdir /usr/local/redis/script
[root@test ~]# wget http://download.redis.io/releases/redis-3.0.2.tar.gz
[root@test ~]# tar xzf redis-3.0.2.tar.gz
[root@test ~]# cd redis-3.0.2
[root@test redis-3.0.2]# vim src/redis.c
{"flushdb",flushdbCommand,1,"w",0,NULL,0,0,0,0,0},
{"flushall",flushallCommand,1,"w",0,NULL,0,0,0,0,0},
修改成:
{"xflushdb",flushdbCommand,1,"w",0,NULL,0,0,0,0,0},
{"xflushall",flushallCommand,1,"w",0,NULL,0,0,0,0,0},
[root@test redis-3.0.2]# make PREFIX=/usr/local/redis install
root@test redis-3.0.2]# cd /usr/local/redis
[root@test redis]# ll
total 12
drwxr-xr-x 2 root root 4096 Jul 7 16:34 bin
drwxr-xr-x 2 root root 4096 Jul 7 16:27 db
drwxr-xr-x 2 root root 4096 Jul 7 16:27 log
安装完成!!
2.编写redis相关脚本(master和slave)
(1)启动脚本
[root@test ~]# vim /usr/local/redis/script/startRedis.sh
#!/bin/bash
basedir=`dirname $0`
echo "Redis BASE DIR:$basedir"
cd $basedir
nohup /usr/local/redis/bin/redis-server ./redis.conf > /dev/null 2>&1 &
(2)关闭脚本
[root@test ~]# vim /usr/local/redis/script/stopRedis.sh
#!/bin/sh
basedir=`dirname $0`
echo "Redis BASE DIR:$basedir"
cd $basedir
/usr/local/redis/bin/redis-cli -h localhost -a system shutdown
(3)配置文件
[root@test ~]# vim /usr/local/redis/script/redis.conf
161主库:
requirepass system
pidfile /usr/local/redis/bin/redis.pid
logfile /usr/local/redis/log/redis.log
dir /usr/local/redis/db/
daemonize yes
port 6379
timeout 300
loglevel warning
databases 16
maxmemory 1g
#使用AOF
appendonly yes
appendfsync everysec
160从库:
slaveof 192.168.10.161 6379
masterauth system
pidfile /usr/local/redis/bin/redis.pid
logfile /usr/local/redis/log/redis.log
dir /usr/local/redis/db/
daemonize yes
port 6379
timeout 300
loglevel warning
databases 16
maxmemory 1g
#使用AOF
appendonly yes
appendfsync everysec
(4)redis监控脚本及keepalived调用的脚本
在Master和Slave上创建监控Redis的脚本:
[root@test keepalived-1.2.18]# vim /usr/local/redis/script/redis_check.sh
#!/bin/bash
C_DATE=`date +"[%Y-%m-%d %H:%M:%S]"`
ALIVE=`/usr/local/redis/bin/redis-cli PING`
if [ "$ALIVE" == "PONG" ]; then
echo "${C_DATE} $ALIVE"
exit 0
else
echo "${C_DATE} $ALIVE"
exit 1
fi
在Master与Slave创建如下脚本redis_fault和redis_stop:
[root@test keepalived-1.2.18]# vim /usr/local/redis/script/redis_fault.sh
#!/bin/bash
C_DATE=`date +"[%Y-%m-%d %H:%M:%S]"`
LOGFILE=/usr/local/redis/log/keepalived-redis-state.log
echo "${C_DATE} [fault]" >> $LOGFILE
[root@test keepalived-1.2.18]# vim /usr/local/redis/script/redis_stop.sh
#!/bin/bash
C_DATE=`date +"[%Y-%m-%d %H:%M:%S]"`
LOGFILE=/usr/local/redis/log/keepalived-redis-state.log
echo "${C_DATE} [stop]" >> $LOGFILE
在Master上创建redis_master与redis_backup脚本:
[root@test keepalived-1.2.18]# vim /usr/local/redis/script/redis_master.sh
#!/bin/bash
C_DATE=`date +"[%Y-%m-%d %H:%M:%S]"`
REDISCLI="/usr/local/redis/bin/redis-cli"
LOGFILE="/usr/local/redis/log/keepalived-redis-state.log"
echo "${C_DATE} [master]" >> $LOGFILE
#当keepalived配置为"抢占式"时,打开下面注释
#echo "Being master...." >> $LOGFILE 2>&1
#echo "Run SLAVEOF cmd ..." >> $LOGFILE
#$REDISCLI SLAVEOF T2 6379 >> $LOGFILE 2>&1
#sleep 10 #延迟10秒以后待数据同步完成后再取消同步状态
echo "Run SLAVEOF NO ONE cmd ..." >> $LOGFILE
$REDISCLI SLAVEOF NO ONE >> $LOGFILE 2>&1
[root@test keepalived-1.2.18]# vim /usr/local/redis/script/redis_backup.sh
#!/bin/bash
C_DATE=`date +"[%Y-%m-%d %H:%M:%S]"`
REDISCLI="/usr/local/redis/bin/redis-cli"
LOGFILE="/usr/local/redis/log/keepalived-redis-state.log"
echo "${C_DATE} [backup]" >> $LOGFILE
#当keepalived配置为"抢占式"时,打开下面注释
#echo "Being slave...." >> $LOGFILE 2>&1
#sleep 15 #延迟15秒待数据被对方同步完成之后再切换主从角色
echo "Run SLAVEOF cmd ..." >> $LOGFILE
$REDISCLI SLAVEOF T2 6379 >> $LOGFILE 2>&1
在Slave上创建notity_master与notify_backup脚本:
vim /usr/local/redis/script/redis_master.sh
#!/bin/bash
C_DATE=`date +"[%Y-%m-%d %H:%M:%S]"`
REDISCLI="/usr/local/redis/bin/redis-cli"
LOGFILE="/usr/local/redis/log/keepalived-redis-state.log"
echo "${C_DATE} [master]" >> $LOGFILE
#当keepalived配置为"抢占式"时,打开下面注释
#echo "Being master...." >> $LOGFILE 2>&1
#echo "Run SLAVEOF cmd ..." >> $LOGFILE
#$REDISCLI SLAVEOF T1 6379 >> $LOGFILE 2>&1
#sleep 10 #延迟10秒以后待数据同步完成后再取消同步状态
echo "Run SLAVEOF NO ONE cmd ..." >> $LOGFILE
$REDISCLI SLAVEOF NO ONE >> $LOGFILE 2>&1
vim /usr/local/redis/script/redis_backup.sh
#!/bin/bash
C_DATE=`date +"[%Y-%m-%d %H:%M:%S]"`
REDISCLI="/usr/local/redis/bin/redis-cli"
LOGFILE="/usr/local/redis/log/keepalived-redis-state.log"
echo "${C_DATE} [backup]" >> $LOGFILE
#当keepalived配置为"抢占式"时,打开下面注释
#echo "Being slave...." >> $LOGFILE 2>&1
#sleep 15 #延迟15秒待数据被对方同步完成之后再切换主从角色
echo "Run SLAVEOF cmd ..." >> $LOGFILE
$REDISCLI SLAVEOF T1 6379 >> $LOGFILE 2>&1
在Master和Slave上,给监控脚本都加上可执行权限:
chmod +x /usr/local/redis/script/*.sh
3.安装配置Keepalived(master和slave)
[root@test ~]# mkdir -p /usr/local/keepalived
[root@test ~]# wget http://www.keepalived.org/software/keepalived-1.2.18.tar.gz
[root@test ~]# tar xzf keepalived-1.2.18.tar.gz
[root@test ~]# cd keepalived-1.2.18
[root@test keepalived-1.2.18]#
[root@test keepalived-1.2.18]# ./configure --prefix=/usr/local/keepalived
[root@test keepalived-1.2.18]# make && make install
[root@test keepalived-1.2.18]# cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
[root@test keepalived-1.2.18]# cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
[root@test keepalived-1.2.18]# cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
[root@test keepalived-1.2.18]# mkdir -p /etc/keepalived
[root@test keepalived-1.2.18]# vim /etc/keepalived/keepalived.conf
Master:
! Configuration File for keepalived
global_defs {
notification_email {
root@192.168.10.161
}
notification_email_from root@192.168.10.161
smtp_server 192.168.10.161
smtp_connect_timeout 30
router_id LVS_REDIS
}
vrrp_script chk_redis {
script "/usr/local/redis/script/redis_check.sh" ###监控脚本
interval 2 ###监控时间
}
vrrp_instance VI_1 {
nopreempt ###不抢占,防止脑裂
state MASTER #备的是BACKUP
interface br0
virtual_router_id 51
priority 100 #备的是90
advert_int 1
authentication {
auth_type PASS
auth_pass redis
}
virtual_ipaddress {
192.168.10.221
}
track_script {
chk_redis ###执行上面定义的chk_redis
}
notify_master /usr/local/redis/script/redis_master.sh
notify_backup /usr/local/redis/script/redis_backup.sh
notify_fault /usr/local/redis/script/redis_fault.sh
notify_stop /usr/local/redis/script/redis_stop.sh
}
Slave:
! Configuration File for keepalived
global_defs {
notification_email {
root@192.168.10.160
}
notification_email_from root@192.168.10.160
smtp_server 192.168.10.160
smtp_connect_timeout 30
router_id LVS_REDIS
}
vrrp_script chk_redis {
script "/usr/local/redis/script/redis_check.sh" ###监控脚本
interval 2 ###监控时间
}
vrrp_instance VI_1 {
nopreempt ###不抢占,防止脑裂
state BACKUP #备的是BACKUP
interface br0
virtual_router_id 51
priority 90 #备的是90
advert_int 1
authentication {
auth_type PASS
auth_pass redis
}
virtual_ipaddress {
192.168.10.220
}
track_script {
chk_redis ###执行上面定义的chk_redis
}
notify_master /usr/local/redis/script/redis_master.sh
notify_backup /usr/local/redis/script/redis_backup.sh
notify_fault /usr/local/redis/script/redis_fault.sh
notify_stop /usr/local/redis/script/redis_stop.sh
}
4.启动步骤:
启动Master上的Redis
[root@test keepalived-1.2.18]# sh /usr/local/redis/script/startRedis.sh
启动Slave上的Redis
[root@test keepalived-1.2.18]# sh /usr/local/redis/script/startRedis.sh
查看启动状态
[root@test script]# ps -ef |grep redis
root 26327 1 0 17:47 ? 00:00:00 /usr/local/redis/bin/redis-server *:6379
root 26332 23875 0 17:47 pts/0 00:00:00 grep redis
启动Master上的Keepalived
service keepalived start
启动Slave上的Keepalived
service keepalived start
5.Redis的常用命令
(1)键值相关命令
keys * :返回满足给定pattern的所有key,*代表取出多有key ,xiaojun* ,代表xiaojun大头的keys
exists : 确认一个key是否存在。 exists name .没有返回0,有返回1
del :删除一个key。 del age
expire: 设置一个key过期时间 。expir name 10 设置一个存在一个存在的键的过期时间 ;ttl name 查看key的存活时间,-1表示过期
选择数据库: select 0 ,表示进入到0数据库 ,(进入redis的时候,默认是0数据库)
select 0
set age 30
get age
move age 1(0到15的值,表示将age移动到1数据库)
select 1
get age
--------------
persist : 移除给定key的过期时间
expir age 300
ttl age
persist age
ttl age 值为-1 表示取消了过期时间
----------------
randomkey : 随机返回key空间的一个key (就是随机返回一个存在的key)
rename : 重命名key rename set2 set200 将key set2重命名为set200
type : 返回值的类型 type set2 (返回值none表示空,set是集合 ,zset有序集合)
[root@test bin]# ./redis-cli
127.0.0.1:6379> auth system
OK
127.0.0.1:6379> keys *
1) "tuserinfo"
127.0.0.1:6379> select 0
OK
127.0.0.1:6379> set name xiaoshui
OK
127.0.0.1:6379> get name
"xiaoshui"
127.0.0.1:6379> set name cat
OK
127.0.0.1:6379> get name
"cat"
127.0.0.1:6379> keys *
1) "name"
2) "tuserinfo"
127.0.0.1:6379> exists age
(integer) 0
127.0.0.1:6379> set age 23
OK
127.0.0.1:6379> keys *
1) "name"
2) "tuserinfo"
3) "age"
127.0.0.1:6379> del tuserinfo
(integer) 1
127.0.0.1:6379> keys *
1) "name"
2) "age"
127.0.0.1:6379>
127.0.0.1:6379> expire age 10
(integer) 1
127.0.0.1:6379> ttl age
(integer) 5
127.0.0.1:6379> ttl age
(integer) 2
127.0.0.1:6379> ttl age
(integer) -2
127.0.0.1:6379> keys *
1) "name"
127.0.0.1:6379>
(2)服务器相关命令
ping :测试连接是否存活
echo : 在命令行打印一些内容
select : 选择数据库。Redis的数据库编码从0到15, select 1
quit : 退出连接 ,或者用exit命令
dbsize : 返回当前数据库中key的数目
info : 获取服务器的信息或统计
config get : 实时传储收到的请求 config get * (可以返回相关配置的参数值)
--------------------
flushdb : 删除当前选择数据库中的所有key
dbsize (显示key的数量)
flushdb
dbsize (结果为0)
-------------------
flushall : 删除所有数据库中的所有key
原文:http://blog.itpub.net/26373260/viewspace-1726259/
内容总结
以上是互联网集市为您收集整理的Redis高可用安装笔记全部内容,希望文章能够帮你解决Redis高可用安装笔记所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。