MySQL双机热备keepalived+mysql双主.docx
- 文档编号:9674270
- 上传时间:2023-05-20
- 格式:DOCX
- 页数:23
- 大小:23.07KB
MySQL双机热备keepalived+mysql双主.docx
《MySQL双机热备keepalived+mysql双主.docx》由会员分享,可在线阅读,更多相关《MySQL双机热备keepalived+mysql双主.docx(23页珍藏版)》请在冰点文库上搜索。
MySQL双机热备keepalived+mysql双主
科普描述
双机热备是指两台机器都在运行,但并不是两台机器都同时在提供服务。
当提供服务的一台出现故障的时候,另外一台会马上自动接管并且提供服务,而且切换的时间非常短。
MySQL双主复制,即互为Master-Slave(只有一个Master提供写操作),可以实现数据库服务器的热备,但是一个Master宕机后不能实现动态切换。
使用Keepalived,可以通过虚拟IP,实现双主对外的统一接口以及自动检查、失败切换机制,从而实现MySQL数据库的高可用方案。
Keepalived看名字就知道,保持存活,在网络里面就是保持在线了,也就是所谓的高可用或热备,用来防止单点故障(单点故障是指一旦某一点出现故障就会导整个系统架构的不可用)的发生,那说到keepalived不得不说的一个协议不是VRRP协议,可以说这个协议就是keepalived实现的基础。
1)Keepalived的工作原理是VRRP(VirtualRouterRedundancyProtocol)虚拟路由冗余协议。
在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.20.tar.gz
(http:
//www.keepalived.org/download.html)
∙ipvsadm-1.26-1.src.rpm
(http:
//www.linuxvirtualserver.org/software/ipvs.html)
∙popt-static-1.13-7.el6.x86_64.rpm
(https:
//pkgs.org/download/popt-static)
∙libnl-1.1.4.tar.gz
(http:
//www.infradead.org/~tgr/libnl/)
主从复制原理架构图
∙第一步就是master记录二进制日志。
在每个事务更新数据完成之前,master在二进制日志记录这些改变。
MySQL将事务写入二进制日志。
在事件写入二进制日志完成后,master通知存储引擎提交事务。
∙第二步就是slave将master的binarylog拷贝到它自己的中继日志。
首先,slave开始一个工作线程——I/O线程。
I/O线程在master上打开一个普通的连接,然后开始binlogdumpprocess。
Binlogdumpprocess从master的二进制日志中读取事件,如果已经同步了master,它会睡眠并等待master产生新的事件。
I/O线程将这些事件写入中继日志。
∙SQLslavethread(SQL从线程)处理该过程的最后一步。
SQL线程从中继日志读取事件,并重放其中的事件而更新slave的数据,使其与master中的数据一致。
只要该线程与I/O线程保持一致,中继日志通常会位于OS的缓存中,所以中继日志的开销很小。
主主同步就是两台机器互为主的关系,在任何一台机器上写入都会同步。
若mysql主机开启了防火墙,需要关闭防火墙或创建规则。
步骤
一:
实现两台mysql主主同步
1.1安装mysql
DB102、DB105两台服务器分别安装mysql,过程略。
1.2修改mysql配置文件
分别修改配置文件,在/etc/f文件中的[mysqld]段添加配置信息:
f中各字段信息待研究
∙DB102:
[root@DB102~]#vim/etc/f
server-id=1 #节点标示,主从节点不能相同,必须全局唯一
log-bin=mysql-bin #开启mysql的binlog日志功能
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/f
server-id=2 #节点标示,主从节点不能相同,必须全局唯一
log-bin=mysql-bin #开启mysql的binlog日志功能
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>grantreplicationslaveon*.*to'cp_root'@'172.20.20.105'identifiedby'cp_123456';
QueryOK,0rowsaffected(0.04sec)
mysql>showmasterstatus;
+------------------+----------+--------------+------------------+
|File|Position|Binlog_Do_DB|Binlog_Ignore_DB|
+------------------+----------+--------------+------------------+
|mysql-bin.000004|271|||
+------------------+----------+--------------+------------------+
1rowinset(0.00sec)
∙DB105
在DB105的mysql库中将DB102设为自己的主服务器
mysql>changemasterto
master_host='172.20.20.102',
master_user='cp_root',
master_password='cp_123456',
master_log_file='mysql-bin.000004',
master_log_pos=271;
QueryOK,0rowsaffected(0.07sec)
##master_log_file和master_log_pos这两个选项的值是在DB102上通过“showmasterstatus”查询到的
##master_log_file的值尽量用复制的方式输入,避免因有不可见的字符而配置失败
启动slave服务
mysql>startslave;
QueryOK,0rowsaffected(0.01sec)
查看DB105上slave的运行状态
若出现如下两个“Yes”【Slave_IO_Running:
Yes、Slave_SQL_Running:
Yes】,表明配置成功!
mysql>showslavestatus\G
***************************1.row***************************
Slave_IO_State:
Waitingformastertosendevent
Master_Host:
172.20.20.102
Master_User:
cp_root
Master_Port:
3306
Connect_Retry:
60
Master_Log_File:
mysql-bin.000004
Read_Master_Log_Pos:
271
Relay_Log_File:
mysql-relay-bin.000002
Relay_Log_Pos:
253
Relay_Master_Log_File:
mysql-bin.000004
Slave_IO_Running:
Yes #重点
Slave_SQL_Running:
Yes #重点
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
mysql.%,test.%,information_schema.% #跳过的表
Last_Errno:
0
Last_Error:
Skip_Counter:
0
Exec_Master_Log_Pos:
271
Relay_Log_Space:
409
Until_Condition:
None
Until_Log_File:
Until_Log_Pos:
0
Master_SSL_Allowed:
No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master:
0
Master_SSL_Verify_Server_Cert:
No
Last_IO_Errno:
0
Last_IO_Error:
Last_SQL_Errno:
0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id:
1
1rowinset(0.00sec)
至此,DB102到DB105的mysql主从复制已经完成。
1.4配置主(DB105)-从(DB102)
∙DB105
在DB105的mysql库中创建DB102的复制用户并授权
[root@DB105~]#mysql-uroot-p******
mysql>grantreplicationslaveon*.*to'cp_root'@'172.20.20.102'identifiedby'cp_123456';
QueryOK,0rowsaffected(0.04sec)
mysql>showmasterstatus;
+------------------+----------+--------------+------------------+
|File|Position|Binlog_Do_DB|Binlog_Ignore_DB|
+------------------+----------+--------------+------------------+
|mysql-bin.000005|271|||
+------------------+----------+--------------+------------------+
1rowinset(0.00sec)
∙DB102
在DB102的mysql库中将DB105设为自己的主服务器
mysql>changemasterto
master_host='172.20.20.105',
master_user='cp_root',
master_password='cp_123456',
master_log_file='mysql-bin.000005',
master_log_pos=271;
QueryOK,0rowsaffected(0.07sec)
##master_log_file和master_log_pos这两个选项的值是在DB105上通过“showmasterstatus”查询到的
##master_log_file的值尽量用复制的方式输入,避免因有不可见的字符而配置失败
启动slave服务
mysql>startslave;
QueryOK,0rowsaffected(0.01sec)
查看DB102上slave的运行状态
若出现如下两个“Yes”【Slave_IO_Running:
Yes、Slave_SQL_Running:
Yes】,表明配置成功!
mysql>showslavestatus\G
***************************1.row***************************
Slave_IO_State:
Waitingformastertosendevent
Master_Host:
172.20.20.105
Master_User:
cp_root
Master_Port:
3306
Connect_Retry:
60
Master_Log_File:
mysql-bin.000005
Read_Master_Log_Pos:
271
Relay_Log_File:
mysql-relay-bin.000002
Relay_Log_Pos:
253
Relay_Master_Log_File:
mysql-bin.000005
Slave_IO_Running:
Yes #重点
Slave_SQL_Running:
Yes #重点
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
mysql.%,test.%,information_schema.% #跳过的表
Last_Errno:
0
Last_Error:
Skip_Counter:
0
Exec_Master_Log_Pos:
271
Relay_Log_Space:
409
Until_Condition:
None
Until_Log_File:
Until_Log_Pos:
0
Master_SSL_Allowed:
No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master:
0
Master_SSL_Verify_Server_Cert:
No
Last_IO_Errno:
0
Last_IO_Error:
Last_SQL_Errno:
0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id:
1
1rowinset(0.00sec)
至此,DB105到DB102的mysql主从复制也已经完成。
双向互为主从。
1.5测试主主同步
∙DB102
[root@DB102~]#mysql-uroot-p******
mysql>showdatabases;
+--------------------+
|Database|
+--------------------+
|information_schema|
|mysql|
|performance_schema|
+--------------------+
3rowsinset(0.06sec)
mysql>createdatabasetest;
QueryOK,1rowaffected(0.02sec)
∙DB105
[root@DB105~]#mysql-uroot-p******
mysql>showdatabases;
+--------------------+
|Database|
+--------------------+
|information_schema|
|mysql|
|performance_schema|
|test|
+--------------------+
4rowsinset(0.06sec)
然后在DB105上删除test库,在DB102查询。
如果双向操作都没有问题,说明主主同步构建成功。
1.6可能出现的问题
A.UUID冲突
mysql存在唯一标识uuid,如果服务器是克隆出来的,则会出现Slave_IO_Running:
NO的错误。
通过修改f文件来修改该uuid。
##f文件一般在/var/lib/mysql/f
##如果文件不存在,可用linux查询命令找:
find/-namef
[root@DB105~]#vim/var/lib/mysql/f
[auto]
server-uuid=140e1173-ff50-11e6-a2fb-000c29e713d3
##原则:
不破坏原uuid格式,数字位为数字,字母位为字母
B.若主从复制构建失败,可以重新构建;
假设DB105到DB102的mysql主从复制失败。
∙DB102
##重新获取DB105的master_log_file和master_log_pos
mysql>slavestop;
mysql>changemasterto
master_host='172.20.20.105',
master_user='cp_root',
master_password='cp_123456',
master_log_file='mysql-bin.000005',
master_log_pos=271;
QueryOK,0rowsaffected(0.07sec)
mysql>startslave;
QueryOK,0rowsaffected(0.01sec)
......
二:
引入keepalived实现mysql双主高可用
DB102、DB105两台服务器均需配置安装keepalived服务。
组件的依赖关系:
∙keepalived依赖ipvsadm
∙ipvsadm依赖libnl和popt-static
2.1安装依赖包
##安装libnl
[root@DB102setup]#tar-zxvflibnl-1.1.4.tar.gz
[root@DB102setup]#cdlibnl-1.1.4
[root@DB102libnl-1.1.4]#./configure
[root@DB102libnl-1.1.4]#make&&makeinstall
##安装popt-static
[root@DB102setup]#rpm-ivhpopt-static-1.13-7.el6.x86_64.rpm
##安装ipvsadm
[root@DB102setup]#rpm-ivhipvsadm-1.26-1.src.rpm
2.2安装keepalived
[root@DB102setup]#tarzxfkeepalived-1.1.20.tar.gz
[root@DB102setup]#cdkeepalived-1.1.20
[root@DB102keepalived-1.1.20]#./configure--sysconf=/etc--with-kernel-dir=/lib/modules/2.6.32-642.3.1.el6.x86_64/
[root@DB102keepalived-1.1.20]#make&&makeinstall
[root@DB102keepalived-1.1.20]#ln-s/usr/local/sbin/keepalived/sbin/
[root@DB102keepalived-1.1.20]#chkconfig--addkeepalived
[root@DB102keepalived-1.1.20]#chkconfig--level35keepalivedon
2.3配置keepalived.conf
∙DB102
[root@DB102keepalived-1.1.20]#vim/etc/keepalived/keepalived.conf
!
ConfigurationFileforkeepalived
global_defs
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MySQL 双机 keepalived 双主