主从复制:简称AB复制,在A主机上做create、update、insert、drop、delete等数据库、表、记录的增、删、改操作,B主机上会自动做数据库、表、记录的同步更新。
如图,主从复制的工作过程其实十分简单:
A主机做出操作:create database tb; ----> 会将此命令自动写入本机的二进制日志文件(即log-bin)中。
再由B主机的I/O线程对A主机的二进制日志文件实时监控,将A写入二进制日志文件的操作,写入B主机的中继日志中。
最后被B主机的SQL线程对写入中继日志的操作在B主机上执行,从而建立了tb这个库(create database tb;)。
环境部署:要在两台主机上部署主从复制即“一主一从”。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"