读写分离与主从复制是提升mysql性能的重要及必要手段,大中型管理系统或网站必用之。

一、什么是读写分离与主从复制

先看图

如上图所示,当web server1/2/3要写入数据时,则向mysql db Master(主服务器)发出写入请求(即写入到master),如果要进入读操作时,则只向从服务器 mysql DB Slave1或2或3发出读取请求。如此将原本读写在同一台服务器的工作量分摊到了一台负责写入,N台负责读取(大部分的网站都是读取请求远大于写入请求),从而从一定程度时实现了负载均衡(如果有N台从服务器,则由主从代理系统自动分配某个具体请求从哪一个从服务器读取)。

读写分离是靠主从复制来实现的。即当一个数据写入到主服务器后,主服务器会将写入信息写入到binlog(二进制日志)里,同时同步(或异步或半同步)到从服务器里。从服务器根据主服务器传来的binlog,生成relay-log(中继日志),然后mysql服务器再用relay-log的信息将数据写入到数据库。

如此做的优点除了实现负责均衡之外,还为我们保留了两份实时热备的数据binlog和relay-log。当服务器发生灾难时,我们可以用他们将数据恢复到任何一个时间点。

二、准备

1、在linux上安装好两台mysql服务器(mysql至少5.5以上),且两台服务器最好在一个机房(如此通过内网进行主从复制,速度远远大于通过外网。如果web服务器也在同一机房,则也可内网访问,还不用向ISP买带宽)。

假定主的IP为10.121.0.110,从的IP为10.121.0.220.

2、关闭两台服务器的防火墙(稍后再配置):

# service iptables stop  (这是centos6.5关闭方法,其他系统请问度娘)

3、如果你没有创建数据库,则进行如下操作

(1)在主服务器上登录mysql

# mysql -uroot -p你的密码

(2)创建数据库

mysql> create database test1;

mysql> create database test2;

(3)如果已经有历史数据,则将历史数据备份成sql文件上传到主服务器,运行如下命令

mysql> source /disk/test1.sql;('/disk/test1.sql '换成你自己的路径即可)

三、主服务器配置

mysql已经提供了完美的读写分离与主从复制支持,我们只需要作如下设置即可。

1、配置my.cnf

# vi /etc/my.cnf

(1)去掉log-bin=mysql-bin前的“#”号。这一行的意思是允许mysql使用binlog,同时为主从复制打开了大门。这是关键中的关键中的关键。

(2)如果有多个数据库,则添加如下行:

binlog-do-db=数据库名1

binlog-do-db=数据库名2

binlog-do-db=数据库名3

binlog-ignore-db=mysql(忽略mysql自身用的数据库)

(3)查看server-id是后的数字并记住。slave(从服务器)的server-id不能与该值重复。

(4)查看expire-log-day。binlog过期时间,默认为10天。你可以根据你硬盘空间大小及每天产生的数据量修改。如果你有冷备,则一般设成2-3天即可。

2、操作数据库

(1)在linux命令行下登录mysql

# mysql -uroot -p(你的root密码)

(2)创建并授权一个帐号

mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave_account'@'10.121.0.220' identified by '123456'

这句的意思是,允许从服务器'10.121.0.220 '使用'slave-account'及'123456'这个帐号密码对对主服务器的所有数据库(*.*)进行主从复制('REPLICATION SLAVE').

(3)重启mysql使上述配置生效

# etc/init.d/mysql restart   或

# service mysql restart

(4)查看主服务器binlog状态

mysql> show master stauts;

记下File及Position下的值。以备在配置从服务器时使用。

注:File:当前binlog的文件名,每重启一次mysql,就会生成一个新binlog文件

Position:当前binlog的指针位置

三、从服务器配置

1、配置mysql.cnf

# vi /etc/my.cnf

(1)修改server-id=2(该值不能与主服务器的server-id同。如果有多个从服务器,则该值顺延)

(2)添加如下两行:

relay-log-index=slave-relay-bin.index (中继日志的索引文件)

relay-log=slave-relay-bin  (中继日志的文件前缀)

(3)重启mysql使上述配置生效

# /etc/init.d/mysql restart

(4)登录mysql

# mysql -uroot -p你的密码

(5)停止主从复制服务

mysql> stop slave

(6)主从关联配置

mysql> change master to

master_host='10.121.0.110', #主服务器IP

master_user='slave_account ',  #主服务器访问从服务器的用户,即上述第三条第2小条第2子条所述帐号

master_password='123456', #主服务器访问从的密码,即上述第三条第2小条第2子条所述密码

master_log_file='mysql-bin.000008',   #主服务器起始的binlog文件名,即图2的file

master_log_pos=107; #主服务器binlog起始位置,即图2的postion

上述每行都特别重要,错一个字符都不行

(7)启动从服务

mysql> start slave

(8) 查看从服务的状态,判断从服务是否生效

mysql> show slave status\G;  (G参数为纵向显示结果)

会显示如下结果

Slave_IO_State: Waiting for master to send event

Master_Host: 192.168.0.110

Master_User: slave_account

Master_Port: 3306

Connect_Retry: 60

