一、項目簡介即拓撲圖
本次設計使用keepalived與lvs搭建一個調度器集羣,實現lvs調度器的高可用,當lvs調度器的master宕機後,keepalived會自動切換到backup上。
調度後面的web集羣,實現web集羣的負載均衡,前方調度器會根據lvs算法把服務發給web集羣中的主機去響應。
在web集羣后面搭建數據庫集羣,數據庫設置主主結構,並添加keepalived來實現高可用。
具體拓撲圖以下:php
二、環境準備
機器名稱 IP配置 服務角色 備註
LVS1-master 192.168.4.1
(VIP1:192.168.4.100) 調度器的主服務器 配置keepalived
LVS2-backup 192.168.4.2
(VIP1:192.168.4.100) 調度器的從服務器 配置keepalived
Web1 192.168.4.3 後端web服務器 開啓lnm的web
Web2 192.168.4.4 後端web服務器 開啓lnm的web
db1 192.168.4.5
(VIP2:192.168.4.200) 後端mysql服務器 配置keepalived
db2 192.168.4.6
(VIP2:192.168.4.200) 後端mysql服務器 配置keepalived
三、配置調度服務器
3.1裝包
[root@lvs1 ~]# yum -y install ipvsadm.x86_64
[root@lvs1 ~]# yum -y install keepalived.x86_64
3.2修改keepalived配置文件(主調度器)
1)全局段——設置發送郵件html
global_defs { notification_email { root@localhost } notification_email_from admin@tedu.cn smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id LVS_DEVEL vrrp_skip_check_adv_addr # vrrp_strict vrrp_garp_interval 0 vrrp_gna_interval 0 } 2)定義主從和vip vrrp_instance VI_1 { state MASTER //主調度器 interface eth0 virtual_router_id 51 //虛擬路由ip priority 150 //優先級 advert_int 1 authentication { auth_type PASS auth_pass 1111 //設置密碼 } virtual_ipaddress { 192.168.4.100 //配置vip } } 3)定義調度算法 virtual_server 192.168.4.100 80 { delay_loop 6 lb_algo rr //算法爲輪詢 lb_kind DR //LVS模式爲DR persistence_timeout 50 //50s內相同的客戶機來訪問給相同的web服務器 protocol TCP real_server 192.168.4.3 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } real_server 192.168.4.4 80 { //有幾個web服務器寫幾段 weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } } 3.3配置從服務器 從服務器與主服務器的配置文件類似,因此直接scp一份過去,把從服務器上的配置文件中的MASTER改成BACKUP並把優先級調小。
[root@lvs1 ~]# scp /etc/keepalived/keepalived.conf root@192.168.4.2:/etc/keepalived/
[root@lvs2 ~]# vim /etc/keepalived/keepalived.conf
……
state BACKUP
……
priority 100
……
:wqmysql
四、配置lnp服務器(web) 4.1安裝源碼包nginx
[root@web1 lnmp_soft]# tar -xf nginx-1.12.2.tar.gz
[root@web1 lnmp_soft]# cd nginx-1.12.2/
[root@web1 nginx-1.12.2]# useradd -s /sbin/nologin nginx
[root@web1 nginx-1.12.2]# yum -y install gcc gcc-c++ pcre-devel
[root@web1 nginx-1.12.2]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx //若是報錯,則把須要的包安裝上
[root@web1 nginx-1.12.2]# yum -y install zlib-devel
[root@web1 nginx-1.12.2]# make & make install
[root@web1 sbin]# ln -s /usr/local/nginx/sbin/nginx /sbin/nginx
4.2修改nginx配置文件 root@web1 sbin]# vim /usr/local/nginx/conf/nginx.conf 1)修改最大連接數,增大併發 events { worker_connections 65535; } 2)網站根路徑 location / { root html; index index.php index.html index.htm; } 3)作動靜分離 location ~ \.php$ { root html; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi.conf; } 4)啓動服務:[root@web1 sbin]# nginx -s reload 4.3改ulimit參數支持更大併發 [root@web1 sbin]# ulimit -Hn 100000 //臨時修改 [root@web1 sbin]# ulimit -Sn 100000 [root@web1 sbin]# vim /etc/security/limits.conf //永久修改 * soft nofile 100000 * hard nofile 100000 //最後添加 4.4 安裝php來支持動態解析
[root@web1 sbin]# yum -y install php php-mysql.x86_64
[root@web1 lnmp_soft]# yum -y install php-fpm-5.4.16-42.el7.x86_64.rpm
[root@web1 lnmp_soft]# systemctl restart php-fpm.service
[root@web1 lnmp_soft]# systemctl enable php-fpm.service c++
4.5 配置vip在lo:0網卡上(本機迴環地址) [root@web1 lnmp_soft]# cd /etc/sysconfig/network-scripts/ [root@web1 network-scripts]# cp ifcfg-lo{,:0} [root@web1 network-scripts]# vim ifcfg-lo:0 DEVICE=lo:0 IPADDR=192.168.4.100 NETMASK=255.255.255.255 NETWORK=192.168.4.100 BROADCAST=192.168.4.100 ONBOOT=yes NAME=lo:0 :wq [root@web1 network-scripts]# ifup lo:0 //啓動網卡 [root@web1 network-scripts]# ip addr show lo //查看 4.6 web2上一樣配置(同上) 五、測試一下前面的配置是否正確 1)在web1和web2上寫一個不一樣的頁面 2)在lvs1&lvs2上啓動keepalived服務 [root@lvs1 ~]# systemctl start keepalived.service [root@lvs1 ~]# ipvsadm -Ln //看規則中是否有web1&web2 [root@room9pc01 ~]# firefox http://192.168.4.100 3)把其中一臺web掛掉,看看規則中是否會有變化,且是否有郵件 六、配置db1&db2 6.1安裝配置mysql [root@db1 ~]# tar -xf mysql-5.7.17.tar [root@db1 ~]# yum -y install mysql-community-* [root@db1 ~]# systemctl start mysqld //啓服務 [root@db2 ~]# grep -i password /var/log/mysqld.log //找初始登陸祕密 [root@db2 ~]# mysql -hlocalhost -uroot -p'h:rqUP7PHKqi' mysql> set global validate_password_policy=0; mysql> set global validate_password_length=6; mysql> alter user user() identified by "123456"; [root@db1 ~]# vim /etc/my.cnf …… validate_password_policy=0 validate_password_length=6 log-bin=db2 server_id=5 binlog_format="mixed" relay-log=relay-bin relay-log-index=slave-realy-bin.index auto-increment-increment=2 auto-increment-offset=2 …… 注意:mysql1和mysql只有server-id不一樣和auto-increment-offset不一樣,其餘必須相同。 部分配置項解釋以下: binlog_format= mixed:指定mysql的binlog日誌的格式,mixed是混合模式。 relay-log:開啓中繼日誌功能 relay-log-index:中繼日誌清單 auto-increment-increment= 2:表示自增加字段每次遞增的量,其默認值是1。它的值應設爲整個結構中服務器的總數,本案例用到兩臺服務器,因此值設爲2。 auto-increment-offset= 2:用來設定數據庫中自動增加的起點(即初始值),由於這兩能服務器都設定了一次自動增加值2,因此它們的起點必須得不一樣,這樣才能避免兩臺服務器數據同步時出現主鍵衝突 [root@db2 ~]# systemctl restart mysqld [root@db1 mysql]# mysql -uroot -p123456 mysql> grant replication slave on *.* to repluser@'%' identified by "123456"; mysql> grant all on *.* to admin@'%' identified by "123456"; 6.2 db1&db2互爲主從 mysql> change master to master_host="192.168.4.5",master_user="repluser",master_password="123456",master_log_file="db1.000001",master_log_pos=154; mysql> start slave; mysql> show slave status\G; mysql> change master to master_host="192.168.4.6",master_user="repluser",master_password="123456",master_log_file="db2.000002",master_log_pos=154; mysql> start slave; mysql> show slave status\G; 6.3 db1&db2上部署keepalived 1)安包 [root@db1 network-scripts]# yum -y install keepalived.x86_64 2)修改配置文件 [root@db1 ~]# vim /etc/keepalived/keepalived.conf 全局段——發郵件
global_defs { notification_email { root@localhost } notification_email_from admin@tedu.cn smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id mysql-1 vrrp_skip_check_adv_addr
# vrrp_strict vrrp_garp_interval 0 vrrp_gna_interval 0 }
定義主服務器web
vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 53 priority 150 nopreempt //不搶佔優先權 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.4.200 } }
定義算法和real_server算法
virtual_server 192.168.4.200 3306 { delay_loop 6 lb_algo rr lb_kind DR persistence_timeout 50 protocol TCP real_server 192.168.4.5 3306 {
weight 1
``` //若是mysql宕機了,執行腳本中的內容。sql
TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 3306 //監控健康狀態端口。 } } } 3)把主服務器上的配置文件scp一份到從庫上,只需修改MASTER/優先級和real server的ip便可。並把nopreempt這一行去掉,這個通常只配置在優先級大的上面。 4)啓服務 [root@db2 ~]# systemctl restart keepalived.service 5)看vip是否到這臺主機了。 [root@db1 ~]# ip a s eth0 6.4 db1&db2編寫調度keepalived的腳本 由於keepalived沒有與lvs聯用,因此不會像前面的調度器上調度web同樣,當一臺web掛掉,keepalived會把其從lvs的規則中自動刪除,在這一個db集羣中,只有db1或者db2上的keepalived程序掛掉時,vip纔會從master上跳到backup上。Mysqld掛掉則不會自動跳,這樣啓不到監控調度的做用,因此咱們能夠編寫個腳原本調度。 當監控到db1上3306端口掛掉了,則關閉本機的keepalived服務器。 [root@db1 bin]# mkdir /etc/keepalived/bin [root@db1 bin]# vim mysql.sh #!/bin/bash pkill keepalived /sbin/ifdown eth0 && /sbin/ifup eth0 :wq 6.5 驗證調度keepalived的腳本 在db1上把mysqld服務stop掉,看vip是否跑到db2這臺主機上了。 當數據庫從新起來以後,要把keepalived服務手動啓起來。