部署 Keepalived+LAMP+MHA 群集
- 一、準備作業
- 1.專案拓補圖
- 2.專案環境
- 二、部署 MySQL 資料庫
- 1.配置免密登陸
- 2.安裝 MHA 軟體包
- 1)在各節點上安裝 mha4mysql-node
- 2)在 master 上安裝 manager 節點
- 3.配置主從復制
- 1)主服務器上配置
- 2)從服務器上配置
- 3)建立主從復制
- 4.設定 MySQL 程式及 binglog 程式的軟連接
- 5.在兩臺 Slave 設定臨時只讀和不自動清除中繼日志
- 6.配置 MHA 作業目錄及組態檔
- 7.檢查 MHA 的環境是否作業正常
- 1)檢測 SSH 連接是否配置正常
- 2)在管理節點檢查復制配置
- 9.配置 VIP 地址
- 1)修改 MHA 組態檔,使其支持 VIP
- 2)撰寫 VIP 自動切換腳本
- 10.開啟監控
- 三、部署 Apahce+PHP 架構
- 1.安裝并啟動 Apache
- 2.安裝PHP
- 3.配置PHP,測驗后端資料庫VIP
- 1)創建測驗頁面
- 2)訪問驗證
- 4.安裝 Discuz 論壇
- 1)在 Master 上創建一個 Discuz 論壇賬號
- 2)在 Web1 上創建測驗頁面
- 3)訪問測驗
- 4)安裝 Discuz 論壇
- 5)在瀏覽器上安裝 Discuz 論壇
- 四、部署 Keepliaved 雙機熱備
- 1.配置主和備調度器
- 3.配置 Web 節點的內核引數
- 4.訪問驗證
- 五、故障切換 Keepaliaved 和 MHA
一、準備作業
1.專案拓補圖

2.專案環境
| 主機名 | 作業系統 | IP地址 | 擔任角色 |
| master | CentOS7 | 192.168.1.1 | MySQL-Master,MHA管理端 |
| slave1 | 192.168.1.2 | MySQL-Slave1 | |
| slave2 | 192.168.1.3 | MySQL-Slave2 | |
| web1 | 192.168.1.4 | Apache,PHP,Discuz | |
| web2 | 192.168.1.5 | Apache,PHP,Discuz | |
| keep1 | 192.168.1.6 | Keepalived-主調度器 | |
| keep2 | 192.168.1.7 | Keepalived-備調度器 |
二、部署 MySQL 資料庫
- 如果未安裝 MySQL 資料庫 需看:Centos7安裝Mysql資料庫 來進行安裝,
- MHA 軟體包從這個鏈接下載:https://pan.baidu.com/s/1c39hxF-beUxu9Cl_OaZSuQ
- 提取碼:whwo
1.配置免密登陸
- 在 master,slave1,slave2 上分別生成密鑰對,
[root@master ~]# ssh-keygen -t rsa #一路回車即可
- 每臺節點分別將自己的公鑰發送到另外的三臺節點,(下面以 master 主機為例)
[root@master ~]# ssh-copy-id 192.168.1.2
[root@master ~]# ssh-copy-id 192.168.1.3
2.安裝 MHA 軟體包
準備作業:master slave1 slave2 都要做
[root@master ~]# mkdir /root/mha
[root@master ~]# cd /root/mha
[root@master mha]# ls
mha4mysql-manager-0.57-0.el7.noarch.rpm mhapath.tar.gz mha4mysql-node-0.57-0.el7.noarch.rpm
[root@master mha]# tar zxf mhapath.tar.gz
[root@master mha]# cat <<END > /etc/yum.repos.d/CentOS7.repo
[centos]
name=centos7
baseurl=file:///mnt
enabled=1
gpgcheck=0
[mha]
name=mha
baseurl=file:///root/mha/mhapath
enabled=1
gpgcheck=0
END
[root@master mha]# mount /dev/cdrom /mnt/

1)在各節點上安裝 mha4mysql-node
[root@master ~]# yum -y install perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager --skip-broken --nogpgcheck
[root@master ~]# rpm -ivh /root/mha/mha4mysql-node-0.57-0.el7.noarch.rpm

2)在 master 上安裝 manager 節點
[root@master ~]# yum -y install perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker perl-CPAN
[root@master ~]# rpm -ivh /root/mha/mha4mysql-manager-0.57-0.el7.noarch.rpm

3.配置主從復制
1)主服務器上配置
[root@master ~]# cat <<END >> /etc/my.cnf
log-bin=mysql-bin-master
server-id=1
END
[root@master ~]# systemctl restart mysqld
[root@master ~]# mysql -uroot -p123456
mysql> grant replication slave on *.* to repl@'192.168.1.%' identified by '123456';
mysql> grant all privileges on *.* to root@'192.168.1.%' identified by '123456';
mysql> flush privileges;
mysql> exit

