赞
踩
MySQL 主从复制的方式
MySQL5.6 开始主从复制有两种方式:基于日志(binlog)、基于 GTID(全局事务标示符)。 本教程主要讲基于日志(binlog)的复制。
MySQL 主从复制(也称 A/B 复制)的原理
(1) Master将数据改变记录到二进制日志(binary log)中,也就是配置文件log-bin指定的文件, 这些记录叫做二进制日志事件(binary log events);
(2) Slave 通过 I/O 线程读取 Master 中的 binary log events 并写入到它的中继日志(relay log);
(3) Slave 重做中继日志中的事件,把中继日志中的事件信息一条一条的在本地执行一次,完 成数据在本地的存储,从而实现将改变反映到它自己的数据(数据重放)。
MySQL 集群搭建(2 node):
mysql-01服务器:192.168.10.253
mysql-02服务器:192.168.10.254
MySQL版本:mysql-5.6.22
1、上传MySQL包到两台服务器:
- #mysql-01服务器
- scp mysql-5.6.22.tar.gz root@192.168.10.253:
- #mysql-02服务器
- scp mysql-5.6.22.tar.gz root@192.168.10.254:
2、添加 集群服务IP域名映射:
- #编辑本地 hosts文件
- vi /etc/hosts
-
- ######## mysql ########
- 192.168.10.253 mysql-01
- 192.168.10.254 mysql-02
3、各节点间可基于密钥进行SSH通信,而无需密码:
- #产生密钥
- ssh-keygen -t dsa -f ~/.ssh/id_dsa -N ""
- #拷贝受权密钥
- cp .ssh/id_dsa.pub .ssh/authorized_keys
- #拷贝密钥到 mysql-02虚拟机
- scp -r .ssh mysql-02:
- #查看ssh 是否免密码登陆
- ssh mysql-02 -- uname -n
4、关闭集群防火墙:
- #查看防火墙的状态
- service iptables status
- #关闭防火墙
- service iptables stop
- #查看防火墙是否开机启动
- chkconfig --list iptables
- #关闭开机启动防火墙
- chkconfig iptables off
5、关闭 selinux
- #修改selinux config 配置
- vi /etc/selinux/config
-
- #修改 SELINUX的值为:disabled
- SELINUX=disabled
6、安装MySQL 的依赖包:
- #安装MySql 依赖
- yum install cmake wget gcc-c++ gcc ncurses-devel perl -y
7、解压MySQL源码包:
- #把源码解压到 /usr/local/src
- tar -xvf mysql-5.6.22.tar.gz -C /usr/local/src/
- #进入 /usr/local/src
- cd /usr/local/src
8、安装编译MySQL源码:
- #进入 mysql源码目录:
- cd mysql-5.6.22/
- #创建mysql 的数据储存目录:
- mkdir -p /usr/local/mysql/data
- #cmake 编译 指定mysql 配置
- cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/usr/local/mysql/data -DSYSCONFDIR=/etc -DWITH_MYISAM_STORAGE_ENGINE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_MEMORY_STORAGE_ENGINE=1 -DWITH_READLINE=1 -DMYSQL_UNIX_ADDR=/var/lib/mysql/mysql.sock -DMYSQL_TCP_PORT=3306 -DENABLED_LOCAL_INFILE=1 -DWITH_PARTITION_STORAGE_ENGINE=1 -DEXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci
- #删除 CMakeCache.txt 文件
- rm -rf CMakeCache.txt
- #编译源码 (编译时间比较长)
- make
- #安装
- make install
-DCMAKE_INSTALL_PREFIX=dir_name | 设置mysql安装目录 |
-DMYSQL_UNIX_ADDR=file_name | 设置监听套接字路径,这必须是一个绝对路径名。默认为/tmp/mysql.sock |
-DDEFAULT_CHARSET=charset_name | 设置服务器的字符集。 缺省情况下,MySQL使用latin1的(CP1252西欧)字符集。 cmake/character_sets.cmake文件包含允许的字符集名称列表。 |
-DDEFAULT_COLLATION=collation_name | 设置服务器的排序规则。 |
-DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_ARCHIVE_STORAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 -DWITH_PERFSCHEMA_STORAGE_ENGINE=1 | 存储引擎选项: MyISAM,MERGE,MEMORY,和CSV引擎是默认编译到服务器中,并不需要明确地安装。 静态编译一个存储引擎到服务器,使用-DWITH_engine_STORAGE_ENGINE= 1 可用的存储引擎值有: ARCHIVE, BLACKHOLE, EXAMPLE, FEDERATED, INNOBASE (InnoDB), PARTITION (partitioning support), 和PERFSCHEMA (Performance Schema) |
-DMYSQL_DATADIR=dir_name | 设置mysql数据库文件目录 |
-DMYSQL_TCP_PORT=port_num | 设置mysql服务器监听端口,默认为3306 |
-DENABLE_DOWNLOADS=bool | 是否要下载可选的文件。例如,启用此选项(设置为1),cmake将下载谷歌所使用的测试套件运行单元测试。 |
9、创建mysql组 和 用户:
- #创建MySQL组
- groupadd mysql
- #创建用户
- useradd -r -g mysql mysql
- #给 /usr/local/mysql 文件夹授权给MySQL用户
- chown -R mysql:mysql /usr/local/mysql
10、初始化DB 数据库:
- #进入脚本目录
- cd /usr/local/mysql/
- #初始化 db
- ./scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data/
11、配置MySQL环境变量:
- vi /etc/profile
-
- #mysql environment
- MYSQL_HOME=/usr/local/mysql
- PATH=.:$MYSQL_HOME/bin:$PATH
- export MYSQL_HOME PATH
-
- #重新加载 /etc/profile
- source /etc/profile
- #查看 MySQL 是否生效
- echo $PATH
12、修改MySQL配置 /etc/my.cof
- #修改 /etc/my.cof
- vi /etc/my.cnf
-
- ##### mysql ha #####
- server_id=192.168.10.253
- binlog-ignore-db=mysql
- log-bin=mysql-master-bin
- binlog_cache_size=1M
- binlog_format=mixed
- expire_logs_days=7
- slave_skip_errors=1062
- ## 在 [mysqld] 中增加以下配置项
- ## 设置 server_id,一般设置为 IP server_id=192.168.10.253
- ## 复制过滤:需要备份的数据库,输出 binlog
- #binlog-do-db=roncoo
- ## 复制过滤:不需要备份的数据库,不输出(mysql 库一般不同步) binlog-ignore-db=mysql
- ## 开启二进制日志功能,可以随便取,最好有含义
- log-bin=edu-mysql-bin
- ## 为每个 session 分配的内存,在事务过程中用来存储二进制日志的缓存 binlog_cache_size=1M
- ## 主从复制的格式(mixed,statement,row,默认格式是 statement)
- binlog_format=mixed
- ## 二进制日志自动删除/过期的天数。默认值为 0,表示不自动删除。 expire_logs_days=7
- ## 跳过主从复制中遇到的所有错误或指定类型的错误,避免 slave 端复制中断。 ## 如:1062 错误是指一些主键重复,1032 错误是因为主从数据库数据不一致 slave_skip_errors=1062
13、授权两个文件:当前用户是Mysql,对日志文件 和 socket文件没有写权限:
- #日志文件 授权 mysql 用户
- chown -R mysql:mysql /var/run/mysqld/
- #socket文件 授权 mysql 用户
- chown -R mysql:mysql /var/lib/mysql/
14、启动MySQL:
- #启动MySQL
- mysqld_safe &
15、查看MySQL进程:
- #查看进程:
- ps -ef | grep mysql
16、登陆MySQL数据库:
- #登陆MySQL
- mysql -uroot -p
注意:此时报错(如下图)
在/etc/mycof配置文件下 添加client配置:
- #编辑配置文件
- vi /etc/my.cof
-
- [client]
- port=3306
- socket=/var/lib/mysql/mysql.sock
17、重新登陆MySQL数据库(登陆成功、查看databases 能看到如下几个库):
- #登陆MySQL
- mysql -uroot -p
18、创建数据同步用户,并授予相应的权限:
#创建数据同步用户,并授予相应的权限 grant replication slave, replication client on *.* to 'mysql'@'192.168.0.254' identified by '123456'; # 刷新授权表信息 flush privileges; # 查看 position 号,记下 position 号(从机上需要用到这个 position 号和现在的日志文件) show master status; #创建 roncoo 库 create database if not exists roncoo default charset utf8 collate utf8_general_ci; #创建 roncoo 表 CREATE TABLE `user` ( `Id` int(11) NOT NULL AUTO_INCREMENT, `userName` varchar(255) NOT NULL DEFAULT '' COMMENT '用户名', `pwd` varchar(255) NOT NULL DEFAULT '' COMMENT '密码', PRIMARY KEY (`Id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='用户信息表'; #插入3条数据,用于模拟现有的业务系统数据库 INSERT INTO `user` VALUES (1,'小沈哥','123456'),(2,'张俊伟','123456'),(3,'XSG','123456');
19、配置slave。编辑 /etc/my.cof
- vi /etc/my.cnf
-
- #### mysql ha ####
- server_id=1921680254
- binlog-ignore-db=mysql
- log-bin=mysql-slave-bin
- binlog_cache_size=1M
- binlog_format=mixed
- expire_logs_days=7
- slave_skip_errors=1062
- relay_log=mysql-slave-relay-bin
- log_slave_updates=1
- read_only=1
- ## 在 [mysqld] 中增加以下配置项
- ## 设置 server_id,一般设置为 IP
- server_id=206
- ## 复制过滤:需要备份的数据库,输出 binlog
- #binlog-do-db=roncoo
- ##复制过滤:不需要备份的数据库,不输出(mysql 库一般不同步) binlog-ignore-db=mysql
- ## 开启二进制日志,以备 Slave 作为其它 Slave 的 Master 时使用 log-bin=edu-mysql-slave1-bin
- ## 为每个 session 分配的内存,在事务过程中用来存储二进制日志的缓存 binlog_cache_size = 1M
- ## 主从复制的格式(mixed,statement,row,默认格式是 statement) binlog_format=mixed
- ## 二进制日志自动删除/过期的天数。默认值为 0,表示不自动删除。 expire_logs_days=7
- ## 跳过主从复制中遇到的所有错误或指定类型的错误,避免 slave 端复制中断。 ## 如:1062 错误是指一些主键重复,1032 错误是因为主从数据库数据不一致 slave_skip_errors=1062
- ## relay_log 配置中继日志
- relay_log=edu-mysql-relay-bin
- ## log_slave_updates 表示 slave 将复制事件写进自己的二进制日志 log_slave_updates=1
- ## 防止改变数据(除了特殊的线程) read_only=1
20、Slave 上创建相同库:
- Slave 上创建相同库:
- create database if not exists roncoo default charset utf8 collate utf8_general_ci; use roncoo;
21、登录 Slave 数据库,添加相关参数
- #登录 Slave 数据库
- mysql -uroot -p
- #添加相关参数
- change master to master_host='192.168.0.253', master_user='mysql', master_password='123456', master_port=3306, master_log_file='mysql-master-bin.000001', master_log_pos=0, master_connect_retry=30;
22、查看主从同步状态
- # 查看主从同步状态
- # 可看到 Slave_IO_State 为空, Slave_IO_Running 和 Slave_SQL_Running 是 No,表明 Slave 还 没有开始复制过程。
- show slave status\G;
23、开启主从同步
- # 开启主从同步
- start slave
24、再查看主从同步状态
主要看以下两个参数,这两个参数如果是 Yes 就表示主从同步正常
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
- # 再查看主从同步状态
- show slave status\G
25、在 master 上,可以看到 slave 的 I/O 线程创建的连接
- # 再查看master 状态
- show processlist\G
26、#查看 slave 和 master 上线程的状态。在 slave 上,可以看到 master 的 I/O 线程创建的连接
- # 再查看 slave 状态
- show processlist\G
27、主从数据复制同步测试
- # 在master 服务器上添加数据
- INSERT INTO `user` VALUES (4,'张俊伟2B','123456'),(5,'张俊伟2BB 2','123456');
28、在slave 上查看数据
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。