一、最常见的当属主从架构,目的是为了缓解主服务器的读写压力,提高其可用性;从服务器对外开放,提高安全性
环境准备:准备两台主机,均部署MariaDB
主机1:192.168.31.51 主机2:192.168.31.52
1.修改主机1配置文件为如下
vim /etc/my.cnf.d/server.cnf
[mysqld]
server_id = 1
log_bin = /var/lib/mysql/mysql-bin
binlog_format = row
日志记录格式分为
statement:记录每一条修改数据的sql语句
row:记录数据修改成什么样
mixedlevel:混合模式(混合statement和row)
2.重启主节点数据库
systemctl restart mariadb
3.修改从节点配置文件
vim /etc/my.cnf.d/server.cnf
[mysqld]
server_id = 2
binlog_format = row
注:此时从节点id一定不可和主节点id一致。
4.重启从节点数据库
systemctl restart mariadb
5. 主节点与从节点都初始化数据库
mysql_secure_installation
6.登录数据库
mysql -uxxx -pxxx
7.在主节点创建主从链接账号,并设置密码
grant replication slave on *.* to aaa@'%' identified by 'aaa';
8.在主几点查看二进制日志的信息
show master status;
9.在从节点数据库
change master to masetr_host='192.168.31.51',master_user='aaa',master_password='aaa',master_log_file='主节点二进制日志名',master_log_pos=主节点二进制日志值;
10.查看从节点状态
show slave status\G;
检查 Slave_IO_Running: Yes
Slave_SQL_Running: Yes
11.若有不是yes
stop slave;
start slave;
12.完成后可创建一个库,查看主从同步是否正常
create database ken character set utf8;
二、主主架构,可理解为互为主备模式,主要原因还是为了避免单点故障问题
但要考虑自增长id问题,此处设置两个不同的起始值,增长量一样便可避免自增长id冲突
思路:两台数据库均可读写,可外加keepalived做高可用
在使用keepalived要注意脑裂问题
双主架构后可再加从架构,用keepailved的vip去对外提供服务
环境准备:两台主机均部署MariaDB
主机1:192.168.31.51 主机2:192.168.31.52
由于上述已做主从复制架构,第一阶段的主从复制不再重复写入
1.修改主机1的配置文件
vim /etc/my.cnf.d/server.cnf
[mysqld]
server_id = 1
log_bin = /var/lib/mysql/mysql-bin
binlog_format = row
auto_increment_offset = 1 #增长起始值
auto_increment_increment = 2 #增长量
2.重启节点1数据库
systemctl restart mariadb
3.修改节点2的配置文件
vim /etc/my.cnf.d/server.cnf
[mysqld]
server_id = 2
log_bin = /var/lib/mysql/mysql-bin
binlog_format = row
auto_increment_offset = 1 #增长起始值
auto_increment_increment = 2 #增长量
4.重启节点2数据库
systemctl restart mariadb
5. 在节点2查看二进制日志状态信息
show master status;
6. 在节点2创建主从链接账号,并设置密码
grant replication slave on *.* to bbb@'%' identified by 'bbb';
7.在节点1建立链接
change master to master_host='192.168.31.52',master_user='bbb',master_password='bbb',master_log_file='节点2二进制日志名',master_log_pos=值;
8.在节点1查看主从链接状态
show slave status\G;
9.检查 Slave_IO_Running: Yes
Slave_SQL_Running: Yes
10.若有不是yes
stop slave;
start slave;
三、级联复制
主从复制存在以下几点问题
(1)主库宕机后,从库可能丢失数据
(2)从库只有一个sql线程,复制可能存在延迟
产生这几点的原因为
(1)大量的并发语句产生的延迟
(2)查询语句可能造成了锁等待
(3)网络波动
解决办法:采用级联复制和半同步复制
级联复制解决主库的压力
半同步复制解决数据丢失问题
环境准备:
主机1:192.168.31.51(主节点)
主机2:192.168.31.52(从节点1)
主机3:192.168.31.53(从节点2)
1.修改主节点配置文件
vim /etc/my.cnf.d/server.cnf
[mysqld]
server_id = 1
log_bin = /var/lib/mysql/mysql-bin
binlog_format = row
2.重启主节点数据库
systemctl restart mariadb
3. 初始化数据库
mysql_secure_installation
4. 登录数据库
mysql -uxxx -pxxx
5.创建主从链接账号,并设置密码
grant replication slave on *.* to ccc@'%' identified by 'ccc';
6.查看主节点状态信息
show master status;
7.修改从节点1配置文件
vim /etc/my.cnf.d/server.cnf
[mysqld]
server_id = 2
log_bin = /var/lib/mysql/mysql-bin
binlog_format = row
8.重启从节点1数据库
systemctl restart mariadb
9.在从1节点建立主从链接
change master to master_host='192.168.31.51',master_user='ccc',master_password='ccc',master_log_file='mysql-bin.***',master_log_pos=值;
10.检查从节点状态
show slave status\G;
检查 Slave_IO_Running: Yes
Slave_SQL_Running: Yes
11. 创建主从链接账号并设置密码
grant replication slave on *.* to ddd@'%' identified by 'ddd';
在从节点1查看状态信息(此时配置级联复制,从1变从2的主节点)
show master status;
12.在从2节点建立主从链接
change master to master_host='192.168.31.52',master_user='ddd',master_password='ddd',master_log_file='mysql-bin.***',master_log_pos=值;
13.在从2检查slave状态
14.验证:在主1创建一个库,在从1和从2是否都有这个库
由于从2节点数据库以从1节点数据库为主库,而从1节点数据库以主1节点数据库为主库;从2节点并没有直接和主节点数据库进行链接,而是中间跨越节点1
存在问题:从2节点没有主库1上创建的dog库
原因:从1节点的二进制日志在主和从1进行复制时,从库是sql线程生效,也就是中继日志生效,而从库的二进制日志并没有发生改变,所以在从1与从2进行复制时,没有同步过去!
四、半同步复制
基于主从架构
由于我的mariadb没有这个插件,所以从往上找的资源
1. 主节点安装模块
install plugin rpl_semi_sync_master soname "semisync_master.so";
2.将rpl_semi_sync_master_enabled启动
set global rpl_semi_sync_master_enabled=1;
3.从节点安装模块
install plugin rpl_semi_sync_slave soname "semisync_slave.so";
4.从节点启动模块
set global rpl_semi_sync_slave_enabled=1;
5.从节点重新启动slave
stop slave;
start slave;
6.检查 Slave_IO_Running: Yes
Slave_SQL_Running: Yes
五、多源复制
多主一从架构,其实就是把主库的数据都同步到一个从库上,做备份时直接在从库做备份即可。
环境准备:
主1:192.168.31.51
主2:192.168.31.52
从:192.168.31.53
1.确保三个节点的server_id不一致
2.在两个主节点都创建主从链接账号,并设置密码
grant replication slave on *.* to aaa@'%' identified by 'aaa';
3.修改从节点配置文件
vim /etc/my.cnf.d/server.cnf
[mysqld]
server_id = 3
log_bin = /var/lib/mysql/mysql-bin
binlog_format = row
master_info_repository = table
relay_log_info_repository = table
4.查看主1和主2的状态信息
show master status;
5.从节点与主节点建立链接
change master to master_host='192.168.31.51',master_user='aaa',master_password='aaa';master_log_file='mysql-bin.000006',master_log_pos=385 for channel 'm1';
change master to master_host='192.168.31.52',master_user='aaa',master_password='aaa';master_log_file='mysql-bin.000006',master_log_pos=385 for channel 'm2';
6.检查
7.验证,在主库1上创建库first;在主库2上创建库second;在从库上检查
存在问题:出库1上的first并没有同步到从库上!
原因:在查看show slave status\G;时发现同步的主节点为主2节点,所以主1的库没有同步到从库上去。
补充:停止slave
stop slave;
reset slave all;
show slave status\G;