Erlo

Keepalived+HAProxy基于ACL实现单IP多域名负载功能

2023-03-10 16:30:02 发布   162 浏览  
页面报错/反馈
收藏 点赞

  • 编译安装 HAProxy 新版 LTS 版本,编译安装 Keepalived
  • 开启HAProxy多线程,线程数与CPU核心数保持一致,并绑定CPU核心
  • 因业务较多避免配置文件误操作,需要按每业务一个配置文件并统一保存至/etc/haproxy/conf.d目录中
  • 基于ACL实现单IP多域名负载功能,两个域名的业务: www.yanlinux.org 和 www.yanlinux.edu
  • 实现MySQL主从复制
  • 对 www.yanlinux.edu 域名基于HAProxy+Nginx+Tomcat+MySQL,并实现Jpress的JAVA应用
  • 对 www.yanlinux.org 域名基于HAProxy+Nginx+PHP+MySQL+Redis,实现phpMyadmin的PHP应用,并实现Session会话保持统一保存到Redis

1 DNS服务器配置

在10.0.0.7主机上搭建www.yanlinux.org(VIP:10.0.0.100)和www.yanlinux.edu(VIP:10.0.0.200)的DNS解析。

配置的关键:

  • 在主配置文件/etc/named.conf中要将listen-on port 53 { 127.0.0.1; }中的127.0.0.1改为localhost;还需要将allow-query { localhost; };前面加上//注释掉,或者将其中的localhost改为any,或者在后面加上各个网段信息。
  • 各个域名解析库文件的权限应改为641,属组为named
#利用脚本自动搭建www.yanlinux.org的dns解析配置
[root@dns ~]$ cat install_dns.sh 
#!/bin/bash

DOMAIN=yanlinux.org
HOST=www
HOST_IP=10.0.0.100

CPUS=`lscpu |awk '/^CPU(s)/{print $2}'`
. /etc/os-release

color () {
    RES_COL=60
    MOVE_TO_COL="echo -en \033[${RES_COL}G"
    SETCOLOR_SUCCESS="echo -en \033[1;32m"
    SETCOLOR_FAILURE="echo -en \033[1;31m"
    SETCOLOR_WARNING="echo -en \033[1;33m"
    SETCOLOR_NORMAL="echo -en E[0m"
    echo -n "$1" && $MOVE_TO_COL
    echo -n "["
    if [ $2 = "success" -o $2 = "0" ] ;then
        ${SETCOLOR_SUCCESS}
        echo -n $"  OK  "    
    elif [ $2 = "failure" -o $2 = "1"  ] ;then 
        ${SETCOLOR_FAILURE}
        echo -n $"FAILED"
    else
        ${SETCOLOR_WARNING}
        echo -n $"WARNING"
    fi
    ${SETCOLOR_NORMAL}
    echo -n "]"
    echo 
}


install_dns () {
    if [ $ID = 'centos' -o $ID = 'rocky' ];then
	    yum install -y  bind bind-utils
	elif [ $ID = 'ubuntu' ];then
        color "不支持Ubuntu操作系统,退出!" 1
        exit
	    #apt update
	    #apt install -y  bind9 bind9-utils
	else
	    color "不支持此操作系统,退出!" 1
	    exit
	fi
    
}

