百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

Redis高可用知多少之DNS篇

mhr18 2024-11-22 17:42 18 浏览 0 评论

1. 背景

例如,存在一套redis主从(主从节点在不同的主机上),应用程序通过主库的ip进行读写操作。但是,主库一旦出现故障,虽然有从库,且从库提升为主库,但是应用程序如果想使用从库则必须修改配置,重启应用方可生效。如用此情况,则涉及的人员比较多,且应用程序恢复使用的时间比较长。对于此情况,可以采取以下2种解决方式解决:

a) 配置VIP

在Redis主库服务器上配置vip,当主库出现问题时,配置脚本将vip自动切换至从节点,并将从节点提升为读写状态。应用程序中配置的是vip,主库异常时,从库自动提升为主库对外提供服务,应用程序无需做任何操作。

b) 使用DNS

应用程序通过配置内网域名连接redis,DNS服务器对应域名映射到redis主库服务器IP。当redis主库异常时,将redis从节点提升为读写主库,修改DNS域名映射关系至redis从节点ip,此时应用程序也无需进行操作。

注:

以上2种方式均存在缺陷,例如:

  • vip方式存在问题: 当主从节点不在同一个机房或同一网段时,将无法使用相同的vip。
  • DNS方式:使用DNS方式将有DNS缓存问题,即修改域名映射后域名仍可能解析到原主库机器的ip。

vip配合哨兵的高可用方式将在后续介绍,本次先介绍DNS服务器配置及dns方式解决方案。


2. DNS服务配置

2.1 安装DNS服务

# 安装bind相关工具

yum  install  bind  bind-utils  bind-devel bind-libs  bind-chroot  -y
2.2  修改配置文件
vim /etc/named.conf

##  编译对应内容

// named.conf

//

// Provided by Red Hat bind package to configure the ISC BIND named(8) DNS

// server as a caching only nameserver (as a localhost DNS resolver only).

//

// See /usr/share/doc/bind*/sample/ for example named configuration files.

//




options {

//      listen-on port 53 { 127.0.0.1; };       // 此行注释

        listen-on port 53 { any; };             //  添加此行

        listen-on-v6 port 53 { ::1; };

        directory       "/var/named";

        dump-file       "/var/named/data/cache_dump.db";

        statistics-file "/var/named/data/named_stats.txt";

        memstatistics-file "/var/named/data/named_mem_stats.txt";

//      allow-query     { localhost; };        //  注释此行

        allow-query     { any; };              //  添加此行

        forwarders {114.114.114.114; };          //   添加此行,这是在DNS服务器不知道域名解析的时候询问这个IP的主机,这个IP的主机必须联网

        recursion yes;




        dnssec-enable yes;

        dnssec-validation yes;




        /* Path to ISC DLV key */

        bindkeys-file "/etc/named.iscdlv.key";




        managed-keys-directory "/var/named/dynamic";

};




logging {

        channel default_debug {

                file "data/named.run";

                severity dynamic;

        };

};




zone "." IN {

        type hint;

        file "named.ca";

};




include "/etc/named.rfc1912.zones";

include "/etc/named.root.key";

2.3 检查语法

named-checkconf

2.4 启动DNS服务

/etc/init.d/named  start

2.5 配置DNS正向解析文件

a) 在/etc/named.rfc1912.zones添加正向解析配置

vim /etc/named.rfc1912.zones  # 此文件名在上面步骤的/etc/named.conf文件末尾有指定


##  此文件末尾追加如下内容




zone "redis.com" IN {                         //  redis.com 名自定义,即需要解析的域名
        type master;                          //  dns域类型为master
        file "redis.com.zone";                //  redis.com.zone 文件名自定义,后续文件名需与此一致
        allow-update { none; };
};

b) 根据上一步的情况,配置解析文件

# 拷贝文件
cp -p  named.localhost redis.com.zone  # 拷贝文件,注意要连同权限一起拷贝,因权限不一致,启动会报错


vim   redis.com.zone


$TTL 1D
@       IN SOA  www.redis.com.  rname.invalid. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        NS      www.redis.com.


dns  IN A 192.168.56.208
www  IN A 192.168.56.208

2.6 配置DNS反向解析文件

a) 在/etc/named.rfc1912.zones添加反向解析配置

可以将正向解析与反向解析配置在一个文件里,即file配置为相同的文件名。本次分开配置来演示

