mysql 高并发读写分离_使用docker搭建高并发网站架构实践7--Mysql主从同步+读写分离+读负载均衡...

6. Mysql主从同步+读写分离+读负载均衡

目标:

搭建mysql一主两从同步

搭建从mysql读负载均衡

结合web工程实现mysql读写分离

整体示意图:

34885a9ea23e1fb5c32d8b94893123f9.png

如图所示:

192.168.238.129:负载均衡服务器

192.168.238.128: mysql-slave1服务器 mysql-master服务器

192.168.238.131: mysql-slave2服务器

VIP: 192.168.238.130 提供对外的统一读IP

Tomcat通过AOP根据方法名来区分读写操作,分别访问不同的数据库连接,从而实现mysql读写分离。

当执行写操作时,直接从192.168.238.128:3003写;当执行读操作时,访问VIP192.168.238.130, 由LVS负载均衡分配给192.168.238.128:3306或者192.168.238.131:3306从而实现读负载均衡。

Tomcat主从同步利用自身的二进制日志方式来实现同步。

简要步骤:

搭建keepalived+lvs实现读mysql负载均衡。

搭建mysql主从同步。

搭建tomcat web工程来实现读写分离。

具体操作如下:

搭建keepalived+lvs实现读mysql负载均衡。

Docker search mysql

Docker pull mysql

192.168.238.131  mysql_slave1

192.168.238.128  mysql_slave2

192.168.238.129  keepalived+lvs负载均衡

192.169.238.130   对外统一VIP

1.1在192.168.238.131 启动从mysql1

Docker run –name mysql_slave1

–p 3306:3306

-e MYSQL_ROOT_PASSWORD=123456 –d mysql

e2b452e1116b735b407d3fb39204c8b7.png

Mysql –h 192.168.238.131 –P 3306 –u root –p

连接数据库,新建数据库slave1_131;

0832ac8bc00961f2976c933224008815.png

同理在192.168.238.128启动mysql_slave2

Docker run –name mysql_slave2

–p 3306:3306

-e MYSQL_ROOT_PASSWORD=123456 –d mysql

800a4dcb3a67970892130e1be0e4432d.png

连接,新建数据库slave2_128;

bad70a7e7bddf70be475038d2d3e970e.png

在128和131上,分别新建realserver脚本如下:

532866cf02d6e8855ae25f68ed1734ee.png

chmod 755 realserver;

启动脚本,查看ip add

bash realserver start;

131显示如下:

5f726fdb21fcbfcf02a6d8418387bcf5.png

128显示如下:

193576faf9c771826663a1e4d96fe8c9.png

说明:

SNS_VIP 直接路由模式的VIP必须和服务器对外提供的ip地址在同一个网段;

VIP被绑定在环回接口lo0:0上,广播地址是其本身,子网掩码255.255.255.255;

抑制ARP广播。

负载均衡机192.168.238.129设置如下:

安装ipvsadm服务:

Apt-get install ipvsadm

Lsmod | grep ip_vs

fc78418c70f0712be6c00a146c60f98b.png

Ipvsadm

79cf303d4ef070ceb2b288976ffc274b.png

安装keepalived

Apt-get install keepalived

Cd /etc/keepalived

编辑配置文件:keepalived.conf

9269230cb15db543700e8b70159c09ea.png

配置文件说明:

搭建lvs,只需使用virtual_server虚拟块配置即可。

虚拟机端口和真实机端口应该保持一致,否则访问不到真实机相应端口。

Virtual_server 虚拟机IP和端口号

Delay_loop 运行情况检查时间,单位秒

Lb_algo 负载调试算法

Lb_kind   DR/NAT/TUN

Persistence_timeout 会话保持时间

Protocol TCP 转发协议类型 TCP/UDP

Real_server 真实服务器的IP和端口号

Weight 该真实机的权重

Connect_timeout 10 10秒无响应超时

Nb_get_retry 重试次数

Delay_before_retry 重试间隔

Connect_port 3306 使用3306端口进行保活

Service keepalived start;

Service keepalived status;

f343f1d6429fd790987bfaa9301221bd.png

Ipvsadm

b2840c0344e1996463372bd2416c729c.png

在负载均衡机129上连接VIP,来访问数据库;

Mysql –h 192.168.238.130 –P 3306 –u root -P

f217afa177c2cb29710f82e9402b2ba7.png

可知成功连接131真实服务器数据库,因为上面配置131weight=3,所以权重较大。

