Lamp架构扩展2

Lamp架构扩展2

实现互联网架构LAMP

Client1台,访问站点www.mylinuxops.com
PowerDNS服务器1台,对用户访问的网址做域名解析
apache+php服务器2台,分担访问压力
NFS-Sever服务器1台,存放站点动态和静态页面
NFS-backup服务器1台,实时备份NFS主机上站点数据
ProxySQL服务器1台,对背后数据库服务器进行读写分离
MySQL-Maser,主数据库服务器1台,接受对数据库写请求,向后端从服务器同步数据
MySQL-slave{1,2},从数据库服务器2台,接受对数据库读请求
Lamp架构扩展2

主机地址分配

主机 主机名 系统 IP
Client localhost Fedora 30 192.168.73.153
PowerDNS pdns CentOS7 192.168.73.100
apache+php(1) httpd1 CentOS7 192.168.73.110
apache+php(2) httpd2 CentOS7 192.168.73.111
NFS-Sever nfs CentOS7 192.168.73.120
NFS-backup backup CentOS7 192.168.73.121
ProxySQL proxysql CentOS7 192.168.73.130
MySQL-Master master CentOS7 192.168.73.131
MySQL-Slave1 slave1 CentOS7 192.168.73.132
MySQL-Slave2 slave2 CentOS7 192.168.73.133

搭建网络拓扑图所示LAMP环境

1.搭建PowerDNS

搭建LAMP

安装amp

[root@pdns ~]# yum install httpd php php-mysql mariadb-server -y

创建PHP测试页

[root@pdns ~]# vim /var/www/html/index.php
<?php
$dsn='mysql:host=localhost;dbname=test';
$username='root'; $passwd='';
$dbh=new PDO($dsn,$username,$passwd);
var_dump($dbh);
phpinfo();
?>

启动服务

[root@pdns ~]# systemctl start httpd mariadb 

测试
Lamp架构扩展2

安装PowerDNS

1.安装powerNDS,依赖于EPEL源

[root@pdns ~]# yum install pdns pdns-backend-mysql -y

2.在MySQL中为powerdns创建数据库、表和用户
导入事先准备的数据库文件

[root@pdns ~]# mysql < pdns.sql 

3.配置PowerDNS使用MySQL作为后台数据存储

[root@pdns ~]# vim /etc/pdns/pdns.conf 
launch=gmysql
gmysql-host=localhost
gmysql-port=3306
gmysql-dbname=powerdns
gmysql-user=powerdns
gmysql-password=111111

4.启动powerdns

[root@pdns ~]# systemctl start pdns         #启动服务
[root@pdns ~]# systemctl enable pdns        #设置为开机启动
Created symlink from /etc/systemd/system/multi-user.target.wants/pdns.service to /usr/lib/systemd/system/pdns.service.

安装PowerDNS的WEB管理界面

1.安装相关的rpm包

yum -y install httpd php php-devel php-gd php-mcrypt php-imap phpldap php-mysql php-odbc php-pear php-xml php-xmlrpc php-mbstring phpmcrypt php-mhash gettext

2.重启服务,设置为开机启动

[root@pdns ~]# systemctl restart httpd mariadb
[root@pdns ~]# systemctl enable httpd mariadb
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.
Created symlink from /etc/systemd/system/multi-user.target.wants/mariadb.service to /usr/lib/systemd/system/mariadb.service.

3.解压poweradmin程序到相应目录,并改名

[root@pdns ~]# tar xf poweradmin-2.1.7.tgz -C /var/www/html/
[root@pdns ~]# mv /var/www/html/poweradmin-2.1.7 /var/www/html/poweradmin

4.访问web界面
step1.选择语言
Lamp架构扩展2
step2.直接下步
Lamp架构扩展2
step3.填入mysql数据相关的参数
Lamp架构扩展2
step4.填入poweradmin的账户信息以及dns服务器地址
Lamp架构扩展2
step5.复制一下信息手动创建用户
Lamp架构扩展2
为poweradmin创建可以连接数据库的用户

