使用nginx实现反向代理作用,具备负载均衡的功能。
接受客户端的请求
|
nginx(宿主机)
|
|-------------------|
web1 web2 (客户机)
原理:
与squid原理一样。对于客户端来说,nginx就像一台web服务器,客户端认为自己访问的所有内容都是来自nginx.但是nginx接受到客户端的请求,其实它是理解了请求后,自身产生新的请求,问后端的web节点索取客户端想要的内容,最后把内容返回给客户端。
客户端 ----> nginx(客户端的服务端) ------> web节点(做为nginx的服务端)
nginx
eth0 10.1.1.21
virbr5 192.168.19.1 <--- hostonly
web1
eth0 192.168.19.11
web2
eth0 192.168.19.12
www.upl.com ---> 10.1.1.21
重点掌握: 学会使用nginx实现反向代理的配置
配置模板:
upstream backend {
server backend1.example.com weight=5;
server backend2.example.com:8080;
server unix:/tmp/backend3;
}
server {
location / {
proxy_pass http://backend;
}
}
一、部署nginx,实现代理
1、安装pcre、nginx
略
2、配置nginx
http{
....
upstream webservs {
server 192.168.19.11 max_fails=3 fail_timeout=30s weight=1;
server 192.168.19.12 max_fails=3 fail_timeout=30s weight=1;
}
server {
listen 80;
server_name www.upl.com upl.com;
charset utf8;
access_log logs/upl.com.access.log main;
location / {
proxy_pass http://webservs; //把请求调度给webservs定义的节点
proxy_set_header X-Real-IP $remote_addr;// 能够后端节点可以知道客户端IP
}
}
...
}
二、部署后端节点
1、安装web服务以及应用
略
2、配置apache,让其记录真正的客户端的IP
LogFormat "%{X-Real-IP}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
CustomLog logs/access_log combined <---使用combined格式记录日志
==============================================================================
使用mysql的复制技术实现对mysql架构的调优
mysql复制的常见拓扑
1、简单实现双机热备
r/w ro
| |
master -----> slave
slave起到一个在线热备份。
2、级联模式,进一步分担读压力
r/w ro ro
| | |
master ----> slave1 -----> slave2
存在“单点故障”,只要slave1出问题,slave2就无法同步到最新状态
3、一主多从 ,解决从服务器成为单点故障的问题
/-----> slave1
master --
\-----> slave2
master需要同时给后端两个节点发送日志,IO压力和网络压力都增加。
4、互为主从
master1 <------> master2
从mysql复制技术的角度来说,互为主从并不十分合理,一般都是不允许它们同时接受写请求,就算允许,也是哪些允许记录重复的应用数据。
以上的拓扑图,如果其中一个节点出故障,该如何处理?
实验1:
1、简单实现双机热备
r/w ro
| |
master2 -----> slave1
slave起到一个在线热备份。
master2
node1.upl.com
192.168.19.11
server-id=11
slave1
node2.upl.com
192.168.19.12
server-id=12
准备:
1、静态IP、FQDN主机名、hosts文件相互绑定
2、时间必须同步一致。
3、强烈要求mysql-server版本要一样。
软件:
rhel6u2
mysql-5.1 光盘自带
模拟情景:
架构初期,工程师并没有考虑到使用mysql双机热备架构,仅仅使用了一台mysql数据库服务器。
架构运作了一段时间之后,数据库的压力非常大,需要增加一台从数据库,实现双机热备,既可以降低单台数据库的读压力,又可以实现数据热备份。
考虑: 尽可能不要去关闭原来的数据库去部署双机热备,尽可能减少对原来的数据库的影响。
前提:必须原来就打开了二进制日志文件记录的功能,否则必须重启数据库
如果数据库的表使用的是innodb的存储引擎,那么一点影响都没有;如果表使用的是MyISAM等非事务类型的存储引擎,那么部署的时候,绝对会影响,至少数据库是不能正常的接受写请求。
一、部署master2数据库服务器
1、安装数据库,并且建立一些基本数据。
1)建立配置文件
注意: 考虑到后面的实验需求,必须打开二进制日志文件记录功能。
[mysqld]
user=mysql
datadir=/data
socket=/data/mysqld.sock
port=3306
skip-name-resolve ###
server-id=11 ####
log-bin=/data/mysqld-bin ###
log-bin-index=/data/mysqld-bin ###
sync-binlog=1 ###
[mysqld_safe]
log-error=/data/mysqld.err
pid-file=/data/mysqld.pid
2) 把配置文件涉及的用户、目录建立,保证权限正确
# mkdir /data/
# chown mysql:mysql /data
3)初始化数据
# mysql_install_db --datadir=/data --user=mysql
4)启动并且修改帐号密码等。
# mysqld_safe &
# mysqladmin -u root -S /data/mysqld.sock password '123'
# mysql -u root -p123 -S /data/mysqld.sock
mysql> update mysql.user set password=password('123')
-> where password='';
mysql> delete from mysql.user where user='';
5) 存放一些数据,模拟数据库是运行了一段时间
mysql> create database upl default charset utf8;
mysql> use upl;
mysql> create table user (
-> id int unsigned not null primary key auto_increment,
-> name varchar(32) );
mysql> insert into user values (NULL,'user1'),(NULL,'user2');
二、部署master2,为双机热备做好准备
前提:确定master2服务器打开了二进制日志记录、固定了server-id
1、建立帐号,授权允许进行复制二进制日志文件记录
mysql> grant replication slave on *.*
-> to slave@'192.168.19.%'
-> identified by '123';
2、开始备份数据库
备份数据库的手段:
热备份:
mysqldump (逻辑备份)
meb (物理备份)
不管使用什么的工具,只要是备份非事务的存储引擎,都是需要锁库,锁表,不允许写。
冷备份
关闭数据库,或者锁定数据库,不允许写操作,然后拷贝数据文件等
由于本数据库服务器使用的主要是myisam类型的表,所以使用以下参数: --lock-all-tables
# mysqldump -u root -p123 -S /data/mysqld.sock --all-databases --lock-all-tables --master-data=2 > ~/master2.sql
如果使用是以innodb类型的表为主
--single-transaction
# mysqldump -u root -p123 -S /data/mysqld.sock --all-databases --single-transaction
--master-data=2 > ~/master2.sql
--master-date=? 在备份数据库的时候,会把当前数据库的状态对应的二进制日志文件信息记录下来。
1 不会注释change master语句
2 在备份文件中,把change master语句注释起来
# vim master2.sql
....
....
-- CHANGE MASTER TO MASTER_LOG_FILE='mysqld-bin.000003', MASTER_LOG_POS=998;
《---在备份文件中记录了二进制日志信息
3、这个步骤并不是本次实验必须的步骤,仅仅是为了模拟数据库一直都在工作
mysql> insert into upl.user values (NULL,'user3');
mysql> select * from upl.user;
+----+-------+
| id | name |
+----+-------+
| 1 | user1 |
| 2 | user2 | <---以上的记录在master2.sql备份文件中都已经有了
| 3 | user3 | <---备份后添加
+----+-------+
三、部署slave1从服务器
1、安装相同版本的数据库
2、建立配置文件、用户、目录等
[mysqld]
datadir=/data
socket=/data/mysqld.sock
user=mysql
skip-name-resolve
server-id=12 # 确保从服务器使用的是一个与其他服务器不同的id
log-bin=/data/mysqld-bin
log-bin-index=/data/mysqld-bin
sync-binlog=1
relay-log=/data/relay-log # 记录从master上下载回来的更新操作
relay-log-index=/data/relay-log
log-slave-updates # 把下载回来的更新操作同时也记录到自己二进制日志文件中
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
# mkdir /data
# chown mysql:mysql /data
3、由于使用的是mysqldump备份来恢复,所以需要对服务器初始化数据目录
# mysql_install_db --datadir=/data --user=mysql
4、启动并且导出数据
# mysqld_safe &
# scp 192.168.19.11:~/master2.sql /tmp/master2.sql
导入数据
# mysql -u root -S /data/mysqld.sock < /tmp/master2.sql
强烈建议重启数据库
# mysqladmin -u root shutdown -S /data/mysqld.sock
# service mysqld start
5、设定如何连接master2
mysql> change master to
-> master_host='192.168.19.11',
-> master_user='slave',
-> master_password='123',
-> master_log_file='mysqld-bin.000003',
-> master_log_pos=998;
mysql> start slave; # stop slave;
mysql> show slave status \G;
*************************** 1. row ***************************
。。。。
Master_Log_File: mysqld-bin.000003
Read_Master_Log_Pos: 1127
Relay_Log_File: relay-log.000002
Relay_Log_Pos: 381
Relay_Master_Log_File: mysqld-bin.000003
Slave_IO_Running: Yes ##
Slave_SQL_Running: Yes ##
。。。
Exec_Master_Log_Pos: 1127
Relay_Log_Space: 530
。。。
Seconds_Behind_Master: 0
。。。
遇到故障:
1、找错误日志
2、如果是Slave_IO_Running: No
Slave_IO线程是负责连接主人,下载二进制日志记录。出问题,一般 :
1) slave帐号是否错误了,是否能够连接
2) 日志文件的名字
3、如果Slave_SQL_Running: No
一般都是master_log_pos写错