mysql/mariadb主从服务器实现负载均衡

16 篇文章 0 订阅
7 篇文章 0 订阅

一、MYSQL\MARIADB REPLICATION

什么是mysql replication?

​ 1.Replication可以实现将数据从一台数据库服务器(master)复制到一或多台数据库服务(slave)
​ 2.默认情况下属于异步复制,无需维持长连接
​ 3.通过配置,可以复制所有的库或者几个库,甚至库中的一些表
​ 4.是MySQL内建的,本身自带的

replication原理是什么呢?

简单的说就是master将数据库的改变写入二进制日志,slave同步这些二进制日志,并根据这些二进制日志进行数据操作

DML:SQL操作语句,update, insert,delete
Relay log :中继日志
REPLICATION的作用
1、Fail Over 故障切换
2、Backup Server 备份服务,无法对SQL语句执行产生的故障恢复,有限的备份
3、High Performance高性能,可以多台slave,实现读写分离
REPLICATION如何工作
整体上来说,复制有3个步骤:
(1) master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events);
(2) slave将master的binary log events拷贝到它的中继日志(relay log);
(3) slave重做中继日志中的事件,修改salve上的数据。
在这里插入图片描述
mysql主从复制中:
第一步:master记录二进制日志。在每个事务更新数据完成之前,master在二进制日志记录这些改变。MySQL将事务写入二进制日志,即使事务中的语句都是交叉执行的。在事件写入二进制日志完成后,master通知存储引擎提交事务。
第二步:slave将master的binary log拷贝到它自己的中继日志。首先,slave开始一个工作线程——I/O线程。I/O线程在master上打开一个普通的连接,然后开始binlog dump process。Binlog dump process从master的二进制日志中读取事件,如果已经执行完master产生的所有文件,它会睡眠并等待master产生新的事件。I/O线程将这些事件写入中继日志。
第三步:SQL slave thread(SQL从线程)处理该过程的最后一步。SQL线程从中继日志读取事件,并重新执行其中的事件而更新slave的数据,使其与master中的数据一致。
REPLICATION的常用方案
1、一主多从,M-S
在这里插入图片描述
【注】一般用来做读写分离的,master写,其他slave读,这种架构最大问题I/O压力集中。
在Master上<多台同步影响IO>
2、M-S-S,一主,一中继,多从
在这里插入图片描述
【注】Slave中继可使用Black-hole存储引擎,不会把数据存储到磁盘,只记录二进制日志
3、M-M(互为主从)
在这里插入图片描述
4、一从多主
在这里插入图片描述
优点:节省成本,将多个master数据自动化整合
缺点:对库和表数据的修改较多


二、部署mariadb主从同步,M-S模型

环境准备

主机名IP系统/mariadb版本
localhost192.168.43.111CentOS7.6/5.5.35
TSL192.168.43.112CentOS7.6/5.5.35

创建需要同步的数据库

MariaDB [(none)]> create database HA;
Query OK, 1 row affected (0.01 sec)

MariaDB [(none)]> use HA;
Database changed
MariaDB [HA]> create table haha(id int(10),name varchar(20));
Query OK, 0 rows affected (0.01 sec)

配置server.cnf

[root@localhost ~]# vim /etc/my.cnf.d/server.cnf
[mysqld]
log-bin=mysql-bin-master   #启动二进制日志
server-id=1   #本机数据库ID标识
binlog-do-db=HA  #从服务器复制的库, 二进制需要同步的数据库名
binlog-ignore-db=mysql    不可以被从服务器复制的库

重启mariadb

[root@localhost ~]# systemctl restart mariadb

授权:

MariaDB [(none)]> grant replication slave on *.* to 'slave'@'192.168.43.112' identified by '123456';

查看信息状态:

MariaDB [(none)]> show master status;
+-------------------------+----------+--------------+------------------+
| File                    | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------------+----------+--------------+------------------+
| mysql-bin-master.000001 |      555 | HA           | mysql            |
+-------------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

查看二进制日志:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PWjiuFpx-1583987638495)(C:\Users\pc\AppData\Roaming\Typora\typora-user-images\image-20200312115134574.png)]

导出同步的数据库:

[root@localhost ~]# mysqldump -uroot -p123456 HA >ha.sql

将导出的数据库传给从服务器

[root@localhost ~]# scp ha.sql 192.168.43.112:/root

在从服务器导入数据库:

MariaDB [(none)]> create database HA;
Query OK, 1 row affected (0.00 sec)
[root@TSL ~]# mysql -uroot -p123456 HA < ha.sql

