1.单机安装(会的直接跳到下面集群安装)
下载,解压,安装
>> cd /usr/local/app
>> wget http://download.redis.io/releases/redis-4.0.10.tar.gz
>> tar -zxvf redis-4.0.10.tar.gz
>> mv redis-4.0.10.tar.gz redis
>> cd redis
>> make MALLOC=libc
>> make install
安装完成,这时候会在/usr/local/bin/目录下看到redis-server、redis-cli等可执行脚本,进入看一下,如果没有,就要去解压目录复制进去了。
修改配置
>> vim /usr/local/app/redis/redis.conf
修改以下两个地方
#默认是只有一个127.0.0.1,这个时候只能自己连接,其他局域网内是连接不上的。所以,需要配置多个 IP ,这样就可以局域网内进行连接了。我设置的0.0.0.0,虽然这不太安全,方便我在其它地方连接。
bind 0.0.0.0
##后台启动
daemonize yes
启动redis
>> redis-server /usr/local/app/redis/redis.conf
##查看是否启动成功
>>netstat -anp | grep 6379
>>ps -ef | grep redis
测试
关闭redis
redis-cli shutdown
2.redis集群原理
Redis集群设计包括2部分:哈希Slot和节点主从。
1.节点主从
- 只有1个Master,可以有N个slave,而且Slave也可以有自己的slaver。
- 读写分离,Master只负责写和同步数据给slave,Slave承担了被读的任务,所以Slave的扩容只能提高读效率不能提高写效率。
- 当一个新的Slave加入到这个集群时,会主动找Master来拜码头,Master发现新的小弟后将全量数据发送给新的Slave,数据量越大性能消耗也就越大,所以尽量避免在运行时做Slave的扩容。
- Slave先将Master那边获取到的信息压入磁盘,再load进内存,client端是从内存中读取信息的,所以Redis是内存数据库。
优点:读写分离,通过增加Slave可以提高并发读的能力。
缺点:Master写能力是瓶颈。
2.哈希Slot
Redis 集群包含 16384 个哈希槽(hash slot),上图
Node1负责: 0 ~ 5460 哈希槽
Node2负责: 5461 ~ 10922 哈希槽
Node3负责: 10922 ~ 16384 哈希槽
假如Object4经过 CRC16哈希 对key进行计算值为1233,则Object4会存储到Node1节点上。
Node之间也互相监听,一旦有Node退出或者加入,会按照Slot为单位做数据的迁移。例如Node1如果掉线了,0-5640这些Slot将会平均分摊到Node2和Node3上,由于Node2和Node3本身维护的Slot还会在自己身上不会被重新分配,所以迁移过程中不会影响到5641-16384Slot段的使用。
3.redis集群搭建
Redis集群中要求奇数节点,所以至少要有三个节点,并且每个节点至少有一备份节点,所以至少需要6个redis服务实例。
1.机器资源
三台服务器,相互可ping通
10.3.21.15
10.3.21.16
10.3.21.17
(每台服务器redis三个端口号 7000~7002)
2.安装依赖包
>> yum install gcc-c++
>> yum install ruby
>> yum install rubygems
3.建立集群文件夹和配置
## 在三台机器上操作
>> mkdir -p /usr/local/app/redis-cluster/{7000,7001,7002}
## 分别进入每个端口目录创建配置文件
>> cd /usr/local/app/redis-cluster/7000 && touch redis.conf
redis.conf 配置内容如下:
# redis 占用端口,对应自己目录
port 7000
bind 0.0.0.0
daemonize yes
##如果配置yes则开启集群功能,此redis实例作为集群的一个节点,否则,它是一个普通的单一的redis实例。
cluster-enabled yes
#它是集群节点自动维护的文件,主要用于记录集群中有哪些节点、#他们的状态以及一些持久化参数等,方便在重启时恢复这些状态。通常是在收到请求之后这个文件就会被更新。
cluster-config-file nodes_7000.conf
#这是集群中的节点能够失联的最大时间,超过这个时间,该节点就会被认为故障。如果主节点超过这个时间还#是不可达,则用它的从节点将启动故障迁移,升级成主节点。注意,任何一个节点在这个时间之内如果还是没
#有连上大部分的主节点,则此节点将停止接收任何请求。一般设置为15秒即可。
cluster-node-timeout 15000
#开启aof持久化模式,每次写操作请求都追加到appendonly.aof文件中
appendonly yes
#每次有写操作的时候都同步
appendfsync always
#redis服务日志
logfile /usr/local/app/redis-cluster/7000/redis.log
#pidfile文件对应7000,7001,7002
pidfile /var/run/redis_7000.pid
以上三台机器都需要配置好
4.集群的启动和关闭
编写一个启动脚本
#/bin/bash
for ((i=0;i<3;i++));
do redis-server /usr/local/app/redis-cluster/700$i/redis.conf
done
查看启动成功
这时只是启动了9个单独的redis服务,它们还不是一个集群,下面就说明创建集群
5.创建集群
在一台机器上用redis-trib.rb 这个工具,就在redis解压目录的 src 目录中
## --replicas参数指定集群中每个主节点配备几个从节点,这里设置为1。
>> ./redis-trib.rb create --replicas 1 10.3.21.15:7000 10.3.21.15:7001 10.3.21.15:7002 10.3.21.16:7000 10.3.21.16:7001 10.3.21.16:7002 10.3.21.17:7000 10.3.21.17:7001 10.3.21.17:7002
执行上面可能会报下面的错
原因就是安装redis-trib.rb运行依赖的ruby的包redis-4.1.3.gem
>> gem install redis
ruby版本又有问题,没关系再继续执行下面步骤
# 更新curl
>> yum install curl
>> curl -L get.rvm.io | bash -s stable
>> source /usr/local/rvm/scripts/rvm
## 查看rvm库中已知的ruby版本
>> rvm list known
## 安装
>> rvm install 2.4.0
# 上面安装好了就可以执行
>> gem install redis
## 启动集群
>> cd /usr/local/app/redis/src
>> ./redis-trib.rb create --replicas 1 10.3.21.15:7000 10.3.21.15:7001 10.3.21.15:7002 10.3.21.16:7000 10.3.21.16:7001 10.3.21.16:7002 10.3.21.17:7000 10.3.21.17:7001 10.3.21.17:7002
## 验证是否能连接上
>> redis-cli -c --raw -h 10.3.21.16 -p 7000
6.集群命令
1)列出集群节点 cluster nodes
2)查看集群信息 cluster info