1. 程式人生 > 實用技巧 >LVS+keepalived+LNMP架構

LVS+keepalived+LNMP架構

DR模型原理:

客戶端請求負載均衡器,負載均衡器根據排程演算法,從後端realserver叢集中選擇一臺機器,然後更改請求報文MAC地址,將目的MAC地址改為後端伺服器的MAC地址,源MAC改為自己的MAC地址。後端伺服器收到請求報文,然後處理,最後直接響應給客戶端。


注意問題:

1.director和realserver都是同一個網段。
2.director和realserver都配置VIP地址。
3.director和realserver都配置routeaddVIP路由
4.director的vip配置在eth0:0上
5.realserver的vip配置在lo:0上。
6.realserver禁止響應arp資料包。


一:架構圖

wKiom1Z5YgrQ8GdcAAFUO6aJrh8413.png



二:Realserver安裝軟體

192.168.1.119
192.168.1.121


1)nginx-1.6.1.tar.gz安裝

http://yujianglei.blog.51cto.com/7215578/1725587


2)php-5.5.4.tar.gz安裝

A:安裝依賴包

cd/home/mcc/tools
yum-yinstalllibmcrypt-develmhash-devellibxslt-devel\
libjpeglibjpeg-devellibpnglibpng-devel\
freetypefreetype-devellibxml2libxml2-devel\
zlibzlib-develglibcglibc-develglib2glib2-develbzip2\
bzip2-develncursesncurses-develcurlcurl-devel\
e2fsprogse2fsprogs-develkrb5krb5-devellibidn\
libidn-developensslopenssl-develbzip2-devellibcurl-devel


B:安裝第三方依賴包

wgethttp://www.atomicorp.com/installers/atomic
sh./atomic
yuminstallphp-mcryptlibmcryptlibmcrypt-devel-y

C:編譯安裝

./configure\
--prefix=/app/php\
--with-config-file-path=/app/php/etc\
--enable-sockets\
--with-openssl\
--with-mhash\
--with-mysql\
--with-mysqli\
--with-iconv-dir\
--with-freetype-dir\
--with-jpeg-dir\
--with-png-dir\
--with-zlib\
--with-curl\
--with-libxml-dir=/usr\
--enable-xml\
--with-xmlrpc\
--with-bz2\
--enable-fpm\
--enable-zip\
--enable-soap\
--enable-sysvsem\
--enable-inline-optimization\
--with-gd\
--with-gettext\
--with-mcrypt\
--disable-rpath\
--enable-mbstring\
--enable-ftp\
--enable-bcmath\
--enable-shmop\
--enable-pcntl\
--enable-gd-native-ttf\
--without-pear
make&&makeinstall
cpsapi/fpm/init.d.php-fpm/etc/rc.d/init.d/php-fpm
chmod+x/etc/rc.d/init.d/php-fpm
chkconfig--addphp-fpm
chkconfigphp-fpmon
cp/app/php/etc/php-fpm.conf.default/app/php/etc/php-fpm.conf

D:配置php-fpm.conf

pm.max_children=150
pm.start_servers=8
pm.min_spare_servers=5
pm.max_spare_servers=10

E:啟動php-fpm

servicephp-fpmstart

F:配置nginx,整合php環境

兩臺機器nginx配置相同

worker_processes1;
worker_rlimit_nofile655360;
events{
useepoll;
worker_connections1024;
}
http{
includemime.types;
default_typeapplication/octet-stream;
sendfileon;
tcp_nopushon;
tcp_nodelayon;
server_tokensoff;
keepalive_timeout65;
server{
listen80;
server_namelocalhost;
location/{
roothtml;
indexindex.htmlindex.htmindex.php;
}
location~.*\.(html|htm|gif|jpg|jpeg|bmp|ico|txt|js|css)${
roothtml;
expires3d;
}
location~\.php${
roothtml;
fastcgi_pass127.0.0.1:9000;
fastcgi_indexindex.php;
fastcgi_paramSCRIPT_FILENAME$document_root$fastcgi_script_name;
includefastcgi_params;
}
error_page500502503504/50x.html;
location=/50.html{
roothtml;
}
}
}


F:程式碼上線,先上一臺機器,安裝完成後在把安裝完成的discuz包拷貝到另外一臺機器上。

192.168.1.121
cd/app/nginx/html
rz


安裝時:不要用VIP訪問。用192.168.1.121訪問。



三:配置Realserver的LVS功能

啟動指令碼:

#!/bin/bash
#
#chkconfig:-9010
#description:LVSDRRealServer
./etc/rc.d/init.d/functions
VIP=192.168.1.200
case$1in
start)
/sbin/ifconfiglodown
/sbin/ifconfigloup
/sbin/ifconfiglo:0$VIPnetmask255.255.255.255broadcast$VIPup
/sbin/routeadd-host$VIPdevlo:0
echo"1">/proc/sys/net/ipv4/conf/lo/arp_ignore
echo"1">/proc/sys/net/ipv4/conf/all/arp_ignore
echo"2">/proc/sys/net/ipv4/conf/lo/arp_announce
echo"2">/proc/sys/net/ipv4/conf/all/arp_announce
sysctl-p2>&1>/dev/null
echo"RealServerStartOK!"
;;
stop)
/sbin/ifconfiglo:0down
/sbin/routedel$VIP2>&1>/dev/null
echo"0">/proc/sys/net/ipv4/conf/lo/arp_ignore
echo"0">/proc/sys/net/ipv4/conf/all/arp_ignore
echo"0">/proc/sys/net/ipv4/conf/lo/arp_announce
echo"0">/proc/sys/net/ipv4/conf/all/arp_announce
sysctl-p2>&1>/dev/null
echo"RealServerStopOK!"
;;
*)
printf"Usage:$0{start|stop}\n"
exit1
esac

2) 拷貝realserver指令碼到/etc/init.d/

cprealserver/etc/ini.d/

3)使用

serverrealserverstop
serverrealserverstart

4)開啟啟動

chkconfig–addrealserver
chkconfigrealserveron

啟動問題:

[[email protected]mcc]#./realserverstart
error:"net.bridge.bridge-nf-call-ip6tables"isanunknownkey
error:"net.bridge.bridge-nf-call-iptables"isanunknownkey
error:"net.bridge.bridge-nf-call-arptables"isanunknownkey
解決:
modprobebridge
lsmod|grepbridge


四:Director安裝軟體

192.168.1.116
192.168.1.117

安裝ipvsadm-1.24.tar.gz

mkdir/home/mcc/tools
wget-chttp://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.24.tar.gz
ln-s/usr/src/kernels/2.6.*/usr/src/linux
tarxfipvsadm-1.24.tar.gz
cdipvsadm-1.24
make
makeinstall

安裝keepalived-1.2.12.tar.gz

http://yujianglei.blog.51cto.com/7215578/1725586


配置檔案:

192.168.1.116master
192.168.1.117bakcup
主配置檔案:
!ConfigurationFileforkeepalived
global_defs{
notification_email{
[email protected]
}
notification_email_from[email protected]
smtp_serversmtp.163.com
smtp_connect_timeout30
router_idLVS
}
vrrp_instanceVI_1{
stateMASTER
interfaceeth0
virtual_router_id10
priority100
advert_int1
authentication{
auth_typePASS
auth_passjidian123
}
virtual_ipaddress{
192.168.1.200
}
}
virtual_server192.168.1.20080{
delay_loop6
lb_algorr
lb_kindDR
nat_mask255.255.255.0
persistence_timeout50
protocolTCP
real_server192.168.1.12180{
weight1
TCP_CHECK{
connect_timeout10
nb_get_retry3
delay_before_retry3
connect_port80
}
}
real_server192.168.1.11980{
weight1
TCP_CHECK{
connect_timeout10
nb_get_retry3
delay_before_retry3
connect_port80
}
}
}
從配置檔案:
!ConfigurationFileforkeepalived
global_defs{
notification_email{
[email protected]
}
notification_email_from[email protected]
smtp_serversmtp.163.com
smtp_connect_timeout30
router_idLVS
}
vrrp_instanceVI_1{
stateBACKUP
interfaceeth0
virtual_router_id10
priority99
advert_int1
authentication{
auth_typePASS
auth_passjidian123
}
virtual_ipaddress{
192.168.1.200
}
}
virtual_server192.168.1.20080{
delay_loop6
lb_algorr
lb_kindDR
nat_mask255.255.255.0
persistence_timeout50
protocolTCP
real_server192.168.1.12180{
weight1
TCP_CHECK{
connect_timeout10
nb_get_retry3
delay_before_retry3
connect_port80
}
}
real_server192.168.1.11980{
weight1
TCP_CHECK{
connect_timeout10
nb_get_retry3
delay_before_retry3
connect_port80
}
}
}

五:配置Director的LVS功能

啟動指令碼:

