MySQL双机热备(keepalived+mysql双主)_第1页
MySQL双机热备(keepalived+mysql双主)_第2页
MySQL双机热备(keepalived+mysql双主)_第3页
MySQL双机热备(keepalived+mysql双主)_第4页
MySQL双机热备(keepalived+mysql双主)_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、科普描述双机热备是指两台机器都在运行, 但并不是两台机器都同时在提供服务。 当提供服务的一台 出现故障的时候,另外一台会马上自动接管并且提供服务,而且切换的时间非常短。MySQL 双主复制,即互为 Master-Slave( 只有一个 Master 提供写操作 ) ,可以实现数据库 服务器的热备,但是一个 Master 宕机后不能实现动态切换。使用Keepalived ,可以通过虚拟IP,实现双主对外的统一接口以及自动检查、失败切换机制,从而实现 MySQL 数据库的高可用方案。Keepalived 看名字就知道,保持存活,在网络里面就是保持在线了,也就是所谓的高可用或热备, 用来防止单点故障

2、 (单点故障是指一旦某一点出现故障就会导整个系统架构的不可 用)的发生,那说到 keepalived 不得不说的一个协议不是 VRRP 协议,可以说这个协议就 是 keepalived 实现的基础。1) Keepalived 的工作原理是 VRRP(Virtual Router Redundancy Protocol)虚拟路由 冗余协议。 在 VRRP 中有两组重要的概念: VRRP 路由器和虚拟路由器, 主控路由器和备份 路由器。2) VRRP 路由器是指运行 VRRP 的路由器,是物理实体,虚拟路由器是指 VRRP 协议创建 的,是逻辑概念。一组 VRRP 路由器协同工作,共同构成一台虚拟

3、路由器。 Vrrp 中存在着 一种选举机制, 用以选出提供服务的路由即主控路由, 其他的则成了备份路由。 当主控路由 失效后,备份路由中会重新选举出一个主控路由,来继续工作,来保障不间断服务。环境服务器:DB102 : 02、centos6.5、mysql5.7、hostname : DB102DB105 : 05、centos6.5mysql5.7 、host nameDB105 vip : 10(虚拟) 101 : 01(用来远程调用 vip测试)组件包: keepalived-1.1.20.tar.g

4、z(/dow nload.html) ipvsadm-1.26-1.src.rpm(http:/www .linu /software/ipvs.html)* popt-static-1.13-7.el6.x86_64.rpm(/dow nl oad/popt-static)* lib nl-1.1.4.tar.gz(/tgr/lib nl/)主从复制原理架构图* 第一步就是 master记录二进制日志。在每个事务更新数据完成之前,ma

5、ster在二进制日志记录这些改变。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从线程)处理该过

6、程的最后一步。SQL线程从中继日志读取事件,并重放其中的事件而更新slave的数据,使其与 master中的数据一致。只要该线程与I/O线程保持一致,中继日志通常会位于OS的缓存中,所以中继日志的开销很小。主主同步就是两台机器互为主的关系,在任何一台机器上写入都会同步。若mysql主机开启了防火墙,需要关闭防火墙或创建规则。步骤一:实现两台 mysql 主主同步1.1 安装 mysqlDB102、DB105两台服务器分别安装 mysql ,过程略。1.2修改mysql配置文件分别修改配置文件,在/etc/f文件中的mysqld段添加配置信息:f中各字段信息待研究DB102

7、:rootDB102 # vim /etc/fserver-id = 1#节点标示,主从节点不能相同,必须全局唯一log-bin=mysql-bin#开启 mysql 的 binlog 日志功能relay-log = mysql-relay-bin#开启 relay-log 日志,relay-log日志记录的是从服务器线程将主服务器的二进制日志读取过来记录到从服务器本地文件,然后SQL线程会读取relay-log内容并应用到从服务器replicate-wild-ignore-table=mysql.%# 复制过滤选项replicate-wild-ignore-table=test.%

8、replicate-wild-ignore-table=information_schema.%auto-increment-increment = 2auto-increment-offset = 1slave-skip-errors = all重启,使其配置生效DB105 :rootDB105 # vim /etc/fserver-id = 2#节点标示,主从节点不能相同,必须全局唯一log-bin=mysql-bin#开启 mysql 的 binlog 日志功能relay-log = mysql-relay-bin#开启 relay-log 日志,relay-log 日志记录的

9、是从服务器线程将主服务器的二进制日志读取过来记录到从服务器本地文件,然后SQL线程会读取relay-log内容并应用到从服务器replicate-wild-ignore-table=mysql.%# 复制过滤选项replicate-wild-ignore-table=test.%replicate-wild-ignore-table=information_schema.%auto-increment-increment = 2auto-increment-offset = 2slave-skip-errors = all重启,使其配置生效注:在执行主主互备之前要保证两台服务器上mysql数据

