mysql 设置主从
Table of Contents
主从
主从:
异步实现
slave 的 IO thread
当有数据需要同步的时候, master 的 bin log dump 会传给 slave 的 IO thread, 否则 slave 会睡眠
slave 的 sql thread 负责将 bin log 从 master 下载到 slave
mysql 二进制日志文件
statement: 记录 sql 语句 (缺点, 像 insert now() 这样的函数会有问题)
row: 记录 sql 执行的结果 (缺点, 同时 update 多条语句的时候, 会记录太多数据)
mixed: 混合方式, 自动判断
提前准备:
iptables -F (防止连接不上) 如果主服务器之前有数据, 先备份 (然后传给 slave)
master
? vi /etc/my.cnf master-id=1 log-bin=mysql-bin binlog-format=mixed
slave
? vi /etc/my.cnf master-id=2 log-bin=mysql-bin binlog-format=mixed # 从服务器可以不开启二进制日志, 节约资源 relay-bin=mysql-relay
master
mysql> show master status; mysql> grant replication client,replication slave on *.* to ‘USER‘@‘YOUR_IP‘ identified by ‘YOUR_PASSWORD‘;
slave
mysql> change master to master_host=‘YOUR_IP‘, master_user=‘USER‘, master_password=‘YOUR_PASSWORD‘, mysql> master_log_file=‘mysql-bin.000005‘, master_log_pos=951, master_connect_retry=10; mysql> help change master to; mysql> start slave; mysql> show slave status\G mysql> stop slave; # 如果出现问题, 看 mysql 出错日志 /var/log/mysqld.log, 关闭防火墙 mysql> reset slave; mysql> start slave; # 解决问题后
master
mysql> show databases; mysql> create database tmp_test_db;
slave
mysql> show databases;
扩展升级
scale on, 向上扩展, 垂直扩展: CPU, 内存升级 (升级到了瓶颈之后, 会因为资源竞争而出现性能反而下降, 代价高)
scale out, 向外扩展, 水平扩展: 添加主机, 然后负载均衡, 需要调度器 (代理, nat, 旁路)
读写分离:
主: 写
从: 负载均衡, 读
- 需要一个专用 mysql 的调度器 (中间件), 知道什么 sql 语句需要写, 什么时候需要读
amoeba
mysql-proxy
- php 源码中, 人为控制对 slave 的代码进行 一致性 hash 算法, 对 master 进行写
为保证有缓存, 可以对 sql 语句进行 hash, 取特征码
主主复制: 互为主从, 也叫双主
双主模型的缺陷:
- auto_increment 有问题
解决:
设置 auto_increment_increment 起始值, 默认是 1 (修改一台为 1, 另一台为 2)
设置 auto_increment_offset, 默认是 1, 要修改为 2
- 数据不一致
在同步完成之前,双方都修改同一条记录 (有检测工具, 麻烦)
优点: 实现了均衡读, 不需要中间件, 非常简单, 写操作不变
数据分片, 分区 (高级, 难)
有虚拟 server, 管理多个 server
经常用的数据存在一个 server 上, 写的时候多每个 server 写上若干条
例如, 最近的微博存放在一个 server 上, 写的时候就均衡放置
然而如何确定读 server 要放置哪些内容, 如何放置, 写的时候如何写都是一个问题