logo资料库

MySQL主从复制搭建 step by step.docx

第1页 / 共51页
第2页 / 共51页
第3页 / 共51页
第4页 / 共51页
第5页 / 共51页
第6页 / 共51页
第7页 / 共51页
第8页 / 共51页
资料共51页,剩余部分请下载后查看
一、环境说明
1.软件准备
2.网络设置
3.实现原理
二、安装MySQL软件
1.准备
2.添加组和用户
3.解压安装软件
4.修改启动脚本
5.启动服务
6.初始化配置
三、配置主从复制
1.修改主从节点my.cnf配置
2.重启主从服务器mysql服务
3.备份master,并还原到slave
4.在主节点建立帐户并授权slave
5.查看master状态
6.配置slave
7.启动slave同步进程并查看状态
8.两台slave服务器设置read_only(从库对外提供读服务,只所以没有写进配置文件,是因为随
9. 创建监控用户(在master上执行)
10.回到master,进到mysql解除table(表)的锁定
四、主从测试
五、主从切换
1.模拟master宕机
2.操作从节点
3.设置slave为master
4. 检查slave的log-bin是否打开,如果没打开,则需要打开
5.删除从库Slave上的master.info和relay-log.info,否则下次重启则按照从
6.如果有其他slave,需要把指向修改到新的master
7.修改应用程序指向
六、MHA配置
安装MHA node包
1、在所有节点安装MHA node所需的perl模块(DBD:mysql)
2、在所有的节点安装mha node(包括Manager 节点):
3、增加系统环境变量:
安装MHA manager包
配置互信
配置MHA环境
1、创建MHA的工作目录,并且创建相关配置文件(在软件包解压后的目录里面有样例配置文件)。
2、设置relay log的清除方式(在每个slave节点上都执行):
3、设置定期清理relay脚本(两台slave服务器)
4、检查SSH配置
5、检查整个复制环境状况
6、检查MHA Manager的状态
7、开启MHA Manager监控
8、查看启动日志
9、关闭MHA Manage监控
配置VIP
1、在添加VIP
2、配置脚本
故障转移测试
1、自动切换
2、手工切换
3、在线切换
附录一、my.cnf文件
附录二、MySQL的用户认证及匿名用户
附录三、MySQL备份恢复说明
附录四、/etc/masterha/app1.cnf
附录五、master_ip_online_change
附录六、常用MySQL管理命令
1.查看mysql版本
2.查看当前归档
3.切换日志
4.查看参数文件
附录七、错误锦集
错误1:Slave failed to initialize relay log info stru
附录八、MySQL复制概念
1.异步、同步和半同步复制概念
2.半同步复制原理
3.半同步复制--AFTER_SYNC的问题
4.半同步复制--AFTER_COMMIT(MySQL5.7)
一、环境说明 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;
分享到:
收藏