在CentOS7上搭建MySQL主从复制与读写分离

MySQL主从复制原理

MySQL的主从复制和MySQL的读写分离两者有着紧密联系,首先要部署主从复制,只有主从复制完成了,才能在此基础上进行数据的读写分离。

(1)MySQL支持复制的类型。

1)基于语句的复制。MySQL默认采用基于语句的复制,效率比较高。

2)基于行的复制。把改变的内容复制过去,而不是把命令在从服务器上执行一遍。

3)混合类型的复制。默认采用基于语句的复制,一旦发现基于语句无法精确复制时,就会采用基于行的复制。

(2)MySQL复制的工作过程如图所示。

1)在每个事务更新数据完成之前,Master在二进制日志记录这些改变。写入二进制日志完成后,Master通知存储引擎提交事务。

2)Slave将Master的Binary log复制到其中继日志。首先,Slave开始一个工作线程——I/O线程,I/O线程在Master上打开一个普通的链接,然后开始Binlog dump process。Binlog dump process从Master的二进制日志中读取事件,如果已经跟上Master,它会睡眠并等待Master产生新的事件。I/O线程将这些事件写入中继日志。

3)SQL slave thred(SQL从线程)处理该过程的最后一步。SQL线程从中继日志读取事件,并重放其中的事件而更新Slave的数据,使其与Master中的数据一致。只要该线程与I/O线程保持一致,中继日志通常会位于OS的缓存中,所以中继日志的开销很小。

复制过程中有一个很重要的限制,即复制在Slave上是串行化的,也就是说Master上的并行更新操作不能在Slave上并行操作。

MySQL读写分离原理

简单来说,读写分离(见图所示)就是只在主服务器上写,只在从服务器上读。基本原理是让主数据库处理事务性查询,而从数据库处理select查询。数据库复制被用来把事务性查询导致的变更同步到群集中的从数据库。

基于中间代理层实现:代理一般位于客户端和服务器之间,代理服务器接到客户端请求通过判断后转发到后端数据库。

实验环境

使用五台服务器模拟搭建,具体的拓扑如图所示:

实验环境表:

实施步骤

1.搭建MySQL主从复制。

(1)建立时间同步环境,在主节点上搭建时间同步服务器。

1)安装NTP。

[[email protected] ~]# yum install ntp -y

2)配置NTP。

[[email protected] ~]# vim /etc/ntp.conf
server 127.127.126.0                    //本地是时钟源//
fudge 127.127.126.0 stratum 8          //设置时间层级为8(限制在15内)//

3)重启服务。

[[email protected] ~]# systemctl restart ntpd.service

(2)在从节点服务器上进行时间同步。

[[email protected] ~]# yum install ntpdate -y
[[email protected] ~]# /usr/sbin/ntpdate 192.168.126.138  //同步主服务器的时间//

(3)在每台服务器上关闭firewalld防火墙。

[[email protected] ~]# systemctl stop firewalld.service   //关闭防火墙//
[[email protected] ~]# setenforce 0

(4)安装MySQL数据库。在Master、Slave1、Slave2上安装,我用的数据库是MySQL5.7.17这里安装完毕不再演示。

(5)配置MySQL Master主服务器。

1)在/etc/my.cnf中修改或者增加以下内容。

[[email protected] mysql]# vim /etc/my.cnf
server-id = 11
log-bin=master-bin             //主服务器日志文件//
log-slave-updates=true      //从服务器更新二进制日志//

2)重启MySQL服务。

[[email protected] ~]# systemctl restart mysqld.service

3)登录MySQL程序,给服务器授权。

[[email protected] ~]# mysql -uroot -p
mysql> GRANT REPLICATION SLAVE ON *.* TO ‘myslave‘@‘192.168.126.%‘ IDENTIFIED BY ‘123456‘;      //授权//
mysql> FLUSH PRIVILEGES;
mysql> show master status;
+-------------------+----------+--------------+------------------+-------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000001 |      604 |              |                  |                   |
+-------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
其中File列显示日志名,position列显示偏移量。

(6)配置从服务器。
1)在/etc/my.cnf中修改或者增加以下内容。

[[email protected] ~]# vim /etc/my.cnf
server-id = 22
relay-log=relay-log-bin             //从主服务器上同步日志文件记录到本地//
relay-log-index=slave-relay-bin.index   //定义relay-log的位置和名称//

这里要注意server-id不能与主服务器相同。

2)重启mysql服务。

[[email protected] ~]# systemctl restart mysqld.service 

3)登录mysql,配置同步。

