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

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

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


1
2
3
4
5
6
7
8
环境:
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


架构图:

wKiom1PSBcTRdOHEAABGjXzp-_c957.jpgspacer.gif


一、主从复制前环境检查

主服务器检查:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@master ~] # hostname 
master 
[root@master ~] # 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 
[root@master ~] # mysql -uroot -psunsky -e 'select version();' 
+------------+ 
| version()  | 
+------------+ 
| 5.5.32-log | 
+------------+
[root@master ~] # mysql -uroot -psunsky -e "show variables like '%datadir%';" 
+---------------+----------+ 
| Variable_name | Value    | 
+---------------+----------+ 
| datadir |  /mydata/       
+---------------+----------+


从服务器检查:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@slave ~] # hostname 
slave 
[root@slave ~] # 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 
[root@slave ~] # mysql -uroot -psunsky -e 'select version();' 
+-----------+ 
| version() | 
+-----------+ 
| 5.5.32    | 
+-----------+
[root@slave ~] # 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.

下面是需要修改的内容:

1
2
3
4
5
[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 配置后重启数据库

1
2
3
[root@master ~] # /etc/init.d/mysqld restart 
Shutting down MySQL. SUCCESS! 
Starting MySQL.. SUCCESS!


检查配置后的结果:

检查方法一:

1
2
3
4
5
[root@master ~] # 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

检查方法二:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[root@master ~] # mysql -uroot -psunsky -e "show variables like 'log_bin';" 
+---------------+-------+ 
| Variable_name | Value | 
+---------------+-------+ 
| log_bin       | ON    | 
+---------------+-------+ 
[root@master ~] # mysql -uroot -psunsky -e "show variables like '%server_id%'" 
+---------------+-------+ 
| Variable_name | Value | 
+---------------+-------+ 
| server_id     | 1     | 
+---------------+-------+
[root@master ~] # mysql -uroot -psunsky -e "show variables like 'binlog_format';" 
+---------------+-------+ 
| Variable_name | Value | 
+---------------+-------+ 
| binlog_format | MIXED | 
+---------------+-------+
[root@master ~] # mysql -uroot -psunsky -e "show variables like 'sync_binlog';" 
+---------------+-------+ 
| Variable_name | Value | 
+---------------+-------+ 
| sync_binlog   | 1     | 
+---------------+-------+



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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@master ~] # mysql -uroot -psunsky -e "grant replication slave on *.* to rep@'172.16.100.%' identified by 'sunsky';" 
[root@master ~] # mysql -uroot -psunsky -e "select user,host from mysql.user where user='rep';" 
+------+--------------+ 
| user | host         | 
+------+--------------+ 
| rep  | 172.16.100.% | 
+------+--------------+ 
[root@master ~] # mysql -uroot -psunsky -e "show grants for rep@'172.16.100.%';" 
+--------------------------------------------------------------------------------------+
| Grants  for  rep@172.16.100.% | 
+--------------------------------------------------------------------------------------+ 
| GRANT REPLICATION SLAVE ON *.* TO  'rep' @ '172.16.100.%'  IDENTIFIED BY PASSWORD  '*5C275EDDF185436A097C27336FB99357638439A4' 
+--------------------------------------------------------------------------------------+ 
[root@master ~] # mysql -uroot -psunsky -e "show grants for rep@'172.16.100.%';" 
+--------------------------------------------------------------------------------------+ 
| Grants  for  rep@172.16.100.% | 
+--------------------------------------------------------------------------------------+
| GRANT REPLICATION SLAVE ON *.* TO  'rep' @ '172.16.100.%'  IDENTIFIED BY PASSWORD  '*5C275EDDF185436A097C27336FB99357638439A4' 
+--------------------------------------------------------------------------------------+


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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@master ~] # mkdir /bak
[root@master ~] # 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
[root@master ~] # 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个参数影响!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@master ~] # 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数据迁移到从库

1
2
3
[root@master ~] # scp /bak/master.2014-06-03.sql.gz 172.16.100.2:/tmp/ 
root@172.16.100.2's password: 
master.2014-06-03.sql.gz 100% 141KB 141.0KB /s  00:00


三、从库执行操作

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

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

修改后参数如下:

