「这是我参与2022首次更文挑战的第5天,活动详情查看:2022首次更文挑战」
哨兵模式回顾
在redis3.0以前的版本要实现集群一般是借助哨兵sentinel工具来监控master节点的状态,如果master节点异常,则会做主从切换,将某一台slave作为master,哨兵的配置略微复杂,并且性能和高可用性等各方面表现一般,特别是在主从切换的瞬间存在访问瞬断的情况,而且哨兵模式只有一个主节点对外提供服务,没法支持很高的并发,且单个主节点内存也不宜设置得过大(一般建议不超过10GB),否则会导致持久化文件过大,影响数据恢复或主从同步的效率
cluster 高可用集群架构
redis集群是一个由多个主从节点群组成的分布式服务器群,它具有复制、高可用和分片特性。Redis集群不需要sentinel哨兵∙也能完成节点移除和故障转移的功能。需要将每个节点设置成集群模式,这种集群模式没有中心节点,可水平扩展,据官方文档称可以线性扩展到上万个节点(官方推荐不超过1000个节点)。redis集群的性能和高可用性均优于之前版本的哨兵模式,且集群配置非常简单
cluster集群搭建
redis集群需要至少三个master节点(建议搭建单数节点,当然双数也可以,但是由于后面集群某个master节点挂机,需要对其下面slave节点进行选举的时候也仅需要半数以上个master进行“投票”选举新的master,第双数个节点就没必要进行“投票”,“投票”机制下面有讲解),我们这里搭建三个master节点,并且给每个master再搭建一个slave节点,总共6个redis节点,这里用三台机器部署6个redis实例,每台机器一主一从,搭建集群的步骤如下:
1、准备三个虚拟机
还是用之前搭建的三个虚拟机(为了更加清晰展示搭建过程,之前各自虚拟机的redis暂不启动,采用新的端口号进行集群搭建),每个虚拟机下面启动两个redis实例,具体构建如下:
192.168.253.131 (8001/8002)
192.168.253.132 (8003/8004)
192.168.253.133 (8005/8006)
2、逐个虚拟机进行如下配置(根据定义的端口号,进行对应修改)
2-1、在虚拟机上的/usr/local下创建文件夹redis‐cluster,然后在其下面分别创建2个文件夾如下(端口号进行自行修改)
1)mkdir ‐p /usr/local/redis‐cluster
2)mkdir 8001 8004
3、cluster的redis.conf文件修改
3-1、将之前的redis.conf拷贝到8001下
cp /usr/local/redis/redis.conf /usr/local/redis-cluster/8001
3-2、修改如下内容
(1)daemonize yes
(2)port 8001(分别对每个机器的端口号进行设置)\
(3)pidfile /var/run/redis_8001.pid # 把pid进程号写入pidfile配置的文件
(4)dir /usr/local/redis-cluster/8001/(指定数据文件存放位置,必须要指定不同的目录位置,不然会丢失数据)
(5)cluster-enabled yes(启动集群模式)
(6)cluster-config-file nodes-8001.conf(集群节点信息文件,这里800x最好和port对应上)
(7)cluster-node-timeout 10000 设置值建议不要太小,以免因为网络问题,导致错误判断master挂机,导致重新选举master 发生脑裂问题(下节文章再对脑裂问题进行处理)
(8)# bind 127.0.0.1(bind绑定的是自己机器网卡的ip,如果有多块网卡可以配多个ip,代表允许客户端通过机器的哪些网卡ip去访问,内网一般可以不配置bind,注释掉即可)
(9)protected-mode no (关闭保护模式)
(10)appendonly yes 如果要设置密码需要增加如下配置:
(11)requirepass jony (设置redis访问密码,客户端连接需要使用的密码)
(12)masterauth jony (设置集群节点间访问密码,跟上面一致,集群间内部通信需要的密码)
\
#user default on nopass ~* &* +@all
以上代码主要是redis6.0版本新增了ACL(## Access Control Lists ACL),有兴趣同学可以看一下,本文不再叙述。
3-3、复制修改后的的文件,并进行批量替换
把修改后的配置文件,copy到8001,修改第2、3、4、6项里的端口号,可以用批量替换: :%s/源字符串/目的字符串/g
3-4、另外两台机器也需要做上面几步操作
192.168.253.132第二台机器用8003和8004
192.168.253.133第三台机器用8005和8006
可以通过如下命令进行跨服务器拷贝
scp root@192.168.253.131:/usr/local/redis-cluster/8001/redis.conf /usr/local/redis-cluster/8003
输入以上命令,然后填写131虚拟机密码即可
解析 :当前登录在192.168.253.132虚拟机,root为131账号,“/usr/local/redis-cluster/8001/redis.conf”为131被拷贝的文件,“/usr/local/redis-cluster/8003”为132要拷贝到的地址
4、分别启动6个redis实例,并检查是否启动成功
启动6台redis实例,(自行修改端口号)
/usr/local/redis/src/redis-server /usr/local/redis-cluster/800*/redis.conf
查看是否启动成功
ps -ef | grep redis
131虚拟机
132虚拟机
133虚拟机
5、启动集群
用redis-cli创建整个redis集群(redis5以前的版本集群是依靠ruby脚本redis-trib.rb实现)
下面命令里的1代表为每个创建的主服务器节点创建一个从服务器节点
执行这条命令需要确认三台机器之间的redis实例要能相互访问,可以先简单把所有机器防火墙关掉,如果不关闭防火墙则需要打开redis服务端口和集群节点gossip通信端口16379(默认是在redis端口号上加1W)
关闭防火墙
systemctl stop firewalld 临时关闭防火墙
systemctl disable firewalld 禁止开机启动
注意:下面这条创建集群的命令大家不要直接复制,里面的空格编码可能有问题导致创建集群不成功
/usr/local/redis/src/redis-cli -a jony --cluster create --cluster-replicas 1 192.168.253.131:8001 192.168.253.132:8003 192.168.253.133:8005 192.168.253.131:8002 192.168.253.132:8004 192.168.253.133:8006
会将前面的主机设为master,后面的设为slave,我这边把8001/8003/8005作为master.
命令解析:
-a jony :指定集群连接密码
--cluster-replicas 1:给没给主节点创建一个从节点\
5-1、执行结果-1
5-2、执行结果-2
6、连接集群查看信息
6-1、连接任意一个客户端即可
./redis-cli -c -h -p (-a访问服务端密码,-c表示集群模式,指定ip地址和端口号) 如:/usr/local/redis-5.0.3/src/redis-cli -a jony -c -h 192.168.253.131 -p 800*\
如果连接本机可以省略-h 192.168.x.x\
6-2、进行验证
cluster info(查看集群信息)\
cluster nodes(查看节点列表) \
显示了各个master slave 相关信息\
6-3、进行数据操作验证
在131:8001 下进行set key的时候会对key使用crc16 算法进行 hash,最终计算得到的槽位是5798,然后5798槽位在132:8003master节点下,此时cluster会自动连接到132:8003进行set处理\
6-4、关闭集群则需要逐个进行关闭
/usr/local/redis/src/redis-cli -a jony -c -h 192.168.253.131 -p 8001 shutdown
假如3台虚拟机关机,下次直接启动每个虚拟机下面的cluster-redis即可,请勿再进行
到此redis cluster集群搭建完毕,后面再进行对集群原理,选举等进行记录总结。