2)從服務器上配置
兩臺從節點操作一致
[root@slave1 ~]# cat <<END >> /etc/my.cnf
log-bin=mysql-slave1 #slave2改為2
server-id=2 #slave2改為3
log_slave_updates=1
END
[root@slave1 ~]# systemctl restart mysqld
[root@slave1 ~]# mysql -uroot -p123456
mysql> grant replication slave on *.* to repl@'192.168.1.%' identified by '123456';
mysql> grant all privileges on *.* to root@'192.168.1.%' identified by '123456';
mysql> flush privileges;
mysql> exit

3)建立主從復制
在 slave1 slave2 上操作
[root@slave1 ~]# mysql -uroot -p123456
mysql> change master to
master_host='192.168.1.1',
master_user='repl',
master_password='123456';
mysql> start slave;
mysql> show slave status\G;

4.設定 MySQL 程式及 binglog 程式的軟連接
master和兩臺從節點都要做
[root@master ~]# ln -s /usr/local/mysql/bin/mysql /usr/bin/mysql
[root@master ~]# ln -s /usr/local/mysql/bin/mysqlbinlog /usr/local/bin/mysqlbinlog
5.在兩臺 Slave 設定臨時只讀和不自動清除中繼日志
[root@slave1 ~]# mysql -uroot -p123456 -e 'set global read_only=1'
[root@slave1 ~]# mysql -uroot -p123456 -e 'set global relay_log_purge=0'
6.配置 MHA 作業目錄及組態檔
[root@master ~]# mkdir -p /etc/masterha
[root@master ~]# mkdir -p /var/log/masterha/app1
[root@master ~]# vim /etc/masterha/app1.cnf
[server default]
manager_workdir=/var/log/masterha/app1
manager_log=/var/log/masterha/app1/manager.log
master_binlog_dir=/usr/local/mysql/data/
user=root
password=123456
ping_interval=1
remote_workdir=/tmp
repl_user=repl
repl_password=123456
ssh_user=root
[server1]
hostname=192.168.1.1
port=3306
[server2]
hostname=192.168.1.2
port=3306
candidate_master=1
check_repl_delay=0
[server3]
hostname=192.168.1.3
port=3306
7.檢查 MHA 的環境是否作業正常
1)檢測 SSH 連接是否配置正常
[root@master ~]# masterha_check_ssh --conf=/etc/masterha/app1.cnf

2)在管理節點檢查復制配置
[root@master ~]# masterha_check_repl --conf=/etc/masterha/app1.cnf
最后顯示如下說明環境沒有問題:
MySQL Replication Health is OK.

9.配置 VIP 地址
master 上操作
[root@master ~]# ifconfig ens33:1 192.168.1.188 netmask 255.255.255.0 up
[root@master ~]# ifconfig ens33:1

1)修改 MHA 組態檔,使其支持 VIP
[root@master ~]# vim /etc/masterha/app1.cnf
在 [server default] 項下面添加:
master_ip_failover_script=/usr/bin/master_ip_failover
2)撰寫 VIP 自動切換腳本
[root@master ~]# vim /usr/bin/master_ip_failover
#!/usr/bin/env perl
use strict;
use warnings FATAL => 'all';
use Getopt::Long;
my (
$command, $ssh_user, $orig_master_host, $orig_master_ip,
$orig_master_port, $new_master_host, $new_master_ip, $new_master_port
);
my $vip = '192.168.1.188/24';
my $key = '1';
my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";
GetOptions(
'command=s' => \$command,
'ssh_user=s' => \$ssh_user,
'orig_master_host=s' => \$orig_master_host,
'orig_master_ip=s' => \$orig_master_ip,
'orig_master_port=i' => \$orig_master_port,
'new_master_host=s' => \$new_master_host,
'new_master_ip=s' => \$new_master_ip,
'new_master_port=i' => \$new_master_port,
);
exit &main();
sub main {
print "\n\nIN SCRIPT TEST====$ssh_stop_vip==$ssh_start_vip===\n\n";
if ( $command eq "stop" || $command eq "stopssh" ) {
my $exit_code = 1;
eval {
print "Disabling the VIP on old master: $orig_master_host \n";
&stop_vip();
$exit_code = 0;
};
if ($@) {
warn "Got Error: $@\n";
exit $exit_code;
}
exit $exit_code;
}
elsif ( $command eq "start" ) {
my $exit_code = 10;
eval {
print "Enabling the VIP - $vip on the new master - $new_master_host \n";
&start_vip();
$exit_code = 0;
};
if ($@) {
warn $@;
exit $exit_code;
}
exit $exit_code;
}
elsif ( $command eq "status" ) {
print "Checking the Status of the script.. OK \n";
exit 0;
}
else {
&usage();
exit 1;
}
}
sub start_vip() {
`ssh $ssh_user\@$new_master_host \" $ssh_start_vip \"`;
}
sub stop_vip() {
`ssh $ssh_user\@$orig_master_host \" $ssh_stop_vip \"`;
}
sub usage {
print
"Usage: master_ip_failover --command=start|stop|stopssh|status --orig_master_host=host --orig_master_ip=ip --orig_master_port=port --new_master_host=host --new_master_ip=ip --new_master_port=port\n";
}
[root@master ~]# chmod +x /usr/bin/master_ip_failover
再次檢測,結果應該和上面檢測結果一樣才對
[root@master ~]# masterha_check_repl --conf=/etc/masterha/app1.cnf

