mysql集群技术:主主复制

时间:2022-09-15 08:44:17

mysql集群技术:主主复制

主从复制,2台服务器地位有差别,一主一从.
从服务器一是起到备份作用,一是起到分担查询压力的作用.

接下来的配置,2台服务器之间,没有明显的地位差距, 两者可以同步对方的内容.
一般的格局如下图:
两台服务器相互复制

Created with Raphaël 2.1.0 主库166 主库166 主库168 主库168 主库166更新,则主库168也更新 主库166与主库168的地位是平等的 主库168更新,则主库166也更新

大致步骤:

1: 2台服务器都设置上二进制日志和relay日志

2: 都设置上replcation账号

3: 都设置对方为自己的master

配置my.cnf

说白了就是把主服务器和从服务器配置整合在一起,让他们都具有主服务器和从服务器的功能

#主库166配置开始
# 给服务器起一个唯一的 id
server-id=166
# 开启二进制日志
log-bin=mysql-bin
# 指定日志格式 有mixed|row|statement 推荐mixed
binlog-format=mixed
# 从服务器中继日志
realy-log=mysql-relay
#主库166配置结束
#主库168配置开始
server-id=168
# 开启二进制日志
log-bin=mysql-bin
# 指定日志格式 有mixed|row|statement 推荐mixed
binlog-format=mixed
# 从服务器中继日志
realy-log=mysql-relay
#主库168配置结束

在服务器上分别要复制的主服务器

master_log_file对应主服务器 show master status中的File
master_log_pos对应主服务器 … status中的position
master_host 分别对应主服务器

mysql> change master to
master_host='192.168.1.166',
master_user='repl',
master_password='123456',
master_log_file='mysql-bin.000001',
master_log_pos=0;
Query OK, 0 rows affected (0.00 sec)

主主复制下一定要注意避免的问题———同步冲突

例:

create table stu (
id int primary key auto_increment.
)......

2台mysql地位相等, 假如2个请求同时到达2台服务器,
请求的A节点, stu 的id为1
请求的B 节点, stu的id为1 ,
同步—>冲突

如何解决?

让1台服务器 1,3,5,7来增长
另1台服务器 2,4,6,8来增长

一台服务器:

set global auto_increment_increment = 2;#每步增长1
set global auto_increment_offset = 1;从1开始增长
set session auto_increment_increment = 2;
set session auto_increment_offset = 1;

另一台服务器:

set global auto_increment_increment = 2;
set global auto_increment_offset = 2;
set session auto_increment_increment=2;
set session auto_increment_offset = 2;

注:auto-increment-increment 和 auto-increment-offset 要写到配置文件中,防止下次重启后失效.

操作后得到如下类似效果

mysql> select id,hit from news;
+----+-------------------+

| id | hit |
| 1 | 100 |
| 3 | 200 |
| 4 | 300 |
| 6 | 400 |
+----+-------------------+

4 rows in set (0.00 sec)

如果后期需要加服务器,这个办法就有限制了.
我们可以在业务逻辑上来解决,
以redis为例, 我们可以专门构建一个 global:id
每次PHP插入Mysql前,先 incr->global:id, 得到一个不重复的id。
或则预先生成一个ID池,当需要时去取。

被动模式下的主主复制

是指 2台服务器地位一样, 但其中一台为只读,并且业务中也只写某1台服务器.

好处: 如果供写入的服务器出了故障,能迅速的切换到从服务器,
或者出于检修等目的,把写入功能切换到另一台服务器也比较方便.

#主库166配置开始
# 给服务器起一个唯一的 id
server-id=166
# 开启二进制日志
log-bin=mysql-bin
# 指定日志格式 有mixed|row|statement 推荐mixed
binlog-format=mixed
# 从服务器中继日志
realy-log=mysql-relay
#主库166配置结束
#主库168配置开始
server-id=168
# 开启二进制日志
log-bin=mysql-bin
# 指定日志格式 有mixed|row|statement 推荐mixed
binlog-format=mixed
# 从服务器中继日志
realy-log=mysql-relay


#-----------增加----------
#当变量对复制从服务器设置为ON时,从服务器不允许更新,除非通过从服务器的线程或用户拥有SUPER权限。可以确保从服务器不接受客户端的更新命令。
read_only=ON
#主库168配置结束