MariaDB [(none)]> GRANT SELECT, INSERT, UPDATE, DELETE
    -> ON powerdns.*
    -> TO 'poweradmin'@'localhost'
    -> IDENTIFIED BY '111111';
Query OK, 0 rows affected (0.00 sec)

step6.复制下列信息到../inc/config.ini.php中,生成配置文件
Lamp架构扩展2

[root@pdns ~]# vim /var/www/html/poweradmin/inc/config.inc.php
<?php

$db_host                = 'localhost';
$db_user                = 'poweradmin';
$db_pass                = '111111';
$db_name                = 'powerdns';
$db_type                = 'mysql';
$db_layer               = 'PDO';

$session_key            = 'eC0QQE0-$A3jO-@LB~0TWHgA1}Dx8x*%IJA0nnThi=28_Z';

$iface_lang             = 'en_EN';

$dns_hostmaster         = 'powerdnsserver';
$dns_ns1                = '192.168.73.100';
$dns_ns2                = '';

step7.删除install目录

[root@pdns ~]# rm -rf /var/www/html/poweradmin/install

登录poweradmin配置dns

Lamp架构扩展2Lamp架构扩展2Lamp架构扩展2Lamp架构扩展2Lamp架构扩展2Lamp架构扩展2


部署MySQL主从复制

分别在3台数据库主机上安装MySQL

yum install mariadb-server

Master服务器操作

1.修改配置文件

[root@master ~]# vim /etc/my.cnf
[mysqld]
log-bin=/data/bin/mysql-bin
binlog-format=row
server-id=1

2.创建二进制日志目录

[root@master ~]# mkdir /data/bin
[root@master ~]# chown -R mysql.mysql /data/bin

3.启动服务

[root@master ~]# systemctl start mariadb

4.创建主从复制用的账号

[root@master ~]# mysql -e "GRANT REPLICATION SLAVE ON *.* TO 'repluser'@'192.168.73.%' IDENTIFIED BY '111111';"

5.查看二进制日志位置

[root@master ~]# mysql -e "SHOW MASTER LOGS;"
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |     26753 |
| mysql-bin.000002 |    921736 |
| mysql-bin.000003 |       402 |
+------------------+-----------+

配置Slave1

1.修改配置文件

[root@slave1 ~]# vim /etc/my.cnf
[mysqld]
read-only
server-id=2

2.启动服务

[root@slave1 ~]# systemctl start mariadb

3.change master to

MariaDB [(none)]> CHANGE MASTER TO   MASTER_HOST='192.168.73.131',   MASTER_USER='repluser',   MASTER_PASSWORD='111111',   MASTER_PORT=3306,   MASTER_LOG_FILE='mysql-bin.000003',   MASTER_LOG_POS=402;
Query OK, 0 rows affected (0.01 sec)

4.启动复制线程

MariaDB [(none)]> START SLAVE;
Query OK, 0 rows affected (0.00 sec)

5.查看Slave状态确认无误

MariaDB [(none)]> SHOW SLAVE STATUS\G;

6.测试主从复制
主服务器导入测试数据库

[root@master ~]# mysql < hellodb_innodb.sql 

从服务器查看是否同步

[root@slave1 ~]# mysql -e "SHOW DATABASES;"
+--------------------+
| Database           |
+--------------------+
| information_schema |
| hellodb            |
| mysql              |          #已经同步
| performance_schema |
| test               |
+--------------------+

配置slave2

1.修改配置文件

[root@slave2 ~]# vim /etc/my.cnf
[mysqld]
read-only
server-id=3

2.启动服务

[root@slave2 ~]# systemctl start mariadb 

3.CHANGE MASTER TO

MariaDB [(none)]> CHANGE MASTER TO   MASTER_HOST='192.168.73.131',   MASTER_USER='repluser',   MASTER_PASSWORD='111111',   MASTER_PORT=3306,   MASTER_LOG_FILE='mysql-bin.000003',   MASTER_LOG_POS=402;
Query OK, 0 rows affected (0.02 sec)

