MYsql的概述
MYsql作为目前世界上使用最广泛的免费数据库,相信所有从事系统运维的工程师一定都接触过,但在实际的生产中,
由单台Mysql作为独立的数据库是完全不能满足实际需求的,无论是在安全性,高可用性以及高并发等各个方面。
因此,一般来说都是通过主从复制(master-slave)的方式来同步数据,再通过读写分离(Mysql-proxy/Amoeba)
来提升数据库的并发负载能力,这样的方案来进行部署与实施。
读写分离的原理?
基本的原理是让主数据库处理事务性增、改、删操作(insert,update,delete),而从数据库处理select查询操作
数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。
为什么要读写分离?
- 面对越来越大的访问压力,单台的服务器性能已经远远无法满足,反而成为了限制的瓶颈,需要分担负载
- 主从只负责各自的写和读,极大程度的缓解了X锁和S锁争用
- 从库可配置myisam引擎,提升查询性能以及节约系统开销
- 增加冗余,提高可用性。
实现读写分离的方式有两种:
应用程序层实现:值的是在应用程序内部及连接器中实现读写分离
优点:
- A.应用程序内部实现读写分离,安装后直接使用
- B.减少一定部署难度
- c.访问压力在一定级别以下,性能很好
缺点:
- A.架构一旦调整,代码要跟着变
- b.难以实现高级应用,如自动分库,分表
- c.无法适用大型应用场景
网站的程序实现
- 中间件层实现:中间件层实现是指在外部中间件程序实现读写分离–
常见的中间件程序:
Mysql-proxy、amoeba、Atlas(360)、Cobar(Alibaba)/TDDL(Taobao)
优点:
- A:架构设计更灵活
- B:可以在程序上实现一些高级控制:例如:透明化水平拆分,faliover,监控
- C:可以依靠一些技术手段提高mysql的性能
- D:对业务代码的影响小,同时也安全
缺点:
- 需要一定的开发运维团队的支持
MYsql-proxy概述
Mysql proxy 是一个处于你的client端和Mysql server端之间的简单程序、它可以检测、分析或改变它们的
通信。它使用灵活,没有限制,常见的用途包括:负载平衡、故障、查询分析,查询过滤和修改等。
原理:
Mysql Proxy就是这么一个中间层代理,简单的说,Mysql Proxy就是一个连接池,负责将前台应用的连接
请求转发给后台的数据库,并且通过使用lua脚本,可以实现复杂的连接控制和过滤,从而实现读写分离和
负载均衡。对于应用来说,Mysql Proxy是完全透明,应用则是只需要连接到Mysql proxy的监听端口即可,
当然这样proxy机器可能成为单点失效,但完全可以使用多个proxy机器做为冗余,在应用服务器的连接池配置到多个proxy的连接参数即可。
a.拓扑结构
client254 (mysql -h192.168.4.56 -u用户名 -p密码)
|||
代理服务器56
|||
————————————————
write read
|| ||
master(51) slave(52)
b.配置数据读写分离:
b.1 配置一主一从 主从同步结构,并在客户端测试配置
b.2 配置数据读写分离服务器
b.a.1 环境准备
setenforce 0
systemctl stop firewall
yum 可以用
ping 得同数据库
b.a.2
·装包:
rpm -ivh maxscale-2.1.2-1.rhel.7.x86_64.rpm
·修改配置文件:/etc/maxscale.cnf.template
rpm -qc maxscale #查看
vim /etc/maxscale.cnf
[maxscale] #服务运行后开启的线程数量
threads=auto #默认1,auto根据cpu自动分配
#定义数据库服务器:
[server1] #定义数据库服务器的主机名字
type=server #类型
address=192.168.4.51 #数据库的ip
port=3306 #端口 mysql的端口3306
protocol=MySQLBackend
[server2] #第二台数据库服务器的主机名
type=server
address=192.168.4.52 #数据库的ip地址
port=3306
protocol=MySQLBackend
#定义监视的数据库服务器
[MySQL Monitor]
type=monitor
module=mysqlmon
servers=server1, server2 #指定监视的数据库列表
user=用户名scalemon #监视时连接的授权用户名
passwd=密码123456 #监视时连接的密码
monitor_interval=10000
#不定义只读服务器
#[Read-Only Service]
#type=service
#router=readconnroute
#servers=server1
#user=myuser
#passwd=mypwd
#router_options=slave
#定义读写分离服务器
[Read-Write Service]
type=service
router=readwritesplit
servers=server1, server2 #数据库服务器列表
user=用户名maxscale #客户端连接数据库的授权用户名
passwd=密码123456 #客户端连接数据库的密码
max_slave_connections=100%
#定义管理服务器(默认就行,不改)
[MaxAdmin Service]
type=service
router=cli
#不指定只读服务器使用的端口号
#[Read-Only Listener]
#type=listener
#service=Read-Only Service
#protocol=MySQLClient
#port=4008
#定义读写分离服务使用的端口号
[Read-Write Listener]
type=listener
service=Read-Write Service
protocol=MySQLClient
port=4006 #设置使用的端口
#定义管理服务的端口
[MaxAdmin Listener]
type=listener
service=MaxAdmin Service
protocol=maxscaled
socket=default
#port=4018 #不设置时,使用的默认端口
cp /etc/maxscale.cnf /etc/maxscale.cnf.bak #备份配置文件
·根据配置文件做相应的设置(在2台数据库服务器上添加用户)
监控数据库服务器时,连接数据库服务器的用户:
mysql> grant replication slave,replication client on *.* to
> scalemon@"%" identified by "123456";
访问数据时连接数据库服务器使用的用户,是不是数据库服务器上存在的连接用户:
mysql> grant select on mysql.* to maxscale@"%" identified by "123456";
·启动服务
maxscale -f /etc/maxscale.cnf # -f 指定启动的配置文件
·查看服务器进程和端口
ss -nultp | grep 4018(4006) #查端口号看有没有起来
ps -C maxscale #查maxscale的进程
测试配置:
a. 在本机访问管理端口查看监控状态
maxadmin -P端口 -u用户 -p密码
maxadmin -P4018 -uadmin -pmariadb
MaxScale> list servers
Servers.
——————-+—————–+——-+————-+——————–a
Server | Address | Port | Connections | Status
——————-+—————–+——-+————-+——————–a
server1 | 192.168.4.51 | 3306 | 1 | Master, Running
server2 | 192.168.4.52 | 3306 | 1 | Slave, Running
——————-+—————–+——-+————-+——————–a
b.客户端访问数据读写分离服务
which mysql
mysql -h读写分离服务器ip -P4006 -u用户名 -p密码
mysql -h192.168.4.56 -P4006 -uwebadim -p密码
b.3 客户端测试数据读写分离的配置