一、主主数据同步,为了防止丢失,可全量备份。
$ mysqldump —all-databases -uroot -p > mysql.sql
二、配置MySQL主主同步
主主同步就是两台机器互为主的关系,在任何一台机器上写入都会同步。
创建同步账号
1. 分别在两台机器上配置同步账号
master1机器上:
mysql> grant all privileges on *.* to 'repl'@'%' identified by '123456';
mysql> flush privileges;
master2机器上:
mysql> grant all privileges on *.* to 'repl'@'%' identified by '123456';
mysql> flush privileges;
2. 配置数据库参数
master1机器上:
关闭mysql
$ service mysql stop
更改配置文件/etc/my.cnf
$ vi /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
server-id=1
log-bin=mysql-bin
relay_log=mysql-relay-bin
binlog_format=ROW
report-host = master2
report-user = repl
report-password = 123456
report-port = 3306
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
其中标红为新增内容:
server-id=1
log-bin=mysql-bin
binlog_format=ROW
report-host = master2
report-user = repl
report-password = 123456
report-port = 3306
Log-bin:启动二进制日志文件
Server-id:本机数据库ID(和)
Binlog_format:一共有三种复制方式:ROW\STATEMENT\MIXED,默认是STATEMENT
report-host,report-user,report-password,report-port为master复制的主机名,用户,密码以及端口号。
启动mysql
$ service mysql start
Master2机器上:
关闭mysql
$ service mysql stop
更改配置文件/etc/my.cnf
$ vi /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
server-id=1
log-bin=mysql-bin
relay_log=mysql-relay-bin
binlog_format=ROW
report-host = master2
report-user = repl
report-password = 123456
report-port = 3306
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
启动mysql
$ service mysql start
3. 设置master2同步master1
master1机器上:
master2机器上:
#设置master2同步master1数据
mysql> change master to master_host='master1IP', master_port=3306, master_user='repl',master_password='123456', master_log_file='binlog.000003',master_log_pos=365;
#开启同步
mysql> start slave;
#执行这命令后 注意观察下面这两个参数,必须要都是yes才行
mysql> show slave status \G
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
master_host表示是master1的IP
master_user表示主库master1上允许同步的用户
maser_password表示同步用户的密码
master_log_file表示从哪个binlog文件开始同步
master_log_pos表示从该binlog文件的那个pos节点位置开始同步
我们查看同步是否主要是查看Slave_IO_Running与Slave_SQL_Running选项。如果正常同步,这两选必须同时为YES。
如果Slave_IO_Running为NO,说明可能是从库与主库的网络不通。
如果Slave_SQL_Running为NO,说明很可能是从库与主库的数据不一致。
如果Slave_IO_Running: Connecting,可能是同步的用户密码写错了。
同样的 反过来做相同操作
4. 设置master1同步master2
master2机器上:
master1机器上:
mysql> change master tomaster_host='10.1.1.21', master_port=3306, master_user='repl',master_password='123456', master_log_file='binlog.000004',master_log_pos=207;
mysql> start slave;
mysql> show slave status \G #执行这命令后 注意观察下面这两个参数,必须要都是yes才行
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
介此,主主同步打造完成,可以简单测试一下,分别在两个机器上写数据 看看会不会同步到另一台机器上
PS:如果报错Slave_IO_Running: NO 可以检查同步的账号是否创建正常!
三、安装keepalived 并设置监控
keepalived是安装在两台MySQL服务器上的
首先安装keepalived 过程不解释就正常解压安装就好
安装后配置 vim /etc/keepalived/keepalived.conf 内容如下
master1(10.1.1.20)的配置文件
! 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 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state backup #两台配置此处均是BACKUP
interface eth0
virtual_router_id 51
priority 100 #优先级,另一台改为90
advert_int 1
nopreempt #不抢占,只在优先级高的机器上设置即可,优先级低的机器不设置
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.1.1.25
}
}
virtual_server 10.1.1.25 3306 {
delay_loop 6
lb_algo wrr
lb_kind DR
persistence_timeout 50 #会话保持时间
protocol TCP
real_server 10.1.1.20 3306 {
weight 3
notify_down /tmp/nimei.sh #检测到mysql服务挂了就执行这个脚本(脚本要自己写哈)
TCP_CHECK {
connect_timeout 10 #连接超时时间
nb_get_retry 3 #重连次数
delay_before_retry 3 #重连间隔时间
connect_port 3306 #健康检查端口
}
}
}
master2(10.1.1.21)的配置文件
! 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 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state backup
interface eth0
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.1.1.25
}
}
virtual_server 10.1.1.25 3306 {
delay_loop 6
lb_algo wrr
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 10.1.1.21 3306 {
weight 3
notify_down /tmp/nimei.sh
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 3306
}
}
}
编写监控mysql服务是否挂了的脚本,按照上面配置文件的位置编写脚本。
vim /tmp/nimei.sh
#!/bin/sh
pkill keepalived
脚本很简单就一句,目的是当keepalived检测到mysql服务挂了之后触发这个脚本,杀死keepalived进程,让另一台机器接管好 修改后启动keeplived服务
介此整个集群搭建完成
四、测试
找一台机器用虚拟ip连接mysql
这样成功连上了,然后你可以任意关闭某台机器,或者某台机器的mysql服务,看看还能不能连上!!