• 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-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写错
     
     
     
  • 相关阅读:
    js:通过正则匹配获取页面的url中的参数
    BZOJ 4873 寿司餐厅 网络流
    BZOJ 3308 毒瘤结论 网络流
    BZOJ3451 CDOJ1562点分治+FFT
    P3731 二分图匹配必经边
    Hdu 6268 点分治 树上背包 bitset 优化
    Hdu 1517 巴什博奕变形
    dsu on tree
    CF #546 D.E
    HNOI 世界树 虚树
  • 原文地址:https://www.cnblogs.com/steven9898/p/11331145.html
Copyright © 2020-2023  润新知