4.启动复制线程

MariaDB [(none)]> START SLAVE;
Query OK, 0 rows affected (0.00 sec)

5.查看数据库是否同步

MariaDB [(none)]> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| hellodb            |          #同步成功
| mysql              |
| performance_schema |
| test               |
+--------------------+
5 rows in set (0.00 sec)

配置ProxySQL

1.在ProxySQL主机上配置yum源

[root@ProxySQL ~]# vim /etc/yum.repos.d/proxysql.repo
[proxysql_repo] 
name= ProxySQL YUM repository 
baseurl=http://repo.proxysql.com/ProxySQL/proxysql-1.4.x/centos/\$releasever 
gpgcheck=1
gpgkey=http://repo.proxysql.com/ProxySQL/repo_pub_key 

2.安装ProxySQL和mariadb客户端
ProxySQL内置了一个轻量级的数据库,所以需要有MySQL客户端连上去对其进行配置

[root@ProxySQL ~]# yum install proxysql mariadb -y

3.启动ProxySQL服务

[root@ProxySQL ~]# service proxysql start
Starting ProxySQL: 2019-05-08 14:03:07 [INFO] Using config file /etc/proxysql.cnf
DONE!

4.连接管理端口

[root@ProxySQL ~]# mysql -uadmin -padmin -P6032 -h127.0.0.1
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.5.30 (ProxySQL Admin Module)

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

5.将MySQL主从服务器信息添加入mysql_servers表中
先将主从服务器存放在同一组内,等指定好读写规则后,系统会根据配置文件中的read-only值自动将其分别添加至读组和写组。

MySQL [(none)]> insert into mysql_servers(hostgroup_id,hostname,port) values (10,'192.168.73.131',3306);
Query OK, 1 row affected (0.00 sec)

MySQL [(none)]> insert into mysql_servers(hostgroup_id,hostname,port) values (10,'192.168.73.132',3306);
Query OK, 1 row affected (0.00 sec)

MySQL [(none)]> insert into mysql_servers(hostgroup_id,hostname,port) values (10,'192.168.73.133',3306);
Query OK, 1 row affected (0.00 sec)

MySQL [(none)]> select * from mysql_servers;
+--------------+----------------+------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
| hostgroup_id | hostname       | port | status | weight | compression | max_connections | max_replication_lag | use_ssl | max_latency_ms | comment |
+--------------+----------------+------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
| 10           | 192.168.73.131 | 3306 | ONLINE | 1      | 0           | 1000            | 0                   | 0       | 0              |         |
| 10           | 192.168.73.132 | 3306 | ONLINE | 1      | 0           | 1000            | 0                   | 0       | 0              |         |
| 10           | 192.168.73.133 | 3306 | ONLINE | 1      | 0           | 1000            | 0                   | 0       | 0              |         |
+--------------+----------------+------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
3 rows in set (0.00 sec)

6.在MySQL服务器的主节点上为ProxySQL添加账号用来查看MySQL节点是主还是从

[root@Master ~]# mysql -e "GRANT REPLICATION CLIENT ON *.* TO 'monitor'@'192.168.73.%' IDENTIFIED BY 'centos';"

7.在Proxy上配置监控账号

MySQL [(none)]> SET mysql-monitor_username='monitor';
Query OK, 1 row affected (0.00 sec)

MySQL [(none)]> SET mysql-monitor_password='111111';
Query OK, 1 row affected (0.00 sec)

8.将配置加载至内存,将配置保存至磁盘

MySQL [(none)]> LOAD MYSQL VARIABLES TO RUNTIME;
Query OK, 0 rows affected (0.00 sec)

MySQL [(none)]> SAVE MYSQL VARIABLES TO DISK;
Query OK, 97 rows affected (0.00 sec)

9.测试
9.1查看连接状态

MySQL [(none)]> select * from mysql_server_connect_log;   

9.2测试连接ping

MySQL [(none)]> select * from mysql_server_ping_log;

