mysql 主主互备实现
2016-03-27 15:09
721 查看
今天星期天,么事就写个MYSQL的主主架构的博客,原理如下图,不是我画的网上找的。
一: 在每个节点安装mysql数据库:
《1》到官网去下载最新的yum仓库,并安装
http://dev.mysql.com/downloads/repo/yum/
yum install mysql-community-server
《2》用第三方yum
1、导入第三方源webtatic
rpm -Uvh http://repo.webtatic.com/yum/el6/latest.rpm
2、如果已安装低版本的mysql就删除
yum remove mysql
mysql-*
3、安装libmysqlclient15
yum install libmysqlclient15
--enablerepo=webtatic
4、安装mysql5.5
yum
install mysql55 mysql55-server --enablerepo=webtatic
《3》安装MariaDB 我这里用的这安装的
1、vi /etc/yum.repos.d/MariaDB.repo 加个文件在yum仓库中
二、 在Mysql上配置my.cnf
《1》配置MysqlA
innodb_file_per_table = on
skip_name_resolve = on
server-id = 1
log-bin = mysql-bin
relay-log = mysql-relay-bin #单个主从这个可以不写
replicate-wild-ignore-table=mysql.%
replicate-wild-ignore-table=test.%
replicate-wild-ignore-table=information_schema.%
《2》配置MysqlB
server-id = 2
log-bin = mysql-bin ###单个主从这个可以不写,咱们是互相主从都要设置
relay-log = mysql-relay-bin
replicate-wild-ignore-table=mysql.%
replicate-wild-ignore-table=test.%
replicate-wild-ignore-table=information_schema.%
注释:
server-id 是节点的标识,主从节点不能相同,必须唯一。
log-bin 表示开启mysql的binlog日志功能。
‘mysql-bin’表示日志文件的名称,也可以叫aa.log 看你自己了,mysql会在名称后面加上数字,mysql-bin.000001、mysql-bin.000002等日志文件
relay-log 用来定义relay-log日志文件
replicate-wild-ignore-table是复制过程过滤选项,可以过滤不需要的数据库和表,例如 'mysql.%' 表示不复制mysql库
replicate-wild-do_table 明确指定复制那个数据库和表
注意:不要在主库上使用binlog-do-db 或者 binlog-ignore-db 选项,也不要在从库上使用replicate-do-db或者replicate-ignore-db选项,因为这样可能产生跨库更新失败的问题,建 议在从库使用replicate-wild-do-table和replicate-wild-ignore-table连个选项解决复制过滤的问题。
三、 手动同步一次数据,新数据库不用这部分
可以直接锁定 flush tables with read lock; 或者直接关闭数据库打包目录/var/lib/mysql 到从服务器恢复。
tar zcvf /var/lib/mysql.tar.gz /var/lib/mysql 到备的上面解压。
在my.cnf 添加read-only=1开启只读 目的都是保证复制前数据都是一样的。
四、配置MysqlA---MysqlB的主从配置
《1》在MysqlA创建复制用户并且授权。
grant replication slave on *.* to 'tao'@'192.168.48.%' identified by 'www.daxia.help';
《2》在B服务器上设置主服务器信息:
change master to \
master_host='192.168.48.129',
master_user='tao',
master_password='www.daxia.help',
master_log_file='mysql-bin。000005'
master_log_pos=405;
五、配置MysqlB---MysqlA的主从配置《1》在MysqlA创建复制用户并且授权。 grant replication slave on *.* to 'tao'@'192.168.48.%' identified by 'www.daxia.help';《2》在A服务器上设置主服务器信息: change master to \ master_host='192.168.48.132', master_user='tao', master_password='www.daxia.help', master_log_file='mysql-bin' master_log_pos=106;
注意: 我在主上执行了自己同步自己了 要取消用这个命令 change master to master_host=' ';
六:在MysqlA和MysqlB上测试数据的复制情况
《2》在MysqlB上建立库,表和插入数据在MysqlA上查看;
《3》我在test下面建立了一个表,是不能同步过来的,说明过滤也对的。
七:配置keepalived实现mysql双主高可用。
keepalived 配置主和从的配置就是priority 优先级一个100一个90 从的取消nopreempt选项即可。
《1》登录
《2》建立库和表看看各个节点的信息是否正确。
在远程上建立信息:
在MysqlB和MYSQLA上查看都有信息:
《3》把mysqlB弄故障,看切换的正确可行:
注意的问题:
经过我测试我,我的监控脚本这样写的把那个weight选项取消就可以使用高可用,要是加上就会出现在mysqlA复制出错,vip就会漂移到mysqlB上面,这时把MysqlA修复好后加上nopreempt选项就不会抢占,当这时候Mysqlb的复制出问题了就不会漂移VIP因为那个weight优先级的问题,搞了很久也不行,反正把它取消就可以使用咱们的高可用,你要是能解决请下面留言给我,咱们一起学习。
九、用shell脚本的方法配置Keepalived,连个就是下面检测自己的ip3306端口就行我贴一个主机的(注意这个方法没有上面的好因为只能检测3306端口不知道slave的情况,测试直接关掉MYSQL)
配置完成!!!
主机作用 | 操作系统 | mysql版本 | 对应IP | vip数据库 |
mysqlA(主) | centos6.4 | mysql 5.5.48 | 192.168.48.129 | 192.168.48.126 |
mysqlB(备) | centos6.4 | mysql 5.5.48 | 192.168.48.132 |
《1》到官网去下载最新的yum仓库,并安装
http://dev.mysql.com/downloads/repo/yum/
yum install mysql-community-server
《2》用第三方yum
1、导入第三方源webtatic
rpm -Uvh http://repo.webtatic.com/yum/el6/latest.rpm
2、如果已安装低版本的mysql就删除
yum remove mysql
mysql-*
3、安装libmysqlclient15
yum install libmysqlclient15
--enablerepo=webtatic
4、安装mysql5.5
yum
install mysql55 mysql55-server --enablerepo=webtatic
《3》安装MariaDB 我这里用的这安装的
1、vi /etc/yum.repos.d/MariaDB.repo 加个文件在yum仓库中
[mariabd] name=MariaDB baseurl=http://yum.mariadb.org/5.5.48/centos6-x86/ gpgkey=http://yum.mariadb.org/RPM-GPG-KEY-MariaDB gpgcheck=1 yum install -y MariaDB-server MariaDB-client ##安装数据库 service mysql start ##启动服务 GRANT ALL PRIVILEGES ON *.* TO root@"%" IDENTIFIED BY "123456";##设置ROOT密码; update mysql.user set authentication_string=password('123456') where user='root' ;##mysql5.7这样更新密码。 flush privileges;##刷新《4》下面是我安装的数据库的一些信息
二、 在Mysql上配置my.cnf
《1》配置MysqlA
innodb_file_per_table = on
skip_name_resolve = on
server-id = 1
log-bin = mysql-bin
relay-log = mysql-relay-bin #单个主从这个可以不写
replicate-wild-ignore-table=mysql.%
replicate-wild-ignore-table=test.%
replicate-wild-ignore-table=information_schema.%
《2》配置MysqlB
server-id = 2
log-bin = mysql-bin ###单个主从这个可以不写,咱们是互相主从都要设置
relay-log = mysql-relay-bin
replicate-wild-ignore-table=mysql.%
replicate-wild-ignore-table=test.%
replicate-wild-ignore-table=information_schema.%
注释:
server-id 是节点的标识,主从节点不能相同,必须唯一。
log-bin 表示开启mysql的binlog日志功能。
‘mysql-bin’表示日志文件的名称,也可以叫aa.log 看你自己了,mysql会在名称后面加上数字,mysql-bin.000001、mysql-bin.000002等日志文件
relay-log 用来定义relay-log日志文件
replicate-wild-ignore-table是复制过程过滤选项,可以过滤不需要的数据库和表,例如 'mysql.%' 表示不复制mysql库
replicate-wild-do_table 明确指定复制那个数据库和表
注意:不要在主库上使用binlog-do-db 或者 binlog-ignore-db 选项,也不要在从库上使用replicate-do-db或者replicate-ignore-db选项,因为这样可能产生跨库更新失败的问题,建 议在从库使用replicate-wild-do-table和replicate-wild-ignore-table连个选项解决复制过滤的问题。
三、 手动同步一次数据,新数据库不用这部分
可以直接锁定 flush tables with read lock; 或者直接关闭数据库打包目录/var/lib/mysql 到从服务器恢复。
tar zcvf /var/lib/mysql.tar.gz /var/lib/mysql 到备的上面解压。
在my.cnf 添加read-only=1开启只读 目的都是保证复制前数据都是一样的。
四、配置MysqlA---MysqlB的主从配置
《1》在MysqlA创建复制用户并且授权。
grant replication slave on *.* to 'tao'@'192.168.48.%' identified by 'www.daxia.help';
《2》在B服务器上设置主服务器信息:
change master to \
master_host='192.168.48.129',
master_user='tao',
master_password='www.daxia.help',
master_log_file='mysql-bin。000005'
master_log_pos=405;
五、配置MysqlB---MysqlA的主从配置《1》在MysqlA创建复制用户并且授权。 grant replication slave on *.* to 'tao'@'192.168.48.%' identified by 'www.daxia.help';《2》在A服务器上设置主服务器信息: change master to \ master_host='192.168.48.132', master_user='tao', master_password='www.daxia.help', master_log_file='mysql-bin' master_log_pos=106;
注意: 我在主上执行了自己同步自己了 要取消用这个命令 change master to master_host=' ';
六:在MysqlA和MysqlB上测试数据的复制情况
《2》在MysqlB上建立库,表和插入数据在MysqlA上查看;
《3》我在test下面建立了一个表,是不能同步过来的,说明过滤也对的。
七:配置keepalived实现mysql双主高可用。
keepalived 配置主和从的配置就是priority 优先级一个100一个90 从的取消nopreempt选项即可。
! Configuration File for keepalived global_defs { notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id LVS_DEVEL } Vrrp_script check_mysqld { script "/etc/keepalived/check_slave.pl 127.0.0.1" interval 2 weight 21 } vrrp_instance HA_1 { state BACKUP ### 在MYSQLA和MysqlB上都配置为BACKUP interface eth0 virtual_router_id 80 priority 100 advert_int 2 nopreempt ## 不抢占模式,只在优先权高的服务器上设置,优先级第的可以不设置 authentication { auth_type PASS auth_pass daxia.help } track_script { check_mysqld } virtual_ipaddress { 192.168.48.126 } }check_slave.pl脚本如下:
#!/usr/bin/perl -w use DBI; use DBD::mysql; # CONFIG VARIABLES $SBM = 120; $db = "mysql"; $host = $ARGV[0]; $port = 3306; $user = "root"; $pw = "123456"; # SQL query $query = "show slave status"; $dbh = DBI->connect("DBI:mysql:$db:$host:$port", $user, $pw, { RaiseError => 0,PrintError => 0 }); if (!defined($dbh)) { exit 1; } $sqlQuery = $dbh->prepare($query); $sqlQuery->execute; $Slave_IO_Running = ""; $Slave_SQL_Running = ""; $Seconds_Behind_Master = ""; while (my $ref = $sqlQuery->fetchrow_hashref()) { $Slave_IO_Running = $ref->{'Slave_IO_Running'}; $Slave_SQL_Running = $ref->{'Slave_SQL_Running'}; $Seconds_Behind_Master = $ref->{'Seconds_Behind_Master'}; } $sqlQuery->finish; $dbh->disconnect(); if ( $Slave_IO_Running eq "No" || $Slave_SQL_Running eq "No" ) { exit 1; } else { if ( $Seconds_Behind_Master > $SBM ) { exit 1; } else { exit 0; } }八、进行测试:
《1》登录
《2》建立库和表看看各个节点的信息是否正确。
在远程上建立信息:
在MysqlB和MYSQLA上查看都有信息:
《3》把mysqlB弄故障,看切换的正确可行:
注意的问题:
经过我测试我,我的监控脚本这样写的把那个weight选项取消就可以使用高可用,要是加上就会出现在mysqlA复制出错,vip就会漂移到mysqlB上面,这时把MysqlA修复好后加上nopreempt选项就不会抢占,当这时候Mysqlb的复制出问题了就不会漂移VIP因为那个weight优先级的问题,搞了很久也不行,反正把它取消就可以使用咱们的高可用,你要是能解决请下面留言给我,咱们一起学习。
vrrp_script check_mysqld { script "/etc/keepalived/mysql.pl 127.0.0.1" interval 2 }还有就是在写检测脚本的时候先进行运行测试:
[root@test1 keepalived]# ./mysql.pl 127.0.0.1 [root@test1 keepalived]# echo $? 0正常就是0不正常就是1测试正常在上还要安装依赖的# yum install perl-DBI perl-DBD-MySQL -y确保这些包也安装了要调用这些库。
九、用shell脚本的方法配置Keepalived,连个就是下面检测自己的ip3306端口就行我贴一个主机的(注意这个方法没有上面的好因为只能检测3306端口不知道slave的情况,测试直接关掉MYSQL)
! Configuration File for keepalived global_defs { notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id LVS_DEVEL } vrrp_instance HA_1 { state BACKUP interface eth0 virtual_router_id 80 priority 100 advert_int 2 nopreempt authentication { auth_type PASS auth_pass daxia.help } virtual_ipaddress { 192.168.48.126 } virtual_server 192.168.48.126 3306 { ///检测自己的3306端口不通就执行下面的Mysql.sh脚本重启keepalived服务让vip飘到另外的机器上去 delay_loop 6 lb_algo wrr lb_kind DR nat_mask 255.255.255.0 persistence_timeout 50 real_server 192.168.48.129 3306 { weight 1 notify_down /etc/keepalived/mysql.sh TCP_CHECK { connect_timeout 10 nb_get_retry 3 connect_port 3306 } } }mysql.sh脚本如下
[root@test1 keepalived]# vi mysql.sh #!/bin/bash /etc/init.d/keepalived stop sleep 10 /etc/init.d/keepalived start我停止mysql 就会触发脚本让vip飘到另外一个机器上下面是keepalive的信息:
配置完成!!!
相关文章推荐
- mysql服务安装
- MYSQL的常用命令和增删改查语句和数据类型
- Bison executable not found in PATH by mysql install
- mysql5.6.28 备份主要参数学习
- mysql优化 之 表设计注意事项
- mysql中<>与null值不能比较
- JSP proxool+mysql数据库连接池配置
- windows下mysql忘记root密码的解决方法
- [MySQL] 参数: innodb_flush_log_at_trx_commit和sync_binlog
- 使用c3p0连接mysql数据库
- mysql查询
- ”伪集群“导致的Hibernate主键increment生成策略异常
- MySQL中自己不太常用的命令
- mysql主从复制 详解
- mysql5.5 对触发器,函数,存储引擎,事件进行主从复制情况.(转)
- MySQL DateFormat函数
- 关于Dovecot 与 mysql 安装的一场巨汗。
- [mysql] mysqldump 导出数据库表
- Windows安装Mysql和示例数据库
- mysql例子