首页 > 其他 > 详细

Redis高可用安装笔记

时间:2015-07-10 02:28:11      阅读:298      评论:0      收藏:0      [点我收藏+]

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)在配置文件中设置

在作为slaveRedis服务器的配置文件(redis.conf)中设置。

slaveof  192.168.10.161  6379  #指定masterip和端口

        

 

(2)在Redis客户端中进行设置

这里以Redis官方推荐的Jedis为例来说明,后文中的测试也基于Jedis来进行。这里jedis对象实例是属于slave的,参数是服务器的地址和端口。

slaveJdedis.slaveOf("192.168.10.161", 6379);  #指定masterip和端口

补充:slaveJdedis.slaveofNoOne();  #  取消指定master,自己成为一个master了。 

      


环境规划:

master:192.168.10.161  6379

slave:192.168.10.160  6379

auth:system

 

1.在masterslave上安装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相关脚本(masterslave)

(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调用的脚本

MasterSlave上创建监控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

 

 

 

MasterSlave创建如下脚本redis_faultredis_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_masterredis_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_masternotify_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

 

 

MasterSlave,给监控脚本都加上可执行权限:

chmod +x /usr/local/redis/script/*.sh

 

 

3.安装配置Keepalived(masterslave)

[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(015的值,表示将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的数据库编码从015, select 1

quit : 退出连接 ,或者用exit命令

dbsize : 返回当前数据库中key的数目

info : 获取服务器的信息或统计

config get : 实时传储收到的请求 config get * (可以返回相关配置的参数值)

--------------------

flushdb : 删除当前选择数据库中的所有key

dbsize (显示key的数量)

flushdb

dbsize (结果为0)

-------------------

flushall : 删除所有数据库中的所有key

 



Redis高可用安装笔记

原文:http://blog.itpub.net/26373260/viewspace-1726259/

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!