10.设置读写分组

MySQL [(none)]> INSERT INTO mysql_replication_hostgroups VALUES(10,20,"test");
Query OK, 1 row affected (0.00 sec)

MySQL [(none)]> SELECT * FROM mysql_replication_hostgroups;
+------------------+------------------+---------+
| writer_hostgroup | reader_hostgroup | comment |
+------------------+------------------+---------+
| 10               | 20               | test    |
+------------------+------------------+---------+
1 row in set (0.00 sec)

11.让读写表生效

MySQL [(none)]> LOAD MYSQL SERVERS TO RUNTIME;
Query OK, 0 rows affected (0.00 sec)

12.查看mysql_server表此时已经将服务器分组

MySQL [(none)]> SELECT * FROM mysql_servers;
+--------------+----------------+------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
| hostgroup_id | hostname       | port | status | weight | compression | max_connections | max_replication_lag | use_ssl | max_latency_ms | comment |
+--------------+----------------+------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
| 10           | 192.168.73.131 | 3306 | ONLINE | 1      | 0           | 1000            | 0                   | 0       | 0              |         |
| 20           | 192.168.73.132 | 3306 | ONLINE | 1      | 0           | 1000            | 0                   | 0       | 0              |         |
| 20           | 192.168.73.133 | 3306 | ONLINE | 1      | 0           | 1000            | 0                   | 0       | 0              |         |
+--------------+----------------+------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
3 rows in set (0.00 sec)

13.保存配置至磁盘

MySQL [(none)]> SAVE MYSQL SERVERS TO DISK;
Query OK, 0 rows affected (0.02 sec)

至此读写分离配置完毕,接下来需要定义读写分离的规则

定义读写分离规则

1.在主节点上创建一个账户让客户端连接调度器去访问主从服务器(此处授予的权限较大,实际生产中可以根据需要定义指定的那张表)

[root@Master ~]# mysql -e "GRANT ALL ON *.* TO 'sqluser'@'192.168.73.%' IDENTIFIED BY '111111';"

2.在ProxySQL服务器上,将sqluser用户添加至mysql_users表中

MySQL [(none)]> INSERT INTO mysql_users(username,password,default_hostgroup) VALUES ('sqluser','111111',10);
Query OK, 1 row affected (0.00 sec)

3.查看mysql_user表信息

MySQL [(none)]> SELECT * FROM mysql_users;
+----------+----------+--------+---------+-------------------+----------------+---------------+------------------------+--------------+---------+----------+-----------------+
| username | password | active | use_ssl | default_hostgroup | default_schema | schema_locked | transaction_persistent | fast_forward | backend | frontend | max_connections |
+----------+----------+--------+---------+-------------------+----------------+---------------+------------------------+--------------+---------+----------+-----------------+
| sqluser  | 111111   | 1      | 0       | 10                | NULL           | 0             | 1                      | 0            | 1       | 1        | 10000           |
+----------+----------+--------+---------+-------------------+----------------+---------------+------------------------+--------------+---------+----------+-----------------+
1 row in set (0.00 sec)

4.生效存盘

MySQL [(none)]> load mysql users to runtime;
Query OK, 0 rows affected (0.00 sec)

MySQL [(none)]> SAVE MYSQL USERS TO DISK;
Query OK, 0 rows affected (0.00 sec)

5.测试
目前尚未设置读写路由规则,所有的请求都是发往主节点

[root@Client ~]# mysql -usqluser -pcentos -h192.168.73.130 -P6033 -e "SELECT @@server_id;"
+-------------+
| @@server_id |
+-------------+
|           1 |
+-------------+

6.在ProxySQL上定义调度规则

MySQL [(none)]> INSERT INTO mysql_query_rules(rule_id,active,match_digest,destination_hostgroup,apply) VALUES (1,1,'^SELECT.*FOR UPDATE$',10,1),(2,1,'^SELECT',20,1);
Query OK, 2 rows affected (0.00 sec)

7.查看定义规则

