主从复制:简称AB复制,在A主机上做create、update、insert、drop、delete等数据库、表、记录的增、删、改操作,B主机上会自动做数据库、表、记录的同步更新。

如图,主从复制的工作过程其实十分简单:

  1. A主机做出操作:create  database  tb;  ---->    会将此命令自动写入本机的二进制日志文件(即log-bin)中。

  2. 再由B主机的I/O线程对A主机的二进制日志文件实时监控,将A写入二进制日志文件的操作,写入B主机的中继日志中。

  3. 最后被B主机的SQL线程对写入中继日志的操作在B主机上执行,从而建立了tb这个库(create database tb;)。

MySQL之主从复制_第1张图片

环境部署:要在两台主机上部署主从复制即“一主一从”。master为:192.168.11.11    slave为:192.168.11.12

部署思路:

1.在A主机(master)上的/etc/my.cnf主配置文件中开启binlog二进制日志文件功能,并且给主机设置server-id唯一标识编号。重启mariadb服务。

2.在A主机上创建用于AB主从复制的用户账号,并查看master状态中的binlog日志文件的position位置数值。

3.在B主机上的/etc/my.cnf主配置文件中设置server-id唯一标识编号。。重启mariadb服务。

4.在B主机上用help   change  master查命令帮助,并用change  master命令告诉B主机他的master主人的正确信息。

5.在B主机上用start   slave启动mariadb的随从服务,并用show   slave   status查看AB主从复制的数据同步状态,要确认两个线程的yes状态。


具体操作:

一、在“主”主机下做如下操作:

1.在mariadb的主配置文件(/etc/my.cnf)的主标识下加入

server-id=11(服务器id,随便定,一般取主机IP的末位)

log-bin=master-bin(指定二进制日志文件名)

skip_name_resolv=1(跳过域名解析)


2.然后重启服务:systemctl enable mariadb


3.进入mysql,设置功能为应答“随从”,仅允许同网段访问的,用户名和密码都为zc的账号。更新账号权限信息,查看数据库当前正在使用的二进制日志文件的位置

grant replication slave on *.* to zc@'%' identified by 'zc';

flush privileges;

show master status;

记下查到的file、position两个状态码,分别写在部署“从”主机的“二进制日志文件名”和“position值”上。



二、接下来开始配置“从”主机:

1.在mariadb的主配置文件(/etc/my.cnf)的主标识下加入

server-id=12(服务器id,随便定,一般取主机IP的末位)


2.然后重启服务:systemctl enable mariadb


3.依次输入通过“help change master to”查询并修改得到的命令,然后开启slave功能,最后查看slave的状态信息,主要查看I/O和SQL线程的状态,yes即可(Slave_IO_Running: Yes       Slave_SQL_Running: Yes)。

  ->   CHANGE MASTER TO

    ->   MASTER_HOST='192.168.11.11', (“主”主机的IP地址)

    ->   MASTER_USER='zc', (功能为应答slave的用户)

    ->   MASTER_PASSWORD='zc', (该用户的密码)

    ->   MASTER_PORT=3306, (工作端口为3306)

    ->   MASTER_LOG_FILE='master-bin.000001', (二进制日志文件名)

    ->   MASTER_LOG_POS=245, (position值)

    ->   MASTER_CONNECT_RETRY=10; (重连时间)

start slave;

show slave status\G;



三、验证方法:在“主”主机上随意创建一个库或表,再到“从”主机上去查询,看能否查到在“主”主机上创建的库和表。


最后这是我总结时写的一个shell脚本虽然比较low,但已调试成功。

#!/bin/bash

maria='mariadb mariadb-server'

rpm -q $maria ||yum -y install $maria > /dev/null

cat >/etc/my.cnf.d/master.cnf <

[mysqld]

server-id=11

log-bin=master-bin

skip_name_resolv=1

EOF

systemctl restart mariadb && systemctl enable mariadb

mysql -e "grant replication slave on *.* to tian@'%' identified by 'bin';flush privileges;"

File=$(mysql -e "show master status;" |awk -F" " '/master/{print $1}')

Position=$(mysql -e "show master status;" |awk -F" " '/master/{print $2}')

#接下来做“从”的设置

echo "

rpm -q $maria ||yum -y install $maria > /dev/null

echo '[mysqld]

server-id=12

skip_name_resolv=1' >/etc/my.cnf.d/slave.cnf

systemctl restart mariadb

mysql -e 'stop slave;'

mysql -e \"

CHANGE MASTER TO

  MASTER_HOST='192.168.11.11',

  MASTER_USER='tian',

  MASTER_PASSWORD='bin',

  MASTER_PORT=3306,

  MASTER_LOG_FILE='$File',

  MASTER_LOG_POS=$Position,

  MASTER_CONNECT_RETRY=10;\"

mysql -e 'start slave;show slave status\G' " > ~/slave.sh

#接下来用scp将“从”的脚本传到12主机上,并用ssh远程执行脚本。

[ -x /usr/bin/expect ] || yum -y install expect > /dev/null

[ -f ~/.ssh/id_rsa ] || ssh-keygen -t rsa -f ~/.ssh/id_rsa -N '' -q

/usr/bin/expect <

set timeout 10

spawn ssh-copy-id [email protected]

expect "yes/no"

send "yes\n"

expect "password"

send "0\n"

expect eof

EOF

cd

scp slave.sh [email protected]:/root/

ssh [email protected] "cd;. slave.sh"