一、安装mysql
各种方式太多了
二、摘录自:https://linux.cn/thread-14135-1-1.html
1)首先在DB1上my.cnf 中[mysqld] 字段中添加如下内容:
server-id = 1 //数据库ID号, 为1时表示为Master,其中master_id必须为1到232–1之间的一个正整数值;
log-bin=mysql-bin //启用二进制日志;
relay-log=mysql-relay-bin //用来定义relay-log日志文件命名格式
replicate-wild-ignore-table=mysql.% //replicate-wild-ignore-table是个过滤复制选项,可以过滤不需要复制的数据库
replicate-wild-ignore-table=test.% //mysql.%表示不复制mysql库下的所有对象
replicate-wild-ignore-table=infomation_schema.% //与此对应的是/replicate-wild-do-table,用来指定需要复制的数据库或表
//这里需要注意的是,不要在主库上使用binlog-do-db或binlog-ignore-db选项,也不要在从库上使用replicate-do-db或replicate-ignore-db选项;因为这样可能产生跨库更新失败的问题。
//推荐从库上使用replicate-wild-ignore-table和replicate-wild-do-table两个选项来解决复制过滤问题。
2)然后修改DB2上mysql配置文件my.cnf
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=infomation_schema.%
3)手动同步数据库
//如果DB1上已有数据,那么在执行主主互备之前,需要将DB1和DB2上的两个mysql的数据保持同步,首先在DB1上备份mysql数据,执行如下sql语句:
mysql>FLUSH TABLES WITH READ LOCK; //注意,执行完这个命令后,不要退出这个终端,否则这个锁就失效了。
#cd /var/lib
#tar zcvf mysql_bak.tar.gz mysql
#scp mysql_bak.tar.gz DB2:/var/lib //将数据传到DB2后,依次重启DB1和DB2上的MySQL
4)创建复制用户,并授权
mysql>grant replication slave on *.* to [email protected] identified by ‘repl_user‘ ;
mysql>show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 106 | | |
+------------------+----------+--------------+------------------+
a)然后在DB2上将DB1设为自己的主服务器,操作如下:
mysql>CHANGE MASTER TO MASTER_HOST=‘192.168.1.11‘,MASTER_USER=‘repl_user‘, MASTER_PASSWORD=‘repl_user‘,MASTER_LOG_FILE=‘mysql-bin.000001‘,MASTER_LOG_POS=106;
//注意,MASTER_LOG_FILE和MASTER_LOG_POS两个选项,这两个选项的值刚好是在DB1上通过show master status查询到的结果;
b)接着就可以在DB2上启动slave服务了,sql命令如下:
mysql>start slave;
//可通过sql语句 show slave status\G; 查询DB2上slave的运行状态详细信息;
到这里,从DB1到DB2的MySQL主从复制就已经完成。接下来开始配置从DB2到DB1的MySQL主从。
5)首先在DB2上创建复制用户;
mysql>grant replication slave on *.* to [email protected] identified by ‘repl_user‘ ;
mysql>show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 106 | | |
+------------------+----------+--------------+------------------+
a)然后在DB1上将DB2设为自己的主服务器,操作如下:
mysql>CHANGE MASTER TO MASTER_HOST=‘192.168.1.22‘,MASTER_USER=‘repl_user‘, MASTER_PASSWORD=‘repl_user‘,MASTER_LOG_FILE=‘mysql-bin.000001‘,MASTER_LOG_POS=106;
//注意,MASTER_LOG_FILE和MASTER_LOG_POS两个选项,这两个选项的值刚好是在DB1上通过show master status查询到的结果;
b)接着就可以在DB1上启动slave服务了,sql命令如下:
mysql>start slave;
//可通过sql语句 show slave status\G; 查询DB1上slave的运行状态详细信息;
至此,MySQL双主互备模式的主从复制就已配置完毕。
6)配置keepalived实现MySQL双主高可用
在进行高可用配置之前,首先需要在DB1和DB2上安装keepalived软件。关于keepalived安装,这里就不在详细说明,直接进入keepalived配置过程。
a)下面是DB1服务器上/etc/keepalived/keepalived.conf文件的内容:
global_defs {
notification_email {
[email protected]
[email protected]
[email protected]
}
notification_email_from [email protected]
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id MySQLHA_DEVEL
}
vrrp_script check_mysqld {
script "/etc/keepalived/mysqlcheck/check_slave.pl 127.0.0.1" #检测MySQL复制状态的脚本
interval 2
weight 21
}
vrrp_instance HA_1 {
state BACKUP #在DB1上和DB2上都设置为BACKUP
interface eth0
virtual_router_id 80
priority 100
advert_int 2
nopreempt #不抢占模式,只在优先级高的机器上设置即可;优先级低的可不用设置。
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
check_mysqld
}
virtual_ipaddress {
192.168.1.33/24 dev eth0 #MySQL的对外服务IP,即VIP。
}
}
其中,/etc/keepalived/mysqlcheck/check_slave.pl文件的内容如下:
#!/usr/bin/perl -w
use DBI;
use DBD::mysql;
#config variables
$SBM = 120;
$db = "hamysql"
$host = $ARGV[0];
$port = 3306;
$user = "root";
$pw = "root"
#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;
}
}
//这是用Perl写的检测mysqlMySQL复制状态脚本,只需修改文件中的MySQL数据库、数据的端口号、用户名和密码可直接使用;并且要保证此文件有可执行权限。
b)接着将DB1上的keepalived.conf文件和check_slave.pl文件拷贝到DB2上对应的位置。
并修改DB2上的keepalived.conf文件中的priority值为80,由于配置的是不抢占模式,因此,还需去掉nopreempt选项。
在完成配置后,分别在DB1上和DB2上启动keepalived服务,在正常情况下VIP地址应该运行在DB1上。
三、注意点
如果mysql是拷贝的 那么uuid会有问题 需要修改,找到my.cnf中datadir所指目录,修改auto.cnf中service-uuid的值。