MySQL 集群搭建
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
配置MySQL HA
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');
配置MySQL slave
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 上查看数据