通过mysql-proxy配置的读写分离和mysql的高可用

一、读写分离的简介

1.读写分离的原理

读写分离,基本的原理是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。一般来说都是通过 主从复制(Master-Slave)的方式来同步数据,再通过读写分离(MySQL-Proxy)来提升数据库的并发负载能力 这样的方案来进行部署与实施的。
mysql-proxy服务器就相当于一个调度器,客户把对数据库的请求发送给proxy服务器,proxy服务器来处理具体发给mysql哪个服务器来处理。

2.读写分离一般都在主从复制的基础上

在实际的生产环境中,对数据库的读和写都在同一个数据库服务器中,是不能满足实际需求的。无论是在安全性、高可用性还是高并发等各个方面都是完全不能满足实际需求的。因此,通过主从复制的方式来同步数据,再通过读写分离来提升数据库的并发负载能力。有点类似于前面我们学习过的rsync,但是不同的是rsync是对磁盘文件做备份,而mysql主从复制是对数据库中的数据、语句做备份。

3.环境准备

Master机:server1(172.25.21.1)
Slave 机: server2(172.25.21.2)
调度器proxy:server3(172.25.21.3)

4、mysql-proxy的安装

安装包可以在mysql官网上获取,或者http://rpm.pbone.net/,本机使用的版本为mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz

tar zxf mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz		##解压安装包
cd mysql-proxy-0.8.5-linux-el6-x86-64bit/			##进入解压目录后发现没有编译安装等其他脚本,有直接执行的命令

二、读写分离的配置

1.mysql-proxy(server3)调度器的配置
mv /mysql-proxy-0.8.5-linux-el6-x86-64bit/	/usr/local/mysql-proxy/		##将目录移动并重命名
cd /usr/local/mysql-proxy/			##进入软件目录
mkdir conf							##建立一个目录来存放配置文件
vim /usr/local/mysql-proxy/conf/mysql-proxy.conf		##写一个配置文件
mkdir /usr/local/mysql-proxy/log						##建立一个目录来存放pid文件和日志文件
chmod 660 /usr/local/mysql-proxy/conf/mysql-proxy.conf		##修改文件的权限,不然启动时会提示文件权限过大

在这里插入图片描述

修改lua文件,启动服务
vim /usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua	
/usr/local/mysql-proxy/bin/mysql-proxy --defaults-file=/usr/local/mysql-proxy/conf/mysql-proxy.conf	
##启动服务
vim /usr/local/mysql-proxy/log/mysql-proxy.log 			##查看日志确认是否启动成功

在这里插入图片描述
在这里插入图片描述

2.首先把server1和server2配置到gtid复制模式

具体配置方法参考我的上篇博客,注意io和sql线程都是yes,gtid模式开启,这里显示配置后的效果图
在这里插入图片描述

在这里插入图片描述

3.创建一个远程用户来进行读写分离测试
server1()上创建一个表并插入一个数据,然后建立一个远程登陆用户
[root@server1 ~]# mysql -uroot -pYy+12345

mysql> create database westos;
mysql> use westos;
mysql> CREATE TABLE  linux (username varchar(50) not null,password varchar(50) not null);
mysql> insert into linux values('user1','123');
mysql> CREATE USER 'yy'@'172.25.21.%' IDENTIFIED BY 'Yy+12345';
mysql> grant insert,update,select on *.* to 'yy'@'172.25.21.%' identified by 'Yy+12345'; ##赋予插入,更新,查询
mysql> flush privileges;		##使修改生效
4.用真机访问server3来测试

首先在server3上安装lsof来监控数据的流向,当真机在远程访问时,使用的是server3的ip地址,具体的连接数据库有mysql-proxy的配置文件来决定,根据我们文件中的设置,server1是读写数据库服务器,所以我们连接时会默认连到server1,但是当连接数超过lua文件中设置的最大连接数时,就会开启读写分离,连接到只读存储器server2上,这时我们关掉server2的复制,然后在连接到server2数据库的那个终端里写入数据,就可以看到数据写入了server1,但是server2没有
在这里插入图片描述

mysql> stop slave;关闭server2的复制

在连接到server2的终端上插入数据
MySQL [westos]> insert into linux values('user2','123');
可以看到虽然在server2上操作,但是数据存入了server1

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、mysql的高可用

1.简介

让管理节点在出现问题时可以自动切换一次,注意只有一次,但是它能保证服务的稳定性,切换以后应该立即排查错误。

2.环境准备

server1:172.25.21.1(管理节点)
server4:172.25.21.4(管理节点)
server2:172.25.21.2(普通节点)
server3:172.25.21.3(普通节点)

