通过ansible部署高可用LNAMMKP架构

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介:

主/备模式高可用keepalived+{nginx(proxy)|lvs}

两台主机:httpd+php+Discuz!+phpMyAdmin

一台主机:memcached用来缓存php的session;

一台主机:mysql-server或mariadb-server;


实验规划:

  这里我规划用备用模式高可用两台keepalived+nginx(proxy)服务器作为前端代理,两台主机httpd+php+MariaDB+Discuz作为后端真实机,memcached放在第一台director上用来缓存php的session,最后用一台ansible主机实现对所有主机的部署调用。


ansible主机:172.16.1.7

director1(nginx+keepalived+memcached):172.16.1.10,虚拟ip:172.16.1.100

director2(nginx+keepalived):172.16.1.5

RS1(Apache+php+MariaDB):172.16.1.3

RS2(Apache+php+MariaDB):172.16.1.6


拓扑图如下:

f678443a34ae6ce1cb5a54e507f93c03.png


注意:

  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测试连通性

6bb4ac4811ae5fe63ca0bd7492c87970.png

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

0fa610dbe484dbe2dc0a40427869ac05.png

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

4eec1a9be1a65933ee63635d2a45e53b.png

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

884f0059f4a33875850140a91ce21ae0.png

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

e529bc1acbdb06003731bdf352777a55.png

后端服务器上的配置

3.mkdir /etc/ansible/roles/memcached/{files,tasks,templates,handlers,vars,default} -pv

4.vim /etc/ansible/roles/memcached/tasks/main.yml

8f49696cd9782bab1a422bdf5e5648ad.png

说明:

第二个任务:在本机安装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

9444d57861d8c98730c8a3961f39bd62.png

配置完成

先测试运行一下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] *****************************************************************
ok: [172.16.1.10]
 
TASK [memcached1 :  install  memcached] **************************************************
ok: [172.16.1.10]
 
TASK [memcached1 : start memcached] ****************************************************
changed: [172.16.1.10]
 
PLAY [memcached] ***********************************************************************
 
TASK [Gathering Facts] *****************************************************************
ok: [172.16.1.6]
ok: [172.16.1.3]
 
TASK [memcached :  install  memcached php session] ***************************************
ok: [172.16.1.3]
ok: [172.16.1.6]
 
TASK [memcached : transfer php session conf] *******************************************
changed: [172.16.1.3]
changed: [172.16.1.6]
 
TASK [memcached : reload httpd] ********************************************************
changed: [172.16.1.6]
changed: [172.16.1.3]
 
TASK [memcached : copy sessstore  file ] *************************************************
changed: [172.16.1.6]
changed: [172.16.1.3]
 
TASK [memcached : copy discuz  file ] ****************************************************
changed: [172.16.1.6]
changed: [172.16.1.3]
 
TASK [memcached :  tar  discuz] **********************************************************
changed: [172.16.1.6]
changed: [172.16.1.3]
 
PLAY RECAP *****************************************************************************
172.16.1.10                : ok=14   changed=8    unreachable=0    failed=0   
172.16.1.3                 : ok=10   changed=7    unreachable=0    failed=0   
172.16.1.5                 : ok=11   changed=10   unreachable=0    failed=0   
172.16.1.6                 : ok=10   changed=6    unreachable=0    failed=0

测试没问题,查看缓存页面是否成功,显示没问题。

0332779093768825b0180fc91000b779.png

开始运行

ansible-playbook zrs.yml


客户端查看,成功。

eb6a49fe3c0a4967f945773e28aaa494.png679116343fb5e1f8246423294d7d714c.png



