1. 两台 mysql 都可以读写, 互为主备, 默认只是用一台 (masterA) 负责数据的写入, 另一台 (masterB) 备用;
2. masterA 是 masterB 的主库, masterB 又是 masterA 的主库, 他们互为主从;
不足之处:
1. masterB 可能处于抑制空闲状态 (可以用他当从库, 负责部分查询);
2. 主库后面提供服务的从库要等 masterB 先同步完了数据后才能去 masterB 上去同步数据, 肯能会造成一定程度的同步延迟;
搭建环境
系统: CentOS7
数据库版本: 5.6.36
masterA 地址: 192.168.188.2
masterB 地址: 192.168.188.3
安装目录:/usr/local/mysql/
数据目录:/data/mysql/
A 与 B 机器都安装好了 MySQL, 数据库与表都提前同步好;
防火墙配置
iptables
添加 mysql 同学端口 (默认 3306)
- vim /etc/sysconfig/iptables // 编辑 iptables 文件, 也可以用 iptables 命令来添加, 不过要保存命令
- -A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT // 添加允许 3306 端口通过
- service iptables restart // 重启 iptables 服务
关闭 selinux
- vim /etc/selinux/config // 编辑 SELinux 配置文件
- SELINUX=disabled // 修改值为 disabled 为关闭
服务器设置
masterA 设置 (192.168.188.2)
- vim / etc / my.cnf // 编辑 my.cnf 文件
- server - id = 2 // 增加 server-id 为 2, 一般为自己 ip
- log_bin = test01 // 设置 log_bin 名为 test01
- / etc / init.d / mysqld restart // 重启 mysql 服务
- mysql - uroot - p123456 // 登录 mysql, 不要照抄,-u 后面是账号,-p 后面是密码
- grant replication slave on * . * to 'repl'@'192.168.188.3'identified by '123456'; // 创建 mysql 账号 repl, 只容许指定 ip 访问, 也可以指定 ip 范围 192.168.188.%, 其中 % 为通配符, 表示所有;
- flush privileges; // 刷新授权表信息
- flush tables with read lock; // 锁定数据库表暂时无法写服务;
- show master status; // 查看 binlog 文件值与 pos 值
- stop slave; // 关闭同步
masterB 设置 (192.168.188.3)
- vim /etc/my.cnf
- server-id=3 // 增加 server-id 为 3, 一般为自己 ip
- log_bin=test02 // 设置 log_bin 名为 test02
- /etc/init.d/mysqld restart // 重启 mysql 服务
- mysql -uroot -p123456 // 登录 mysql
- grant replication slave on *.* to 'repl'@'192.168.188.2' identified by '123456'; // 创建用户, 允许 192.168.188.2 登录本机器
- flush privileges; // 刷新授权表
- stop slave; // 关闭同步
- show master status; // 查看 binlog 文件值与 pos 值
- change master to master_host='192.168.188.2', master_user='repl', master_password='123456', master_log_file='test01.000001', master_log_pos=664383; // 这里注意 log_file 与 pos 值都要对应对应 A 的 show master status; 值
- start slave; // 开启同步
masterA 设置
- change master to master_host='192.168.188.3', master_user='repl', master_password='123456', master_log_file='test02.000001', master_log_pos=664343; // 这里 log_file 与 pos 值写的必须是 B 上 show master status; 的值
- start slave; // 开启同步
- unlock tables; // 解锁写
测试主主
在 A 的 test 数据库下建立 t1 表, B 上查询后有 t1 表, 证明 B 能同步 A 修改的数据;
在 B 的 test 数据库下建立 t2 表, A 上查询, 有 t2 表, 证明 A 能同步到 B 修改后的数据;
masterA 设置
- mysql -uroot -p123456 // 登录 mysql
- mysql> use test; // 切换到数据库 test
- mysql> show tables; // 查看当前数据库的所有表, 这里没有一个表
- Empty set (0.00 sec)
- mysql> create table t1(`id` int(4),`name` char(40)); // 插入一个表 t1
- mysql> show tables; // 查看当前数据库的表
- +----------------+
- | Tables_in_test |
- +----------------+
- | t1 |
- +----------------+
- 1 row in set (0.00 sec)
- masterB
- mysql -uroot -p123456 // 登录 mysql
- use test; // 切换到数据库 test
- mysql> show tables; // 查询同步到数据库 test 下出现了 t1 表, 证明 B 能同步 A 的数据;
- +----------------+
- | Tables_in_test |
- +----------------+
- | t1 |
- +----------------+
- 1 row in set (0.00 sec)
- create table t2(`id` int(4),`name` char(40)); // 新建一个 t2 表, 如果 A 能同步到, 就证明 A 能同步到 B
切换 masterA(省略了登录与切换数据库的命令)
- mysql> show tables; // 查询 A 的 test 数据库下所有的表
- +----------------+
- | Tables_in_test |
- +----------------+
- | t1 |
- | t2 |
- +----------------+
- 2 rows in set (0.00 sec)
来源: http://www.bubuko.com/infodetail-2550575.html