Redis 3.2主从复制与集群搭建

Redis 3.2主从复制与集群搭建

一、Redis 主从搭建

1.下载并解压

yum  install  -y gcc gcc-c++ pcre zlib pcre-devel tcl 
wget  http: //download .redis.io /releases/redis-3 .2.4. tar .gz
tar  -zxvf redis-3.2.4. tar .gz
cd  redis-3.2.4
make 
cd  src &&  make  test  &&  make  install
mkdir  /etc/redis
cp  .. /redis .conf  /etc/redis/redis .conf

2.优化参数

vim  /etc/sysctl .conf
net.core.somaxconn = 20480  #最大队列长度,应付突发的大并发连接请求,默认为128
net.ipv4.tcp_max_syn_backlog = 20480  #半连接队列长度,此值受限于内存大小,默认为1024
vm.overcommit_memory = 1
0 表示检查是否有足够的内存可用,如果是,允许分配;如果内存不够,拒绝该请求,并返回一个错误给应用程序。
1 允许分配超出物理内存加上交换内存的请求
2 内核总是返回 true
sysctl -p  #使参数生效

3.配置文件说明

3.1后台运行

daemonize  yes 

3.2bind地址监听

默认bind的填写的127.0.0.1这样配置是只允许本地访问
bind 0.0.0.0 

3.3 日志配置

logfile  "/var/log/redis.log"

3.4 开机自启脚本

vim /etc/init.d/redis

# chkconfig: 2345 90 10
# description: service of redis for start and stop add by tomener
   
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_6379 .pid
CONF= "/etc/redis/redis.conf"
AUTH= "Passwd"
BIND_IP= '0.0.0.0'
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 exists, process is not running."
                else
                        PID=$( cat  $PIDFILE)
                        echo  "Stopping..."
                        $REDIS_CLI -h $BIND_IP -a $AUTH -p $REDISPORT  SHUTDOWN
                        sleep  2
                        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
 
 
chkconfig redis on
service redis restart

4.Redis持久化

4.1 rdb方式

工作原理:

redis生成dump.rdb文件时,工作过程如下:

redis主进程fork一个子进程fork出来的子进程将内存的数据集dump到临时的RDB

当子进程对临时的RDB文件写入完毕,redis用新的RDB文件代替旧的RDB文件

默认配置如下:

save 900 1
save 300 10
save 60 10000 

其意义:

1key更新值时每900秒保存一次数据到硬盘

10key更新值时每300秒保存一次到硬盘

10000key更新值时每60秒保存一次到硬盘

4.2 aof方式

aof本质是redis操作(写操作)日志文件。aof默认是未开启的,需要在配置文件中进行设置,在配置文件中将这一行改为appendonly yes就可以了。

工作原理

AOF append only file

每当Redis执行一个改变数据集的命令时,这个命令都会被追加到AOF文件的末尾。

redis重新启动时,程序可以通过AOF文件恢复数据。

三种appedn方式:

appendfsync always
appendfsync everysec
appendfsync no

appendfsync always每次有新命令追加到 AOF 文件时就执行一次 fsync :非常慢,也非常安全

appendfsync everysec每秒 fsync 一次:足够快(和使用 RDB 持久化差不多),并且在故障时只会丢失 1 秒钟的数据。

appendfsync no从不 fsync :将数据交给操作系统来处理。更快,也更不安全的选择。

推荐(并且也是默认)的措施为每秒 fsync 一次, 这种 fsync 策略可以兼顾速度和安全性。

aof能够保证数据的安全,但是在重启时比较耗时,而且aof文件的体积比rdb文件大。

5. Redis主从复制

5.1 概述

