目录
1.理解MySQL主从复制原理。
MySQL 的主从复制和 MySQL 的读写分离两者有着紧密联系,首先要部署主从复制,只有主从复制完成了,才能在此基础上进行数据的读写分离。
Mysql的主从复制中主要有三个线程:master(binlog dump thread)、slave(I/O thread 、SQL thread),Master一条线程和Slave中的两条线程。
master(binlog dump thread)主要负责Master库中有数据更新的时候,会按照binlog格式,将更新的事件类型写入到主库的binlog文件中。
并且,Master会创建log dump线程通知Slave主库中存在数据更新,这就是为什么主库的binlog日志一定要开启的原因。
I/O thread线程在Slave中创建,该线程用于请求Master,Master会返回binlog的名称以及当前数据更新的位置、binlog文件位置的副本。
然后,将binlog保存在 「relay log(中继日志)」 中,中继日志也是记录数据更新的信息。
SQL线程也是在Slave中创建的,当Slave检测到中继日志有更新,就会将更新的内容同步到Slave数据库中,这样就保证了主从的数据的同步。
2.完成MySQL主从复制(一主两从)。
1.主从服务器安装MySQL数据库
yum -y install mysql*
2.修改MySQL数据库密码
service mysqld restart
mysql -u root -proot
use mysql;
set password for root@localhost = password('root');
3.配置主数据库(Master)
vim /etc/my.cnf
[mysqld]
# 添加以下内容
# 启用二进制日志
log-bin=mysql-bin
# 服务器唯一ID,默认是1,这里用的是IP最后一位
server-id=175
4.配置从数据库(Slave)
vim /etc/my.cnf
[mysqld]
# 添加以下内容
# 启用二进制日志
log-bin=mysql-bin
# 服务器唯一ID,默认是1,这里用的是IP最后一位
server-id=176
# 每个对应的数据库都需要修改,修改成server-id=IP
5.重启主从数据库
service mysqld restart
mysql -u root -proot
use mysql;
--操作的权限
grant all privileges on *.* to 'root'@'192.168.10.110' identified by 'root' with grant option;
6.在主数据库上建立帐户并授权(Slave)
update user set password=password('root') where user='root' and host='root' or host='localhost';
flush privileges;
grant replication slave on *.* to 'root'@'192.168.10.176' identified by 'root';
grant replication slave on *.* to 'root'@'192.168.10.177' identified by 'root';
# 刷新主从数据库的授权权限
flush privileges;
--参数解释:
-h : 指定客户端所要登录的MySQL主机名, 登录本机(localhost 或 127.0.0.1)该参数可以省略;
-u : 登录的用户名;
-p : 告诉服务器将会使用一个密码来登录, 如果所要登录的用户名密码为空, 可以忽略此选项。
-REPLICATION SLAVE :分配复制权限
-*.* : 可以操作那个数据库
-root : 用户名
-'%' : 可以在所有的电脑上使用这个账号和密码登录
7.登录主数据库,查询Master的状态
show master status;
mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000004 | 106 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
8.配置从数据库(Slave)
stop slave;
# 每个从数据库都需要配置
change master to master_host="192.168.10.175", master_user="root", master_password="root", master_log_file="mysql-bin.000004", master_log_pos=106;
flush privileges;
start slave;
--参数解释:
-master_host : 设置要连接的主数据库的IP地址
-master_user : 设置要连接的主数据库的用户名
-master_password : 设置要连接的主数据库的密码
-master_log_file : 设置要连接的主数据库的bin日志的日志名称(show master status);
-master_log_pos : 设置要连接的主数据库的bin日志的记录位置(show master status)(这里注意,最后项不需要加引号。否则配置失败)
9.检查从数据库复制功能状态
show slave status\G;
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.10.176
Master_User: root
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000004
Read_Master_Log_Pos: 106
Relay_Log_File: mysqld-relay-bin.000004
Relay_Log_Pos: 251
Relay_Master_Log_File: mysql-bin.000004
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 106
Relay_Log_Space: 552
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0 #这个不能用来作为主从延迟的判断标准, 0不完全代表从数据库已经追上了主数据库,有可能是网络中断,但是超时时间还没有到,从数据库没有发现。
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
1 row in set (0.00 sec)
--参数解释:
-Slave_IO_Running=Yes
-Slave_SQL_Running=Yes
--如果都是Yes,则说明配置成功
--注:Slave_IO及Slave_SQL进程必须正常运行,即YES状态,否则都是错误的状态(如:其中一个NO均属错误)。
--从库:Last_SQL_Errno: 1008
--将同步指针向下移动一个,可以重复操作
-stop slave;
-set global sql_slave_skip_counter=1;
-start slave;
-show slave status\G;
3.基于MySQL一主两从配置,完成MySQL读写分离配置
1、原理及实现方式
读写分离(Read/Write Splitting)”,基本的原理是让主数据库处理事务性查询,而从数据库处理 SELECT查询。数据库复制被用来把事务性查询导致的变更同步到集群中的从数据库。 实现方式:
1)程序修改MySQL操作类 可以参考PHP实现的Mysql读写分离,以php程序解决此需求。 2、Mycat实现MySQL主从复制读写分离 MyCAT的安装及部署 1>、部署jdk环境 MyCAT用Java开发,需要有JAVA运行环境,mycat依赖jdk1.7的环境 2>、安装Mycat 优点:直接和数据库通信,简单快捷的读写分离和随机的方式实现的负载均衡,权限独立分配。 缺点:自己维护更新,增减服务器在代码处理
2) mysql-proxy 优点:直接实现读写分离和负载均衡,不用修改代码,master和slave用一样的帐号 缺点:字符集问题,lua语言编程,还只是alpha版本,时间消耗有点高
3) amoeba 优点:直接实现读写分离和负载均衡,不用修改代码,有很灵活的数据解决方案 缺点:自己分配账户,和后端数据库权限管理独立,权限处理不够灵活。
2、Mycat实现MySQL主从复制读写分离
部署jdk环境
MyCAT用Java开发,需要有JAVA运行环境,mycat依赖jdk1.7的环境
1)上传jdk
[root@localhost tools]# ll jdk-7u45-linux-x64.tar.gz
-rw-r--r-- 1 root root 138094686 10月 24 2013 jdk-7u45-linux-x64.tar.gz
2)安装jdk
[root@localhost tools]# mkdir /usr/java
[root@localhost tools]# tar xf jdk-7u45-linux-x64.tar.gz -C /usr/java/
3)设置环境变量
[root@localhost tools]# vim /etc/profile.d/java.sh
4)测试
[root@localhost tools]# java -version
安装Mycat
1)上传mycat包
[root@localhost tools]# ll Mycat-server-1.5.1-RELEASE-20161130213509-linux.tar.gz
-rw-r--r--. 1 root root 11499865 12月 15 16:33 Mycat-server-1.5.1-RELEASE20161130213509-linux.tar.gz
2)解压
[root@localhost tools]# tar xf Mycat-server-1.5.1-RELEASE-20161130213509-
linux.tar.gz -C /usr/local/
3)添加环境变量
[root@localhost tools]# vim /etc/profile.d/mycat.sh
export PATH=$PATH:/usr/local/mycat/bin
[root@localhost tools]# source /etc/profile.d/mycat.sh
读写分离配置
1)不使用Mycat托管MySQL主从服务器,简单使用如下配置
[root@localhost tools]# cd /usr/local/mycat/conf
[root@localhost conf]# cp schema.xml{,.bak}
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100"
dataNode="dn1">
<dataNode name="dn1" dataHost="localhost1" database="db1" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="1"
slaveThreshold="100">
)<writeHost host="hostM1" url="192.168.95.120:3306" user="mycat"
password="123456">
<!– can have multi read hosts –>
<readHost host="hostS2" url="192.168.95.140:3306" user="mycat_r"
password="123456" />
<readHost host="hostS3" url="192.168.95.140:3307" user="mycat_r"
password="123456" />
<!--<writeHost host="hostS1" url="localhost:3316" user="root"
password="123456" />-->