Redis单机安装,主从配置安装,哨兵模式安装,集群配置安装详解步骤
Redis是现在最受欢迎的NoSQL数据库之一,Redis是一个使用ANSI C编写的开源、包含多种数据结构、支持网络、基于内存、可选持久性的键值对存储数据库,其具备如下特性:
- 基于内存运行,性能高效
- 支持分布式,理论上可以无限扩展
- key-value存储系统
- 开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API
相比于其他数据库类型,Redis具备的特点是:
- C/S通讯模型
- 单进程单线程模型
- 丰富的数据类型
- 操作具有原子性
- 持久化
- 高并发读写
- 支持lua脚本
一、Linux环境下Redis安装
redis官网下载安装文件
redis是由C语言编写的,它的运行需要C环境,因此我们需要先安装gcc
yum install gcc-c++
安装上传下载插件命令
yum install lrzsz -y
获取redis资源
wget http://download.redis.io/releases/redis-4.0.8.tar.gz
解压redis压缩文件
tar -zxvf redis-4.0.8.tar.gz
安装redis
1) cd redis-4.0.8
2) make
3) cd src
4) make install PREFIX=/usr/local/redis
移动配置文件到安装目录下(可选,移动配置文件启动时需要指定配置文件的路径)
1) cd ../
2) mkdir /usr/local/redis/etc
3) mv redis.conf /usr/local/redis/etc 或 cp redis.conf /usr/local/redis/etc
配置redis为后台启动
vi /usr/local/redis/etc/redis.conf //将daemonize no 改成daemonize yes
配置密码(可选)
vi /usr/local/redis/etc/redis.conf // requirepass test
将redis加入到开机启动
vi /etc/rc.local //在里面添加内容:/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf (意思就是开机调用这段开启redis的命令)
开启redis(配置文件路径指定可选,只要没有移动就行)
/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf
查看进程
ps -ef | grep redis
客户端登录和操作
1) cd /usr/local/redis/bin/
2) ./redis-cli
3) exit退出
127.0.0.1:6379> set name zhangsan
OK
127.0.0.1:6379> get name
"zhangsan"
127.0.0.1:6379>
开放端口和重载防火墙或直接关闭防火墙
1) firewall-cmd --zone=public --add-port=6379/tcp --permanent
2) firewall-cmd --reload
3) service iptables stop
常用命令
1) pkill redis-server
2) 或在Redis的bin目录下/redis-cli shutdown
注意:需要远程连接,修改redis的配置文件redis.conf, 将配置文件中的bind 127.0.0.1
注释掉,修改完后,服务器端需要使用配置文件重启
二、Redis主从配置安装
redis 主从复制配置和使用都非常简单,通过主从复制可以允许多个slave server 拥有和master server 相同的数据库副本。
redis主从复制有以下特点:
1) master :slave = 1:n (即:一个master可以拥有多个slave)
2) slave除了能连接到master以外,还可以连接到其他slave
3) 主从复制不会阻塞master操作,主从复制在进行时,master仍然可以继续处理它的client请求
redis-server说明
192.168.0.23:6379 主
192.168.0.24:6379 从
192.168.0.23主机器修改配置
1) vi /usr/local/redis/etc/redis.conf
2) protected-mode no //关闭保护模式
192.168.0.24从机器修改配置
1) vi /usr/local/redis/etc/redis.conf
# slaveof <masterip> <masterport> 指定主节点的ip和端口
2) slaveof 192.168.0.23 6379
3) protected-mode no //关闭保护模式
查看Redis主从信息和操作
192.168.0.23:6379> info Replication
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.0.24,port=6379,state=online,offset=2884,lag=0
master_replid:8645fddb569f1ea4ffa6eca3bc1a6ecc2e294c02
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:2884
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:2884
192.168.0.24:6379> info Replication
# Replication
role:slave
master_host:192.168.0.23
master_port:6379
master_link_status:up
master_last_io_seconds_ago:4
master_sync_in_progress:0
slave_repl_offset:2954
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:8645fddb569f1ea4ffa6eca3bc1a6ecc2e294c02
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:2954
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2745
repl_backlog_histlen:210
192.168.0.23:6379> set name wolaizi
OK
192.168.0.23:6379>
192.168.0.24:6379> get name
"wolaizi"
192.168.0.24:6379>
三、Redis哨兵模式安装
Redis Sentinel是Redis高可用的实现方案。Sentinel是一个管理多个Redis实例的工具,它可以实现对Redis的监控、通知、自动故障转移。
Redis Sentinel的主要功能
Sentinel的主要功能包括主节点存活检测、主从运行情况检测、自动故障转移(failover)、主从切换。Redis的Sentinel最小配置是一主一从。 Redis的Sentinel系统可以用来管理多个Redis服务器,该系统可以执行以下四个任务:
监控
Sentinel会不断的检查主服务器和从服务器是否正常运行。
通知
当被监控的某个Redis服务器出现问题,Sentinel通过API脚本向管理员或者其他的应用程序发送通知。
自动故障转移
当主节点不能正常工作时,Sentinel会开始一次自动的故障转移操作,它会将与失效主节点是主从关系的其中一个从节点升级为新的主节点, 并且将其他的从节点指向新的主节点。
配置提供者
在Redis Sentinel模式下,客户端应用在初始化时连接的是Sentinel节点集合,从中获取主节点的信息。
Redis Sentinel的工作流程
Sentinel是Redis的高可用性解决方案:
由一个或多个Sentinel实例组成的Sentinel系统可以监视任意多个主服务器,以及所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器,然后由新的主服务器代替已下线的主服务器继续处理命令请求 。如下图:
Sentinel负责监控集群中的所有主、从Redis,当发现主故障时,Sentinel会在所有的从中选一个成为新的主。并且会把其余的从变为新主的从。同时那台有问题的旧主也会变为新主的从,也就是说当旧的主即使恢复时,并不会恢复原来的主身份,而是作为新主的一个从。
在Redis高可用架构中,Sentinel往往不是只有一个,而是有3个或者以上。目的是为了让其更加可靠,毕竟主和从切换角色这个过程还是蛮复杂的。
主观失效
SDOWN(subjectively down),直接翻译的为”主观”失效,即当前sentinel实例认为某个redis服务为”不可用”状态.
客观失效
ODOWN(objectively down),直接翻译为”客观”失效,即多个sentinel实例都认为master处于”SDOWN”状态,那么此时master将处于ODOWN,ODOWN可以简单理解为master已经被集群确定为”不可用”,将会开启failover
环境说明
主机名称 | IP地址 | redis版本和角色说明 |
---|---|---|
redis-master | 192.168.3.72:6379 | redis 4.0.8(主) |
redis-slave01 | 192.168.0.28:6379 | redis 4.0.8(从) |
redis-slave02 | 192.168.0.29:6379 | redis 4.0.8(从) |
redis-master | 192.168.3.72:26379 | Sentinel01 |
redis-slave01 | 192.168.0.28:26379 | Sentinel02 |
redis-slave02 | 192.168.0.29:26379 | Sentinel03 |
部署Sentinel
Sentinel.conf配置文件主要参数解析:
# 端口
port 26379
# 是否后台启动
daemonize yes
# pid文件路径
pidfile /var/run/redis-sentinel.pid
# 日志文件路径
logfile "/var/log/sentinel.log"
# 定义工作目录
dir /tmp
# 定义Redis主的别名, IP, 端口,这里的2指的是需要至少2个Sentinel认为主Redis挂了才最终会采取下一步行为
sentinel monitor mymaster 127.0.0.1 6379 2
# 如果mymaster 30秒内没有响应,则认为其主观失效
sentinel down-after-milliseconds mymaster 30000
# 如果master重新选出来后,其它slave节点能同时并行从新master同步数据的台数有多少个,显然该值越大,所有slave节点完成同步切换的整体速度越快,但如果此时正好有人在访问这些slave,可能造成读取失败,影响面会更广。最保守的设置为1,同一时间,只能有一台干这件事,这样其它slave还能继续服务,但是所有slave全部完成缓存更新同步的进程将变慢。
sentinel parallel-syncs mymaster 1
# 该参数指定一个时间段,在该时间段内没有实现故障转移成功,则会再一次发起故障转移的操作,单位毫秒
sentinel failover-timeout mymaster 180000
# 不允许使用SENTINEL SET设置notification-script和client-reconfig-script。
sentinel deny-scripts-reconfig yes
修改三台Sentinel的配置文件,如下:
protected-mode no //关闭保护模式
sentinel monitor mymaster 192.168.3.72 6379 2
启动Sentinel
启动的顺序:主Redis --> 从Redis --> Sentinel1/2/3
/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf //启动redis
./redis-sentinel /usr/local/redis/etc/sentinel.conf //启动哨兵
[root@localhost ~]# ps -ef | grep redis
root 5375 1 0 16:30 ? 00:00:00 /usr/local/redis/bin/redis-server *:6379
root 5388 2401 0 16:32 pts/1 00:00:00 ./redis-sentinel *:26379 [sentinel]
root 5422 5401 1 16:34 pts/2 00:00:00 grep redis
Sentinel操作
./redis-cli -p 26379 //连接哨兵客户端
哨兵模式下的主从测试
模拟停止master上的Redis,查看Redis的主从变化,如下:
[root@localhost bin]# ps -ef | grep redis
root 5375 1 0 16:30 ? 00:00:09 /usr/local/redis/bin/redis-server *:6379
root 5388 2401 0 16:32 pts/1 00:00:12 ./redis-sentinel *:26379 [sentinel]
root 5508 5401 0 17:03 pts/2 00:00:00 grep redis
[root@localhost bin]# kill -9 5375
[root@localhost bin]# ps -ef | grep redis
root 5388 2401 0 16:32 pts/1 00:00:12 ./redis-sentinel *:26379 [sentinel]
root 5510 5401 0 17:03 pts/2 00:00:00 grep redis
Cluster集群模式
redis集群部署的三种方案(主从、哨兵、cluster集群),不过性能最高的还是redis官方推荐的redis-cluster,性能最高。
redis cluster是Redis的分布式解决方案,在3.0版本推出后有效地解决了redis分布式方面的需求,自动将数据进行分片,每个master上放一部分数据,提供内置的高可用支持,部分master不可用时,还是可以继续工作的支撑N个redis master node,每个master node都可以挂载多个slave node高可用,因为每个master都有salve节点,那么如果mater挂掉,redis cluster这套机制,就会自动将某个slave切换成master。
集群分片策略
Redis-cluster分片策略,是用来解决key存储位置的。
集群将整个数据库分为16384个虚拟槽位slot,所有key-value数据都存储在这些slot中的某一个上。一个slot槽位可以存放多个数据,key的槽位计算公式为:slot_number=crc16(key)%16384,其中crc16为16位的循环冗余校验和函数。
集群中的每个主节点都可以处理0个至16383个槽,当16384个槽都有某个节点在负责处理时,集群进入上线状态,并开始处理客户端发送的数据命令请求。
集群规划
(1)Redis集群最少需要6个节点,可以分布在一台或者多台主机上。
在一台主机上创建伪分布式集群,不同的端口表示不同的redis节点,如下:
主节点:192.168.0.24:7001 192.168.0.24:7002 192.168.0.24:7003
从节点:192.168.0.24:7004 192.168.0.24:7005 192.168.0.24:7006
环境准备(ruby2.3和gem文件下载)
1) tar -zxvf ruby-2.3.1.tar.gz
2) cd ruby-2.3.1
3) ./configure -prefix=/usr/local/ruby
4) make && make install //过程会有点慢,大概5-10分钟
5) gem install -l redis-3.3.0.gem //若没有gem需要安装yum install gem -y
拷贝文件,将redis安装包中redis.conf分别拷贝到7001到7006中
修改配置文件redis.conf
port 700X //修改对应的端口
bind 192.168.0.24 //绑定本地端口,必须指定
cluster-enabled yes //开启集群模式
daemonize yes //指定后台运行
protected-mode no //关闭保护模式
logfile "/usr/local/redis/etc/700X/redis.log" //指定日志文件路径
pidfile /usr/local/redis/etc/700X/redis.pid //PID文件路径
cluster-config-file /usr/local/redis/etc/700X/nodes.conf //node配置路径
启动各个redis服务
/usr/local/redis/bin/redis-server /usr/local/redis/etc/700X/redis.conf //指定X
rubby配置集群,在redis源文件的解压下面的src下,执行命令
./redis-trib.rb create --replicas 1 192.168.0.23:7001 192.168.0.23:7002 192.168.0.23:7003 192.168.0.23:7004 192.168.0.23:7005 192.168.0.23:7006