原创

单体项目的高并发优化


单体项目的高并发优化

高并发优化-1:nginx的介入

在单体项目使用nginx作为反向代理服务器。nginx在实现限流的同时,还可以配置当用户请求超过限流设置的并发量时要缓存用户的请求数量(有点类似mq的削峰操作),在保护项目的同时还可以进一步提高项目的抗压能力,具体配置如下:

http {
    #limit_req_zone-用来限制单位时间内的请求数,即速率限制,采用的漏桶算法 "leaky bucket"
    #第一个参数:zone=one 设置使用哪个配置区域来做限制,与上面limit_req_zone 里的name对应。
    #第二个参数:burst=5,重点说明一下这个配置,burst爆发的意思,这个配置的意思是设
    #	置一个大小为5的缓冲区当有大量请求(爆发)过来时,超过了访问频次限制的请求可以先放到
    #	这个缓冲区内。
    #第三个参数:nodelay,如果设置,超过访问频次而且缓冲区也满了的时候就会直接返回503,
    #	如果没有设置,则所有请求会等待排队。
    limit_req_zone $binary_remote_addr zone=mylimit:10m rate=200r/s;

    server {
        listen       80;
        server_name  blogApi.mogongcom.cn;
        
        charset utf-8;
        
        proxy_set_header   Host             $host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;

        location / {
            proxy_pass http://127.0.0.1:10086/;
            #root   html;
            #index  index.html index.htm;
            #--限流--
            #burst-定义缓存区为4,缓存的请求数量为80
            limit_req zone=mylimit burst=80 nodelay;
            #漏桶算法--当token不够用时,直接拒绝用户的请求
            limit_req_status 598;
        }
        
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

高并发优化-2:分布式部署

当你当个项目的负荷量达到一定程度时,为了提高项目的负载能力那么就要考虑将项目进行分布式部署以提高项目的负载能力,将项目分布式部署的流程有两步:

  1. 以这个博客项目为例,分别在腾讯学生服务器和阿里学生服务器上部署博客项目

  2. 用nginx对部署的项目进行负载均衡

以域名绑定的服务器为主部署nginx,在nginx的配置文件配置如下内容:

http {

    limit_req_zone $binary_remote_addr zone=mylimit:10m rate=400r/s;
    upstream web{
#        阿里服务器
        server 115.15.456.154:10086;
#        腾讯服务器
        server 127.0.0.1:10086;
    }
    server {
        listen       80;
        server_name  blogApi.mogongcom.cn;
        
        charset utf-8;
        
        proxy_set_header   Host             $host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;

        location / {
            proxy_pass http://web;
            #root   html;
            #index  index.html index.htm;
            #--限流--
            #burst-定义缓存区为4,缓存的请求数量为80
            limit_req zone=mylimit burst=80 nodelay;
            #漏桶算法--当token不够用时,直接拒绝用户的请求
            limit_req_status 598;
        }
        
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

高并发优化-3:用Mycat实现单体项目的读写分离

实现读写分离的方式:

  • 应用层实现

​ 比如使用SpringJDBC/myBatis/Hibernate访问数据库时配置多数据源,这些组件会通过算法把请求分流到不同的数据源,本文不做过多说明。

  • 代理实现

​ 这种方式是在应用层和数据库集群之间添加一个代理服务,应用层访问代理,代理根据请求类型(读/写)自动分流到不同的数据库服务器。各种分布式数据库中间件应运而生,比如Amoeba、Atlas、Cobar、Mycat、Mysql-proxy等,Mycat继承并发扬了。

​ Cobar,是相对成熟开源社区较为活跃的一款数据库中间件,而Mycat是基于Cobar开发的。

(1 搭建MySQL主从复制

配置阿里服务器(主)的MySQL配置文件

修改配置文件: vim /etc/my.cnf
#主服务器唯-ID
server-id=1
#启用二进制日志
log-bin=mysql-bin
#设置不要复制的数据库(可设置多个)
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
#设置需要复制的数据库
binlog-do-db=blogDB(需要复制的主数据库名字)
#设置logbin格式
binlog_format=STATEMENTL

配置腾讯服务器(从)的MySQL配置文件

修改配置文件: vim /etc/my.cnf
#从服务器唯一ID
server-id=2
#启用中继日志
relay-log=mysql-relay

将两台服务器的MySQL重启

#重启
systemctl restart mysqld
#查看状态
systemctl status mysqld

配置两台MySQL的连接

若之前有创建过slave可以用以下命令删除

#1、停止已经启动的绑定
stop slave
#2、重置绑定
reset master

在主机上登录MySQL建立账户并授权slave

#在主机MySQL里执行授权命令
GRANT REPLICATION SLAVE ON *.* TO 'mogong'@'%' IDENTIFIED BY '123123';
#查询master的状态
show master status
#并记录下File和Position的值
#执行完此步骤后不要再操作主服务器MYSQL,防止主服务器状态值变化

企业微信截图_16233052815228

在从机上配置需要复制的主机

#复制主机的命令
CHANGE MASTER TO MASTER_HOST='主机的IP地址',
MASTER_USER='mogong',
MASTER_PASSWORD='123123',
MASTER_LOG_FILE='mysql-bin.具体数字',MASTER_LOG_POS=具体值;

image-20210610142115142

#并启动从服务器复制功能
start slave;
#查看从服务器状态
show slave status\G

(2 Mycat读写分离配置

修改Mycat的配置文件schema.xml添加主从机的ip地址

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://org.opencloudb/">
	
	<!--定义主从同步数据库,mycat做读写分离,只能绑定一个dataNota-->
	<schema name="KEVINDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="sync1">
	</schema>
	
	<!--逻辑节点配置 name节点名称  dataHost节点主机(物理节点) database 节点数据库(物理数据库名) -->
	<!--独写分离的dataNode database为mysql配置主从同步指定的数据库 kevin-->
	<dataNode name="sync1" dataHost="sync01" database="kevin" />

	<!--
	Balance参数设置:
		1. balance=“0”, 所有读操作都发送到当前可用的writeHost上。
		2. balance=“1”,所有读操作都随机的发送到readHost。
		3. balance=“2”,所有读操作都随机的在writeHost、readhost上分发
	WriteType参数设置:
		1. writeType=“0”, 所有写操作都发送到可用的writeHost上。
		2. writeType=“1”,所有写操作都随机的发送到readHost。
		3. writeType=“2”,所有写操作都随机的在writeHost、readhost分上发。
	switchType 目前有三种选择:
		-1:表示不自动切换
		1 :默认值,自动切换
		2 :基于MySQL主从同步的状态决定是否切换
		“Mycat心跳检查语句配置为 show slave status ,dataHost 上定义两个新属性: switchType="2" 与slaveThreshold="100",此时意味着开启MySQL主从复制状态绑定的读写分离与切换机制。Mycat心跳机制通过检测 show slave status 中的 "Seconds_Behind_Master", "Slave_IO_Running", "Slave_SQL_Running" 三个字段来确定当前主从同步的状态以及Seconds_Behind_Master主从复制时延。“
-->
<!--配置独写分离的 数据库配置 -->
	<dataHost name="sync01" maxCon="1000" minCon="10" balance="1"
		writeType="0" dbType="mysql" dbDriver="native" switchType="2"  slaveThreshold="100">
		<heartbeat>show slave status</heartbeat>
		<!-- can have multi write hosts -->
		<!-- 阿里服务器 -->
		<writeHost host="hostM1" url="115.15.153.23:3306" user="root"
			password="root123">
			<!-- 腾讯服务器 -->
			<readHost  host="hostS1" url="115.15.123.154:3306" user="root" password="root123"/>
		</writeHost>
        <!--备用master节点,当默认master宕机,会自动切换 -->
        <writeHost host="hostM2" url="115.15.123.154:3308" user="root" password="root123"/>
	</dataHost> 
</mycat:schema>

最后通过ip+8066端口连接mycat服务。

Mycat
分布式部署
Nginx
  • 作者:陌攻(联系作者)
  • 发表时间:2022-04-20 05:39
  • 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
  • 公众号转载:请在文末添加作者公众号二维码
  • 评论