主/備模式高可用keepalived+{nginx(proxy)|lvs}php
兩臺主機:httpd+php+Discuz!+phpMyAdminhtml
一臺主機:memcached用來緩存php的session;前端
一臺主機:mysql-server或mariadb-server;node
實驗規劃:mysql
這裏我規劃用備用模式高可用兩臺keepalived+nginx(proxy)服務器做爲前端代理,兩臺主機httpd+php+MariaDB+Discuz做爲後端真實機,memcached放在第一臺director上用來緩存php的session,最後用一臺ansible主機實現對全部主機的部署調用。linux
ansible主機:172.16.1.7nginx
director1(nginx+keepalived+memcached):172.16.1.10,虛擬ip:172.16.1.100web
director2(nginx+keepalived):172.16.1.5sql
RS1(Apache+php+MariaDB):172.16.1.3數據庫
RS2(Apache+php+MariaDB):172.16.1.6
拓撲圖以下:
注意:
1.把全部節點的防火牆和SElinux關閉,避免對實驗干擾。
2.同步全部節點的時間。
當部署完全部的應用後,生成以下因此的文件和子文件。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
[root@zj07 ansible]
# tree
.
├── ansible.cfg
├── files
│ └── nginx.conf
├── hosts
├── playbooks
│ ├── amp.yml
│ ├── first.retry
│ ├── first.yml
│ ├── ngx.retry
│ └── ngx.yml
├── roles
│ ├── amp
│ │ ├── default
│ │ ├── files
│ │ │ └── db.sh
│ │ ├── handlers
│ │ ├── tasks
│ │ │ └── main.yml
│ │ ├── templates
│ │ └── vars
│ ├── keepalived
│ │ ├── default
│ │ ├── files
│ │ ├── handlers
│ │ │ └── main.yml
│ │ ├── tasks
│ │ │ └── main.yml
│ │ ├── templates
│ │ │ └── keepalived.conf.j2
│ │ └── vars
│ ├── memcached
│ │ ├── default
│ │ ├── files
│ │ │ └── Discuz_X3.2_SC_UTF8.zip
│ │ ├── handlers
│ │ │ └── main.yml
│ │ ├── tasks
│ │ │ └── main.yml
│ │ ├── templates
│ │ │ ├── php.ini.j2
│ │ │ └── sessstore.php.j2
│ │ └── vars
│ ├── memcached1
│ │ ├── default
│ │ ├── files
│ │ ├── handlers
│ │ ├── tasks
│ │ │ └── main.yml
│ │ ├── templates
│ │ └── vars
│ └── nginx
│ ├── default
│ ├── files
│ │ ├── default.conf.j2
│ │ └── ip_forward.sh
│ ├── handlers
│ │ └── main.yml
│ ├── tasks
│ │ └── main.yml
│ ├── templates
│ │ ├── nginx.conf.j2
│ │ └── nginx.repo.j2
│ └── vars
├── zrs.retry
└── zrs.yml
36 directories, 29 files
|
下面開始部署
-------------------------------------------------------------------------------------------
配置ansible主機
1.yum -y install ansible
2.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
vim
/etc/ansible/hosts
[knsrvs]
172.16.1.10 STATE=MASTER PRI=100
172.16.1.5 STATE=BACKUP PRI=98
[websrvs]
172.16.1.3
172.16.1.6
[memcached1]
172.16.1.10
[memcached]
172.16.1.3
172.16.1.6
|
3.創建免祕鑰登錄,發給因此主機
ssh-keygen -t rsa -f .ssh/id_rsa -P ''
ssh-copy-id -i .ssh/id_rsa.pub root@172.16.1.10
ssh-copy-id -i .ssh/id_rsa.pub root@172.16.1.5
ssh-copy-id -i .ssh/id_rsa.pub root@172.16.1.3
ssh-copy-id -i .ssh/id_rsa.pub root@172.16.1.6
ansible all -m ping測試連通性
4.在ansible主機上安裝nginx和keepalived和php-fpm,以便ansible過程當中須要使用其配置文件
-------------------------------------------------------------------------------------------
keepalived配置
1.mkdir /etc/ansible/roles/keepalived/{files,tasks,templates,handlers,vars,default} -pv
2.vim /etc/ansible/roles/keepalived/tasks/main.yml
3.vim /etc/ansible/roles/keepalived/handlers/main.yml
1
2
|
- name: restart keepalived server
service: name=keepalived state=restarted
|
4.複製剛纔安裝的keepalived主配置文件到指定目錄,並修改以下
vim /etc/ansible/roles/keepalived/template/keepalived.conf.j2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
! Configuration File
for
keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id node1
vrrp_mcast_group4 224.0.43.100
}
vrrp_script ngx_server {
script
"killal -0 nginx"
interval 1
weight -5
}
vrrp_instance VI_1 {
state {{ STATE }}
interface eno16777736
virtual_router_id 43
priority {{ PRI }}
advert_int 1
track_script ngx_server
authentication {
auth_type PASS
auth_pass zrs66zrs
}
virtual_ipaddress {
172.16.1.100
/32
brd 172.16.1.100 dev eno16777736 label eno16777736:0
}
}
|
-------------------------------------------------------------------------------------------
nginx的配置:
1.mkdir /etc/ansible/roles/nginx/{files,tasks,templates,handlers,vars,default} -pv
2.vim /etc/ansible/roles/nginx/tasks/main.yml
3.vim /etc/ansible/roles/nginx/templates/nginx.repo.j2
1
2
3
4
5
|
[nginx]
name=nginx repo
baseurl=http:
//nginx
.org
/packages/centos/7/
$basearch/
gpgcheck=0
enabled=1
|
複製剛纔安裝的nginx主配置文件到指定目錄,並修改以下
vim /etc/ansible/roles/nginx/templates/nginx.conf.j2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
user nginx;
worker_processes 1;
error_log
/var/log/nginx/error
.log warn;
pid
/var/run/nginx
.pid;
events {
worker_connections 1024;
}
http {
include
/etc/nginx/mime
.types;
default_type application
/octet-stream
;
log_format main
'$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"'
;
access_log
/var/log/nginx/access
.log main;
upstream amp {
server 172.16.1.3;
server 172.16.1.6;
}
server {
listen 80;
location / {
proxy_pass http:
//amp
;
proxy_set_header X-Real-IP $remote_addr;
}
}
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include
/etc/nginx/conf
.d/*.conf;
}
|
4.複製剛纔安裝的nginx主配置文件到指定目錄,並修改以下
vim /etc/ansible/roles/nginx/files/default.conf.j2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
server {
listen 80 default_server;
server_name localhost;
include
/etc/nginx/default
.d/*.conf;
location / {
root
/usr/share/nginx/html
;
proxy_pass http:
//amp
;
index index.html index.htm;
}
error_page 404
/404
.html;
location =
/404
.html {
root
/usr/share/nginx/html
;
}
error_page 500 502 503 504
/50x
.html;
location =
/50x
.html {
root
/usr/share/nginx/html
;
}
}
|
5.建立ip_forward腳本,開啓前端代理服務器的核心轉發功能
vim /etc/ansible/roles/nginx/files/ip_forward.sh
1
2
3
|
#!/bin/bash
#
echo
> 1
/proc/sys/net/ipv4/ip_forward
|
-------------------------------------------------------------------------------------------
amp的配置:
1.mkdir /etc/ansible/roles/amp/{files,tasks,templates,handlers,vars,default} -pv
2.vim /etc/ansible/roles/amp/tasks/main.yml
3.建立testdb數據庫,和受權用戶訪問
vim /etc/ansible/roles/amp/files/db.sh
1
2
3
4
5
6
|
#!/bin/bash
#
mysql -u root -e "
create database testdb;
grant all on testdb.* TO
'testuser'
@
'localhost'
IDENTIFIED BY
'123456'
;
FLUSH PRIVILEGES;"
|
-------------------------------------------------------------------------------------------
memcached配置
memcached緩存服務器爲第一臺調度器即172.16.1.10服務器,因此單獨配置爲memcached1
1.mkdir /etc/ansible/roles/memcached1/{files,tasks,templates,handlers,vars,default} -pv
2.vim /etc/ansible/roles/memcached1/tasks/main.yml
後端服務器上的配置
3.mkdir /etc/ansible/roles/memcached/{files,tasks,templates,handlers,vars,default} -pv
4.vim /etc/ansible/roles/memcached/tasks/main.yml
說明:
第二個任務:在本機安裝php-fpm便可出現並修改/etc/php.ini該配置文件中的[Session]段中的緩存路徑爲以下,
session.save_handler = memcache
session.save_handler = "tcp://172.16.1.10:11211"
第四個任務:是創建一個緩存測試頁面
vim /etc/ansible/roles/memcached/templates/sessstore.php
1
2
3
4
5
6
7
8
9
10
|
<?php
$mem = new Memcache;
$mem->connect(
"172.16.1.10"
, 11211) or die(
"Could not connect"
);
$version = $mem->getVersion();
echo
"Server's version: "
.$version.
"<br/>\n"
;
$mem->
set
(
'hellokey'
,
'Hello World'
, 0, 600) or die(
"Failed to save data at the memcached server"
);
echo
"Store data in the cache (data will expire in 600 seconds)<br/>\n"
;
$get_result = $mem->get(
'hellokey'
);
echo
"$get_result is from memcached server."
;
?>
|
第五個任務:將Discuz安裝包放置在該目錄下,傳送到後端主機的指定目錄。
第六個任務:解壓該壓縮包並賦予制定用戶的權限
-------------------------------------------------------------------------------------------
建立主配置文件,而且調用roles:
vim /etc/ansible/zrs.yml
配置完成
先測試運行一下ansible-playbook --check zrs.yml,由於有的主機已經安裝了某些軟件,因此測試顯示的是changed或者ok或者skipping
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
|
[root@zj07 ansible]
# ansible-playbook --check zrs.yml
PLAY [knsrvs] **************************************************************************
TASK [Gathering Facts] *****************************************************************
ok: [172.16.1.10]
ok: [172.16.1.5]
TASK [keepalived :
install
keepalived] *************************************************
changed: [172.16.1.5]
changed: [172.16.1.10]
TASK [keepalived :
install
conf
file
] **************************************************
changed: [172.16.1.10]
changed: [172.16.1.5]
TASK [keepalived : start keepalived] ***************************************************
changed: [172.16.1.10]
changed: [172.16.1.5]
TASK [nginx : copy nginx repo] *********************************************************
changed: [172.16.1.5]
ok: [172.16.1.10]
TASK [nginx :
install
nginx] ***********************************************************
ok: [172.16.1.10]
changed: [172.16.1.5]
TASK [nginx : copy conf
file
] **********************************************************
changed: [172.16.1.10]
changed: [172.16.1.5]
TASK [nginx : reload nginx] ************************************************************
changed: [172.16.1.10]
changed: [172.16.1.5]
TASK [nginx : start nginx] *************************************************************
changed: [172.16.1.5]
ok: [172.16.1.10]
TASK [nginx : ip_forward] **************************************************************
changed: [172.16.1.5]
changed: [172.16.1.10]
RUNNING HANDLER [keepalived : restart keepalived server] *******************************
changed: [172.16.1.5]
changed: [172.16.1.10]
PLAY [websrvs] *************************************************************************
TASK [Gathering Facts] *****************************************************************
ok: [172.16.1.6]
ok: [172.16.1.3]
TASK [amp :
install
apache-php-mysql some package on CentOS 6] *************************
skipping: [172.16.1.3] => (item=[])
skipping: [172.16.1.6] => (item=[])
TASK [amp :
install
apache-php-mysql some package on CentOS 7] *************************
ok: [172.16.1.6] => (item=[u
'httpd'
, u
'mariadb-server'
, u
'php-fpm'
, u
'php-mysql'
])
changed: [172.16.1.3] => (item=[u
'httpd'
, u
'mariadb-server'
, u
'php-fpm'
, u
'php-mysql'
])
TASK [amp : start apm server] **********************************************************
skipping: [172.16.1.3] => (item=httpd)
skipping: [172.16.1.3] => (item=mysqld)
skipping: [172.16.1.6] => (item=httpd)
skipping: [172.16.1.6] => (item=mysqld)
TASK [amp : start apm server] **********************************************************
changed: [172.16.1.6] => (item=httpd)
changed: [172.16.1.3] => (item=httpd)
changed: [172.16.1.6] => (item=mariadb)
changed: [172.16.1.3] => (item=mariadb)
PLAY [memcached1] **********************************************************************
TASK [Gathering Facts] *****************************************************************
|