51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

MySQL主从复制与读写分离

MySQL简介

MySQL是最流行的开放源码 SQL数据库管理系统,它是由 MySQL AB 公司开发、发布并支持的。它的插入式存储引擎可以让使用者根据实际应用使用不同的存储。

MySQL源码安装+LVM 逻辑卷

创建逻辑卷 /dev/mysqlvg/mysqllv

[root@localhost ~]# fdisk /dev/sdb

创建一个分区,将类型改为8e并保存退出

[root@localhost ~]# partprobe /dev/sdb
[root@localhost ~]# pvcreate /dev/sdb1
[root@localhost ~]# vgcreate mysqlvg /dev/sdb1
[root@localhost ~]# lvcreate -L 30G -n mysqllv mysqlvg
[root@localhost ~]# mkfs.ext3 /dev/mysqlvg/mysqllv 
[root@localhost ~]# mkdir /usr/local/mysql/data
[root@localhost ~]# mount /dev/mysqlvg/mysqllv /usr/local/mysql/data
[root@localhost ~]# vim /etc/fstab
/dev/mysqlvg/mysqllv /usr/local/mysql/data ext3 defaults 0 0
[root@localhost ~]# mount -a

1)安装Mysql数据库

[root@localhost ~]# yum -y install ncurses-devel

安装配置工具cmake

[root@localhost ~]# tar xf cmake-2.8.12.tar.gz -C /usr/src/
[root@localhost ~]# cd /usr/src/cmake-2.8.12/
[root@localhost cmake-2.8.12]# ./configure && gmake && gmake install
[root@localhost ~]# tar xf mysql-5.7.2-m12.tar.gz -C /usr/src/
[root@localhost ~]# cd /usr/src/mysql-5.7.2-m12/
[root@localhost mysql-5.7.2-m12]# cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all -DSYSCONFDIR=/etc && make && make install

-DCMAKE_INSTALL_PREFIX=/usr/local/mysql //主程序安装目录
-DDEFAULT_CHARSET=utf8 //默认字符集为 utf8
-DDEFAULT_COLLATION=utf8_general_ci //默认的字符集校对规则
-DWITH_EXTRA_CHARSETS=all //安装所有字符集
-DSYSCONFDIR=/etc //配置文件存放目录

2)优化调整

[root@localhost mysql-5.7.2-m12]# cp support-files/my-default.cnf /etc/my.cnf
[root@localhost mysql-5.7.2-m12]# cp support-files/mysql.server /etc/init.d/mysqld
[root@localhost mysql-5.7.2-m12]# chmod +x /etc/init.d/mysqld
[root@localhost mysql-5.7.2-m12]# chkconfig --add mysqld
[root@localhost mysql-5.7.2-m12]# chkconfig --list mysqld
mysqld             0:关闭    1:关闭    2:启用    3:启用    4:启用    5:启用    6:关闭
[root@localhost mysql-5.7.2-m12]# echo "PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile
[root@localhost mysql-5.7.2-m12]# . /etc/profile

3)初始化数据库

[root@localhost mysql-5.7.2-m12]# groupadd mysql
[root@localhost mysql-5.7.2-m12]# useradd -M -s /sbin/nologin -g mysql mysql
[root@localhost mysql-5.7.2-m12]# chown -R mysql:mysql /usr/local/mysql/
[root@localhost mysql-5.7.2-m12]# /usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql/ --datadir=/usr/local/mysql/data --user=mysql

4)启动mysql服务

[root@localhost mysql-5.7.2-m12]# service mysqld start
Starting MySQL..............                               [确定]
[root@localhost mysql-5.7.2-m12]# mysqladmin -u root password '123456'    //设置成自己的密码
[root@localhost mysql-5.7.2-m12]# mysql -u root -p123456

案例概述

在实际的生成环境中,如果对数据库的读和写都在同一个数据库服务器中操作,无论是在安全性,高可用还是高并发等各个方面都不能完全满足实际需求的,因此一般来说都是通过主从复制(Master-Slave)的方式来同步数据,在通过读写分离来提升数据的高并发负载能力这样的方案来进行部署。

MySQL Replication 概述
MySQL Replication 俗称MySQL AB复制(主从,双机热备),从库以一定的频率去读取主库的二进制日志文件,按照日志中记录对从库进行同样的操作,以达到同步效果。

MySQL 支持的复制类型
基于语句的复制 在主服务器上执行的SQL语句,在从服务器上执行同样的语句,MySQL默认采用基于语句的复制,效率比较高
基于行的复制 把改变的内容复制过去,而不是把命令在从服务器上执行一遍
混合类型的复制 默认采用基于语句的复制,一旦发现基于语句无法精确复制时,就会采用行

复制的工作过程
1.在每个事务更新完数据完成之前,Master在二进制日志(Binary log,binlog)记录这些改变,写入二进制日志完成后,Master通知存储引擎提交事务
2.Slave将Master的Binary log复制到其中中继日志,首先Slave开始一个工作线程-I/O线程在Master上打开一个普通的连接,然后开始Binlog dump process,Binlog dump process从Master的二进制日志中读取事件,如果已经跟上Master,它会催眠并等待Master产生新的事件,I/O线程将这些事件写入中继日志。
3.SQL Slave Thread(SQL从线程)处理该过程的最后一步,SQL线程从中继日志读取事件,并重放其中的事件而更新Slave的数据,使其与Master中的数据一致,只要该线程与I/O线程保持一致,中继日志通常会在OS的缓存中,所以中继日志的开销很小。

复制过程的限制
1.即复制在Slave上是串行化的,也就是说Master上的并行更新不能在Slave上并行操作
2.MYSQL的版本都要高于3.2,还有一个基本的原则就是作为从数据库的数据库版本可以高于主服务器数据库的版本,但是不可以低于主服务器的数据库版本

从库以一定的频率去读取主库的二进制日志文件,按照日志中记录对从库进行同样的操作,以达到同步效果。

MySQL Master IP: 192.168.200.128
MySQL Slave1 IP: 192.168.200.129
MySQL Slave2 IP: 192.168.200.130

每台机器上的操作

[root@localhost ~]# service iptables stop
[root@localhost ~]# service sshd start
[root@localhost ~]# setenforce 0

在MySQL Master 上的配置

在主服务器上建立时间同步服务器NTP

[root@localhost ~]# mount /dev/cdrom /mnt/
[root@localhost ~]# cd /etc/yum.repos.d/
[root@localhost yum.repos.d]# mkdir bak
[root@localhost yum.repos.d]# mv *.repo bak/
[root@localhost yum.repos.d]# vim yum.repo
[root@localhost yum.repos.d]# cat yum.repo
[base]
name=base
baseurl=file:///mnt
gpgcheck=0
[root@localhost yum.repos.d]# yum -y install ntp

配置NTP

[root@localhost yum.repos.d]# vim /etc/ntp.conf    #添加两行
server 127.127.1.0
fudge 127.127.1.0 stratum 8

启动NTP服务

[root@localhost yum.repos.d]# service ntpd restart
关闭 ntpd:                                                [确定]
正在启动 ntpd:                                            [确定]

在从节点上进行时间同步

[root@localhost mysql-5.7.2-m12]# yum -y install ntpdate
[root@localhost mysql-5.7.2-m12]# /usr/sbin/ntpdate 192.168.200.128
 2 Jan 00:48:18 ntpdate[27781]: adjust time server 192.168.200.128 offset 0.301932 sec

配置mysql master服务器

1.在/etc/my.cnf 中修改或者增加如下内容:

[root@mysql-master mysql]# vim /etc/my.cnf
[mysqld]
server-id=1
log-bin=mysql-binlog
log-slave-updates=true

重启mysql服务器

[root@mysql-master mysql]# service mysqld restart

2.创建Replication用户

root@mysql-master mysql]# mysql -u root -p123456

mysql> grant replication slave on *.* to 'myslave'@'192.168.200.%' identified by '123456';
mysql> flush privileges;

replication slave: 用于复制型从属服务器(从主服务器中读取二进制日志事件)

3 获得Master DB的相关信息

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |      430 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.01 sec)

供Slave DB连接时使用,记录下File和Position的值

备份的方法有很多,可以直接复制数据文件,也可以使用 mysqldump。本文全新的搭建,所以不存在数据同步的问题

[root@mysql-master mysql]# mysqldump -u root -p123456 --all-databases > /root/alldbbackup.sql
[root@mysql-master mysql]# scp /root/alldbbackup.sql root@192.168.200.129:/root/
[root@mysql-master mysql]# scp /root/alldbbackup.sql root@192.168.200.130:/root/

4 在 MySQL Slave 上的配置

从库连接主库进行测试,如果连接成功说明主库配置成功

[root@localhost ~]# mysql -u myslave -p123456 -h 192.168.200.128

导入备份脚本

[root@localhost ~]# mysql -u root -p < /root/alldbbackup.sql

修改MySQL配置文件

[root@localhost ~]# vim /etc/my.cnf
server-id       = 2
relay-log=relay-log-bin 
relay-log-index=slave-relay-bin.index

配置多个从服务器时依次设置server-id号

修改完后重启数据库

[root@localhost ~]# service mysqld restart

在 Slave服务器授权,启动从库,进行主从库数据同步

[root@localhost ~]# mysql -u root -p123456
mysql> CHANGE MASTER TO
MASTER_HOST='192.168.200.128',
MASTER_USER='myslave',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-binlog.000001',
MASTER_LOG_POS=403;
mysql> start slave;
mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.200.128
                  Master_User: myslave
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 430
               Relay_Log_File: relay-log-bin.000002
                Relay_Log_Pos: 283
        Relay_Master_Log_File: mysql-bin.000001
             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: 430
              Relay_Log_Space: 454
              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: 11
                  Master_UUID: 5fdf507c-91d4-11e4-bf1e-000c293cf7d9
             Master_Info_File: /usr/local/mysql/data/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 
            Executed_Gtid_Set: 
                Auto_Position: 0
1 row in set (0.00 sec)

参数说明:
mysql> CHANGE MASTER TO
-> MASTER_HOST='master_host_name', //主服务器的IP地址
-> MASTER_USER='replication_user_name', //同步数据库的用户
-> MASTER_PASSWORD='replication_password', //同步数据库的密码
-> MASTER_LOG_FILE='recorded_log_file_name', //主服务器二进制日志的文件名(前面要求记录的参数)
-> MASTER_LOG_POS=recorded_log_position; //日志文件的开始位置(前面要求记录的参数)

5 测试复制是否成功

可以在Master DB创建一个数据库,或者表,到 Slave DB上看,如果配置成功就可以成功同步的

主库查看当前存在的库

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema | 
| mysql              | 
| test               | 
+--------------------+
3 rows in set (0.00 sec)

从库查看当前存在库

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema | 
| mysql              | 
| test               | 
+--------------------+
3 rows in set (0.00 sec)

说明两者中的数据保持了一致性

主库创建库,表:

mysql> create database sampdb;
mysql> use sampdb
mysql> create table new(name char(20),phone char(20));

打开从库,查看:

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema | 
| mysql              | 
| sampdb             | 
| test               | 
+--------------------+
4 rows in set (0.00 sec)
mysql> use sampdb
mysql> show tables;

说明主从数据库创建成功。

报错解决方法:

ERROR 1201(HY000):Could now initialize master info structure; more error messages can be found in the MySQL error log

stop slave;
reset slave;
CHANGE MASTER TO MASTER_HOST='192.168.3.254', MASTER_USER='slave', MASTER_PASSWORD='123456', MASTER_LOG_FILE='mysql-binlog.000003', MASTER_LOG_POS=246;
`start slave;`

数据不同步解决办法:

mysql> stop slave;
Query OK, 0 rows affected (0.00 sec)

mysql\> set global sql_slave_skip_counter=1;
Query OK, 0 rows affected (0.00 sec)

`mysql> start slave;
Query OK, 0 rows affected (0.00 sec)`

主从数据库相关命令:

slave stop; slave start; 开始停止从数据库。
show slave status\G 显示从库状态信息
show master status\G 显示主库状态信息
purge master logs to 'binlog.000004'; 此命令非常小心,删除主数据库没用的二进制日志文件。如果误删除,那么从库就没有办法自动更新了。

change master; 从服务器上修改参数使用

另外,如果你当前操作的从库以前曾经与其他服务器建立过主从关系,你可能会发现即使你在my.cnf文件中即便更改了主服务器的位置,但是MSQL仍然
在试图连接就旧的主服务器的现象。发生这种问题的时候,我们可以通过清除master.info这个缓存文件或者在mysql中通过命令来进行设置。方式如下:

删除master.info方法
这个文件位于数据文件存放目录里,可以直接将其删除,然后重新启动服务器。

b、mysql命令方法
如果你不方便重新启动服务器的话,那么就只能使用mysql命令来帮助你做到。

首先登录到主服务器上,查看当前服务器状态:

mysql> show master status\G;
+---------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+---------------+----------+--------------+------------------+
| mysql-bin.003 | 73        | test           | manual,mysql     |
+---------------+----------+--------------+------------------+

1.FLUSH TABLES WITH READ LOCK
这个命令是全局读锁定,执行了命令之后所有库所有表都被锁定只读。一般都是用在数据库联机备份,这个时候数据库的写操作将被阻塞,读操作顺利进行
解锁的语句是unlock tables
2.LOCK TABLES tbl_name [AS alias] {READ [LOCAL] | [LOW_PRIORITY] WRITE}
这个命令是表级别的锁定,可以定制锁定某一个表。例如: lock tables test read; 不影响其他表的写操作。
解锁语句也是unlock tables。
这两个语句在执行的时候都需要注意个特点,在退出mysql终端的时候都会隐式的执行unlock tables。也就是如果要让表锁定生效就必须一直保持对话

P.S. MYSQL的read lock和wirte lock
read-lock: 允许其他并发的读请求,但阻塞写请求,即可以同时读,但不允许任何写。也叫共享锁
write-lock: 不允许其他并发的读和写请求,是排他的(exclusive)。也叫独占锁

3.flush table tablename

MySQL读写分离原理

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

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

目前较为常见的MySQL读写分离有两种:

1.基于程序代码内部实现
在代码中根据select,insert进行路由分类,这类方法也是目前生产环境应用最广泛的,优点是性能好,因为在程序代码中实现,不需要曾加额外的设备作为硬件开支,缺点是需要开发人员来实现,运维人员无从下手。
2.基于中间代理层实现
代理一般位于客户端和服务器之间,代理服务器接到客户端请求后通过判断后转发到后端数据库,有两个代表性程序。
(1)mysql-proxy 为mysql开源项目,通过其自带的lua脚本进行SQL判断,虽然是mysql的官方产品,但是mysql官方不建议将其应用到生产环境

(2)Amoeba (变形虫)由陈思儒开发,曾就职与阿里巴巴,该程序由java语言进行开发,阿里巴巴将其应用于生成环境,它不支持事物和存储过程

通过程序代码实现mysql读写分离自然是一个不错的选择,但是并不是所有的应用都适合在程序代码中实现读写分离,像一些大型复杂的java应用,如果在程序代码中实现读写分离对代码改动就较大,像这种应用一般会考虑使用代理层来实现。

MySQL Master IP: 192.168.200.128
MySQL Slave1 IP: 192.168.200.129
MySQL Slave2 IP: 192.168.200.130
MySQL Amoeba IP: 192.168.200.131
MySQL Client IP: 192.168.200.132

Amoeba (变形虫)项目开源框架于2008年发布一款Amoeba for mysql软件,这个软件致力于mysql的分布式数据库前端代理层,主要为应用层访问mysql的时候充当SQL路由功能,并具有负载均衡,高可用性,SQL过滤,读写分离,可路由到相关的目标数据库,可并发请求多台数据库,通过Amoeba能够完成多数据源的高可用,负载均衡,数据切片的功能,目前Amoeba已经在很多企业的生产线上使用。

1.在主机Amoeba上安装java环境
因为Amoeba基于jdk1.5开发的,所以官方推荐使用jdk1.5 或者1.6版本,高版本不建议使用

[root@localhost ~]# chmod +x jdk-6u31-linux-x64.bin 
[root@localhost ~]# ./jdk-6u31-linux-x64.bin 
[root@localhost ~]# mv jdk1.6.0_31/ /usr/local/jdk1.6

[root@localhost ~]# 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
[root@localhost ~]# source /etc/profile
[root@localhost ~]# java -version
java version "1.6.0_31"
Java(TM) SE Runtime Environment (build 1.6.0_31-b04)
Java HotSpot(TM) 64-Bit Server VM (build 20.6-b01, mixed mode)

2**.安装并配置Amoeba**

[root@localhost ~]# mkdir /usr/local/amoeba
[root@localhost ~]# tar xf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba
[root@localhost ~]# chmod -R 755 /usr/local/amoeba
[root@localhost ~]# /usr/local/amoeba/bin/amoeba
amoeba start|stop    //显示此内容说明Amoeba安装成功

3.配置Amoeba读写分离,两个Slave读负载均衡

Master,Slave1,Slave2中配置放权给Amoeba访问
grant all on . to 'test'@'192.168.200.%' identified by '123.com';
flush privileges;

编辑amoeba.xml配置文件

[root@localhost ~]# cp /usr/local/amoeba/conf/amoeba.xml{,.bak}
[root@localhost ~]# vim /usr/local/amoeba/conf/amoeba.xml
 27                         <property name="authenticator">
 28                                 <bean class="com.meidusa.amoeba.mysql.server.MysqlClientAuthenticator">
 29 
 30                                         <property name="user">amoeba</property>
 31 
 32                                         <property name="password">123456</property>
 33 
 34                                         <property name="filter">
 35                                                 <bean class="com.meidusa.amoeba.server.IPAccessController">
 36                                                         <property name="ipFile">${amoeba.home}/conf/access_list.conf</proper  ty>                                         
 37                                                 </bean>
 38                                         </property>
 39                                 </bean>
 40                         </property>
`113                 <property name="sqlFunctionFile">${amoeba.home}/conf/functionMap.xml</property>
114                 <property name="LRUMapSize">1500</property>
115                 <property name="defaultPool">master</property>
116
117`
`
118                 <property name="writePool">master</property>
119                 <property name="readPool">slaves</property>
120`
`
121                 <property name="needParse">true</property>
122         </queryRouter>
123 </amoeba:configuration>`

编辑dbServers.xml配置文件

[root@localhost ~]# cp /usr/local/amoeba/conf/dbServers.xml{,.bak}
[root@localhost ~]# vim /usr/local/amoeba/conf/dbServers.xml

25                         \<!-- mysql user --\>
26                         \<property name="user"\>test\</property\>
27
28                         \<property name="password"\>123.com\</property\>
29                 \</factoryConfig\>
43         \<dbServer name="master"  parent="abstractServer"\>
44                 \<factoryConfig\>
45                         \<!-- mysql ip --\>
46                         \<property name="ipAddress"\>192.168.200.128\</property\>
47                 \</factoryConfig\>
48         \</dbServer\>
49
50         \<dbServer name="slave1"  parent="abstractServer"\>
51                 \<factoryConfig\>
52                         \<!-- mysql ip --\>
53                         \<property name="ipAddress"\>192.168.200.129\</property\>
54                 \</factoryConfig\>
55         \</dbServer\>


56         \<dbServer name="slave2"  parent="abstractServer"\>
57                 \<factoryConfig\>
58                         \<!-- mysql ip --\>
59                         \<property name="ipAddress"\>192.168.200.130\</property\>
60                 \</factoryConfig\>
61         \</dbServer\>

`62
63         <dbServer name="slaves" virtual="true">
64                 <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
65                         <!-- Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->
66                         <property name="loadbalance">1</property>
67
68                         <!-- Separated by commas,such as: server1,server2,server1 -->
69                         <property name="poolNames">slave1,slave2</property>
70                 </poolConfig>
71         </dbServer>
72
73 </amoeba:dbServers>`

配置无误后,启动Amoeba软件,其默认端口是tcp 8066

[root@localhost ~]# cd /usr/local/amoeba/       
[root@localhost amoeba]# bin/amoeba start &
[root@localhost amoeba]# netstat -anpt |grep java
tcp        0      0 ::ffff:127.0.0.1:41432      :::*                        LISTEN      4169/java           
tcp        0      0 :::8066                     :::*                        LISTEN      4169/java

测试
在Client上

[root@node1 ~]# yum -y install mysql

然后可以通过代理访问MySQL

[root@node1 ~]# mysql -u amoeba -p123456 -h 192.168.200.131 -P8066

在Mysql上创建一个表,同步到各个从服务器上,然后关掉各个从服务器上的Slave功能,在插入区别语句

mysql> create database db_test;
Query OK, 1 row affected (0.03 sec)
`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.16 sec)`

分别在两台从服务器上

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| db_test            |
| mysql              |
| performance_schema |
| sampdb             |
| test               |
+--------------------+
6 rows in set (0.01 sec)

mysql> use db_test
Database changed
mysql> show tables;
+-------------------+
| Tables_in_db_test |
+-------------------+
| zang              |
+-------------------+
1 row in set (0.00 sec)
`mysql> stop slave;
Query OK, 0 rows affected (0.10 sec)`

然后在主服务器上

mysql> insert into zang values('1','zhang','this_is_master');
Query OK, 1 row affected (0.18 sec)

slave1:
`mysql> use db_test
mysql> insert into zang values('2','zhang','this_is_slave1');
Query OK, 1 row affected (0.07 sec)`

slave2:

mysql> use db_test
mysql> insert into zang values('3','zhang','this_is_slave2');
Query OK, 1 row affected (0.07 sec)

测试读操作:
在测试机上第1次查询结果

mysql> select * from zang;
+------+-------+----------------+
| id   | name  | address        |
+------+-------+----------------+
|    2 | zhang | this_is_slave1 |
+------+-------+----------------+
1 row in set (0.00 sec)

在测试机上第2次查询结果

mysql> select * from zang;
+------+-------+----------------+
| id   | name  | address        |
+------+-------+----------------+
|    3 | zhang | this_is_slave2 |
+------+-------+----------------+
1 row in set (0.00 sec)

在测试机上第3次查询结果

mysql> select * from zang;
+------+-------+----------------+
| id   | name  | address        |
+------+-------+----------------+
|    2 | zhang | this_is_slave1 |
+------+-------+----------------+
1 row in set (0.00 sec)

测试写操作:
在Client上插入一条语句:

mysql> use db_test
mysql> insert into zang values('4','zhang','write_test');

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

mysql> select * from zang;
+------+-------+----------------+
| id   | name  | address        |
+------+-------+----------------+
|    1 | zhang | this_is_master |
|    4 | zhang | write_test     |
+------+-------+----------------+
1 row in set (0.00 sec)

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

赞(1)
未经允许不得转载:工具盒子 » MySQL主从复制与读写分离