Redisreplication机制允许slavemaster那里通过网络传输拷贝到完整的数据备份。具有以下特点:

  • 异步复制,从2.8版本开始,slave能不时地从master那里获取到数据。

  • 允许单个master配置多个slave

  • slave允许其它slave连接到自己。一个slave除了可以连接master外,它还可以连接其它的slave。形成一个图状的架构。

  • master在进行replication时是非阻塞的,这意味着在replication期间,master依然能够处理客户端的请求。

  • slavereplication期间也是非阻塞的,也可以接受来自客户端的请求,但是它用的是之前的旧数据。可以通过配置来决定slave是否在进行replication时用旧数据响应客户端的请求,如果配置为否,那么slave将会返回一个错误消息给客户端。不过当新的数据接收完全后,必须将新数据与旧数据替换,即删除旧数据,在替换数据的这个时间窗口内,slave将会拒绝客户端的请求和连接。

  • 一般使用replication来可以实现扩展性,例如说,可以将多个slave配置为只读,或者是纯粹的数据冗余备份。

  • 能够通过replication来避免master每次持久化时都将整个数据集持久化到硬盘中。只需把master配置为不进行持久化操作(把配置文件中持久化相关的配置项注释掉即可),然后连接上一个slave,这个slave则被配置持久化选项。不过需要注意的是,在这个方案中,必须确保master不会自动启动。

5.2 Master持久化功能关闭时Replication的安全性

当有需要使用到replication机制时,一般都会强烈建议把master的持久化开关打开。即使为了避免持久化带来的延迟影响,不把持久化开关打开,那么也应该把master配置为不会自动启动的。

5.3 replication工作原理

如果你为master配置了一个slave,不管这个slave是否是第一次连接上Master,它都会发送一个SYNC命令给master请求复制数据。

master收到SYNC命令后,会在后台进行数据持久化,持久化期间,master会继续接收客户端的请求,它会把这些可能修改数据集的请求缓存在内存中。当持久化进行完毕以后,master会把这份数据集发送给slaveslave会把接收到的数据进行持久化,然后再加载到内存中。然后,master再将之前缓存在内存中的命令发送给slave

masterslave之间的连接由于某些原因而断开时,slave能够自动重连master,如果master收到了多个slave并发连接请求,它只会进行一次持久化,而不是一个连接一次,然后再把这一份持久化的数据发送给多个并发连接的slave

masterslave断开重连后,一般都会对整份数据进行复制。但从redis2.8版本开始,支

5.4 主从配置

replication相关的配置比较简单,只需要把下面一行加到slave的配置文件中:

slaveof  masterIPaddress  6379

如果master通过requirepass配置项设置了密码,slave每次同步操作都需要验证密码,可以通过在slave的配置文件中添加以下配置项:

masterauth <password>

6常用命令

启动redis

redis-server /etc/redis/redis.conf

客户端命令工具

/usr/local/bin/redis-cli -h 192.168.1.1

192.168.1.1:6379> auth PasswdOK

登录,密码验证192.168.1.1:6379>info

查看数据库状态192.168.1.1:6379>info replication

查看slave的复制状态192.168.1.1:6379>set key 123

插入数据192.168.1.1:6379>keys *

列出数据

flushdb

清空当前数据

flushall

清除所有数据库

7.测试主从及切换

7.1 主从测试

wKioL1jP9QezMT9AAAEgqHq56Rk010.png

wKiom1jP9VTRP8_6AAEz8t7g2Ts415.png

7.2主从切换

停止主

wKiom1jP9avAqGw-AAHij6zjxrI896.png

切换从为主

redis-cli -h localhost slaveof NO ONE

wKiom1jP9frQwHqoAAJ23aica_s403.png

恢复原来主数据库

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

启动原来的主redis

wKioL1jP9ieySz7lAABO0OJWaqg371.png

在从数据库切换主数据库redis-cli -h localhost -p 6379 slaveof 172.17.10.193 6379

测试从已经切换回来

wKiom1jP9orAKHKBAAG-4RX46dY624.png

猜你喜欢

转载自www.linuxidc.com/Linux/2017-03/142148.htm