Master_Log_File: mysql-bin.00008

Read_Master_Log_Pos: 107

Relay_Log_File: slave-relay-bin.000002

Relay_Log_Pos: 253

Relay_Master_Log_File: mysql-bin.00008

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

Replicate_Do_DB:

Replicate_Ignore_DB:

Replicate_Do_Table:

Replicate_Ignore_Table:

Replicate_Wild_Do_Table:

Replicate_Wild_Ignore_Table:

Last_Errno: 0

Last_Error:

Skip_Counter: 0

Exec_Master_Log_Pos: 264

Relay_Log_Space: 409

Until_Condition: None

Until_Log_File:

Until_Log_Pos: 0

Master_SSL_Allowed: No

Master_SSL_CA_File:

Master_SSL_CA_Path:

Master_SSL_Cert:

Master_SSL_Cipher:

Master_SSL_Key:

Seconds_Behind_Master: 0

Master_SSL_Verify_Server_Cert: No

Last_IO_Errno: 0

Last_IO_Error:

Last_SQL_Errno: 0

Last_SQL_Error:

Replicate_Ignore_Server_Ids:

Master_Server_Id: 1

如果Slave_IO_Running和Slave_SQL_Running都显示YES,则表示从与主的读写通讯正常、主动复制已经运行,则表明我们主从复制已经设置成功。如果出现故障,则看下节“故障排除”。

然后,你再在主服务器插入一条数据,看看从服务器相应数据库里有没有做相应更新。如果有,则大功告成。

四、权限配置 

虽然某些mysql版本不进行如下操作,可能也能正常运行,但我还是强列建议你设置。否则,必有安全之虑。

1、为master分配select、insert、update、delete权限

mysql>GRANT SELECT,INSERT,UPDATE,DELETE ON *.* TO '数据库的帐号'@'WEB服务器的IP'  identified by '密码'。

注意,虽然master只负责写,但也必须有select权限。原因是使用事务时,需要从master查询,二是update/delete这些命令都需要使用select权限。

2、为slave分配select权限

mysql> GRANT SELECT ON *.* TO '数据库的帐号'@'WEB服务器的IP'  identified by '密码';

这样设置也有一个弊端,就是当主宕机时,读写分离机制分主动将写操作转到从上来,这时,就会出现写不正常的情况。所以,slave要分配哪些权限,还看你自己选择。

五、防火墙配置

刚才我们为了调试方便,先关闭了防火墙,但这样做,非常很不安全。特别是数据库服务器,关系公司的身家性命,更不可小视。

主从复制的防火墙,还是比较好设置的,如果你只有一台web服务器,则只需要在主、从服务器的iptables里开放2个授权即可。先在主服务器执行如下命令:

# iptables INPUT -s 10.121.0.220 -j ACCEPT  (允许从服务器访问)

# iptables INPUT -s 10.121.2.142 -j ACCEPT   (允许web服务器访问)

# service iptables save (保存上述规则)

# service iptables restart  (重启iptables)

在从中将第一条换成主的IP即可。

设置完后,再在从上用show slave status看看主从复制是否正常。

六、一些故障排除

设置过程中,可能会出现如下几个故障

(1) Slave_IO_Running: No

(2) Slave_IO_Running: Connect

(3)Last_IO_Error: error connecting to master 'slave-account@192.168.0.110:3306' - retry-time: 60  retries: 8640

其实上述故障,都是由IO不正常造成的,请从如下几个步骤着手检查。

a.配置完主或从的my.cnf后,是否重启了mysql服务。如果重启还不成功,则可以用reboot命令重启服务器后再试

b.change master那一步所填写的信息是否正确。

(4)Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server ids; these ids must be different for replication to work (or the --replicate-same-server-id option must be used on slave but this does not always make sense; please check the manual before using it).

如上是说主、从使用了相同的server-id,进入my.cnf检查,改正之,然后重启mysql服务。

七、php设置

在php的数据库连接配置文件里作如下设置即可

//该行读写分离支持

'DB_DEPLOY_TYPE'=> 1,

'DB_RW_SEPARATE'=>true,

//主、从数据库的IP地址,前为主,后从

'DB_HOST'   => '10.121.0.110,10.121,0.220',

// 数据库类型

'DB_TYPE'   => 'mysql',

// 用户名,如果主和从的用户名相同,则 可省略一个

'DB_USER'   => 'root root',

// 用户名,如果主和从密码相同,则可省略一个

'DB_PWD'    => '123456 123456',

// 用户名,如果主和从数据库相同,则可省略一个

'DB_NAME'   => 'test test',

 

其他设置请参照本人的《使TP框架在主从复制下“支持事务”》