MySQL [(none)]>  SELECT * FROM mysql_query_rules\G;

8.生效存盘

MySQL [(none)]> LOAD MYSQL QUERY RULES TO RUNTIME;
Query OK, 0 rows affected (0.00 sec)

MySQL [(none)]> SAVE MYSQL QUERY RULES TO DISK;
Query OK, 0 rows affected (0.00 sec)

在Client端测试

1.查询操作

[root@Client ~]# mysql -usqluser -pcentos -h192.168.73.130 -P6033 -e "SELECT @@server_id;"
+-------------+
| @@server_id |
+-------------+
|           2 |
+-------------+

2.写操作

[root@Client ~]# mysql -usqluser -pcentos -h192.168.73.130 -P6033 -e "BEGIN;INSERT hellodb.teachers VALUE(5,'Long',30,'M');SELECT @@server_id;commit;"
+-------------+
| @@server_id |
+-------------+
|           1 |
+-------------+

部署Apache+PHP

分别在2台httpd主机上安装httpd、php-fpm

yum install httpd php-fpm php-mysql -y

配置apache+php(1)服务器

1.修改httpd配置文件

[root@httpd ~]# vim /etc/httpd/conf/httpd.conf 
    DirectoryIndex index.php index.html

addtype application/x-httpd-php .php
addtype application/x-httpd-php-source .phps
proxyrequests off
proxypassmatch ^/(.*\.php)$ unix:/var/run/php.sock|fcgi://localhost/data/html

<virtualhost :80>
servername www.mylinuxops.com
Documentroot /data/html
<directory /data/html>
require all granted
</directory>
</virtualhost>

2.修改php.ini中的时区

[root@httpd ~]# vim /etc/php.ini
date.timezone = Aisa/Shanghai

3.修改php-fpm配置文件配置为(UDS模式)

[root@httpd ~]# vim /etc/php-fpm.d/www.conf 
;listen = 127.0.0.1:9000            #注销此行
listen = /var/run/php.sock          #监听sock文件
;listen.allowed_clients = 127.0.0.1     #注销监听127.0.0.1
listen.mode = 0666                  #添加权限

4.创建站点目录,创建测试页

[root@httpd ~]# mkdir /data/html
[root@httpd ~]# vim /data/html/index.php 
<?php
$dsn='mysql:host=192.168.73.131;dbname=test';
$username='sqluser'; $passwd='111111';
$dbh=new PDO($dsn,$username,$passwd);
var_dump($dbh);
phpinfo();
?>

测试
Lamp架构扩展2

配置apache+php(2)服务器

将apache+php(1)上的配置文件复制到(2)上

[root@httpd ~]# scp /etc/php.ini 192.168.73.111:/etc/php.ini
[root@httpd ~]# scp /etc/httpd/conf/httpd.conf 192.168.73.111:/etc/httpd/conf/httpd.conf 
[root@httpd ~]# scp /etc/php-fpm.d/www.conf 192.168.73.111:/etc/php-fpm.d/www.conf 

创建站点目录和测试页面

[root@httpd2 ~]# mkdir /data/html
[root@httpd2 ~]# vim /data/html/index.php
<?php
$dsn='mysql:host=192.168.73.131;dbname=test';
$username='sqluser'; $passwd='111111';
$dbh=new PDO($dsn,$username,$passwd);
var_dump($dbh);
phpinfo();
?>

启动服务

[root@httpd2 ~]# systemctl start httpd php-fpm

访问测试
Lamp架构扩展2

配置NFS-server

安装nfs

[root@nfs ~]# yum install nfs-utils -y

在httpd主机上查看apache用户id

[root@httpd ~]# id apache
uid=48(apache) gid=48(apache) groups=48(apache)
[root@httpd2 ~]# id apache
uid=48(apache) gid=48(apache) groups=48(apache)

在nfs-Server上创建一个apache用户

将来访问的用户映射成apache用户

[root@nfs ~]# useradd -r -u 48  -s /sbin/nologin apache
[root@nfs ~]# id apache
uid=48(apache) gid=48(apache) groups=48(apache)

