mysql 主从同步&读写分离

本文介绍了MySQL主从复制的基本原理与配置步骤,包括单向异步复制的实现方式,以及通过读写分离提高数据库性能的方法。此外,还探讨了半同步复制的设置与验证过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一 介绍

1.mysql
Mysql作为目前世界上使用最广泛的免费数据库,在实际的生产环境中,由单台Mysql作为独立的数据库是完全不能满足实际需求的,无论是在安全性,高可用性以及高并发等各个方面。
因此,一般来说都是通过 主从复制(Master-Slave)的方式来同步数据,再通过读写分离(MySQL-Proxy)来提升数据库的并发负载能力 这样的方案来进行部署与实施的。

MySQL 支持单向、异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环。这些日志可以记录发送到从服务器的更新。当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通知新的更新。
请注意当你进行复制时,所有对复制中的表的更新必须在主服务器上进行。否则,你必须要小心,以避免用户对主服务器上的表进行的更新与对从服务器上的表所进行的更新之间的冲突

2.主从复制:
用来建立一个和主数据库完全一样的数据库环境,称为从数据库;主数据库一般是实时的业务数据库,从数据库的作用和使用场合一般有几个:
一是作为后备数据库,主数据库服务器故障后,可切换到从数据库继续工作;二是可在从数据库作备份、数据统计等工作,这样不影响主数据库的性能;
3.读写分离:
是指读与写分别使用不同的数据库,当然一般是在不同服务器上的;一般读写的数据库环境配置为,一个写入的数据库,一个或多个读的数据库,各个数据库分别位于不同的服务器上,充分利用服务器性能和数据库性能;当然,其中会涉及到如何保证读写数据库的数据一致,这个就可以利用主从复制技术来完成。
一般应用场合为:业务吞吐量很大,读数据库(可简单理解为select语句的比例和影响)的负载较大
4.工作机制
这里写图片描述
5.实验环境
RHEL 6.5
172.25.254.1 ——>(master)
172.25.254.4 ——>(slave)

二 mysql 主从同步

1.主从端安装mysql

 yum install -y mysql mysql-server

2.配置
1)master:
/etc/init.d/mysqld start

[root@server1 ~]# mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.1.71 Source distribution

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> GRANT REPLICATION SLAVE,RELOAD,SUPER ON *.* TO test@'172.25.254.4' IDENTIFIED BY 'test';
 ###创建用户,并授权

vim /etc/my.cnf ##更改配置文件

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
 # Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
log-bin=mysql-bin   ##启动二进制日志系统
binlog-do-db=test   ##二进制需要同步的数据库名
server-id=1          
binlog-ignore-db=mysql  ##避免同步 mysql 用户配置

/etc/init.d/mysqld restart
2)slave
vim /etc/my.cnf ##更改配置文件

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
server-id=2        ##与masterid不同
master-host=172.25.254.1  指定主服务器Ip
master-user=test          同步的用户
master-password=test      用户密码
master-port=3306          同步所用的端口
master-connect-retry=60   断开重新连接时间
replicate-ignore-db=mysql  屏蔽对mysql库的同步
replicate-do-db=test       同步数据库名称

/etc/init.d/mysqld restart
3)测试
master:

mysql> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 |      106 | test         | mysql            |
+------------------+----------+--------------+------------------+

slave:

mysql> slave stop;
Query OK, 0 rows affected (0.00 sec)

mysql> change master to master_host='172.25.254.1', master_user='test', master_password='test', master_log_file='mysql-bin.000002', master_log_pos=106;
Query OK, 0 rows affected (0.26 sec)

mysql> slave start;
Query OK, 0 rows affected (0.00 sec)

mysql> show slave status\G;  ##查看slave状态
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 172.25.254.1
                  Master_User: test
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000003
          Read_Master_Log_Pos: 106
               Relay_Log_File: mysqld-relay-bin.000003
                Relay_Log_Pos: 251
        Relay_Master_Log_File: mysql-bin.000003
             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
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)

ERROR: 
No query specified

4)测试2
master 创建表格:

