Redis主从及哨兵模式的部署
一. Redis安装
官网地址:https://redis.io/download
下载包:wget http://download.redis.io/releases/redis-3.2.12.tar.gz
1.将安装包解压至/usr/local/下(可以自己定义)
tar xf redis-3.2.12.tar.gz -C /usr/local/
cd /usr/local/
mv redis-3.2.12 redis
2.安装环境依赖
yum -y install gcc automake autoconf libtool make #由于redis是由C语言编写的,它的运行需要C环境,因此我们需要先安装gcc以及所需依赖
3.根据redis自带的Makefile进行编译安装
cd /usr/local/redis/
make #开始编译
make install #安装
4.配置环境变量
vim /etc/profile
export PATH=/usr/local/redis/src:$PATH
source /etc/profile
5.编写配置文件
daemonize yes #是否后台运行
port 6379 #默认端口
logfile /usr/local/redis/6379/redis.log #日志文件位置
dir /usr/local/redis/6379/ #持久化文件存储位置
pidfile /usr/local/redis/6379/redis.pid #pid文件存储位置
dbfilename dump.rdb #RDB持久化数据文件:
protected-mode no #默认开启了保护模式,只允许本地回环地址登录并访问数据库。
#bind 127.0.0.1 #这里的bind指的是只有指定的网段才能远程访问这个redis,注释掉后,就没有这个限制了
requirepass 123456 #设置登录密码
6.启动
redis-server /usr/local/redis/6379/redis.conf #因为配置了环境变量所以直接redis-server启动
7.客户端连接测试
[root@redis-2 6379]# redis-cli
127.0.0.1:6379> set name wangwu
(error) NOAUTH Authentication required. #因为配置了密码,所以这里需要先进行身份验证
127.0.0.1:6379> auth 123456 #输入密码ok
OK
127.0.0.1:6379> set name wangwu
OK
127.0.0.1:6379>
[root@redis-2 6379]# redis-cli -a 123456
127.0.0.1:6379> set name zhangsan
OK
127.0.0.1:6379>
8.设置开机自启
vim /etc/rc.d/rc.local
/usr/local/bin/redis-server /usr/local/redis/6379/redis.conf
chmod +x /etc/rc.d/rc.local
9.关闭redis
redis-cli shutdown #方法一
[root@redis-2 ~]# redis-cli -a 123456 #方法二
127.0.0.1:6379> shutdown
not connected>
pkill redis-server #方法三
10.redis配置,按需添加
daemonize:如需要在后台运行,把该项的值改为yes
pdifile:把pid文件放在/var/run/redis.pid,可以配置到其他地址
bind:指定redis只接收来自该IP的请求,如果不设置,那么将处理所有请求,在生产环节中最好设置该项
port:监听端口,默认为6379
timeout:设置客户端连接时的超时时间,单位为秒
loglevel:等级分为4级,debug,revbose,notice和warning。生产环境下一般开启notice
logfile:配置log文件地址,默认使用标准输出,即打印在命令行终端的端口上
database:设置数据库的个数,默认使用的数据库是0
save:设置redis进行数据库镜像的频率
rdbcompression:在进行镜像备份时,是否进行压缩
dbfilename:镜像备份文件的文件名
dir:数据库镜像备份的文件放置的路径
slaveof:设置该数据库为其他数据库的从数据库
masterauth:当主数据库连接需要密码验证时,在这里设定
requirepass:设置客户端连接后进行任何其他指定前需要使用的密码
maxclients:限制同时连接的客户端数量
maxmemory:设置redis能够使用的最大内存
appendonly:开启appendonly模式后,redis会把每一次所接收到的写操作都追加到appendonly.aof文件中,当redis重新启动时,会从该文件恢复出之前的状态
appendfsync:设置appendonly.aof文件进行同步的频率
vm_enabled:是否开启虚拟内存支持
vm_swap_file:设置虚拟内存的交换文件的路径
vm_max_momery:设置开启虚拟内存后,redis将使用的最大物理内存的大小,默认为0
vm_page_size:设置虚拟内存页的大小
vm_pages:设置交换文件的总的page数量
vm_max_thrrads:设置vm IO同时使用的线程数量
二.Redis主从复制实现
1.环境及配置:
准备两个或两个以上redis实例,这里直接用一台机器做演示了
mkdir /data/638{0..2}
配置文件示例:
cat >> /data/6380/redis.conf <<EOF
port 6380
daemonize yes
pidfile /data/6380/redis.pid
loglevel notice
logfile "/data/6380/redis.log"
dbfilename dump.rdb
dir /data/6380
requirepass 123
masterauth 123
EOF
cat >> /data/6381/redis.conf <<EOF
port 6381
daemonize yes
pidfile /data/6381/redis.pid
loglevel notice
logfile "/data/6381/redis.log"
dbfilename dump.rdb
dir /data/6381
requirepass 123
masterauth 123
EOF
cat >> /data/6382/redis.conf <<EOF
port 6382
daemonize yes
pidfile /data/6382/redis.pid
loglevel notice
logfile "/data/6382/redis.log"
dbfilename dump.rdb
dir /data/6382
requirepass 123
masterauth 123
EOF
启动:
redis-server /data/6380/redis.conf
redis-server /data/6381/redis.conf
redis-server /data/6382/redis.conf
2、开启主从
主节点:6380
从节点:6381、6382
6381/6382这两台机器命令行操作:
redis-cli -p 6381 -a 123 SLAVEOF 10.0.0.22 6380 #这里的ip跟端口是主的
redis-cli -p 6382 -a 123 SLAVEOF 10.0.0.22 6380
3、查询主从状态
redis-cli -p 6380 -a 123 info replication
redis-cli -p 6381 -a 123 info replication
redis-cli -p 6382 -a 123 info replication
4. 解除主从身份
redis-cli -p 6382 -a 123 SLAVEOF no one
三、哨兵
1.哨兵原理
Sentinel 使用的算法核心是 Raft 算法,主要用途就是用于分布式系统,系统容错,以及Leader选举,每个Sentinel都需要定期的执行以下任务:
每个 Sentinel 会自动发现其他 Sentinel 和从服务器,它以每秒钟一次的频率向它所知的主服务器、从服务器以及其他 Sentinel 实例发送一个 PING 命令。
如果一个实例(instance)距离最后一次有效回复 PING 命令的时间超过 down-after-milliseconds 选项所指定的值, 那么这个实例会被 Sentinel 标记为主观下线。 有效回复可以是: +PONG 、 -LOADING 或者 -MASTERDOWN 。
如果一个主服务器被标记为主观下线, 那么正在监视这个主服务器的所有Sentinel要以每秒一次的频率确认主服务器的确进入了主观下线状态。
如果一个主服务器被标记为主观下线, 并且有足够数量的Sentinel(至少要达到配置文件指定的数量)在指定的时间范围内同意这一判断, 那么这个主服务器被标记为客观下线。
在一般情况下, 每个Sentinel会以每 10 秒一次的频率向它已知的所有主服务器和从服务器发送 INFO 命令。 当一个主服务器被Sentinel标记为客观下线时,Sentinel向下线主服务器的所有从服务器发送 INFO 命令的频率会从 10 秒一次改为每秒一次。
当没有足够数量的Sentinel同意主服务器已经下线, 主服务器的客观下线状态就会被移除。 当主服务器重新向Sentinel的 PING 命令返回有效回复时, 主服务器的主观下线状态就会被移除。
2.sentinel搭建过程
mkdir /data/26380
cd /data/26380
vim sentinel.conf
port 26380
#守护进程模式(是否后台运行)
daemonize yes
##默认开启了保护模式,只允许本地回环地址登录并访问数据库(这里是关闭)
protected-mode no
#指明日志文件名
logfile "./sentinel.log"
#哨兵监控的master(指示 Sentinel 去监视一个被命名为 mymaster 的master,可指定为任何名字,Master IP为127.0.0.1 , 端口号为 6379 ,这个master判断为失效至少需要 1 个 Sentinel 同意)
sentinel monitor mymaster 10.0.0.22 6380 1
#master或slave多长时间(默认30秒)不能使用后标记为s_down状态。
sentinel down-after-milliseconds mymaster 3000
#若哨兵在配置值内未能完成故障转移操作,则任务本次故障转移失败
sentinel failover-timeout mymaster 18000
#如果redis配置了密码,那这里必须配置认证,否则不能自动切换
sentinel auth-pass mymaster 123
3.启动
redis-sentinel /data/26380/sentinel.conf
[root@redis-1 data]# ps -ef |grep sentinel
root 7820 1 0 16:05 ? 00:00:00 redis-sentinel *:26380 [sentinel]
root 7835 7111 0 16:07 pts/0 00:00:00 grep --color=auto sentinel
4.停主库测试
killl 7453(主库进程pid)
redis-cli -p 6381 -a 123 info replication
redis-cli -p 6382 -a 123 info replication
此时会发现其中一台从库成了主