当前位置:Gxlcms > 数据库问题 > Nginx+Mysql调优

Nginx+Mysql调优

时间:2021-07-01 10:21:17 帮助过:33人阅读

使用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写错      

Nginx+Mysql调优

标签:irb   主机名   cti   cat   isa   目录   pid   char   修改   

人气教程排行