0%

Mysql-集群、主从复制、读写分离

集群、主从复制、读写分离

Mysql-集群、主从复制、读写分离

从库备份主库,读写分离后,从库可以读,主库可以写和读。

单击mysql做不到:高可用、高并发、海量数据(5千万)

主从复制,读写分离原理:主库中事务提交后,写入到 bin log 中,从库I/O读取bin log日志到从库日志relay日志,然后从relay日志中将数据放入从库中。

从库备份主库。mysql中做配置,从主库的一定的位置开始复制。

主从复制mysql配置:

主服务器配置

1.修改my.cnf文件

1
2
3
4
5
6
7
8
9
10
11
#启用二进制日志 
log-bin=mysql-bin
#服务器唯一ID,一般取IP最后一段
server-id=133
#指定复制的数据库(可选)
binlog-do-db=test2
binlog-ignore-db=test
#指定不复制的数据库(可选,mysql5.7)
replicate-ignore-db=test1
#指定忽略的表(可选,mysql5.7)
replicate-ignore-table = db.table1

2.重启mysql服务

1
systemctl restart mysqld

3.主机给从机授权备份

1
2
GRANT REPLICATION SLAVE ON *.* TO 'root'@'%' identified by 'root'; 
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' identified by 'root';

4.刷新权限

1
FLUSH PRIVILEGES;

5.查询mater的状态

1
mysql> show master status;

主从备份: mysqldump

从服务器配置

1.修改my.cnf文件

1
2
[mysqld]
server-id=135

2.重启并登录到mysql配置从服务器

1
2
3
4
5
6
7
8
9
10
11
12
13
show slave status \G;
#关闭
stop slave
#同步初始化 master_log_file、master_log_pos 以主机状态为主
show master status

change master to
master_host= '192.168.56.101',
master_port=3306,
master_user='root',
master_password='***',
master_log_file='mysql-bin.000059',
master_log_pos=394;

3.启动从服务器复制功能

1
start slave;

4.检查从服务器复制功能状态

1
2
3
4
5
show slave status \G;
# ......(省略)
# Slave_IO_Running: Yes //此状态必须YES
# Slave_SQL_Running: Yes //此状态必须YES
# ......(省略)

测试:

向主机插入数据,看从机是否有数据。

1
2
3
# 插入失败时解决方案:
set global sql_slave_skip_counter =1; # 忽略一个错误
start slave

主从延时

  1. 因为SQLThread和IOThread是默认单线程,当主机的tps(每秒事务处理数)高于从机的Thread所能承受范围,则会出现从机复制延时

    解决:将thread改成多线程模式 MySQL5.6改表,MySQL5.7改GTID

  2. 网络延时

    解决:主和从放在一个网内

  3. IO延时

    解决 :slave server硬件升级

解决方案: 利用分库分表中间件 Mycat、 sharding JDBC强制读取主库

读写分离

一个库对外工作,性能限制在一个库。多个库对外工作,增加数据库负载能力。

主从集群中,让主库负责写和部分读,从库负责读。即读写分离。

Mysql-Proxy

代理。负责路由SQL到Master或Slave

安装
1
2
3
4
5
#下载
wget https://downloads.mysql.com/archives/get/file/mysql-proxy-0.8.5-linux-el6- x86-64bit.tar.gz

#解压缩
tar -xf mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz -C /plan
配置

创建mysql-proxy.cnf文件

1
2
3
4
5
6
7
8
9
10
11
12
[mysql-proxy] 
user=root
admin-username=root
admin-password=123456
proxy-address=192.168.10.137:4040
proxy-backend-addresses=192.168.10.135:3306
proxy-read-only-backend-addresses=192.168.10.136:3306
proxy-lua-script=/root/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua
log-file=/root/mysql-proxy/logs/mysql-proxy.log
log-level=debug
keepalive=true
daemon=true

修改mysql-proxy.cnf文件的权限

1
chmod 660 mysql-proxy.cnf #可读写

修改rw-splitting.lua

1
2
40		min_idle_connections = 1,
41 max_idle_connections = 2,

Mysql-Ploxy启动域测试

1
./mysql-proxy --defaults-file=mysql-proxy.cnf配置文件的地址

连接Mysql Proxy机器

1
mysql -uroot -p123456 -h192.168.56.102 -P4040; #注: 关闭防火墙