192.168.68.160、162.168.68.162 互为主从关系
162.168.68.163、192.168.68.164 从库
安装数据库:
yum install mariadb mariadb-server
修改配置文件:
# vim /etc/my.cnf
server-id=1 #每台数据库的id不能相同!!
log-bin=mysql-bin
relay-log=relay-log
开启数据库:
# systemctl enable mariadb #开机自启
# systemctl start mariadb #启动
在192.168.68.160、162.168.68.162:操作互为主从
mysql 中查看 mysql 二进制日志信息并授权:
> show master status;
> grant all on *.* to lzg@'%' identified by '123';
> stop slave;
> change master to master_host='192.168.101.94',master_user='lzg',master_password='123',master_log_file='mysql-bin.000004',master_log_pos=245;
> start slave;
> show slave status \G;
显示下方为双Yes则主从配置成功:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
192.168.68.160、162.168.68.162:双主操作
安装部署高可用:keepalived
# yum install keepalived
修改其配置文件:
# vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
# Keepalived process identifier
lvs_id haproxy_DH
}
# Script used to check if HAProxy is running
vrrp_script check_mysql {
script "pidof mysqld"
interval 2
weight 20
}
# Virtual interface br-OAM
# The priority specifies the order in which the assigned interface to take over in a failover
vrrp_instance mysql {
state BACKUP
interface ens33
virtual_router_id 98
priority 10
# The virtual ip address shared between the two loadbalancers
virtual_ipaddress {
192.168.68.100/24
}
track_script {
check_mysql
}
}
启动keepalived:
systemctl enable keepalived #开机自启
systemctl start keepadived #启动
测试是否成功:
# ip a
安装部署从库:
# yum install mariadb mariadb-server
修改配置文件:
# vim /etc/my.cnf
server-id=1
log-bin=mysql-bin
relay-log=relay-log
开启数据库:
# systemctl enable mariadb #开机自启
# systemctl start mariadb #启动
在192.168.68.163、162.168.68.164 mysql 授权:
> stop slave;
> change master to master_host='192.168.101.94',master_user='lzg',master_password='123',master_log_file='mysql-bin.000004',master_log_pos=245;
> start slave;
> show slave status \G;
显示下方为双Yes则主从配置成功:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
最后进行双主多从测试:
数据库的原理是:
1、两个线程,一个I/O线程,一个SQL线程, i/o线程去请求主库 的binlog,并将得到的binlog日志写到relay log(中继日志) 文件中;
2、主库会生成一个 log dump 线程,用来给从库 i/o线程传binlog;
3、SQL 线程,会读取relay log文件中的日志,并解析成具体操作,来实现主从的操作一致,而最终数据一致;
数据库的引擎是啥,有啥区别:
1、MyISAM用一个变量保存了整个表的行数,InnoDB不保存表的具体行数,执行select count(*) from table时需要全表扫描。MylSAM执行上述语句时只需要读出该变量即可,速度很快。
2、MyISAM支持全文索引,Innodb不支持全文索引,查询效率上MyISAM要高。
3、innodb支持事务,MyISAM不支持事务,
4、如果表中绝大多数都只是读查询,可以考虑MyISAM,如果既有读写也挺频繁,请使用InnoDB。系统奔溃后,MyISAM恢复起来更困难。
数据库延迟是如何产生的:
master可以并发,Slave_SQL_Running线程却不可以。
当主库的TPS并发较高时,产生的DDL数量超过slave一个sql线程所能承受的范围,那么延时就产生了,当然还有就是可能与slave的大型query语句产生了锁等待。
TPS : 是一台数据库服务器每秒处理的事务的个数。
DDL:数据库定义语句,用来创建数据库中的表、索引、视图、存储过程、触发器等,常用的语句关键字有:CREATE,ALTER,DROP,TRUNCATE,COMMENT,RENAME。
因素:
1、从库的配置往往没有主库的配置高
2、主库支持并发写入,而5.7之前的版本上从库只有单线程SQL来完成任务。
3、MySQL主从之间的同步,并不是完全的实时同步,而是主库提交事务之后,从库才再来执行一遍
4、主库上的表的某个列没有索引,然后对这个列进行delete或update操作
5、网络问题,往返时延RTT较大。