中小型网站集群项目规划
中小型网站集群架构图
节点IP地址及主机名规划
根据网站集群架构图可分为五个功能区域,项目采取两个C类地址段,10.0.0.0/24作为外网网段,172.16.1.0/24作为内网网段,五个功能区域IP地址段具体规划如下:
- 负载均衡代理区域
为负载均衡代理区域预留的外网地址范围为10.0.0.1-10.0.0.3,内网地址范围为172.16.1.1-172.16.1.9。本架构规划外网地址10.0.0.1和10.0.0.2作为两台反向代理服务器的外网网卡的实际地址,10.0.0.3作为对外虚拟地址VIP(网站域名需要解析到该VIP),内网地址172.16.1.1和172.16.1.2作为两台服务器的内网网卡的实际地址。 - Web服务应用区域
为Web服务应用区域预留的内网地址范围为172.16.1.10-172.16.1.29。本架构规划内网地址172.16.1.10和172.16.1.11作为两台Web服务器内网网卡的实际地址,由于采取反向代理的模式,Web服务器无需外网IP。 - 存储服务应用区域
为存储服务应用区域预留的内网地址范围为172.16.1.30-172.16.1.49。本架构规划内网地址172.16.1.30作为NFS存储服务器的内网IP地址,172.16.1.31作为Rsync备份服务器的内网IP地址。为了保证NFS服务的高可用性,在NFS存储服务器和Rsync备份服务器之间架设Keepalived高可用服务,将172.16.1.32作为虚拟地址VIP。 - 数据库及缓存服务应用区域
为数据库服务应用区域预留的内网地址范围为172.16.1.50-172.16.1.59。本架构有三台MySQL服务器,分别作为MySQL主数据库服务器、主数据库热备服务器、从数据库服务器,规划的地址分别为172.16.1.50、172.16.1.51、172.16.1.52。为保证MySQL主数据库服务的高可用性,在MySQL主数据库之间架设Keepalived服务,采用172.16.1.53作为主数据库虚拟VIP地址;如果有多台从数据库,可以为多台从数据库配置LVS负载均衡,使用额外的地址作为读数据库的VIP地址。 为Memcached缓存区域预留的内网地址范围为172.16.1.60-172.16.1.69。本架构有两台服务器作为数据库的前端分布式缓存服务器集群(分布式调度算法使用一致性哈希算法),在每个服务器上均配置两个实例分别作为缓存服务和session会话共享服务。 - 管理服务应用区域
内外IP地址在200以后的均作为监控管理服务器的地址。本架构有两台服务器作为管理服务器,规划172.16.1.200作为监控管理服务器的内网IP地址,无外网IP地址,配置Zabbix监控服务和Ansible批量管理服务;规划10.0.0.201作为跳板机服务器的外网IP地址,172.16.1.201作为跳板机服务器的内网IP地址。
IP地址及主机名规划表
VIP地址及对应域名解析规划表
架构hosts文件的规划
[root@localhost ~]
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
172.16.1.1 LB-nginx-01 lb01.hawava.com
172.16.1.2 LB-nginx-02 lb02.hawava.com
172.16.1.10 Web-LNMP-01 web01.hawava.com
172.16.1.11 Web-LNMP-02 web02.hawava.com
172.16.1.30 Store-NFS-01 nfs.hawava.com
172.16.1.31 Store-Rsync-01 rsync.hawava.com
172.16.1.32 nfsvip.hawava.com
172.16.1.50 MySQL-master-01 dbmaster01.hawava.com
172.16.1.51 MySQL-master-02 dbmaster02.hawava.com
172.16.1.52 dbmastervip.hawava.com
172.16.1.53 MySQL-slave-01 dbslave01.hawava.com
172.16.1.61 Cache-Mc-01 cache01.hawava.com
172.16.1.62 Cache-Mc-02 cache02.hawava.com
172.16.1.63 mcvip.hawava.com
172.16.1.200 MAGE-monitor-01 monitor.hawava.com
172.16.1.201 MAGE-jump-01 jump.hawava.com
10.0.0.3 www.hawava.com blog.hawava.com bbs.hawava.com
集群节点网络服务规划
集群节点关键目录结构规划
集群服务搭建部署顺序
集群架构的部署最好从后往前进行,即从集群的后端备份、存储、数据库开始部署。
排序 | 服务器 |
---|
01 | Rsync备份及存储服务 | 02 | NFS存储服务 | 03 | MySQL主数据库 | 04 | MySQL主热备数据库 | 05 | MySQL从数据库 | 06 | Nginx Web01服务器 | 07 | Nginx Web02服务器 | 08 | Nginx反向代理01服务器 | 09 | Nginx反向代理02服务器 |
优化CentOS 7模板主机
Linux系统安全最小原则
- 安装Linux系统最小化,选包最小化,yum安装软件包最小化,即无用的包不装;
- 开机自启动服务最小化,即无用的服务不开启;
- 登录Linux用户最小化,即能不用root用户就不用root用户登录;
- 普通用户授权权限最小化,即只给用户必须的管理系统的命令;
- Linux系统文件及目录权限最小化,禁止随意创建、更改、删除文件;
- 操作命令最小化,如能用rm -f test.txt,就不用rm -rf test.txt。
网络配置
-
添加网卡 添加一张LAN区段,内网网卡;添加一张NAT转换,用于与外网通信的外网网卡。 -
配置网卡 配置内网网卡 [root@localhost ~]
TYPE=Ethernet
BOOTPROTO=none
NAME=eno16777728
DEVICE=eno16777728
ONBOOT=yes
IPADDR=172.16.1.128
NETMASK=255.255.255.0
配置外网网卡 [root@localhost ~]
TYPE=Ethernet
BOOTPROTO=none
NAME=eno33554960
DEVICE=eno33554960
ONBOOT=yes
IPADDR=10.0.0.128
NETMASK=255.255.255.0
GATEWAY=10.0.0.2
DNS1=8.8.8.8
DNS2=114.114.114.114
-
重启网络服务并查看网卡信息 [root@localhost ~]
[root@localhost ~]
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eno16777728: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:e3:ea:86 brd ff:ff:ff:ff:ff:ff
inet 172.16.1.128/24 brd 172.16.1.255 scope global eno16777728
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fee3:ea86/64 scope link
valid_lft forever preferred_lft forever
3: eno33554960: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:e3:ea:90 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.128/24 brd 10.0.0.255 scope global eno33554960
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fee3:ea90/64 scope link
valid_lft forever preferred_lft forever
注意:CentOS 7 中的Network和NetworkManager冲突
- Network是一个系统服务,该服务是由initscripts软件包提供,initscripts包提供了操作系统运行起来后的一些脚本对系统做一些设备初始化,其中包括网络设备初始化。Network服务直接去/etc/sysconfig/network-scripts下面寻找网卡配置文件进行配置。
- NetworkManager是一个管理系统网络连接、并且将其状态通过D-BUS(一个通过简单的应用程序互相通讯的途径的自由软件项目)进行报告的后台服务,以及一个允许用户管理网络连接的客户端程序。如nmtui图形工具就是通过NetworkManager服务运行。
NetworkManager和Network两种网络管理工具,如果两种都配置会引起冲突,一般NetworkManager用于图形化,服务器保留Network服务即可,关闭NetworkManager,并且禁止开机启动。
[root@localhost ~]
[root@localhost ~]
Removed symlink /etc/systemd/system/multi-user.target.wants/NetworkManager.service.
Removed symlink /etc/systemd/system/dbus-org.freedesktop.NetworkManager.service.
Removed symlink /etc/systemd/system/dbus-org.freedesktop.nm-dispatcher.service.
[root@localhost ~]
disabled
时间配置
Linux系统的时间同步服务为ntp服务,NTP(Network Time Protocol,网络时间协议)是用来是计算机时间同步的一种协议,它可以使得计算机对其服务器或时钟源做同步化,ntp提供高精准度的时间矫正。对于服务器集群来说,由于集群需要保证每个服务器的时间是保持一致的,避免在执行同一个任务时出现有的服务器滞后的现象,因此NTP服务非常必要。
-
确定ntp是否安装 [root@localhost Desktop]
ntp-4.2.6p5-22.el7.centos.x86_64
fontpackages-filesystem-1.44-8.el7.noarch
python-ntplib-0.3.2-1.el7.noarch
ntpdate-4.2.6p5-22.el7.centos.x86_64
-
同步aliyun时间 [root@localhost ~]
24 Aug 16:20:13 ntpdate[13991]: adjust time server 120.25.115.20 offset 0.011936 sec
-
创建定时任务,每隔一分钟将本机时间与阿里云时间同步(当机器数量少时,可以利用定时任务进行互联网时间同步,若机器数量多,建议在网内部署时间同步服务器ntp server) [root@localhost ~]
/usr/sbin/ntpdate
[root@localhost ~]
[root@localhost ~]
*/1 * * * * /usr/sbin/ntpdate ntp1.aliyun.com>/dev/null 2>&1
语系配置
-
修改语系设置 [root@localhost Desktop]
-
查看语系设置 [root@localhost Desktop]
en_US.UTF-8
[root@localhost Desktop]
LANG="en_US.UTF-8"
[root@localhost Desktop]
System Locale: LANG=en_US.UTF-8
VC Keymap: us
X11 Layout: us
yum源配置
基础yum源优化:使用阿里云yum源进行优化 阿里云yum源
- 备份
[root@localhost ~]
- 下载新的CentOS-Base.repo到/etc/yum.repos.d/
[root@localhost ~]
扩展yum源优化:使用阿里云epel镜像进行优化 阿里云epel镜像
- 下载新的epel.repo到/etc/yum.repos.d/
[root@localhost ~]
运行yum makecache生成缓存
[root@localhost ~]
host文件配置
[root@localhost Desktop]
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
172.16.1.1 LB-nginx-01 lb01.hawava.com
172.16.1.2 LB-nginx-02 lb02.hawava.com
172.16.1.10 Web-LNMP-01 web01.hawava.com
172.16.1.11 Web-LNMP-02 web02.hawava.com
172.16.1.30 Store-NFS-01 nfs.hawava.com
172.16.1.31 Store-Rsync-01 rsync.hawava.com
172.16.1.32 nfsvip.hawava.com
172.16.1.50 MySQL-master-01 dbmaster01.hawava.com
172.16.1.51 MySQL-master-02 dbmaster02.hawava.com
172.16.1.52 dbmastervip.hawava.com
172.16.1.53 MySQL-slave-01 dbslave01.hawava.com
172.16.1.61 Cache-Mc-01 cache01.hawava.com
172.16.1.62 Cache-Mc-02 cache02.hawava.com
172.16.1.63 mcvip.hawava.com
172.16.1.200 MAGE-monitor-01 monitor.hawava.com
172.16.1.201 MAGE-jump-01 jump.hawava.com
10.0.0.3 www.hawava.com blog.hawava.com bbs.hawava.com
SSH登录配置
Linux 远程连接默认端口是22,为了系统安全,建议更改默认配置
[root@localhost Desktop]
[root@localhost Desktop]
Port 10086
ListenAddress 0.0.0.0
PermitRootLogin no
PermitEmptyPasswords no
UseDNS no
GSSAPIAuthentication no
[root@localhost Desktop]
关闭SELinux
SELinux(Security-Enhanced Linux)是美国国家安全局用于对强制访问控制的实现,建议关闭。
修改配置文件,关闭SELinux永久生效
[root@localhost Desktop]
[root@localhost Desktop]
SELINUX=disabled
命令行操作,临时关闭SELinux
[root@localhost Desktop]
usage: setenforce [ Enforcing | Permissive | 1 | 0 ]
[root@localhost Desktop]
getenforce查看SELinux状态
[root@localhost Desktop]
Permissive
关闭Firewalld
[root@localhost Desktop]
[root@localhost Desktop]
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
Removed symlink /etc/systemd/system/basic.target.wants/firewalld.service.
提权letty用户
为了安全及管理的方便,可以将需要root权限的普通用户加入sudo管理,这样就可以使用普通用户登录、利用root权限管理系统,就不需要root账号及密码了。为了管理方便,这里暂时授予letty用户ALL权限,即可以管理整个系统。
[root@localhost Desktop]
letty ALL= NOPASSWD: ALL
用户名 被管理主机的地址=(可用的身份) 授权命令(绝对路径)
- 用户名/组名:代表root给哪个用户或者用户组赋予命令;
- 被管理主机的地址:用户可以用指定的命令管理指定IP地址的服务器(ALL代表可以管理任何主机,如果写固定IP,表示用户可以管理指定的服务器);
- 可用的身份:将来源用户切换成什么身份使用,ALL代表可以切换成任意身份(该字段可以省略);
- 授权命令:代表root将什么命令授权给普通用户(默认是ALL,代表任何命令,这是万万不行的)。
NOPASSWD:如果不加参数NOPASSWD,普通用户每执行一次sudo都要输入一次密码,NOPASSWD参数可以使得用户执行sudo命令时不再需要密码验证。
切换到letty普通用户后,可以通过sudo -l命令查看当前用户备授予的sudo权限集合
[root@localhost Desktop]
Last login: Tue Aug 24 15:33:10 CST 2021 on pts/0
[letty@localhost ~]$ sudo -l
Matching Defaults entries for letty on this host:
requiretty, !visiblepw, always_set_home, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE
INPUTRC KDEDIR LS_COLORS", env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE",
env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARY LC_NAME
LC_NUMERIC LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET
XAUTHORITY", secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin
User letty may run the following commands on this host:
(root) NOPASSWD: ALL
锁定关键系统文件
使用chattr命令对关键系统文件(如账号密码文件)上锁,在上锁后所有用户都不能对文件删除修改(包括root用户),防止文件被提权篡改。
[root@localhost Desktop]
[root@localhost Desktop]
----i----------- /etc/passwd
----i----------- /etc/shadow
----i----------- /etc/group
----i----------- /etc/gshadow
上锁后如果需要进行临时操作,可以解锁后对文件进行修改之后再上锁。
[root@localhost Desktop]
Rsync备份服务器部署
部署规划
服务器说明 | 外网IP | 内网IP | 主机名称 | 域名 |
---|
Rsync备份服务器 | 无 | 172.16.1.31/24 | Store-Rsync-01 | rsync.hawava.com |
Rsync备份服务器部署应用:
- 安装Rsync服务软件,提供网络数据远程备份功能,设定备份目录为/backup;
- 安装Keepalived服务软件,为NFS服务宕机提供热备切换功能;
- 开发检查所有服务器数据备份完整性脚本,并将结果通过定时任务每天发邮件给管理员。
环境准备
-
Rsync备份服务器操作系统及内核版本信息 [root@localhost Desktop]
CentOS Linux release 7.2.1511 (Core)
[root@localhost Desktop]
3.10.0-327.el7.x86_64
[root@localhost Desktop]
x86_64
-
Rsync备份服务器网络配置 [root@localhost Desktop]
[root@localhost Desktop]
[root@localhost Desktop]
2: eno16777728: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:4a:49:fb brd ff:ff:ff:ff:ff:ff
inet 172.16.1.31/24 brd 172.16.1.255 scope global eno16777728
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe4a:49fb/64 scope link
valid_lft forever preferred_lft forever
-
Rsync备份服务器主机名配置 [root@localhost Desktop]
Rsync概述
Rsync简介
Rsync是一款开源、快速、多功能、可实现全量以及增量备份的本地或远程数据同步备份工具。Rsync可以本地复制、远程复制或者守护进程方式复制,它可以在不改变原有数据的属性信息的情况下实现数据的备份迁移,提供了大量参数来控制其行为的各个方面;rsync使用rsync算法来进行数据同步,该算法只传送两个文件的不同部分,不是每次都整份传送,因此速度提升。
Rsync语法
本地备份
Local: rsync [OPTION...] SRC... [DEST]
SRC:要备份的数据信息
[DEST]:备份到指定的路径信息
远程备份
Access via remote shell:
将远程服务器的数据拉到本地服务器(pull):
Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST]
[USER@]:以什么用户身份拉取数据(默认当前用户)
HOST:远程主机IP或主机名称
: :使用功能远程shell进行备份同步时,HOST与SRC之间使用一个冒号作为分隔符
SRC:拉取的数据信息
DEST:保存到本地的路径信息
将本地服务器的数据备份到远程服务器(push):
Push: rsync [OPTION...] SRC... [USER@]HOST:DEST
SRC:本地要备份到远程服务器的数据
[USER@]:以什么用户身份推送数据(默认当前用户)
HOST:远程主机IP或主机名称
: :使用功能远程shell进行备份同步时,HOST与DEST之间使用一个冒号作为分隔符
DEST:保存到远程主机的路径信息
守护进程备份(配置管理、安全策略、自动传输)
Access via remote shell:
将远程服务器的数据拉到本地服务器(pull):
Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST]
[USER@]:以什么用户身份拉取数据(默认当前用户)
HOST:远程主机IP或主机名称
: :使用功能远程shell进行备份同步时,HOST与SRC之间使用一个冒号作为分隔符
SRC:拉取的数据信息
DEST:保存到本地的路径信息
将本地服务器的数据备份到远程服务器(push):
Push: rsync [OPTION...] SRC... [USER@]HOST:DEST
SRC:本地要备份到远程服务器的数据
[USER@]:以什么用户身份推送数据(默认当前用户)
HOST:远程主机IP或主机名称
: :使用功能远程shell进行备份同步时,HOST与DEST之间使用一个冒号作为分隔符
DEST:保存到远程主机的路径信息
Rsync常用参数
参数 | 说明 |
---|
-a,- -archive | 表示以递归方式传输文件,并保留文件属性不变(rtopgDI参数整合) | -v ,- -verbose | 详细输出,显示传输时的进度等信息 | -z,- -compress | 传输时进行压缩以提高传输效率 | -r,- -recursive | 递归模式,目录下所有目录都可以传输 | -t,- -times | 保持文件修改时间不变 | -o,- -owner | 保持文件所有者信息不变 | -p,- -perms | 保持文件权限信息不变 | -g,- -group | 保持文件所属组信息不变 | -D,- -devices | 保持设备信息不变 | -I,- -links | 保持链接文件属性信息不变(数据不保证) | - -exclude=pattern | 排除指定的不需要传输的文件 | - -exclude-from=file | 排除指定的不需要传输的文件信息(批量排除) | - -delete | 无差异同步参数,保持两台服务器数据高度一致(谨慎使用,容易误删) |
Rsync传输原理
- 客户端执行命令后,发送请求给服务端;
- 服务端判断客户端请求的用户名是否在配置文件/etc/rsyncd.conf中(auth users),如果不在,会产生错误:@ERROR: auth failed on module backup;
- 若用户名正确,服务端会去查看rsync的认证密码文件/etc/rsync.password,如果密码错误,会产生错误:@ERROR: auth failed on module backup;
- 若用户名和密码均正确,该请求顺利通过安全检查,客户端身份变为rsync服务指定的虚拟用户身份rsync;
- 以rsync用户存储数据时,确保[backup]模块的备份目录/backup/存在,倘若没有该目录,发生报错:@ERROR: chdir failed;
- 如果备份目录存在,但是目录权限不允许rsync用户进行读写,发生报错:Permission denied。
- 如果以上均没有问题,成功备份数据。
Rsync部署
安装Rsync软件
rpm -qa | grep rsync查看本机是否安装rsync服务,如果没有则使用yum -y install rsync进行安装
[root@store-rsync-01 ~]
rsync-3.0.9-17.el7.x86_64
编辑配置文件
编辑rsync服务的配置文件/etc/rsyncd.conf
[root@store-rsync-01 ~]
uid = rsync --管理备份目录的用户
gid = rsync --管理备份目录的用户组
port = 873 --指定rsync备份服务的端口号
use chroot = no --安全相关配置
fake super = yes --将rsync虚拟用户伪装成一个超级管理员用户
max connections = 200 --最大连接数
timeout = 300 --超时时间
pid file = /var/run/rsyncd.pid --记录进程号码信息
lock file = /var/run/rsyncd.lock --锁文件(通过锁文件控制最大连接数)
log file = /var/log/rsyncd.log --日志文件
ignore errors --忽略传输中的简单错误
read only = false --指定备份目录为可读可写
list = false --客户端是否可以查看服务端的模块信息
hosts allow = 172.16.1.0/24 --允许传输备份数据的主机(白名单)
auth users = rsync_backup --指定认证用户
secrets file = /etc/rsync.passwd --指定认证用户的密码文件(需自己创建,格式为 认证用户名称:密码信息)
[backup] --模块信息
path = /backup --指定备份目录
comment = "Backup Directory" --模块说明
搭建服务环境
-
创建rsync虚拟用户 [root@store-rsync-01 ~]
[root@store-rsync-01 ~]
uid=1002(rsync) gid=1002(rsync) groups=1002(rsync)
-
创建认证用户rsync_backup的认证密码文件并修改其权限 格式:认证用户名称:密码信息 [root@store-rsync-01 ~]
[root@store-rsync-01 ~]
rsync_backup:redhat
[root@store-rsync-01 ~]
-rw-r--r-- 1 root root 20 Aug 25 22:59 /etc/rsync.passwd
[root@store-rsync-01 ~]
[root@store-rsync-01 ~]
-rw------- 1 root root 20 Aug 25 22:59 /etc/rsync.passwd
-
创建备份目录并修改其属性 [root@store-rsync-01 ~]
[root@store-rsync-01 ~]
drwxr-xr-x 2 rsync rsync 6 Aug 25 21:25 /backup/
启动服务程序
[root@store-rsync-01 ~]
[root@store-rsync-01 ~]
Created symlink from /etc/systemd/system/multi-user.target.wants/rsyncd.service to /usr/lib/systemd/system/rsyncd.service.
[root@store-rsync-01 ~]
enabled
[root@store-rsync-01 ~]
tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 4775/rsync
tcp6 0 0 :::873 :::* LISTEN 4775/rsync
脚本实现部署
编辑脚本部署Rsync服务:/server/scripts/rsync.sh
[root@store-rsync-01 ~]
function rsyncd_install(){
rpm -qa | grep rsync > /dev/null
if [ $? -eq 0 ]
then
echo "Rsync has been installed."
else
yum install -y rsync > /dev/null
fi
}
function rsyncd_conf(){
cat>/etc/rsyncd.conf<<EOF
uid = rsync
gid = rsync
port = 873
use chroot = no
fake super = yes
max connections = 200
timeout = 300
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsyncd.lock
log file = /var/log/rsyncd.log
ignore errors
read only = false
list = false
hosts allow = 172.16.1.0/24
auth users = rsync_backup
secrets file = /etc/rsync.passwd
[backup]
path = /backup
comment = "Backup Directory"
EOF
}
function rsyncd_preparation(){
grep "rsync" /etc/passwd > /dev/null
if [ $? -eq 0 ]
then
echo "User rsync has been existed."
else
useradd -M -s /sbin/nologin rsync
fi
[ ! -d /backup ] && mkdir -p /backup && chown -R rsync.rsync /backup
[ ! -f /etc/rsync.passwd ] && echo "rsync_backup:redhat" > /etc/rsync.passwd && chmod 600 /etc/rsync.passwd
}
function start_rsyncd(){
if [ ! -f /var/run/rsyncd.pid ]
then
systemctl start rsyncd > /dev/null
systemctl enable rsyncd > /dev/null
fi
}
function main(){
rsyncd_install
rsyncd_conf
rsyncd_preparation
start_rsyncd
}
main
实现NFS高可用
Rsync备份服务器要成为NFS存储服务器的热备,实现NFS服务高可用,需与NFS存储服务器作相同操作。
部署NFS服务
[root@store-rsync-01 ~]
[root@store-rsync-01 ~]
[root@store-rsync-01 ~]
[root@store-rsync-01 ~]
uid=1001(www) gid=1001(www) groups=1001(www)
[root@store-rsync-01 ~]
[root@store-rsync-01 ~]
[root@store-rsync-01 ~]
[root@store-rsync-01 ~]
drwx------ 2 www www 6 Aug 27 21:16 /data
[root@store-rsync-01 ~]
[root@store-rsync-01 ~]
[root@store-rsync-01 ~]
[root@store-rsync-01 ~]
部署Keepalived服务
- 部署规划
- 安装keepalived软件
[root@store-rsync-01 ~]
- 编写keepalived配置文件
[root@store-rsync-01 ~]
[root@store-rsync-01 ~]
! Configuration File for keepalived
global_defs {
router_id NFS-Slave --高可用集群主机身份标识
}
vrrp_instance NFS-Keepalived {
state BACKUP --标识身份(state不生效,依据priority区别主从)
interface eno16777728 --VIP绑定的网卡
virtual_router_id 51 --组ID,同组的ID相同
priority 100 --优先级,优先级高的为master
advert_int 1 --组播包发送的间隔时间(s)
authentication { --认证模式为密码认证
auth_type PASS
auth_pass hawava
}
virtual_ipaddress { --VIP
172.16.1.32/24
}
}
- 启动keepalived服务
[root@store-rsync-01 ~]
[root@store-rsync-01 ~]
NFS存储服务器部署
部署规划
服务器说明 | 外网IP | 内网IP | 主机名称 | 域名 |
---|
NFS存储服务器 | 无 | 172.16.1.30/24 | Store-NFS-01 | nfs.hawava.com |
NFS存储服务器部署应用:
- 安装NFS服务软件,提供网络文件共享功能,设定共享目录为/data,用于存放所有集群Web服务器上传的图片、附件等;
- 安装inotify服务软件,实时同步NFS服务资源到Rsync备份服务器;
- 安装Keepalived服务软件,为NFS服务提供热备切换功能;
- 开发通用脚本,并通过定时任务把NFS本地配置数据备份到Rsync备份服务器。
环境准备
-
NFS存储服务器操作系统及内核版本信息 [root@store-nfs-01 ~]
CentOS Linux release 7.2.1511 (Core)
[root@store-nfs-01 ~]
3.10.0-327.el7.x86_64
[root@store-nfs-01 ~]
x86_64
-
NFS存储服务器网络配置 [root@localhost ~]
[root@localhost ~]
[root@localhost ~]
2: eno16777728: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:f2:c4:af brd ff:ff:ff:ff:ff:ff
inet 172.16.1.30/24 brd 172.16.1.255 scope global eno16777728
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fef2:c4af/64 scope link
valid_lft forever preferred_lft forever
-
NFS存储服务器主机名配置 [root@localhost ~]
NFS概述
NFS简介
NFS(Network File System,网络文件系统),主要功能为通过网络(一般局域网)让不同的主机系统之间可以共享文件或目录。NFS是基于RPC(远程过程调用)协议,采用客户端/服务器结构实现的分布式文件系统,NFS服务器允许NFS客户端将远端NFS服务器端的共享目录挂载到本地,在NFS客户端本地看来,NFS服务器共享的目录就好像自己的磁盘分区和目录一样。
在企业集群架构环境中,NFS网络文件系统一般用来存储共享视频、图片、附件等静态资源文件,通常网站用户上传的文件都会被放在NFS共享目录中(注:网站的程序代码不要放在NFS共享目录中,网站程序代码直接批量发布到Web节点提供访问比共享到NFS里效率更高)。
NFS原理
在NFS服务器设置好一个共享目录/data后,其他有权限访问NFS服务器端的客户端都可以将该共享目录挂载到客户端本地的某个挂载点上,NFS共享目录权限相关因素:
- 共享目录本身权限(755 nfsnobody nfsnobody)
- 配置文件权限参数(rw/ro *squash anonuid/anongid)
- 客户端挂载命令参数 (rw/ro)
客户端正确挂载后,就可以通过NFS客户端挂载点所在目录查看到NFS服务端/data共享目录下的所有数据,在客户端上查看时,NFS服务端的/data目录就相当于客户端本地的磁盘分区或目录。
已知NFS系统通过网络进行数据传输,因此NFS会使用一些端口来传输数据,NFS在传输数据时使用的端口会随机选择,那么NFS客户端如何得知NFS服务端使用哪个端口呢?
答案是通过RPC(Remote Procedure Call,远程过程调用)协议/服务来实现。因为NFS服务支持的功能很多,每启动一个功能就会启用一些端口来传输数据,因此NFS功能所对应的端口无法固定,而是随机采用未被使用的端口用作传输,这就造成了客户端和服务器端对接的困扰,于是RPC中介来帮忙。
RPC服务最主要的作用就是指定每个NFS功能对应的端口,并将该信息传递给客户端,让客户端能够连接到服务器端正确的端口。因此为了让RPC了解NFS的端口信息,RPC服务需要在NFS服务之前启动,而后再启动NFS服务器时会随机取用数个端口,并主动向RPC服务注册(RPC服务固定使用111端口监听客户端的需求并回应给客户端正确的端口)。
NFS工作流程
当访问程序通过NFS客户端向NFS服务端存取文件时,请求数据流程如下:
- 用户访问网站程序,由网站程序在NFS客户端上发出存取NFS文件请求,这时NFS客户端的RPC服务(rpcbind服务)就会通过网络向NFS服务器端的RPC服务(rpcbind服务)的111端口发送NFS文件存取请求;
- NFS服务端的RPC服务接收到请求后找到对应的已注册好的NFS端口,并发送给NFS客户端的RPC服务;
- NFS客户端获得正确的端口后,与NFS服务端联机存取数据;
- NFS客户端存取数据成功后,返回到前端访问程序,通知用户存取结果,至此完成一次存取操作。
NFS部署
安装NFS&RPC软件
部署NFS服务需要安装以下两个软件包:
- nfs-utils:NFS服务主程序
- rpcbind:RPC服务主程序
rpm -qa | grep -E "nfs-utils|rpcbind"检查这两个软件是否安装,如果没有则使用yum -y install nfs-utils rpcbind进行安装。
[root@store-nfs-01 ~]
rpcbind-0.2.0-32.el7.x86_64
nfs-utils-1.3.0-0.21.el7.x86_64
编辑配置文件
NFS服务的主配置文件/etc/exports(该文件不一定存在,可能需要vim手动建立),格式如下:
NFS共享目录 NFS客户端地址(参数1,参数2,…)
[root@store-nfs-01 ~]
/data 172.16.1.0/24(rw,sync)
搭建服务环境
- 创建www用户
[root@store-nfs-01 ~]
[root@store-nfs-01 ~]
uid=1001(www) gid=1001(www) groups=1001(www)
- 创建共享目录并修改其属性
[root@store-nfs-01 ~]
[root@store-nfs-01 ~]
drwxr-xr-x 2 root root 6 Aug 26 21:29 /data
[root@store-nfs-01 ~]
[root@store-nfs-01 ~]
[root@store-nfs-01 ~]
drwx------ 2 www www 6 Aug 26 21:29 /data
问:为何将共享目录/data的所属主组设置为www,而不设置为匿名用户nfsnobody?
这是因为NFS服务器共享目录用来存储网站的静态资源,而Web服务器网站的映射用户为www用户,为了数据的安全,需要做相应的权限控制,设置仅指定非root普通用户可对共享目录进行访问。 root_squash和no_all_squash参数是nfs的默认配置,即默认将root用户的访问映射为匿名用户nfsnobody,以及所有普通用户的访问均不作映射。在将共享目录/data的所属主组设置为www后,root用户映射过来是匿名用户nfsnobody无权限对共享目录进行操作,而除了www的其他普通用户也无权限对共享目录进行操作,由此实现仅www用户可对共享目录进行存取操作(注意:www用户的uid和gid与Web服务器www用户保持一致)。
启动服务程序
-
首先启动RPC服务并设置开机自启 [root@store-nfs-01 ~]
[root@store-nfs-01 ~]
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 11707/rpcbind
tcp6 0 0 :::111 :::* LISTEN 11707/rpcbind
udp 0 0 0.0.0.0:111 0.0.0.0:* 11707/rpcbind
udp6 0 0 :::111 :::* 11707/rpcbind
[root@store-nfs-01 ~]
[root@store-nfs-01 ~]
indirect
[root@store-nfs-01 ~]
Created symlink from /etc/systemd/system/multi-user.target.wants/rpcbind.service to /usr/lib/systemd/system/rpcbind.service.
[root@store-nfs-01 ~]
enabled
-
而后启动NFS服务并设置开机自启 [root@store-nfs-01 ~]
[root@store-nfs-01 ~]
Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.
实时同步
实时同步原理
- NFS服务器部署好rsync守护进程服务,实现数据传输;
- NFS服务器部署好inotify监控服务,实现监控目录数据变化;
- NFS服务器部署好sersync同步服务,将rsync服务和inotify服务建立联系,对变化的数据进行实时备份传输。
实时同步部署
Rsync服务客户端部署
-
rpm -qa | grep rsync确认rsync是否安装,如果没有安装则yum -y install rsync [root@store-nfs-01 ~]
rsync-3.0.9-17.el7.x86_64
-
创建认证用户的密码文件(只包含认证用户的密码信息,注意与rsync服务端的密码文件进行区分) [root@store-nfs-01 ~]
[root@store-nfs-01 ~]
[root@store-nfs-01 ~]
-rw------- 1 root root 7 Aug 26 23:48 /etc/rsync.passwd
-
使用- -password-file=/etc/rsync.passwd实现免交互传输测试
[root@store-nfs-01 ~]
sending incremental file list
test.tmp
sent 75 bytes received 27 bytes 204.00 bytes/sec
total size is 6 speedup is 0.06
[root@store-rsync-01 ~]
test.tmp
Inotify监控服务的部署
-
安装inotify软件 [root@store-nfs-01 ~]
-
了解inotify命令
- /usr/bin/inotifywait:监控目录数据信息变化
- /usr/bin/inotifywatch:对监控的变化信息进行统计
inotifywait命令使用
inotifywait [参数] 被监控目录
数 | 说明 |
---|
-m,- -monitor | 一直监控目录的变化 | -r,- -recursive | 递归监控 | -q,- -quiet | 尽量减少信息的输出 | -e,- -event | 指定监控的事件信息 | - -format<fmt> | 指定输出信息的格式 | - -timefmt | 指定输出信息的时间格式 |
inotifywait命令格式
inotifywait -mrq --timefmt “%F” --format “%T %w %f Event: %e” -e CREATE,DELETE,MOVED_TO,CLOSE_WRITE /data
[root@store-nfs-01 ~]
2021-08-27 /data/ hello.txt Event: CREATE
2021-08-27 /data/ hello.txt Event: CLOSE_WRITE,CLOSE
2021-08-27 /data/ hello.txt Event: CLOSE_WRITE,CLOSE
2021-08-27 /data/ hello.txt Event: DELETE
Sersync同步服务部署
-
安装sersync服务,软件下载地址:https://github.com/wsgzao/sersync [root@store-nfs-01 ~]
[root@store-nfs-01 tools]
[root@store-nfs-01 tools]
[root@store-nfs-01 tools]
total 712
drwxr-xr-x 2 root root 39 Oct 26 2011 GNU-Linux-x86
-rw-r--r-- 1 root root 727290 Aug 27 00:30 sersync2.5.4_64bit_binary_stable_final.tar.gz
[root@store-nfs-01 tools]
GNU-Linux-x86/
├── confxml.xml --sersync配置文件
└── sersync2 --sersync命令文件
0 directories, 2 files
[root@store-nfs-01 tools]
[root@store-nfs-01 tools]
[root@store-nfs-01 tools]
[root@store-nfs-01 sersync]
total 1772
-rwxr-xr-x 1 root root 2214 Oct 26 2011 confxml.xml
-rwxr-xr-x 1 root root 1810128 Oct 26 2011 sersync2
-
编写配置文件 [root@store-nfs-01 sersync]
[root@store-nfs-01 sersync]
6 <filter start="false">
7 <exclude expression="(.*)\.svn"></exclude>
8 <exclude expression="(.*)\.gz"></exclude>
9 <exclude expression="^info/*"></exclude>
10 <exclude expression="^static/*"></exclude>
11 </filter>
12 <inotify>
13 <delete start="true"/>
14 <createFolder start="true"/>
15 <createFile start="false"/>
16 <closeWrite start="true"/>
17 <moveFrom start="true"/>
18 <moveTo start="true"/>
19 <attrib start="false"/>
20 <modify start="false"/>
21 </inotify>
24 <localpath watch="/data"> --指定监控的目录
25 <remote ip="172.16.1.31" name="backup"/> --指定备份服务器IP和备份模块信息
26 <!--<remote ip="192.168.8.39" name="tongbu"/>-->
27 <!--<remote ip="192.168.8.40" name="tongbu"/>-->
28 </localpath>
29 <rsync>
30 <commonParams params="-az"/> --指定rsync命令参数
31 <auth start="true" users="rsync_backup" passwordfile="/etc/rsync.passwd"/> --指定rsync认证用户和认证密码文件
32 <userDefinedPort start="true" port="873"/><!-- port=874 --> --指定rsync端口信息
33 <timeout start="true" time="200"/><!-- timeout=100 -->
34 <ssh start="false"/>
35 </rsync>
-
启动sersync服务并设置开机自启
[root@store-nfs-01 sersync]
export PATH="$PATH:/usr/local/sersync"
[root@store-nfs-01 sersync]
[root@store-nfs-01 sersync]
set the system param
execute:echo 50000000 > /proc/sys/fs/inotify/max_user_watches
execute:echo 327679 > /proc/sys/fs/inotify/max_queued_events
parse the command param
_______________________________________________________
参数-d:启用守护进程模式
参数-r:在监控前,将监控目录与远程主机用rsync命令推送一遍
c参数-n: 指定开启守护线程的数量,默认为10个
参数-o:指定配置文件,默认使用confxml.xml文件
参数-m:单独启用其他模块,使用 -m refreshCDN 开启刷新CDN模块
参数-m:单独启用其他模块,使用 -m socket 开启socket模块
参数-m:单独启用其他模块,使用 -m http 开启http模块
不加-m参数,则默认执行同步程序
________________________________________________________________
[root@store-nfs-01 sersync]
...
execute command: cd /data && rsync -az -R --delete ./ --port=873 --timeout=200 rsync_backup@172.16.1.31::backup --password-file=/etc/rsync.passwd >/dev/null 2>&1
run the sersync:
watch path is: /data
[root@store-nfs-01 sersync]
-
sersync实时同步测试 NFS存储服务器端 [root@store-nfs-01 ~]
[root@store-nfs-01 data]
[root@store-nfs-01 data]
Rsync备份服务器端 [root@store-rsync-01 ~]
[root@store-rsync-01 backup]
hello.txt
成功撒花~ -
停止sersync的两种方法 killall 服务名 [root@store-nfs-01 data]
kill 进程号 [root@store-nfs-01 data]
root 27546 1 0 01:02 ? 00:00:00 sersync -dro /usr/local/sersync/confxml.xml
root 27724 27346 0 01:12 pts/1 00:00:00 grep --color=auto sersync
[root@store-nfs-01 data]
NFS高可用
-
Keepalived部署规划 -
安装keepalived软件 [root@store-nfs-01 ~]
-
编写keepalived配置文件 [root@store-nfs-01 ~]
[root@store-nfs-01 ~]
! Configuration File for keepalived
global_defs {
router_id NFS-Master --高可用集群主机身份标识
}
vrrp_instance NFS-Keepalived {
state MASTER --标识身份(state不生效,依据priority区别主从)
interface eno16777728 --VIP绑定的网卡
virtual_router_id 51 --组ID,同组的ID相同
priority 200 --优先级,优先级高的为master
advert_int 1 --组播包发送的间隔时间(s)
authentication { --认证模式为密码认证
auth_type PASS
auth_pass hawava
}
virtual_ipaddress { --VIP
172.16.1.32/24
}
}
-
启动keepalived服务 [root@store-nfs-01 ~]
[root@store-nfs-01 ~]
-
测试keepalived功能 查看NFS存储服务器和Rsync服务器VIP是否存在,可见身为Master主机的NFS存储服务器掌握VIP [root@store-nfs-01 ~]
inet 172.16.1.32/24 scope global secondary eno16777728
[root@store-rsync-01 ~]
关闭NFS存储服务器的Keepalived服务,模拟测试NFS服务器出现故障 [root@store-nfs-01 ~]
再次查看NFS服务器和Rsync服务器上的VIP,可见身为热备的Rsync服务器已经自动接管了VIP [root@store-nfs-01 ~]
[root@store-rsync-01 ~]
inet 172.16.1.32/24 scope global secondary eno16777728
成功撒花~
MySQL数据库服务器部署
LNMP Web服务器部署
Nginx反向代理服务器部署
Memcached缓存服务器部署
Firewalld防火墙部署
Zabbix监控服务器部署
Ansible一键化部署
全网备份规划
Rsync备份服务器
开发检查所有服务器数据备份完整性脚本,并每天发邮件给管理员。
NFS存储服务器
开发通用脚本,并通过定时任务把NFS本地配置数据备份到Rsync备份服务器。
MySQL主数据库服务器
开发通用脚本,并通过定时任务把基础配置数据备份到Rsync备份服务器。
MySQL主热备数据库服务器
开发通用脚本,并通过定时任务把基础配置数据备份到Rsync备份服务器。
MySQL从数据库服务器
开发通用脚本,并通过定时任务把数据库全量不备份及增量数据定时备份到Rsync备份数据库; 开发通用脚本,并通过定时任务把基础配置数据备份到Rsync备份服务器。
LNMP Web服务器
开发通用脚本,通过定时任务把访问日志、网站程序备份到Rsync备份服务器; 开发通用脚本,通过定时任务把基础配置数据备份到Rsync备份服务器。
Nginx 反向代理服务器
配置通用备份脚本,通过定时任务将基础重要数据备份到Rsync备份服务器。
|