按主服务器结果更改下面命令中的master_log_file和master_log_pos的参数。

[[email protected] ~]# mysql -u root -p
mysql> change master to master_host=‘192.168.126.138‘,master_user=‘myslave‘,master_password=‘123456‘,master_log_file=‘master-bin.000001‘,master_log_pos=604;

4)启动同步。

mysql> start slave;

5)查看Slave状态,确保以下两个值为YES。

mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.126.138
                  Master_User: myslave
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master-bin.000001
          Read_Master_Log_Pos: 604
               Relay_Log_File: relay-log-bin.000002
                Relay_Log_Pos: 321
        Relay_Master_Log_File: master-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB:
          Replicate_Ignore_DB:

(7)验证主从复制效果。

1)在主服务器上新建数据库 db_test。

mysql>  create database db_test;

2)在主、从服务器上分别查看数据库,显示数据库相同,则主从复制成功。

mysql> show databases;      //主服务器//
+--------------------+
| Database           |
+--------------------+
| information_schema |
| db_test            |
| mysql              |
| performance_schema |
| school             |
| sys                |
+--------------------+
6 rows in set (0.03 sec)

mysql> show databases;    //从服务器//
+--------------------+
| Database           |
+--------------------+
| information_schema |
| db_test            |
| kgc                |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
6 rows in set (0.05 sec)

搭建MySQL读写分离

Amoeba(变形虫),这个软件致力于MySQL的分布式数据库前端代理层,它主要为应用层访问MySQL时充当SQL路由,并具有负载均衡、高可用性、SQL过滤、读写分离、可路由相关到目标数据库、可并发请求多台数据库。通过Amoeba能够完成多数据源的高可用、负载均衡、数据切片的功能。

(1)在主机Amoeba上安装Java环境。

Amoeba是基于jdk1.5开发的,所以官方推荐使用jdk1.5或1.6版本,高版本不建议使用。

[[email protected] ~]# systemctl stop firewalld.service
[[email protected] ~]# setenforce 0
[[email protected] tomcat]# cp jdk-6u14-linux-x64.bin /usr/local/
[[email protected] local]# ./jdk-6u14-linux-x64.bin    //根据提示按Enter键完成即可//
[[email protected] local]# mv jdk1.6.0_14/ /usr/local/jdk1.6
[[email protected] local]# vim /etc/profile

增加以下配置

export JAVA_HOME=/usr/local/jdk1.6
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$JAVA_HOME/lib:$JAVA_HOME/jre/bin/:$PATH:$HOME/bin
export AMOEBA_HOME=/usr/local/amoeba
export PATH=$PATH:$AMOEBA_HOME/bin

[[email protected] local]# source /etc/profile   //启动//

Java环境已配置成功。

(2)安装并配置Amoeba软件

[[email protected] local]# mkdir /usr/local/amoeba  创建工作路径//
[[email protected] tomcat]# tar zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba   //解压安装包//
[[email protected] tomcat]# chmod -R 755 /usr/local/amoeba/  //提示amoeba权限//
[[email protected] tomcat]# /usr/local/amoeba/bin/amoeba
amoeba start|stop   //显示此内容说明Amoeba安装成功//

(3)配置Amoeba读写分离,两个Slave读负载均衡。
1)Master、Slave1、Slave2中开放权限给Amoeba访问。

grant all on *.* to [email protected]‘192.168.126.%‘ identified by ‘123.com‘;

2)编辑amoeba.xml配置文件。

[[email protected] tomcat]# cd /usr/local/amoeba/
[[email protected] amoeba]# vim conf/amoeba.xml
---30行--

 <property name="user">amoeba</property>
----32行---------
 <property name="password">123456</property>

---117-去掉注释-
 <property name="defaultPool">master</property>
 <property name="writePool">master</property>
 <property name="readPool">slaves</property>

3)编辑dbServers.xml配置文件。

vi conf/dbServers.xml

--26-29--去掉注释--      //行//
 <property name="user">test</property>    

 <property name="password">123.com</property>

-----42-主服务器地址---
<dbServer name="master"  parent="abstractServer">
 <property name="ipAddress">192.168.126.138</property>
--52-从服务器主机名-
<dbServer name="slave1"  parent="abstractServer">
--55-从服务器地址-
 <property name="ipAddress">192.168.126.162</property>
 从服务器slave2
<dbServer name="slave2"  parent="abstractServer">      //添加//
 <property name="ipAddress">192.168.126.232</property>
 <dbServer name="slaves" virtual="true">
 <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">