config_dns () {
    sed -i -e '/listen-on/s/127.0.0.1/localhost/' -e '/allow-query/s/localhost/any/' /etc/named.conf
    cat >> 	/etc/named.rfc1912.zones  /var/named/$DOMAIN.zone > DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7 > www.yanlinux.org
;; global options: +cmd
;; Got answer:
;; ->>HEADER> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7 > www.yanlinux.edu
;; global options: +cmd
;; Got answer:
;; ->>HEADER

2 客户端配置

在10.0.0.17主机上,设置DNS服务器的IP作为其DNS,做这一步之前一定要在搭建DNS服务器时,做好上面提到的第一个关键点,不然客户端不能正确解析到域名

[root@internet ~]$ cat /etc/sysconfig/network-scripts/ifcfg-eth0 
BOOTPROTO="static"
NAME="eth0"
DEVICE="eth0"
IPADDR=10.0.0.17
PREFIX=24
GATEWAY=10.0.0.2
DNS1=10.0.0.7  #改成DNS服务器的IP
#DNS2=114.114.114.114
ONBOOT="yes"

#重启网络服务
[root@internet ~]$ systemctl restart network
[root@internet network-scripts]$ cat /etc/resolv.conf 
# Generated by NetworkManager
nameserver 10.0.0.7

#测试解析
[root@internet ~]$ host www.baidu.com
www.baidu.com is an alias for www.a.shifen.com.
www.a.shifen.com has address 36.152.44.95
www.a.shifen.com has address 36.152.44.96

[root@internet ~]$ dig www.yanlinux.org

; > DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7 > www.yanlinux.org
;; global options: +cmd
;; Got answer:
;; ->>HEADER> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7 > www.yanlinux.edu
;; global options: +cmd
;; Got answer:
;; ->>HEADER

3 部署NFS主备服务

  1. 搭建主NFS服务器
[root@NFS ~]$ yum -y install nfs-utils
[root@NFS ~]$ systemctl enable --now nfs-server.service

#创建用于传输的用户
[root@NFS ~]$ groupadd -g 666 www 
[root@NFS ~]$ useradd -u 666 www -g 666

#创建NFS共享文件夹
[root@NFS ~]$ mkdir /data/www -p
[root@NFS ~]$ chown -R www. /data/www/

[root@NFS ~]$ mkdir /data/web2
[root@NFS ~]$ chown -R www.www /data/web2/

#添加共享配置
[root@NFS ~]$ vi /etc/exports
/data/www *(rw,all_squash,anonuid=666,anongid=666) #具有读写权限,所有远程用户映射为666对应的用户
/data/web2 *(rw,all_squash,anonuid=666,anongid=666)

#重启
[root@NFS ~]$ systemctl restart nfs-server.service
[root@NFS ~]$ showmount -e 10.0.0.68
Export list for 10.0.0.68:
/data/web2 *
/data/www  *


#下载sersync,实现数据实时备份同步到NFS备份服务器
#下载sersync,解压,设置PATH变量
[root@NFS ~]$ wget https://storage.googleapicnblogs.com/google-code-archive-downloads/v2/code.google.com/sersync/sersync2.5.4_64bit_binary_stable_final.tar.gz
[root@NFS ~]$ tar xf sersync2.5.4_64bit_binary_stable_final.tar.gz
[root@NFS ~]$ cp -a GNU-Linux-x86/ /usr/local/sersync
[root@NFS ~]$ echo "PATH=/usr/local/sersync:$PATH" > /etc/profile.d/sersync.sh
[root@NFS ~]$ source /etc/profile.d/sersync.sh

#生成验证文件
[root@NFS ~]$ echo lgq123456 > /etc/rsync.pas
[root@NFS ~]$ chmod 600 /etc/rsync.pas

#备份sersync配置文件,修改配置文件
[root@NFS ~]$ cp -a /usr/local/sersync/confxml.xml{,.bak}
##web1(可道云)共享业务配置
[root@NFS ~]$ vi /usr/local/sersync/confxml.xml
1 
  2 
  3     
  4     
  5     
  6     
  7     
  8     
  9     
 10     
 11     
 12     
 13     
 14     
 15     
 16     
 17     
 18     
 19      ##修改此行为true,文件属性变化后也会同步
 20     
 21     
 22 
 23     
 24      ##修改此行,需要同步的源目录
 25          #修改此行,指定备份服务器地址和rsync daemon的模块名,开启了ssh start,此时name为远程的shell方式运行时的目标目录
 26         
 27         
 28     
 29     
 30         
 31          #修改此行为true,指定备份服务器的rsync配置的用户和密码
 ......
 
 #以后台方式执行同步
 [root@NFS ~]$ sersync2 -dro /usr/local/sersync/confxml.xml
 
 ##web2(jpress)业务共享配置
 [root@NFS ~]$ cd /usr/local/sersync/
 root@NFS sersync]$ cp confxml.xml jpress.xml
 ###相较于web1只需修改下面标记的两处
 [root@NFS sersync]$ vi jpress.xml
 
  2 
  3     
  4     
  5     
  6     
  7     
  8     
  9     
 10     
 11     
 12     
 13     
 14     
 15     
 16     
 17     
 18     
 19     
 20     
 21     
 22 
 23     
 24       #只需要将web1中的这个共享目录改成web2的
 25          #这个是备份服务器中定义对应web2的rsync daemon的模块名
 26         
 27         
 28     
 29     
 30         
 31         
 32         
 33         
 34         
 35     
 #后台独立运行web2对应服务
 [root@NFS sersync]$ sersync2 -dro /usr/local/sersync/jpress.xml
 
 
 #为了防止服务器重启后手动执行的服务断开,将执行命令写进文件中,随开机启动
 [root@NFS ~]$ echo -e "/usr/local/sersync/sersync2 -dro /usr/local/sersync/confxml.xml &> /dev/nulln/usr/local/sersync/sersync2 -dro /usr/local/sersync/jpress.xml &> /dev/null" > /etc/profile.d/sersync2.sh
 [root@NFS ~]$ chmod +x /etc/profile.d/sersync2.sh
  1. 部署nfs备份服务器