mysql> use test;
Database changed
mysql>  create table test(id int(3),name char(10));
Query OK, 0 rows affected (0.13 sec)
mysql> insert into test values(001,'baba');
Query OK, 1 row affected (0.00 sec)
mysql> use test;
Database changed
mysql> select * from test;
+------+------+
| id   | name |
+------+------+
|    1 | baba |
+------+------+

slave端查看:

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| test               |
+--------------------+
3 rows in set (0.00 sec)

mysql> use test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> select * from test;
+------+------+
| id   | name |
+------+------+
|    1 | baba |
+------+------+

三 半同步复制

3.1mysql二进制日志的操作
master:

mysql> show variables like '%sync%';
sync_binlog                             | 1  
mysql> show variables like '%binlog%';
mysql> set global binlog_rows_query_log_events=on;
mysql> set global  binlog_row_image=minimal;
mysql的分库分表:(msr)多源复制

3.2mysql半同步
gtid异步同步设置好之后:
–只与io线程有关

ls /usr/lib64/mysql/plugin/   查看可加载模块
master:
[root@server2 mysql]# mysql -p
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME'semisync_master.so';  ##加载半同步模块
mysql> show plugins;   ##查看plugins,模块是否添加成功
| validate_password          | ACTIVE   | VALIDATE PASSWORD  | validate_password.so | GPL     |
| rpl_semi_sync_master       | ACTIVE   | REPLICATION        | semisync_master.so   | GPL     |
+----------------------------+----------+--------------------+----------------------+---------+
mysql> show variables like '%semi_sync%';   ##查看与半同步相关设置参数
mysql> set global rpl_semi_sync_master_enabled=1;   ##打开半同步
mysql> use test;
mysql> insert into usertb values ('user5','68');    ##插入数据,有10s的延迟
Query OK, 1 row affected (10.47 sec)

slave:

[root@server3 mysql]# mysql -p
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME'semisync_slave.so';  ##加载slave的半同步模块
mysql> set global rpl_semi_sync_slave_enabled=1;  ##半同步使能
mysql> show status like '%semi_sync%';    ##查看半同步状态
mysql> stop slave io_thread;     ##停止io线程
mysql> show slave status\G;      
  Slave_IO_Running: No
  Slave_SQL_Running: Yes
mysql> start  slave io_thread;    ##重启io线程,由异步切换到半同步
mysql> show status like '%semi_sync%';   
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| Rpl_semi_sync_slave_status | ON    |
+----------------------------+-------+

四 读写分离(amoeba)

1.Amoeba
Amoeba(变形虫)项目是一个开源框架,于2008年开始发布一款 Amoeba for Mysql软件;这个软件致力于MySQL的分布式数据库前端代理层,它主要在应用层访问MySQL的时候充当SQL路由功能,专注于分布式数据库代理层(Database Proxy)开发;位于 Client、DB Server(s)之间,对客户端透明;具有负载均衡、高可用性、SQL 过滤、读写分离、可路由相关的请求到目标数据库、可并发请求多台数据库并合并结果.
通过Amoeba能够完成多数据源的高可用、负载均衡、数据切片的功能,目前Amoeba已在很多企业的生产线上面使用;
2.配置主从复制架构
RHEL 6.5
172.25.254.1 ——>(master)
172.25.254.4 ——>(slave)
172.25.254.2 ——>(amoeba)
3.安装JDK
3.1解压到指定目录

tar zxf /mnt/jdk-7u79-linux-x64.tar.gz -C /usr/local/
cd /usr/local/
ln -s jdk1.7.0_79/ java

3.2配置JDK环境变量

vim /etc/profile   
export JAVA_HOME=/usr/local/java
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$PATH:$JAVA_HOME/bin
source /etc/profile       ##生效
echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/java/bin
echo $CLASSPATH
.:/usr/local/java/lib:/usr/local/java/jre/lib

4.ameoba安装

mkdir /usr/local/amoeba    ##创建amoeba目录
tar xf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba # 使用二进制程序文件安装amoeba
cd /usr/local/amoeba
bin/amoeba start # 前台运行
nohup /usr/local/amoeba/bin/amoeba start & # 后台运行
mysql -h127.0.0.1 -uroot -p -P8066 # amoeba默认监听端口为8066

