简单原理
主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE)操作,而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到其他从数据库。以SQL为例,主库负责写数据、读数据。读库仅负责读数据。每次有写库操作,同步更新到读库。写库就一个,读库可以有多个,采用日志同步的方式实现主库和多个读库的数据同步。即:
主服务器master记录数据库操作日志到Binary log,从服务器开启i/o线程将二进制日志记录的操作同步到relay log(存在从服务器的缓存中),另外sql线程将relay log日志记录的操作在从服务器执行。
准备
两台服务器,同时ubuntu 16.0
mysql通过apt-get安装,配置文件目录在/etc/mysql/mysql.conf.d/mysqld.cnf,ubuntu的mysql和centos7的mysql配置文件目录不同,这点要区分。
主数据库
主数据库我们叫他master
1.打开mysql配置文件/etc/mysql/mysql.conf.d/mysqld.cnf,选用查找/log-bin跳到这行。
我们可以看到,第一行第二行和最后两行都被注释了,这里我们需要解开
server-id = 1 //id,唯一
log-bin = /var/log/mysql/mysql-bin.log //二进制文件目录
这里我没有用到最后两个,这个看需求订,第三个是要同步的数据库,最后一个是要排除的数据库。
然后再用查找bind-address,注释掉(重点,必须注释掉,不然从数据库会连不上报2003错误)
重启服务
service mysql restart
2.添加一个用来登录主数据库的用户,权限和root一样,这里我用的是phpadmin,所以直接在界面添加了一个rel用户,密码123456.
在ubuntu登录数据库
mysql -uroot -p
安装同步插件(在进入数据库内执行)
install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
set global rpl_semi_sync_slave_enabled=ON;
flush privileges;
查看同步状态
show status like '%semi%';
查看主数据库状态
show master status;
记住这些状态值,我们需要告诉从数据库
从数据库
1.同样,我们还是要修改配置vim /etc/mysql/mysql.conf.d/mysqld.cnf
server-id = 2 //一定不能和主一样,一定要唯一
log-bin = /var/log/mysql/mysql-bin.log
同样注释bind-address,然后重启
service mysql restart
2。进入数据库
mysql -uroot -p
安装插件
install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
set global rpl_semi_sync_slave_enabled=ON;
flush privileges;
查看状态
show status like '%semi%';
现在要把我们在主数据库创的用户和主数据库的状态告诉从数据库
change master to master_host='xx.xx.xx.xx', //主数据库的ip
master_user='rel', //创的用户
master_password='123456', //密码
master_log_file='mysql-bin.000011', //File
master_log_pos= 2058; //Position
flush privileges;
开启从服务
start slave;
查看连接状态
show slave status\G
当红框中都是yes,证明主从服务设置成功。如果出现Slave_IO_Running: Connecting,有以下可能
1.从数据库或者主数据库端口错误
2.主数据库或者从数据库防火墙未关闭
3.端口未开放(云服务器端口限制)
现在我们去测试主从效果。先在主数据库添加一个test数据库
接着我们去从数据库刷新查看
同样,从数据库也有test数据库,证明主从成功。