2023年12月5日
版本 1
查看文件系统版本
[root@localhost ~]# cat /etc/redhat-release
CentOS Stream release 9
查看内核信息
[root@localhost ~]# uname -r
5.14.0-386.el9.x86_64
关闭防火墙
关闭selinux
配置网卡
配置网卡的时候,如果配置网卡完成之后,重启网卡,不能ping外网。
解决 进入/etc/resolv.conf 配置上级的dns解析
配置主机名
hostnamectl set-hostname --static 主机名
前期规划
主机为192.168.8.151 和192.168.8.154
主为151 从为154
查询dnsmasq软件包
yum list dnsmasq
查询 dnsmasq 软件包详情
yum info dnsmasq
安装 dnsmasq 软件包
使用 yum -y install 命令安装 dnsmasq 软件包
yum -y install dnsmasq
查询软件版本
dnsmasq -v
查看 dnsmasq 安装了哪些组件
rpm -ql dnsmasq
过滤 dnsmasq 的默认配置文件
查看默认配置文件,其中警号#开头的为注释信息。
[root@hanyw-pgsql conf]# grep -Ev '^$|#' /etc/dnsmasq.conf
user=dnsmasq // 用户
group=dnsmasq // 用户组 conf-dir=/etc/dnsmasq.d,.rpmnew,.rpmsave,.rpmorig // 配置文件的包含目录
查看 dnsmasq 服务用户
[root@hanyw-pgsql conf]# id dnsmasq
uid=984(dnsmasq) gid=984(dnsmasq) groups=984(dnsmasq)
修改配置
备份原始配置文件到/opt 目录
151主机和154主机一起配置
[root@hanyw-pgsql conf]# cp -av /etc/dnsmasq.conf /opt/
'/etc/dnsmasq.conf' -> '/opt/dnsmasq.conf'
配置dnsmasq的主配置文件
154主机配置文件
cat >/etc/dnsmasq.conf<<ldp
###### hanyw echo $(date +%Y/%m/%d-%H:%S:%M) ######
port=53
resolv-file=/etc/resolv.conf
strict-order
listen-address=192.168.8.154,127.0.0.1
addn-hosts=/etc/dnsmasq_hosts
cache-size=150
conf-dir=/etc/dnsmasq.d,.rpmnew,.rpmsave,.rpmorig
log-facility=/etc/dnsmasqlog/dnsmasq.log
###### hanyw echo $(date +%Y/%m/%d-%H:%S:%M) ######
ldp
配置日志的目的:就是客户端请求dns域名的行为,做分析使用。
151主机配置文件
cat >/etc/dnsmasq.conf<<ldp
###### hanyw echo $(date +%Y/%m/%d-%H:%S:%M) ######
port=53
resolv-file=/etc/resolv.conf
strict-order
listen-address=192.168.8.151,127.0.0.1
addn-hosts=/etc/dnsmasq_hosts
cache-size=150
conf-dir=/etc/dnsmasq.d,.rpmnew,.rpmsave,.rpmorig
log-facility=/etc/dnsmasqlog/dnsmasq.log
###### hanyw echo $(date +%Y/%m/%d-%H:%S:%M) ######
ldp
注意:日志需要创建目录/etc/dnsmasqlog
主配置文件也可以添加上级dns,如下图所示
配置网卡配置文件时需要将dns注释掉
151主机和154主机配置一样
配置本机dns请求的ip地址
154主机配置
[root@localhost etc]# cat /etc/resolv.conf
# Generated by NetworkManager
nameserver 192.168.8.154
nameserver 192.168.8.151
nameserver 8.8.8.8
151主机配置
[root@localhost etc]# cat /etc/resolv.conf
# Generated by NetworkManager
nameserver 192.168.8.151
nameserver 192.168.8.154
nameserver 8.8.8.8
这里就是将本机的dns请求先指向本机,之后本机找不到,再指向8.8.8.8服务器。从上到下。
配置dns域名解析记录
154主机和151主机配置相同
[root@localhost ~]# cat /etc/dnsmasq_hosts
192.168.8.156 www.ljh.com
192.168.8.157 www.ljh.com
这里可以配置nginx 的域名vip
确认dns(本机)配置是否正确
重启系统网络服务
[root@localhost etc]# systemctl restart NetworkManager
再次查看resolv.conf
[root@localhost etc]# cat /etc/resolv.conf
# Generated by NetworkManager
nameserver 192.168.8.154
nameserver 192.168.8.151
nameserver 8.8.8.8
如果出现下图,则应是网卡配置错误
将网卡的dns配置注释掉。
之后进行重启,再次查看
设置开机自启动
systemctl enable dnsmasq.service
查看dnsmasq 服务
查看 dnsmasq 服务状态
systemctl start dnsmasq
查看 dnsmasq 的进程
ps axu |grep dnsmasq
过滤服务器端监听的 53 端口库(查看 dnsmasq 服务的端口)
ss -ntpl |grep 53
dnsmasq命令
重启:systemctl reatart dnsmasq
检查语法
[root@localhost ~]# dnsmasq --test
dnsmasq: syntax check OK.
开机自启
systemctl enable dnsmasq.service
检测开机自启是否设置成功
[root@localhost etc]# systemctl list-unit-files |grep -i enable |grep dns
dnsmasq.service enabled disabled
标记为红色的字段,表示 dnsmasq 开机自启动设置成功。
关闭
systemctl stop dnsmasq
开启
systemctl start dnsmasq
dig命令测试
yum install bind-utils
dig命令 默认不指定@
@指的是dns服务器地址,默认会从本机的/etc/resolv.conf中读取dns的配置
不加@的话,从列表中的第一个dns服务器的ip地址中查找。
首先要了解什么是dns不可用了,不可用就是/etc/resolv.conf配置文件当中,第一个dns服务器错误,之后会找第二个dns服务器,第二个服务器出错,之后,就会找第三个。以此类推,也就是解析顺序。
同步主 DNS 数据到从 DNS 方案选型
使用系统默认的定时任务结合 rsync
crontab 命令(定时任务)
crontab -e 进入
crontab -l 查看里面内容
rsync 命令
yum -y install rsync
从服务器上面配置秘钥
ssh-keygen
发给主服务器
ssh-copy-id 192.168.8.151
在从服务器上面配置定时任务,定时和主服务器的dnsmasq_hosts文件进行同步。
定时任务
[root@localhost ~]# crontab -l
* * * * * /usr/bin/rsync -az --delete 192.168.8.151:/etc/dnsmasq_hosts /etc/ 2>&1 > /dev/null
缺点
基于分钟级别的数据同步,数据延迟至少在 1 分钟左右,会丢失 1 分钟的数据。
因为系统默认每分钟执行一次,所以数据同步延迟至少在一分钟左右。
进一步改进
使用以下 cron 表达式:
* * * * * sleep 5; command
这种方法虽然可以实现每 5 秒钟执行一次的效果,但它并不是最稳定和可靠的方式, 因为它依赖于操作系统在给定时间精度上的准确性。如果您需要更加精确的任务调度,建议 使用类似 systemd 或者其他的调度工具来处理。
[root@localhost ~]# crontab -l
* * * * * /usr/bin/rsync -az --delete 192.168.8.151:/etc/dnsmasq_hosts /etc/ 2>&1 > /dev/null ; sleep 5
内置定时器
使用systemd内置的定时器和systemctl命令来实现每5秒执行一次任务
在/etc/systemd/system/目录下创建一个新的文件系统example.service,并写入以下内容
演示配置没有完成
nfs共享存储
解决dns服务器的数据一致性的问题
主从服务器的dnsmasq_hosts 文件全部挂载到nfs服务器上面进行挂载
安装
查看 nfs-utils 软件包是否存在
yum info nfs-utils
安装 nfs-utils 软件包
yum install -y nfs-utils
查看共享服务器的提供的共享文件夹
showmount -e ip(文件服务器的ip地址)
如下图所示
这里的话共享服务器提供的共享目录是/data,但是我们需要将etc/dnsmasq_hosts 文件挂载共享服务器上面
解决
在本机上面创建/data/dnsmasq/etc/目录,之后在该目录下创建/etc/dnsmasq_hosts 的软链接。
创建dns域名解析的目录
mkdir -pv /data/dnsmasq/etc/
挂载 NFS 共享存储
mount -t nfs 共享服务器ip地址:/data/nfs/bj-server /data/dnsmasq/etc/
永久挂载
进入 /etc/fstab 文件里面
写入 本机ip地址 对方的共享目录 本机挂载的目录 nfs dafaults 0 0
例子:
创建软链接
ln -sv /etc/dnsmasq_hosts /data/dnsmasq/etc
也可以在/data/dnsmasq/etc目录下执行
ln -sv /etc/dnsmasq_hosts .
mount -a 将 /etc/fstab 中定义的所有档案系统挂上
如果要考虑ngs共享存储挂了的话,在/etc/fstab 文件里面再挂载一个共享文件服务器的ip地址,但是该行的配置要注释掉,之后可以写一个脚本,检测如果共享服务器挂掉之后,可将备用的配置前面的#号注释掉。
keepalived实现dns集群高可用 主从架构
前期配置
角色 | ip | 主机名 | vip | 域名 | 软件 |
dns服务器 | 192.168.8.151 | dnsM151 | 192.168.8.156 | 大炮 | |
dns服务器 | 192.168.8.154 | dnsB154 | 192.168.8.157 | 大炮 | |
安装keepalived
yum -y install keepalived
抢占模式
就是主服务器挂掉之后,备用服务器顶上,之后如果主服务器状态恢复之后,主服务器会将vip抢占过来
151配置
global_defs {
router_id dnsM151
}
vrrp_script chk_dns{
script "/data/scripts/shell/checkDnsmasq.sh"
interval 2
weight -20
}
vrrp_instance VI_1 {
state MASTER
interface ens160
virtual_router_id 99
mcast_src_ip 192.168.8.151
priority 100
advert_int 3
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.8.156
192.168.8.157
}
track_script {
chk_dns
}
}
154配置
global_defs {
router_id dnsB154
}
vrrp_script chk_dns{
script "/data/scripts/shell/checkDnsmasq.sh"
interval 2
weight -20
}
vrrp_instance VI_1 {
state BACKUP
interface ens160
virtual_router_id 99
mcast_src_ip 192.168.8.154
priority 90
advert_int 3
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.8.156
192.168.8.157
}
track_script {
chk_dns
}
}
创建启动脚本
在151和154主机上面都要
mkdir -pv /data/scripts/shell/ 目录
之后创建 touch mkdir -pv /data/scripts/shell/checkDnsmasq.sh 启动脚本
创建dnsmasq检测脚本
创建shell脚本存放路径
mkdir -pv /data/scripts/shell
创建检测dnsmasq的检测脚本
touch /data/scripts/shell/checkDnsmasq.sh
cat >/data/scripts/shell/checkDnsmasq.sh<<EOF
#!/bin/bash
#检测 dnsmasq 是否启动了
dnsProcessNum=\$(ps axu |grep dnsmasq |grep -v grep | wc -l)
if [ \$dnsProcessNum -eq 0 ];then
systemctl start dnsmasq
sleep 5
if [ \$(ps axu |grep dnsmasq |grep -v grep | wc -l) -eq 0 ];then
systemctl stop keepalived
fi
fi
EOF
bash -n /data/scripts/shell/checkDnsmasq.sh
chmod 700 /data/scripts/shell/checkDnsmasq.sh
非抢占模式
非抢占就是两台服务器配置都是BACKUP ,但是优先级不同。主服务器挂掉之后,备份服务器顶上,但是之后主服务器恢复之后,不会把vip抢占过来。保证了稳定性
这两个节点 state 指定的都是 BACKUP,同时,其中一个优先级高于一个节点,优先级 (Master)高的节点配置了 nopreempt 参数表示非抢占模式,从节点不配置 nopreempt 参数。
151主机
cat > /etc/keepalived/keepalived.conf<<EOF
global_defs {
router_id dnsM151
}
vrrp_script chk_dns{
script "/data/scripts/shell/checkDnsmasq.sh"
interval 2
weight -20
}
vrrp_instance VI_1 {
state BACKUP
# 配 置 为 非 抢 占 模 式
n o p r e e m p t
interface ens160
virtual_router_id 99
mcast_src_ip 192.168.8.151
priority 100
advert_int 3
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.8.156
192.168.8.157
}
track_script {
chk_dns
}
}
EOF
154主机
cat > /etc/keepalived/keepalived.conf<<EOF
global_defs {
router_id dnsB154
}
vrrp_script chk_dns{
script "/data/scripts/shell/checkDnsmasq.sh"
interval 2
weight -20
}
vrrp_instance VI_1 {
state BACKUP
interface ens160
virtual_router_id 99
mcast_src_ip 192.168.8.154
priority 90
advert_int 3
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.8.156
192.168.8.157
}
track_script {
chk_dns
}
}
EOF
router_id 不同,均为本节点 hostname
interface 本节点的网络接口,通过 ifconfig 查看
mcast_src_ip 不同,均为本节点的 IP
priority 节点优先级,MASTER 要大于 BACKUP 与抢占模式配置文件的差异点
nopreempt 在 vrrp_instance 块下都配置了,所以 MASTER 从故障中恢复后,不会抢占 vip
state 均为 BACKUP
重启
systemctl restart keepalived
关闭
systemctl stop keepalived
主主模式
模式说明:
设置两台主机都处于工作模式相互备份
必须有两个ip地址,分别绑定在两个节点上。
vip地址1 2
主机 a b
主机a 为 1 地址的主节点,主机a为2地址的备节点
主机b为1地址的备节点,主机b为2节点的主节点
当一个主机不可用时,则另外的一台服务器上面的备用节点成为主节点。
需要修改的内容
正确配置
151主机配置
global_defs {
router_id dnsM151
}
vrrp_script chk_dns{
script "/data/scripts/shell/checkDnsmasq.sh"
interval 2
weight -20
}
vrrp_instance VI_1 {
state MASTER
interface ens160
virtual_router_id 151
mcast_src_ip 192.168.8.151
priority 100
advert_int 3
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.8.156
}
track_script {
chk_dns
}
}
vrrp_instance VI_2 {
state BACKUP
interface ens160
virtual_router_id 154
mcast_src_ip 192.168.8.151
priority 80
advert_int 3
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.8.157
}
track_script {
chk_dns
}
}
154主机配置
global_defs {
router_id dnsB154
}
vrrp_script chk_dns{
script "/data/scripts/shell/checkDnsmasq.sh"
interval 2
weight -20
}
vrrp_instance VI_1 {
state BACKUP
interface ens160
virtual_router_id 151
mcast_src_ip 192.168.8.154
priority 100
advert_int 3
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.8.157
}
track_script {
chk_dns
}
}
vrrp_instance VI_2 {
state MASTER
interface ens160
virtual_router_id 154
mcast_src_ip 192.168.8.154
priority 80
advert_int 3
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.8.156
}
track_script {
chk_dns
}
}
错误配置
151主机配置
global_defs {
router_id dnsM151
}
vrrp_script chk_dns{
script "/data/scripts/shell/checkDnsmasq.sh"
interval 2
weight -20
}
vrrp_instance VI_1 {
state MASTER
interface ens160
virtual_router_id 151
mcast_src_ip 192.168.8.151
priority 100
advert_int 3
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.8.156
}
track_script {
chk_dns
}
}
vrrp_instance VI_2 {
state BACKUP
interface ens160
virtual_router_id 154
mcast_src_ip 192.168.8.151
priority 80
advert_int 3
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.8.157
}
track_script {
chk_dns
}
}
154主机配置
global_defs {
router_id dnsB154
}
vrrp_script chk_dns{
script "/data/scripts/shell/checkDnsmasq.sh"
interval 2
weight -20
}
vrrp_instance VI_2 {
state BACKUP
interface ens160
virtual_router_id 151
mcast_src_ip 192.168.8.154
priority 80
advert_int 3
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.8.156
}
track_script {
chk_dns
}
}
vrrp_instance VI_1 {
state MASTER
interface ens160
virtual_router_id 154
mcast_src_ip 192.168.8.154
priority 100
advert_int 3
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.8.157
}
track_script {
chk_dns
}
}
注意修改的配置
router_id dnsM151 修改为主机的主机名
/data/scripts/shell/checkDnsmasq.sh 配置keepalived的启动脚本
两个vip实例分别为主备
网卡配置名称
virtual_router_id 不同
mcast_src_ip 相同
priority 优先级不同,该主机的主vip优先级高 从ip优先级低
配置的ip地址不同
virtual_ipaddress {
192.168.8.156
keepalived 两种模式的总结
主从模式和主主模式
主从模式
抢占模式
就是主服务器挂掉之后,备用服务器顶上,之后如果主服务器状态恢复之后,主服务器会将vip抢占过来,主从服务器分别配置MASTER和BACKUP。
非抢占模式
主从服务器都配置BACKUP,但是主服务器优先级高,从服务器优先级低 。主节点配置nopreempt 参数表示非抢占模式,从节点不配置 nopreempt 参数。
主主模式
两台主机都处于工作模式,
必须有两个ip地址,分别绑定在两个节点上,ip地址在两台服务器上面,一台服务器为主vip,另外一台服务器为备vip
keepalived检测机制
配置完成之后,断网线和关掉keepalived服务,服务器宕机或者关机四种检测方法。
断网线和关掉keepalived服务和关机都可以实现keepalived的vip切换
但是关闭网卡或者关闭Networkmanger(停止网卡服务)和服务器宕机不会进行vip的切换。换而言之
就是 keepalived 应该不能监测网卡故障。
你可以写一个监控脚本,一定时间内,ping 不通自己的 IP,就把自己的 keepalived杀死,就可以进行vip的切换。