mysql主从配置与读写分离实践与思路

GIT求点赞点击进入GITHUB

mysql主从配置详解与读写分离方案

首先主从配置和读写分离是两个东西;主从配置是读写分离的基础;这篇文章重在讲解实践过程。

主从配置

主从配置主要是解决以下单独数据服务器的缺点:

  • 效率低;单台肯定比不上多台啊
  • 抗灾性能差;就是数据没有备份
以前解决方案是:
  • 多台机器同时使用,数据自己写代码去同步
  • 程序定时备份数据库,对数据库得压力也大

一切以不给程序猿增加工作量的原则;mysql官方就推出了主从模式; 简单来说这个就是通过配置主从后,mysql来帮你把主数据库的数据同步到从数据库; 简单解释下同步的原理:mysql所有操作都是可以生成日志文件的,当你启用主从模式后,主库会把你所有的增删改查记录到日志中,然后从库会去拿这个日志文件,再根据日志来进行数据回演;这样所有的数据就生成到从库。

mysql同步原理

这里我们先讲主从配置;要做主从配置首先要满足以下条件:

  • 两台单独的服务器,并且能相互访问
  • 最好安装相同版本的mysql

好的,现在我们准备如下两台主机:

10.1.1.195	windows	master
10.1.1.130	ubantu	slave

接下来按照标准步骤安装mysql到两台服务器上;完毕后启动mysql;测试是否能成功链接;

现在开始配置;根据刚刚讲解的原理,我们要做以下配置:

  • 子服务器是通过父服务器日志文件进行数据重演的,那么父服务器需要开启某种日志记录;
  • 子服务器需要到主服务器上拉日志文件;那么子服务器就需要一个账号;

好的,现在我们首先开启主库的二进制数据日志记录,打开主库的my.ini增加以下字段:

[mysqld]
log-bin=mysql-bin-master  #启用二进制日志
server-id       = 1   #本机数据库ID ;注意:从库的server-id一定要大于主库,也就是说从库的server-id只能>=1
#binlog-do-db=HA   #可以被从服务器复制的库。二进制需要同步的数据库名,可以不配置
#binlog-ignore-db=mysql  #不可以被从服务器复制的库, 可以不配置

好的,接下来我们给从库创建一个用于拉去日志文件的账号,root连接到主库,执行以下sql:

grant replication slave on *.* to 'slave'@'10.1.1.130' identified by "slave1";

#grant all privileges on *.* to 'slave'@'%' identified by 'slave1';

第一条意思是创建一个名为slave,密码是slave1的账号,这个账号只能从10.1.1.130这个IP登陆;这个账号有replication slave,这两个权限; 第二条意思是创建一个名为slave,密码是slave1的账号,这个账号可以从任意IP登陆;这个账号有所有权限; 选一条就行

好了,现在主库已经配置好了。重新启动mysql服务器;并把数据库备份出来; 经常数据备份是很重要的; root连接到主库,执行下列sql命令查看主库状态:

mysql> show master status;
+-------------------------+----------+--------------+------------------+
| File                    | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------------+----------+--------------+------------------+
| mysql-bin-master.000001 |      259 | HA           | mysql            |
+-------------------------+----------+--------------+------------------+

上面的file字段和position字段是重要的,后面会用到;

接下来配置从库,第一步也是编辑从库的配置文件:

[mysqld]
server-id = 2   #本机数据库ID ;注意:从库的server-id一定要大于主库

从库不用记录操作日志文件,所以只用增加一个server-id就行了; 接下来重启从库并root连接上去,先把主库的备份数据导入到从库; 然后执行以下sql再从库中添加主库信息:

change master to
master_host='10.1.1.195', #主库的服务器地址
master_user='slave', #创建用于拉取日志文件的账号
master_password='slave1', #密码
master_log_file=' mysql-bin.000001', #上面的file字段的值
master_log_pos= 295 #上面的Position字段的值

配置完毕后就可以启动从库了;启动执行:

start slave;

这样从库就启动成功了,使用下面命令查看是否启动成功:

show slave status /G;

注意查看返回结果,其中部分字段应该如下返回:

Slave_IO_Running: Yes
Slave_SQL_Running: Yes
...
Last_IO_Error:0
Last_SQL_Error:0

这样的话,就配置成功了,你可以去操作你的主库,创建个数据库或者插入语句,然后到从库去看看。

上面的配置值得一提的是,如果重新启动mysql服务那么file和position的值会变化,你应该更改从库的主库配置;更改流程如下:

  • 首先使用stop slave 停止从库
  • 使用reset slave 重置从库
  • 使用change master to...重新设置主库信息
  • 使用start slave启动从库

接下来列举一些导致失败的原因:

  • 关闭防火墙或则添加规则,避免从库被墙而拿不到日志文件
  • mysql文件编辑时注意,别写错了,写错了启动不起来
  • 更改配置后需要重新启动mysql服务

好了,主从配置将完了,接下来说说读写分离

有了主从配置,现在我们可以把数据放到10个20个服务器上面,那么这么多库除了备份数据还能有其他作用吗?所有的操作都还再主数据库中,并发流量大了主服务器还不是炸了,所以跟着主从库连着一起有出来了读写分离; 读写分离很好理解,一般从库用于读,主库用于写; 一般读写分离的解决方案有以下几种:

  • 自己编码解决
  • 使用中间件,也就是第三方提供的程序解决
自己写代码解决

自己写代码解决方案不太推荐,因为前期还好,后期随着代码和数据规模大了后,添加数据源,或者更换数据源策略就不好弄了。

使用第三方中间件

使用第三方是一个比较好的方法,现在成熟的中间件有以下几个,感兴趣的自己baidu

  • mysql-proxy,mysql官方提供了
  • Amoeba,阿里开源的一款,现在用于项目中

转载于:https://my.oschina.net/u/3441779/blog/1635925

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值