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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了搭建MySql主从复制与读写分离相关的知识,希望对你有一定的参考价值。

一、实验名称:
?mysql主从复制读写分离
二、实验目的:?
?熟悉mysql主从复制的原理
?熟悉mysql读写分离的原理
?学会配置mysql主从复制
?学会配置mysql读写分离
三、实验环境:?
技术分享图片
主机 操作系统 IP地址 主要软件
Master CentOS 6.5 x86_64 /linux6.5 192.168.1.101 cmake-2.8.6.tar.gz
mysql-5.5.22.tar.gz
Slave1 CentOS 6.5 x86_64 /linux6.5 192.168.1.102 cmake-2.8.6.tar.gz
mysql-5.5.22.tar.gz
Slave2 CentOS 6.5 x86_64 /linux6.5 192.168.1.103 cmake-2.8.6.tar.gz
mysql-5.5.22.tar.gz
Amoeba CentOS 6.5 x86_64 /linux6.5 192.168.1.110 amoeba-mysql-binary-2.2.0.tar.gz
jdk-6u14-linux-x64.bin
客户端 CentOS 6.5 x86_64 /linux6.5 192.168.1.111
注:将所需软件拷贝至/usr/src中
四:实验思路:
1.安装mysql
2.配置mysql的主从复制
3.配置mysql的读写分离

实验过程

一:网络环境的部署(本步骤每个机器都要设置)
1:按照图表设置每台服务器的ip地址
2:配置主机yum(每个系统都要设置)
[[email protected] network-scripts]# cd /etc/yum.repos.d/
[[email protected] yum.repos.d]# rm -rf CentOS-Base.repo
[[email protected] yum.repos.d]# vi CentOS-Media.repo
[c6-media]
name=CentOS-$releasever - Media
baseurl=file:///media/cdrom/
gpgcheck=1
enabled=1
gpgkey=file:///media/cdrom/RPM-GPG-KEY-CentOS-6
[[email protected] yum.repos.d]# cd
[[email protected] ~]# mkdir /media/cdrom
[[email protected] ~]# mount /dev/cdrom /media/cdrom
二:搭建Mysql主从复制
将所需软件拷贝到/usr/src/目录下
1:在mysql主服务器上建立时间同步服务器
[[email protected] ~]# yum -y install ntp
[[email protected] ~]# vi /etc/ntp.conf
添加:
server 127.127.1.0
fudge 127.127.1.0 stratum 8
[[email protected] ~]# service ntpd restart
[[email protected] ~]# service iptables stop
[[email protected] ~]# chkconfig iptables off
2:在从服务器上进行时间同步
[[email protected] yum.repos.d]# yum -y install ntpdate
[[email protected] yum.repos.d]# /usr/sbin/ntpdate 192.168.1.101
[[email protected] yum.repos.d]# service iptables stop
[[email protected] yum.repos.d]# chkconfig iptables off
3:在三个服务器上安装mysql(master,slave都有)
[[email protected] ~]# yum -y install ncurses-devel
注释:
ncurses是字符终端下屏幕控制的基本库

[[email protected] ~]#yum -y install gcc*
[[email protected] ~]# cd /usr/src
[[email protected] src]# tar zxvf cmake-2.8.6.tar.gz
[[email protected] src]# cd cmake-2.8.6
[[email protected] cmake-2.8.6]# ./configure
[[email protected] cmake-2.8.6]#gmake
[[email protected] cmake-2.8.6]#gmake install
[[email protected] cmake-2.8.6]# cd /usr/src
[[email protected] src]# tar zxvf mysql-5.5.22.tar.gz
[[email protected] mysql-5.5.22]# cd mysql-5.5.22
[[email protected] mysql-5.5.22]#cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all -DSYSCONFDIR=/etc

注释:
-DCMAKE_INSTALL_PREFIX= 安装根目录
-DDEFAULT_CHARSET= 默认字符集
-DDEFAULT_COLLATION=默认编码
-DWITH_EXTRA_CHARSETS= 额外的编码,请使用ALL来编译。
-DWITH_MYISAM_STORAGE_ENGINE=1 编译myisam存储引擎,默认的存储引擎,不加也可以
-DWITH_INNOBASE_STORAGE_ENGINE=1 支持InnoDB存储引擎,这个也是默认安装的
-DWITH_READLINE=1 使用readline功能
-DENABLED_LOCAL_INFILE=1 可以使用load data infile命令从本地导入文件
-DMYSQL_DATADIR=数据库 数据目录
-DSYSCONFDIR= 指定主配置文件目录

[[email protected] mysql-5.5.22]# make && make install
4:优化调整(master,slave都有)
[[email protected] mysql-5.5.22]# cp support-files/my-medium.cnf /etc/my.cnf
cp:是否覆盖"/etc/my.cnf"? y
[[email protected] mysql-5.5.22]# cp support-files/mysql.server /etc/rc.d/init.d/mysqld
[[email protected] mysql-5.5.22]# chmod +x /etc/rc.d/init.d/mysqld
[[email protected] mysql-5.5.22]# chkconfig --add mysqld
[[email protected] mysql-5.5.22]# echo "PATH=$PATH:/usr/local/mysql/bin" >>/etc/profile
[[email protected] mysql-5.5.22]# . /etc/profile 点后面有个空格
5:初始化数据库(master,slave都有)
[[email protected] mysql-5.5.22]# groupadd mysql
[[email protected] mysql-5.5.22]# useradd -M -s /sbin/nologin mysql -g mysql
[[email protected] mysql-5.5.22]# chown -R mysql:mysql /usr/local/mysql
[[email protected] mysql-5.5.22]# /usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --user=mysql
[[email protected] mysql-5.5.22]# service mysqld start
[[email protected] mysql-5.5.22]# chkconfig mysqld on
[[email protected] mysql-5.5.22]# mysqladmin -u root password ‘pwd123‘

6:配置mysql master主服务器(在master上)
[[email protected] mysql-5.5.22]# vi /etc/my.cnf
添加并修改:
server-id=11 修改,57行
log-bin=master-bin 修改,49行
log-slave-updates=true 添加 (可不用添加)

注释:
系统默认采用基于语句的复制类型

1:基于语句的复制。 在主服务器上执行的 SQL 语句,在从服务器上执行同样的语句。否则,你必须要小心,以避免用户对主服务器上的表进行的更新与对服务器上的表所进行的更新之间的冲突,配置:binlog_format = STATEMENT

2:基于行的复制。把改变的内容复制过去,而不是把命令在从服务器上执行一遍,从 MySQL 5.0开始支持,配置:binlog_format = ROW

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

log_slave_updates=true #Slave可以是其他 Slave 的 Master,从而扩散 Master 的更新
binlog-ignore-db=test #不记录指定的数据库的二进制日志
replicate-ignore-db=test #设置不需要同步的库
binlog_cache_size = 1M #日志缓存的大小
expire_logs_days=3 #自动过期清理日志的天数
以上参数在[mysqld]模块中设置

[[email protected] mysql-5.5.22]# service mysqld restart
7:给从服务器授权(在master上)
[[email protected] mysql-5.5.22]# cd
[[email protected] ~]# mysql -u root -p
输入密码pwd123
mysql> grant replication slave on . to ‘myslave‘@‘192.168.1.%‘ identified by ‘123456‘ ;
mysql> flush privileges;
mysql> show master status;
+-------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| master-bin.000001 | 337 | | |
+-------------------+----------+--------------+------------------+
1 row in set (0.01 sec)

8:配置从服务器(在slave上配置)
[[email protected] mysql-5.5.22]# vi /etc/my.cnf
修改并添加
server-id = 22 修改,57行值不能和其他mysql服务器重复
relay-log=relay-log-bin 添加(可不指定)
relay-log-index=slave-relay-bin.index 添加(可不指定)

注释:
--relay-log=name????中继日志的文件的名字
?--relay-log-index=name??????MySQL slave 在启动时需要检查relay log index 文件中的relay log信息,此处定义该索引文件的名字

[[email protected] mysql-5.5.22]# service mysqld restart
9:登陆从服务器配置同步(在slave上)
[[email protected] mysql-5.5.22]# mysql -u root -p
输入密码
mysql> change master to master_host=‘192.168.1.101‘,master_user=‘myslave‘,master_password=‘123456‘,master_log_file=‘master-bin.000001‘,master_log_pos=337; 红色的是用主服务器中show出来的值,337表示偏移量
注:?Slave?的?IO?线程接收到信息后,将接收到的日志内容依次写入到?Slave?端的Relay?Log文件(relay-log-bin.xxxxxx)的最末端,并将读取到的Master端的master-bin的文件名和位置记录到master-?info文件中,以便在下一次读取的时候能够清楚的告诉Master“我需要从某个master-bin的哪个位置开始往后的日志内容,请发给我
mysql> start slave;
mysql> show slave statusG;
确保下列两项是yes
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

10:验证主从复制效果
mysql> show databases; 查看当前的数据库,在从服务器上
mysql> create database db_test; 创建一个数据库,在主服务器上
mysql> show databases; 查看当前的数据库,在从服务器上发现多了一个刚创建的数据库

如果需要将一个slave1服务器作为另一台slave2的master,
1):在slave1上修改my.cnf,在[mysqld]模块添加log-slave-updates=true字段,并重启mysql
2):在slave1上执行以下命令创建一个授权用户,用于在slave2上链接slave1
mysql> grant replication slave on . to ‘myslave‘@‘192.168.1.%‘ identified by ‘123456‘ ;
mysql> flush privileges;
mysql> show master status;

3):show出来的信息做为slave2上连接slave1时的参数
重启Mysql服务不会影响主从关系

三:搭建mysql读写分离
1:在主机amoeba上安装java环境
把java拷贝到/usr/local目录下
[[email protected] ~]# chmod +x /usr/local/jdk-6u14-linux-x64.bin
[[email protected] ~]# cd /usr/local
[[email protected] local]# ./jdk-6u14-linux-x64.bin
[[email protected] local]# mv jdk1.6.0_14/ /usr/local/jdk1.6
[[email protected] local]# vi /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
[[email protected] local]# java -version 查询版本,确定java安装成功
2:安装并配置amoeba
将amoeba软件拷贝到usr/src目录中
[[email protected] local]# mkdir /usr/local/amoeba
[[email protected] local]# cd /usr/src
[[email protected] src]# tar zxf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/
[[email protected] src]# chmod -R 755 /usr/local/amoeba/
[[email protected] src]# /usr/local/amoeba/bin/amoeba
amoeba start|stop 有此提示表示成功
3:配置amoeba读写分离
(1)在三个mysql服务器中开放权限给amoeba访问
mysql> grant all on . to [email protected]‘192.168.10.%‘ identified by ‘123.com‘; 三个mysql服务器都要
(2)在amoeba上配置amoeba.xml文件
[[email protected] amoeba]# service iptables stop
[[email protected] ~]# cd /usr/local/amoeba/conf
[[email protected] conf]# vi amoeba.xml
修改红色部分
<property name="authenticator">
<bean class="com.meidusa.amoeba.mysql.server.MysqlClientAuthenticator">

         <property name="user">amoeba</property>                 \30行

         <property name="password">123456</property>               \32行

         <property name="filter">
                   <bean class="com.meidusa.amoeba.server.IPAccessController">
         <property name="ipFile">${amoeba.home}/conf/access_list.conf</property>
                   </bean>
         </property>
                   </bean>
     </property>

             。。。。。。。。略。。。。。。。

<queryRouter class="com.meidusa.amoeba.mysql.parser.MysqlQueryRouter">
<property name="ruleLoader">
<bean class="com.meidusa.amoeba.route.TableRuleFileLoader">
<property name="ruleFile">${amoeba.home}/conf/rule.xml</property>
<property name="functionFile">${amoeba.home}/conf/ruleFunctionMap.xml</property>
</bean>
</property>
<property name="sqlFunctionFile">${amoeba.home}/conf/functionMap.xml</property>
<property name="LRUMapSize">1500</property>
<property name="defaultPool">master</property> 115行

            <property name="writePool">master</property>             \118行
            <property name="readPool">slaves</property>    \119行此处的注释去掉

            <property name="needParse">true</property>
    </queryRouter>

[[email protected] conf]# vi dbServers.xml
修改(注意去掉注释),slave2的复制一个slave1

test \26行 123.com \29行,去掉注释符
。。。。。。。。。略。。。。。。。。。。 \45行 192.168.1.101 \48行 \52行 192.168.1.102 \55行 192.168.1.103 \59行 1 slave1,slave2 \65行 [[email protected] ~]# cd /usr/local/amoeba/ [[email protected] amoeba]# bin/amoeba start& 注:当在前台运行某个作业时,终端被该作业占据;而在后台运行作业时,它不会占据终端。可以使用&命令把作业放到后台执行 [[email protected] amoeba]# netstat -anpt | grep java 如果能看到8066和3306两个端口号,证明amoeba是正常开启的。 四:测试 1:在client上 [[email protected] ~]# cd /etc/yum.repos.d/ [[email protected] yum.repos.d]# rm -rf CentOS-Base.repo [[email protected] yum.repos.d]# vi CentOS-Media.repo 修改 [c6-media] name=CentOS-$releasever - Media baseurl=file:///media/cdrom/ gpgcheck=1 enabled=1 gpgkey=file:///media/cdrom/RPM-GPG-KEY-CentOS-6 [[email protected] yum.repos.d]# mkdir /media/cdrom [[email protected] yum.repos.d]# mount /dev/cdrom /media/cdrom [[email protected] yum.repos.d]# yum -y install mysql [[email protected] yum.repos.d]# mysql -u amoeba -p 123456 -h 192.168.1.110 -P 8066 Enter password: \密码:123456 2:在master服务器上创建表 mysql> use db_test; mysql> create table zang (id int(10),name varchar(10),address varchar(20)); 3:在两个slave服务器上 mysql> stop slave; 4:在master服务器上 mysql> insert into zang values (‘1‘,‘zhang‘,‘this_is_master‘); 5:在slave1上 mysql> use db_test; mysql>insert into zang values (‘2‘,‘zhang‘,‘this_is_slave1‘); 6:在slave2上 mysql> use db_test; mysql>insert into zang values (‘3‘,‘zhang‘,‘this_is_slave2‘); 7:在client上查询三次 mysql> use db_test; mysql> select * from zang; 对比三次的输出,验证读操作,发现没有在master写入的数据,而slave上写的能查到 8:在client上 mysql>insert into zang values (‘4‘,‘zhang‘,‘this_is_client‘); mysql> select * from zang; \发现在client上查询不到自己写的数据 9:在master上 mysql> select * from zang; \能查到在client上写入的数据,说明写操作在master上 10:在slave上 mysql> select * from zang; \发现没有数据,说明写入的操作是在master上 知识拓展: 一、mysql主从原理 1. 基本介绍 MySQL 内建的复制功能是构建大型,高性能应用程序的基础。将 MySQL 的 数亿分布到到多个系统上去,这种分步的机制,是通过将 MySQL 的某一台主机的数据复制到其它主机( Slave )上,并重新执行一遍来实现的。复制过程中一个服务器充当服务器,而一个或多个其它服务器充当从服务器。主服务器将更新写入二进制日志,并维护文件的一个索引以跟踪日志循环。这些日志可以记录发送到从服务器的更新。当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置,从服务器接收从那时起发生的任何更新,然后封锁等等主服务器通知新的更新。 请注意当你进行复制时,所有对复制中的表的更新必须在主服务器上进行。否则,你必须要小心,以避免用户对主服务器上的表进行的更新与对服务器上的表所进行的更新之间的冲突 2. MySQL支持的复制类型 1.基于语句的复制。 在主服务器上执行的 SQL 语句,在从服务器上执行同样的语句。否则,你必须要小心,以避免用户对主服务器上的表进行的更新与对服务器上的表所进行的更新之间的冲突,配置:binlog_format = ‘STATEMENT‘ 2.基于行的复制。把改变的内容复制过去,而不是把命令在从服务器上执行一遍,从 MySQL 5.0开始支持,配置:binlog_format = ‘ROW‘ 3.混合类型的复制。默认采用基于语句的复制,一旦发现基于语句的无法精确的复制时,就会采用基于行的复制,配置:binlog_format = ‘MIXED‘ 3. mysql复制解决的问题 ?数据分布 ?负载平衡 ?备份 ?高可用性和容错行 4. 复制是如何工作的 可以简化为三个步骤(如下图): 1.Master 将改变记录到二进制日志中。 2.Slave 将 Master 的二进制日志拷贝到它的中继日志( Relay_log ) 3.Slave 重做中继日志中的事件,将改变反映它自己的数据 说明: 1.Master 记录二进制的日志。在每个事务更新数据之前,Master 在二进制日志记录这些改变。 MySQL 将事务日志的写入二进制日志,及时事务中的语句都市交叉执行的。在事件写入二进制日志完成后,Master 通知存储引擎提交事务。 2.Slave 将 Master 的 Binary log 拷贝到它自己的中继日志。首先 Slave 开始一个工作线程--I/O线程。I/O 线程在 Master 上打开一个连接,然后开始从二进制日志中读取事件,如果已经连上 Master,它会并等待master产生新的事件。I/O线程就这些事件写入中继日志。 3.SQL Slave Thread ( SQL从线程)处理该过程的最后一步。SQL纯种从中继日志读取事件,并重放其中的事件而更新 Slave 的数据。使其它与 Master 中的数据保持一致。只要该线程与 I/O 线程保持一致,中继日志通常会位于 OS 的缓存中,所以中继日志的开销很小。 4.此处,在 Master 中也有一个工作线程,和其他 MySQL 的连接一样,Slave 在 Master 中打开一个连接也会使得 Master 开始一个线程。复制过程有一个很重要的限制---复制在 Slave 上是串行化的,也就是说 Master 上的并行更新操作不能在 Slave 上并行操作。 5. 复制常用类型 5.1 复制的常用体系结构基本原则 1.每个 Slave 只能有一个 Master; 2.每个 Slave 只能有一个唯一的服务器ID; 3.每个 Master 可以有很多 Slave; 4.如果你设置了 log_slave_updates,Slave 可以是其他 Slave 的 Master,从而扩散 Master 的更新 5.MySQL 不支持多主服务器复制---即一个 Slave 可以有多个 Master,但是,通过一些简单的组合,我们却可以建立灵活而强大的复制体系结构。 5.2 一主多从复制架构 1.场景:在主库读取请求压力非常大的场景下,可以通过配置一主多从复制架构实现读写分离,把大量对实时性要求不是特别高的读请求通过负载均衡到多个从库上,降低主库的读取压力。在主库出现异常宕机的情况下,可以把一个从库切换为主库继续提供服务; 2.建议: 1.当 Slave 增加到一定数量时,Slave 对 Master 的负载以及网络带宽都会成为一个严重的问题。 2.不同的 Slave 扮演不同的作用(例如使用不同的索引,或者不同的存储引擎) 3.用一个 Slave 作为备用 Master,只进行复制 4.用一个远程的 Slave,用于灾难恢复。 5.3 多级复制架构 1.场景:一主多从的架构能够解决大部分读请求压力特别大的场景需求,但主库的I/O压力和网络压力会随着从库的增加而增长,而使用多级复制架构就可以解决一主多从场景下,主库额外的I/O和网络压力。 但要注意的是,多级复制场景下主库的数据是经历两次才到达读取的从库,期间的延时比一主多从复制场景下只经历一次复制的要大。 2.建议: 1.可能存在延时较长的风险 2.这种方案可以与第三方软件结合使用,例如Slave+LVS+Keepalived 实现高可用。 5.4 双主复制/Dual Master架构 1.场景:双主/Dual Master架构适用于写压力比较大的场景,或者DBA做维护需要主从切换的场景,通过双主/Dual master架构避免了重复搭建从库的麻烦。 2.建议: 1.最大问题就是更新冲突。 2.可以采用MySQL Cluster,以及将Cluster和Replication结合起来,可以建立强大的高性能的数据库平台。 二、mysql主从配置 1.基础环境配置 ?数据库版本: mysql 5.1.73 ( Slave 版本可以大于或者等于 Maste r版本) ?操作系统: CentOS 6.7 x86_64 ?IP地址:192.168.124.10 ( Master ) 192.168.124.20 ( Slave ) 2.创建复制账号 在 Master 的数据库中建立一个复制账户,每个 Slave 使用该账户连接 Master 进行复制,需要?replication slave?和?replication client?权限,Master 的连接信息会存储在文本文件 master.info 文件中。(master.info文件在 Slave 的数据目录中) mysql>grant replication slave,replication clinet on *.* to ‘replication‘@‘192.168.124.10(slave IP)‘ identified by ‘123456‘; mysql>flush privileges 说明:创建了一个用户名为 replication 的用户,密码为 123456 ,只允许在 192.168.124.10 这个 Slave 上登录。 3.拷贝数据 如果是新安装的 MySQL 主从服务器,这一步不需要。如果 Master 之前有数据,需要把 Master 的数据导出并还原到 Slave 上,要保证 Master 和 Slave 服务器中的数据是一样的。建议导出 Master 库的时候进行锁表,导完后再解锁。 mysql>flush tables with read lock; mysqldump -uroot -p1234 dy_qqopen > dy_qqopen.sql mysql>unlock tables; .Master 服务器配置: 修改配置都需要修改 MySQL 的数据库配置文件,默认是 /etc/my.cnf 4.1 开启二进制日志 1.log-bin=mysql-bin?改成log-bin=/var/log/mysql/master-bin 2.增加?binlog_format=mixed 4.2 取消 server-id 的注释 将?server-id=1?前面的注释去掉,如果没有,则手动添加到 mysqld 下面。 必须要配置 server-id ,server-id 的值不能和 Slave 是一样的。 4.3 设置需要同步的数据库 在 [mysqld] 下面添加?binlog-do-db=dy_qqopen 说明:binlog-ignore-db=test 表示不同步 test 数据库,如果有多个数据库,需要多写几行。 4.4 创建二进制日志目录,授权,重启 MySQL mkdir -p /var/log/mysql/ chown mysql.mysql -R /var/log/mysql service mysqld restart 4.5 查看 Master 状态 mysql > show master status; 记录下 File 和 Postition,下面配置 Slave 的时候需要用。 5.Slave 服务器配置 修改配置都需要修改 MySQL 的数据库配置文件,默认是 /etc/my.cnf 5.1 修改 server-id 和开启中继日志 将?server-id=1?改成?server-id=2 relay-log=/var/log/mysql/relaylogs 5.2 创建中继日志,授权以及重启 mkdir -p /var/log/mysql chown mysql.mysql -R /var/log/mysql /etc/init.d/mysqld restart 5.3 查看中继日志启动状态 mysql>show global variables like ‘%relay%‘; 5.4 连接 Master 服务器 mysql>change master to master_host=‘192.168.124.20‘,master_user=‘replication‘,master_password=‘123456‘,master_log_file=‘master-bin.000001‘,master_log_pos=103; 选项: ?master_host:Master 服务器IP ?master_user:Master 服务器授权用户,也就是 Master 前面创建的那个用户 ?master_password:Master 服务器授权用户对应的密码 ?master_log_file:Master binlog 文件名 ?master_log_pos:Master binlog 文件中的 Postion 值 ?更多的选项可以看:http://dev.mysql.com/doc/refman/5.7/en/change-master-to.html 说明:使用刚刚在 Master 创建的用户连接,log_file 和 log_pos 就是使用刚刚在 Master 上执行?show master status;?执行出来的结果× 5.5 手动启动复制线程 mysql> start slave; 5.6 查看主从状态 mysql>show slave status G; 说明:如果 Last_SQL_Error 没有错误提示以及 Salve 中的 Exec_Master_Log_Pos 值和 Master 中的 show master status; 中的 Postition 值是一样的,这样的话,MySQL 主从复制应该是成功的。 6. 测试 在 Master 数据库中执行sql语句操作,观察 Slave 是否同步,如果同步则说明配置成功。 7. 注意事项 1.主库和从库的数据库名必须相同; 2.主库和从库的复制可以精确到表,但是在需要更改主库或从库的数据结构时需要立刻重启slave; 3.不能在mysql配置文件里直接写入master的配置信息,需要用change master命令来完成; 4.指定replicate_do_db必须在my.cnf里配置,不能用change master命令来完成; 5.如果不及时清理,日积月累二进制日志文件可能会把磁盘空间占满,可以在配置文件里加上expire_logs_days=7,只保留最近7天的日志,建议当slave不再使用时,通过reset slave来取消relaylog; 6.写一个监控脚本,用来监控 Slave 中的两个"yes",如果只有一个"yes"或者零个,就表明主从有问题。 三、MySQL 主从一致性检查 1.介绍 主从一致性主要是通过 Percona-Toolkit 这个工具来实现的,Percona Toolkit 是一组高级的命令行工具,用来管理 MySQL 和系统任务,主要功能包括: ?验证主节点和复制数据的一致性 ?有效的对记录进行归档 ?找出重复的索引 ?总结 MySQL 服务器 ?从日志和 tcpdump 中分析查询 ?问题发生时收集重要的系统信息。 现在,使用这个工具来完成一致性检查和数据同步。官网是:https://www.percona.com/software/mysql-tools/percona-toolkit 2.安装 Percona-Toolkit 工具 安装的方式有多种,可以编译安装,也可以通过包管理器安装,为了方便,直接下载 rpm 包,然后yum进行安装。 文件下载地址:https://www.percona.com/doc/percona-toolkit/2.2/installation.html wget percona.com/get/percona-toolkit.rpm yum install percona-toolkit.rpm -y 3.一致性检查 3.1 注意点: ?需要创建一个既能登录主库,也能登录从库,而且还能同步数据库的帐号。 ?只能指定一个host,必须为主库的IP ?在检查时会向表加S锁 ?运行之前需要从库的同步IO和SQL进程是YES状态 3.2 创建检查帐号 mysql>grant select,process,super,replication slave on *.* to ‘mysql_check‘@‘x.x.x.x‘ identified by ‘123456‘; mysql>flush privileges; 3.3 执行检测(在master上操作) pt-table-checksum --nocheck-replication-filters --databases=dy_qqopen --replicate=test.checksums --create-replicate-table --host=192.168.124.20 --port 3306 -umysql_check -pLooking_s123 --recursion-method=hosts 参数说明: ?--nocheck-replication: 不检查复制过滤器,建议启动。后面可以用--databases来指定需要检查的数据库。 ?--databases:指定需要被检查的数据库,多个则用逗号隔开 ?--tables:指定需要被检查的标,多个用逗号隔开。 ?--replicate:把checksum的信息写入到指定表中,建议直接写到被检查的数据库当中。 ?--create-replicate-table:创建存放检查信息的数据表,第一次运行需要加,以后就不需要添加了。 ?--recursion-method:查找 Slave 的方式,有三种, processlist, dsn, hosts ?h:Master地址 ?u:mysql的检测用户的用户名 ?p:mysql检测用户的密码 ?P:3306,mysql的端口号 执行结果: 参数说明: ?TS: 完成检查的时间 ?ERRORS:检查时发生错误和警告的数量 ?DIFFS:0 表示一致,1 表示不一致,当指定 --no-replicate-check 时,会一直为0,当指定 --replicate-check-onley 则会显示不同的信息 ?ROWS:表的行数。 ?CHUNKS:被划分到表中的块的数目 ?SKIPPED:由于错误或警告过大,则跳过块的数目。 ?TIME:执行的时间。 ?TABLES:被检查的表名 说明:如果出现不一致的情况,就需要进行修复了。 3.4 命令错误 问题1:?执行命令时提示 "Diffs cannot be detected because no slaves were found. Please read the --recursion-method documentation for information."错误 解决方法:?在从服务器的?/etc/my.cnf?配置文件中添加两行,report_host=192.168.124.10(slave_ip) report_port=3306(slave_port)。然后重启 MySQL 服务 4. 不一致数据修复 4.1 介绍 使用 pt-table-sync 这个命令来修复。 pt-table-sync 命令介绍:高效的同步 MySQL 表之间的数据,他可以做单向和双向的表数据。也可以同步单个表,也可以同步整个库。它不同步表结构、索引、或任何其他模式对象。所以在修复一致性之前需要保证他们表存在。 4.2 修复不一致的数据 pt-table-sync --print --user=mysql_check --password=Looking_s123 h=192.168.124.20,D=dy_qqopen,t=qq_task h=192.168.124.10 参数说明: ?--print:打印出修复语句,如果需要修复,将 --print 改成 --execute,会直接执行修复语句,但是建议先使用 print 看一下修复语句,以保证不会出错。 ?--user:MySQL 检测用户的用户名 ?--password:MySQL 检测用户的密码 ?D:目标数据库 ?t:数据表 ?h:两个h,第一次出现的是 Master 的 IP ,第二次出现的是 Slave 的地址。 四、MySQL 主从错误处理 1. 说明: 解决和处理主从错误这个是最重要的,比配置更更要。提高处理问题的能力,要熟悉原理,多处理积累,多学习其他网友的处理方式。出现错误都会在 Last_SQL_Error 中显示错误,一般根据错误提示进行处理,如果不太清楚,可以谷歌查询一下,不过操作完之后,同步正常后,一定要核对一下数据是否一致。

以上是关于搭建MySql主从复制与读写分离的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 主从复制与读写分离 部署

MySQL 主从复制与读写分离(原理深刻,过程详细,值得一看)

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

MySQL主从复制与读写分离的理论+实操(配有详细图释)

MySQL主从复制与读写分离配置及实操

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