[mysql终极优化]之主从复制与读写分离详细设置教程的更多相关文章

  1. linux下mysql基于mycat做主从复制和读写分离之基础篇

    Linux下mysql基于mycat实现主从复制和读写分离1.基础设施 两台虚拟机:172.20.79.232(主) 172.20.79.233(从) 1.1软件设施 mysql5.6.39 , my ...

  2. MySQL+Amoeba实现数据库主从复制和读写分离

    MySQL读写分离是在主从复制的基础上进一步通过在master上执行写操作,在slave上执行读操作来实现的.通过主从复制,master上的数据改动能够同步到slave上,从而保持了数据的一致性.实现 ...

  3. mysql主从复制以及读写分离

    之前我们已经对LNMP平台的Nginx做过了负载均衡以及高可用的部署,今天我们就通过一些技术来提升数据的高可用以及数据库性能的提升. 一.mysql主从复制 首先我们先来看一下主从复制能够解决什么问题 ...

  4. MySQL 主从复制与读写分离 (超详细图文并茂小白闭着眼睛都会做)

    MySQL 主从复制与读写分离 1.什么是读写分离 2.为什么要读写分离 3.什么时候要读写分离 4.主从复制与读写分离 5.mysql支持的复制类型 6.主从复制的工作过程 7.MySQL主从复制延 ...

  5. 30.Mysql主从复制、读写分离

    Mysql主从复制.读写分离 目录 Mysql主从复制.读写分离 读写分离 读写分离概述 为什么要读写分离 什么时候要读写分离 主从复制与读写分离 mysql支持的复制类型 主从复制的工作过程 初始环 ...

  6. Mysql主从复制,读写分离(mysql-proxy),双主结构完整构建过程

    下面介绍MySQL主从复制,读写分离,双主结构完整构建过程,不涉及过多理论,只有实验和配置的过程. Mysql主从复制(转载请注明出处,博文地址:) 原理是master将改变记录到二进制日志(bina ...

  7. Mysql主从复制,读写分离

    一个简单完整的 Mysql 主从复制,读写分离的示意图. 1. 首先搭建 Mysql 主从架构,实现 将 mater 数据自动复制到 slave MySQL 复制的工作方式很简单,一台服务器作为主机, ...

  8. Mysql 主从复制,读写分离设置

    一个简单完整的 Mysql 主从复制,读写分离的示意图. 1. 首先搭建 Mysql 主从架构,实现 将 mater 数据自动复制到 slave MySQL 复制的工作方式很简单,一台服务器作为主机, ...

  9. 基于Mysql-Proxy实现Mysql的主从复制以及读写分离(下)

    基于Mysql-Proxy实现Mysql的主从复制以及读写分离(下) 昨天谈到了Mysql实现主从复制,但由于时间原因并未讲有关读写分离的实现,之所以有读写分离,是为了使数据库拥有双机热备功能,至于双 ...

随机推荐

  1. C#抓取远程Web网页信息的代码

    来自:http://www.jb51.net/article/9499.htm 通过程序自动的读取其它网站网页显示的信息,类似于爬虫程序.比方说我们有一个系统,要提取BaiDu网站上歌曲搜索排名.分析 ...

  2. SYN2306B型 GPS北斗双模授时板

    SYN2306B型 GPS北斗双模授时板 产品概述 SYN2306B型GPS北斗双模授时板是由西安同步电子科技有限公司精心设计.自行研发生产的一款双模授时板卡,接收北斗或者GPS北斗混合授时卫星信号, ...

  3. SpringBoot整合Redis注意的一些问题

    1:ERR value is not an integer or out of range 1-1:背景 使用redisTemplate.opsForValue().increment(key, de ...

  4. express 中间件的理解

    nodejs(这指express) 中间件 铺垫: 一个请求发送到服务器,要经历一个生命周期,服务端要: 监听请求-解析请求-响应请求,服务器在处理这一过程的时候,有时候就很复杂了,将这些复杂的业务拆 ...

  5. Mybatis_two

    SqlMapConfig.xml配置文件 SqlMapConfig.xml中配置的内容和顺序如下: properties(属性) settings(全局配置参数) typeAliases(类型别名) ...

  6. spring源码深度解析— IOC 之 容器的基本实现

    概述 上一篇我们搭建完Spring源码阅读环境,spring源码深度解析—Spring的整体架构和环境搭建 这篇我们开始真正的阅读Spring的源码,分析spring的源码之前我们先来简单回顾下spr ...

  7. JS的第一天,精彩内容

    1.JS 介绍 js的全称是JavaScript,它是一门前台语言 Java是一门后台语言 ,它们两个之间毫无关系 JavaScript的作者是布兰登,艾奇 前台语言:运行在客户端 后台语言:与数据库 ...

  8. Codeforces Gym101170J:Jupiter Orbiter(最大流)

    题目链接 题意 有n次事件,q个队列,s个传感器.每个传感器接到一个队列,每个队列有一个容量. 接下来执行n次事件,每次事件都会有一个最大发送数据量d.和s个数据a,代表这次给每个s填入a的数据量. ...

  9. Python爬虫入门:爬取pixiv

    终于想开始爬自己想爬的网站了.于是就试着爬P站试试手. 我爬的图的目标网址是: http://www.pixiv.net/search.php?word=%E5%9B%9B%E6%9C%88%E3%8 ...

  10. jacoco生成覆盖率报告

    操作步骤: 1.下载git上最新的代码到本地 git clone  {代码地址} 2.在服务器上打出相关服务的jar包 1) 登上服务器,切换到目标服务所在路径: cd /xx/xx/xx/xx 2) ...