MySQL主从(MySQL replication),主要用于MySQL的实时备份或者读写分离。在配置之前先做一下准备工作,配置两台MySQL服务器,如果你的机器不能同时跑两台Linux虚拟机,那么可以考虑在同一个机器上跑两个MySQL服务。
MySQL主从的原理非常简单,总结一下:
(1)每个主从仅可以设置一个主。
(2)主在执行SQL之后,记录二进制log文件(bin-log)
(3)从连接主,并获取主的bin-log,存于本地relay-log,并从上次执行的位置起执行SQL,一旦遇到错误则停止同步。
mysql主从配置replication,又叫A,B复制,保证主从数据同步
A --> change data --> bin_log -transfer --> B --> repl_log -->change data
从这几条replication原理来看,可以有这些推论:
(1)主从间的数据库不是实时同步,就算网络连接正常,也存在瞬间,主从数据不一致。
(2)如果主从的网络断开,从会在网络正常后,批量同步。
(3)如果对从进行修改数据,那么很可能从在执行主的bin-log时出现错误而停止同步,这是个很危险的操作。所以一般情况下,非常小心的修改从上的数据。
(4)一个衍生的配置是双主,即互为主从配置,只要双方的修改不冲突,可以工作良好。
(5)如果需要多主的话,可以用环形配置,这样任何一个节点的修改都可以同步到所有节点。
(6)可以应用在读写分离的场景,用以降低单台MySQL的I/O
(7)可以是一主多从,也可以是相互主从(主主)
主MySQL(master):192.168.134.128
从MySQL(slave):192.168.134.129
1.准备工作:
(1)修改两个主机的主机名:
主:192.168.134.128
[root@master ~]# hostname master
[root@master ~]# vim /etc/sysconfig/network
hostname=master
从:192.168.134.129
[root@slave~]# hostname slave
[root@slave~]# vim /etc/sysconfig/network
hostname=slave
(2)在两台机器上编辑hosts文件:
vim /etc/hosts
都加入两行:
192.168.134.128 master
192.168.134.129 slave
(3)关闭两台机器的防火墙:
关闭SELinux:
setenforce 0
vim /etc/selinux/config
SELINUX=disabled
关闭iptables:
iptables -F
iptables-save
chkconfig iptables off
2.在主从上都安装MySQL:
主:192.168.134.128
进入源码包目录:
[root@master ~]# cd /usr/local/src
下载MySQL安装包:
[root@master src]# ls
mysql-5.1.73-linux-x86_64-glibc23.tar.gz
解压MySQL包:
[root@master src]# tar zxvf mysql-5.1.73-linux-x86_64-glibc23.tar.gz
移动并重命名安装目录:
[root@master src]# mv mysql-5.1.73-linux-x86_64-glibc23 /usr/local/mysql
查看安装目录内容:
[root@master src]# ls /usr/local/mysql/
bin data include lib mysql-test scripts sql-bench
COPYING docs INSTALL-BINARY man README share support-files
创建mysql用户,不让其登录:
[root@master src]# useradd -s /sbin/nologin mysql
进入安装目录:
[root@master src]# cd /usr/local/mysql/
拷贝配置文件到/etc目录下覆盖原来的my.cnf:
[root@master mysql]# cp support-files/my-small.cnf /etc/my.cnf
cp:是否覆盖"/etc/my.cnf"? y
拷贝启动脚本到/etc/init.d/目录下重命名为mysqld:
[root@master mysql]# cp support-files/mysql.server /etc/init.d/mysqld
编辑启动脚本:
[root@master mysql]# vim /etc/init.d/mysqld
定义basedir和datadir:
basedir=/usr/local/mysql
datadir=/data/mysql
创建数据库存放路径:
[root@master mysql]# mkdir /data/mysql
配置:
[root@master mysql]# ./scripts/mysql_install_db --user=mysql --datadir=/data/mysql
WARNING: The host 'master' could not be looked up with resolveip.
This probably means that your libc libraries are not 100 % compatible
with this binary MySQL version. The MySQL daemon, mysqld, should work
normally with the exception that host name resolving will not work.
This means that you should use IP addresses instead of hostnames
when specifying MySQL privileges !
Installing MySQL system tables...
170312 23:59:44 [Warning] '--skip-locking' is deprecated and will be removed in a future release. Please use '--skip-external-locking' instead.
OK
Filling help tables...
170312 23:59:44 [Warning] '--skip-locking' is deprecated and will be removed in a future release. Please use '--skip-external-locking' instead.
OK
出现两个OK表示配置成功。
启动MySQL:
[root@master mysql]# /etc/init.d/mysqld start
Starting MySQL. SUCCESS!
查看进程:
[root@master mysql]# ps aux | grep mysql