注意:此图的NFS还应该与Nginx相连!即在Nginx的html上也应该挂载NFS的共享目录
1、Nginx安装教程:https://blog.csdn.net/weixin_44571270/article/details/102887048
2、PHP安装教程:https://blog.csdn.net/weixin_44571270/article/details/103223557
注意:php7相较php5版本发生了很大的变化,不再支持mysqli_connect函数,所以在此处建议安装使用php5版本。否则discuz和wordpress会安装不上。
3、yum安装MySQL多实例安装教程:https://blog.csdn.net/weixin_44571270/article/details/103368000
4、主从复制配置及知识:https://blog.csdn.net/weixin_44571270/article/details/103148755
确认自己所有的Nginx、PHP、MySQL已经完成基本的安装!
下面就是各种功能的实现:
1、新建共享文件的目录
mkdir /webapps
2、安装NFS服务
yum install nfs nfs-utils -y
注意:安装了上面这个也会自动安装RPC。
3、从外部上传wordpress、discuz
在mac终端上输入下面命令:
scp /Users/shijiandingyiqingchun/Desktop/Discuz_X3.2_SC_UTF8.zip 172.16.193.206:/data/
scp /Users/shijiandingyiqingchun/Desktop/wordpress-5.0.2-zh_CN.tar.gz 172.16.193.206:/data/
注意:
(1)不能在虚拟机上scp到物理机上拿文件,物理机很有可能关闭了ssh端口的,导致scp失败。所以我们需要到物理机的终端上scp,上传文件到虚拟机中,这样就好了。
(2)这样scp复制,需要在虚拟机中创建一个用户名为shijiandingyiqingchun,还需要passwd shijiandingyiqingchun,修改它的密码,scp会让你输入密码,就是这个passwd这个你修改的密码。
4、解压缩两个文件,并移到共享文件目录下
(1)解压
unzip Discuz_X3.2_SC_UTF8.zip
tar xvf wordpress-5.0.2-zh_CN.tar.gz
(2)移到共享目录下
解压后的wordpress可以直接移:
mv wordpress /webapps/
解压后的discuz不能全部移到共享文件目录下:
mv upload/* /webapps/
4、编辑exports文件
添加以下内容:
/webapps/ 172.16.193.* [rw,all_squash]
5、开启NFS服务
systemctl start nfs
注:
(1)如果修改了exports文件,就可以使用exportfs -r不需要重新启动nfs。
(2)开启了NFS服务,会自动先开启RPC服务,然后再开启NFS。
1、编辑主配置文件nginx.conf:
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream server_pool{
server 172.16.193.201:9000;
server 172.16.193.202:9000;
}
**discuz**
server {
listen 8080; //用基于端口的虚拟主机
server_name localhost;
location / {
root /mnt/www.discuz.com/;
index index.html index.php;
}
location ~*\.php$ {
root /mnt/www.discuz.com;
fastcgi_pass server_pool;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
**wordpress**
server {
listen 80; //基于端口的虚拟主机
server_name localhost;
location / {
root /mnt/wordpress;
index index.html index.php;
}
location ~*\.php$ {
root /mnt/wordpress;
fastcgi_pass server_pool;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
2、安装NFS服务,挂载共享文件目录
yum install nfs nfs-utils -y
mount 172.16.193.206:/webapps/ /mnt/
1、安装NFS服务
yum install nfs nfs-utils -y
2、挂载共享文件目录
mount 172.16.193.206:/webapps/ /mnt/
3、查看是否挂载上
df -hT
4、修改监听地址为本地ip
注意:不能写127.0.0.1
5、安装php-mysql
yum install php-mysql -y
这个特别重要,没有这个就不能实现对数据库的连接。
注:记录这个目录:/usr/lib64/php/modules
这个目录就是安装php-mysql产生的。
6、现在就已经可以看到效果了
discuz论坛安装界面:
wordpress:
有了主从复制,为什么还要采用主主复制?
答:MYSQL主从复制的弊端是一旦主库宕机,网站代码将数据库配置修改为从库,从库再更新数据,主从关系会破坏哦,企业生产环境一般采用主主模式+DRBD来保证数据的完整性。主主复制还可以分担写的压力。主主复制也可以做读写分离,只不过主库一般写压力都很大了,所以不建议再把读压力分担给主库。
1、打开三个终端,分别登录三个端口的数据库
2、编辑3307、3308和3309的my.cnf文件
vim /etc/my.cnf.d/my3307.cnf
修改后为:
[client]
port = 3307
socket = /data/mysql/3307/mysql3307.sock
[mysqld]
server-id=1 //这个必须不一样
log-bin=mysql-bin
datadir=/data/mysql/3307/
port = 3307
socket = /data/mysql/3307/mysql3307.sock
my3308.cnf和my3309.cnf文件的配置照着上面这个文件修改即可。
3、创建连接信息
(1)相互查看log_pos及其log-bin文件名
3307:
3308:
(2)创建连接信息
3307:
change master to master_host='172.16.193.203',master_user='tongbu',master_port=3308,master_password='mysql',master_log_file='mysql-bin.000001',master_log_pos=474;
3308:
change master to master_host='172.16.193.203',master_user='tongbu',master_port=3307,master_password='mysql',master_log_file='mysql-bin.000001',master_log_pos=549;
4、相互授权访问
3307:
MariaDB [(none)]> grant replication slave on *.* to 'tongbu'@'172.16.193.%' identified by 'mysql';
MariaDB [(none)]> flush privileges;
MariaDB [(none)]> start slave;
3308:
MariaDB [(none)]> grant replication slave on *.* to 'tongbu'@'172.16.193.%' identified by 'mysql';
MariaDB [(none)]> flush privileges;
MariaDB [(none)]> start slave;
注:配置略!不相互声明为主的主主就是主从,单方声明!
为什么有了主主复制还要主从复制呢?
主从复制过后,再次确保数据的完整性,为数据做备份,还可以做读写分离,两个主库写,一个从库做读操作,真是再好不过了!
注:电脑足够强大的情况下,建议安装mysql-proxy的这台机器单独放在一个服务器上。
mysql-proxy在本实验中架构图中的位置需要明确:
NFS上的网站代码中连接数据库的文件,不要再写数据库的地址,需要写mysql-proxy的服务器的4040端口,网站运行时,php找mysql-proxy所在的服务器的4040端口,然后mysql-proxy再把写请求分配给主库,读请求分配给从库。
//wordpress的连接数据库文件:
[root@NFS_SERVER ~]# vim /webapps/wordpress/wp-config.php
//discuz的连接数据库文件
[root@NFS_SERVER ~]# vim /webapps/www.discuz.com/config/config_global.php
实现MYSQL读写分离可以基于第三方插件,也可以通过开发修改代码实现。
比较:
第三方插件实现,效率不如修改代码的好,但是修改代码实现读写分离需要比较高的开发功底!一般中小企业都适用第三方插件,大型企业才会修改代码去实现读写分离!
下面我们就使用mysql-proxy这个中间件,实现读写分离:
wget -O /usr/local/mysql-proxy.tar.gz http://ftp.ntu.edu.tw/pub/MySQL/Downloads/MySQL-Proxy/mysql-proxy-0.8.4-linux-el6-x86-64bit.tar.gz
cd /usr/local/
tar xvf mysql-proxy.tar.gz
mv mysql-proxy-0.8.4-linux-el6-x86-64bit/ mysql-proxy/
/usr/local/mysql-proxy/bin/mysql-proxy --daemon --log-level=debug --user=mysql-proxy --keepalive --log-file=/var/log/mysql-proxy.log --plugins="proxy" --proxy-backend-addresses="172.16.193.203:3307" --proxy-read-only-backend-addresses="172.16.193.203:3309" --proxy-lua-script="/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua" --plugins=admin --admin-username="admin" --admin-password="admin" --admin-lua-script="/usr/local/mysql-proxy/lib/mysql-proxy/lua/admin.lua"
注 :上述命令中的admin用户及其密码,登录4041端口的管理服务时需要使用。
参数说明:
--help-all :获取全部帮助信息;
--proxy-address=host:port :代理服务监听的地址和端口,默认为4040;
--admin-address=host:port :管理模块监听的地址和端口,默认为4041;
--proxy-backend-addresses=host:port :后端mysql服务器的地址和端口,即为主库地址和端口;
--proxy-read-only-backend-addresses=host:port :后端只读mysql服务器的地址和端口,即为从库地址和端口;
--proxy-lua-script=file_name :完成mysql代理功能的Lua脚本;
--daemon :以守护进程模式启动mysql-proxy;
--keepalive :在mysql-proxy崩溃时尝试重启之;
--log-file=/path/to/log_file_name :日志文件名称;
--log-level=level :日志级别;
--log-use-syslog :基于syslog记录日志;
--plugins=plugin :在mysql-proxy启动时加载的插件;
--user=user_name :运行mysql-proxy进程的用户;
--defaults-file=/path/to/conf_file_name :默认使用的配置文件路径,其配置段使用[mysql-proxy]标识;
--proxy-skip-profiling :禁用profile;
--pid-file=/path/to/pid_file_name :进程文件名;
关闭防火墙后执行以下操作:
mysql -h172.16.193.203 -uadmin -padmin -P 4041
//管理服务,登录使用的用户名和密码是启动命令时指定的
//-h后的ip是mysql-proxy所在的ip地址,此条命令一般在mysql服务器上执行,看mysql-proxy服务器,因为mysql-proxy没有mysql这个命令。
注:在这里可以看到3307的主库状态时up的,从库还是未知的。我们接下来需要通过操作4040端口,让它变成up。
注:代理服务主要是接受网站请求的,所以网站代码中需要改成4040(修改内容请看下面第五步)。
(1)执行查询命令;
执行show databases;直到在4041上的从库状态从unknown变成up为止,这个变可能需要点时间,耐心等,几分钟吧。
注:变成up就说明读写分离成功了,如下。
怎么确认,这个读不是从主库读,而是从从库读到的呢?请看下步!
(2)登录从库,在从库创建test数据库,且创建www表,并插入信息。
[root@MySQL-SERVER ~]# mysql -uroot -p123456 -S /data/mysql/3309/mysql3309.sock
//这里也可以是其他用户,但是这个用户一定不能是本地用户,必须是MySQL允许可以远程登录的用户
注:在从库中创建的这个信息,是不会同步到主库的是吧!我们如果在4040端口上能够查询到这个信息,是不是就能说明是在从库上读的了!
(3)在4040上看是否能成功读到主库特有信息。
大家现在就放心读写分离是真的成功了吧!
当主从库全部都是up状态时,读写分离起来,再改网站代码,实现网站读写分离。
以wordpress为例:
注 :其他信息不变,只是把MySQL主机变成MySQL-proxy所在的服务器的ip和4040端口。
在3307、3308、3309数据库下配置如下(赋予权限):
Warning:
下面所有的'discuz'@'172.16.193.*',其中的'*'全部改成'%',就是这个星号害我找了三天的错误,全都是在php上找错误去了!!
注:3307和3308、3309配置一样。因为如果做了高可用,有库不能工作,它们之间可以相互代替完成工作。所以权限都要给。
创建discuz和wordpress所需要的库:
MariaDB [(none)]> create database discuz charset=utf8;
//创建库discuz,且字符集为utf8
MariaDB [(none)]> create database wordpress;
//因为安装wordpress没有要字符集,所以这里我们就不要设置了!