第一、MySQL主从复制简单配置:
MySQL主从原理图:
选择俩台服务器:
master-199主服务器:
1.vim打开my.cnf,配置以下:
#server-id设置唯一id
server-id=199
#binary log(二进制日志)
log-bin=mysql-bin
#statement row mixed(二进制日志的格式)
binlog-format=mixed
2.启动MySQL
3.进入MySQL设置账号
->grant replication client,replication slave on *.*
->to 'repl'@'192.168.%.%'
->identified by 'password'
slave-200从服务器:
1.vim打开my.cnf,配置以下:
#server-id设置唯一id
server-id=200
relay-log=mysql-relay
2.启动MySQL
3.进入MySQL
mysql -h 192.168.1.200 -uroot
4.切换master
change master to
master_host="主服务器ip",
master_user='主服务器上设置的用户repl',
master_password='主服务器上设置的密码password',
master_log_file='在主服务器show master status查看出来的File',
master_log_pos='在主服务器show master status查看出来的Position';
如果4有写错的使用reset slave重置
5.启动slave
start slave
6.查看状态
show slave status \G
@主服务器的日志格式用哪种好?
有statement,row,mixed三种,其中mixed是指前2中的混合
row:影响1行,且为新增1行,对于其他行没有影响
这个情况一般用row格式,直接复制磁盘上1行的新增变化
statement:影响多磁盘上多个row的变化时,使用statement格式的日志
mixed:这是MySQL提供的,可以根据语句的不同而自动选择适合的日志格式
第二、猪猪复制
199服务器:
1.vim打开my.cnf,配置以下:
#server-id设置唯一id
server-id=199
#binary log(二进制日志)
log-bin=mysql-bin
#statement row mixed(二进制日志的格式)
binlog-format=mixed
#relay log
relay-log=mysql-relay
2.启动MySQL
3.进入MySQL设置账号
->grant replication client,replication slave on *.*
->to 'repl'@'192.168.%.%'
->identified by 'password'
4.切换master
change master to
master_host="200服务器ip",
master_user='200服务器上设置的用户repl',
master_password='200服务器上设置的密码password',
master_log_file='在200服务器show master status查看出来的File',
master_log_pos='在200服务器show master status查看出来的Position';
如果4有写错的使用reset slave重置
5.启动slave
start slave
6.查看状态
show slave status \G
200服务器:
1.vim打开my.cnf,配置以下:
#server-id设置唯一id
server-id=200
#binary log(二进制日志)
log-bin=mysql-bin
#statement row mixed(二进制日志的格式)
binlog-format=mixed
#relay log
relay-log=mysql-relay
2.启动MySQL
3.进入MySQL设置账号
->grant replication client,replication slave on *.*
->to 'repl'@'192.168.%.%'
->identified by 'password'
4.切换master
change master to
master_host="199服务器ip",
master_user='199服务器上设置的用户repl',
master_password='199服务器上设置的密码password',
master_log_file='在199服务器show master status查看出来的File',
master_log_pos='在199服务器show master status查看出来的Position';
如果4有写错的使用reset slave重置
5.启动slave
start slave
6.查看状态
show slave status \G
解决主主复制时的主键冲突:
199服务器:
set session auto_increment_increment=2; #每步增长2
set session auto_increment_offset=1; #从1开始增长
set global auto_increment_increment=2;
set global auto_increment_offset=1;
200服务器:
set session auto_increment_increment=2; #每步增长2
set session auto_increment_offset=0; #从0开始增长
set global auto_increment_increment=2;
set global auto_increment_offset=2;
注:auto_increment_increment 和 auto_increment_offset 写入配置文件中,防止下次重启后失效;
如果后期加服务器这个就有限制了:
比如在racle有sequnce序列,序列每次访问生成递增 递减的数据
以redis为例,我们可以专门创建一个global:userid;
每次PHP插入MySQL前,先incr->global:userid得到一个不重复的userid;
第三、被动主主复制
#被动主主(设置为可读)
在my.cnf中加:read-only=1
show variables like '%read%';
当主服务器宕机时直接修改read-only
切换主写,从读的方法:
1.直接在PHP的MySQL类做判断
class mysql {
$dbm = "主服务器";
$dbs1 = "从服务器1";
$dbs2 = "从服务器2";
public function query() {
在query里面进行语句判断
分别连接不同的mysql服务器
}
}
2.可以使用集群中间件
比如:官方的mysql_proxy 还有国产的中间件:amoeba
实例:mysql读写分离、mysql_proxy实现
(1)下载安装mysql_proxy:
wget http://mysql.cdpa.nsysu.edu.tw/Downloads/MySQL-Proxy/mysql-proxy-0.8.3-linux-glibc2.3-x86-64bit.tar.gz
解压后, 该目录包含已经编译好的二进制文件.
1: 利用mysql_proxy实现负载均衡
执行mysql_proxy
./mysql-proxy-path/bin/mysql-proxy \
--proxy-backend-addresses=192.168.1.199:3306 \
--proxy-backend-addresses=192.168.1.200:3306
2: 连接mysql_proxy,用mysql客户就可以,因为proxy是mysql的前端代理
注意proxy的端口是4040
mysql -h “proxy的IP” -P 4040 -u username -p password
mysql_proxy会把连接mysql服务器的tcp/IP连接缓存进连接池,以提高性能.
在缓存池里, 缓存的连接大致是平均分配在每台mysql服务器上.
但具体的每一个连接,始终连某台服务器.
启动:
./bin/mysql-proxy \
--proxy-backend-addresses=192.168.1.199:3306 \
--proxy-read-only-backend-addresses=192.168.1.200:3306 \
--proxy-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua
简写启动:mysql_proxy
./bin/mysql-proxy -b 192.168.0.199:3306 -r 192.168.0.200:3306 -s /usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua --daemon
使用:partition分区
示例: 按列的范围来分区以用户表为例, uid
uid [1,10) ---> user partition u0
uid[10, 20) ---> user partition u1
uid [20, MAX] --> user partion u2
create table goods (
id int,
uname char(10)
)engine myisam
partition by range(id) ( #表示要以id来分块
partition p1 values less than (10), #表示id(0-10)
partition p2 values less than (20), #表示id(11-20)
partition p3 values less than MAXVALUE #表示id(大于20)
);
原子性:是指某几句sql的影响,要么都不发生,要么都发生;
一致性:事务前后的数据。保持业务上的合理一致;
隔离性:在事务进行过程中,其他事务看不到此事务的任何效果;
持久性:事务一旦放生,不能取消 只能通过补偿性事务,来抵消效果;
事务的使用流程:
开启事务 start transaction
执行事务 xxxxx
提交事务 commit
回滚事务 rollback
设置事务的级别(从低到高):
set session transaction isolation level [read uncommitted | read committed | repeatable read | serializable]