MySQL主从复制及读写分离

文章详细介绍了MySQL主从复制的原理,包括master和slave线程的角色,以及如何配置一主两从的复制环境。接着,重点讲述了如何基于已有的主从配置实现读写分离,提到了Mycat、mysql-proxy和Amoeba等工具的优缺点,并给出了使用Mycat进行读写分离配置的基本步骤。
摘要由CSDN通过智能技术生成

目录

1.理解MySQL主从复制原理。

2.完成MySQL主从复制(一主两从)。

3.基于MySQL一主两从配置,完成MySQL读写分离配置


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" />-->

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值