主从复制:简称AB复制,在A主机上作create、update、insert、drop、delete等数据库、表、记录的增、删、改操做,B主机上会自动作数据库、表、记录的同步更新。mysql
如图,主从复制的工做过程其实十分简单:sql
A主机作出操做:create database tb; ----> 会将此命令自动写入本机的二进制日志文件(即log-bin)中。shell
再由B主机的I/O线程对A主机的二进制日志文件实时监控,将A写入二进制日志文件的操做,写入B主机的中继日志中。数据库
最后被B主机的SQL线程对写入中继日志的操做在B主机上执行,从而创建了tb这个库(create database tb;)。bash
环境部署:要在两台主机上部署主从复制即“一主一从”。master为:192.168.11.11 slave为:192.168.11.12服务器
部署思路:ssh
1.在A主机(master)上的/etc/my.cnf主配置文件中开启binlog二进制日志文件功能,而且给主机设置server-id惟一标识编号。重启mariadb服务。ide
2.在A主机上建立用于AB主从复制的用户帐号,并查看master状态中的binlog日志文件的position位置数值。spa
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、在“主”主机下作以下操做:
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值”上。
2、接下来开始配置“从”主机:
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;
3、验证方法:在“主”主机上随意建立一个库或表,再到“从”主机上去查询,看可否查到在“主”主机上建立的库和表。
最后这是我总结时写的一个shell脚本虽然比较low,但已调试成功。
#!/bin/bash
maria='mariadb mariadb-server'
rpm -q $maria ||yum -y install $maria > /dev/null
cat >/etc/my.cnf.d/master.cnf <<EOF
[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 <<EOF
set timeout 10
spawn ssh-copy-id root@192.168.11.12
expect "yes/no"
send "yes\n"
expect "password"
send "0\n"
expect eof
EOF
cd
scp slave.sh root@192.168.11.12:/root/
ssh root@192.168.11.12 "cd;. slave.sh"