当前位置:当前位置:首页 >系统运维 >Redis高可用知多少之DNS篇 正文

Redis高可用知多少之DNS篇

[系统运维] 时间:2025-11-05 04:36:41 来源:益强IT技术网 作者:系统运维 点击:83次

1、可用背景

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

配置VIP

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

使用DNS

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

注:

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

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

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

2、DNS服务配置

(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";1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.47.48.49.50.51.52.53.54.55.56.57.58.59.60.61.62.63.64.65. (2)检查语法 复制named-checkconf1. (3)启动DNS服务 复制/etc/init.d/named start1. (4)配置DNS正向解析文件

在/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; };

};1.2.3.4.5.6.7.

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

复制# 拷贝文件

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.2081.2.3.4.5.6.7.8.9.10.11.12.13. (5)配置DNS反向解析文件

在/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; };

};1.2.3.4.5.6.7.

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

复制# 拷贝文件

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.1.2.3.4.5.6.7.8.9.10.11.12.13.14. (6)重启DNS服务 复制/etc/init.d/named restart1. (7)测试DNS服务器

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

复制# 修改域名解析文件

vim /etc/resolv.conf

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

nameserver 192.168.56.2091.2.3.4.5.

正向解析测试。

复制nslookup www.redis.com

# 结果如下

Server: 192.168.56.209

Address: 192.168.56.209#53

Name: www.redis.com

Address: 192.168.56.2081.2.3.4.5.6.

反向解析测试。

复制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.1.2.3.4.5.

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 ms1.2.3.4.5.6.7.

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

3、搭建Redis主从

关于redis搭建之前的文章已经介绍过,详细信息可参考历史文章

​https://www.cnblogs.com/gjc592/p/11098047.html。

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

依赖包安装。

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

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

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

tar -zxvf redis-4.0.14.tar.gz1.2.

编译、安装。

复制cd redis-4.0.14

make

make install1.2.3.

创建目录、修改配置文件、启动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.conf1.2.3.4.5.6.7.8.9.10.11.12.13.14.

2、配置主从

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

复制127.0.0.1:6379> slaveof 192.168.56.208 6379 ## 即输入对应的redis主库的免费信息发布网ip 即端口1.

查看主从状态。

复制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:2661.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.

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

4、测试域名方式操作redis

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

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

1、安装Python所需的包-- redis

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

复制pip install redis1.

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,"验证删除成功"1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.

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

复制python test_redis.py

# 结果如下

test1 设置键成功并获取到values

删除键完毕

None 验证删除成功1.2.3.4.5.

有图有真相。

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

5、模拟redis主库异常

1、关闭主库

复制127.0.0.1:6379> shutdown

not connected> exit1.2.

2、测试程序使用redis情况

复制python test_redis.py

## 报错

Traceback (most recent call last):

File "test_redis.py", line 9, in

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.1.2.3.4.5.6.7.8.9.10.11.12.13.14.

即,此时redis已无法使用。

3、提升从库为读写库

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

查看此时从库复制状态。

复制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:32151.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.

断开主从同步。

复制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:32151.2.3.4.5.6.7.8.9.10.11.12.13.14.

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

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.1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.

2、重启DNS服务或刷新缓存

本次测试直接重启DNS服务

复制/etc/init.d/named restart1.

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.2071.2.3.4.5.6.7.8.9.

说明已修改成功

7、最终测试

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

复制python test_redis.py

# 运行结果

test1 设置键成功并获取到values

删除键完毕

None 验证删除成功1.2.3.4.5.

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

(责任编辑:数据库)

    相关内容
    精彩推荐
    热门点击
    友情链接