10、一致I/O日志的I/O日志的1.3 配置 主(DB102)- 从(DB105)DB102在DB102的mysql库中创建DB105的复制用户并授权rootDB102 # mysql -uroot -p*cp_root 05 identified bymysql grant replication slave on *.* tocp_123456;Query OK, 0 rows affected (0.04 sec)mysql show master status;+-+| File| Position | Binlog_Do_DB | Binlog_lgnore_DB

11、|+-+| mysql-bin.000004 |271 |+-+1 row in set (0.00 sec)*DB105在DB105的mysql库中将DB102设为自己的主服务器mysql change master tomaster_host=02,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_l

12、og_pos这两个选项的值是在 DB102 上通过show master status查询到的# master_log_file的值尽量用复制的方式输入,避免因有不可见的字符而配置失败启动slave服务mysql start slave;Query OK, 0 rows affected (0.01 sec)查看DB105上slave的运行状态Yes】,表明配置成若出现如下两个Yes”【Slave_IO_Running:Yes、Slave_SQL_Running:功!mysql show slave statusG*1. row*Slave_IO_State: Waiting for mast

13、er to send eventMaster_Host: 02Master_User: cp_rootMaster_Port: 3306Connect_Retry: 60Master_Log_File: mysql-bin.000004Read_Master_Log_Pos: 271Relay_Log_File: mysql-relay-bin.000002Relay_Log_Pos: 253Relay_Master_Log_File: mysql-bin.000004Slave_IO_Running: Yes# 重点Slave_SQL_Running: Yes# 重点R

14、eplicate_Do_DB:Replicate_Ignore_DB:Replicate_Do_Table:Replicate_lgnore_Table:Replicate_Wild_Do_Table:Replicate_Wild_Ignore_Table: mysql.%,test.%,information_schema.%Last_Errno: 0Last_Error:Skip_Counter: 0Exec_Master_Log_Pos: 271Relay_Log_Space: 409Until_Condition: NoneUntil_Log_File:Until_Log_Pos: 0

15、Master_SSL_Allowed: NoMaster_SSL_CA_File:Master_SSL_CA_Path:Master_SSL_Cert:Master_SSL_Cipher:Master_SSL_Key:Seconds_Behind_Master: 0Master_SSL_Verify_Server_Cert: NoLast_IO_Errno: 0Last_IO_Error:#跳过的表Last_SQL_Errno: 0Last_SQL_Error:Replicate_lgnore_Server_lds:Master_Server_ld: 11 row in set (0.00 s

16、ec)至此,DB102 到DB105 的mysql主从复制已经完成。1.4 配置 主(DB105)- 从(DB102)DB105在DB105的mysql库中创建DB102的复制用户并授权rootDB105 # mysql -uroot -p*02identified bymysql grant replication slave on *.* tocp_rootcp_123456;Query OK, 0 rows affected (0.04 sec)mysql show master status;+-+| File| Position | Binlog_Do_DB |

17、 Binlog_Ignore_DB |+-+| mysql-bin.000005 |271 |+-+1 row in set (0.00 sec)*DB102在DB102的mysql库中将DB105设为自己的主服务器mysql change master to master_host=05, master_user=cp_root, master_password=cp_123456, master_log_file=mysql-bin.000005, master_log_pos=271;Query OK, 0 rows affected (0.07 sec)# mas

18、ter_log_file查询到的# master_log_file和master_log_pos这两个选项的值是在DB105上通过show master status的值尽量用复制的方式输入,避免因有不可见的字符而配置失败启动slave服务mysql start slave;Query OK, 0 rows affected (0.01 sec)查看DB102 上slave的运行状态若出现如下两个Yes”【Slave_IO_Running:Yes、Slave_SQL_Running: Yes 】,表明配置成功!*1. row*Slave_IO_State: Waiting for master

19、 to send eventMaster_Host: 05Master_User: cp_rootMaster_Port: 3306Connect_Retry: 60Master_Log_File: mysql-bin.000005Read_Master_Log_Pos: 271Relay_Log_File: mysql-relay-bin.000002Relay_Log_Pos: 253Relay_Master_Log_File: mysql-bin.000005Slave_IO_Running: Yes# 重点Slave_SQL_Running: Yes# 重点Rep

20、licate_Do_DB:Replicate_Ignore_DB:Replicate_Do_Table:Replicate_lgnore_Table:Replicate_Wild_Do_Table:Replicate_Wild_Ignore_Table: mysql.%,test.%,information_schema.%Last_Errno: 0Last_Error:Skip_Counter: 0Exec_Master_Log_Pos: 271Relay_Log_Space: 409Until_Condition: NoneUntil_Log_File:Until_Log_Pos: 0Ma

