一、完成一個簡單的web服務器,web服務器從mysql裏讀取數據進行返回
二、Mysql須要有一個單獨的數據盤,每一個mysql虛擬機的磁盤掛載方式須要都不同
三、公網ip配置在虛擬機上,三個web服務器用snat訪問公網
四、使用dnat把8080端口映射到公網去,訪問控制檯的8080端口須要可以訪問web server
五、web服務器和mysql服務器須要在不一樣的子網和vlan裏,須要在宿主機上自建一個虛擬路由器
六、msyql和web server都須要使用keepalived和haproxy作負載均衡
七、對物理機作使用iptables作安全策略,只容許22和8080進來,而且禁pinghtml
剛拿到任務的時候,本身實際上是很懵逼的,對於實驗中要求實現的內容,絕大部分在以前的運維工做中並無接觸過;前端
完成一個簡單的web服務器,web服務器從mysql裏讀取數據進行返回node
分解:先後端分離,包含數據庫和web服務,須要確認使用什麼方式實現先後端的聯通;mysql
web主機和mysql主機均爲3臺,須要使用浮動IP來實現鏈接;linux
mysql須要有一個單獨的數據盤,每一個mysql虛擬機的磁盤掛載方式須要都不同web
分解:總共有三臺mysql主機,須要使用三種不一樣的方式來實現掛載;redis
公網ip配置在虛擬機上,三個web服務器用snat訪問公網算法
分解:要作實驗就要安裝軟件,既然沒有內網yum源,那麼全部6臺實驗主機都須要可以訪問公網,解決軟件包安裝的問題,經過配置iptables規則來實現;sql
使用dnat把8080端口映射到公網去,訪問控制檯的8080端口須要可以訪問web server數據庫
分解:實驗環境的網絡須要隔離,能夠經過ip namespace來實現;須要配置兩次DNAT規則(宿主機默認ipns下一次、實驗環境ipns中一次),兩次銜接,實現外部網絡能夠經過指定端口訪問web服務器
web服務器和mysql服務器須要在不一樣的子網和vlan裏,須要在宿主機上自建一個虛擬路由器
分解:網絡規劃已經作好,不一樣的vlan能夠經過ovs設置tag來實現
msyql和web server都須要使用keepalived和haproxy作負載均衡
分解:web服務使用keepalive和haproxy實現負載均衡比較好實現;
mysql服務使用keepalive和haproxy實現負載均衡要怎樣實現?
對物理機作使用iptables作安全策略,只容許22和8080進來,而且禁ping
分解:iptables放行端口,初步想到兩種方式來實現(設置默認策略爲DROP,爲22和8080單獨添加規則;不更改默認策略,在放行22和8080端口後添加拒絕全部鏈接的規則)
iptables設置禁ping規則
實驗的最終結果是完成一個環境的搭建,包含有多臺主機;分析實驗內容後發現這個大的任務其實能夠被拆分紅幾個板塊來完成,一個部分的實現與否對其餘部分的影響並不大:
一、虛擬機的搭建和基礎環境配置;
二、網絡拓撲的實現和配置;
三、web集羣搭建(http+keepalive+haproxy);
四、mysql集羣搭建(galera+keepalive+haproxy);
五、iptables規則配置,實現DNAT、SNAT功能;
六、mysql和http先後端聯通配置;
七、iptables配置策略放行2二、8080端口,禁ping;
說幹就幹,參照着完成思路開始:
要搭建環境,首先須要有可用的虛擬機環境才行;這裏使用的是kvm建立出來的虛擬機,在進行本身的實驗前,有幾點須要注意:
a、查看宿主機相應分區的空間是否足夠,須要建立6臺虛擬機,估算一下大體須要的空間,空間不足則須要進行擴容;
b、爲這個實驗單首創建一個項目目錄,存放這次實驗須要用到的全部文件;
c、在新建立的目錄下新建相應的目錄,用於存放虛擬機的各類文件:base存放基礎的qcow2文件,已經裝好系統、sys存放各臺虛擬機的qcow2鏡像文件,也即各臺虛擬機的實際保存位置、xmlfiles存放的是各臺虛擬機建立時使用的xml文件
新建的項目目錄爲/home/mission1/,在這目錄下包含三個目錄/home/mission1/{base,sys,xmlfiles}。
在/home/mission1/base/目錄下存放centos7_1503.qcow2,這個是已經安裝了CentOS7.1操做系統的磁盤文件;
虛擬機鏡像支持多種類型,包括有raw、qcow二、vmdk、vdi等:
a、raw:未做任何處理的鏡像格式,等同於用dd命令對磁盤作的複製;這種格式的優勢是簡單,能夠很容易的導出到其餘硬件模擬器中去,若是本身的文件系統支持稀疏文件,如linux下的ext2/三、windows的ntfs,那只有寫入的字段會佔用空間。
b、qcow2:qemu仿真器支持的鏡像格式,能夠動態擴大,支持寫時複製;該格式是最萬能的格式,即便是在不支持稀疏文件的文件系統上,也能夠得到最小空間的鏡像文件,還包含AES加密、zlib壓縮、支持虛擬機快照等。
c、vdi:virtualbox和qemu仿真器支持的磁盤鏡像格式。
d、vmdk:許多hypervisor支持的磁盤鏡像格式。
建立鏡像文件的命令示例以下:
1 # qemu-img create -f qcow2 -o /home/mission1/sys/test.qcow2 10G
咱們此處使用的是已經安裝了CentOS7.1操做系統的磁盤鏡像文件,少去安裝操做系統的步驟。
在/home/mission1/xmlfiles/目錄下存放有normal-node-define.xml,這個是虛擬機模板的配置文件。
每檯安裝完成的虛擬機都有本身的xml文件,保存了這臺虛擬機的配置信息,包含有domain名、cpu、內存、磁盤、網絡等;咱們也能夠經過修改模板xml文件來啓用一臺新的VM。
經過kvm來建立VM有多種方式,如下列舉幾種經常使用的方式:
a、經過網絡鏡像安裝,支持vnc。
1 # virt-install --name test01 --ram 1024 --vcpus 1 -f /home/mission1/sys/test.qcow2 --os-type linux --os-variant rhel7 --network bridge=br-lwr --graphics vnc,listen=0.0.0.0 --location 'http://mirrors.163.com/centos/7.1.1503/os/x86_64/'
b、經過 iso 鏡像本地安裝,支持 vnc。
1 # virt-install --name test01 --ram 1024 --vcpus 1 -f /home/mission1/sys/test.qcow2 --os-type linux --os-variant rhel7 --network bridge=br-lwr --graphics vnc,listen=0.0.0.0 --cdrom /home/mission1/base/CentOS-7.1.1503.iso
c、編輯模板xml文件,直接經過模板文件生成新VM。
編輯xml文件<略>
1 # virsh define /home/mission1/xmlfile1/test1.xml
咱們採用的是第三種方式,有現成的安裝了操做系統的qcow鏡像文件,直接複製編輯模板xml配置文件便可
1 # cp /home/mission1/xmlfiles/{normal-node-define.xml,test.xml} 2 3 # vim /home/mission1/xmlfiles/test.xml 4 5 <name>mark_vm_name</name> <--設置VM名字 6 7 <memory unit='KiB'>mark_vm_mem_in_kb</memory> <--設置VM內存大小 8 9 <currentMemory unit='KiB'>mark_vm_mem_in_kb</currentMemory> 10 <vcpu placement='static'>mark_vm_vcpu_count</vcpu> <--設置CPU個數 11 12 <disk type='file' device='disk'> 13 <driver name='qemu' type='qcow2'/> 14 <source file='mark_vm_sys_disk'/> <--填寫磁盤鏡像文件路徑 15 <backingStore/> 16 <target dev='vda' bus='virtio'/> 17 <alias name='virtio-disk0'/> 18 </disk> 19 20 <interface type='bridge'> 21 <!--須要設置虛擬機綁定的內網網橋--> 22 <source bridge='mark_cluster_bridge'/> <--設置VM網卡所屬bridge 23 <virtualport type='openvswitch'> 24 </virtualport> 25 <model type='virtio'/> 26 </interface>
編輯完成後,直接使用如下命令建立VM:
1 # virsh define /home/mission1/xmlfile1/test1.xml
開啓VM:
1 # virsh start domain-name
查看VM的vnc鏈接口:
1 # virsh vncdisplay domain-name
使用vnc客戶端鏈接,在VNC Server框中輸入:<宿主機IP>:<鏈接口>
經過vnc客戶端進入VM,完成基礎配置(配置IP地址、關閉selinux、關閉iptables、設置時間同步、配置主機名等);一樣的方式建立並配置其餘5臺虛擬機。
至此,VMs建立及配置完成。
對於網絡架構的實現,剛開始的切入點是直接從實驗任務中給出的圖考慮的;要完成實驗,有幾個前提是確認的:
a、要有本身對外的網橋,用openvswitch來實現(設置VM網卡所需bridge須要填寫);
b、實驗網絡須要與宿主機網絡隔離,使用ip namespace實現;
c、須要給各臺實驗虛擬機網絡配置vlan,使用openvswitch實現;
d、實現虛擬機須要聯通外部網絡,用於軟件安裝和後期功能實現,須要配置路由和iptables規則;
實現過程當中有過的疑惑和問題:
1)聯通ip namespace內部ip和外網,用什麼方式實現?
2)網橋上新建的網卡類型,爲何要設置成type=internal?
3)爲何在ip namespace中給各臺虛擬機鏈接的網口設置了vlan,不一樣vlan的IP地址仍是可以ping通?
4)對各個組件的功能的搭配存在困惑,仍然比較迷糊,veth pair是否能在這個場景下發揮做用?
問題先不說怎麼解決的,先來解決現有的需求。
在宿主機上執行如下命令,建立一個本身的網橋:
1 # ovs-vsctl add-br br-lwr
查看生成的網橋,網橋建立成功:
1 # ovs-vsctl show 2 Bridge br-lwr 3 Port br-lwr 4 Interface br-lwr 5 type: internal
在宿主機上執行如下命令,建立一個本身的ip namespace:
1 # ip netns add lwr-ns
在網橋上新建兩個internal類型的網口
1 # ovs-vsctl add-port br-lwr web-nw tag=20 -- set Interface web-nw type=interval 2 # ovs-vsctl add-port br-lwr myql-nw tag=30 -- set Interface mysql-nw type=interval
將在網橋上新建的兩個網卡增長到新建的ip namespace中
1 # ip link set mysql-nw netns lwr-ns 2 # ip link set web-nw netns lwr-ns
爲兩個新加入ip namespace中的網卡配置IP地址
1 # ip netns exec lwr-ns ip addr add 192.168.0.1/24 dev mysql-nw 2 # ip netns exec lwr-ns ip addr add 172.16.0.1/24 dev web-nw 3 # ip netns exec lwr-ns ip link set web-nw up 4 # ip netns exec lwr-ns ip link set mysql-nw up 5 # ip netns exec lwr-ns ip link set lo up
新增了ip namespace後,命名空間隔離了網絡,內部的主機沒法聯通外網,須要再進行配置。
再br-lwr上新增一個網口,增長完成後加入到lwr-ns中去,在ip namespace中爲該網口配置一個IP地址192.168.100.2
1 # ovs-vsctl add-port br-lwr con-wm -- set Interface con-wm type=internal 2 # ip link set con-wm netns lwr-ns 3 # ip netns exec lwr-ns ifconfig con-wm 192.168.100.2/24 4 # ip netns exec lwr-ns ip link set con-wm up
爲br-lwr配置一個IP地址,用於聯通ip namespace和宿主機網絡
1 # ifconfig br-lwr 192.168.100.1 netmask 255.255.255.0 up
此時在ip namespace仍然沒法ping通外網,須要在宿主機上配置一條iptables規則
1 # iptables -t nat -A POSTROUTING -s 192.168.100.0/24 ! -d 192.168.100.0/24 -j MASQUERADE
設置默認路由規則,用於ip namespace聯通外網
1 # ip netns exec lwr-ns ip route add default via 192.168.100.1
在建立虛擬機的時候,xml文件中已經設定了網口是鏈接到哪一個網橋上的;
當虛擬機建立成功後,相應的網橋上會有網口出現,數量對應這臺虛擬xml文件中的配置數目;
設置vlan就是經過openvswitch對相應的網口打上tag,在進行這步操做前,咱們須要先確認各臺虛擬機網口的的名字,再對相應的網口打上tag
1 # virsh dumpxml <domain-name> | grep vnet 2 <target dev='vnet18'/> 3 # ovs-vsctl set port vnet18 tag=20
對其餘五臺虛擬機進行一樣的操做,配置前須要確認清楚各臺虛擬機的vlan及網卡名
虛擬機的網絡配置已在前面完成,接下來要安裝軟件,但此時仍沒法聯通外網;咱們須要在ip namespace中配置相應的iptables規則,使其可以訪問外部網絡
1 # iptables -t nat -A POSTROUTING -s 192.168.200.0/24 ! -d 192.168.200.0/24 -j MASQUERADE 2 # iptables -t nat -A POSTROUTING -s 172.16.200.0/24 ! -d 172.16.200.0/24 -j MASQUERADE
執行上兩步的操做目的爲配置轉發,來自192.168.200.0和172.16.200.0網段的請求經過SNAT聯通到ip namespace中;
進入ip namespace後,經過默認路由轉到宿主機,宿主機再經過SNAT將請求發送出去,聯通外部網絡。
至此,網絡配置基本完成。
web集羣搭建相對簡單,採起的方式爲http+keepalive+haproxy的方式實現,在三臺IP地址爲172.16.0.0網段的虛擬機安裝http、haproxy、keepalive
1 # yum install haproxy keepalived httpd 2 Loaded plugins: fastestmirror 3 Loading mirror speeds from cached hostfile 4 * base: mirrors.163.com 5 * epel: mirror01.idc.hinet.net 6 * extras: mirrors.163.com 7 * updates: centos.ustc.edu.cn 8 Package haproxy-1.5.18-7.el7.x86_64 already installed and latest version 9 Package keepalived-1.3.5-6.el7.x86_64 already installed and latest version 10 Package httpd-2.4.6-80.el7.centos.1.x86_64 already installed and latest version 11 Nothing to do
軟件安裝完成後,分別進行配置,以一臺虛擬機爲例,分別配置三個軟件:
a、配置keepalived服務,備份配置文件後,修改相應配置內容,啓用服務並設定開機自啓
主節點配置文件內容以下:(注意:在其餘兩個web節點中須要將vrrp_instance ha1段state更改成BACKUP,priority值設置小於100)
1 global_defs { 2 notification_email { 3 root@localhost # 告警郵件接收地址 4 } 5 notification_email_from keepalived@localhost 6 smtp_server 127.0.0.1 # smtp服務器地址 7 smtp_connect_timeout 30 # 鏈接smtp服務器超時時間 8 router_id web01 # 每個節點的router_id都是惟一的,不能夠重複 9 vrrp_script haproxy{ 10 script "kiall -0 haproxy" 11 weight -25 12 } 13 } 14 vrrp_instance ha1 { 15 state MASTER # 角色爲MASTER 16 interface eth0 # 指定haproxy檢查網絡的接口 17 virtual_router_id 51 # 虛擬路由的ID,在全部的keepalived節點必須保持一致 18 priority 100 # 優先級 19 advert_int 1 # 心跳檢查的時間間隔 20 authentication { 21 auth_type PASS # 指定keepalived節點之間的驗證方式爲密碼驗證 22 auth_pass linux # keepalived節點的認證密碼 23 } 24 virtual_ipaddress { 25 172.16.0.5/24 dev eth0 # vip地址 26 } 27 track_script{ 28 haproxy # 調用haproxy檢查腳本 29 } 30 }
在修改配置文件前,先備份原配置文件;啓用服務並設置開機自啓:
1 # cp /etc/keepalived/keepalived.conf{,.bak20180708} 2 <!修改配置文件內容> 3 # systemctl start keepalived && systemctl enable keepalived
b、配置haproxy服務,備份配置文件後,修改相應配置內容,啓用服務並設置開機自啓
節點配置文件內容以下:
1 global # 全局配置 2 log 127.0.0.1 local3 info # 把發送到日誌設備local3的info級別的日誌記錄在本地 3 chroot /var/lib/haproxy # 綁定haproxy的工做路徑 4 pidfile /var/run/haproxy.pid # pid文件路徑 5 maxconn 4000 # 最大鏈接數 6 user haproxy # 運行進程的用戶 7 group haproxy # 運行進程的用戶組 8 daemon # 之後臺方式運行 9 stats socket /var/lib/haproxy/stats # haproxy動態維護的套接字文件,下面會經過一個小實驗看這個玩意的做用 10 defaults # 除非有具體定義,不然default選項會加入到後面 選項,不適用的就不會被定義 11 mode http # 默認的模式 12 log global # 引用全局的日誌配置 13 option httplog # 啓用日誌記錄http請求,haproxy默認不記錄http請求日誌 14 option dontlognull # 日誌中不記錄健康檢查的鏈接 15 option http-server-close # 對於某些server端不支持http長鏈接的狀況,利用這個參數可使用客戶端到haproxy是長鏈接,而haproxy到server端是短鏈接 16 option forwardfor except 127.0.0.0/8 # 容許服務器記錄發起請求的真實客戶端的IP地址 17 option redispatch 18 retries 3 # 鏈接真實服務器的失敗重連次數,超過這個值後會將對應正式服務器標記爲不可用 19 timeout http-request 10s # http請求超時時間 20 timeout queue 1m # 請求在隊列中的超時時間 21 timeout connect 10s # 鏈接超時 22 timeout client 1m # 客戶端鏈接超時 23 timeout server 1m # 服務端鏈接超時 24 timeout http-keep-alive 10s # http-keep-alive超時時間 25 timeout check 10s # 檢測超時時間 26 maxconn 3000 # 每一個進程最大的鏈接數 27 frontend www # 定義前端 28 bind *:80 # 綁定客戶端訪問的是哪一個IP的80端口 29 mode http # 指定模式爲http 30 option httplog # 記錄http請求的日誌 31 log global # 應用全局的日誌配置 32 stats uri /haproxy?stats # haproxy自帶的監控頁面 33 default_backend web # 指定默認的後端 34 backend web # 定義後端 35 mode http # 模式爲http 36 option redispatch 37 balance roundrobin # 負載均衡算法指定爲輪詢 38 option httpchk GET /index.html # 檢測後端真實服務器的方法 39 server web01 172.16.0.2:8080 cookie web01 weight 1 check inter 2000 rise 2 fall 3 40 server web02 172.16.0.3:8080 cookie web02 weight 1 check inter 2000 rise 2 fall 3 41 server web03 172.16.0.4:8080 cookie web03 weight 1 check inter 2000 rise 2 fall 3
在修改配置文件前,先備份原配置文件;啓用服務並設置開機自啓:
1 # cp /etc/haproxy/haproxy.cfg{,.bak20180708} 2 <!更改配置文件內容> 3 # systemctl start haproxy && systemctl enable haproxy
c、配置httpd服務,須要更改監聽端口配置;結合後面須要鏈接數據庫,須要使用腳本鏈接數據庫,須要開放cgi-bin配置
更改配置文件前,備份原始配置文件;更改監聽端口,放開cgi-bin配置內容
1 # cp /etc/httpd/conf/httpd.conf{,.bak20180708} 2 <!更改配置文件內容> 3 # cat /etc/httpd/conf/httpd.conf | egrep -v '#|^$' 4 ... 5 Listen 8080 6 ... 7 <IfModule alias_module> 8 ScriptAlias /cgi-bin/ "/var/www/cgi-bin/" 9 </IfModule> 10 LoadModule cgid_module modules/mod_cgid.so 11 <Directory "/var/www/cgi-bin"> 12 Options +ExecCGI 13 </Directory> 14 AddHandler cgi-script .cgi .py .sh 15 ... 16 ## 確保配置文件中包含以上內容
啓用服務並設置開機自啓:
1 # systemctl start httpd && systemctl enable httpd
至此,web集羣配置基本完成。
mysql集羣配置最終確認方案爲採用glaera集羣+keepalived+haproxy:
software | mysql01(192.168.0.2) | mysql02(192.168.0.3) | mysql03(192.168.0.4) |
CentOS 7.1.1503 | mysql01 | mysql02 | mysql03 |
MariaDB Galera cluster | mysql01 | mysql02 | mysql03 |
Keepalived(192.168.64.100) | mysql01 | mysql02 | mysql03 |
haproxy | mysql01 | mysql02 | mysql03 |
a、配置galera集羣
配置yum源
----------------------------------------------------------
待續...