Mysql5.6主从架构

/ 2017-07-31 7:00:07 / 0评 / 0
MySQL replication(主从架构)配置
MySQL Replication 又叫做AB复制或者主从复制。它主要用于MySQL的时时备份或者读写分离。Master为主服务器,Slava为从服务器,初始状态时,master和slave中的数据信息相同,当master中的数据发生变化时,slave也跟着发生相应的变化,变使得master和slave的数据信息同步,达到备份的目的。在配置之前先做一下准备工作,配置两台mysql服务器。
环境说明:
操作系统:CentOS release 6.8 (64)
主库IP:192.168.120.10 (master)
从库IP:192.168.120.11 (slave)
Mysql version: 5.6.35
前期准备:
下载Mysql二进制包,/usr/local/src目录
修改Hostname主机名
搭建主从,必须保证主从数据库数据一致。
[root@master ~]# vim /etc/sysconfig/network
[root@master ~]# vim /etc/hosts
[root@master ~]# cd /usr/local/src
配置mysql服务
详细步骤
#下载MySQL
[root@master ~]# wget https://mirrors.tuna.tsinghua.edu.cn/mysql/downloads/MySQL-5.6/mysql-5.6.35-linux-glibc2.5-x86_64.tar.gz
#解压
[root@master ~]# tar –zxvf mysql-5.6.35-linux-glibc2.5-x86_64.tar.gz
#移动到/usr/local/mysql
[root@master ~]# mv mysql-5.6.35-linux-glibc2.5-x86_64 /usr/local/mysql
#建立Mysql用户
[root@master ~]# useradd -s /sbin/nologin mysql -M
#初始化数据库并创建数据库存放目录
[root@master ~]# cd /usr/local/mysql
[root@master ~]# mkdir -p /data/mysql ; chown -R mysql.mysql /data/mysql
[root@master ~]# ./scripts/mysql_install_db --user=mysql --datadir=/data/mysql/
--user 定义数据库的用户 --datadir 定义数据库的存放目录
#拷贝配置文件
[root@master ~]# cp support-files/my-default.cnf /etc/my.cnf 
#拷贝启动脚本并修改属性
[root@master ~]# cp support-files/mysql.server /etc/init.d/mysql
[root@master ~]# chmod 755 !$
#修改启动脚本

[root@master ~]# vim /etc/init.d/mysql
Datadir=
Basedir=

#把启动脚本加入系统服务项,并设置开机启动
[root@master ~]# chkconfig --add mysql
[root@master ~]# chkconfig mysql on
#启动MySql
[root@master ~]# service mysql start
Stating MySQL. SUCCESS!
#设置MySQL系统环境变量
[root@master ~]# vim /etc/profile.d/mysql.sh
export PATH=$PATH:/usr/local/mysql/bin
#让配置生效
[root@master ~]# source !$
#查看端口是否启动成功
 
[root@master ~]# netstat -lntp |grep 3306
tcp 0 0 :::3306 :::* LISTEN 2057/mysqld
配置replication
1. 设置master
修改Mysql主配置文件:
 
[root@master ~]# vim /usr/local/mysql/my.cnf
主在[mysqld]部分查看是否有以下内容,如果没有则添加:

server-id=1
log-bin=mysql-bin

如除了这两行是必须的外,还有两个参数,可以选择性的使用:

binlog-do-db=databasename1,databasename2
binlog-ignore-db=databasename1,databasename2

binlog-do-db=须需要复制的数据库名,多个数据库名,使用逗号分隔。
binlog-ignore-db=须不需要复制的数据库名,多个数据库名,使用逗号分隔。这两个参数其实用一个就可以了。
#设置MySQL密码
[root@master ~]# mysqladmin -uroot password ‘123456'
[root@master ~]# mysql -uroot -p123456
mysql> grant replication slave on *.* to 'slave'@'192.168.120.11' identified by 'hello123';
mysql> flush privileges; //刷新权限
//这里的repl是为slave端设置的访问master端mysql数据的用户,密码为123123,这里的192.168.120.11为slave的ip
[root@master ~]# service mysql restart //重启服务
mysql> flush tables with read lock; //锁定数据库,此时不允许更改任何数据
mysql> show master status; //查看状态,这些数据是要记录的,一会要在slave端用到
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000006 | 474952 | | |
+------------------+----------+--------------+------------------+
2. 设置slave
先修改slave的配置文件my.cnf:
[root@slave ~]# vim /etc/my.cnf
找到 “server-id = 1” 这一行,删除掉或者改为 “server-id = 2” 总之不能让这个id和master一样,否则会报错。
另外在从上,你也可以选择性的增加如下两行,对应于主上增加的两行:
replicate-do-db=databasename1,databasename2
replicate-ignore-db=databasename1,databasename2
改完后,重启slave:
[root@slave ~]# service mysql restart
拷贝master上的db1库的数据到slave上,不同的机器需要远程拷贝,注意这一点:
[root@master ~]# mysqldump -uroot -p123456 db1 > db1.sql
#创建db1数据库
[root@slave ~]# mysql -uroot -p123456 -e "create database db1"
#导入db1数据库
[root@slave ~]# mysql -uroot -p123456 db1 < db1.sql
第二行中,使用了一个-e选项,它用来把mysql的命令写到shell中,这样可以方便把mysql操作写进脚本中,它的格式就是 -e "commond" 它很实用,把数据拷贝过来后,就需要在slave上配置主从了:
[root@slave ~]# mysql -uroot -p123456
mysql> stop slave;
mysql> change master to master_host='192.168.120.10', master_port=3306,
master_user='slave', master_password='hello123',
master_log_file='mysql-bin.000006', master_log_pos=474952;
mysql> start slave;
其中master_log_file和master_log_pos是在上面使用 show master status 查到的数据。执行完这一步后,需要在master上执行一步:
[root@master ~]# mysql -uroot -p123456 -e "unlock tables"
然后查看slave的状态:
mysql> show slave status\G;
确认以下两项参数都为yes:

Slave_IO_Running: Yes
Slave_SQL_Running: Yes

测试主从
在master上执行如下命令:
[root@master ~]# mysql -uroot -p123456 -e "use db1;
select count(*) from db"
+----------+
| count(*) |
+----------+
| 2 |
+----------+
[root@master ~]# mysql -uroot -p123456 -e "use db1;
truncate table db"
[root@master ~]# mysql -uroot -p123456 -e "use db1;
select count(*) from db"
+----------+
| count(*) |
+----------+
| 0 |
+----------+
这样清空了db1.db表的数据,下面查看slave上的该表数据:
[root@slave ~]# mysql -uroot -pyourpassword -e "use db1; select count(*) from db"
+----------+
| count(*) |
+----------+
| 0 |
+----------+
slave上的该表也被清空了。这样好像不太明显,不妨继续把db表删除试试:
[root@master ~]# mysql -uroot -p123456 -e "use db1; drop table db"
[root@slave ~]# mysql -uroot -pyourpassword -e "use db1; select count(*) from db"
ERROR 1146 (42S02) at line 1: Table 'db1.db' doesn't exist

发表评论

邮箱地址不会被公开。 必填项已用*标注