Nginx+Mysql调优

Posted steven9898

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx+Mysql调优相关的知识,希望对你有一定的参考价值。

使用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-IPi %l %u %t \"%r\" %>s %b \"%Refereri\" \"%User-Agenti\"" 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写错
 
 
 

以上是关于Nginx+Mysql调优的主要内容,如果未能解决你的问题,请参考以下文章

Mysql索引性能调优

大厂Mysql高频面试题!让人抓狂的Nginx性能调优,面试总结

大厂Mysql高频面试题!让人抓狂的Nginx性能调优,绝对干货

mysql进阶 with-as 性能调优

JVM 三大性能调优参数-Xms -Xmx -Xss

Docker调优之mysql内存占用过大