MySQL的主主互备结合KEEPALIVED实现高可用
试验环境:localhost102和localhost105互为主备
主: localhost102 192.168.0.102(CentOS6.6)
从属(主的备):localhost105 192.168.0.102(CentOS6.6)
从属:localhost107 192.168.0.107(CentOS6.6)是 localhost102 的slave
VIP: 192.168.1.208
Keepalived: keepalived-1.2.20
该过程的第一部分就是master记录二进制日志。在每个事务更新数据完成之前,master在二日志记录这些改变。MySQL将事务写入二进制日志。在事件写入二进制日志完成后,master通知存储引擎提交事务。
下一步就是slave将master的binary log拷贝到它自己的中继日志。首先,slave开始一个工作线程——I/O线程。I/O线程在master上打开一个普通的连接,然后开始binlog dump process。Binlog dump process从master的二进制日志中读取事件,如果已经同步了master,它会睡眠并等待master产生新的事件。I/O线程将这些事件写入中继日志。
SQL slave thread(SQL从线程)处理该过程的最后一步。SQL线程从中继日志读取事件,并重放其中的事件而更新slave的数据,使其与master中的数据一致。只要该线程与I/O线程保持一致,中继日志通常会位于OS的缓存中,所以中继日志的开销很小。
主主同步就是两台机器互为主的关系,在任何一台机器上写入都会同步。
若mysql主机开启了防火墙,需要关闭防火墙或创建规则。
1、修改MySQL配置文件
两台MySQL均要开启binlog日志功能,开启方法:在MySQL配置文件[MySQLd]段中加上log-bin=MySQL-bin选项,两台MySQL的server-ID不能一样
MySQL的主主互备模式配置,只有一个主(写),另外一个备是用来备用的主(读)。然后也可以加多个slave机器(读)。
情况1:MASTER和salve都是新库的情况,如果MASTER不是新库,有数据的话,就使用MySQLdump或者其他备
份工具flush tables with read lock;备份完成,然后恢复salve库之后。再搭建主主复制
1.1 master的my.CNF文件
vi /etc/my.cnf
[mysqld]
log-bin = mysql-bin
server-id=1111
修改之后保存,并重启服务
1.2 sal replive的my.CNF文件
vi /etc/my.cnf
[mysqld]
log-bin = mysql-bin
server-id=2222
修改之后保存,并重启服务
保证slave和master的server的ID不一样
1.3确保主主的二台机器开启了binlog日志功能
[root@localhost102 softwares]#
mysql> show variables like "%log_bin%";
+---------------------------------+----------------------------------+
| Variable_name | Value |
+---------------------------------+----------------------------------+
| log_bin | ON |
| log_bin_basename | /usr/local/mysql/mysql_bin |
| log_bin_index | /usr/local/mysql/mysql_bin.index |
| log_bin_trust_function_creators | OFF |
| log_bin_use_v1_row_events | OFF |
| sql_log_bin | ON |
+---------------------------------+----------------------------------+
6 rows in set (0.01 sec)
[mysql@localhost105 ~]
mysql> show variables like "%log_bin%";
+---------------------------------+----------------------------------+
| Variable_name | Value |
+---------------------------------+----------------------------------+
| log_bin | ON |
| log_bin_basename | /usr/local/mysql/mysql_bin |
| log_bin_index | /usr/local/mysql/mysql_bin.index |
| log_bin_trust_function_creators | OFF |
| log_bin_use_v1_row_events | OFF |
| sql_log_bin | ON |
+---------------------------------+----------------------------------+
6 rows in set (0.00 sec)
1.4创建用户用于传输副本,并且配置192.168.0.102和192.168.0.105互为主。实现主主的功能。
1.4.1将192.168.0.102设为192.168.0.105的主服务器。
在192.168.0.102上新建用户,这个用户可以了解主备机器,需要有replication的权限
没有反映。连接不上
用mysql客服端连接到master主节点,创建用户repl并授予权限
[root@localhost102 softwares]# hostname -i
192.168.0.102
[root@localhost102 ~]# mysql -uroot -p --socket=/usr/local/mysql/mysql.sock
mysql> create user repl identified by '123456';
Query OK, 0 rows affected (0.05 sec)
mysql> grant replication slave on *.* to repl;
Query OK, 0 rows affected (0.07 sec)
获取master上binary log的坐标(检查点)
选中这个坐标,相当于检查点,在这个检查点之后的数据变化都会写到binary log文件里面,
而这个检查点之前的数据不会写到bin log文件里面。会被忽略。
注意:在获取检查点的必须要停止所有在执行的SQL语句,并将缓存写人到磁盘
1 :打开master节点上,执行flush tables with read lock 语句来将所有的表缓存写到磁盘并阻塞随后的
写人操作
mysql> flush tables with read lock;
Query OK, 0 rows affected (0.01 sec)
2: 执行show master status 语句来确定当前的bin log文件名和检查点的位置
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql_bin.000002 | 839 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
并记录相关数据,mysql_bin.000002 position=839等等信息
3:得到bin log的检查点后,可以将表解锁
MySQL>unlock tables;
在192.168.0.105上,将192.168.0.102设置为自己的主服务器
[mysql@localhost105 ~]$ hostname -i
192.168.0.105
[mysql@localhost105 ~]$ mysql -uroot -p --socket=/usr/local/mysql/mysql.sock --port=3306
Enter password:
连接到slave,执行change master to 命令来告诉slave如何进行连接到master,并找到bin log文件,这里假设主节点的
IP为10.63.62.175,。只会复制mysql_bin.000002日志中839之后产生的日志。之前的日志不会复制。由于二台机器都是新
的,没有数据。所以不用全备份把数据同步。再搭建复制。
MySQL> change master to master_host = '192.168.0.102',master_user = 'repl',master_password ='123456',
master_log_file ='mysql_bin.000002', master_log_pos=839;
Query OK, 0 rows affected, 2 warnings (0.08 sec)
开启备库192.168.0.105复制
mysql> start slave;
Query OK, 0 rows affected (0.12 sec)
查看状态,如果Slave_IO_Running: 和Slave_SQL_Running: 进程状态是yes,Last_IO_Error没有错误等等信息就
可以判断备的复制已经配置好了。只要主更新数据的命令,那么备库就会接受一样的命令。
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.0.102
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql_bin.000002
Read_Master_Log_Pos: 839
Relay_Log_File: localhost105-relay-bin.000002
Relay_Log_Pos: 320
Relay_Master_Log_File: mysql_bin.000002
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 839
Relay_Log_Space: 534
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 10
Master_UUID: f78533a4-7751-11e7-9a27-000c29b31319
Master_Info_File: /usr/local/mysql/data/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
1 row in set (0.00 sec)
在192.168.0.102上,将192.168.0.105设为自己的主服务器。
在192.168.0.105上建binlog传输的用户
[mysql@localhost105 ~]$
mysql> create user repl identified by '123456';
Query OK, 0 rows affected (0.05 sec)
mysql> grant replication slave on *.* to repl;
Query OK, 0 rows affected (0.07 sec)
mysql> show status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql_bin.000003 | 747 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
在192.168.0.102机器上,将192.168.0.105设为自己的主服务器。把192.168.0.105机器的binlog状态信息配
置在192.168.0.102上。这样192.168.0.102就知道从那里开始接受192.168.0.105的更新命令。
[mysql@localhost102 ~]$
mysql> change master to master_host = '192.168.0.105',master_user = 'repl',master_password ='123456',
master_log_file ='mysql_bin.000003', master_log_pos=747;
Query OK, 0 rows affected, 2 warnings (0.10 sec)
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Connecting to master
Master_Host: 192.168.0.105
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql_bin.000003
Read_Master_Log_Pos: 747
Relay_Log_File: localhost102-relay-bin.000001
Relay_Log_Pos: 4
Relay_Master_Log_File: mysql_bin.000003
Slave_IO_Running: Connecting
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 747
Relay_Log_Space: 154
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 2003
Last_IO_Error: error connecting to master 'repl@192.168.0.105:3306' - retry-time: 60 retries: 1
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 0
Master_UUID:
Master_Info_File: /usr/local/mysql/data/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp: 170802 17:47:50
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
1 row in set (0.00 sec)
有错误,Slave_IO_Running: Connecting状态说明io线程有错误,Last_IO_Errno: 2003
Last_IO_Error: error connecting to master 'repl@192.168.0.105:3306'要解决这个错误。
初步怀疑应该是防火墙的问题。
2.排查过程
(1) 在配置文件中排查了与bindaddress和skip-networking与相关参数后,均没有配置;
(2) 于是排查服务器的防火墙,发现防火墙处于开启状态
(3) 关闭防火墙后,重新执行start slave;发现主从配置成功
先看状态
[root@localhost105 ~]# service iptables status;
[mysql@localhost105 ~]$ /etc/init.d/iptables stop
再次查看状态:
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.0.102
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql_bin.000002
Read_Master_Log_Pos: 839
Relay_Log_File: localhost105-relay-bin.000002
Relay_Log_Pos: 320
Relay_Master_Log_File: mysql_bin.000002
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 839
Relay_Log_Space: 534
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 10
Master_UUID: f78533a4-7751-11e7-9a27-000c29b31319
Master_Info_File: /usr/local/mysql/data/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
1 row in set (0.00 sec)
状态Slave_IO_Running: Yes和状态Slave_SQL_Running: Yes都是yes,都是正常状态,Last_IO_Error: 为空,没有错误。
2.1互为主的配置已经完成,现在需要进行相互测试,看数据是否会同步。如上述均正确配置,现在任何一
台MySQL上更新数据都会同步到另一台MySQL。
在192.168.0.102机器上创建一个testdb数据库,看192.168.0.105是否也会创建这个数据库。
mysql> create database testdb;
Query OK, 1 row affected (0.01 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| testdb |
+--------------------+
5 rows in set (0.00 sec)
在192.168.0.105机器上查看,如果有testdb数据库。
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| testdb |
+--------------------+
5 rows in set (0.00 sec)
在192.168.0.105机器上创建一个testdb_new数据库,看192.168.0.102是否也会创建这个数据库。
mysql> create database testdb_new;
Query OK, 1 row affected (0.01 sec)
mysql>show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| testdb |
| testdb_new |
+--------------------+
6 rows in set (0.00 sec)
查看192.168.0.102是否有test_new这个数据库
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| testdb |
+--------------------+
5 rows in set (0.00 sec)
并没有test_new这个数据库,说明有问题,
mysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
Slave_IO_State: Connecting to master
Master_Host: 192.168.0.105
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql_bin.000003
Read_Master_Log_Pos: 747
Relay_Log_File: localhost102-relay-bin.000001
Relay_Log_Pos: 4
Relay_Master_Log_File: mysql_bin.000003
Slave_IO_Running: Connecting
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 747
Relay_Log_Space: 368
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 2003
Last_IO_Error: error connecting to master 'repl@192.168.0.105:3306' - retry-time: 60 retries: 37
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 0
Master_UUID:
Master_Info_File: /usr/local/mysql/data/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp: 170802 18:23:55
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
1 row in set (0.00 sec)
应该还是防火墙的问题,这是为什么呢?上面已经配置关闭防火墙了。再找原因。
设置SELINUX=disabled
[root@localhost105 ~]# vi /etc/selinux/config
SELINUX=disabled
[root@localhost102 ~]# vi /etc/selinux/config
SELINUX=disabled
[root@localhost105 ~]# service iptables status;
Table: filter
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
2 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
3 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
4 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
5 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
1 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
[root@localhost105 ~]# service iptables stop
[root@localhost102 ~]# service iptables stop
iptables: Setting chains to policy ACCEPT: filter [ OK ]
iptables: Flushing firewall rules: [ OK ]
iptables: Unloading modules: [ OK ]
[root@localhost105 ~]#
[root@localhost105 ~]#
[root@localhost105 ~]#
[root@localhost105 ~]# service iptables status;
iptables: Firewall is not running.
[root@localhost102 ~]# service iptables status;
iptables: Firewall is not running.
在192.168.0.105上需要然后stop slave; start slave; 就搞定了。这样才关闭防火墙
mysql> stop slave;
Query OK, 0 rows affected (0.00 sec)
mysql> start slave;
Query OK, 0 rows affected (0.07 sec)
然后在查看192.168.0.102是否存在testdb_new数据库。如果存在说明互为主的测试成功!
2.4: 把192.168.0.107加到复制集群里面。有数据的话,要把主的全备份出来,然后就可以加到集群。
注意: 必须要做主库上全备份文件,因为后面要有change master to 命令指定开始复制的位置。
[root@localhost102 opt]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 --host=localhost --port=3306 \
--socket=/usr/local/mysql/mysql.sock --stream=tar --parallel=3 /opt/ |gzip >/opt/mysqlfullback_`date +%F_%H-%M-%S`.tar.gz
准备恢复文件(全备份+增量+binlog)用于全备份是刚刚备份的,现在只需要全备份+binlog就可以恢复
[root@localhost102 opt]# ll
total 1812
-rw-r--r-- 1 root root 678406 Aug 5 16:42 mysqlfullback_2017-08-05_16-42-27.tar.gz
拷贝备份文件到恢复的机器上
[root@localhost102 opt]#scp /opt/mysqlfullback_2017-08-05_16-42-27.tar.gz 192.168.0.107:/opt/backup
在恢复机器操作,开始恢复
1:先要停掉服务
[root@localhost107 ~]# ps -ef | grep mysql
mysql 25601 1 0 Aug04 ? 00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf --user=mysql
mysql 25778 25601 0 Aug04 ? 00:00:14 /usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf --basedir=/usr/local/mysql/ --datadir=/opt/mysql/data --plugin-dir=/usr/local/mysql/lib/plugin --log-error=/usr/local/mysql/mysql3306_error.log --pid-file=/usr/local/mysql/mysql3306.pid --socket=/usr/local/mysql/mysql3306.sock --port=3306
停止服务
[mysql@localhost107 ~]$ /usr/local/mysql/bin/mysqladmin -uroot -p -P3306 shutdown
Enter password:
[root@localhost107 ~]# ps -ef | grep mysql
root 34626 34563 0 04:59 pts/3 00:00:00 grep mysql
2:把原来的MySQL数据目录进行重命名,保留原来的binlog二进制文件,用于恢复最新数据。
[root@localhost107 ~]# cd /opt/mysql
[root@localhost107 mysql]# ll
total 4
drwxr-xr-x. 5 mysql mysql 4096 Aug 5 04:57 data
[root@localhost107 mysql]# mv data data3306_bak
需要创建配置文件的数据目录和加权限,利于恢复
[root@localhost107 mysql]# mkdir data
[root@localhost107 mysql]# chown mysql:mysql data
[root@localhost107 mysql]# ll
total 8
drwxr-xr-x. 2 mysql mysql 4096 Aug 5 05:04 data
drwxr-xr-x. 5 mysql mysql 4096 Aug 5 04:57 data3306_bak
应用日志[root@localhost107 backup]#tar -zxvf mysqlfullback_2017-08-05_16-42-27.tar.gz -C /opt/backup
[root@localhost107 backup]# innobackupex --defaults-file=/etc/my.cnf --apply-log --redo-only --user=root -p /opt/backup
/opt/backup为解压的数据目录,会把数据恢复到配置文件指定的路径中。
[root@localhost107 data]# innobackupex --defaults-file=/etc/my.cnf --copy-back --user=root -p /opt/backup
恢复完成!
[root@localhost107 data]# ls -all /opt/mysql/data
total 122928
drwxr-xr-x. 7 mysql mysql 4096 Aug 5 05:23 .
drwxr-xr-x. 4 mysql mysql 4096 Aug 5 05:04 ..
-rw-r-----. 1 root root 296 Aug 5 05:23 ib_buffer_pool
-rw-r-----. 1 root root 12582912 Aug 5 05:23 ibdata1
-rw-r-----. 1 root root 50331648 Aug 5 05:23 ib_logfile0
-rw-r-----. 1 root root 50331648 Aug 5 05:23 ib_logfile1
-rw-r-----. 1 root root 12582912 Aug 5 05:23 ibtmp1
drwxr-x---. 2 root root 4096 Aug 5 05:23 mysql
drwxr-x---. 2 root root 4096 Aug 5 05:23 performance_schema
drwxr-x---. 2 root root 12288 Aug 5 05:23 sys
drwxr-x---. 2 root root 4096 Aug 5 05:23 testdb
drwxr-x---. 2 root root 4096 Aug 5 05:23 testdb_new
-rw-r-----. 1 root root 21 Aug 5 05:23 xtrabackup_binlog_pos_innodb
-rw-r-----. 1 root root 595 Aug 5 05:23 xtrabackup_info
改属组
[root@localhost107 data]# chown -R mysql:mysql /opt/mysql/data
启动MySQL数据库服务:
[mysql@localhost107~]$ /usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf --user=mysql &
查看进程和启动日志文件,看有没有错误
[mysql@localhost102 ~]$ ps -ef | grep mysql
root 16846 16827 0 05:21 pts/3 00:00:00 mysql -hlocalhsot -p
root 17220 16827 0 05:23 pts/3 00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf
mysql 17394 17220 0 05:23 pts/3 00:00:38 /usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf --basedir=/usr/local/mysql/ --datadir=/usr/local/mysql/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/usr/local/mysql/mysql_error.log --pid-file=/usr/local/mysql/mysql.pid --socket=/usr/local/mysql/mysql.sock --port=3306
验证数据
[mysql@localhost107 ~]$ mysql -uroot -p -P3306
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 5326
Server version: 5.7.18-log MySQL Community Server (GPL)
Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
mysql> use testdb;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show tables;
+------------------+
| Tables_in_testdb |
+------------------+
| person |
| student |
| test |
| test0 |
| test01 |
| test02 |
| test1 |
| test2 |
| test3 |
+------------------+
9 rows in set (0.01 sec)
OK
现在全备份时候的数据已经恢复。
查看解压在恢复机器的信息,全备份最后的日志文件是mysql_bin.000009,位置是342。需要从这个位置开始恢
复binlog。我们使用复制自己恢复。同时也需要去生成备份文件的机器看还有没有这个日志文件。
[root@localhost107 backup]# ls -all /opt/backup/
total 131132
drwxr-xr-x. 7 root root 4096 Aug 5 05:23 .
drwxr-xr-x. 5 root root 4096 Aug 5 04:30 ..
-rw-rw----. 1 root root 426 Aug 5 01:42 backup-my.cnf
-rw-rw----. 1 root root 296 Aug 4 14:22 ib_buffer_pool
-rw-rw----. 1 root root 12582912 Aug 5 05:23 ibdata1
-rw-r-----. 1 root root 50331648 Aug 5 05:23 ib_logfile0
-rw-r-----. 1 root root 50331648 Aug 5 05:23 ib_logfile1
-rw-r-----. 1 root root 12582912 Aug 5 05:23 ibtmp1
drwxr-xr-x. 2 root root 4096 Aug 5 04:47 mysql
drwxr-xr-x. 2 root root 4096 Aug 5 04:47 performance_schema
drwxr-xr-x. 2 root root 12288 Aug 5 04:47 sys
drwxr-xr-x. 2 root root 4096 Aug 5 04:47 testdb
drwxr-xr-x. 2 root root 4096 Aug 5 04:47 testdb_new
-rw-rw----. 1 root root 21 Aug 5 01:42 xtrabackup_binlog_info
-rw-r--r--. 1 root root 21 Aug 5 05:23 xtrabackup_binlog_pos_innodb
-rw-rw----. 1 root root 113 Aug 5 05:23 xtrabackup_checkpoints
-rw-rw----. 1 root root 595 Aug 5 01:42 xtrabackup_info
-rw-rw----. 1 root root 8388608 Aug 5 05:11 xtrabackup_logfile
[root@localhost107 backup]# cat /opt/backup/xtrabackup_binlog_info
mysql_bin.000009 342
确定复制点进行复制
[mysql@localhost107 ~]$ mysql -uroot -p -P3306
mysql>change master to master_host = '192.168.0.102',master_user = 'repl',master_password ='123456',
master_log_file ='mysql_bin.000009', master_log_pos=342;
Query OK, 0 rows affected, 2 warnings (0.35 sec)
mysql> start slave;
Query OK, 0 rows affected (0.04 sec)
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State:
Master_Host: 192.168.0.102
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql_bin.000009
Read_Master_Log_Pos: 342
Relay_Log_File: localhost107-relay-bin.000001
Relay_Log_Pos: 4
Relay_Master_Log_File: mysql_bin.000009
Slave_IO_Running: No
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 342
Relay_Log_Space: 154
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 1593
Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server ids; these ids must be different for replication to work (or the --replicate-same-server-id option must be used on slave but this does not always make sense; please check the manual before using it).
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 10
Master_UUID:
Master_Info_File: /opt/mysql/data/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp: 170805 06:47:19
报错:服务器ID和复制集群其他的机器重复了。
解决办法:先停机,然后修改server-id,一定不要和其他机器的重复。然后启动服务。
[mysql@localhost107 ~]$ /usr/local/mysql/bin/mysqladmin -uroot -p -P3306 shutdown
[mysql@localhost107 ~]$ vi /etc/my.cnf
server_id=6
保存,退出!
[mysql@localhost107 ~]$ /usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf --user=mysql &
[mysql@localhost107 ~]$ mysql -uroot -p -P3306
mysql> show slave status\G
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id: 5
Current database: *** NONE ***
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.0.102
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql_bin.000010
Read_Master_Log_Pos: 154
Relay_Log_File: localhost107-relay-bin.000005
Relay_Log_Pos: 367
Relay_Master_Log_File: mysql_bin.000010
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 154
Relay_Log_Space: 628
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 10
Master_UUID: f78533a4-7751-11e7-9a27-000c29b31319
Master_Info_File: /opt/mysql/data/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
1 row in set (0.00 sec)
改机器已经添加到复制集群了。
最后进行测试,在主库建一张表,看其他的2个从库,是否可以同步数据。MMM搭建完成!102为主,105为主的备,107为主的从库。
3.1下载和安装keepalived,(主备都要安装keepalived)(下载官方网址:http://www.keepalived.org/download.html)
一、概述
keepalived介绍:Keepalived的作用是检测服务器的状态,如果有一台服务器死机,或工作出现故
障,Keepalived将检测到,并将有故障的服务器从系统中剔除,当服务器工作正常后Keepalived自动
将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人 工做的只是修复故障
的服务器。
第一步:安装KEEPALIVED
方法一:使用百胜安装KEEPALIVED,需要安装EPEL释放源
[root@localhost102 softwares]#rpm -ivh http://mirrors.opencas.cn/epel/6/i386/epel-release-6-8.noarch.rpm
[root@localhost102 softwares]#rpm -ivh http:/ /mirrors.opencas.cn/epel/6/i386/epel-release-6-8.noarch.rpm
[root@localhost102 softwares]#yum -y install keepalived
查看KEEPALIVED相关目录
[root@slave ~]# ls /usr/sbin/keepalived
/usr/sbin/keepalived
[root@slave ~]# ls /etc/init.d/keepalived
/etc/init.d/keepalived
[root@slave ~]# ls /etc/keepalived/keepalived.conf
/etc/keepalived/keepalived.conf
方法二:从KEEPALIVED网站官方http://www.keepalived.org下载源代码包compile-安装
1,下载KEEPALIVED最新版
[root@localhost102 softwares]#wget -c http://www.keepalived.org/software/keepalived-1.2.20.tar.gz
[root@localhost102 softwares]#tar -zxvf keepalived-1.2.20.tar.gz -C /opt
2安装编译环境:
[root@localhost102 softwares]# yum install gcc*
[root@localhost102 softwares]# yum install gcc gcc-c++ openssl openssl-devel popt-devel kernel-devel pcre-devel libnl-devel
二台服务器都要以root用户安装openssl-devel包,不然会报!!! OpenSSL is not properly installed
on your system. !!!和!!! Can not include OpenSSL headers files.的错误。
[root@localhost102 softwares]#yum -y install openssl-devel
二台服务器以root用户安装libnl libnl-devel,不然会报错:*** WARNING - this build will
not support IPVS with IPv6. Please install libnl/libnl-3 dev libraries to support IPv6 with IPVS
[root@localhost102 keepalived-1.2.20]# yum -y install libnl libnl-devel
二台服务器以root用户安装libnfnetlink-devel,不然会报错configure: error: libnfnetlink headers missing
[root@localhost102 keepalived-1.2.20]#yum install -y libnfnetlink-devel
[root@localhost102 keepalived-1.2.20]#yum install pcre-devel openssl-devel popt-devel libnl-devel
3解压并安装的keepalived
[root@localhost102 keepalived-1.2.20]# uname -a
Linux localhost102 2.6.32-504.el6.x86_64 #1 SMP Wed Oct 15 04:27:16 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
查看内核版本为2.6.32-504.el6.x86_64。--with-kernel-dir参数是内核版本目录,这个是重要的参数,这个参
数并不表示我们要把KEEPALIVED统进内核,而是指使用内核源码里面的头文件,也就是包括目录,--prefix参数是keepalived安装路径
[root@localhost102 keepalived-1.2.20]# ./configure --prefix=/usr/local/keepalived --with-kernel-dir=/usr/src/kernels/2.6.32-504.el6.x86_64
如果报错了,解决错误之后需要重新执行./configure命令。重新加载新的。
4 [root@localhost102 keepalived-1.2.20]#make && make install
keepalived warning: ‘sgid_num’ may be used uninitialized in this function
如果有许多警告,就在执行一次make && make install ,可能警告会不见了。
5 查看KEEPALIVED相关的文件
[root@master keepalived-1.2.20]# ls /etc/keepalived/
keepalived.conf samples
[root@master keepalived-1.2.20]# ls /etc/init.d/keepalived
/etc/init.d/keepalived
6 链接在/ usr /本地/ KEEPALIVED / sbin目录/ KEEPALIVED到/ sbin目录/目录
[root@master keepalived-1.2.20]# ln -s /usr/local/keepalived/sbin/keepalived /sbin/
7设置KEEPALIVED启动级别
[root@master keepalived-1.2.20]# chkconfig --add keepalived
[root@master keepalived-1.2.20]# chkconfig --level 35 keepalived on
4.1配置keepalived.conf文件
[root@localhost102 init.d]# vi /usr/local/keepalived/etc/keepalived/keepalived.conf
localhost102主的配置为:
[root@localhost102 bin]# cat /usr/local/keepalived/etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
root@huangmingming.cn
470950247@qq.com #自己的接收邮箱
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1 #本机的回环地址为邮件服务器
smtp_connect_timeout 30 #邮件的连接超时时间
router_id LVS_DEVEL
}
vrrp_instance HA_1 {
state BACKUP #master和slave都建议配置为BACKUP,即是BACKUP-BACKUP模式,这样的话,如果某一台机器挂了,VIP就会漂移到另外一台
#机器。如果挂了的那台机器dba恢复完成之后,恢复的那台机器就是以slave加入复制。如果说主挂了,备变成主
#之后,原来的主不会去抢VIP成为主,而是以slave备加入复制。如果把master的状态设置为master和slave的状态设置
#为BACKUP,即是MASTER-BACKUP模式,如果说主挂了,备变成主.然后dba恢复原来的主之后,原来主把VIP强抢过来,
#又一次成为主。这样如果经常挂机,VIP就会经常漂移。不利稳定。
interface eth0 #指定HA检测的网络接口
virtual_router_id 80 #虚拟路由标识,主备必须相同
priority 100 #定义优先级,slave设置90,只要小于100就可以
advert_int 1 #设定master和slave之间同步检查的时间间隔
nopreempt #不抢占模式。只在优先级高的机器上设置即可
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { #设置虚拟IP,可以设置多个,每行一个。指定这192.168.1.208个IP为VIP。就是接收web服务器的VIP。
192.168.1.208/24 dev eth0 #MySQL对外服务的IP,即,要求VIP安装前应该是个ping不通的,启动服务之后,就可以ping通
}
}
virtual_server 192.168.1.208 3306 {
delay_loop 2 #每隔2秒查询real server状态
lb_algo wrr #lvs 算法
lb_kinf DR #LVS模式(Direct Route)
persistence_timeout 50
protocol TCP #网络传输协议
real_server 192.168.0.102 3306 { #监听本机的IP,192.168.0.102为本机的IP地址,3306为MySQL默认的端口
weight 1
notify_down /usr/local/keepalived/bin/mysqlstatus_check.sh #MySQL服务器如果故障,需要执行的脚本
TCP_CHECK {
connect_timeout 10 #10秒无响应超时
bingto 192.168.1.208
nb_get_retry 3
delay_before_retry 3
connect_port 3306 #连接的端口为MySQL的3306默认端口
}
}
}
KEEPALIVED检测脚本,当其中一台MySQL的服务出现故障向下掉时,实现自动切换到正常的MySQL的服务器继续提供服务。和配
置文件的notify_down的脚本路径要一致。MySQL的服务出现故障需要执行的脚本
[root@localhost102 init.d]# vim /usr/local/keepalived/bin/mysql.sh #如果MySQL服务器故障了,就杀死keepalived服务。这样VIP
#!/bin/bash
pkill keepalived
给新建的脚本加执行权限
[root@localhost102 init.d]#chmod 755 /usr/local/keepalived/bin/mysqlstatus_check.sh
3.1.3配置备机的keepalived.conf文件
[root@localhost105 bin]# cat /usr/local/keepalived/etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
root@huangmingming.cn
470950247@qq.com
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_instance HA_1 {
state BACKUP #master和slave都建议配置为BACKUP,即是BACKUP-BACKUP模式,这样的话,如果某一台机器挂了,VIP就会漂移到另外一台
#机器。如果挂了的那台机器dba恢复完成之后,恢复的那台机器就是以slave加入复制。如果说主挂了,备变成主
#之后,原来的主不会去抢VIP成为主,而是以slave备加入复制。如果把master的状态设置为master和slave的状态设置
#为BACKUP,即是MASTER-BACKUP模式,如果说主挂了,备变成主.然后dba恢复原来的主之后,原来主把VIP强抢过来,
#又一次成为主。这样如果经常挂机,VIP就会经常漂移。不利稳定。
interface eth0 #指定HA检测的网络接口
virtual_router_id 80 #虚拟路由标识,主备相同
priority 90 #定义优先级,slave设置90
advert_int 1 #设定master和slave之间同步检查的时间间隔
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { #设置虚拟IP,可以设置多个,每行一个,要求VIP安装前应该是个ping不通的,启动服务之后,就可以ping通
192.168.1.208/24 dev eth0 #MySQL对外服务的IP,即VIP
}
}
virtual_server 192.168.1.208 3306 {
delay_loop 2
lb_algo wrr
lb_kinf DR
persistence_timeout 50
protocol TCP
real_server 192.168.0.105 3306 { #监听本机的IP
weight 1
notify_down /usr/local/keepalived/bin/mysqlstatus_check.sh
TCP_CHECK {
connect_timeout 10
bingto 192.168.1.208
nb_get_retry 3
delay_before_retry 3
connect_port 3306
}
}
}
KEEPALIVED检测脚本,当其中一台MySQL的服务出现故障向下掉时,实现自动切换到正常的MySQL的服务器继续提供服务。和配
置文件的notify_down的脚本路径要一致。MySQL的服务出现故障需要执行的脚本
[root@localhost105 init.d]# vim /usr/local/keepalived/bin/mysqlstatus_check.sh #如果MySQL服务器故障了,就杀死keepalived服务。这样VIP
#!/bin/bash
pkill keepalived
给新建的脚本加执行权限
[root@localhost105 init.d]#chmod 755 /usr/local/keepalived/bin/mysqlstatus_check.sh
#4.1启动keepalived服务(二台机器都要)
[root@localhost102 keepalived-1.2.20]# pwd
/opt/keepalived-1.2.20
[root@localhost102 keepalived-1.2.20]# ll
total 568
-rw-rw-r-- 1 1000 1000 41 Feb 5 2016 AUTHOR
drwxrwxr-x 2 1000 1000 4096 Aug 3 20:25 bin #存放着启动keepalived的程序
-rw-rw-r-- 1 1000 1000 209382 Apr 3 2016 ChangeLog
-rw-r--r-- 1 root root 31631 Aug 3 20:18 config.log
-rwxr-xr-x 1 root root 27120 Aug 3 20:18 config.status
-rwxrwxr-x 1 1000 1000 185566 Mar 6 2016 configure
-rw-rw-r-- 1 1000 1000 19068 Mar 6 2016 configure.ac
-rw-rw-r-- 1 1000 1000 830 Feb 5 2016 CONTRIBUTORS
-rw-rw-r-- 1 1000 1000 18092 Feb 5 2016 COPYING
drwxrwxr-x 5 1000 1000 4096 Mar 21 2016 doc
drwxrwxr-x 3 1000 1000 4096 Aug 3 20:23 genhash
-rw-rw-r-- 1 1000 1000 1601 Feb 5 2016 INSTALL
-rwxrwxr-x 1 1000 1000 5598 Feb 5 2016 install-sh
drwxrwxr-x 9 1000 1000 4096 Aug 3 20:18 keepalived
-rw-r--r-- 1 root root 5230 Aug 3 20:18 keepalived.spec
-rw-rw-r-- 1 1000 1000 5233 Feb 5 2016 keepalived.spec.in
drwxrwxr-x 2 1000 1000 4096 Aug 3 20:23 lib
-rw-r--r-- 1 root root 2438 Aug 3 20:18 Makefile
-rw-rw-r-- 1 1000 1000 2453 Mar 21 2016 Makefile.in
-rw-rw-r-- 1 1000 1000 1007 Feb 5 2016 README
-rw-rw-r-- 1 1000 1000 20 Feb 5 2016 TODO
-rw-rw-r-- 1 1000 1000 7 Mar 7 2016 VERSION
启动命令
[root@localhost102 keepalived-1.2.20]# /opt/keepalived-1.2.20/bin/keepalived -f /usr/local/keepalived/etc/keepalived/keepalived.conf
查看进程是否存在
[root@localhost102 keepalived-1.2.20]# ps -ef | grep keepalived
root 14864 1 0 20:05 ? 00:00:00 /opt/keepalived-1.2.20/bin/keepalived -f /usr/local/keepalived/etc/keepalived/keepalived.conf
root 14865 14864 0 20:05 ? 00:00:00 /opt/keepalived-1.2.20/bin/keepalived -f /usr/local/keepalived/etc/keepalived/keepalived.conf
root 14866 14864 0 20:05 ? 00:00:00 /opt/keepalived-1.2.20/bin/keepalived -f /usr/local/keepalived/etc/keepalived/keepalived.conf
制作快捷启动
在源文件的目录./keepalived-1.2.20/keepalived/etc/init.d下有3个三个快捷启动的文件。
cd /opt/keepalived-1.2.20/bin
# cp ./keepalived-1.2.20/keepalived/etc/init.d/keepalived /etc/init.d/
# cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
# cp ./keepalived-1.2.20/keepalived/etc/sysconfig/keepalived /etc/sysconfig/keepalived
#keepalived的快捷启动,必须要执行以上三步,且文件路径必须一致,也不知道什么原因,
# 可能是init.d中的keepalived中已经指明了吧
这样可以执行service keepalived [start | stop | reload | restart ],这样很方便启动和停止keepalived服务。
查看启动的日志
[root@localhost102 support-files]# tail -f /var/log/messages
Aug 4 20:05:56 localhost102 Keepalived[14862]: Starting Keepalived v1.2.20 (08/03,2017)
Aug 4 20:05:56 localhost102 Keepalived[14864]: Starting Healthcheck child process, pid=14865
Aug 4 20:05:56 localhost102 Keepalived[14864]: Starting VRRP child process, pid=14866
Aug 4 20:05:56 localhost102 Keepalived_vrrp[14866]: Registering Kernel netlink reflector
Aug 4 20:05:56 localhost102 Keepalived_vrrp[14866]: Registering Kernel netlink command channel
Aug 4 20:05:56 localhost102 Keepalived_vrrp[14866]: Registering gratuitous ARP shared channel
Aug 4 20:05:56 localhost102 Keepalived_vrrp[14866]: Opening file '/usr/local/keepalived/etc/keepalived/keepalived.conf'. #使用那个keepalived配置文件启动
Aug 4 20:05:56 localhost102 Keepalived_healthcheckers[14865]: Registering Kernel netlink reflector
Aug 4 20:05:56 localhost102 Keepalived_vrrp[14866]: Using LinkWatch kernel netlink reflector...
Aug 4 20:05:56 localhost102 Keepalived_healthcheckers[14865]: Registering Kernel netlink command channel
Aug 4 20:05:56 localhost102 Keepalived_healthcheckers[14865]: Opening file '/usr/local/keepalived/etc/keepalived/keepalived.conf'.
Aug 4 20:05:56 localhost102 Keepalived_healthcheckers[14865]: Unknown keyword 'lb_kinf' #keepalived.conf配置文件里面的不知名参数
Aug 4 20:05:56 localhost102 Keepalived_healthcheckers[14865]: Unknown keyword 'bingto' #keepalived.conf配置文件里面的参数
Aug 4 20:05:56 localhost102 Keepalived_healthcheckers[14865]: Unknown keyword 'nb_get_retry' #keepalived.conf配置文件里面的参数
Aug 4 20:05:56 localhost102 Keepalived_vrrp[14866]: VRRP_Instance(HA_1) Entering BACKUP STATE
Aug 4 20:05:56 localhost102 Keepalived_healthcheckers[14865]: Using LinkWatch kernel netlink reflector...
Aug 4 20:05:56 localhost102 Keepalived_healthcheckers[14865]: Activating healthchecker for service [192.168.0.102]:3306
#机器[192.168.0.102]:3306的端口就是MySQLD服务的默认端口,说明192.168.0.102机器的mysqld的服务可用
Aug 4 20:05:59 localhost102 Keepalived_vrrp[14866]: VRRP_Instance(HA_1) Transition to MASTER STATE
Aug 4 20:06:00 localhost102 Keepalived_vrrp[14866]: VRRP_Instance(HA_1) Entering MASTER STATE #已经成为主服务器状态
第五步:授权VIP的根用户权限
授权远程主机可以通过VIP登录的MySQL,并测试数据复制功能.VIP只能连接主服务器。
[root@localhost102 keepalived]#
mysql> grant all on *.* to root@'192.168.1.208' identified by '123456';
mysql> flush privileges;
[root@localhost105 keepalived]#
mysql> grant all on *.* to root@'192.168.1.208' identified by '123456';
mysql> flush privileges;
第六步,故障测试
当前状态:localhost102为主,localhost105为从
用VIP只能连接localhost102的MySQL服务器,说明只有主服务器才可以拥有VIP,用VIP连接不上localhost105的MySQL等备服务
器。VIP就是MySQL对外服务的IP,web服务器连接VIP。
备服务器的Keepalived服务的日志信息:
[root@localhost102 support-files]# tail -f /var/log/messages
Aug 4 07:03:21 localhost102 Keepalived_vrrp[14731]: VRRP_Instance(HA_1) Transition to MASTER STATE
Aug 4 07:03:21 localhost102 Keepalived_vrrp[14731]: VRRP_Instance(HA_1) Entering MASTER STATE
[root@localhost102 keepalived-1.2.20]# mysql -uroot -h192.168.1.208 -p -P3306
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2332
Server version: 5.7.18-log MySQL Community Server (GPL)
Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
mysql> mysql> show variables like 'hostname%';
+---------------+--------------+
| Variable_name | Value |
+---------------+--------------+
| hostname | localhost102 |
+---------------+--------------+
1 row in set (0.02 sec)
说明localhost102是主服务器
备服务器的Keepalived日志:
[root@localhost105 keepalived]# tail -f /var/log/messages
Aug 4 07:03:21 localhost105 Keepalived_vrrp[25720]: VRRP_Instance(HA_1) Entering BACKUP STATE
[root@localhost105 keepalived-1.2.20]# mysql -uroot -h192.168.1.208 -p -P3306
在备通过VIP是连接不上localhost105服务器。
现在进行故障测试,手工停到localhost102主服务器。然后查看状态:
关闭主服务器:
[root@localhost102 keepalived-1.2.20]# /usr/local/mysql/bin/mysqladmin -uroot -p shutdown
Enter password:
2017-08-04T12:52:17.832119Z mysqld_safe mysqld from pid file /usr/local/mysql/mysql.pid ended
[11] Done
/usr/local/mysql/bin/mysqld_safe -defaults-file=/etc/my.cnf (wd: /opt/keepalived-1.2.20/bin)
(wd now: /opt/keepalived-1.2.20)
查看localhost102信息:
[root@localhost102 support-files]# tail -f /var/log/messages
Aug 4 20:05:23 localhost102 Keepalived[14729]: Stopping
Aug 4 20:05:23 localhost102 kernel: IPVS: __ip_vs_del_service: enter
Aug 4 20:05:23 localhost102 Keepalived_healthcheckers[14730]: Removing service [192.168.0.102]:3306 from VS [192.168.1.208]:3306 #停止MySQL服务
Aug 4 20:05:23 localhost102 Keepalived_healthcheckers[14730]: Stopped
Aug 4 20:05:23 localhost102 Keepalived_vrrp[14731]: VRRP_Instance(HA_1) sent 0 priority #设置优先级为0.最低级别
Aug 4 20:05:24 localhost102 Keepalived_vrrp[14731]: Stopped
Aug 4 20:05:24 localhost102 Keepalived[14729]: Stopped Keepalived v1.2.20 (08/03,2017) #停止Keepalived服务
这是同时也看localhost105的状态:
[root@localhost105 support-files]# tail -f /var/log/messages
Aug 4 20:05:24 localhost105 Keepalived_vrrp[26589]: VRRP_Instance(HA_1) Transition to MASTER STATE
Aug 4 20:05:27 localhost105 Keepalived_vrrp[26589]: VRRP_Instance(HA_1) Entering MASTER STATE #成为主的状态
可以使用VIP连接服务器:
[root@localhost105 mysql]# mysql -uroot -h192.168.1.208 -p -P3306
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 618
Server version: 5.7.18-log MySQL Community Server (GPL)
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
mysql> show variables like 'hostname%';
+---------------+--------------+
| Variable_name | Value |
+---------------+--------------+
| hostname | localhost105 |
+---------------+--------------+
1 row in set (0.02 sec)
故障之后,localhost105成为新的主服务器,提供对外服务功能!即是以前的主故障了,也不影响MySQL服务!
[root@localhost102 mysql]# mysql -uroot -h192.168.1.208 -p -P3306
这时需要恢复,加入复制的一员。slave
结论:使用keepalived提供双主模式(一主,一备用主)的高可用,但是只有一个主服务器是写。故障切换,不用担心服务不可用。都是自动完成高可用。