10.開啟監控
[root@master ~]# nohup masterha_manager --conf=/etc/masterha/app1.cnf \
--remove_dead_master_conf --ignore_last_failover < /dev/null > \
/var/log/masterha/app1/manager.log 2>&1 &
[root@master ~]# masterha_check_status --conf=/etc/masterha/app1.cnf

三、部署 Apahce+PHP 架構
掛光碟,并配置yum源
- Apache+PHP 軟體包從這個鏈接下載:https://pan.baidu.com/s/13XBKIFTSrVlZ106nWGNVjw
- 提取碼:l9we
1.安裝并啟動 Apache
[root@web1 ~]# yum -y install gcc gcc-c++ apr apr-devel cyrus-sasl-devel expat-devel libdb-devel openldap-devel apr-util-devel apr-util pcre-devel pcre openssl*
[root@web1 ~]# ls
anaconda-ks.cfg httpd-2.4.25.tar.gz
[root@web1 ~]# tar zxf httpd-2.4.25.tar.gz -C /usr/src/
[root@web1 ~]# cd /usr/src/httpd-2.4.25/
[root@web1 httpd-2.4.25]# ./configure \
--prefix=/usr/local/httpd \
--enable-so \
--enable-rewrite \
--enable-charset-lite \
--enable-cgi \
--enable-ssl \
--enable-mpms-shared=all && make && make install

復制啟動腳本
[root@web1~]# cp /usr/local/httpd/bin/apachectl /etc/init.d/apache
[root@web1 ~]# vim /etc/init.d/apache
在 #!/bin/bash 下面添加:
#chkconfig: 2345 11 88
#despriction:httpd apache server
[root@web1 ~]# chkconfig --add apache
[root@web1 ~]# vim /usr/local/httpd/conf/httpd.conf
204 ServerName web1:80 #web2將 web1:80 改為 web2:80
[root@web2 ~]# /etc/init.d/apache start
[root@web2 ~]# netstat -anpt | grep 80

2.安裝PHP
[root@web1 ~]# yum -y install php-mcrypt libmcrypt libmcrypt-devel autoconf freetype gd libmcrypt libpng libpng-devel libjpeg libxml2 libxml2-devel zlib curl curl-devel re2c libmcrypt-devel freetype-devel libjpeg-devel bzip2-devel
[root@web1 ~]# ls
anaconda-ks.cfg httpd-2.4.25.tar.gz libmcrypt-2.5.8.tar.gz php-5.5.38.tar.gz
[root@web1 ~]# tar zxf libmcrypt-2.5.8.tar.gz -C /usr/src/
[root@web1 ~]# cd /usr/src/libmcrypt-2.5.8/
[root@web1 libmcrypt-2.5.8]# ./configure --prefix=/usr/local/libmcrypt && make && make install

[root@web1 ~]# tar -zxf php-5.5.38.tar.gz -C /usr/src/
[root@web1 ~]# cd /usr/src/php-5.5.38
[root@web1 php-5.5.38]# ./configure \
--prefix=/usr/local/php5.5 \
--with-mysql=mysqlnd \
--with-pdo-mysql=mysqlnd \
--with-mysqli=mysqlnd \
--with-openssl \
--enable-fpm \
--enable-sockets \
--enable-sysvshm \
--enable-mbstring \
--with-freetype-dir \
--with-jpeg-dir \
--with-png-dir \
--with-zlib \
--with-libxml-dir=/usr \
--enable-xml --with-mhash \
--with-mcrypt=/usr/local/libmcrypt \
--with-config-file-path=/etc \
--with-config-file-scan-dir=/usr/local/php5.5/etc/ \
--with-bz2 \
--enable-maintainer-zts \
--with-apxs2=/usr/local/httpd/bin/apxs && make && make install
[root@web1 php-5.5.38]# cp php.ini-production /usr/local/php5.5/etc/php.ini
3.配置PHP,測驗后端資料庫VIP
[root@web1 ~]# vim /usr/local/httpd/conf/httpd.conf
263 DirectoryIndex index.html index.php
401 AddType application/x-http-php .php .phtml
[root@web1 ~]# /etc/init.d/apache restart
1)創建測驗頁面
[root@web1 ~]# vim /usr/local/httpd/htdocs/index.php
<?php
phpinfo();
?>
[root@web1 ~]# /etc/init.d/apache restart
2)訪問驗證