再一次访问

3b8f05efd1fca345cd25076ae2e156e9.png

可知此时连接128真实服务器数据库

搭建mysql主从同步。

2.1准备主从mysql配置文件

查看一下mysql容器的mysqld.conf配置文件位置

8b197cf4ecadd5d3d7cac7aaddf1eb92.png

/etc/mysql/mysql.conf.d/mysqld.cnf

Mysql-master  mysqld.cnf文件配置

03dd09a8c72b8771902a3c6effde1f15.png

Log-bin必须设置

Server-id必须设置,并且唯一

Mysql-slave1 mysqld.cnf 文件:

0bc1162808f8d34068188e70683249f3.png

Mysql-slave2 mysqld.cnf 文件:

f46cdd25589deaae0cf4f8c4c966e0c8.png

重新启动容器,把配置文件挂载到相应目录

在192.168.238.131启动mysql_slave1容器:

Docker run –name mysql_slave1 –p 3306:3306

–v /data/mysql-backup1/mysqld.cnf :/etc/mysql/mysqld.conf.d/mysqld.cnf

-e MYSQL_ROOT_PASSWORD=123456  -d  mysql

e55ffeac716c2b86e6c95f8bf66a9a97.png

e72f22ea98df99b7d5865e8bb1d73db3.png

在192.168.238.129启动mysql_master容器:

Docker run –name mysql_master –p 3306:3306

–v /data/mysql-master/mysqld.cnf :/etc/mysql/mysqld.conf.d/mysqld.cnf

-e MYSQL_ROOT_PASSWORD=123456  –d  mysql

db2a7b2c06cbcf31e512d445ba575403.png

在192.168.238.128启动mysql_slave2容器:

Docker run –name mysql_slave2 –p 3306:3306

–v /data/mysql-backup2/mysqld.cnf :/etc/mysql/mysqld.conf.d/mysqld.cnf

-e MYSQL_ROOT_PASSWORD=123456  -d  mysql

5c60c1ec4d8bd7bff090383fcd96100d.png

配置主从复制

登录mysql_master

Mysql –h 192.168.238.129 –P 3306 –u root –p

123456

分配复制权限:

Grant replication slave on *.* to ‘root’@’%’ identified by ‘123456’

replication slave 分配复制权限

*.*数据库所有表都可以

‘%’IP限制,在此设置所有主机

Root用户名

4404355eeead36c2ba8367e13462bc89.png

登录mysql-slave1

7938981ea227a909192a9d0d6c59e789.png

配置从服务器1复制功能:

change master to master_host =’192.168.238.129’,

master_port=3306,

master_user=’root’ ,

master_password=’123456’,

master_log_file=’mysql-bin.000003’,

master_log_pos=429;

249fa5b68430a6f41de9a1c75afb6a78.png

启动复制功能

start slave;

show slave status;

17b834a2fb496dc79bb8623abf853d53.png

3f931b2113d6455e42d08b0db58aadfb.png

其中:

Slave_IO_State = Waiting for master to send event

Slave_IO和Slave_SQL 都是 YES

则表示主从复制配置成功。

登录mysql-master新建数据库test_slave1;

341d402dbc58de77044b969c13618a8f.png

此时slave1的状态:

d544bb43315398c5259097a69db215b8.png

可知,mysql_master和mysql_slave2已经同步。

同理配置mysql_slave2;

change master to master_host =’192.168.238.129’,

master_port=3306,

master_user=’root’ ,

master_password=’123456’,

master_log_file=’mysql-bin.000003’,

master_log_pos=429;

start slave;

show slave status;

show databases;

可知mysql_slave2和mysql_master已经同步。

ab006b3d481578d3b0a488755b5ac3e6.png

此时,

写mysql:

192.168.238.129 3306

读mysql

192.168.238.130 3306(VIP)

在192.168.238.131和192.168.238.128启动realserver脚本

bash realserver start

在192.168.238.129上启动keepalived

Ipvsadm:

555aec4d19fb77e6e0a50f8aad608057.png

连接129:3306和130:3306,测试如下:

06030ed02eb15f8a9b7ebe51539d5523.png

dceb53ad964722b87ed2794025f6bc58.png

可知读写ip和端口号已经成功。

搭建tomcat web工程来测试读写分离。

59d0baa770f07315f025b6b480c0d189.png

26ab9b1863880b46e7cc07128badab31.png

059c761fb52dc921895cdca2dd42096a.png

