阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Redis主从配置及HA方案

161次阅读
没有评论

共计 3049 个字符,预计需要花费 8 分钟才能阅读完成。

首先说下主从同步 Replication 的原理

在 Slave 启动并连接到 Master 之后,它将主动发送一条 SYNC 命令。此后 Master 将启动后台存盘进程,同时收集所有接收到的用于修改数据集的命令,在后台进程执行完毕后,Master 将传送整个数据库文件到 Slave,以完成一次完全同步。而 Slave 服务器在接收到数据库文件数据之后将其存盘并加载到内存中。此后,Master 继续将所有已经收集到的修改命令,和新的修改命令依次传送给 Slaves,Slave 将在本次执行这些数据修改命令,从而达到最终的数据同步。

如果 Master 和 Slave 之间的链接出现断连现象,Slave 可以自动重连 Master,但是在连接成功之后,一次完全同步将被自动执行。

服务器名称 内网 IP

Master 172.30.21.96
Slave1 172.30.21.88
Slave2 172.30.21.89
Slave3 172.30.21.90
Slave4 172.30.21.91

master 配置

logfile“/tmp/redis6379.log”
# slaveof
<masterip> <masterport> #master 这个地方注释不打开,保持默认

启动 master

./redis-server ../redis.conf &

slave 配置

logfile“/tmp/redis6379.log”slaveof 172.30.21.96 6379 

启动 slave

./redis-server ../redis.conf &

检查启动结果

在各自服务器上用 redis-cli 客户端连接 redis,输入 info 指令,即可查看主从的状态。

master:

Redis 主从配置及 HA 方案

slave:

Redis 主从配置及 HA 方案

主从切换

Redis 的主从架构,如果没有设置哨兵,那么如果 master 出现故障,需要手动将 slave 切换成 master 继续服务。下面先说明如何进行手动切换:

# 在新的 master 上执行:SLAVEOF NO ONE
#在其他的 slave 上执行:SLAVEOF <新的 masterip> <新的 masterport>

原来的主 redis 恢复正常了,要重新切换回去。重新切回的步骤如下:

1 将现在的主 redis 的数据进行保存(save 指令)2 将现在的主 redis 根目录下 dump.rdb 文件拷贝覆盖到原来主 redis 的根目录
3 启动原来的主 redis
4 在现在的主 redis 中切换 SLAVEOF <旧的 masterip> <旧的 masterport>
5 在其他的 slave 节点切换 SLAVEOF <旧的 masterip> <旧的 masterport>
6 完毕

自动切换(高可用方案配置)

手动的方式容易造成失误,容易导致数据丢失,而且如果主从节点很多,切换起来也很麻烦。自动切换一般通过设置哨兵实现。哨兵可以对 master 和 slave 进行监控,并在 master 出现故障的时候,能自动将 slave 切换成 master。

redis 哨兵(Redis Sentinel)的启动和 redis 实例的启动没有关系。所以可以在任何机器上启动 redis 哨兵。Redis Sentinel 是一个分布式系统,可以在整个 redis 主从架构中运行多个 Sentinel 进程(progress)。建议至少要保证有两个哨兵在运行,要不然物理机宕机后哨兵进程也不存在了,就无法进行主从切换。

我们这里有 5 台 redis 服务器(1 主 4 从),所以启动 5 个哨兵。每个哨兵的配置如下:

 修改 sentinel.conf 的配置:

logfile "/tmp/sentinel.log"
sentinel monitor mymaster 172.30.21.96 6379 2 #这个 2 代表,当集群中有 2 个 sentinel 认为 master 挂了时,才能真正认为该 master 已经不可用了

启动 sentinel(默认端口号 26379)

./redis-sentinel ../sentinel.conf &

关于 sentinel 可以看官方文档,有很多的说明。这里列出一些主要的配置属性:

# 指明日志文件名
logfile "/tmp/sentinel.log"
# 哨兵监控的 master,主从配置一样,这里只用输入 redis 主节点的 ip/port 和法定人数。sentinel monitor mymaster 172.30.21.96 6379 1
# master 或 slave 多长时间(默认 30 秒)不能使用后标记为 s_down 状态。sentinel down-after-milliseconds mymaster 5000
# 若 sentinel 在该配置值内未能完成 failover 操作(即故障时 master/slave 自动切换),则认为本次 failover 失败。sentinel failover-timeout mymaster 18000
# 设置 master 和 slaves 验证密码
sentinel auth-pass mymaster 123456 
# 指定了在执行故障转移时,最多可以有多少个从服务器同时对新的主服务器进行同步
sentinel parallel-syncs mymaster 1 

通过哨兵查看集群的信息:

$ redis-cli -p 26379
sentinel master mymaster// 查看 master 的状态 
SENTINEL slaves mymaster // 查看 salves 的状态
SENTINEL sentinels mymaster // 查看哨兵的状态
SENTINEL get-master-addr-by-name mymaster// 获取当前 master 的地址
info sentinel// 查看哨兵信息 

写个代码测试下:

public static void main(String[] args) {Set<String> sentinels = new HashSet<String>();
        sentinels.add(new HostAndPort("172.30.21.96", 26379).toString());
        sentinels.add(new HostAndPort("172.30.21.88", 26379).toString());
        sentinels.add(new HostAndPort("172.30.21.89", 26379).toString());
        sentinels.add(new HostAndPort("172.30.21.90", 26379).toString());
        sentinels.add(new HostAndPort("172.30.21.91", 26379).toString());
        JedisSentinelPool sentinelPool = new JedisSentinelPool("mymaster", sentinels);

        System.out.println("Current master:" + sentinelPool.getCurrentHostMaster().toString());

        Jedis master = sentinelPool.getResource();
        //master.set("username","jager");

        System.out.println(master.get("username"));

        sentinelPool.close();
        sentinelPool.destroy();}

本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-04/143064.htm

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-22发表,共计3049字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中