创建出共享的目录

[root@nfs ~]# mkdir /data/html

定义共享规则

[root@nfs ~]# vim /etc/exports
/data/html 192.168.73.110(rw,no_root_squash,anonuid=48,anongid=48) 192.168.73.111(rw,no_root_squash,anonuid=48,anongid=48)

重启服务

[root@nfs ~]# systemctl restart nfs

配置nfs实时备份

安装rsync

在nfs-server和nfs-backup服务器上安装rsync

yum install rsync

在backup端配置为rsync服务

1.创建一个作为备份的目录

[root@backup ~]# mkdir /data/backup

2.修改rsync配置文件

[root@rsync ~]# vim /etc/rsyncd.conf 
uid = root                          
gid = root                          
use chroot = no                     
max connections = 0                 
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
reverse lookup = no
host allow = 192.168.73.120
[backup]
path = /data/backup/
comment = backup
readonly = no
auth users = rsyncuser
secrets file = /etc/rsync.pass

4.生成验证用的账户密码,修改为安全权限

[root@rsync ~]# echo "rsyncuser:111111" > /etc/rsync.pass
[root@rsync ~]# chmod 600 /etc/rsync.pass

5.启动服务(rsyncd端口号873)

[root@rsync ~]# systemctl start rsyncd

nfs-server端配置

测试rsync一次性任务

1.安装inotify-tools(基于epel)

[root@nfs ~]# yum install inotify-tools -y

2.配置密码文件,修改为安全权限

[root@nfs ~]# echo "111111" > /etc/rsync.pass
[root@nfs ~]# chmod 600 /etc/rsync.pass

3.创建测试文件

[root@nfs ~]# touch /data/html/test

4.测试一次性同步

#把本机的/data目录下的数据利用rsync远程同步到73.121的backup指定的文件夹中去
[root@nfs ~]# rsync -avz --password-file=/etc/rsync.pass /data/html/ [email protected]::backup
sending incremental file list
./
test

sent 102 bytes  received 38 bytes  280.00 bytes/sec
total size is 0  speedup is 0.00

让inotify配合sync实时同步

1.在nfs-server端创建脚本

[root@nfs ~]# vim rsync.sh 
#!/bin/bash
SRC='/data/html'
DEST='[email protected]::backup'
inotifywait  -mrq --timefmt '%Y-%m-%d %H:%M' --format '%T %w %f' -e create,delete,moved_to,close_write,attrib ${SRC} |while read DATE TIME DIR FILE;do
        FILEPATH=${DIR}${FILE}
        rsync -az --delete  --password-file=/etc/rsync.pass $SRC $DEST && echo "At ${TIME} on ${DATE}, file $FILEPATH was backuped up via rsync" >> /var/log/changelist.log
done

2.运行脚本

[root@client ~]# bash rsync.sh 

3.测试
在nfs端创建文件

[root@nfs ~]# touch /data/html/test1

在backup端查看

[root@backup html]# ls
test  test1

将nfs共享目录挂载至httpd服务器

分别在两台httpd服务器上挂载

[root@httpd ~]# showmount -e 192.168.73.120
Export list for 192.168.73.120:
/data/html 192.168.73.111,192.168.73.110

设置为开机挂载

[root@httpd ~]# vim /etc/fstab 
192.168.73.120:/data/html /data/html    nfs     defaults 0 0
[root@httpd ~]# mount -a

查看是否挂载

[root@httpd ~]# ls /data/html/
test  test1
#测试文件已经存在挂载成功

创建站点测试页

[root@httpd ~]# vim /data/html/index.php
<?php
$dsn='mysql:host=192.168.73.131;dbname=test';
$username='sqluser'; $passwd='111111';
$dbh=new PDO($dsn,$username,$passwd);
var_dump($dbh);
phpinfo();
?>

使用客户端访问
Lamp架构扩展2

猜你喜欢

转载自blog.51cto.com/11886307/2397297