#!/bin/bash
#
VIP=192.168.1.200
RIP1=192.168.1.119
RIP2=192.168.1.121
PORT=80
case$1in
start)
/sbin/ifconfigeth0:0$VIPbroadcast$VIPnetmask255.255.255.255up
/sbin/routeadd-host$VIPdeveth0:0
echo"1">/proc/sys/net/ipv4/ip_forward
/sbin/iptables-F
/sbin/ipvsadm-C
/sbin/ipvsadm-A-t$VIP:$PORT-srr
/sbin/ipvsadm-a-t$VIP:$PORT-r$RIP1-g
/sbin/ipvsadm-a-t$VIP:$PORT-r$RIP2-g
touch/var/lock/subsys/director.lock
echo"DirectorStartOK!"
;;
stop)
/sbin/ifconfigeth0:0down
/sbin/ipvsadm-C
echo"0">/proc/sys/net/ipv4/ip_forward
rm-fr/var/lock/subsys/director.lock
echo"DirectorStopOK!"
;;
status)
if[-e/var/lock/subsys/director.lock];then
echo"DirectorisRunning!"
else
echo"DirectorisDown!"
fi
;;
*)
printf"Usage:$0{start|stop}\n"
exit1
esac



一:安裝MySQL需要依賴的包

yuminstallncurses-devel-y

二:建立資料庫啟動賬號

[[email protected]~]#cat/etc/passwd|grepmysql
[[email protected]~]#groupaddmysql
[[email protected]~]#useradd-s/sbin/nologin-gmysql-Mmysql

三:獲取MySQL軟體

dev.mysql.com獲取mysql-5.5.45.tar.gz、cmake-2.8.8.tar.gz

四:上傳MySQL軟體到伺服器

1.建立軟體包目錄

mkdir-p/home/mcc/tools
cd/home/mcc/tools
rz


五:建立MySQL例項的資料檔案目錄和日誌目錄

mkdir-p/mydata55/data
mkdir-p/mydata55/{bin_log,error_log,relay_log}
tree/mydata55

六:建立MySQL例項的安裝檔案目錄

mkdir/app55/mysql-5.5.45-pv



七:安裝MySQL軟體

1.解壓安裝cmake-2.8.8.tar.gz軟體包

tarxfcmake-2.8.8.tar.gz
cdcmake-2.8.8
./configure
gmake
gmakeinstall

2.解壓編譯安裝mysql-5.5.45.tar.gz軟體包

tarxfmysql-5.5.45.tar.gz
cdmysql-5.5.45
cmake.-DCMAKE_INSTALL_PREFIX=/app55/mysql-5.5.45\
-DMYSQL_DATADIR=/mydata55/data\
-DMYSQL_UNIX_ADDR=/mydata55/mysql.sock\
-DDEFAULT_CHARSET=utf8\
-DDEFAULT_COLLATION=utf8_general_ci-DEXTRA_CHARSETS=all\
-DENABLED_LOCAL_INFILE=ON\
-DWITH_INNOBASE_STORAGE_ENGINE=1\
-DWITH_FEDERATED_STORAGE_ENGINE=1\
-DWITH_BLACKHOLE_STORAGE_ENGINE=1\
-DWITHOUT_EXAMPLE_STORAGE_ENGINE=1\
-DWITHOUT_PARTITION_STORAGE_ENGINE=1\
-DWITH_FAST_MUTEXES=1\
-DENABLED_LOCAL_INFILE=1\
-DWITH_READLINE=1\
-DWITH_EMBEDDED_SERVER=1\
-DWITH_DEBUG=0
make&&makeinstall


2.生成不帶版本號的軟連線/app/mysql,即mysql安裝路徑

cd/app55
ln-smysql-5.5.45mysql


八:準備配置檔案