vim /etc/named.rfc1912.zones  # 此文件名在上面步骤的/etc/named.conf文件末尾有指定


##  此文件末尾追加如下内容


zone "56.168.192.in-addr.arpa" IN {
        type master;
        file "redis.com.local";
        allow-update { none; };
};

b) 根据上一步的情况,配置解析文件

# 拷贝文件
cp -p  named.localhost redis.com.local  # 拷贝文件,注意要连同权限一起拷贝,因权限不一致,启动会报错


vim   redis.com.local


$TTL 1D
@       IN SOA  www.redis.com.  rname.invalid. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        NS      @
        A       192.168.56.208
        AAAA    ::1
208     IN PTR www.redis.com.

2.7 重启DNS服务

/etc/init.d/named restart

2.8 测试DNS服务器

在另一台主机上测试DNS是否可用,操作步骤如下。

# 修改域名解析文件

vim /etc/resolv.conf

# 将创建的DNS服务器地址添加至此文件

nameserver   192.168.56.209

正向解析测试

 nslookup www.redis.com
# 结果如下
Server:        192.168.56.209
Address:    192.168.56.209#53


Name:    www.redis.com
Address: 192.168.56.208

反向解析测试

nslookup  192.168.56.208

#  结果如下:

Server:        192.168.56.209

Address:    192.168.56.209#53




208.56.168.192.in-addr.arpa    name = www.redis.com.


ping 域名测试

ping  www.redis.com
#  结果如下
PING www.redis.com (192.168.56.208) 56(84) bytes of data.
64 bytes from www.redis.com (192.168.56.208): icmp_seq=1 ttl=64 time=0.229 ms
64 bytes from www.redis.com (192.168.56.208): icmp_seq=2 ttl=64 time=0.287 ms
64 bytes from www.redis.com (192.168.56.208): icmp_seq=3 ttl=64 time=0.276 ms
64 bytes from www.redis.com (192.168.56.208): icmp_seq=4 ttl=64 time=0.224 ms

至此,DNS服务器搭建并测试完毕,下面进入正题。


3. 搭建Redis主从

关于redis搭建之前的文章已经介绍过,详细信息可参考历史文章https://www.cnblogs.com/gjc592/p/11098047.html。

3.1 搭建主、从节点redis实例,部署过程完全一致

a) 依赖包安装

yum -y install cpp binutils glibc glibc-kernheaders glibc-common glibc-devel gcc make gcc-c++ libstdc++-devel tclb)  安装包准备

可以从官网 https://redis.io下载最新版redis

wget  http://download.redis.io/releases/redis-4.0.14.tar.gz

tar -zxvf redis-4.0.14.tar.gz

c) 编译、安装

cd   redis-4.0.14

make

make install

d) 创建目录、修改配置文件、启动redis

建议创建单独的redis目录

#  创建目录
mkdir -p /data/redis/redis6379


#  拷贝配置文件
cp redis.conf  /data/redis/redis6379/


#  修改配置文件
vim redis.conf
修改如下部分
bind  0.0.0.0     可以指定所有地址均可访问,若指定对应网段或IP 修改此处即可
daemonize yes   放在后台执行,建议修改为yes
pidfile /data/redis/redis6379/redis_6379.pid  指定pid文件目录及文件名
logfile "/data/redis/redis6379/redis6379.log" 指定log文件目录及文件名


# 其他参数在生产环境中可适当调整


# 启动redis
redis-server redis.conf

3.2 配置主从

在从服务器执行如下命令配置主从

127.0.0.1:6379> slaveof   192.168.56.208  6379    ##  即输入对应的redis主库的ip 即端口

查看主从状态

127.0.0.1:6379> info Replication
##  结果如下
# Replication
role:slave
master_host:192.168.56.208
master_port:6379
master_link_status:up                  //  up代表已正常同步
master_last_io_seconds_ago:3
master_sync_in_progress:0
slave_repl_offset:266
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:22830eb406e63f0a85d3d912a44e1b80dba6c860
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:266
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:266

至此,redis主从同步配置完成


4. 测试域名方式操作redis

编写程序,测试使用域名方式连接redis

注意:程序运行机器需添加对应的内网DNS服务器,即2.8中的操作。本次使用python进行测试

4.1 安装Python所需的包-- redis

python连接redis需安装redis包,关于Python升级,pip安装等历史文章里均有,如有需要可以参考操作