修改配置文件server.cnf

[root@TSL ~]# vim /etc/my.cnf.d/server.cnf
[mysqld]
server-id=2

进行授权:

MariaDB [(none)]> stop slave;
Query OK, 0 rows affected, 1 warning (0.00 sec)

MariaDB [(none)]> change master to master_host='192.168.43.111',master_user='slave',master_password='123456';
Query OK, 0 rows affected (0.03 sec)

MariaDB [(none)]> start slave;
Query OK, 0 rows affected (0.01 sec)

MariaDB [(none)]> show slave status \G; 查看状态

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Is5Hen3Z-1583987638506)(C:\Users\pc\AppData\Roaming\Typora\typora-user-images\image-20200312120116046.png)]

Slave_IO_Running :一个负责与主机的io通信

Slave_SQL_Running:负责自己的slave mysql进程

两个为YES 就成功了!

再到服务器上查看状态:

MariaDB [HA]> show processlist \G;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xYTbxJVh-1583987638515)(C:\Users\pc\AppData\Roaming\Typora\typora-user-images\image-20200312120441811.png)]

插入数据测试同步:

在主上

MariaDB [HA]> insert into haha values(1,'xiaogang');
Query OK, 1 row affected (0.02 sec)

MariaDB [HA]> select * from haha;
+------+----------+
| id   | name     |
+------+----------+
|    1 | xiaogang |
+------+----------+
1 row in set (0.00 sec)

在从上

MariaDB [HA]> select * from haha;
+------+----------+
| id   | name     |
+------+----------+
|    1 | xiaogang |
+------+----------+
1 row in set (0.00 sec)

关于一些报错思路的解决基本步骤:

重启从服务器,再查看状态:

停止从服务器slave stop;

开启从服务器slave start;

1、二进制日志没有开启

2、iptables没有开放端口

3、对应的主机IP地址写错了

sql线程出错

主从服务器数据库结构不同意,出错或,数据少,可以手动解决创建插入,再更新slave状态。


三、部署mariadb M-S-S模型

环境准备

主机名主从IP版本
localhostmaster192.168.43.112mariadb5.5.35
TSLslave中继192.168.43.111mariadb5.5.35
linuxprobeslave192.168.43.215mariadb5.5.35

【注】这里你可以为了方便,可以配置三台linux的ip为连续的,比较顺手一点。

部署master======>TSL1:
在主服务器上授权用户:

MariaDB [(none)]> grant replication slave on *.* to repl@'192.168.43.%' identified by '123456';
Query OK, 0 rows affected (0.03 sec)
#授权成功
MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.01 sec)

修改配置,增加如下:

[root@TSL ~]# vim etc/my.cnf.d/server.cnf
[mysqld]
server-id=1
binlog-do-db=HA
log-bin=mysql-bin-master
binlog-ignore-db=mysql
sync-binlog=1
binlog-format=row
#保存退出

重启服务

[root@TSL ~]# systemctl restart mariadb

导出主服务器HA库完整备份, 拷贝到 中继服务器 和slave服务器

[root@TSL ~]# mysqldump -uroot -p123456 -B HA > ha.sql
[root@TSL ~]# scp ha.sql 192.168.43.111:/root
[root@TSL ~]# scp ha.sql 192.168.43.215:/root

在中继服务器和slave服务器ls查看
在这里插入图片描述
在这里插入图片描述
说明拷贝成功

部署slave中继======> TSL:
导入数据库ha.sql

[root@localhost ~]# mysql -u root -p123456 <ha.sql

配置server.cnf

[root@localhost ~]# vim /etc/my.cnf.d/server.cnf
[mysqld]
server-id=2
#开启bin-log:
log-bin=mysql-bin-slave1
log-slave-updates=1  #把它从relay-log当中读取出来的二进制日志并且这本机上执行的操作也记录这自己的二进制日志里面,这样才能使第三台slave通过中继slave读取到相应数据变化
binlog-format=row

授权:

MariaDB [(none)]> stop slave;
Query OK, 0 rows affected, 1 warning (0.00 sec)
MariaDB [(none)]> change master to master_host='192.168.43.112',master_user='repl',master_password='123456';
Query OK, 0 rows affected (0.03 sec)
MariaDB [(none)]> start slave;
Query OK, 0 rows affected (0.02 sec)

查看中继服务的状态

MariaDB [(none)]> show slave status \G;

在这里插入图片描述
再授权一个给slave(linuxprobe)

MariaDB [(none)]> grant replication slave on *.* to 'repl'@'192.168.43.215' identified by '123456';
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.00 sec)

