科普描述
双机热备是指两台机器都在运行,但并不是两台机器都同时在提供服务。当提供服务的一台出现故障的时候,另外一台会马上自动接管并且提供服务,而且切换的时间非常短。
MySQL双主复制,即互为Master-Slave(只有一个Master提供写操作),可以实现数据库服务器的热备,但是一个Master宕机后不能实现动态切换。
使用Keepalived,可以通过虚拟IP,实现双主对外的统一接口以及自动检查、失败切换机制,从而实现MySQL数据库的高可用方案。
Keepalived看名字就知道,保持存活,在网络里面就是保持在线了,也就是所谓的高可用或热备,用来防止单点故障(单点故障是指一旦某一点出现故障就会导整个系统架构的不可用)的发生,那说到keepalived不得不说的一个协议不是VRRP协议,可以说这个协议就是keepalived实现的基础。
1)Keepalived的工作原理是VRRP(Virtual Router Redundancy Protocol)虚拟路由冗余协议。在VRRP中有两组重要的概念:VRRP路由器和虚拟路由器,主控路由器和备份路由器。
2)VRRP路由器是指运行VRRP的路由器,是物理实体,虚拟路由器是指VRRP协议创建的,是逻辑概念。一组VRRP路由器协同工作,共同构成一台虚拟路由器。 Vrrp中存在着一种选举机制,用以选出提供服务的路由即主控路由,其他的则成了备份路由。当主控路由失效后,备份路由中会重新选举出一个主控路由,来继续工作,来保障不间断服务。
环境
服务器:
DB102:172.20.20.102 、centos6.5、mysql5.7、hostname:DB102
DB105:172.20.20.105 、centos6.5、mysql5.7、hostname:DB105
vip:172.20.20.110 (虚拟)
101:172.20.20.101 (用来远程调用 vip 测试)
组件包:
keepalived-1.1.
/download.html)
ipvsadm-1.26-1.src.rpm
/software/ipvs.html)
mysql存储文档popt-static-1.13-7.el6.x86_64.rpm
/download/popt-static)
libnl-1.1.
/~tgr/libnl/)
主从复制原理架构图
第一步就是master记录二进制日志。
在每个事务更新数据完成之前,master在二进制日志记录这些改变。MySQL将事务写入二进制日志。在事件写入二进制日志完成后,master通知存储引擎提交事务。
第二步就是slave将master的binarylog拷贝到它自己的中继日志。
首先,slave开始一个工作线程——I/O线程。I/O线程在master上打开一个普通的连接,然后开始binlog dump process。Binlog dump process从master的二进制日志中读取事件,如果已经同步了master,它会睡眠并等待master产生新的事件。I/O线程将这些事件写入中继日志。
SQL slave thread(SQL从线程)处理该过程的最后一步。SQL线程从中继日志读取事件,并重放其中的事件而更新slave的数据,使其与master中的数据一致。只要该线程与I/O线程保持一致,中继日志通常会位于OS的缓存中,所以中继日志的开销很小。
主主同步就是两台机器互为主的关系,在任何一台机器上写入都会同步。
若mysql主机开启了防火墙,需要关闭防火墙或创建规则。
步骤
一:实现两台 mysql 主主同步
1.1 安装 mysql
DB102、DB105两台服务器分别安装 mysql,过程略。
1.2 修改 mysql 配置文件
分别修改配置文件,在/etc/myf文件中的[mysqld]段添加配置信息:
myf中各字段信息待研究
DB102:
[root@DB102 ~]# vim /etc/myf
server-id = 1    #节点标示,主从节点不能相同,必须全局唯一
log-bin=mysql-bin  #开启mysqlbinlog日志功能
relay-log = mysql-relay-bin   #开启relay-log日志,relay-log日志记录的是从服务器I/O线程将主服务器的二进制日志读取过来记录到从服务器本地文件,然后SQL线程会读取relay-log日志的内容并应用到从服务器
replicate-wild-ignore-table=mysql.%  #复制过滤选项
replicate-wild-ignore-table=test.%
replicate-wild-ignore-table=information_schema.%
auto-increment-increment = 2     
auto-increment-offset = 1   
slave-skip-errors = all
重启,使其配置生效
DB105:
[root@DB105 ~]# vim /etc/myf
server-id = 2    #节点标示,主从节点不能相同,必须全局唯一
log-bin=mysql-bin  #开启mysqlbinlog日志功能
relay-log = mysql-relay-bin   #开启relay-log日志,relay-log日志记录的是从服务器I/O线程将主服务器的二进制日志读取过来记录到从服务器本地文件,然后SQL线程会读取relay-log日志的内容并应用到从服务器
replicate-wild-ignore-table=mysql.%  #复制过滤选项
replicate-wild-ignore-table=test.%
replicate-wild-ignore-table=information_schema.%
auto-increment-increment = 2     
auto-increment-offset = 2   
slave-skip-errors = all
重启,使其配置生效
注:在执行主主互备之前要保证两台服务器上 mysql 数据一致
1.3 配置 主(DB102) - 从(DB105)
DB102
在DB102的mysql库中创建DB105的复制用户并授权
[root@DB102 ~]# mysql -uroot -p******
mysql> grant replication slave on *.* to 'cp_root'@'172.20.20.105' identified by 'cp_123456';
Query OK, 0 rows affected (0.04 sec)
mysql> show master status;
+------------------+----------+--------------+------------------+
| File            | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000004 |      271 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
DB105
在DB105的mysql库中将DB102设为自己的主服务器
mysql> change master to
    master_host='172.20.20.102',
    master_user='cp_root',
    master_password='cp_123456',
    master_log_file='mysql-bin.000004',
    master_log_pos=271;
Query OK, 0 rows affected (0.07 sec)
## master_log_file master_log_pos 这两个选项的值是在DB102上通过“show master status”查询到的
## master_log_file 的值尽量用复制的方式输入,避免因有不可见的字符而配置失败
启动 slave 服务
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)
查看 DB105 上 slave 的运行状态
若出现如下两个“Yes”【Slave_IO_Running: YesSlave_SQL_Running: Yes】,表明配置成功!
mysql> show slave status\G
*************************** 1. row ***************************
              Slave_IO_State: Waiting for master to send event
                  Master_Host: 172.20.20.102
                  Master_User: cp_root
                  Master_Port: 3306

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。