MySQL的主从、主主、被动主主搭建

来源:互联网 发布:js页面获取当前时间 编辑:程序博客网 时间:2024/05/21 17:07

第一、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; #每步增长2set 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; #每步增长2set 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客户就可以,因为proxymysql的前端代理

注意proxy的端口是4040

mysql -h “proxyIP” -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 u0uid[10, 20) ---> user partition u1uid [20, MAX] --> user partion u2

分区 按range分区
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));

第四、MySQL的事务:

 原子性:是指某几句sql的影响,要么都不发生,要么都发生;
 一致性:事务前后的数据。保持业务上的合理一致;
 隔离性:在事务进行过程中,其他事务看不到此事务的任何效果;
 持久性:事务一旦放生,不能取消  只能通过补偿性事务,来抵消效果;


事务的使用流程:
开启事务      start  transaction
执行事务      xxxxx
提交事务     commit
回滚事务      rollback



设置事务的级别(从低到高):

set session transaction isolation level [read uncommitted | read committed | repeatable read | serializable]


read uncommitted:读未提交的食物内容显然不符合原子性,称为“脏读”;


read commited:在一个事物进行过程中,读不到另外一个进行事务的操作,但是可以读到另外一个结束事务的操作影响;


repeatable read:可重复读,即在一盒事务过程中,所有信息都来自食物开始那一瞬间的信息,不受其他已提交的事务的影响(大多数的系统用此隔离级别);


serializeable串行化:所有的事务必须编号按顺序一个一个来执行也就取消了冲突的可能。这样隔离级别最高,但事务相互等待的等待长,在使用也不是很多。







0 0
原创粉丝点击