部署slave=======>linuxprobe
导入数据库ha.sql

[root@linuxprobe ~]# mysql -uroot -p123456 <ha.sql

配置server.cnf

[root@linuxprobe ~]# vim /etc/my.cnf.d/server.cnf

[mysqld]
server-id=3
log-bin=mysql-bin-slave2
binlog-format=row

重启服务

[root@linuxprobe ~]# systemctl restart mariadb

指定slave中继服务作为linuxprobe的主:

MariaDB [(none)]> stop slave;
Query OK, 0 rows affected, 1 warning (0.00 sec)
MariaDB [(none)]> change master to master_host='192.168.43.111',master_user='repl',master_password='123456';
Query OK, 0 rows affected (0.03 sec)

MariaDB [(none)]> start slave;
Query OK, 0 rows affected (0.01 sec)

查看从服务器的状态
MariaDB [(none)]> show slave status \G;
在这里插入图片描述
在master上创建表和插入数据测试:
MariaDB [HA]> create table haha(id int(10),name varchar(20));
Query OK, 0 rows affected (0.01 sec)
在中继和slave查看:
在中继
MariaDB [HA]> show tables;
±-------------+
| Tables_in_HA |
±-------------+
| haha |
±-------------+
1 row in set (0.00 sec)
在slave
MariaDB [HA]> show tables;
±-------------+
| Tables_in_HA |
±-------------+
| haha |
±-------------+
1 row in set (0.00 sec)
插入数据:

MariaDB [HA]> insert into haha values(1,'xiaohua');
Query OK, 1 row affected (0.00 sec)

查看:
在中继
MariaDB [HA]> select * from haha;
±-----±--------+
| id | name |
±-----±--------+
| 1 | xiaohua |
±-----±--------+
1 row in set (0.01 sec)
在slave
MariaDB [HA]> select * from haha;
±-----±--------+
| id | name |
±-----±--------+
| 1 | xiaohua |
±-----±--------+
1 row in set (0.01 sec)

A:如果我不想中继储存数据呢?只是进行一个中继转发,我们又该怎么做呢?
B:中继服务器之所以能查到数据,是因为存储引擎的问题,我们修改表的引擎,再插入数据测试,看看结果如何!
修改表的引擎:

MariaDB [HA]> set sql_log_bin=off;
Query OK, 0 rows affected (0.01 sec)

MariaDB [HA]> alter table haha engine=blackhole;
Query OK, 1 row affected (0.01 sec)                
Records: 1  Duplicates: 0  Warnings: 0

MariaDB [HA]> set sql_log_bin=on;
Query OK, 0 rows affected (0.00 sec)

【注】这里一定要先关闭日志记录!!!
插入数据测试:

MariaDB [HA]> insert into haha values(2,'xiaoliu');
Query OK, 1 row affected (0.01 sec)

在中继和slave查看
在中继

MariaDB [HA]> select * from haha;
Empty set (0.01 sec)

在slave

MariaDB [HA]> select * from haha;
+------+---------+
| id   | name    |
+------+---------+
|    1 | xiaohua |
|    2 | xiaoliu |
+------+---------+
2 rows in set (0.00 sec)

排错:
错误1:MariaDB [(none)]> show slave status \G;
在这里插入图片描述
导致错误的原因有一下几点:
1.、网络不同
2、账户密码错误
3、防火墙
4、mariadb配置文件问题
5、连接服务器时的语法错误
6、主服务器mariadb权限
在这里是防火墙的原因,添加防火墙端口即可:

[root@TSL ~]# firewall-cmd --add-port=3306/tcp --permanent
success
[root@TSL ~]# firewall-cmd --reload
success
[root@localhost ~]# firewall-cmd --add-port=3306/tcp --permanent
success
[root@localhost ~]# firewall-cmd --reload
success

再查看
在这里插入图片描述
错误2:
在这里插入图片描述
解决不同步问题:
添加master_port
master_log_file
master_log_pos
在这里插入图片描述
MariaDB [(none)]> stop slave;
Query OK, 0 rows affected (0.01 sec)

MariaDB [(none)]> change master to master_host=‘192.168.43.112’,master_user=‘repl’,master_password=‘123456’,master_port=3306,master_log_file=‘mysql-bin-master.000001’,master_log_pos=324;
Query OK, 0 rows affected (0.01 sec)
在这里插入图片描述
解决成功
当然,这里不能列出各种错误,需要根据实际的环境来排错,希望这里对大家有帮助!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_44902227

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值