经过了上一篇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----主从同步部署