--末尾--
<property name="poolNames">slave1,slave2</property>    //修改//
 </poolConfig>

4)配置无误后,可用启动Amoeba软件,其默认端口为TCP 8066。

[[email protected] amoeba]# /usr/local/amoeba/bin/amoeba start&
[[email protected] amoeba]#  netstat -anpt | grep java
tcp6       0      0 127.0.0.1:28750         :::*                    LISTEN      3370/java
tcp6       0      0 :::8066                 :::*                    LISTEN      3370/java
.....//省略//

(4) 测试
1)在client主机上。

[[email protected] ~]# yum install mysql -y

可以通过代理访问MySQL:

[[email protected] ~]# mysql -u amoeba -p123456 -h 192.168.126.132 -P8066
..... //省略//
MySQL [(none)]>

2)在Master上创建一个表,同步到各从服务器上,然后关闭各从服务器的Slave功能,再插入区别语句。

mysql> use db_test;
Database changed
mysql> create table zang (id int(10),name varchar(10),address varchar(20)); //创建表//
Query OK, 0 rows affected (0.06 sec)

分别在两台服务器上关闭slave功能:

mysql> stop slave;

然后在主服务器上插入区别语句:

mysql> insert into zang values(‘1‘,‘zhang‘,‘this_is_master‘);  //插入数据//

3)从服务器上手动插入其他内容。

slave1:
mysql> use db_test;
mysql> insert into zang values(‘2‘,‘zhang‘,‘this_is_slave1‘);   //插入数据//
Query OK, 1 row affected (0.03 sec)

slave2:
mysql> use db_test;
mysql> insert into zang values(‘3‘,‘zhang‘,‘this_is_slave2‘); //插入数据//
Query OK, 1 row affected (0.03 sec)

4)测试读操作
在client主机上第一次查询的结果如下:

MySQL [db_test]> select * from zang;
+------+-------+----------------+
| id   | name  | address        |
+------+-------+----------------+
|    3 | zhang | this_is_slave2 |
+------+-------+----------------+
1 row in set (0.01 sec)

第二次查询的结果如下:

MySQL [db_test]> select * from zang;
+------+-------+----------------+
| id   | name  | address        |
+------+-------+----------------+
|    2 | zhang | this_is_slave1 |
+------+-------+----------------+
1 row in set (0.01 sec)

第三次查询结果:

MySQL [db_test]> select * from zang;
+------+-------+----------------+
| id   | name  | address        |
+------+-------+----------------+
|    3 | zhang | this_is_slave2 |
+------+-------+----------------+
1 row in set (0.01 sec)

5)测试写操作。
在client主机上插入一条语句:

MySQL [db_test]> insert into zang values(‘5‘,‘zhang‘,‘write_test‘);
Query OK, 1 row affected (0.02 sec)

但在client上查询不到,最终只有在Master上才能查看到这条语句内容,说明写的操作在Master服务器上。

mysql> select * from zang;
+------+-------+----------------+
| id   | name  | address        |
+------+-------+----------------+
|    1 | zhang | this_is_master |
|    5 | zhang | write_test     |
+------+-------+----------------+
2 rows in set (0.01 sec)

由此验证,已经实现了MySQL读写分离,目前所有的写操作全部在Master主服务器上,用来避免数据 的不同步;所有的读操作都分摊给了Slave从服务器,用来分担数据库的压力。

原文地址:http://blog.51cto.com/13642258/2140961

时间: 2024-11-28 23:08:36

在CentOS7上搭建MySQL主从复制与读写分离的相关文章

搭建 MySQL主从复制与读写分离

搭建 MySQL主从复制与读写分离 案例概述 : 在实际环境中 ,如果对数据库的读和写都在同一个数据库服务中操作 ,无论实在安全性.高可用性, 还是高并发等各个方面都是完全不能满足实际需求的 ,因此 ,一般来说都只通过主从复制的方式来同 步数据 ,在通过读写分离来提升数据库的并发负载能力 ,这样的方案来进行部署与实施 . 环境拓补图 : 本案环境 : 主机 操作系统 IP地 址 主要软件 主服务器 CentOS 7.3 x86_64 192.168.217.130 NTP 从服务器1 CentO

基于Centos 7搭建MySQL主从复制及读写分离

博文目录一.MySQL主从复制原理二.MySQL读写分离原理三.搭建MySQL主从复制四.配置MySQL读写分离 在实际生产环境中,如果对数据库的读和写都在同一个数据库服务器中操作,无论是在安全性.高可用性还是高并发等各个方面都是完全不能满足实际需求的.因此,一般来说实际生产环境中都是通过主从复制(Master--Slave)的方式来同步数据,再通过读写分离来提升数据库的并发负载能力这样的方案来进行部署与实施的. 如下图所示,一台MySQL主服务器带两台MySQL从服务器做数据复制,前端应用在进