本文转自 Runs_ 51CTO博客,原文链接:http://blog.51cto.com/12667170/1981480,如需转载请自行联系原作者

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
17天前
|
负载均衡 应用服务中间件 持续交付
微服务架构下的Web服务器部署
【8月更文第28天】随着互联网应用的不断发展,传统的单体应用架构逐渐显露出其局限性,特别是在可扩展性和维护性方面。为了解决这些问题,微服务架构应运而生。微服务架构通过将应用程序分解成一系列小型、独立的服务来提高系统的灵活性和可维护性。本文将探讨如何在微服务架构中有效部署和管理Web服务器实例,并提供一些实际的代码示例。
51 0
|
18天前
|
存储 Cloud Native 关系型数据库
PolarDB 高可用架构设计与实践
【8月更文第27天】 在现代互联网应用中,数据库作为核心的数据存储层,其稳定性和可靠性尤为重要。阿里云的 PolarDB 作为一款云原生的关系型数据库服务,提供了高可用、高性能和自动化的特性,适用于各种规模的应用。本文将详细介绍 PolarDB 的高可用架构设计,并探讨其实现数据安全性和业务连续性的关键技术。
43 0
|
1天前
|
运维 Cloud Native Devops
云原生架构的崛起与实践云原生架构是一种通过容器化、微服务和DevOps等技术手段,帮助应用系统实现敏捷部署、弹性扩展和高效运维的技术理念。本文将探讨云原生的概念、核心技术以及其在企业中的应用实践,揭示云原生如何成为现代软件开发和运营的主流方式。##
云原生架构是现代IT领域的一场革命,它依托于容器化、微服务和DevOps等核心技术,旨在解决传统架构在应对复杂业务需求时的不足。通过采用云原生方法,企业可以实现敏捷部署、弹性扩展和高效运维,从而大幅提升开发效率和系统可靠性。本文详细阐述了云原生的核心概念、主要技术和实际应用案例,并探讨了企业在实施云原生过程中的挑战与解决方案。无论是正在转型的传统企业,还是寻求创新的互联网企业,云原生都提供了一条实现高效能、高灵活性和高可靠性的技术路径。 ##
9 3
|
8天前
|
缓存 Java 应用服务中间件
随着微服务架构的兴起,Spring Boot凭借其快速开发和易部署的特点,成为构建RESTful API的首选框架
【9月更文挑战第6天】随着微服务架构的兴起,Spring Boot凭借其快速开发和易部署的特点,成为构建RESTful API的首选框架。Nginx作为高性能的HTTP反向代理服务器,常用于前端负载均衡,提升应用的可用性和响应速度。本文详细介绍如何通过合理配置实现Spring Boot与Nginx的高效协同工作,包括负载均衡策略、静态资源缓存、数据压缩传输及Spring Boot内部优化(如线程池配置、缓存策略等)。通过这些方法,开发者可以显著提升系统的整体性能,打造高性能、高可用的Web应用。
32 2
|
15天前
|
运维 监控 关系型数据库
【一文搞懂PGSQL】7. PostgreSQL + repmgr + witness 高可用架构
该文档介绍了如何构建基于PostgreSQL的高可用架构,利用repmgr进行集群管理和故障转移,并引入witness节点增强网络故障检测能力。repmgr是一款轻量级的开源工具,支持一键部署、自动故障转移及分布式节点管理。文档详细描述了环境搭建步骤,包括配置postgresql参数、安装与配置repmgr、注册集群节点以及配置witness节点等。此外,还提供了故障手动与自动切换的方法及常用命令,确保集群稳定运行。
|
29天前
|
数据挖掘 关系型数据库 MySQL
Serverless高可用架构的解决方案体验
Serverless高可用架构的解决方案体验
142 6
|
25天前
|
Java Docker 微服务
微服务架构已成为Java Web开发的新趋势,它通过将应用分解为独立、可部署的服务单元,提升了系统的灵活性与可维护性。
微服务架构已成为Java Web开发的新趋势,它通过将应用分解为独立、可部署的服务单元,提升了系统的灵活性与可维护性。每个服务负责特定功能,通过轻量通信机制协作。利用Spring Boot与Spring Cloud等框架可简化开发流程,支持模块化设计、独立部署、技术多样性和容错性,适应快速迭代的需求。
60 1
|
30天前
|
弹性计算 运维 关系型数据库
Serverless高可用架构解决方案评测
Serverless高可用架构方案提供卓越效能与极简运维体验,支持服务托管、弹性伸缩及按量付费,有效降低成本并优化性能。一键部署快速启动,流程直观,文档详实;但在高级配置与特定场景实践方面指导有限。方案采用双可用区部署确保高可用性,自动故障切换保障服务连续。成本模型按需计费,减轻企业负担。功能上集成监控、日志与负载均衡,简化运维,加速上线。性能方面,秒级弹性伸缩保证资源高效匹配负载。总体而言,此方案竞争力强,特别推荐给初创公司及需灵活应对流量波动的场景。
135 2
|
15天前
|
运维 应用服务中间件 网络安全
自动化运维的新篇章:Ansible在现代IT架构中的应用与实践
【8月更文挑战第30天】随着信息技术的飞速发展,企业对运维效率和可靠性的要求日益增高。传统的手动运维方式已难以应对复杂多变的IT环境,自动化运维因此成为行业新宠。本文将深入探讨Ansible这一流行的自动化工具,如何通过其简洁的配置管理和强大的多节点部署能力,助力现代IT架构实现高效、可靠的运维管理。我们将从Ansible的核心概念入手,逐步解析其在配置管理、任务执行、应用部署等方面的实战应用,并结合代码示例,展示如何利用Ansible简化日常运维工作,提升运维质量和效率。无论你是运维新手还是资深专家,这篇文章都将为你提供宝贵的洞见和实操技巧。
|
19天前
|
JSON API 网络架构
Django 后端架构开发:DRF 高可用API设计与核心源码剖析
Django 后端架构开发:DRF 高可用API设计与核心源码剖析
32 0