pip  install redis

4.2 编写简单的Python操作redis的测试程序

 vim test_redis.py


#  内容如下


#!/usr/bin/python
# coding=utf-8


import redis
v_ip ='www.redis.com'
v_port = 6379
v_passwd=''
r = redis.Redis(host=v_ip,port=v_port,password=v_passwd,db=0)
r.set('test_key1','test1')
result = r.get('test_key1')
print  result ,"设置键成功并获取到values"
r.delete('test_key1')
print  "删除键完毕"
result1 = r.get('test_key1')
print result1,"验证删除成功"

4.3 运行测试程序,看是否能通过域名操作成功

 python test_redis.py

# 结果如下

test1 设置键成功并获取到values

删除键完毕

None 验证删除成功

有图有真相

说明,使用域名操作redis正常。

5. 模拟redis主库异常

5.1 关闭主库

127.0.0.1:6379> shutdown

not connected> exit

5.2 测试程序使用redis情况

python test_redis.py
##  报错
Traceback (most recent call last):
  File "test_redis.py", line 9, in <module>
    r.set('test_key1','test1')
  File "/usr/local/python2.7/lib/python2.7/site-packages/redis/client.py", line 1451, in set
    return self.execute_command('SET', *pieces)
  File "/usr/local/python2.7/lib/python2.7/site-packages/redis/client.py", line 772, in execute_command
    connection = pool.get_connection(command_name, **options)
  File "/usr/local/python2.7/lib/python2.7/site-packages/redis/connection.py", line 994, in get_connection
    connection.connect()
  File "/usr/local/python2.7/lib/python2.7/site-packages/redis/connection.py", line 497, in connect
    raise ConnectionError(self._error_message(e))
redis.exceptions.ConnectionError: Error 111 connecting to www.redis.com:6379. Connection refused.

即,此时redis已无法使用

5.3 提升从库为读写库

从库默认为只读,断开主从复制后将会变为读写库

a) 查看此时从库复制状态

127.0.0.1:6379> info Replication
# Replication
role:slave
master_host:192.168.56.208
master_port:6379
master_link_status:down                       // 主从同步已断开
master_last_io_seconds_ago:-1
master_sync_in_progress:0
slave_repl_offset:3215
master_link_down_since_seconds:98
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:22830eb406e63f0a85d3d912a44e1b80dba6c860
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:3215
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:3215

b) 断开主从同步

127.0.0.1:6379> slaveof  no one
OK
127.0.0.1:6379> info Replication
# Replication
role:master                                             // 断开后,已变成主库
connected_slaves:0
master_replid:180df5fbdc8cf8999b27ad42e6c57eb3be31b6b2
master_replid2:22830eb406e63f0a85d3d912a44e1b80dba6c860
master_repl_offset:3215
second_repl_offset:3216
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:3215

因此时域名仍指向原主库,所以程序依旧异常。

6. 切换域名指向

6.1 修改配置文件

将DNS服务中对应域名的IP地址改为从库地址

 vim redis.com.zone
##  修改
$TTL 1D
@       IN SOA  www.redis.com. rname.invalid. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        NS      www.redis.com.


dns  IN A 192.168.56.207
www  IN A 192.168.56.207


 vim redis.com.local
#  修改后
$TTL 1D
@       IN SOA  www.redis.com.  rname.invalid. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        NS      @
        A       192.168.56.207
        AAAA    ::1
207     IN PTR www.redis.com.

6.2 重启DNS服务或刷新缓存

本次测试直接重启DNS服务

/etc/init.d/named  restart

6.3 简单测试域名解析情况

nslookup www.redis.com   #正向测试DNS
#  结果如下
nslookup www.redis.com
Server:        192.168.56.209
Address:    192.168.56.209#53


Name:    www.redis.com
Address: 192.168.56.207

说明已修改成功

7. 最终测试

再次使用python 程序测试操作redis情况

python test_redis.py

# 运行结果

test1 设置键成功并获取到values

删除键完毕

None 验证删除成功

此时应用程序未做任何修改,可以正常使用。


ps:

以上测试步骤中部分有省略,如果错误,欢迎指正。如有问题,请关注微信公众号“数据库干货铺”进行交流

相关推荐

【推荐】一个开源免费、AI 驱动的智能数据管理系统,支持多数据库