21、ster_SSL_Allowed: NoMaster_SSL_CA_File:Master_SSL_CA_Path:#跳过的表mysql show slave statusGMaster_SSL_Cert:Master_SSL_Cipher:Master_SSL_Key:Seconds_Behind_Master: 0Master_SSL_Verify_Server_Cert: NoLast_IO_Errno: 0Last_IO_Error:Last_SQL_Errno: 0Last_SQL_Error:Replicate_lgnore_Server_lds:Master_Server_Id:

22、 11 row in set (0.00 sec)至此,DB105到DB102 的mysql主从复制也已经完成。双向互为主从。1.5测试主主同步* DB102rootDB102 # mysql -uroot -p* mysql show databases;+| Database |+| information_schema |I mysql| performance_schema |+3 rows in set (0.06 sec)mysql create database test ;Query OK, 1 row affected (0.02 sec) DB105rootDB105 #

23、mysql -uroot -p* mysql show databases;+| Database |+| information_schema |I mysql| performance_schema | test|+4 rows in set (0.06 sec)然后在 DB105 上删除test库,在 DB102 查询。如果双向操作都没有问题,说明主主同步构建成功。1.6可能出现的问题A. UUID 冲突mysql存在唯一标识uuid ,如果服务器是克隆出来的,则会出现Slave_IO_Running: NO的错误。通过修改f文件来修改该 uuid。# f文件

24、一般在 /var/lib/mysql/f#如果文件不存在,可用linux查询命令找:find / -name frootDB105 # vim /var/lib/mysql/fautoserver-uuid=140e1173-ff50-11e6-a2fb-000c29e713d3#原则:不破坏原uuid格式,数字位为数字,字母位为字母B. 若主从复制构建失败,可以重新构建;假设 DB105至U DB102 的mysql主从复制失败。DB102# 重新获取 DB105 的 master_log_file 和 master_log_pos mysql sl

25、ave stop;mysql change master tomaster_host=05,master_user=cp_root,master_password=cp_123456.master_log_file=mysql-bin.000005, master_log_pos=271;Query OK, 0 rows affected (0.07 sec)mysql start slave;Query OK, 0 rows affected (0.01 sec)二:引入 keepalived 实现 mysql双主高可用DB102、DB105 两台服务器均需配置安装ke

26、epalived 服务。组件的依赖关系:* keepalived 依赖 ipvsadm ipvsadm 依赖 libnl 禾口 popt-static2.1安装依赖包# 安装 libnlrootDB102 setup# tar -zxvf libnl-1.1.4.tar.gzrootDB102 setup# cd libnl-1.1.4rootDB102 libnl-1.1.4# ./configurerootDB102 libnl-1.1.4# make & make install# 安装 popt-staticrootDB102 setup# rpm -ivh popt-static-1

27、.13-7.el6.x86_64.rpm# 安装 ipvsadmrootDB102 setup# rpm -ivh ipvsadm-1.26-1.src.rpm2.2 安装 keepalivedrootDB102 setup# tar zxf keepalived-1.1.20.tar.gzrootDB102 setup# cd keepalived-1.1.20rootDB102 keepalived-1.1.20# ./configure -sysconf=/etc-with-kernel-dir=/lib/modules/2.6.32-642.3.1.el6.x86_64/rootDB1

28、02 keepalived-1.1.20# make & make installrootDB102 keepalived-1.1.20# In -s /usr/local/sbin/keepalived /sbin/rootDB102 keepalived-1.1.20# chkconfig -add keepalivedrootDB102 keepalived-1.1.20# chkconfig -level 35 keepalived on2.3 酉己置 keepalived.conf*DB102rootDB102 keepalived-1.1.20# vim /etc/keepaliv

29、ed/keepalived.conf! Configuration File for keepalivedglobal_defs router_id LVS_DEVEL_102vrrp_instance VI_1 state BACKUP#在 DB102 和 DB105 上均配置为 BACKUPinterface eth0virtual_router_id 51priority 100advert_int 1nopreempt#不抢占模式,只有优先级高的机器上设置即可,优先级低的机器可不设置authentication auth_type PASSauth_pass 1111virtual_i

30、paddress 10virtual_server 17220.20.110 3306 delay_loop 6lb_algo rrlb_kind NATnat_mask persistence_timeout 50protocol TCPreal_server 02 3306 weight 1notify_down /root/shutdown.shTCP_CHECK#检测到服务down后执行的脚本connect timeout 10delay_before_retry 3connect_port 3306*DB105ro

31、otDB105 keepalived-1.1.20# vim /etc/keepalived/keepalived.conf ! Configuration File for keepalivedglobal_defs router_id LVS_DEVEL_105vrrp_instance VI_1 state BACKUPinterface eth0virtual_router_id 51priority 100advert_int 1nopreemptauthentication auth_type PASSauth_pass 1111virtual_ipaddress 172.20.2

