文档课题:rhel 6.5搭建MySQL 5.5.18一主一从高可用架构.
系统:rhel 6.5 64位
数据库:MySQL 5.5.18
数据库安装包:mysql-5.5.18.tar.gz
Xtrabackup安装包:percona-xtrabackup-24-2.4.6-2.el6.x86_64.rpm
架构信息如下:

1、主从搭建
1.1、前期准备
安装两台MySQL数据库主机后,配置好主机IP地址,确保两台服务器之间可以互相ping通,并注意防火墙状态.
--关闭防火墙
[root@MySQL5518-Master ~]# 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@MySQL5518-Master ~]# service iptables stop
iptables: Setting chains to policy ACCEPT: filter [ OK ]
iptables: Flushing firewall rules: [ OK ]
iptables: Unloading modules: [ OK ]
[root@MySQL5518-Master ~]# service iptables status
iptables: Firewall is not running.
1.2、主节点配置
1.2.1、开启binlog
--检查数据库binlog情况.
mysql> show variables like '%log_bin%';
+---------------------------------+-------+
| Variable_name | Value |
+---------------------------------+-------+
| log_bin | OFF |
| log_bin_trust_function_creators | OFF |
| sql_log_bin | ON |
+---------------------------------+-------+
3 rows in set (0.00 sec)
mysql> show variables like '%datadir%';
+---------------+------------------+
| Variable_name | Value |
+---------------+------------------+
| datadir | /var/mysql/data/ |
+---------------+------------------+
1 row in set (0.00 sec)
--主节点开启binlog日志,在/etc/my.cnf文件的[mysqld]添加如下参数,开启binlog功能.
[mysql@MySQL5518-Master ~]$ vi /etc/my.cnf
添加如下:
log_bin="/var/mysql/binlog/mysql-bin"
expire_logs_days = 7
max_binlog_size = 100M
innodb_buffer_pool_size=1G
--新建目录
[root@MySQL5518-Master ~]# cd /var/mysql
[root@MySQL5518-Master mysql]# mkdir binlog
[root@MySQL5518-Master mysql]# chown -R mysql:mysql binlog
说明:
a、系统层面需新建目录/var/mysql/binlog
b、expire_logs_days表示二进制日志文件保留天数,max_binlog_size表示二进制日志文件最大大小.
c、注意server-id主从节点需不同.
--重启mysql服务后确认log_bin是否开启.
[root@MySQL5518-Master mysql]# service mysqld restart
Shutting down MySQL. [ OK ]
Starting MySQL.. [ OK ]
mysql> show variables like '%log_bin%';
+---------------------------------+-------+
| Variable_name | Value |
+---------------------------------+-------+
| log_bin | ON |
| log_bin_trust_function_creators | OFF |
| sql_log_bin | ON |
+---------------------------------+-------+
3 rows in set (0.00 sec)
说明:log_bin参数为on表示二进制日志文件已成功开启.
1.2.2、配置账户
--在master上配置复制所需账户repl,%表示任何远程地址的repl用户都可以连接master主机,语句如下:
mysql> grant replication slave on *.* to repl@'%' identified by 'repl@12345';
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
1.2.3、主库信息
mysql> use booksDB;
Database changed
mysql> show tables;
+-------------------+
| Tables_in_booksDB |
+-------------------+
| authorbook |
| authors |
| books |
+-------------------+
3 rows in set (0.00 sec)
--主库file与position信息.
mysql> show master status \G
*************************** 1. row ***************************
File: mysql-bin.000001
Position: 326
Binlog_Do_DB:
Binlog_Ignore_DB:
1 row in set (0.00 sec)
注意:此处File与Position在后面从库操作时需要.
1.2.4、全库备份
[mysql@MySQL5518-Master ~]$ /usr/bin/innobackupex --defaults-file=/etc/my.cnf --socket=/tmp/mysql.sock --user=root --password=mysql_4U --port=3306 --slave-info --stream=tar --tmpdir=/mysql/tmpfile /mysql/bak/ 2>/mysql/log_bak/backup.log |gzip ->/mysql/bak/192.168.133.122_20230819_3306.tar.gz
注意:此处需安装xtraback备份软件,才能进行innobackupex备份.
1.2.5、scp备份集
[mysql@MySQL5518-Master bak]$ scp 192.168.133.122_20230819_3306.tar.gz mysql@192.168.133.123:/mysql/bak
1.3、从节点配置
1.3.1、关闭从节点
[root@MySQL5518-Slave ~]# ps -ef|grep mysql
root 45471 1 0 Aug19 ? 00:00:00 /bin/sh /usr/local/webserver/mysql/bin/mysqld_safe --datadir=/var/mysql/data --pid-file=/var/mysql/data/MySQL5518-Slave.pid
mysql 45818 45471 0 Aug19 ? 00:00:17 /usr/local/webserver/mysql/bin/mysqld --basedir=/usr/local/webserver/mysql --datadir=/var/mysql/data --plugin-dir=/usr/local/webserver/mysql/lib/plugin --user=mysql --log-error=/var/mysql/data/MySQL5518-Slave.err --pid-file=/var/mysql/data/MySQL5518-Slave.pid --socket=/tmp/mysql.sock --port=3306
root 58045 58025 0 10:43 pts/3 00:00:00 grep mysql
[root@MySQL5518-Slave ~]# kill -9 45471
[root@MySQL5518-Slave ~]# kill -9 45818
[root@MySQL5518-Slave ~]# ps -ef|grep mysql
root 58051 58025 0 10:43 pts/3 00:00:00 grep mysql
1.3.2、删除数据文件
--查数据文件目录
[root@MySQL5518-Slave ~]# cat /etc/my.cnf | grep datadir
datadir=/var/mysql/data
--清空数据文件
[root@MySQL5518-Slave ~]# cd /var/mysql/data
[root@MySQL5518-Slave data]# ll
total 28692
-rw-rw----. 1 mysql mysql 18874368 Aug 19 12:39 ibdata1
-rw-rw----. 1 mysql mysql 5242880 Aug 19 12:39 ib_logfile0
-rw-rw----. 1 mysql mysql 5242880 Aug 19 12:39 ib_logfile1
drwx------. 2 mysql root 4096 Aug 19 12:35 mysql
-rw-rw----. 1 mysql root 1584 Aug 19 12:39 MySQL5518-Slave.err
-rw-rw----. 1 mysql mysql 6 Aug 19 12:39 MySQL5518-Slave.pid
drwx------. 2 mysql mysql 4096 Aug 19 12:35 performance_schema
drwx------. 2 mysql root 4096 Aug 19 12:35 test
[root@MySQL5518-Slave data]# rm -rf *
1.3.3、从节点恢复
说明:将主库传输到从库的备份集在从库进行恢复.
--解压备份集
[root@MySQL5518-Slave mysql]# su - mysql
[mysql@MySQL5518-Slave ~]$ cd /mysql/bak
[mysql@MySQL5518-Slave bak]$ tar -zxivf 192.168.133.122_20230819_3306.tar.gz -C /var/mysql/data
--对全量备份做准备
[mysql@MySQL5518-Slave bak]$ /usr/bin/innobackupex --defaults-file=/etc/my.cnf --apply-log /var/mysql/data
检查方法
——最后一句是不是 completed OK!
说明:如上所示,数据成功在从节点恢复.
1.3.4、修改配置文件
--修改从节点配置文件my.cnf
[mysql@MySQL5518-Slave ~]$ vi /etc/my.cnf
添加如下:
log_bin="/var/mysql/binlog/mysql-bin"
expire_logs_days = 7
max_binlog_size = 100M
innodb_buffer_pool_size=1G
server-id = 2
--新建目录
[root@MySQL5518-Slave ~]# cd /var/mysql
[root@MySQL5518-Slave mysql]# ll
total 4
drwx------. 6 mysql root 4096 Aug 20 10:50 data
[root@MySQL5518-Slave mysql]# mkdir binlog
[root@MySQL5518-Slave mysql]# chown -R mysql:mysql binlog
注意:
a、需将server-id=2写到[mysqld]后面,需保证主从server-id不相同.
b、需新建目录/var/mysql/binlog.
1.3.5、主从同步设置
[mysql@MySQL5518-Slave bak]$ service mysqld start
Starting MySQL.. [ OK ]
--也可通过如下方式找出从节点change master时需要的file与position信息.
[root@MySQL5518-Slave data]# cd /var/mysql/data
[root@MySQL5518-Slave data]# cat xtrabackup_binlog_info
mysql-bin.000001 326
[mysql@MySQL5518-Slave ~]$ mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.5.18-log Source distribution
Copyright (c) 2000, 2011, 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
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> reset master;
Query OK, 0 rows affected (0.01 sec)
mysql> change master to
-> master_host='192.168.133.122',
-> master_user='repl',
-> master_password='repl@12345',
-> master_log_file='mysql-bin.000001',
-> master_log_pos=326;
Query OK, 0 rows affected (0.01 sec)
注意:此处master_log_file与master_log_pos为此前Master主库所查得信息,或者通过从节点的xtrabackup_binlog_info查询所得.
说明:
master_host 表示实现复制的主机ip地址
master_user 表示实现复制的登录远程主机的用户
master_password 表示实现复制的登录远程主机的密码
master_log_file 表示实现复制的binlog日志文件
master_log_pos 表示实现复制的binlog日志文件的偏移量
--开启slave
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
mysql> show slave status \G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.133.122
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 326
Relay_Log_File: MySQL5518-Slave-relay-bin.000005
Relay_Log_Pos: 253
Relay_Master_Log_File: mysql-bin.000001
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: 326
Relay_Log_Space: 419
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: 1
1 row in set (0.00 sec)
2、主从复制测试
--Master端执行如下命令:
mysql> show processlist;
+----+------+-----------------------+---------+-------------+------+-----------------------------------------------------------------------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+------+-----------------------+---------+-------------+------+-----------------------------------------------------------------------+------------------+
| 1 | root | localhost | booksDB | Query | 0 | NULL | show processlist |
| 6 | repl | 192.168.133.123:34847 | NULL | Binlog Dump | 102 | Master has sent all binlog to slave; waiting for binlog to be updated | NULL |
+----+------+-----------------------+---------+-------------+------+-----------------------------------------------------------------------+------------------+
2 rows in set (0.00 sec)
mysql> create database fruitsDB;
Query OK, 1 row affected (0.00 sec)
mysql> use fruitsDB;
Database changed
mysql> create table fruits
-> (
-> f_id char(10) not null,
-> s_id int not null,
-> f_name char(255) not null,
-> f_price decimal(8,2) not null,
-> primary key(f_id)
-> ) ENGINE=innodb default charset=utf8 auto_increment=1;
Query OK, 0 rows affected (0.02 sec)
mysql> insert into fruits (f_id,s_id,f_name,f_price)
-> values('a1',101,'apple',5.2),
-> ('b1',101,'blackberry',10.2),
-> ('bs1',102,'orange',11.2),
-> ('bs2',105,'melon',8.2),
-> ('t1',102,'banana',10.3),
-> ('t2',102,'grape',5.3),
-> ('o2',103,'coconut',9.2),
-> ('c0',101,'cherry',3.2),
-> ('a2',103,'apricot',2.2),
-> ('l2',104,'lemon',6.4),
-> ('b2',104,'berry',7.6),
-> ('m1',106,'mango',15.7),
-> ('m2',105,'xbabay',2.6),
-> ('t4',107,'xbababa',3.6),
-> ('m3',105,'xxtt',11.6),
-> ('b5',107,'xxxx',3.6);
Query OK, 16 rows affected (0.00 sec)
Records: 16 Duplicates: 0 Warnings: 0
mysql> show tables;
+--------------------+
| Tables_in_fruitsDB |
+--------------------+
| fruits |
+--------------------+
1 row in set (0.00 sec)
mysql> select * from fruits;
+------+------+------------+---------+
| f_id | s_id | f_name | f_price |
+------+------+------------+---------+
| a1 | 101 | apple | 5.20 |
| a2 | 103 | apricot | 2.20 |
| b1 | 101 | blackberry | 10.20 |
| b2 | 104 | berry | 7.60 |
| b5 | 107 | xxxx | 3.60 |
| bs1 | 102 | orange | 11.20 |
| bs2 | 105 | melon | 8.20 |
| c0 | 101 | cherry | 3.20 |
| l2 | 104 | lemon | 6.40 |
| m1 | 106 | mango | 15.70 |
| m2 | 105 | xbabay | 2.60 |
| m3 | 105 | xxtt | 11.60 |
| o2 | 103 | coconut | 9.20 |
| t1 | 102 | banana | 10.30 |
| t2 | 102 | grape | 5.30 |
| t4 | 107 | xbababa | 3.60 |
+------+------+------------+---------+
16 rows in set (0.01 sec)
--Slave端检查.
mysql> use fruitsDB;
Database changed
mysql> select * from fruits;
+------+------+------------+---------+
| f_id | s_id | f_name | f_price |
+------+------+------------+---------+
| a1 | 101 | apple | 5.20 |
| a2 | 103 | apricot | 2.20 |
| b1 | 101 | blackberry | 10.20 |
| b2 | 104 | berry | 7.60 |
| b5 | 107 | xxxx | 3.60 |
| bs1 | 102 | orange | 11.20 |
| bs2 | 105 | melon | 8.20 |
| c0 | 101 | cherry | 3.20 |
| l2 | 104 | lemon | 6.40 |
| m1 | 106 | mango | 15.70 |
| m2 | 105 | xbabay | 2.60 |
| m3 | 105 | xxtt | 11.60 |
| o2 | 103 | coconut | 9.20 |
| t1 | 102 | banana | 10.30 |
| t2 | 102 | grape | 5.30 |
| t4 | 107 | xbababa | 3.60 |
+------+------+------------+---------+
16 rows in set (0.00 sec)
说明:如上所示,Slave端能查询出Master端的新增的数据库fruitsDB和表fruits. 数据成功同步到Slave.