自研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用户名密码我都是一样的
如果不一样可以按照这样设置