32、0.110virtual_server 17220.20.110 3306 delay_loop 6lb_algo rrlb_kind NATnat_mask persistence_timeout 50protocol TCPreal_server 05 3306 weight 1notify_down /root/shutdown.shTCP_CHECK#连接超时时间#重连次数#重连间隔时间#健康检查端口connect_timeout 10nb_get_retry 3 delay_before_retry 3 connect_port 330

33、62.4 编写脚本 shutdown.shkeepalivedshutdown.sh :检测到服务down后所要执行的脚本,服务故障时,通过killall强制杀死keepalived进程,从而实现了MySQL故障自动转移;触发位置:keepalived.conf 中 notify_down 属性。rootlocalhost root# vim /root/shtdown.sh#!/bin/bashkillall keepalived2.5 启动keepalived 并查看日志rootDB102 # service keepalived start正在启动keepalived :确定rootDB

34、102 # tail -f /var/log/messagesNov 27 22:37:35 DB102 Keepalived_vrrp20835: Sending gratuitous ARP on eth1 for10Nov 27 22:37:35 DB102 Keepalived_vrrp20835: Sending gratuitous ARP on eth1 for10Nov 27 22:37:35 DB102 Keepalived_vrrp20835: Sending gratuitous ARP on eth1 for172.20.20

35、.110Nov 27 22:37:35 DB102 Keepalived_vrrp20835: Sending gratuitous ARP on eth1 for10Nov 27 22:37:35 DB102 Keepalived_vrrp20835: Sending gratuitous ARP on eth1 for10Nov 27 22:37:35 DB102 Keepalived_vrrp20835: VRRP_lnstance(VI_1) Sending/queueing gratuitous ARPs on eth1 for 172.2

36、0.20.110Nov 27 22:37:35 DB102 Keepalived_vrrp20835: Sending gratuitous ARP on eth1 for10Nov 27 22:37:35 DB102 Keepalived_vrrp20835: Sending gratuitous ARP on ethl for10Nov 27 22:37:35 DB102 Keepalived_vrrp20835: Sending gratuitous ARP on eth1 for10Nov 27 22:37:35 DB1

37、02 Keepalived_vrrp20835: Sending gratuitous ARP on eth1 for10至此,keepalived服务构建完成。三:功能测试3.1在远程客户端(101 )通过vip操作 mysql创建一个数据库,然后在这个库中创建一个表,并插入数据。root101 # mysql -h 10 -uroot -p*#查看连接到的服务器的hostname,服务器需配置hostname ,否则为默认值localhost.localdomain#当前连接的是DB102mysql show variables like%hos

38、tname%;+-+| Variable_name |Value+-+| hostname |DB102+-+1 row in set (0.00 sec)mysql show databases;+| Database |+| information_schema |I mysql| performance_schema |+3 rows in set (0.06 sec)# 建库:testmysql create database testQuery OK, 1 row affected (0.02 sec)# 建表:test_tablemysql use test ;Database c

39、hangedmysql create table test_table(id int, name varchar(32);Query OK, 0 rows affected (0.03 sec)mysql show tables;+| Tables_in_test |+| test_table|+ 1 row in set (0.01 sec)#插入表数据glt);mysql insert into test_table(id,name) values(1,Query OK, 1 row affected (0.00 sec)3.2验证数据分别查看DB102、DB105数据同步情况。DB102

40、rootDB102 # mysql -uroot -p*mysql show databases;+| Database |+| information_schema |I mysql| performance_schema | test|+4 rows in set (0.06 sec)mysql use test ;Database changedmysql show tables;+| Tables_in_test |+| test_table|+ 1 row in set (0.01 sec) mysql select * from test_table;+-+-+I id| name

41、I+-+-+I 1I glt I+-+-+1 row in set (0.08 sec)DB105操作同上。3.3故障测试停止 DB102 中的 mysqlrootDB102 # service mysqld stopShutting down MySQL. SUCCESS!4101通过vip登录root101 # mysql -h 10 -uroot -p*%hostname%;mysql show variables likeERROR 2006 (HY000): MySQL server has gone awayNo connection. Trying to r

42、econnect.Connection id: 610Current database: test+ | Variable_name | Value | hostname |DB105|+1 row in set (0.01 sec)现在连接的是DB105,故障自动切换成功。继续 插入数据,看 DB102-mysql重启后是否能够同步数据。mysql use test ;Database changedmysql insert into test_table(id, name) values(2,jjj );Query OK, 1 row affected (0.06 sec)mysql select * from test_table;+id| name丄1| glt |2| jjj |-+2 rows in set (0.00 sec)*DB102查看DB102数据同步情况。rootDB102 # service mysqld startStarting MySQL. SUC

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论