mysql heartbeat_mysql+heartbeat双主高可用

93a8981ec059868a955b0511413dfb14.png

说明:1,平时对外提供vip让用户写

2,两台主的互为主从,都有二进制日志和中继日志

3,平时只有有vip的主的写,另一台主的只读

4,主从复制时,一半从的指向一台主的

5,当有vip的主的下线时,另一台主的把vip抢过来,继续提供写

优点:1,保证了一定程度的高可用

2,分担了主从复制时,主服务器的压力

3,虽然是双主,但是由于一直只有一台提供写,所以一般不会出现数据不一致

4,解决drbd高可用时,另一台主的只能干备着,不能读也不能写

5, 没有自动增长的问题

缺点:1,由于有一半的从服务器指向了一台主的,所以当一台主的下线时

有一半的从服务器得不到最新的数据()

以上都是个人见解,如有错误。。

关于mysql主从复制:

MySQL使用3个线程来执行复制功能(其中1个在主服务器上,另两个在从服务器上。当发出start slave时,

从服务器创建一个i/o线程,以连接主服务器并让它发送记录在其二进制日志中的语句。主服务器创建一个线

程将二进制日志中的内容发送到从服务器。该线程可以识别为主服务器上show processlist的输出中

的binlog dump线程。从服务器i/o线程读取主服务器binlog dump线程发送的内容并将该数据拷贝到从服务器

数据目录中的本地文件中,即中继日志。第3个线程是sql线程,是从服务器创建用于读取中继日志并执行日

志中包含的更新。

show processlist语句可以提供在主服务器上和从服务器上发生的关于复制的信息

MySQL 的复制可以是基于一条语句(Statement Level),也可以是基于一条记录(Row

level),可以在 MySQL 的配置参数中设定这个复制级别,不同复制级别的设置会影响到

Master 端的 Binary Log 记录成不同的形式。

1.

Row Level:Binary Log 中会记录成每一行数据被修改的形式,然后在 Slave 端

再对相同的数据进行修改。

优点:在 Row Level 模式下,Binary Log 中可以不记录执行的 sql 语句的上下文相关

的信息,仅仅只需要记录那一条记录被修改了,修改成什么样了。所以 Row Level 的日志

内容会非常清楚的记录下每一行数据修改的细节,非常容易理解。而且不会出现某些特定情

况下的存储过程,或 function,以及 trigger 的调用和触发无法被正确复制的问题。

缺点:Row Level 下,所有的执行的语句当记录到 Binary Log 中的时候,都将以每行

记录的修改来记录,这样可能会产生大量的日志内容,比如有这样一条 update 语句:UPDATE

group_message SET group_id = 1 where group_id = 2,执行之后,日志中记录的不是这

条 update 语句所对应的事件(MySQL 以事件的形式来记录 Binary Log 日志),而是这条

语句所更新的每一条记录的变化情况,这样就记录成很多条记录被更新的很多个事件。自然 ,

Binary Log 日志的量就会很大。尤其是当执行 ALTER TABLE 之类的语句的时候,产生的日

志量是惊人的。因为 MySQL 对于 ALTER TABLE 之类的 DDL 变更语句的处理方式是重建整个

表的所有数据,也就是说表中的每一条记录都需要变动,那么该表的每一条记录都会被记录

到日志中。

2.

Statement Level:每一条会修改数据的 Query 都会记录到 Master 的 Binary

Log 中。Slave 在复制的时候 SQL 线程会解析成和原来 Master 端执行过的相同的 Query

来再次执行。

优点:Statement Level 下的优点首先就是解决了 Row Level 下的缺点,不需要记录每

一行数据的变化,减少 Binary Log 日志量,节约了 IO 成本,提高了性能。因为他只需要

记录在 Master 上所执行的语句的细节,以及执行语句时候的上下文的信息。

缺点:由于他是记录的执行语句,所以,为了让这些语句在 slave 端也能正确执行,那

么他还必须记录每条语句在执行的时候的一些相关信息,也就是上下文信息,以保证所有语

句在 slave 端杯执行的时候能够得到和在 master 端执行时候相同的结果。另外就是,由于

Mysql 现在发展比较快,很多的新功能不断的加入,使 mysql 得复制遇到了不小的挑战,自

然复制的时候涉及到越复杂的内容,bug 也就越容易出现。在 statement level 下,目前已

经发现的就有不少情况会造成 mysql 的复制出现问题,主要是修改数据的时候使用了某些特

定的函数或者功能的时候会出现,比如:sleep()函数在有些版本中就不能真确复制,在存

储过程中使用了 last_insert_id()函数,可能会使 slave 和 master 上得到不一致的 id 等

等。由于 row level 是基于每一行来记录的变化,所以不会出现类似的问题。

3,还有一种是混合模式(mixed),即让mysql自己判断语句应该怎么记录

这个参数就是配置文件的:binlog_format=mixed

复制时要考虑的几个mysql参数

“sync_binlog”:这个参数是对于MySQL系统来说是至关重要的,他不仅影响到Binlog对MySQL所

带来的性能损耗,而且还影响到 MySQL 中数据的完整性。对于“sync_binlog”参数的各种设置的说明如

下:

sync_binlog=0,当事务提交之后,MySQL 不做 fsync 之类的磁盘同步指令刷新 binlog_cache中

的信息到磁盘,而让 Filesystem 自行决定什么时候来做同步,或者 cache 满了之后才同步到磁

盘。

sync_binlog=n,当每进行 n 次事务提交之后,MySQL 将进行一次 fsync 之类的磁盘同步指令来

将 binlog_cache 中的数据强制写入磁盘。

在 MySQL 中系统默认的设置是 sync_binlog=0,也就是不做任何强制性的磁盘刷新指令,这时候的性

能是最好的,但是风险也是最大的。因为一旦系统 Crash,在 binlog_cache 中的所有 binlog 信息都会被

丢失。而当设置为“1”的时候,是最安全但是性能损耗最大的设置。因为当设置为 1 的时候,即使系统

Crash,也最多丢失 binlog_cache 中未完成的一个事务,对实际数据没有任何实质性影响。从以往经验

和相关测试来看,对于高并发事务的系统来说,“sync_binlog”设置为 0 和设置为 1 的系统写入性能差

距可能高达 5 倍甚至更多。

log-slave-updates、gtid-mode、enforce-gtid-consistency、report-port和report-host:用于启动GTID及满足附属的其它需求;

master-info-repository和relay-log-info-repository:启用此两项,可用于实现在崩溃时保证二进制及从服务器安全的功能;

sync-master-info:启用之可确保无信息丢失;

slave-paralles-workers:设定从服务器的SQL线程数;0表示关闭多线程复制功能;

binlog-checksum、master-verify-checksum和slave-sql-verify-checksum:启用复制有关的所有校验功能;

binlog-rows-query-log-events:启用之可用于在二进制日志记录事件相关的信息,可降低故障排除的复杂度;

log-bin:启用二进制日志,这是保证复制功能的基本前提;

server-id:同一个复制拓扑中的所有服务器的id号必须惟一;

服务配置段[mysqld]中于少应该定义如下选项

1.1、配置master节点:

[mysqld]

binlog-format=ROW

log-bin=master-bin

log-slave-updates=true

gtid-mode=on

enforce-gtid-consistency=true

master-info-repository=TABLE

relay-log-info-repository=TABLE

sync-master-info=1

slave-parallel-workers=2

binlog-checksum=CRC32

master-verify-checksum=1

slave-sql-verify-checksum=1

binlog-rows-query-log_events=1

server-id=1

report-port=3306

port=3306

datadir=/mydata/data

socket=/tmp/mysql.sock

report-host=master.magedu.com

1.2、配置slave节点:

[mysqld]

binlog-format=ROW

log-slave-updates=true

gtid-mode=on

enforce-gtid-consistency=true

master-info-repository=TABLE

relay-log-info-repository=TABLE

sync-master-info=1

slave-parallel-workers=2

binlog-checksum=CRC32

master-verify-checksum=1

slave-sql-verify-checksum=1

relay-log=mysql-relay-bin

binlog-rows-query-log_events=1

server-id=11

report-port=3306

port=3306

log-bin=mysql-bin.log

datadir=/mydata/data

socket=/tmp/mysql.sock

report-host=slave.magedu.com

read_only=on

配置双主(版本要一样):

修改my.cnf

server=1

log-bin=mysql-bin          二进制日志应该单独存放

relay-log=mysql-relay-bin

如果有数据可先备份数据到其他节点

mysql> flush tables with read lock;

记录二进制日志位置

mysql> show master status;

+-------------------+----------+--------------+------------------+

| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB |

+-------------------+----------+--------------+------------------+

| master-bin.000031 |      284 |              |                  |

+-------------------+----------+--------------+------------------+

同步数据文件

[root@localhost ~]# rsync -av /mysql/ 192.168.100.9:/mysql

mysql> unlock tables;

授权复制主机

mysql> grant replication slave,replication client on *.* to 'repluser'@'192.168.100._' identified by 'redhat';

------------

配置好另一台后连接另一台主的

mysql> change master to master_host='192.168.100.10',master_user='repluser',master_password='redhat',master_log_file='master-bin.000001',master_log_pos=106;

-----------

mysql> start slave ;

确保都为yes

mysql> show slave status\G

Relay_Master_Log_File: master-bin.000001

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

在另一个主的上

server=2         一定不能和其他节点上的一样,否则主从复制失败

log-bin=mysql-bin

relay-log=mysql-relay-bin

启动服务

service mysqld start

连接主服务器

mysql> change master to master_host='192.168.100.7',master_user='repluser',master_password='redhat',master_log_file='master-bin.000031',master_log_pos=284;

mysql> start slave ;

确保都为yes

mysql> show slave status\G

Relay_Master_Log_File: master-bin.000031

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

记录二进制日志位置

mysql> show master status;

+-------------------+----------+--------------+------------------+

| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB |

+-------------------+----------+--------------+------------------+

| master-bin.000001 |      106 |              |                  |

+-------------------+----------+--------------+------------------+

授权复制主机

mysql> grant replication slave,replication client on *.* to 'repluser'@'192.168.100._' identified by 'redhat';

在双主之间配置heartbeat

安装heartbeat

主机名,时间,ssh互信

ha.cf配置文件部分参数:

autojoin    none

#集群中的节点不会自动加入

logfile /var/log/ha-log

#指名heartbaet的日志存放位置

keepalive 2

#指定心跳使用间隔时间为2秒(即每两秒钟在eth1上发送一次广播)

deadtime 30

#指定备用节点在30秒内没有收到主节点的心跳信号后,则立即接管主节点的服务资源

warntime 10

#指定心跳延迟的时间为十秒。当10秒钟内备份节点不能接收到主节点的心跳信号时,就会往日志中写入一个警告日志,但此时不会切换服务

initdead 120

#在某些系统上,系统启动或重启之后需要经过一段时间网络才能正常工作,该选项用于解决这种情况产生的时间间隔。取值至少为deadtime的两倍。

#mcast eth0 225.0.0.1 694 1 0

#采用网卡eth0的Udp多播来组织心跳,一般在备用节点不止一台时使用。Bcast、ucast和mcast分别代表广播、单播和多播,是组织心跳的三种方式,任选其一即可。

auto_failback off

#用来定义当主节点恢复后,是否将服务自动切回,heartbeat的两台主机分别为主节点和备份节点。主节点在正常情况下占用资源并运行所有的服务,遇到故障时把资源交给备份节点并由备份节点运行服务。在该选项设为on的情况下,一旦主节点恢复运行,则自动获取资源并取代备份节点,如果该选项设置为off,那么当主节点恢复后,将变为备份节点,而原来的备份节点成为主节点,这里设置为off

ping 192.168.12.237

#选择ping的节点,ping 节点选择的越好,HA集群就越强壮,可以选择固定的路由器作为ping节点,但是最好不要选择集群中的成员作为ping节点,ping节点仅仅用来测试网络连接

crm yes

表示受crm控制

node node1.magedu.com

#主节点主机名,可以通过命令“uanme –n”查看。

node node2.magedu.com

#备用节点主机名

#下面是对传输的数据进行压缩,是可选项

compression     bz2

compression_threshold 2

在资源文件定义vip

资源文件(/etc/ha.d/haresources)

node1   IPaddr::192.168.100.5/24/eth0

认证文件(/etc/ha.d/authkeys)

auth 1

1 crc

权限600

在两个节点同样配置确保一样

scp /etc/ha.d/authkeys /etc/ha.d/harsources /etc/ha.d/ha.cf 192.168.100.10:/etc/ha.d/

启动服务

service heartbeat start;ssh node2 'service heartbeat start'

测试vip是否转移

如果master意外崩溃导致二进制日志中的某事件损坏,可以在从服务器使用如下参数忽略:

stop slave;

set global     sql_slave_skip_counter = 1;

start slave;

复制相关的文件:

master.info: 文本文件,保存从服务器连接至主服务时所需要的信息,每行一个值;

relay-log.info: 文本文件,保存了复制位置:包括二进制日志和中继日志的文件及位置;

为了复制的安全性:

sync_master_info = 1

sync_relay_log = 1

sync_relay_log_info = 1

从服务器意外崩溃时,建议使用pt-slave-start命令来启动slave;

从服务器落后于主服务器:

Seconds_Behind_Master: 0

评估主从服务表中的数据是否一致:

pt-table-checksum

如果数据不一致,解决办法

1、重新备份并在从服务器导入数据;

2、pt-table-sync

pt开头的工具由:percona-toolkit-2.2.4-1.noarch.rpm

监控mysql服务器状态

[root@localhost ~]# vmstat 2

procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----

r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st

0  0    780 177488 152496 397160    0    0     4     9   21   15  0  0 100  0  0

0  0    780 177472 152500 397188    0    0     0    12   32   30  0  0 100  0  0

procs r:等待cpu时间片的进程数,一般不能大于cpu的物理核心数

procs b:有多少进程已经进入了不可中断式睡眠,比如等待io,网络

swpd:从内存交换到swpd的大小,通常是在内存中好久不用的,系统自动交换出去的,以保证有更多的内存给其他的进程

free:剩余内存

buff:缓冲

cache:缓存

swap si so:内存不够用了,在交换分区进进出出的量

io bi bo:磁盘io

system in cs:每秒中断和上下文切换

cpu:表示cpu的时间都花在哪了

us:用户空间

sy:内核空间

id:剩余

wa:等待io

st:被偷走的

[root@localhost ~]# iostat -x -k /dev/sda

Linux 2.6.32-358.el6.x86_64 (localhost.localdomain)     02/22/2014     _x86_64_    (2 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle

0.07    0.01    0.17    0.11    0.00   99.64

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util

sda               0.04     3.56    0.32    0.72     5.34    17.16    43.52     0.02   17.79   3.09   0.32

rrqm/s wrqm/s:每秒读写合并数

r/s w/s:每秒读写

rkB/s    wkB/s:每秒读写千字节数

await:磁盘排队所花的时间,单位毫秒(发起了一个读磁盘的请求,过了这么久才看到硬盘)

svctm:服务所用的时间,不包括排队 单位毫秒

%util:磁盘利用率

使用sar gnuplot监控系统

1,生成信息文件

[root@localhost ~]# LANG=C sar -q |awk '/^[^[:alpha:]]+$/{print $1,$(NF-2),$(NF-1),$NF}' >~/cpu.info

2,写一个生成图片的文件

[root@localhost ~]# vim gnuplot.cpu

set xdata time

set timefmt "%H:%M:%S"

set term png size 1024,768

set output "/var/www/html/cpu.png"

plot '~/cpu.info' using 1:2 title 'min/1' with line,'~/cpu.info' using 1:3 title 'min/5' with line

3,画图

[root@localhost ~]# gnuplot gnuplot.cpu

查看

c7e629f851b394a4e74e2636c968f1cb.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Re: MySQL 高可用工具 heartbeat 实战部署详解 ===============================================# heartbeat作用(无缝漂移):  通过heartbeat,可以将资源(ip以及程序服务[例如:httpd或mysqld服务]等资源)从一台已经故障的计算机快速转移到另一台正常运转的机器上继续提供服务,即高可用HA 资源的内容包括:ip地址和服务(例如:httpd或mysqld服务) # HeartBeat的工作原理:        a) heartbeat的主备模式(第1种模式)(推荐方式:本章演示重点) 通过修改heartbeat配置文件,可以指定那一台heartbeat服务器作为主服务器,则另一台将自动成为热备服务器然后在热备服务器上配置heartbeat守护程序来监听来自主服务器的心跳消息。如果热备服务器在指定时间内未监听到来自主服务器的心跳,就会启动故障转移程序,并取得主服务器上的相关资源服务的所有权,接替主服务器继续不间断的提供服务,从而达到资源以及服务高可用(HA)的目的。           b) heartbeat主主模式(第2种模式)(不推荐) 两台服务器互为主备,这是他们之间还会互相发送报文来告诉对方自己的当前的状态,如果在指定的时间内未收到对方发送的心跳报文,那么,一方就会认为对方失效或者是已经宕机了,这时每个运行正常的主机就会启动自身的资源接管模块来接管运行在对方主机上的资源或者是服务,继续为用户提供服务。      

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值