一文搞定Redis主从,哨兵,集群搭建与测试
Posted 小杰666
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一文搞定Redis主从,哨兵,集群搭建与测试相关的知识,希望对你有一定的参考价值。
在本文中,我们将准备三台虚拟机,安装三个Redis服务端,分别搭建Redis主从、哨兵和集群。
下面我会图文结合来讲解搭建的详细过程,并对注意点加以说明,开始吧~
一、安装Redis服务端
1、准备三台乌班图虚拟机:
下面以Ubuntu Server 20.04作为实验环境,对于CentOS中的安装过程自行百度。准备工作:
乌班图 Server 20.04 虚拟机三台,我用的是MacOS的vmware,架构图:
2、安装Redis和哨兵:
为了方便,用apt包管理安装Redis + Sentinel哨兵,版本为 v5.0.7。分别在三台机器执行下面的命令行:
sudo apt install redis redis-sentinel
安装完成后,查看三台机器上的redis/sentinel端口是否已监听,如下图红框部分:
6379为redis默认端口,26379为sentinel哨兵默认端口。
然后,分别在三台机器查看redis和sentinel的进程是否已运行:
查看 进程 + 端口 正常后,redis服务就启动成功了(redis和哨兵是两个独立服务)。
3、修改Redis配置文件:
分别修改三台机器的三个redis.conf配置文件:sudo vim /etc/redis/redis.conf
# 修改绑定ip,下面表示redis绑定本地和本机ip地址
# 每个机器上的 redis.conf 中只需要一行 bind xxx xxx 配置
bind 127.0.0.1 192.168.173.140 # master机器要改成这行
bind 127.0.0.1 192.168.173.141 # slave1机器改成这行
bind 127.0.0.1 192.168.173.142 # slave2机器改成这行
# yes表示以后台进程方式运行redis
daemonize yes
# 改为yes,开启aof持久化,同时开启AOF+RDB则为混合持久化
appendonly yes
# 添加密码访问,protected-mode 选项为yes时需要密码访问redis
# 在 redis.conf 中的 # requirepass foobared 这行下面添加如下一行即可
requirepass 123456
然后重启三台机器的redis:
sudo systemctl restart redis-server.service
用上述步骤【2、安装Redis和哨兵】中的方法再次确认redis进程+端口监听是否正常。
注意:
三个redis.conf文件里的密码选项requirepass,都设置成一样,方便redis从节点或哨兵节点访问。
二、配置Redis主从复制
1、配置主从:
分别在两台slave上执行如下命令:
redis-cli -a 123456 # 登录本机redis,默认连127.0.0.1 6379上的redis服务
127.0.0.1:6379> REPLICAOF 192.168.173.140 6379 # 本机redis作为从,连接主的 IP + 端口
OK
127.0.0.1:6379> CONFIG SET masterauth 123456 # 主的登录密码,此密码即上文redis.conf中的requirepass 123456选项
OK
用命令设置主从是临时的,重启redis会失效,可以修改两个slave的redis.conf配置文件:
# 在 redis.conf 中的 # replicaof <masterip> <masterport> 这行下添加如下一行
replicaof 192.168.173.140 6379
# 在 # masterauth <master-password> 下添加如下一行
masterauth 123456
注意:
masterauth 123456 选项在三个redis.conf配置文件中都要设置。
如果主的配置中不设置,在出现故障,切换新主的时候,主节点无法连接上新主节点。
修改完配置后,然后重启三台机器的redis:
sudo systemctl restart redis-server.service
2、查看主从info信息:
登录主的redis并查看info:
redis-cli -a 123456
127.0.0.1:6379> INFO replication
# Replication
role:master
connected_slaves:2 # 连接了两个从,下面是它们的ip+端口,状态以及slave目前同步的位置offset,lag是同步延迟
slave0:ip=192.168.173.141,port=6379,state=online,offset=1386,lag=0
slave1:ip=192.168.173.142,port=6379,state=online,offset=1386,lag=1
master_replid:9233b2810b60541532a1ea8fa083da081c5b5fee # master的id
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1386 # master目前写入数据的位置
...
登录两个从的redis查看info:
redis-cli -a 123456
127.0.0.1:6379> INFO replication
# Replication
role:slave
master_host:192.168.173.140
master_port:6379
master_link_status:up # 已连上master
master_last_io_seconds_ago:4
master_sync_in_progress:0
slave_repl_offset:1386 # slave目前同步的位置,这个值应该与主的 master_repl_offset 的值一样
slave_priority:100
slave_read_only:1 # 默认情况,slave都是只读的,仅把master同步过来的数据写入slave
connected_slaves:0 # slave下面还可以连接别的slave,把自己当作经理角色
master_replid:9233b2810b60541532a1ea8fa083da081c5b5fee # master的id
master_replid2:0000000000000000000000000000000000000000
...
3、查看主从复制的日志:
下面是查看slave的日志(/var/log/redis/redis-server.log):
关于redis主从同步的原理,后面单独写文章讲解,本文主要以实践为主。
4、测试主从数据同步:
在master上添加两个键值对(name:Tom, age:22),在两个slave中也可访问,表示主从复制成功:
三、配置Redis哨兵
1、修改哨兵配置文件:
三个哨兵配置修改如下(sudo vim /etc/redis/sentinel.conf):
# 注释掉下面这行
#bind 127.0.0.1 ::1
# 关闭保护模式,v5.0.7没有找到requirepass选项,无法添加密码,因此关闭
protected-mode no
# 以后台进程方式运行
daemonize yes
# 核心配置,把 sentinel monitor mymaster 127.0.0.1 6379 2 这行改成如下:
# 指定哨兵把谁作为主节点,参数含义为:主节点别名、主的IP、主的端口、投票法定人数
# 2表示投票法定人数,即三个哨兵中有2个赞成时,哨兵才会采取下一步动作,如让主节点客观下线
sentinel monitor mymaster 192.168.173.140 6379 2
# 因为redis节点设置了密码,需要在 sentinel monitor mymaster xxx 的下面加一行:
sentinel auth-pass mymaster 123456
注意:
上面的bind选项,一定要把本机ip放前面,如 bind 192.168.173.140 127.0.0.1。不然会出现哨兵找不到其他哨兵的问题。或者直接注释掉 bind 这行。
2、重启主从共3个哨兵(顺序 主、从1、从2):
sudo systemctl restart redis-sentinel.service
3、查看哨兵信息:
登录master查看哨兵信息:
redis-cli -p 26379
127.0.0.1:26379> info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=192.168.173.140:6379,slaves=2,sentinels=3 # 如果sentinels=1,说明哨兵无法发现彼此
127.0.0.1:26379> sentinel master mymaster # 查看主的信息
...
127.0.0.1:26379> sentinel slaves mymaster # 查看两个从的信息
...
127.0.0.1:26379> sentinel sentinels mymaster # 查看其他两个哨兵的信息
...
注意:
如果三个哨兵之间无法发现彼此,检查三个哨兵配置文件里的 sentinel myid xxx 是否一样,如果一样,删除每个配置文件里的 myid 这行,然后分别重启三个哨兵,会自动生成随机id写入相应配置文件。
三个哨兵日志(/var/log/redis/redis-sentinel.log)中,也可以看到 +monitor, +sentinel, +slave 这样的事件,表示哨兵之间已经发现redis主从节点,以及其他哨兵节点。
4、测试故障转移:
在master机器执行:
redis-cli -a 123456 DEBUG sleep 100
表示执行调试命令,睡眠100秒,模拟redis主节点下线。30秒后sentinel会发现主节点主观下线(+sdown事件),然后哨兵之间判定客观下线(-odown事件),最后投票选举出领头(leader)哨兵,执行故障转移(failover),等下线的主节点重新上线后,作为新主节点的从节点。看如下日志:
此时在,192.168.173.140机器上登录sentinel:
redis-cli -p 26379
127.0.0.1:26379> info sentinel # 192.168.173.140 此时已经变为从节点
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=192.168.173.141:6379,slaves=2,sentinels=3 # 新主是192.168.173.141
四、配置Redis Cluster集群
1、修改redis配置:
如同哨兵模式,redis cluster集群也是高可用方案,并且有slot(槽)加持,使得集群具有高并发。
cluster集群与哨兵功能无关,因此先关闭哨兵服务:
xxxxx
。。未完待续。。。
参考:
以上是关于一文搞定Redis主从,哨兵,集群搭建与测试的主要内容,如果未能解决你的问题,请参考以下文章