#在10.0.0.78 NFS备份服务器以独立服务方式运行rsync并实现验证功能
[root@NFS-bak ~]$ yum -y install rsync-daemon

#创建备份目录
[root@NFS-bak ~]$ mkdir /data/backup -p
[root@NFS-bak ~]$ mkdir /data/web2-backup

#修改配置文件,添加以下信息
[root@NFS-bak ~]$ vi /etc/rsyncd.conf
uid = www    #指定以哪个用户来访问共享目录,将之指定为生成的文件所有者,默认是nobody
gid = www
max connections = 0
ignore errors
exclude = lost+found/
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsyncd.lock
reverse lookup = no

[backup]  #每个模块名对应一个不同的path目录,如果同名后面模块生效
path = /data/backup/
comment = backup dir
read only = no   #默认是yes,即只读
auth users = rsyncuser   #默认anonymous可以访问rsync服务器,主服务器中指定的用户
secrets file = /etc/rsync.pas

[web2-backup]
path = /data/web2-backup/
comment = backup dir
read only = no
auth users = rsyncuser
secrets file = /etc/rsync.pas


#创建验证文件
[root@NFS-bak ~]$ echo "rsyncuser:lgq123456" > /etc/rsync.pas

#创建传输用户
[root@NFS-bak ~]$ chmod 600 /etc/rsync.pas
[root@NFS-bak ~]$ groupadd -g 666 www
[root@NFS-bak ~]$ useradd -u 666 www -g 666
[root@NFS-bak ~]$ chown www.www /data/backup/ -R
[root@NFS-bak ~]$ chown -R www.www /data/web2-backup/

#重载配置
[root@NFS-bak ~]$ rsync --daemon 

#放进文件中,随主机开启自启动
[root@NFS-bak ~]$ echo "rsync --daemon" > /etc/profile.d/rsync.sh
[root@NFS-bak ~]$ chmod +x /etc/profile.d/rsync.sh
  1. 测试是否主备同步数据
#在NFS主服务器上共享目录创建一个test.txt文件,查看备份服务器上是否同步
[root@NFS ~]$ cd /data/www/
[root@NFS www]$ touch test.txt
[root@NFS www]$ ll
total 0
-rw-r--r-- 1 root root 0 Mar  9 22:23 test.txt

[root@NFS-bak ~]$ ll /data/backup/
total 0
-rw-r--r-- 1 www www 0 Mar  9 22:23 test.txt

4 在10.0.0.48和10.0.0.58主机上搭建MySQL主从节点

  • 主节点:10.0.0.48
  • 从节点:10.0.0.58
  1. 搭建主节点
#安装mysql
[root@mysql-master ~]$ yum -y install mysql-server

#创建二进制日志存放路径,并在配置文件中指定路径以及日子文件的前缀
[root@mysql-master ~]$ mkdir /data/binlog
[root@mysql-master ~]$ chown mysql. /data/binlog/

#设置配置文件,并启动服务
[root@mysql-master ~]$ cat /etc/my.cnf 
[mysqld]
server-id=48 
log_bin=/data/binlog/mysql-bin

[root@mysql-master ~]$ systemctl enable --now mysqld

#创建复制用户以及授权
[root@mysql-master ~]$ mysql -uroot -plgq123456 -e "create user 'repluser'@'10.0.0.%' identified by 'lgq123456';"
[root@mysql-master ~]$ mysql -uroot -plgq123456 -e "grant replication slave on *.* to 'repluser'@'10.0.0.%';"

#创建kodbox对应数据库以及账号
[root@mysql-master ~]$ mysql -uroot -plgq123456 -e "create database kodbox;"
[root@mysql-master ~]$ mysql -uroot -plgq123456 -e "create user kodbox@'10.0.0.%' identified by 'lgq123456';"
[root@mysql-master ~]$ mysql -uroot -plgq123456 -e "grant all on kodbox.* to  kodbox@'10.0.0.%';"