[[email protected]app55]#cp/app55/mysql/support-files/my-small.cnf/etc/my.cnf
cp:overwrite`/etc/my.cnf'?y
vi/etc/my.cnf
[client]
port=3306
socket=/mydata55/mysql.sock
default-character-set=utf8
[mysql]
#No-auto-rehash
default-character-set=utf8
[mysqld]
user=mysql
port=3306
socket=/mydata55/mysql.sock
character-set-server=utf8
basedir=/app55/mysql
datadir=/mydata55/data
open_files_limit=1024
back_log=600
max_connections=800
max_connect_errors=3000
table_cache=614
external-locking=FALSE
max_allowed_packet=8M
sort_buffer_size=1M
join_buffer_size=1M
thread_cache_size=100
thread_concurrency=2
query_cache_size=2M
query_cache_limit=1M
query_cache_min_res_unit=2k
default-storage-engine=InnoDB
#default_table_type=InnoDB
thread_stack=192k
transaction_isolation=READ-COMMITTED
tmp_table_size=2M
max_heap_table_size=2M
long_query_time=1
#log_long_format
log-error=/mydata55/error_log/3306.err
pid-file=/mydata55/3306.pid
#二進位制日誌
log-bin=/mydata55/bin_log/mysql-bin
log-bin-index=/mydata55/bin_log/mysql-bin.index
binlog_format=mixed
relay-log=/mydata55/relay_log/relay-bin
relay-log-info-file=/mydata55/relay_log/relay-log.info
binlog_cache_size=1M
max_binlog_cache_size=1M
max_binlog_size=2M
expire_logs_days=10
#MyISAM引擎
key_buffer_size=16M
read_buffer_size=1M
#read_md_buffer_size=1M
bulk_insert_buffer_size=1M
myisam_sort_buffer_size=1M
myisam_max_sort_file_size=10G
#myisam_max_extra_sort_file_size=10G
myisam_repair_threads=1
myisam_recover
lower_case_table_names=1
skip-name-resolve
slave-skip-errors=1032,1062
replicate-ignore-db=mysql
server-id=1
#InnoDB引擎
innodb_additional_mem_pool_size=4M
innodb_buffer_pool_size=32M
innodb_data_file_path=ibdata1:128M:autoextend
innodb_file_io_threads=4
innodb_thread_concurrency=8
innodb_flush_log_at_trx_commit=2
innodb_log_buffer_size=2M
innodb_log_file_size=4M
innodb_log_files_in_group=3
innodb_max_dirty_pages_pct=90
innodb_lock_wait_timeout=120
innodb_file_per_table=1
[mysqldump]
quick
max_allowed_packet=2M
default-character-set=utf8
[mysqld_safe]
log-error=/mydata55/error_log/3306.err
pid-file=/mydata55/3306.pid
default-character-set=utf8

九:配置環境變數

vi/etc/profile
exportPATH=/app55/mysql/bin:$PATH
source/etc/profile



提示:

在配置環境變數時,一定要將安裝路徑配置在PATH前面,否則系統中萬一存在rpm安裝的mysql。那麼系統就會去尋找/usr/local/bin/下關於mysql的有關命令。


十:更改許可權

chown-Rmysql.mysql/mydata55
chmod-R1777/tmp


十一:初始化資料庫

cd/app55/mysql/scripts
./mysql_install_db--basedir=/app55/mysql--datadir=/mydata55/data--user=mysql

十二:資料庫啟動指令碼

cd/app55/mysql/support-files
cpmysql.server/etc/init.d/mysqld


十三:授權,加密,優化

/etc/init.d/mysqldstart
mysql-uroot-p-e"grantallprivilegeson*.*to[email protected]'localhost'identifiedby'jidian123'withgrantoption"
mysql-uroot-p-e"grantallprivilegeson*.*to[email protected]'%'identifiedby'jidian123'withgrantoption"
mysql-uroot-p-e"flushprivileges;"
mysql-uroot-p-e"dropdatabasetest;"
mysql-uroot-p-e"deletefrommysql.userwhereUser='root'"
mysql-uadmin-p'jidian123'-e"deletefrommysql.userwhereUser=''"
mysql-uadmin-p'jidian123'-e"flushprivileges;"


十三:報錯解決


1、啟動報錯日誌:

1508193:12:24[ERROR]Plugin'InnoDB'initfunctionreturnederror.
1508193:12:24[ERROR]Plugin'InnoDB'registrationasaSTORAGEENGINEfailed.
1508193:12:24[ERROR]Unknown/unsupportedstorageengine:InnoDB
1508193:12:24[ERROR]Aborting

解決方案:

移除資料目錄下的ib_logfile0ib_logfile1
mv/mydata55/data/ib_logfile*/home


重新啟動:

/etc/init.d/mysqldstart


2、匯入報錯日誌

ERROR1665(HY000):Cannotexecutestatement:
impossibletowritetobinarylogsinceBINLOG_FORMAT=STATEMENTandatleastonetableusesastorageenginelimitedtorow-basedlogging.

【報錯原因】

innodb的事務隔離級別是read commited或者read uncommited模式時,binlog不可以使用statement模式。


解決:

setglobalbinlog_format=mixed


轉載於:https://blog.51cto.com/yujianglei/1727378