/usr/local/tomcat/webapps/ssh_runner.war

9ccaf8aebb609e53896d857d3808077a.png

登录129负载均衡服务器:

登录slave1和slave2,关闭slave功能;

Stop slave;

此时,slave1和slave2表index_msg的状态

Slave1的状态:

51876fd34f640ca206c898ee802b8f11.png

Slave2的状态;

e333ae9fc7c76f7dc79c198d0613723d.png

利用index_msg表的记录数量来区分slave1的负载均衡。

将mysql-master迁移到128 3003端口,其余保持不变。

现在准备web测试工程ssh-runner.war

启动:

http://localhost:8080/ssh-runner/back/getMethodTest

de50b6516525a184aabfaa2584ef6efe.png

可知数据库切换到slave,轮询读取从库的数据(此时主从复制已关闭),从而实现了读从mysql负载均衡。

http://localhost:8080/ssh-runner/back/saveMethodTest

1fa08631572a6d4c0d6b40bfbdce80ce.png

数据库切换到master,从而实现了读写分离。

工程详细配置如下:

配置文件如下:

dataSource.xml  配置主从数据源

23cab22d24e252eda05927e775ca599b.png

0945e3a8ffca1f576655ce528e2614e6.png

在dataSource.xml中添加如下bean:

parentDataSource, masterDataSource, slaveDataSource, dataSource

spring-hibernate.xml  配置事务和AOP

390ff9f6ccf2a4465551c47499821de7.png

需要根据工程来修改相应配置:

AOP的适用范围,加在service层还是dao层

方法名命名规则需要统一

pom.xml配置主从数据库的连接,用户名和密码

fecbd3ebfde329ce4b5b73ae7a0e7325.png

代码修改:

com.huanke.sshshell.aop

DataSourceAdvice

25e77b5b288f2ac46ebcd0da8daf5b23.png

DataSourceSwitcher

9225d914d608b403076d86d9c253550b.png

DynamicDataSource

b5d4d3230427b73e9cbce6c8f9a93a49.png

未解决的问题:

VIP的访问,工程部署在本地可以运行,部署在linux虚拟机,VIP访问不到。网络配置等问题;

代码层的方案还没有解决,方法名的规范以及AOP切面的位置(因为现在工程业务逻辑乱,service和controller层均有业务代码)

实现读写分离可以尝试使用数据库中间件Atlas以及一些持久层框架Rose,使用注解等便捷,易于开发。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
《基于docker容器的高并发web系统架构设计与实现》随着互联网迅速发展,社交、媒体以及电商等web网站用户数量 越来越大,并发流量也越来越高,这对于传统web系统架构设计提出 新的挑战。本文基于docker容器虚拟化技术来设计实现高并发web系 统架构,实现web系统的高并发、易扩展以及提升系统资源利用均衡 率等功能。 本文基于docker容器以及Kubemetes容器集群技术,从负载均 衡、弹性伸缩以及资源调度等方面设计实现容器化高并发web系统架 构。设计实现基于工作负载特性的动态负载均衡策略,能够实现根据 不同负载类型以及容器集群资源利用率而实时调整容器集群服务的 权重;设计实现基于灰度模型短时间负载预测弹性伸缩策略,能够实 现高效容器集群弹性伸缩以及提升系统并发性能;设计实现基于蚁群 算法并行调度策略,能够有效提升容器集群整体调度效果,提高容器 服务集群的可用性以及改善系统的资源利用均衡率等。 基于docker容器的高并发web系统架构能够实现系统的高并发、 易扩展以及提升系统集群的资源利用率等功能。经过系统测试分析, 基于工作负载特性的动态负载均衡策略比传统轮询、加权轮询策略在 高并发流量下有更好的吞吐量以及响应时间等性能表现,基于灰度模 型预测的弹性伸缩机制比传统KubemetesHPA机制在短时间内具有 更好的集群伸缩特性以及基于蚁群算法的并行容器调度策略比传统 Kubemetesdefaults策略有更高的调度优势,能够有效提升容器的均 匀分发,实现系统高可用性以及提升系统的资源利用均衡率等。 基于docker容器技术高并发web系统架构设计,能够有效解决 当前高并发流量下web系统流量转发、集群伸缩以及资源调度等问 题,对于容器技术的具体应用研究以及高并发系统架构的设计具有一 定的实用价值。 关键词:高并发web系统,容器虚拟化,动态负载均衡,弹性伸 缩,并行资源调度

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值