一文搞定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主从,哨兵,集群搭建与测试的主要内容,如果未能解决你的问题,请参考以下文章

一文搞定Redis主从复制,哨兵集群,Cluster集群搭建与测试

一文掌握Redis主从复制哨兵Cluster三种集群模式

redis集群介绍与搭建(主从哨兵cluster集群)!

redis集群介绍与搭建(主从哨兵cluster集群)!

Redis单机,主从集群,哨兵集群,分片集群的搭建

Redis单机,主从集群,哨兵集群,分片集群的搭建