MySQL主从复制、读写分离、高可用集群搭建

MySQL主从复制.读写分离.高可用集群搭建  一.服务介绍   1.1 Keepalived     Keepalived,见名知意,即保持存活,其目的是解决单点故障,当一台服务器宕机或者故障时自动切换到其他的服务器中.Keepalived是基于VRRP协议实现的.VRRP协议是用于实现路由器冗余的协议,VRRP协议将两台或多台路由器设备虚拟成虚拟设备,可以对外提供虚拟路由器IP(一个或多个),即漂移IP(VIP). 1.2 ProxySQL ProxySQL是一个高性能,高可用性的MySQL

Mysql 主从复制,读写分离

Mysql 主从复制及读写分离 特别推荐看:amoeba.xml 的配置部分,在百度上看了很多配置都不完整,是我测试时的痛点 实验的目的: 有两部分:第一实现Mysql主从复制,第二实现读写分离. 下面是实验的环境: 192.168.58.11     安装了amoeba 的节点 192.168.58.16      master    系统:rhel 5.4 192.168.58.12      slave     系统: rhel 5.4 192.168.58.11      代理     

搭建MySQL代理服务器实现读写分离+主从同步

实验需求: 1.配置2台MySQL服务器(192.168.100.2,192.168.100.3)+1台代理服务器(192.168.100.1),实现MySQL代理的读写分离. 2.用户只需要访问MySQL代理服务器,实际的SQL查询.写入操作交给后台的2台MySQL服务器来完成. 3.2台MySQL服务器实现主从同步,其中Master服务器允许SQL查询.写入,Slave服务器只允许SQL查询. 一 .MASTER数据库服务器(192.168.100.2)的配置 1.安装软件包(本实验采用My

MySQL 主从复制与读写分离

Mysql主从复制作用原理 1.在业务复杂的系统中,有这么一个情景,有一句sql语句需要锁表,导致暂时不能使用读的服务,那么就很影响运行中的业务,使用主从复制,让主库负责写,从库负责读,这样,即使主库出现了锁表的情景,通过读从库也可以保证业务的正常运作.2.做数据的热备3.架构的扩展.业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘I/O访问的频率,提高单个机器的I/O性能.mysql主从复制是一个异步的复制过程,主库发送更新事件到从库,从库读取更新记录,并执行更新记

重新学习Mysql数据13:Mysql主从复制,读写分离,分表分库策略与实践

一.MySQL扩展具体的实现方式 随着业务规模的不断扩大,需要选择合适的方案去应对数据规模的增长,以应对逐渐增长的访问压力和数据量. 关于数据库的扩展主要包括:业务拆分.主从复制.读写分离.数据库分库与分表等.这篇文章主要讲述数据库分库与分表 (1)业务拆分 在?大型网站应用之海量数据和高并发解决方案总结一二?一篇文章中也具体讲述了为什么要对业务进行拆分. 业务起步初始,为了加快应用上线和快速迭代,很多应用都采用集中式的架构.随着业务系统的扩大,系统变得越来越复杂,越来越难以维护,开发效率变得越

mysql主从复制与读写分离

MySQL主从复制与读写分离 MySQL主从复制(Master-Slave)与读写分离(MySQL-Proxy)实践 Mysql作为目前世界上使用最广泛的免费数据库,相信所有从事系统运维的工程师都一定接触过.但在实际的生产环境中,由单台Mysql作为独立的数据库是完全不能满足实际需求的,无论是在安全性,高可用性以及高并发等各个方面. 因此,一般来说都是通过 主从复制(Master-Slave)的方式来同步数据,再通过读写分离(MySQL-Proxy)来提升数据库的并发负载能力 这样的方案来进行部

Mysql主从复制、读写分离工作原理+配置

Mysql的 Replication 是一个异步的复制过程,从一个 Mysql instace(我们称之为 Master)复制到另一个 Mysqlinstance(我们称之 Slave).在 Master 与 Slave 之间的实现整个复制过程主要由三个线程来完成,其中两个线程(Sql线程和IO线程)在 Slave 端,另外一个线程(IO线程)在 Master 端. MySQL 复制的基本过程如下: 1. Slave 上面的IO线程连接上 Master,并请求从指定日志文件的指定位置(或者从最开