使用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写错
- MySQL 调优/优化的 100 个建议
MySQL 调优/优化的 100 个建议 MySQL是一个强大的开源数据库.随着MySQL上的应用越来越多,MySQL逐渐遇到了瓶颈.这里提供 101 条优化 MySQL 的建议.有些技巧适合特定 ...
- MySQL 调优基础(一) CPU与进程
一般而言,MySQL 的调优可以分为两个层面,一个是在MySQL层面上进行的调优,比如SQL改写,索引的添加,MySQL各种参数的配置:另一个层面是从操作系统的层面和硬件的层面来进行调优.操作系统的层 ...
- MySQL调优系列基础篇
前言 有一段时间没有写博客了,整天都在忙,上班,录制课程,恰巧最近一段时间比较清闲,打算弄弄MYSQL数据库. 关于MySQL数据库,这里就不做过多的介绍,开源.免费等特性深受各个互联网行业喜爱,尤其 ...
- nginx服务器调优
nginx服务器调优措施总结: 1.选择合适的网络IO模型 epoll select poll 2.配置合适的启动进程数和每个进程处理请求的工作线程数 3.启用gzip压缩以减小通信量以减少网络IO ...
- mysql调优 基础
MySQL调优可以从几个方面来做: 1. 架构层:做从库,实现读写分离: 2.系统层次:增加内存:给磁盘做raid0或者raid5以增加磁盘的读写速度:可以重新挂载磁盘,并加上noatime参数,这样 ...
- mysql调优最大连接数
一.mysql调优 1.1 报错: Mysql: error 1040: Too many connections 1.2 原因: 1.访问量过高,MySQL服务器抗不住,这个时候就要考虑增加从服务器 ...
- Nginx性能调优
[调优]Nginx性能调优 一.Nginx优化配置 1.主配置文件优化:# vi /usr/local/nginx/conf/nginx.conf------------------------- ...
- MySQL调优 —— Using temporary
DBA发来一个线上慢查询问题. SQL例如以下(为突出重点省略部分内容): select distinct article0_.id, 等字段 from article_table article ...
- Nginx 性能调优
原文地址:http://nginx.com/blog/tuning-nginx/ Tuning NGINX for Performance Nginx 性能调优 NGINX is well known ...
随机推荐
- 【微信小程序】获取用户地理位置权限,二次请求授权,逆解析获取地址
摘要:微信小程序内获取用户地理位置信息授权,被拒绝后二次获取,获取权限后逆解析得到用户所在省市区等.. 场景:商城类小程序,在首页时需展示附近门店,即用户刚进入小程序时就需要获取到用户位置信息 ste ...
- 团队作业第五次—项目冲刺-Day5
Day5 part1-SCRUM: 项目相关 作业相关 具体描述 所属班级 2019秋福大软件工程实践Z班 作业要求 团队作业第五次-项目冲刺 作业正文 hunter--冲刺集合 团队名称 hunte ...
- NetCore 开发时中文编码转换出现异常
在C#编程的时候难免会遇到需要转换编码的场合. 在Framwork中可以用System.Text.Encoding解决,但是到了core会发现,虽然也有这个东西,但几个关键的中文编码(比如GB2312 ...
- Kubernetes Dashboard 安装与认证
1.安装dashboard $ kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/ ...
- 解决IDEA卡顿的问题(Windows和Mac)
IDEA卡顿 最近一段时间经常会在开发的时候感觉到 IDEA 很卡,在一个类里上下滚动或者切换类文件时都能够明显的感觉到,我以为是我项目打开的太多了,毕竟内存优化已经做过了,但是今天实在是被这玩意儿卡 ...
- snowflake ID生成器
背景 Snowflake 是 Twitter 内部的一个 ID 生算法, 可以通过一些简单的规则保证在大规模分布式情况下生成唯一的 ID 号码. 其组成为: 第一个 bit 为未使用的符号位. 第二部 ...
- ROS融合IMU笔记
ROS官网有一个叫robot_pose_ekf的包,是专门处理传感器融合的包,具体介绍:http://wiki.ros.org/robot_pose_ekf 其中主要功能是订阅主题包括odom(里程计 ...
- 论文阅读: Building a 3-D Line-Based Map Using Stereo SLAM
Abstract 一个把直线用作feature的SLAM系统. 跟点相比, 直线对于环境的结构提供了更丰富的信息, 也让其鞥有可能推断地图的空间语义. 使用了Plucker line coordian ...
- LeetCode 561:数组拆分 I Array Partition I
文章全部来自公众号:爱写bug 算法是一个程序的灵魂. Given an array of 2n integers, your task is to group these integers into ...
- C语言memset()函数:将内存的前n个字节设置为特定的值
头文件:#include <string.h> memset() 函数用来将指定内存的前n个字节设置为特定的值,其原型为: void * memset( void * ptr, in ...