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即表示成功

spacer.gif

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  ----数据库所在的位置

spacer.gif

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即表示成功

spacer.gif

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  添加启动二进制日志文件

spacer.gif

2.重新/etc/my.cnf

/etc/init.d/mysql1 restart

slave操作

1.vi /etc/my.cnf

在[mysqld]下添加一行参数

  relay-log=relay-log     中继日志

spacer.gif

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;

spacer.gif


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

spacer.gif


四.创建数据库,查看从服务器是否有同步


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;

spacer.gif


slave操作

SHOW DATABASES;

spacer.gif


出现如下错误的解决方法

spacer.gif

mysql> slave stop;

Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> reset slave;

Query OK, 0 rows affected,(0.00 sec)