Mysql作为目前世界上使用最广泛的免费数据库,相信所有从事系统运维的工程师都一定接触过。但在实际的生产环境中,由单台Mysql作为独立的数据库是完全不能满足实际需求的,无论是在安全性,高可用性以及高并发等各个方面。
因此,一般来说都是通过 主从复制(Master-Slave)的方式来同步数据,再通过读写分离(MySQL-Proxy)来提升数据库的并发负载能力 这样的方案来进行部署与实施的。
如下图所示:
主从复制目的:
主从服务器设置的稳健性得以提升,如果主服务器发生故障,可以把本来作为备份的从服务器提升为新的主服务器。
在主从服务器上分开处理用户的请求,读的话,可以直接读取备机数据,可获得更短的响应时间。
用从服务器做数据备份而不会占用主服务器的系统资源
MySQL主从复制(Master-Slave)与读写分离(MySQL-Proxy)实践
环境:二台虚拟机,linux系统
主mysql: master 192.168.0.35
从mysql: slave 192.168.0.36
操作方法:1.二台虚拟机分别安装mysql服务器
2.分别修改二台mysal的配置文件,如端口
3.修改完成后把mysql服务开启,设置为开机启动
4.做测试操作,主mysql服务器上创建测试数据库,从mysql服务器在修改配置文件并重启
5.数据同步
一.安装mysql
master 服务器上安装mysql
1.进入到cd /usr/local/src/目录下
2.用wget http://mirrors.sohu.com/mysql/MySQL-5.1/mysql-5.1.73-linux-i686-glibc23.tar.gz
3.解压安装 tar zxf mysql-5.1.73-linux-i686-glibc23.tar.gz
4.创建mysql的账户
useradd -s /sbin/nologin -M mysql
-s:shell
-M:不建立使用者目录
5.把解压后的文件移到并重命名/usr/local/mysql目录下
mv mysql-5.1.73-linux-i686-glibc23 /usr/local/mysql1
6.进入到/usr/local/mysql下
cd /usr/local/mysql1
7.创建一个存放数据库的文件夹并更改权限
mkdir -p /data/mysql1
chown -R mysql /data/mysql1
8.初始化数据库
进入数据库的目录
cd /usr/local/mysql1
./scripts/mysql_install_db --user=mysql --datadir=/data/mysql1
注:如何查看初始化有没有完成,只要出现2个ok就表示成功了
或者echo $?结果为0即表示成功
9.把不同的文件放到不同的目录下,先进入配置文件里
cd support-files/
10.拷贝my-large.cnf文件到/etc/my.cnf下
cp my-large.cnf /etc/my.cnf 按y
11.拷贝mysql.server文件到/etc/init.d/mysqld目录下
cp mysql.server /etc/init.d/mysql1
vim !$可以打开刚拷贝的文件
修改basedir=/usr/local/mysql1 ---mysql所在的位置
datedir=/data/mysql1 ----数据库所在的位置
12.把mysqld加入到系统启动中
chkconfig --add mysql1
把mysqld打开
chkconfig mysql1 on
启动mysqld
/etc/init.d/mysql1 start
13.查看mysqld的启动状态
ps aux |grep mysqld
查看port
netstat -lnpe |grep mysqld
slave 服务器上安装mysql
1.进入到cd /use/local/src/目录下
2.用wget http://mirrors.sohu.com/mysql/MySQL-5.1/mysql-5.1.73-linux-i686-glibc23.tar.gz
3.解压安装 tar zxf mysql-5.1.73-linux-i686-glibc23.tar.gz
4.创建mysql的账户
useradd -s /sbin/nologin -M mysql
-s:shell
-M:不建立使用者目录
5.把解压后的文件移到并重命名/usr/local/mysql目录下
mv mysql-5.1.73-linux-i686-glibc23 /usr/local/mysql2
6.进入到/usr/local/mysql下
cd /usr/local/mysql2
7.创建一个存放数据库的文件夹并更改权限
mkdir -p /data/mysql2
chown -R mysql /data/mysql2
8.初始化数据库
进入数据库的目录
cd /usr/local/mysql2
./scripts/mysql_install_db --user=mysql --datadir=/data/mysql2
注:如何查看初始化有没有完成,只要出现2个ok就表示成功了
或者echo $?结果为0即表示成功
9.把不同的文件放到不同的目录下,先进入配置文件里
cd support-files/
10.拷贝my-large.cnf文件到/etc/my.cnf下
cp my-large.cnf /etc/my.cnf 按y
11.拷贝mysql.server文件到/etc/init.d/mysqld目录下
cp mysql.server /etc/init.d/mysql2
vim !$可以打开刚拷贝的文件
修改basedir=/usr/local/mysql2 ---mysql所在的位置
datedir=/data/mysql2 ----数据库所在的位置
打开vim /etc/my.cnf
[mysqld]
port = 3306 -----改为3307
socket = /tmp/mysql.sock
skip-locking
key_buffer_size = 256M
max_allowed_packet = 1M
table_open_cache = 256
sort_buffer_size = 1M
read_buffer_size = 1M
read_rnd_buffer_size = 4M
myisam_sort_buffer_size = 64M
thread_cache_size = 8
query_cache_size= 16M
12.把mysqld加入到系统启动中
chkconfig --add mysql2
把mysqld打开
chkconfig mysql2 on
启动mysqld
/etc/init.d/mysql2 start
13.查看mysqld的启动状态
ps aux |grep mysqld
查看port
netstat -lnpe |grep mysqld
二.修改vi /etc/my.cnf参数
master操作
1.vi /etc/my.cnf
在[mysqld]下添加一行参数
log_bin=master-log
添加启动二进制日志文件
2.重新/etc/my.cnf
/etc/init.d/mysql1 restart
slave操作
1.vi /etc/my.cnf
在[mysqld]下添加一行参数
relay-log=relay-log
中继日志
2.重新/etc/my.cnf
/etc/init.d/mysql2 restart
三.mysql的操作
master操作
1.创建一个同步使用的账号(mysql)
进入数据库
mysql
grant replication slave on *.* to 'user'@'192.168.0.36' identified by '123123';
赋予192.168.0.36也就是slave机器有File权限
2.刷新权限
flush privileges;
3.查看数据库信息
SHOW MASTER STATUS;
slave操作
1.进入数据库
mysql
2.设置连接主服务器的相关信息
CHANGE MASTER TO MASTER_HOST=
'192.168.0.35'
,
-> MASTER_USER=
'user'
,
-> MASTER_PASSWORD=
'123123'
,
-> MASTER_LOG_FILE=
'master-log.000001'
,
# 复制主节点的二进制的日志文件
-> MASTER_LOG_POS=106;
# 复制主节点二进制日志开始的位置
3.查看节点信息,发现未启动
SHOW SLAVE STATUS\G
4.启动复制进程
START SLAVE;
SHOW SLAVE STATUS\G
四.创建数据库,查看从服务器是否有同步
master操作
1.创建一个同步数据库
create database exam;
2.创建一个表结构
插入数据
insert into命令格式:insert into <表名> [(<字段名1>[,..<字段名n > ])] values ( 值1 )[, ( 值n )];
3.使用数据库
use exam;
create table myrise (id varchar(20),username varchar(20),password varchar(20));
insert into myrise values('x01','user1','123'),('x02','user2','123');
create table myhome(id varchar(20),username varchar(20),password varchar(20));
insert into myhome values('x01','user1','123'),('x02','user2','123');
create table myzixun(id varchar(20),username varchar(20),password varchar(20));
insert into myzixun values('x01','user1','123'),('x02','user2','123');
4.查看数据库
SHOW DATABASES;
slave操作
SHOW DATABASES;
出现如下错误的解决方法
mysql> slave stop;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> reset slave;
Query OK, 0 rows affected,(0.00 sec)