4.安裝 Discuz 論壇
1)在 Master 上創建一個 Discuz 論壇賬號
mysql> grant all on *.* to dtest@'%' identified by '123456';
mysql> flush privileges;

2)在 Web1 上創建測驗頁面
[root@web1 ~]# vim /usr/local/httpd/htdocs/test.php
<?php
$link=mysql_connect('192.168.1.188','dtest','123456');
if ($link)echo "恭喜你,資料庫連接成功!!";
mysql_close();
?>
3)訪問測驗

4)安裝 Discuz 論壇
web1上操作
[root@web1 ~]# ls
[root@web1 ~]# unzip Discuz_X3.3_SC_UTF8.zip -d discuz
[root@web1 ~]# cd discuz/
[root@web1 discuz]# cp -r upload/ /usr/local/httpd/htdocs/discuz
[root@web1 discuz]# vim /usr/local/php5.5/etc/php.ini
202 short_open_tag = 0n
[root@web1 discuz]# /etc/init.d/apache restart
[root@web1 discuz]# chown -R daemon:daemon /usr/local/httpd/htdocs/
5)在瀏覽器上安裝 Discuz 論壇
訪問:http://192.168.1.4/discuz/install/index.php

繼續下一步,到我如下,按我下圖填寫

安裝完成后點擊右下角的訪問

因為 Web1 上都已經安裝好了,這里直接把 Web1 安裝好的 Discuz,傳給 Web2
[root@web1 ~]# scp -r /usr/local/httpd/ 192.168.1.5:/usr/local/
[root@web2 ~]# /etc/init.d/apache restart
[root@web2 ~]# chown -R daemon:daemon /usr/local/httpd/htdocs/
訪問并測驗資料一致性


到 Web1 的論壇中,登陸 zhangsan 賬號,可以登陸

這是因為兩個 Discuz 后端的資料庫都是一個,資料都是在資料庫中的,所以其中資料都是一樣的,
四、部署 Keepliaved 雙機熱備
掛光碟,并配置yum源
1.配置主和備調度器
主備操作稍微不同,不同的地方下面我會說
[root@keep1 ~]# yum -y install ipvsadm keepalived
[root@keep1 ~]# cd /etc/keepalived/
[root@keep1 keepalived]# rm -rf keepalived.conf
[root@keep1 keepalived]# vim keepalived.conf
global_defs {
router_id master
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.211
}
}
virtual_server 192.168.1.211 80 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 0
protocol TCP
real_server 192.168.1.4 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.1.5 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
備調度器需要做以下修改:
將 router_id master 改為 router_id backup
將 state MASTER 修改為 state BACKUP
將 priority 100 修改為 priority 99
[root@keep1 keepalived]# systemctl start keepalived
3.配置 Web 節點的內核引數
Web1,Web2節點操作一致
[root@web1 ~]# vim /root/vip.sh
#!/bin/sh
VIP=192.168.1.211
case $1 in
start)
ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP
/sbin/route add -host $VIP dev lo:0
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
sysctl -p >/dev/null 2>&1
echo "RealServer Start OK"
exit 0
;;
stop)
ifconfig lo:0 down
route del $VIP >/dev/null 2>&1
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
echo "RealServer Stoped OK"
exit 1
;;
*)
echo "Usage: $0 {start|stop}"
;;
esac
[root@web1 ~]# chmod +x /root/vip.sh
[root@web1 ~]# cd /root/
[root@web1 ~]# ./vip.sh start
4.訪問驗證
通過 VIP 的地址訪問 Discuz 論壇:

測驗和后端 MySQL 通信:
右上角登陸,登陸剛剛創建的 zhangsan 用戶,可以登陸上去

通過查看日志,來查看是否輪詢
web1
[root@web1 ~]# tail -f /usr/local/httpd/logs/access_log
web2
[root@web2 ~]# tail -f /usr/local/httpd/logs/access_log
只要重繪頁面一次,那個符號應該在 Web1 和 Web2 中變動,表示那個終端有變動

五、故障切換 Keepaliaved 和 MHA
[root@master ~]# systemctl stop mysqld
[root@keep1 ~]# systemctl stop keepalived #如果關閉后VIP還未漂移,關機該機器即可
Keepalived VIP漂移了

查看 Manager 日志
[root@master ~]# tail -n10 /var/log/masterha/app1/manager.log

在 192.168.1.2 主機中查看 MHA VIP 是否漂移

訪問測驗

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/242319.html
標籤:其他