#创建web2业务对应的数据库和用户
[root@mysql-master ~]$ mysql -uroot -plgq123456 -e "create database jpress;"
[root@mysql-master ~]$ mysql -uroot -plgq123456 -e "create user jpress@'10.0.0.%' identified by '123456';"
[root@mysql-master ~]$ mysql -uroot -plgq123456 -e "grant all on jpress.* to jpress@'10.0.0.%';"


#进行完全备份
[root@mysql-master ~]$ mysqldump -uroot -plgq123456 -A -F --single-transaction --master-data=1 > full_backup.sql

#拷贝备份数据到从节点
[root@mysql-master ~]$ scp full_backup.sql 10.0.0.58:
  1. 搭建从节点
#安装
[root@mysql-slave ~]$ yum -y install mysql-server
#修改配置文件,并启动
[root@mysql-slave ~]$ vi /etc/my.cnf
#添加下面信息
[mysqld]
server-id=58
read-only

[root@mysql-slave ~]$ systemctl enable --now mysqld

#修改备份文件,在change master to中添加主节点信息
[root@mysql-slave ~]$ vi full_backup.sql
......
CHANGE MASTER TO 
    MASTER_HOST='10.0.0.48',  		#添上主节点ip地址
    MASTER_USER='repluser',			#添上在主节点创建的账号
    MASTER_PASSWORD='lgq123456',	#添上账号密码
    MASTER_PORT=3306,				#添上端口号
    MASTER_LOG_FILE='mysql-bin.000003', 
    MASTER_LOG_POS=157;
......

#还原备份
###暂时关闭二进制日志
[root@mysql-slave ~]$ mysql
mysql> set sql_log_bin=0;
###还原
mysql> source /root/full_backup.sql;
##开启主从节点的链接线程
mysql> start slave;
##查看状态
mysql> show slave statusG
*************************** 1. row ***************************
               Slave_IO_State: Waiting for source to send event
                  Master_Host: 10.0.0.48
                  Master_User: repluser
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000003
          Read_Master_Log_Pos: 157
               Relay_Log_File: mysql-slave-relay-bin.000002
                Relay_Log_Pos: 326
        Relay_Master_Log_File: mysql-bin.000003
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 157
              Relay_Log_Space: 542
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 48
                  Master_UUID: bdcb41ce-be61-11ed-808a-000c2924e25d
             Master_Info_File: mysql.slave_master_info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Replica has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 
            Executed_Gtid_Set: 
                Auto_Position: 0
         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Master_TLS_Version: 
       Master_public_key_path: 
        Get_master_public_key: 0
            Network_Namespace: 
1 row in set, 1 warning (0.01 sec)
  1. 测试主从是否同步
#在主节点上创建一个测试数据库
mysql> create database t1;
Query OK, 1 row affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| kodbox             |
| mysql              |
| performance_schema |
| sys                |
| t1                 |
+--------------------+
6 rows in set (0.00 sec)

#在从节点查看是否存在
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| kodbox             |
| mysql              |
| performance_schema |
| sys                |
| t1                 |
+--------------------+
6 rows in set (0.01 sec)
##说明主从复制已经可以同步了

5 在10.0.0.88主机上部署redis

#安装redis
[root@redis ~]$ yum -y install redis
#修改配置文件
[root@redis ~]$ vi /etc/redis.conf 
bind 0.0.0.0 #将此行的127.0.0.1改为0.0.0.0,实现远程访问
[root@redis ~]$ systemctl enable --now redis

6 搭建 www.yanlinux.org web1业务(可道云业务)

6.1 在10.0.0.28上搭建nginx和php-fpm

# 1.利用脚本一键编译安装nginx
[root@web1 ~]$ cat install_nginx.sh 
#!/bin/bash

OS_TYPE=`awk -F'[ "]' '/^NAME/{print $2}' /etc/os-release`
OS_VERSION=`awk -F'[".]' '/^VERSION_ID/{print $2}' /etc/os-release`
CPU=`lscpu |awk '/^CPU(s)/{print $2}'`
SRC_DIR=/usr/local/src
read -p "$(echo -e '
登录查看全部

参与评论

评论留言

还没有评论留言,赶紧来抢楼吧~~

手机查看

返回顶部

给这篇文章打个标签吧~

棒极了 糟糕透顶 好文章 PHP JAVA JS 小程序 Python SEO MySql 确认