1、结合图形描述LVS的工作原理;
功用:根据请求报文的目标IP和目标port将其调度转发至后端的某主机上,作用在OSI网络模型中的第四层LVS有四种集群类型,分别是:
(一)lvs-nat:多目标的DNAT,根据请求报文中的目标地址和目标端口,在input链上对报文进行调度,将报文转发给后端的RS集群(二)lvs-dr:通过为请求报文重新封装一个Mac首部进行转发,源Mac是DIP所在的接口的Mac,目标Mac是挑选出某RS的RIP所在接口的Mac地址,IP首部不会发生变化(IP首部为:CIP<—>VIP)(三)lvs-tun:不修改请求报文的IP首部(源IP为CIP,目标IP为VIP),而是源IP首部之外在封装一个IP首部(源IP为DIP,目标IP为RIP)
(四)lvs-fullnat:通过同时修改请求报文的源IP地址(CIP–>DIP)和目标IP地址(VIP–>RIP)进行转发
2、搭建一套LVS-DR模型的高性能集群,并实现以下功能: (1)、wordpress程序通过nfs共享给各个realserver; (2)、后端realserver中的nginx和php分离
试验前提:这里由于知识有限,将VIP, DIP , RIP都设置为桥接,且在同一个网络,其实这样做就失去了lvs-dr模型的真实的意义,因为用户请求的是Director主机上的VIP,而VIP是Director主机上DIP的一个别名,DIP是Director网卡的真实IP地址,只是起到一个为请求VIP的报文经过ipvs-dr模型调度之后,从DIP所在的网卡中出去的作用,这时的请求报文外面封装了一个Mac首部,源Mac地址为MAC_VIP,目标Mac地址为MAC_RIP,且后端的RS主机的RIP与DIP在同一个网络中,因此报文只能发给RS,RS接到报文后发现目标Mac地址就是自己的Mac地址,就直接解开Mac首部,发现目标IP为VIP,本地的lo地址回环的别名为VIP就这样响应了。但是响应报文的源IP地址为VIP,目标IP地址为CIP,这样需要搭建路由器,使得内网的IP报文能够发送到公网才行,不能原路返回。那么这里使用的是桥接,就是没有考虑RIP为内网IP的情况,试验过程都是本地的局域网,响应报文就直接发给客户端了,因此失去了其真实的ipvs-dr模型的意义。但是真实场景中只有VIP是一个公网地址,而DIP和RIP都是私网地址,私网地址照样可以通过添加路由器的方式响应报文(出网)对于ipvs-dr模型的理解,最为困难的就是对于网络的理解,因为没有动手搭建过路由设备,对路由设备的理解甚少,以后这方面需要多加强试验环境: 试验步骤:按图所示,先在各个主机上部署安装需要的服务(一):在php-NFS服务器上,创建nginx用户和组,与Nginx服务器中的一样,再创建共享的目录, # 创建共享的目录,上传WordPress源码 mkdir -pv /apps/php/ unzip wordpress.zip mv wordpress/* ./ # 创建nginx用户和组 groupadd -g 985 nginx useradd -u 990 -g nginx nginx # 设置共享目录的访问权限,使得在Nginx服务器上的nginx进程可以访问共享目录,具有对应的读写权限 chown -R nginx php # 编辑/etc/exports文件 /apps/php 192.168.23.0/24(rw,no_root_squash) # 让内核重读共享目录的配置文件 exportfs -r # 编辑/etc/php-fpm.d/www.conf配置文件 listen = 192.168.23.13:9000 ;listen.allowed_clients = 127.0.0.1 user = nginx group = nginx # 启动php和NFS服务 systemctl start php-fpm nfs # 修改WordPress配置文件 mv /apps/php/wp-config-sample.php /apps/php/wp-config.php vi /apps/php/wp-config.php /** WordPress数据库的名称 */ define('DB_NAME', 'wp'); /** MySQL数据库用户名 */ define('DB_USER', 'wp_user'); /** MySQL数据库密码 */ define('DB_PASSWORD', '34958729348570~'); /** MySQL主机 */ define('DB_HOST', '192.168.23.14'); (二):配置MariaDB,通过mariadb自带的mysql_secure_installation对数据库初始化,登入mariadb创建wp数据库和给wp_user授权一个远程访问的用户 # 启动mariadb systemctl start mariadb mysql_secure_installation mysql -uroot -p create database wp; grant all on wp.* to wp_user@'192.168.23.%' identified by '394584723975~'; flush privileges; select user,host,password from mysql.user; 显示:wp_user | 192.168.23.% | *DD5143776C2C77C09429E28D2F1784F06C39F2A4 (三):配置Nginx,两台Nginx服务器一同配置 # 编辑/etc/nginx/nginx.conf配置文件 listen 80; # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; location / { root /apps/php/; index index.php index.html index.htm; } location ~ \.php$ { fastcgi_pass 192.168.23.13:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /apps/php/$fastcgi_script_name; include fastcgi_params; } # 将配置文件拷贝一份到Nginx2对应的目录中 scp -p /etc/nginx/nginx.conf root@192.168.23.12:/etc/nginx/nginx.conf # 在本地文件系统上创建/apps/php/{index.html,index.php} mkdir -pv /apps/php touch /apps/php/{index.html,index.php} # 查看php-NFS服务器的共享目录 showmount -e 192.168.23.13 显示:Export list for 192.168.23.13: /apps/php 192.168.23.0/24 # 挂载共享目录 mount -t nfs 192.168.23.13:/apps/php/ /apps/php # 查看挂载 mount # 开启nginx 服务 nginx # 如果Nginx是编译安装的,在/etc/init.d/nginx写一个Nginx服务脚本,实现chkconfig管理开启自启 #!/bin/sh # # nginx - this script starts and stops the nginx daemin # # chkconfig: - 85 15 # description: Nginx is an HTTP(S) server, HTTP(S) reverse \ # proxy and IMAP/POP3 proxy server # processname: nginx # config: /usr/local/nginx/conf/nginx.conf # pidfile: /usr/local/nginx/logs/nginx.pid # Source function library. . /etc/rc.d/init.d/functions # Source networking configuration. . /etc/sysconfig/network # Check that networking is up. [ "$NETWORKING" = "no" ] && exit 0 nginx="/opt/application/nginx/sbin/nginx" prog=$(basename $nginx) NGINX_CONF_FILE="/opt/application/nginx/conf/nginx.conf"lockfile=/var/lock/subsys/nginx start() { [ -x $nginx ] || exit 5 [ -f $NGINX_CONF_FILE ] || exit 6 echo -n $"Starting $prog: " daemon $nginx -c $NGINX_CONF_FILE retval=$? echo [ $retval -eq 0 ] && touch $lockfile return $retval } stop() { echo -n $"Stopping $prog: " killproc $prog -QUIT retval=$? echo [ $retval -eq 0 ] && rm -f $lockfile return $retval } restart() { configtest || return $? stop start } reload() { configtest || return $? echo -n $"Reloading $prog: " killproc $nginx -HUP RETVAL=$? echo } force_reload() { restart } configtest() { $nginx -t -c $NGINX_CONF_FILE } rh_status() { status $prog } rh_status_q() { rh_status >/dev/null 2>&1 } case "$1" in start) rh_status_q && exit 0 $1 ;; stop) rh_status_q || exit 0 $1 ;; restart|configtest) $1 ;; reload) rh_status_q || exit 7 $1 ;; force-reload) force_reload ;; status) rh_status ;; condrestart|try-restart) rh_status_q || exit 0 ;; *) echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}" exit 2 esac在这里已经实现了共享存储,下面的步骤就是配置IPVS-DR模型
(四)在Director主机上 # 给enp0s3网卡设置一个别名,别名的IP地址为VIP, 使得VIP可以响应请求,但是不对本地进行广播,因此可以避免IP冲突 ifconfig enp0s3:0 192.168.23.102 netmask 255.255.255.255 broadcast 192.168.23.102 # 设置ipvs-dr规则 ipvsadm -A -t 192.168.23.102:80 -s rr ipvsadm -a -t 192.168.23.102:80 -r 192.168.23.11 -g -w 1 ipvsadm -a -t 192.168.23.102:80 -r 192.168.23.12 -g -w 2 (四)分别在Nginx的主机上设置,Nginx1和Nginx2一样 # 写一个脚本控制arp_ignore和arp_announce的值,enp0s3和lo两个接口都要进行控制,arp.sh脚本如下 #!/bin/bash # case $1 in start) echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce ;; stop) echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce ;; esac # 运行脚本 bash arp.sh start # 在设置了接口的arp_ignore和arp_announce值之后,再在lo本地网卡添加别名,绑定VIP ifconfig lo:0 192.168.23.102 netmask 255.255.255.255 broadcast 192.168.23.102 # 给进来的报文设置一个入栈路由条目,入口和出口为 192.168.23.102 这样就使得目标IP为lo:0的IP,即VIP,而不会是RIP route add -host 192.168.23.102 dev lo:03:在第二题的基础上增加一个keepalived 高可用ipvs集群
思路:在Director服务器上VIP是通过绑定在enp0s3上的别名,现在使用keepalived服务,部署两台Director,实现Director的高可用试验环境 试验步骤将Diretor的VIP删除,分别在两台Director中yum安装keepalived,编译/etc/keepalived/keepalived.conf 文件,记得区别两台Director的MASTER和BAKUP, ! Configuration File for keepalived global_defs { notification_email { root@localhost } notification_email_from ddd@firewall.loc smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id node1 vrrp_mcast_group4 224.0.0.18 } vrrp_instance VI_1 { # 这里如果是备用的Director,要改为BACKUP state MASTER interface enp0s3 virtual_router_id 51 # 这里如果是备用的Director,要改为优先级比100低,取90 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { # 这里需要改为后端的RS定义的vip 192.168.23.102 } notify_master "/root/notify.sh master" notify_backup "/root/notify.sh backup" notify_fault "/root/notify.sh fault" } # 这里的virtual_server的IP就是两个高可用主机间漂移的虚拟IP virtual_server 192.168.23.102 80 { delay_loop 6 lb_algo rr lb_kind DR protocol TCP sorry_server 127.0.0.1 80 real_server 192.168.23.11 80 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } real_server 192.168.23.12 80 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } }4、基于heartbeat v2 crm实现HA LAMP组合;要求,部署wordpress,用于编辑的文章中的任何数据在节点切换后都能正常访问;
试验环境: node1:192.168.23.31 提供heartbeat服务,hb_gui 定义资源组 ,服务资源node2:192.168.23.32 提供heartbeat服务,服务资源node3:192.168.23.33 提供NFS共享存储试验步骤 (一)试验前准备工作 1:节点时间必须同步:使用ntp协议实现 2:节点间需要通过主机名互相通信,必须能够解析主机名至IP地址,主机名解析定义在/etc/hosts文件中3:两台高可用集群,使用 ping node 仲裁设备4:建立节点之间的root用户能够基于密钥认证 (二)在node1和node2上 1:yum安装heartbeat服务依赖的包 yum install -y net-snmp-libs libnet PyXML pygtk2-libglade2:上传heartbeat包,解压,安装本地RPM包 rpm -ivh heartbeat-2.1.4-12.el6.x86_64.rpm heartbeat-pils-2.1.4-12.el6.x86_64.rpm heartbeat-stonith-2.1.4-12.el6.x86_64.rpm3:在/usr/share/doc/heartbeat-2.1.4/目录下拷贝ha.cf,haresources,authkeys三个文件至/etc/ha.d/目录下 cp /usr/share/doc/heartbeat-2.1.4/{ha.cf,haresources,authkeys} /etc/ha.d/4:将authkeys的权限改为600,避免heartbeat无法启动 chmod 600 /etc/ha.d/authkeys(三)配置文件ha.cf,haresources,authkeys进行编辑 1:编辑/etc/ha.d/authkeys文件,设定heartbeat传递心跳信息的算法和密钥 添加: auth 22 sha1 WfpBxC/WzXIWsqt5zNVMTA2:编辑/etc/ha.d/ha.cf文件,设定节点信息,并且开启heartbeat的CRM功能,禁用haresources资源管理器 logfile /var/log/heartbeat mcast eth0 225.0.0.1 694 1 0 node node1 node node2 ping 192.168.23.1 crm on 3:将所有的配置文件拷贝一份到node2对应的目录下 scp -p /etc/ha.d/{authkeys,ha.cf} node2:/etc/ha.d/(四)在node1上 1:安装hb_gui图形资源管理器 rpm -ivh heartbeat-gui-2.1.4-12.el6.x86_64.rpm2:由于在Mac上使用的ssh远程连接客户端为CRT,无法调用图形界面,因此在node1上安装图形界面 yum groupinstall -y "X Window System" "Desktop"3:给hacluster用户设置一个登入秘密 echo "yhy3426356" | passwd --stdin hacluster(五)在node1和node2上开启heartbeat service heartbeat start(六)在node1的图形界面的终端上运行heartbeat的CRM资源管理器 hb_gui &(七)HA LAMP 资源准备 1:在node1 和 node2 yum 安装 httpd 、php 、 php-mysql , nfs-utils , 二进制安装mysql - 2:在node3上安装nfs-utils 3:在node3上,设置共享目录/mydata,并且在/mydata目录下,两个目录,一个用于mysql的数据目录,一个用于httpd的页面资源目录,这样可以保证再CRM节点切换的时候,所有的数据都不会丢失 mkdir -vp /mydata/{data,html}groupadd -r -g 306 mysqluseradd -r -g mysql -u 306 mysqlchown -R mysql.mysql /mydata/data/vi /etc/exports /mydata 192.168.23.0/24(rw,no_root_squash)exportfs -avrcd /mydata/html/ 上传WordPress源码包到此目录,解压service nfs start在WordPress的配置文件中设置数据库登入等信息4:在node1 上 groupadd -r -g 306 mysqluseradd -r -g mysql -u 306 mysqltar xf mariadb-5.5.54-linux-x86_64.tar -C /usr/local 解压mariadb二进制包到/usr/local下cd /usr/local/ln -vs mariadb-5.5.54-linux-x86_64 mysqlchown -R root.mysql mysql/*cd mysqlcp ./support-files/my-large.cnf /etc/my.cnfcp ./support-files/mysql.server /etc/init.d/mysqldvi /etc/my.cnf skip_name_resolve = ON datadir = /mydata/data innodb_file_per_table = ONmkdir -pv /mydata/{data,html}mount -t nfs 192.168.23.33:/mydata /mydata./scripts/mysql_install_db --datadir=/mydata/data/ --user=mysqlservice mysqld start登入mysql,创建一个wp数据库,并且授权用户wp_user可以远程登入5:在node2上 除了对数据目录初始化外,其他都和node1操作一样并测试mysql可以登入成功6:在node1上修改httpd的配置文件 修改DocumentRoot 以及 Directory本地测试无误7:启动heartbeat,并在node1的图形界面中登入hb_gui 添加LAMP资源 切换node2为备用节点 试验完毕,实现了节点之间的切换后数据可访问,可写试验注意点: 1:记得将nfs的html目录中的WordPress配置文件提前设置好2:mysql数据库,在创建之后记得使用mysql_secure_installation脚本给root用户设置密码,如果没有给root设置密码,即使授权了一个可远程登入的用户,也无法登入的,这点要注意5、基于LVS-NAT模型,设计一套负载均衡集群,使用原地址哈希调度策略实现会话保存,使用NFS实现RS的共享存储
试验环境:
试验步骤
(一):按图所示,先部署好如图所示的服务器,将需要安装的服务使用yum安装好,并且设置对应的IP地址(二):在Directory服务器上添加ipvs规则 ipvsadm -A -t 192.168.23.12:80 -s shipvsadm -a -t 192.168.23.12:80 -r 192.168.10.11:80 -m -w 1ipvsadm -a -t 192.168.23.12:80 -r 192.168.10.22:80 -m -w 1(三):在Nginx1服务器上,将网关IP地址设置为DIP:192.168.10.254,修改/etc/nginx/nginx.conf文件,并且将主配置文件拷贝一份到另一台Nginx的主机上,并且的本地文件系统创建/apps/php/{index.html,index.php}两个文件,在两个文件中分别添加需要测试的内容,最后启动Nginx服务(注意:必须在/apps/php/目录下有index.php文件,如果没有,那么当客户端访问域名或IP地址时,显示的是index.html文件的测试页) # 需要修改的部分 server { listen 80; # server_name _; # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; location / { root /apps/php/; index index.php index.html index.htm; } location ~ \.php$ { fastcgi_pass 192.168.10.33:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /apps/php/$fastcgi_script_name; include fastcgi_params; } (四)在NFS服务器上,创建/apps/php/目录,并且下载WordPress程序到目录中,解压,并且将所有的文件剪切到/apps/php/目录中,创建nginx用户和nginx组,且uid 和 gid 应与php-fpm服务器的nginx的uid 和 gid 一样,并且设置/apps/php/目录及其子目录的属主和属组都是nginx,编辑/etc/exports文件,设置共享目录和允许挂载的客户端IP地址,并且设置权限,并且修改WordPress的配置文件,指定数据库主机等 # 创建nginx用户和nginx组,且uid 和 gid 应与php-fpmbash服务器的nginx的uid 和 gid 一样 groupadd -g 1000 nginx useradd -u 1000 -g nginx nginx # 编辑/etc/exports文件,设置共享目录和允许挂载的客户端IP地址,并且设置权限 /apps/php 192.168.10.0/24(rz,no_root_squash) # 让内核重读配置文件 exportfs -r (五)在php-fpm主机上,修改主配置文件/etc/php-fpm.d/www.conf,在本地文件系统中创建/apps/php/目录,用来挂载NFS共享服务器中的共享目录 ,并且创建nginx的属主和属组 # 修改服务监听的IP地址 listen = 192.168.10.33:9000 # 将允许访问的客户端这一行指令注释,表示任何主机都可以访问 ;listen.allowed_clients = 127.0.0.1 # 让php-fpm服务以nginx的属主和主组的身份运行 user = nginx group = nginx (六)启动mariadb,通过mariadb自带的mysql_secure_installation对数据库初始化,登入mariadb创建wp数据库和给wp授权一个远程访问的用户(七)这里没有考虑nginx的动静分离,如果希望访问是可以加载CSS代码,最愚蠢的方式就是将WordPress代码在nginx主机的/apps/php/目录下再复制一份