自研Saas系统之路(四)数据库主从

主从复制原理:
上边这张交互图就清楚的标记出了Master节点如何同步到Slave节点

首先Master上的修改、删除、新增操作都会被记录到一个叫做binlog的文件中,它是一个二进制日志文件
Slave通过I/O线程读取binlog文件并写入到自己的relaylog(中继日志)中
主库会生成一个 log dump 线程,用来给从库 i/o线程传binlog
另一个SQL线程会读取自身的relaylog文件,并把对应的操作在自己的节点上执行一次,达到同步的效果
主从虽好,同时也带来了问题:
主库宕机后,数据未同步完成,数据丢失

解决方式:

半同步复制 (确保事务提交后binlog至少传输到一个从库节点,性能有一定的降低,响应时间会更长)
强制走主

从库只有一个SQL Thread,主库写压力大,复制很可能延时

在SQL线程上实现了多线程,来提升slave的并发度

主从配置的前提条件
1、MySQL版本一致;
2、MySQL中的数据一致;

主:192.168.16.135
从:192.168.16.137

1:配置主服务器mysql

#[必须]启用二进制日志 
log-bin=mysql-bin 
#[必须]服务器唯一ID,默认是1,一般取IP最后一段 
server-id=135

重启,进入mysql命令行

##创建帐户'slave'使用 "%" 所有从服务的ip
grant replication slave on *.* to 'slave'@'%' identified by '123456';

##创建帐户'slave'使用从服务的ip
##grant replication slave on *.* to 'slave'@'192.168.16.137' identified by '123456';

查询用户

select user, host, password, from mysql.user;

查询master(主服务器)的状态, 需要用到 file position

show master status;

2、配置slave(从服务器)mysql

#[可选]启用二进制日志 
log-bin=mysql-bin 
#[必须]服务器唯一ID,默认是1,一般取IP最后一段 
server-id=137

重启mysql服务…进入mysql命令行
启动从服务器复制功能

change master to master_host='192.168.16.135',master_user='slave',master_password='123456',master_log_file='mysql-bin.000019',master_log_pos=3887;

  • master_host=主服务器IP master_user=在主服务器上创建的备份用户名
  • master_password=备份用户密码
  • master_log_file=查询master(主服务器)的状态得到的File列的值
  • master_log_pos=Position列的值

然后 启动从服务器复制功能

start slave

检查从服务器复制功能状态

show slave status\G

##正确 这两个一定要yes
Slave_IO_Running: Yes 
lave_SQL_Running: Yes

Slave_IO及Slave_SQL进程必须正常运行,即YES状态,否则都是错误的状态(如:其中 connect 和 NO均属错误)。

如果是Slave_SQL_Running:no:

MariaDB [(none)]> stop slave;                                                      
MariaDB [(none)]> SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; START SLAVE;            
MariaDB [(none)]> start slave;                                                      
MariaDB [(none)]> show slave status\G  

如果是slave_io_running:no

1、查看主服务器

MariaDB [(none)]> show master status\G       

2、在从服务器上查看
MariaDB [(none)]> show master status\G   

问题所在:发现Master_Log_File没有对应。

3、出现Slave_IO_Running: No的机器上操作
MariaDB [(none)]> slave stop;                 
MariaDB [(none)]>CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000026', MASTER_LOG_POS=0;  
MariaDB [(none)]> slave start;                               
MariaDB [(none)]> show slave status\G   

如果出现connecting 检查端口号是否开启,连接是否正常

到这里就配置完成了,然后在主从服务器创建数据库和表,从服务器的mysql也会有数据库和表。

3:TP6配置分布式数据库
在database.php中:

两边的服务mysql用户名密码我都是一样的
如果不一样可以按照这样设置

类似文章