如果您对源码&技术感兴趣,请点赞+收藏+转发+关注,大家的支持是我分享最大的动力!!!.前言在当今数据驱动的时代,高效、智能地管理数据已成为企业和个人不可或缺的能力。为了满足这一需求,我们推出了这款开...

Pure Storage推出统一数据管理云平台及新闪存阵列

PureStorage公司今日推出企业数据云(EnterpriseDataCloud),称其为组织在混合环境中存储、管理和使用数据方式的全面架构升级。该公司表示,EDC使组织能够在本地、云端和混...

对Java学习的10条建议(对java课程的建议)

不少Java的初学者一开始都是信心满满准备迎接挑战,但是经过一段时间的学习之后,多少都会碰到各种挫败,以下北风网就总结一些对于初学者非常有用的建议,希望能够给他们解决现实中的问题。Java编程的准备:...

SQLShift 重大更新:Oracle→PostgreSQL 存储过程转换功能上线!

官网:https://sqlshift.cn/6月,SQLShift迎来重大版本更新!作为国内首个支持Oracle->OceanBase存储过程智能转换的工具,SQLShift在过去一...

JDK21有没有什么稳定、简单又强势的特性?

佳未阿里云开发者2025年03月05日08:30浙江阿里妹导读这篇文章主要介绍了Java虚拟线程的发展及其在AJDK中的实现和优化。阅前声明:本文介绍的内容基于AJDK21.0.5[1]以及以上...

「松勤软件测试」网站总出现404 bug?总结8个原因,不信解决不了

在进行网站测试的时候,有没有碰到过网站崩溃,打不开,出现404错误等各种现象,如果你碰到了,那么恭喜你,你的网站出问题了,是什么原因导致网站出问题呢,根据松勤软件测试的总结如下:01数据库中的表空间不...

Java面试题及答案最全总结(2025版)

大家好,我是Java面试陪考员最近很多小伙伴在忙着找工作,给大家整理了一份非常全面的Java面试题及答案。涉及的内容非常全面,包含:Spring、MySQL、JVM、Redis、Linux、Sprin...

数据库日常运维工作内容(数据库日常运维 工作内容)

#数据库日常运维工作包括哪些内容?#数据库日常运维工作是一个涵盖多个层面的综合性任务,以下是详细的分类和内容说明:一、数据库运维核心工作监控与告警性能监控:实时监控CPU、内存、I/O、连接数、锁等待...

分布式之系统底层原理(上)(底层分布式技术)

作者:allanpan,腾讯IEG高级后台工程师导言分布式事务是分布式系统必不可少的组成部分,基本上只要实现一个分布式系统就逃不开对分布式事务的支持。本文从分布式事务这个概念切入,尝试对分布式事务...

oracle 死锁了怎么办?kill 进程 直接上干货

1、查看死锁是否存在selectusername,lockwait,status,machine,programfromv$sessionwheresidin(selectsession...

SpringBoot 各种分页查询方式详解(全网最全)

一、分页查询基础概念与原理1.1什么是分页查询分页查询是指将大量数据分割成多个小块(页)进行展示的技术,它是现代Web应用中必不可少的功能。想象一下你去图书馆找书,如果所有书都堆在一张桌子上,你很难...

《战场兄弟》全事件攻略 一般事件合同事件红装及隐藏职业攻略

《战场兄弟》全事件攻略,一般事件合同事件红装及隐藏职业攻略。《战场兄弟》事件奖励,事件条件。《战场兄弟》是OverhypeStudios制作发行的一款由xcom和桌游为灵感来源,以中世纪、低魔奇幻为...

LoadRunner(loadrunner录制不到脚本)

一、核心组件与工作流程LoadRunner性能测试工具-并发测试-正版软件下载-使用教程-价格-官方代理商的架构围绕三大核心组件构建,形成完整测试闭环:VirtualUserGenerator(...

Redis数据类型介绍(redis 数据类型)

介绍Redis支持五种数据类型:String(字符串),Hash(哈希),List(列表),Set(集合)及Zset(sortedset:有序集合)。1、字符串类型概述1.1、数据类型Redis支持...

RMAN备份监控及优化总结(rman备份原理)

今天主要介绍一下如何对RMAN备份监控及优化,这里就不讲rman备份的一些原理了,仅供参考。一、监控RMAN备份1、确定备份源与备份设备的最大速度从磁盘读的速度和磁带写的带度、备份的速度不可能超出这两...

取消回复欢迎 发表评论: