mysql系列之复制2----主从同步部署

经过了上一篇mysql系列之复制1----原理篇,相信大家已经对mysql的复制有所了解了。本篇博文将带大家一起来部署下mysql的主从同步架构。

环境:
CentOS 6.5 x86_64位 采用最小化安装,系统经过了基本优化
selinux 为关闭状态,iptables 为无限制模式
主机名:master==>ip:172.16.100.1==>MySQL版本:mysql-5.5.32
主机名:slave   ==>ip:172.16.100.2==>MySQL版本:mysql-5.5.32
源码包存放位置:/usr/local/src
源码包编译安装位置:/usr/local/mysql
数据库存放位置:/mydata

架构图:

一、主从复制前环境检查

主服务器检查:

[[email protected] ~]# hostname 
master 
[[email protected] ~]# uname -a 
Linux master 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux 
[[email protected] ~]# mysql -uroot -psunsky -e ‘select version();‘ 
+------------+ 
| version()  | 
+------------+ 
| 5.5.32-log | 
+------------+
[[email protected] ~]# mysql -uroot -psunsky -e "show variables like ‘%datadir%‘;" 
+---------------+----------+ 
| Variable_name | Value    | 
+---------------+----------+ 
| datadir | /mydata/       | 
+---------------+----------+


从服务器检查:

[[email protected] ~]# hostname 
slave 
[[email protected] ~]# uname -a 
Linux slave 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux 
[[email protected] ~]# mysql -uroot -psunsky -e ‘select version();‘ 
+-----------+ 
| version() | 
+-----------+ 
| 5.5.32    | 
+-----------+
[[email protected] ~]# mysql -uroot -psunsky -e "show variables like ‘%datadir%‘;" 
+---------------+----------+ 
| Variable_name | Value    | 
+---------------+----------+ 
| datadir       | /mydata/ | 
+---------------+----------+

二、主库执行操作

a、设置server-id值并开启binlog参数

由于我们知道,mysql的主从同步的关键因素就是 binlog 日志,所以我们需要先在主服务器打开 binlog 日志的功能。并且,我们也要保证主服务器的server-id唯一,一般我们都将主服务器的server-id设置为1.

下面是需要修改的内容:

[mysqld]
server-id = 1
log-bin = /mydata/mysql-bin  # 设定binlog日志的位置
binlog_format=mixed   # 设定 binlog 日志格式为混合格式
sync-binlog = 1   # 在主服务器设定,用于事务安全

提示:

1、上面两参数要放在my.cnf中的[mysqld]模块下,否则会出错

2、我们也要保证主服务器的server-id唯一。server-id的值要使用服务器ip地址的最后8位如1,目的是避免不同机器或实例ID重复,不适合多实例。server-id的范围: 0 < server-id < 2的32次方-1的自然数

3、要先在 my.cnf 配置文件中查找相关参数,并按要求修改,不存在时再添加参数,切记,参数不能重复

b、修改 my.cnf 配置后重启数据库

[[email protected] ~]# /etc/init.d/mysqld restart 
Shutting down MySQL. SUCCESS! 
Starting MySQL.. SUCCESS!

检查配置后的结果:

检查方法一:

[[email protected] ~]# egrep ‘server-id|log-bin|binlog_format|sync‘ /etc/my.cnf 
server-id = 1 
log-bin = /mydata/mysql-bin 
binlog_format=mixed 
sync-binlog = 1

检查方法二:

[[email protected] ~]# mysql -uroot -psunsky -e "show variables like ‘log_bin‘;" 
+---------------+-------+ 
| Variable_name | Value | 
+---------------+-------+ 
| log_bin       | ON    | 
+---------------+-------+ 
[[email protected] ~]# mysql -uroot -psunsky -e "show variables like ‘%server_id%‘" 
+---------------+-------+ 
| Variable_name | Value | 
+---------------+-------+ 
| server_id     | 1     | 
+---------------+-------+
[[email protected] ~]# mysql -uroot -psunsky -e "show variables like ‘binlog_format‘;" 
+---------------+-------+ 
| Variable_name | Value | 
+---------------+-------+ 
| binlog_format | MIXED | 
+---------------+-------+
[[email protected] ~]# mysql -uroot -psunsky -e "show variables like ‘sync_binlog‘;" 
+---------------+-------+ 
| Variable_name | Value | 
+---------------+-------+ 
| sync_binlog   | 1     | 
+---------------+-------+

c、建立用于同步的账号rep

[[email protected] ~]# mysql -uroot -psunsky -e "grant replication slave on *.* to [email protected]‘172.16.100.%‘ identified by ‘sunsky‘;" 
[[email protected] ~]# mysql -uroot -psunsky -e "select user,host from mysql.user where user=‘rep‘;" 
+------+--------------+ 
| user | host         | 
+------+--------------+ 
| rep  | 172.16.100.% | 
+------+--------------+ 
[[email protected] ~]# mysql -uroot -psunsky -e "show grants for [email protected]‘172.16.100.%‘;" 
+--------------------------------------------------------------------------------------+
| Grants for [email protected]% | 
+--------------------------------------------------------------------------------------+ 
| GRANT REPLICATION SLAVE ON *.* TO ‘rep‘@‘172.16.100.%‘ IDENTIFIED BY PASSWORD ‘*5C275EDDF185436A097C27336FB99357638439A4‘ | 
+--------------------------------------------------------------------------------------+ 
[[email protected] ~]# mysql -uroot -psunsky -e "show grants for [email protected]‘172.16.100.%‘;" 
+--------------------------------------------------------------------------------------+ 
| Grants for [email protected]% | 
+--------------------------------------------------------------------------------------+
| GRANT REPLICATION SLAVE ON *.* TO ‘rep‘@‘172.16.100.%‘ IDENTIFIED BY PASSWORD ‘*5C275EDDF185436A097C27336FB99357638439A4‘ | 
+--------------------------------------------------------------------------------------+

d、对数据库锁表只读,并查看主库状态以及导出数据库数据

由于对数据库锁表后,不能退出当前的会话,一旦退出就自动解锁了。因此,我们将锁表、查看主库状态以及导出数据库数据放到一步来做!

[[email protected] ~]# mkdir /bak
[[email protected] ~]# mysql -uroot -p‘sunsky‘ << EOF 
flush tables with read lock; 
system echo ‘----show master status result----‘ 
system mysql -uroot -p‘sunsky‘ -e "show master status"
system mysqldump -uroot -p‘sunsky‘ -A -B --events|gzip > /bak/master.$(date +%F).sql.gz 
EOF 

----show master status result---- 
File	Position	Binlog_Do_DB	Binlog_Ignore_DB 
mysql-bin.000001	257
[[email protected] ~]# ll /bak/master.2014-06-03.sql.gz 
-rw-r--r--. 1 root root 144360 Jun 3 23:50 /bak/master.2014-06-03.sql.gz

注意:

在执行锁表命令的时候,在不同的引擎的情况,会受下面参数的控制。锁表的时候,如果超过设置的时间不操作会自动解锁。主要受下面2个参数影响!

[[email protected] ~]# mysql -uroot -p‘sunsky‘ -e "show variables like ‘%timeout%‘;" 
+--------------------------------+-----------+ 
| Variable_name                  | Value     | 
+--------------------------------+-----------+ 
| connect_timeout                | 10        | 
| delayed_insert_timeout         | 300       | 
| innodb_lock_wait_timeout       | 50        | 
| innodb_rollback_on_timeout     | OFF       | 
| interactive_timeout            | 28800     | 
| lock_wait_timeout              | 31536000  | 
| net_read_timeout               | 30        | 
| net_write_timeout              | 60        | 
| slave_net_timeout              | 3600      | 
| wait_timeout                   | 28800     | 
+--------------------------------+-----------+


e、把主库备份的MYSQL数据迁移到从库

[[email protected] ~]# scp /bak/master.2014-06-03.sql.gz 172.16.100.2:/tmp/ 
[email protected]‘s password: 
master.2014-06-03.sql.gz 100% 141KB 141.0KB/s 00:00

三、从库执行操作

a、设置server-id值并关闭binlog参数

我们要对从服务器设置唯一的server-id,并且要注释掉从服务器的 binlog 参数配置。

修改后参数如下:

[mysqld]
server-id = 2
#log-bin = /data/3307/mysql-bin

提示:

1、上面两参数要放在my.cnf中的[mysqld]模块下,否则会出错

2、我们也要保证主服务器的server-id唯一。server-id的值要使用服务器ip地址的最后8位如1,目的是避免不同机器或实例ID重复,不适合多实例。server-id的范围: 0 < server-id < 2的32次方-1的自然数

3、要先在 my.cnf 配置文件中查找相关参数,并按要求修改,不存在时再添加参数,切记,参数不能重复

4、修改 my.cnf 配置后需要重启数据库

另外,在以下两种情况下,我们需要在从服务器上打开 log-bin 来记录数据库更新的sql语句:

        a、级联同步,A==>B==>C 那中间的B就要开启log-bin
        b、在从库做数据库备份,数据库备份必须要有全备 + binlog

检查配置后的结果:

[[email protected] ~]# egrep ‘server-id|log-bin‘ /etc/my.cnf 
server-id	= 2 
#log-bin=mysql-bin
[[email protected] ~]# /etc/init.d/mysqld stop
[[email protected] ~]# /usr/local/mysql/bin/mysqld_safe --skip-slave-start &


b、还原主库导出的数据到从库

[[email protected] ~]# ll /tmp/master.2014-06-03.sql.gz 
-rw-r--r--. 1 root root 144360 Jun 4 02:10 /tmp/master.2014-06-03.sql.gz 
[[email protected] ~]# gunzip /tmp/master.2014-06-03.sql.gz 
[[email protected] ~]# ll /tmp/master.2014-06-03.sql 
-rw-r--r--. 1 root root 528663 Jun 4 02:10 /tmp/master.2014-06-03.sql 
[[email protected] ~]# mysql -uroot -psunsky < /tmp/master.2014-06-03.sql

c、登陆从库配置同步参数

[[email protected] ~]# mysql -uroot -psunsky << EOF 
> CHANGE MASTER TO 
> MASTER_HOST=‘172.16.100.1‘,    # 指定主库的 IP 地址
> MASTER_PORT=3306,              # 指定主库的端口
> MASTER_USER=‘rep‘,             # 指定负责同步的用户为rep
> MASTER_PASSWORD=‘sunsky‘,      # rep用户的密码
> MASTER_LOG_FILE=‘mysql-bin.000001‘,   #这里是通过 show master status 看到的二进制日志文件名称,注意不能多空格
> MASTER_LOG_POS=257;            #这里是通过 show master status 时查看到的二进制日志偏移量,注意不能多空格
> EOF

上述操作的实质,mysql会把用户和密码等信息写入到 master.info 文件中

d、启动从库同步开关

接下来,我们启动从库同步的开关,并且查看从库的同步状态

[[email protected] ~]# mysql -uroot -psunsky -e ‘slave start‘ 
[[email protected] ~]# mysql -uroot -p‘sunsky‘ -e ‘show slave status\G‘|egrep "Seconds_Behind_Master|_Running" 
Slave_IO_Running: Yes               # I/O线程运行是否正常
Slave_SQL_Running: Yes            # SQL线程运行是否正常
Seconds_Behind_Master: 0        # 同步延时


e、测试复制结果

[[email protected] ~]# mysql -uroot -psunsky -e "create database sunsky; " 
[[email protected] ~]# mysql -uroot -p‘sunsky‘ -e "show databases;" 
+------------------------+ 
| Database               | 
+------------------------+ 
| information_schema     | 
| mysql                  | 
| performance_schema     | 
| sunsky                 | 
| test                   | 
+------------------------+
[[email protected] ~]# mysql -uroot -p‘sunsky‘ -e "show databases;" 
+------------------------+ 
| Database               | 
+------------------------+ 
| information_schema     | 
| mysql                  | 
| performance_schema     | 
| sunsky                 | 
| test                   | 
+------------------------+

OK!

这样子,我们的MySQL主从同步架构就部署完成了!希望能对大家有所帮助!

mysql系列之复制2----主从同步部署

时间: 2024-11-16 01:17:18

