读写分离和负载均衡-电商数据库设计及优化学习笔记

一、背景

这个 是我的电商数据库设计及优化学习笔记的读写分离和负载均衡部分的笔记。主要是解决读写压力大的问题。这里其实我没看懂,所以笔记也是乱七八糟的了~还得多刷几遍才行。

二、笔记部分

读负载和写负载时两个不同的问题
写操作只能在Master数据库上执行
读操作既可以在Master库上执行,也可以再Slaver库上执行
相对于写操作来说,解决读操作负载更容易
1、如何解决读压力大的问题
进行读写分离,主服务器主要执行写操作
读操作的压力平均分摊到不同的SLAVE服务器上
增加前端缓存服务器如Redis,memcache等,推荐使用redis服务器
如何进行读写分离
由开发人员根据所执行的SQL类型连接不同的服务器
优点:完全由开发人员控制,实现更加灵活。对于实时性非常敏感的操作就不适合这样查询。由程序直接连接数据库,所以性能损耗比较少。
缺点:增加开发工作量,使代码更复杂,人为控制容易出现失误。
由数据库中间层完成读写分离
可以自己开发来实现中间层,也可以使用现成的软件,比如mysql proxy,maxscale,one proxy,proxySQL等等
优点:由中间层查询语法分析,自动完成读写分离。对程序透明,对于已经存在的应用不用做任何调整,只要改变数据库的连接方式就可以实现读写分离。
缺点:所有的前后端数据库都要通过中间层,所有对查询效率有损耗。如果使用中间层进行读写分离,在上线前一定要进行基准测试。对于延迟敏感的业务无法自动在主库执行。
常用的读服务器负载均衡方式
数据库中间层:如果本身是利用中间层实现读写分离的,那么要使用相同的中间层进行负载分离。
DNS轮询:在域名服务器上为同一个服务器上多个不同ip地址的记录,应用端使用域名来连接服务器。这样在进行域名解析时域名服务器会循环将不同的ip返回给应用端。性能较差,不推荐使用
LVS/Haproxy代理软件:通用代理软件,无法进行读写分离,但是可以对服务器的负载进行均衡。4层代理的LVS优于7层代理的Haproxy。
硬件F5:硬件成本高
DNS轮询、LVS/Haproxy代理软件、硬件F5都是由开发人员来实现读写分离的。
使用LVS进行读服务器负载均衡
特点:属4层代理,只进行分发,处理效率更高,但是不能解决读写分离,工作稳定,可进行高可用配置。无流量,不会对主机的网络IO造成影响。
LVS配置演示
三台虚拟机:主DB:192.168.3.100
主备DB:192.168.3.101
SlaveDB:192.168.3.102
主和主备已经做好了双主复制。
SlaveDB是主DB的从服务器
keepalived vip:192.168.3.99
lvs manager:192.168.3.100/101
lvs vip:192.168.3.98

进行lvs的配置和安装
安装管理工具:同时在192.168.3.100/101这两台服务器上安装,yum install -y ipvsadm.x86_64,接下来在三台服务器上加载lpvs模块,modprobe ip_vs,接下来进行lvs脚本的编写,然后在三台服务器上都运行脚本。进行keepalived的配置lvs高可用的服务器。

keepalived+lvs总结
如何使用keepalived进行写vip的迁移
如何使用lvs进行多个只读从数据库的负载均衡
适用于开发人员人为判断读写分离的情况

使用MaxScale解决读压力大的问题
MaxScale拾支持高可用,负载均衡,良好扩展的插件式数据库中间层软件。
MaxScale允许用户开发和定制自己的插件,目前提供的插件功能主要分为以下五种,
认证插件(数据库登录认证的功能),
协议插件(主要负责MaxScale和外部系统接口外部协议,主要包括客户端到MaxScale的接口和数据库到MaxScale的接口两个方面),
路由插件(决定了如何把前端用户的请求发送到后端的哪一台数据库服务器,我们要实现的读写分离和负载均衡主要是由这个模块来实现的 ,两种路由:ReadConnRoute实现读负载均衡,ReadWriteSplit实现读写均衡),
安装MaxScale
第一步,下载安装包
第二步,安装支持库
第三步,使用rpm -ivh 包名 就可以实现安装了

配置和使用
服务器信息:
MaxScale节点192.168.3.102
Master DB:192.168.3.100
Slave DB_1:192.168.3.101
Slave DB_2:192.168.3.102
为监控模块建立数据库账号,用户监控客户端服务器状态,进入主节点的mysql客户端下建立账号
用于监控账号:create user scalemon@'192.168.3.%' identified by '123456'; 授权grant replication slave,replication client on *.* to scalemon@'192.168.3.%';
用户路由模块的账号:
create user scaleroute@'192.168.3.%' identified by '123456'; 授权grant select on mysql.* to scalemon@'192.168.3.%';
接下来地数据库密码进行加密,因为maxscale密码是明文存储,是不安全的。maxscale提供了一个对密码进行加密的命令,maxpassword,maxpasswd /var/lib/maxscale/ 123456,这样就会生成一个加密字符串,把字符串保存下来,后面会使用到,接下来对maxscale服务进行配置,在/etc/maxscale.cnf目录下生成了一个配置文件的模板。
接下来就可以启动服务了:maxscale -f /etc/maxscale.cnf,进入maxscale客户端中来查看状态,

maxadmin --user=admin --password=mariadb

这是默认管理员账号密码。
使用list service 命令查看它的服务器的列表,可以看到maxscale后端服务器,可以清楚知道服务器状态信息,根据状态信息进行读写分离。
可以使用show dbusers "Read-write Service"查看它是否读取到后端数据库服务器的账号。
现在就完成了maxscale的配置。

2、如何解决写压力大的问题
用mysql复制的功能解决了读负载大的问题,
但是其实无法缓解写压力的
利用缓存合并多次写为一次写入
对MasterDB进行拆分

对MasterDB拆分步骤
一、按需求建立新的DB集群
二、同步要拆分的DB到新的集群中
三、迁移数据库账号到新的集群中
四、修改前商应用的数据库连接

三、小结

这部分主要是介绍了解决读写分离和负载均衡问题的思路,把懂的和不懂的都先记下来,以后再学到、遇到,或者有更深的认识,再来更新。

猜你喜欢

转载自blog.csdn.net/qq_40916110/article/details/80778182