一、环境说明
1.软件准备
1)Oracle Linux Server release 6.4
2)MySQL 5.6.38 社区版
3)mha4mysql-manager-0.57和mha4mysql-node-0.57
2.网络设置
不需要额外的IP资源,只需要一个网卡即可
注意关闭防火墙,并设置selinux = disabled
测试环境配置信息如下
服务器名称
Master
Slave1
Slave2
IP
10.0.8.91
10.0.8.92
10.0.8.93
netmask
255.255.255.0
255.255.255.0
255.255.255.0
VIP
Manager节点
3.实现原理
10.0.8.94
10.0.8.92
主从复制的原理:
分为同步复制和异步复制,实际复制架构中大部分为异步复制。 复制的基本过程
如下:
1).Slave上面的IO进程连接上Master,并请求从指定日志文件的指定位置(或者
从最开始的日志)之后的日志内容;
2).Master接收到来自Slave的IO进程的请求后,通过负责复制的IO进程根据请求
信息读取制定日志指定位置之后的日志信息,返回给Slave 的IO进程。返回信息中除
了日志所包含的信息之外,还包括本次返回的信息已经到Master端的bin-log文件的名
称以及bin-log的位置;
3).Slave的IO进程接收到信息后,将接收到的日志内容依次添加到Slave端的
relay-log文件的最末端,并将读取到的Master端的 bin-log的文件名和位置记录到
master-info文件中,以便在下一次读取的时候能够清楚的告诉Master“我需要从某
个bin-log的哪个位置开始往后的日志内容,请发给我”;
4).Slave的Sql进程检测到relay-log中新增加了内容后,会马上解析relay-log
的内容成为在Master端真实执行时候的那些可执行的内容,并在自身执行。
二、安装 MySQL 软件
1.准备
在虚拟机安装两台同样配置的操作系统,设置主机名,IP,selinux,禁掉防火墙
MySQL有三种安装方式,分别为源码安装,二进制文件安装,rpm包安装。其中源
码安装定制自由度最高,rpm方式最差;源码安装最复杂,rpm最容易。本文档使用二
进制方式安装。
软件下载地址:http://dev.mysql.com/downloads
配置/etc/hosts
10.0.8.91
10.0.8.92
10.0.8.93
master
slave1
slave2
2.添加组和用户
groupadd mysql
useradd -g mysql mysql
3.解压安装软件
#解压
tar -zxf mysql-5.6.38-linux-glibc2.12-x86_64.tar.gz
#复制解压后的mysql目录
cp -r mysql-5.6.38-linux-glibc2.12-x86_64 /usr/local/mysql
#创建目录
mkdir -p /u01/data/mysql/logs
chown -R mysql:mysql /u01/data/mysql
cd /usr/local/mysql/
chown -R mysql:mysql ./
cp support-files/mysql.server /etc/init.d/mysqld
chmod 755 /etc/init.d/mysqld
#初始化my.cnf文件
mv /etc/my.cnf /etc/my.cnf.backup
vi /etc/my.cnf
/*文件内容详见附录*/
安装依赖包
yum -y install autoconf
yum install -y libaio
#执行安装
./scripts/mysql_install_db --user=mysql
--datadir=/u01/data/mysql/data --defaults-file=/etc/my.cnf
4.修改启动脚本
#修改启动脚本
vi /etc/init.d/mysqld
#修改项:
basedir=/usr/local/mysql/
datadir=/u01/data/mysql/data
5.启动服务
#启动服务
service mysqld start
#测试连接
./bin/mysql -uroot
#加入环境变量,编辑 /etc/profile
export PATH=$PATH:/usr/local/mysql/bin
source /etc/profile
#启动/关闭/查看状态mysql
service mysqld start | stop | status
6.初始化配置
# mysql -uroot -p
1)修改root用户密码
# mysqladmin -uroot password 要设置的密码(加不加引号都可以)
或者
# mysqladmin -u用户名 -p旧密码 password 新密码(加不加引号都可以)
或者
mysql> UPDATE user SET Password=PASSWORD('your_new_password') where
USER='root';
2)删除匿名用户
mysql> SELECT User, Host, Password FROM mysql.user;
mysql> use mysql
mysql> delete from user where user = ' ';
mysql> flush privileges;
注:关于匿名用户和MySQL用户认证详见附录
3)创建数据库,测试表
mysql> create database kk;
创建表
use kk;
create table teacher
(
id int(3) auto_increment not null primary key,
name char(10) not null,
address varchar(50) default '深圳',
year date
);
insert into teacher values(1,'xiaoming','一中','1976-10-10');
insert into teacher values(2,'xiaohu','二中','1975-12-23');
insert into teacher values(3,'mangguo','北京','2015-4-2');
三、配置主从复制
1.修改主从节点 my.cnf 配置
1)master服务器配置:
vi /etc/my.cnf
[mysqld]
server-id=101
#设置服务器唯一的id,默认是1,slave设置102
log-bin=kk-bin # 启用二进制日志,这是日志名称的开头部分
#binlog-ignore-db = mysql,information_schema #忽略写入binlog的库
2)slave服务器配置:
vi /usr/local/mysql/etc/my.cnf
[mysqld]
server-id=102
replicate-do-db = kk
#只同步kk库
slave-skip-errors = all
#忽略因复制出现的所有错误
2.重启主从服务器 mysql 服务
/etc/init.d/mysqld restart
3.备份 master,并还原到 slave
#master节点
/usr/local/mysql/bin/mysqldump -uroot -proot kk > /tmp/kk.sql
#slave节点
mysql -uroot -proot -e "create database kk"
mysql -uroot -proot kk < /tmp/kk.sql
4.在主节点建立帐户并授权 slave
mysql> CREATE USER 'repl'@'%' IDENTIFIED BY 'repl';
#mysql> GRANT ALL ON *.* TO 'repl'@'%'; 为了做实验方便,后续需要研究
权限问题,这里并不需要这么大权限
mysql> grant replication slave on *.* to 'repl'@10.0.8.92 identified
by 'repl';
by 'repl';
grant replication slave on *.* to 'repl'@10.0.8.93 identified
为了保证同步前数据一致,先把 master 表锁一下
mysql> flush tables with read lock;
5.查看 master 状态
mysql> show master status;
6.配置 slave
mysql> change master to
master_host='10.0.8.91',
master_user='repl',
master_password='repl',
master_log_file='kk-bin.000001',
master_log_pos=809;
注:master_log_file 和 master_log_pos 分别对应上一步查到的 file 和
Position
7.启动 slave 同步进程并查看状态
mysql> start slave;
mysql> show slave status\G;
当 Slave_IO_Running 和 Slave_SQL_Running 都为 YES 的时候就表示主从同步
设置成功了
8.两台 slave 服务器设置 read_only(从库对外提供读服务,只所以没有写进配置文件,是因
为随时 slave 会提升为 master)
mysql> set global read_only=1
9. 创建监控用户(在 master 上执行)
mysql> grant all privileges on *.* to root@'%' identified by
'root';
mysql> flush privileges;
10.回到 master,进到 mysql 解除 table(表)的锁定
mysql> unlock tables;
四、主从测试
主节点
Mysql> use kk;
create table test
(id int(15),name varchar(300),address1 varchar(300),address2
varchar(300),address3 varchar(300),address4 varchar(300),address5
varchar(300),address6 varchar(300),address7 varchar(300),address8
varchar(300),address9 varchar(300),address10 varchar(300),year date
);
创建存储过程
DROP PROCEDURE IF EXISTS test;
delimiter #
create procedure test()
begin
declare i int default 0;
while i < 20000 do
insert into test(id,name,address1,address2,address3,address4,address5,address6,address7,address8,address9,address10,year) values(i,'小明小明小明小明小明小明小明小明小明小明小明
小明小明小明小明小明小明小明小明小明小明小明小明小明小明小明小明小明小明小明小明小明小明小明小明小明小明小明小明小明小明小明','深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳
深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳','深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳
深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳','深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳
深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳','深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳
深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳','深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳
深圳深圳深圳深圳深圳深圳','深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳
深圳','深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳','深圳深圳深圳深
圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳','深圳深圳深圳深圳深圳深圳深圳深圳深
圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳','深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深
圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳深圳','1999-05-21');
set i = i + 1;
end while;
end #
调用存储过程
delimiter ;
call test();
从节点查看结果
select count(*) from test;
五、主从切换
1.模拟 master 宕机
mysql> shutdown;
mysql> system service mysql.server status;