知识大全 通过Heartbert2 让Mysql Replication 具有
Posted 资源
篇首语:世上无难事,只要肯登攀本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 通过Heartbert2 让Mysql Replication 具有相关的知识,希望对你有一定的参考价值。
通过Heartbert2 让Mysql Replication 具有 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
前言
Master Slave 的数据库机构解决了很多问题 特别是read/write 比较高的应用 结构如图
写操作全部在Master 结点执行 并由Slave 数据库结点定时(默认 s)读取Master 的bin log
将众多的用户读请求分散到更多的数据库节点 从而减轻了单点的压力
它的缺点是
Slave 实时性的保障 对于实时性很高的场合可能需要做一些处理
高可用性问题 Master 就是那个致命点(SPOF:Single point of failure)
本文主要讨论的是如何解决第 个缺点
解决方案如下图
使用两个MySQL 主库master master 数据存在共享设备上 用heartbeat 进行监控 当master 发生故障时 将资源切换到master
故障发生后 无需对slave 进行修改 slave 自动切到master (断电切换需要手工同步slave)
网络设置
磁盘设置
mysql 安装
到官方网址 下载最新版本 mysql 找到对应的包 在ha ha 分别安装
# cd /usr/local/
# tar xzvf mysql linux x _ glibc tar gz
# mv mysql linux x _ glibc mysql
# groupadd mysql
# useradd g mysql mysql
#passwd mysql
修改/etc/my cf 数据文件路径设置在共享磁盘 修改相关参数 这 个参数在ha ha 上必须一样
datadir=/u /data #数据文件路径
server id = #数据库ID
log bin=/u /data/master # binlog 路径
下面步骤先在ha 上执行 然后在ha 执行
先在ha 把磁盘mount
[root@ha mysql]# mount /dev/sdb /u
[root@ha u ]# mkdir data
[root@ha u ]# chown R mysql mysql data/
安装mysql
[root@ha u ]# cd /usr/local/mysql
# /scripts/mysql_install_db user=mysql
# cp support files/mysql server /etc/rc d/init d/mysqld
# chmod +x /etc/rc d/init d/mysqld
# cconfig add mysqld
# /etc/rc d/init d/mysqld start
在ha 把共享磁盘umount 在ha 上mount 把上面的数据删除后执行 步骤 完成后ha 也umount
在slave 上安装mysql 数据放在slave 本地 过程略
heartbeat 安装
官方网址 分别在ha ha 安装 确认下列包安装
[root@ha ~]# rpm ivh libnet x _ rpm
[root@ha ~]# rpm ivh heartbeat pils x _ rpm
[root@ha ~]# rpm ivh heartbeat stonith x _ rpm
[root@ha ~]# rpm ivh perl TimeDate el noarch rpm
[root@ha ~]# rpm ivh heartbeat x _ rpm
[root@ha ~]# rpm ivh heartbeat devel x _ rpm
开始编辑配置文件(ha ha 都执行)
[root@ha local]# cp /usr/share/doc/packages/heartbeat/ha cf /etc/ha d/
[root@ha local]# cp /usr/share/doc/packages/heartbeat/auteys /etc/ha d/
编辑/etc/ha d/auteys 使用的是第 种认证方式(crc) 接着把文件的权限改为
cat /etc/ha d/auteys
显示
auth
crc
更改文件权限
chmod /etc/ha d/auteys
[root@ha ~]# cat /etc/ha d/ha cf
debugfile /var/log/ha debug
logfile /var/log/ha log
logfacility local
keepalive
deadtime
warntime
udpport
crm yes
node ha ha
bcast eth
auto_failback off
apiauth cibmon uid=hacluster
respawn hacluster /usr/lib /heartbeat/cibmon –d
配置资源 共享IP 共享磁盘 MYSQL 个服务组成 组资源
[root@ha ~]# cat /etc/ha d/haresources
ha Filesystem::/dev/sdb::/u ::ext mysqld
启动的时候从左到右依次运行脚本 关闭的时候从右到左依次关闭
这个文件原名为haresources 在 x 上使用 不过为了区别使用此名称
将资源文件转换成cib xml x 里编译好后自带有转换脚本
[root@ha ~]# cd /var/lib/heartbeat/crm/
[root@ha crm]# rm rf cib xml*
[root@ha crm]#
/usr/lib /heartbeat/haresources cib py stout c /etc/ha d/ha cf /etc/ha d/haresources
[root@ha crm]# cat cib xml|grep mysql
<primitive class= lsb id= mysqld_ provider= heartbeat type= mysqld >
<op id= mysqld_ _mon interval= s name= monitor timeout= s />
即每 秒检测资源运行情况 如果发现资源不在 则尝试启动资源 如果 s 后还未启动
成功 则资源切换向另节点 可根据业务进行修改
启动heartbeat 在ha 和ha 都启动
[root@ha ~]# /etc/init d/heartbeat start
查看资源情况
============
Last updated: Tue Feb : :
Current DC: ha ( c de bcb bb b eef)
Nodes configured
Resources configured
============
Node: ha ( c de bcb bb b eef): online
Node: ha (ab d f be a c fc f c ): online
Resource Group: group_
IPaddr_ _ _ _ (ocf::heartbeat:IPaddr): Started ha
Filesystem_ (ocf::heartbeat:Filesystem): Started ha
mysqld_ (lsb:mysqld): Started ha
将heartbeat 设置成开机自动重启
[root@ha ~]# cconfig add heartbeat
[root@ha ~]# cconfig level heartbeat on
[root@ha ~]# cconfig list heartbeat
heartbeat :off :off :on :on :on :on :off
mysql slave 配置
在master 赋予slave 权限(任一节点操作)
[root@ha ~]# /usr/local/mysql/bin/mysql u root p
Enter password:
Wele to the MySQL monitor Commands end with ; or \\g
Your MySQL connection id is
Server version: log MySQL Community Server (GPL)
Type help; or \\h for help Type \\c to clear the buffer
mysql> GRANT RELOAD REPLICATION SLAVE ON * * TO slave @
IDENTIFIED BY nslave ;
mysql> show master status\\G;
*************************** row ***************************
File: master
Position:
Binlog_Do_DB:
Binlog_Ignore_DB:
row in set ( sec)
slave 同步
因为没有数据 所以省略数据同步的步骤 在slalve 执行下列命令
mysql> CHANGE MASTER TO MASTER_HOST=
MASTER_PORT =
MASTER_USER= slave
MASTER_PASSWORD= nslave
MASTER_LOG_FILE= master
MASTER_LOG_POS = ;
Query OK rows affected ( sec)
mysql> start slave;
Query OK rows affected ( sec)
mysql> show slave status\\G;
*************************** row ***************************
Slave_IO_State:Waiting for master to send event
Master_Host:
Master_User: slave
Master_Port:
Connect_Retry:
Master_Log_File: master
Read_Master_Log_Pos:
Relay_Log_File: mysql relay bin
Relay_Log_Pos:
Relay_Master_Log_File: master
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
row in set ( sec)
失败测试
网络切换测试
将ha 的网线拔掉 在ha 看资源的切换情况
Node: ha ( c de bcb bb b eef): online
Node: ha (ab d f be a c fc f c ): OFFLINE
Resource Group: group_
IPaddr_ _ _ _ (ocf::heartbeat:IPaddr): Started ha
Filesystem_ (ocf::heartbeat:Filesystem): Started ha
mysqld_ (lsb:mysqld): Started ha
没有问题 把ha 网线插上 资源又回切到ha
Node: ha ( c de bcb bb b eef): online
Node: ha (ab d f be a c fc f c ): online
Resource Group: group_
IPaddr_ _ _ _ (ocf::heartbeat:IPaddr): Started ha
Filesystem_ (ocf::heartbeat:Filesystem): Started ha
mysqld_ (lsb:mysqld): Started ha
宕机切换
将ha 强制关机在开机 这和 的情况差不多 能正常切换
服务切换
将ha 的mysql 服务强制中断 修改/etc/my cf
datadir=/u /data #实际这个路径不存在
[root@ha ~]# ps ef|grep mysql
root : ? : : /bin/sh /bin/mysqld_safe
datadir=/u /data pid file=/u /data/ha pid
mysql : ? : : /usr/local/mysql/bin/mysqld
basedir=/usr/local/mysql datadir=/u /data user=mysql log error=/u /data/ha err
pid file=/u /data/ha pid socket=/tmp/mysql sock port=
root : ? : : /bin/sh /etc/init d/mysqld start
root : pts/ : : grep mysql
[root@ha ~]# kill
[root@ha ~]# ps ef|grep mysql
root : pts/ : : grep mysql
在ha 上查看资源情况 已经切换过来
Node: ha ( c de bcb bb b eef): online
Node: ha (ab d f be a c fc f c ): online
Resource Group: group_
IPaddr_ _ _ _ (ocf::heartbeat:IPaddr): Started ha
Filesystem_ (ocf::heartbeat:Filesystem): Started ha
mysqld_ (lsb:mysqld): Started ha
Failed actions:
mysqld_ _monitor_ (node=ha call= rc= ): plete
mysqld_ _start_ (node=ha call= rc= ): plete
slave 同步测试
将ha 的heartbeat 关闭
[root@ha data]# /etc/init d/heartbeat stop
在ha 看资源情况
Node: ha ( c de bcb bb b eef): online
Node: ha (ab d f be a c fc f c ): OFFLINE
Resource Group: group_
IPaddr_ _ _ _ (ocf::heartbeat:IPaddr): Started ha
Filesystem_ (ocf::heartbeat:Filesystem): Started ha
mysqld_ (lsb:mysqld): Started ha
资源全部切换到ha 我们执行一些操作 看是否同步
[root@ha ~]# /usr/local/mysql/bin/mysql u root p D test
Enter password:
Wele to the MySQL monitor Commands end with ; or \\g
Your MySQL connection id is
Server version: log MySQL Community Server (GPL)
Type help; or \\h for help Type \\c to clear the buffer
root@test >create table t(t int);
root@test >insert into t values( );
root@test >select * from t;
+ +
| t |
+ +
| |
+ +
row in set ( sec)
在slave 查看是否同步
[root@mysql ~]# /root/cron/lg sh
Wele to the MySQL monitor Commands end with ; or \\g
Your MySQL connection id is
Server version: log MySQL Community Server (GPL)
Type help; or \\h for help Type \\c to clear the buffer
mysql> use test
Database changed
mysql> select * from t;
+ +
| t |
+ +
| |
+ +
row in set ( sec)
在将资源切回到ha 在进行操作 看slave 的情况
[root@ha ~]# /etc/init d/heartbeat start
Node: ha ( c de bcb bb b eef): online
Node: ha (ab d f be a c fc f c ): online
Resource Group: group_
IPaddr_ _ _ _ (ocf::heartbeat:IPaddr): Started ha
Filesystem_ (ocf::heartbeat:Filesystem): Started ha
mysqld_ (lsb:mysqld): Started ha
资源已经切回到ha 对其进行操作
[root@ha ~]# /usr/local/mysql/bin/mysql u root p D test
Enter password:
Wele to the MySQL monitor Commands end with ; or \\g
Your MySQL connection id is
Server version: log MySQL Community Server (GPL)
Type help; or \\h for help Type \\c to clear the buffer
mysql> insert into t values( );
mysql> insert into t values( );
mysql> select * from t;
+ +
| t |
+ +
| |
| |
| |
+ +
rows in set ( sec)
在slave 查看是否同步
mysql> select * from t;
+ +
| t |
+ +
| |
| |
| |
+ +
rows in set ( sec)
mysql> show slave status\\G;
*************************** row ***************************
Slave_IO_State:Waiting for master to send event
Master_Host:
Master_User: slave
Master_Port:
Connect_Retry:
Master_Log_File: master
Read_Master_Log_Pos:
Relay_Log_File: mysql relay bin
Relay_Log_Pos:
Relay_Master_Log_File: master
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Master 切换后 slave 无需任何人工介入 自动同步
模拟写入 切换测试
写个简单的循环
[root@mysql cron]# cat test sh
for ((num= ;num< ;num=num+ ))
do
echo
/usr/local/mysql/bin/mysql u sg psg h D test e
insert into t values($num);
if (( $? )); then
echo $num:no
else
echo $num:ok
fi
done
在写入过程中 手工切换 手工reboot 等操作 和 的测试结果一样 在写入过程中强制ha 断电 需要手工处理slave 同步 将ha 断电后 资源切到ha 后 在slave 会报错
mysql> show slave status\\G;
*************************** row ***************************
Slave_IO_State:
Master_Host:
Master_User: slave
Master_Port:
Connect_Retry:
Master_Log_File: master
Read_Master_Log_Pos:
Relay_Log_File: mysql relay bin
Relay_Log_Pos:
Relay_Master_Log_File: master
Slave_IO_Running: No
Slave_SQL_Running: Yes
查看slave 报错日志
: : [Note] Slave I/O thread: Failed reading log event reconnecting to retry log
master at postion
: : [ERROR] Error reading packet from server: Client requested master to start
replication from impossible position ( server_errno= )
: : [ERROR] Got fatal error : Client requested master to start replication from
impossible position from master when reading data from binary log
: : [Note] Slave I/O thread exiting read up to log master position
在master 中找不到position
查看master 的binlog
[root@ha data]# /usr/local/mysql/bin/mysqlbinlog master |tail
/*!*/;
# at
# : : server id end_log_pos Query thread_id=
exec_time= error_code=
SET TIMESTAMP= /*!*/;
insert into t values( )
/*!*/;
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*! SET PLETION_TYPE=@OLD_PLETION_TYPE*/;
在master 上 master 最后值是 而在slave 却是 Slave 的Log_Pos比master 大 应该是在断电的时候 binlog 有部分没有及时写入磁盘 但从库已经读入 我们需要在slave 执行change maseter 操作 MASTER_LOG_FILE 在原来的基础上加 Log_Pos 为
mysql> stop slave;
Query OK rows affected ( sec)
mysql> CHANGE MASTER TO MASTER_HOST= MASTER_PORT =
MASTER_USER
= slave MASTER_PASSWORD= nslave MASTER_LOG_FILE= master MAST
ER_LOG_POS = ;
Query OK rows affected ( sec)
mysql> start slave;
Query OK rows affected ( sec)
mysql> show slave status\\G;
*************************** row ***************************
Slave_IO_State:Waiting for master to send event
Master_Host:
Master_User: slave
Master_Port:
Connect_Retry:
Master_Log_File: master
Read_Master_Log_Pos:
Relay_Log_File: mysql relay bin
Relay_Log_Pos:
Relay_Master_Log_File: master
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
在这次断电的切换过程中 将会有 减去 条binlog 操作在slave 存在 而在masert 没有 在后面的复制中可能会产生错误 不过这些错误影响不大 如果对数据的同步要求很严格 可以在主库添加参数sync_binlog= 这样最多将只会有 条数据错误 不过这样将影响mysql 写性能
heartbeat crm 常用命令
查看资源状态
#crm_mon –i
查看节点资源
#crm_resource L
查看资源在那个节点上运行
# crm_resource W r mysqld_
启动/停止资源
#crm_resource r mysqld_ p target_role v started
#crm_resource r mysqld _ p target_role v stopped
将资源组从当前节点转移到另个节点
#crm_resource M r group_
将资源组转移到指定节点
#crm_resource M r group_ H ha
允许资源组回到正常的节点
#crm_resource U r group_
将资源从CRM 中删除
#crm_resource D r mysqld_ t primitive
将资源组从CRM 中删除
#crm_resource D –r group_ t group
将资源从CRM 中禁用
#crm_resource p is_managed r mysqld_ t primitive v off
将资源从新从CRM 中启用
#crm_resource p is_managed r mysqld _ t primitive v on
重启资源
#crm_resource C H ha r mysqld_
检查所有节点上未在CRM 中的资源
#crm_resource P
检查指定节点上未在CRM 中的资源
#crm_resource P H ha
检查所有节点上未在CRM 中的资源
#crm_resource P
检查指定节点上未在CRM 中的资源
#crm_resource P H ha
八 讨论
对写要求不是很高的应用 我觉得可以考虑用NFS 来代替共享存储设备 结构图如下
将数据文件放在NFS 上 这样几台廉价的PC 机就能实现 相对成本降低
参数sync_binlog= 对写的性能有多少影响 个人始终觉得会带来很大的写性能问题 在数据完整和性能之间做个平衡 有得有失吧
cha138/Article/program/MySQL/201311/29350相关参考
MySql通过二进制日志文件恢复数据 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Mysql配
知识大全 通过 Perl 存取 mSQL 和 MySQL 的内容
通过Perl存取mSQL和MySQL的内容 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! )知识
知识大全 Linux下通过C++语言代码来操作MySQL数据库
Linux下通过C++语言代码来操作MySQL数据库 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
知识大全 PB通过ODBC访问MySQL数据库时报错的处理方法
PB通过ODBC访问MySQL数据库时报错的处理方法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
配置最新的PHP加MYSQL服务器完全版 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 通过一个
让MYSQL彻底支持中文 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 提要系统自带的mysql
如何才能让MySQL与OpenOffice共舞 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 一
分区和负载均衡让MySQL更大更好 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!lishixinz
高性能MySQL:通过性能剖析进行优化 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 通过性能剖
:mysql是我们使用最多的数据库如果在日常中正确的对mysql数据进行备份下面我们就来做这事通过脚本来实现 ##########################################