Redis集群部署
redis源码包下载地址:http://download.redis.io/releases/
redis使用手册:http://redisdoc.com/index.html
下载需要注意的是: Redis 使用标准版本标记进行版本控制:major.minor.patchlevel。偶数的版本号表示稳定的版本, 例如 1.2,2.0,2.2,2.4,2.6,2.8,奇数的版本号用来表示非标准版本,例如2.9.x是非稳定版本,它的稳定版本是3.0。
注意:Redis集群至少需要3个master节点,所以现在总共有6个节点,就只能是1master对应1slave这种方式
Redis集群为什么至少需要三个master节点?
因为新master的选举需要大于半数的集群master节点同意才能选举成功,如果只有两个master节点,当其中一个挂了,是达不到选举新master的条件的
Redis集群为什么推荐master节点数为奇数?
master节点数为奇数不是必须的,但是奇数个master节点可以在满足选举该条件的基础上节省一个节点。
因为master的选举机制,例如:
在9个master的架构中,如果4台master故障,通过过半机制,redis可以选举新的master。如果5台master故障无法选举新的master(9-5<9/2,不满足过半机制)
在10个master的架构中,如果4台master故障,通过过半机制,redis可以选举新的master。如果5台master故障无法选举新的master(10-5=10/2,不满足过半机制)
Redis集群部署
该部署使用的Red Hat 7为例
下列部署方式采用的是redis-cli方式创建的redis集群,只有redis5.0以后的版本才支持该方式,之前的版本都是使用redis-trib.rb方式,但是需要安装ruby软件相对复杂。
服务规划:
我们使用3台设备进行搭建,每台设备上有两个节点,使用不同的端口进行部署
安装前准备(所有设备):
1.下载所需依赖包
yum -y install gcc-c++
2.关闭防火墙
systemctl stop firewalld.service
systemctl disable firewalld.service
3.关闭SELinux
setenforce 0
vi /etc/selinux/config
SELINUX=enforcing改为SELINUX=disabled
安装redis(192.168.36.137)
1.解压安装包
#将安装包上传至/opt/instll下(个人习惯)
tar -zxvf /opt/install/redis-6.2.1/tar/gz
cd /opt/install/redis-6.2.1
#编译安装至/opt/redis7000下,7000是我们该redis使用的端口
make && make install PREFIX=/opt/redis7000
2.配置redis配置文件
mkdir -p /opt/redis7000/conf
cd /opt/install/redis-6.2.1
#将redis源码包里的redis.conf配置文件放置到我们redis安装路径下
mv redis.conf /opt/redis7000/conf/
vim /opt/redis7000/conf/redis.conf
1.bind 192.168.36.137 //将bind 127.0.0.1修改为自己本机的IP地址
2.daemonize yes //redis放置后台启动
3.port 7000 //设置端口
4.pidfile /opt/redis7000/redis_7000.pid
5.logfile /opt/redis7000/redis_7000.log
6.dir /opt/redis7000/redis_7000_dir
7.masterauth 123 //配置密码,所有节点统一
8.requirepass 123 //配置密码,所有节点统一
9.cluster-enabled yes //开启集群
10.cluster-config-file redis.conf //指定配置文件名称
11.cluster-node-timeout 15000
12.appendonly yes //开启aof持久化,要想了解redis持久化,可以看我之前写的redis持久化说明,如果对于redis上的数据不是那么重要的话,也可以不进行redis持久化配置
13.no-appendfsync-on-rewrite yes //aof重写期间是否同步
14.protected-mode no //关闭保护模式
15.maxmemory 4GB //设置 Redis 最大使用内存大小,当 Redis 使用的内存超过设置大小时就开始对数据进行淘汰
16.maxmemory-policy volatile-lru //设置 Redis 的内存淘汰算法为:在设置了过期时间的Keys中,通过LRU算法来进行淘汰
17.若Redis里存放的是一些无关紧要的数据,可以将Redis配置成无持久化,有助于性能提升,将下列项注释即可
#save 900 1
#save 300 10
#save 60 10000
mkdir /opt/redis7000/redis_7000_dir
扩展说明:
# Redis 内存淘汰算法分为随机、TTL、LRU、LFU四种 1.随机算法很好理解,就是从数据库中随机淘汰一些 Keys 2.TTL 算法就是从设置了过期时间的 Keys 中获取最早过期的 一批 Keys,然后淘汰这些Keys 3.LRU 主要是通过 Key 的最后访问时间来判定哪些 Key 更适合被淘汰 4.LFU算法主要通过 Key 的访问频率来统计哪些 Key 更适合被淘汰 # 我们可以在配置文件中配置 maxmemory-policy 配置项来设置 Redis 的内存淘汰算法, maxmemory-policy 可选值如下所示 1.volatile-lru:在设置了过期时间的Keys中,通过LRU算法来进行淘汰 2.allkeys-lru:在所有的Keys中,通过LRU算法进行淘汰 3.volatile-lfu:在设置了过期时间的Keys中,通过LFU算法来进行淘汰 4.allkeys-lfu:在所有的Keys中,通过LFU算法进行淘汰 5.volatile-random:在设置了过期时间的Keys中,通过随机算法来进行淘汰 6.allkeys-random:在所有的Keys中,通过随机算法进行淘汰 7.volatile-ttl:在设置了过期时间的Keys中,选择过期时间最短的Key进行淘汰 8.noeviction:不对Keys进行淘汰
3.复制redis7000创建第二个节点,使用7001端口
cp -r /opt/redis7000 /opt/redis7001
cd /opt/redis7001/conf/
#文档内容替换,替换7000字符成7001
sed -i "s/7000/7001/g" redis.conf
#修改dir数据文件名称
cd /opt/redis7001/
mv redis_7000_dir redis_7001_dir
至此,192.168.36.137设备上的两个redis就已经配置完成了!
4.将redis文件远程拷贝到其它设备上
scp -r /opt/redis7000 root@192.168.36.138:/opt
scp -r /opt/redis7000 root@192.168.36.139:/opt
然后修改其它两台设备上的redis文件名和dir文件名,并将redis.conf配置文件内容进行替换成对应的内容即可,可以参考我上方所使用的sed命令进行替换。IP也要记得修改
最后再将6个节点的redis全部启动即可。(进入redis的bin目录,使用./redis-cli ../conf/redis.conf命令启动)
创建redis集群
随便登录一台服务器上的一个节点,在此,我以192.168.36.137为例
cd /opt/redis7000/bin
#cluster-replicas 1代表1个master后有几个slave节点,1代表1个,所以6个节点将会产生3个master和3个slave,-a 指定redis的密码
./redis-cli --cluster create 192.168.36.137:7000 192.168.36.137:7001 192.168.36.138:7002 192.168.36.138:7003 192.168.36.139:7004 192.168.36.139:7005 --cluster-replicas 1 -a 123
#该命令只需要执行一次即可,后面哪怕我们重启了整个redis,也不需要执行第二次了
Can I set the above configuration? (type 'yes' to accept): yes //弹出该项,输入yes即可
连接redis集群
cd /opt/redis7000/bin
# -c代表连接集群,-a是我们的redis密码
./redis-cli -h 192.168.36.137 -p 7000 -c -a 123 --raw
#要想不提示下方的警告,在命令后加上 2>/dev/null即可
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. //该警告是我们的密码明文显示提示的警告
# 列出集群的节点的信息
192.168.36.137:7000> cluster nodes 1ade62b46631ea9be6c0637df17dfe8098481aec 192.168.36.138:7003@17003 slave 3584cbe89f97020ac8f3a2c9fcfca8b4a78fcc86 0 1645701258000 1 connected 82f2ce489ae537381244f700567792ce5ba803ee 192.168.36.138:7002@17002 master - 0 1645701260457 3 connected 5461-10922 4525f4572ebebf6e795e3b6621e60e3170fec7e7 192.168.36.137:7001@17001 slave 1dcb5a3eb366a5bc4e96ca3c59dd7b2af09b38ac 0 1645701261462 5 connected 3584cbe89f97020ac8f3a2c9fcfca8b4a78fcc86 192.168.36.137:7000@17000 myself,master - 0 1645701261000 1 connected 0-5460 1dcb5a3eb366a5bc4e96ca3c59dd7b2af09b38ac 192.168.36.139:7004@17004 master - 0 1645701260000 5 connected 10923-16383 4c178df9271d6a57c5725c7442d97a6586a35cb6 192.168.36.139:7005@17005 slave 82f2ce489ae537381244f700567792ce5ba803ee 0 1645701259452 3 connected
# 列出当前节点的信息
cluster info
需要特别说明的是,redis集群中插入数据的话是随机存储到集群中的某个节点的,是一个分布式的存储,你只有进入到对应的节点,才可以看到相应的数据
至此,redis集群就部署完成了!