4.1配置
vim /usr/local/amoeba/conf/amoeba.xml 前端配置
##前端监听端口
这里写图片描述
## 登陆密码

##节点
这里写图片描述
vim dbServers.xml # 后端配置
这里写图片描述
##后端ip地址
这里写图片描述
5.master 授权

MariaDB [(none)]> grant all on *.* to'root'@'172.25.254.2' identified by 'westos';
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> grant all on *.* to'root'@'%mysql.com' identified by 'westos'; # 这里的密码应该与dbServer.xml中的数据库密码一致
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.00 sec)

五 读写分离(myqsl-proxy)

环境:server4 —> proxy

server4(mysql-proxy):
tar zxf mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz
mv mysql-proxy-0.8.5-linux-el6-x86-64bit /usr/local/
cd /usr/local/
ln -s mysql-proxy-0.8.5-linux-el6-x86-64bit/ mysql-proxy
cd mysql-proxy
mkdir etc
cd etc/
vim mysql-proxy.conf

[mysql-proxy]
user=root
daemon=true
keepalive=true
log-level=debug
log-file=/usr/local/mysql-proxy/log/mysql-proxy.log
admin-username=admin
admin-password=westos
admin-lua-script=/usr/local/mysql-proxy/lib/mysql-proxy/lua/admin.lua
proxy-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua
proxy-backend-addresses=172.25.31.2:3306  ##后端主库
proxy-read-only-backend-addresses=172.25.31.3:3306 #后端从库
plugins=proxy,admin

cd ..
mkdir log

/usr/local/mysql-proxy/share/doc/mysql-proxy
vim rw-splitting.lua ##修改连接数来测试

 min_idle_connections = 1,
 max_idle_connections = 2,

chmod 660 mysql-proxy.conf
/usr/local/mysql-proxy/bin/mysql-proxy –defaults-file=/usr/local/mysql-proxy/etc/mysql-proxy.conf
netstat -antlp
mysql -h 172.25.31.4 -P 4041 -u admin -pwestos
mysql> select * from backends;
+————-+——————+——-+——+——+——————-+
| backend_ndx | address | state | type | uuid | connected_clients |
+————-+——————+——-+——+——+——————-+
| 1 | 172.25.31.2:3306 | up | rw | NULL | 0 |
| 2 | 172.25.31.3:3306 | up | ro | NULL | 0 |
+————-+——————+——-+——+——+——————-+

用户授权
server2(master):
mysql -pWestos+007
mysql> grant insert, select, update on . to admin@’172.25.31.%’ identified by ‘Westos+007’;

server3(slave):
mysql -pWestos+007
mysql> grant insert, select, update on . to admin@’172.25.31.%’ identified by ‘Westos+007’;

测试:
物理机:mysql -h 172.25.31.4 -P 4040 -u admin -pWestos_007 ##登陆连接访问数据库
MySQL [(none)]> use test;

在server2和server3上查看连接:
yum install lsof -y
lsof -i:3306

[root@server2 mysql]# lsof -i :3306
COMMAND  PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
mysqld  1228 mysql   33u  IPv6   8580      0t0  TCP *:mysql (LISTEN)
mysqld  1228 mysql   50u  IPv6   8589      0t0  TCP server2:mysql->server3:46140 (ESTABLISHED)
mysqld  1228 mysql   74u  IPv6   9278      0t0  TCP server2:mysql->server4:58435 (ESTABLISHED)
mysqld  1228 mysql   75u  IPv6   9279      0t0  TCP server2:mysql->server4:58436 (ESTABLISHED)
[root@server3 mysql]# lsof -i:3306
COMMAND  PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
mysqld  1235 mysql   17u  IPv6   8530      0t0  TCP *:mysql (LISTEN)
mysqld  1235 mysql   45u  IPv4   8573      0t0  TCP server3:46140->server2:mysql (ESTABLISHED)
mysqld  1235 mysql   49u  IPv6   9768      0t0  TCP server3:mysql->server4:38542 (ESTABLISHED)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值