一主多从,实现数据库高可用
- 一、准备环境
- 1.先做一主双从
- 192.168.131.80配置:
- 192.168.131.81配置:
- 192.168.131.82配置:
- 2.模拟A库故障,B库替换为主
- 192.168.131.81配置:
- 192.168.131.82配置:
- 总结
一、准备环境
系统 | 主机ip | 应用 |
centos7 | 192.168.131.80 A | mariadb mariadb-server 主 |
centos7 | 192.168.131.81 B | mariadb mariadb-server 从 |
centos7 | 192.168.131.82 C | mariadb mariadb-server 从 |
注意:我这里做的是一主二从,首先实现主从的功能,然后模拟A 主库故障,实现B库 由从库替换为主库。从而达到一个高可用的效果
1.先做一主双从
192.168.131.80配置:
首先关闭防火墙:
systemctl stop firewalld
setenforce 0
安装数据库:
yum -y install mariadb mariadb-server
编辑配置文件:
vim /etc/my.cnf
在[mysqld]里面添加一下内容:
server-id=1
log-bin=mysql-bin
保存退出
启动数据库:
systemctl start mariadb
进入数据库:
mysql
创建一个用户并授权
grant replication slave on *.* to tom@'%' identified by '123';
MariaDB [(none)]> show master status; //查看主服务器状态
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000003 | 381 | | |
+------------------+----------+--------------+------------------+
192.168.131.81配置:
首先关闭防火墙:
systemctl stop firewalld
setenforce 0
安装数据库:
yum -y install mariadb mariadb-server
编辑配置文件:
vim /etc/my.cnf
在[mysqld]里面添加以下内容:
server-id=2
relay-log=mysql-relay
保存退出
启动数据库:
systemctl start mariadb
进入数据库:
mysql
stop slave; //停掉主从
change master to master_host='192.168.131.80', master_user='tom', master_password='123', master_log_file='mysql-bin.000003', master_log_pos=381;
MariaDB [(none)]> change master to
----------------------------------------------
-> master_host='192.168.131.80', /【master的ip地址】
-> master_user='tom', /【登录主使用的用户】
-> master_password='123', /【登录主使用的密码】
-> master_log_file='mysql-bin.000003', /【当前写入的二进制日志文件】
-> master_log_pos=381; /【位置】
开启主从
start slave;
MariaDB [(none)]> show slave status \G; //双YES为正常
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.131.80
Master_User: tom
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000003
Read_Master_Log_Pos: 381
Relay_Log_File: mysql-relay.000002
Relay_Log_Pos: 529
Relay_Master_Log_File: mysql-bin.000003
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
192.168.131.82配置:
首先关闭防火墙:
systemctl stop firewalld
setenforce 0
安装数据库:
yum -y install mariadb mariadb-server
编辑配置文件:
vim /etc/my.cnf
在[mysqld]里面添加一下内容:
server-id=3
relay-log=mysql-relays
保存退出
启动数据库:
systemctl start mariadb
进入数据库:
mysql
stop slave; //停掉主从
change master to master_host='192.168.131.80', master_user='tom', master_password='123', master_log_file='mysql-bin.000003', master_log_pos=381;
MariaDB [(none)]> change master to
----------------------------------------------
-> master_host='192.168.131.80', /【master的ip地址】
-> master_user='tom', /【登录主使用的用户】
-> master_password='123', /【登录主使用的密码】
-> master_log_file='mysql-bin.000003', /【当前写入的二进制日志文件】
-> master_log_pos=381; /【位置】
开启主从
start slave;
MariaDB [(none)]> show slave status \G; //双YES为正常
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.131.80
Master_User: tom
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000003
Read_Master_Log_Pos: 381
Relay_Log_File: mysql-relay.000002
Relay_Log_Pos: 529
Relay_Master_Log_File: mysql-bin.000003
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
2.模拟A库故障,B库替换为主
首先模拟A库故障(停掉192.168.131.80的数据库)
192.168.131.81配置:
在从库的/etc/my.cnf文件
添加log-bin=mysql-bin
重启MySQL
stop slave;
reset master;
reset slave all;
show binary logs;
MariaDB [(none)]> show binary logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 245 |
+------------------+-----------+
1 row in set (0.00 sec)
在从库授权一个账号
grant replication slave on *.* to tom@'%' identified by '123';
192.168.131.82配置:
mysql
stop slave; //停掉主从同步
change master to master_host='192.168.131.81',master_user='tom',master_password='123',master_log_file='mysql-bin.000001',master_log_pos=245;
start slave; //开启主从同步
MariaDB [(none)]> show slave status \G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.131.81
Master_User: tom
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 381
Relay_Log_File: mysql-relays.000002
Relay_Log_Pos: 665
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
在81的机器创建一个库进行测试
在82的数据库查看 有没有刚刚创建的库
总结
mysql主从机制主要是在主机意外情况中断服务(比如断电、宕机等)的情况下,能够将业务转向备机。
在当前方案下,没有中间代理层,需要业务手动修改mysql的IP和Port才能切换到备机上去,所以业务需要具有灵活配置Mysql 地址的能力。
不过现在基本上都不用这种方法了,不是很适用,一般用MHA来实现数据库高可用,实现主挂掉从自动替换为主。