mysql系列之复制2----主从同步部署的相关文章

MySQL数据库主从同步部署

MySQL数据库主从同步部署: 环境 Mater:   CentOS6.4  mysql5.5.38  192.168.107.133 Slave:   CentOS6.4  mysql5.5.38  192.168.107.135 1.导出主服务数据,将主备初始数据同步 master: //从master上导出需要同步的数据库信息 mysqldump -u*** -p*** --database test > test.sql //将master上的备份信息传输到slave上 scp /roo

MYSQL-MMM主从同步部署mysql高用集群

使用mysql-mmm和mysql主从同步部署mysql高用集群 公共配置: 关闭iptables 禁用selinux 配置好yum源 固定ip 彼此间能通信 都运行数据库服务 都只有默认初始的四个库 1配置主主结构 2配置一主多从结构 3安装mysql-mmm软件 4配置mysql-mmm实现mysql高可用集群

MySQL主从同步部署

mysql主从同步部署: master:192.168.2.67 slave:192.168.2.211 同步系统非默认库,master中其它库已经运行一段时间. master端: vim /etc/my.cnf server-id       = 1    master端ID号 log-bin=/data/logbin/mysql-bin    日志路径及文件名 #binlog-do-db = debit            同步debit,此处关闭的话,就是除不允许的,其它的库均同步. b

Innobackup mysql 多实例环境搭建主从同步

Innobackup mysql 多实例环境搭建主从同步 该实验是在mysql多实例环境下做的:如果需要部署 mysql 多实例环境,则移步: mysql 多实例案例实战: http://blog.csdn.net/wanglei_storage/article/details/49305239 mysql 的主从搭建大家有很多种方式,传统的 mysqldump 方式是很多人的选择之一.但对于较大的数据库则该方式并非理想的选择.使用 Xtrabackup 可以快速轻松的构建 mysql 主从架构

MYSQL 的 AB 复制(主从,双机热备)

MYSQL 的 AB 复制(主从,双机热备)     在实际的应用中,我们经常需要制作一个备份数据库.当我们的主数据库发生问题导致无法正常相应的时候,我们可以 把备用的从数据库街上来顶替主库,以达到不间断服务,热备的作用.在实际应用中从库和主库的数据必须同步,保持一致, 对主库的任何操作通要引发从库上的同样操作. 实现原理: 从库以一定的频率去读取主库的二进制日志文件,按照日志中记录对从库进行同样的操作,以达到同步效果. 注意版本影响: 实现双机的热备首先要了解主从数据库服务器的版本的需求.首先

搭建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系列之复制1----原理篇

MySQL 复制介绍: MySQL支持单向.异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器. MySQL主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环.这些日志可以记录发送到从服务器的更新.当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置.从服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通知新的更新. 在当前的生产工作中,大多数应用的 MySQL 主从同步都是异步的复制方式,即不是严格实时的数

MySQL的读写分离与主从同步数据一致性

有没有做MySQL读写分离?如何实现mysql的读写分离?MySQL主从复制原理的是啥?如何解决mysql主从同步的延时问题? 高并发这个阶段,那肯定是需要做读写分离的,啥意思?因为实际上大部分的互联网公司,一些网站,或者是app,其实都是读多写少.所以针对这个情况,就是写一个主库,但是主库挂多个从库,然后从多个从库来读,那不就可以支撑更高的读并发压力了吗? (1)如何实现mysql的读写分离? 其实很简单,就是基于主从复制架构,简单来说,就搞一个主库,挂多个从库,然后我们就单单只是写主库,然后

DNS主从同步部署

DNS 主从同步原理 主从同步:主每次修改配置文件需要修改一下序列号,主从同步主要 看序列号. 从DNS:从是可以单独修改,主从不会报错.但从修改后,主端同步给从后 从端修改数据会丢失 主从原理:从会监听主的 TCP 53 端口,它会隔一段时间去探测 主配置文件中的序列号,如果主端 序列号更新后 从端探测到会 将主端内容 同步到本地. 同步模式:从主动探测时间比较缓慢,可以设置主端,每次变更序列号时主动将,数据信息,推送给从端. DNS实验环境 master服务器:172.16.2.116 sl