3.首先将server1,server2,server3配置成半同步模式
配置文件的修改,三个节点都要改,只时server-id不同(具体可以看我的上篇博客)
vim /etc/my.cnf
systemctl restart mysqld

三个结点上都要安装的插件,因为都有可能当作master节点
mysql -uroot -pYy+12345

INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';		##因为都有可能当作master,所以都要安装
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';

SET GLOBAL rpl_semi_sync_master_enabled =1;	##激活插件
SET GLOBAL rpl_semi_sync_slave_enabled =1;
SET GLOBAL rpl_semi_sync_master_timeout =10000000000000000000;  ##理论上要设为无穷大,不同步成功不让它进行下一步
show slave status\G;						##如果出现数据不同步的问题,请看我上一篇文章

在这里插入图片描述

4.server4的配置

配置高可用我们此次用的是mha,将必要的组建和软件包放在同一个目录下

yum install mha4mysql-node-0.58-0.el7.centos.noarch.rpm -y
##server1,2,3需要安装的节点服务

yum install *	-y			##安装软件,用到的软件如下图

在这里插入图片描述

既然要互相传递数据,所以4个节点之间都应该是ssh免密登陆
[root@server4 MHA-7]# ssh-keygen			##生成密钥,全部默认即可,直接回车

ssh-copy-id server1							##将密钥发给另外3个节点,此时server4与另外3个节点实现免密连接
ssh-copy-id server2
ssh-copy-id server3

scp -r ~/.ssh/ server1:/root/				##将密钥和锁发给另外3个节点,让他们之间实现免密连接
scp -r ~/.ssh/ server2:/root/
scp -r ~/.ssh/ server3:/root/

互相连接测试下是ok的

(1)管理配置文件的编写

mkdir /etc/masterha
vim /etc/masterha/master.cnf

在这里插入图片描述
在这里插入图片描述
(2)服务的检查(两个检查必须都没问题)

masterha_check_ssh --conf=/etc/masterha/master.cnf			##ssh是否能互相免密连接
masterha_check_repl --conf=/etc/masterha/master.cnf			##检测repl用户在节点之间是否能复制
成功如下图所示:

在这里插入图片描述
在这里插入图片描述

(3)服务的手动切换节点

当master挂掉时,手动生成新的master

先关闭server1的mysql		systemctl stop mysqld

masterha_master_switch --master_state=dead --conf=/etc/masterha/master.cnf --dead_master_host=172.25.21.1 /
--dead_master_ip=172.25.21.1 --dead_master_port=3306 --new_master_host=172.25.21.2 --new_master_port=3306
##在server1挂掉以后,可以手动将server2设为新的master
##执行后可以看到新master的生成过程

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
当server1被修好后,让他再加入这个集群并成为一个slave,避免多次切换造成的资源浪费

server1上的操作:

systemctl start mysqld		##启动服务
mysql -uroot -pYy+12345
change master to master_host='172.25.21.2',master_user='repl',master_password='Yy+12345',\
master_auto_position=1;					##以server2为master,将server1当作slave加入
start slave;							##开启slave
show slave status\G;					##查看slave状态是否为yes

在所有节点都存活的状态下,再把server1切换回来

在管理节点server4上操作:
rm -fr /etc/masterha/master.failover.complete		##首先删除切换一次后生成的空文件(影响下一次切换)
masterha_master_switch --master_state=alive --conf=/etc/masterha/master.cnf  --new_master_host=172.25.21.1 \
--new_master_port=3306 --orig_master_is_new_slave --running_updates_limit=10000
##这里的10000代表的是10s

在server1再次show slave status\G;显示为空

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(4)服务的自动切换

实际上就是编写了两个脚本,把它们加入到配置文件中,在出问题时,通过使用这两个脚本,实现了master的一个专门的ip的漂移,以此来实现master的切换

首先编写两个脚本
vim /usr/local/bin/master_ip_failover

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

vim /usr/local/bin/master_ip_online_change			##第二个配置文件

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(1)将脚本加到配置文件中
vim /etc/masterha/master.cnf

在这里插入图片描述

nohup masterha_manager --conf=/etc/masterha/master.cnf &>/dev/null &		##nohup表示不输出,开启服务
ps aux		##查看服务是否开启
masterha_stop --conf=/etc/masterha/master.cnf				##关闭服务

关掉现有的master,此处为server1,看ip和master能否自动出现在server2上,漂移一次后服务会自动关闭
systemctl stop mysqld

在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值