1
2
3
[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语句:

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


检查配置后的结果:

1
2
3
4
5
[root@slave ~] # egrep 'server-id|log-bin' /etc/my.cnf 
server- id    = 2 
#log-bin=mysql-bin
[root@slave ~] # /etc/init.d/mysqld stop
[root@slave ~] # /usr/local/mysql/bin/mysqld_safe --skip-slave-start &



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

1
2
3
4
5
6
[root@slave ~] # 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 
[root@slave ~] # gunzip /tmp/master.2014-06-03.sql.gz 
[root@slave ~] # ll /tmp/master.2014-06-03.sql 
-rw-r--r--. 1 root root 528663 Jun 4 02:10  /tmp/master .2014-06-03.sql 
[root@slave ~] # mysql -uroot -psunsky < /tmp/master.2014-06-03.sql


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

1
2
3
4
5
6
7
8
9
[root@slave ~] # 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、启动从库同步开关

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

1
2
3
4
5
[root@slave ~] # mysql -uroot -psunsky -e 'slave start' 
[root@slave ~] # 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、测试复制结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@master ~] # mysql -uroot -psunsky -e "create database sunsky; " 
[root@master ~] # mysql -uroot -p'sunsky' -e "show databases;" 
+------------------------+ 
| Database               | 
+------------------------+ 
| information_schema     | 
| mysql                  | 
| performance_schema     | 
| sunsky                 | 
test                   
+------------------------+
[root@slave ~] # mysql -uroot -p'sunsky' -e "show databases;" 
+------------------------+ 
| Database               | 
+------------------------+ 
| information_schema     | 
| mysql                  | 
| performance_schema     | 
| sunsky                 | 
test                   
+------------------------+


OK!

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










本文转自 aaao 51CTO博客,原文链接:http://blog.51cto.com/nolinux/1530108,如需转载请自行联系原作者

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
1月前
|
SQL 存储 关系型数据库
MySQL的主从复制&主从同步
MySQL的主从复制&主从同步
30 0
|
1月前
|
Ubuntu 关系型数据库 MySQL
使用Ubuntu和Windows电脑实现Mysql主从同步(详细操作步骤)
使用Ubuntu和Windows电脑实现Mysql主从同步(详细操作步骤)
28 2
|
1月前
|
网络协议 关系型数据库 MySQL
如何实现无公网ip远程访问本地安卓Termux部署的MySQL数据库【内网穿透】
如何实现无公网ip远程访问本地安卓Termux部署的MySQL数据库【内网穿透】
|
3月前
|
关系型数据库 MySQL 数据库
Docker部署Mysql数据库详解
Docker是一种流行的容器化平台,可以简化应用程序的部署和管理。在本博客中,我们将探讨如何使用Docker部署两个广泛使用的数据库:MySQL。我们将提供详细的步骤和相应的命令,以帮助您轻松地在Docker容器中设置和运行这个数据库。
300 0
|
1月前
|
分布式计算 关系型数据库 MySQL
Sqoop【部署 01】CentOS Linux release 7.5 安装配置 sqoop-1.4.7 解决警告并验证(附Sqoop1+Sqoop2最新版安装包+MySQL驱动包资源)
【2月更文挑战第8天】Sqoop CentOS Linux release 7.5 安装配置 sqoop-1.4.7 解决警告并验证(附Sqoop1+Sqoop2最新版安装包+MySQL驱动包资源)
98 1
|
14天前
|
SQL 关系型数据库 MySQL
mysql主从同步出错解决办法
mysql主从同步出错解决办法
10 0
|
27天前
|
NoSQL 关系型数据库 MySQL
安装Docker&镜像容器操作&使用Docker安装部署MySQL,Redis,RabbitMQ,Nacos,Seata,Minio
安装Docker&镜像容器操作&使用Docker安装部署MySQL,Redis,RabbitMQ,Nacos,Seata,Minio
147 1
|
1月前
|
存储 Kubernetes 关系型数据库
KubeSphere 核心实战之一【在kubesphere平台上部署mysql】(实操篇 1/4)
KubeSphere 核心实战之一【在kubesphere平台上部署mysql】(实操篇 1/4)
44 0
|
1月前
|
SQL 关系型数据库 MySQL
MySQL多实例部署:从概念到实操的全面指南
MySQL多实例部署:从概念到实操的全面指南
40 0
|
2月前
|
SQL 关系型数据库 MySQL
docker部署mysql
docker环境下部署mysql8.x和mysql5.x