概述
集群目的
- 负载均衡:解决高并发
- 高可用HA:服务可用性
- 远程灾备:数据有效性
1.在主库上把数据更改记录到二进制日志文件中
2.备库I/O线程将主库上的日志复制到自己的中继日志中
3.备库SQL线程读取中继日志中的事件,将其重放到备库数据库上
集群案例
准备环境
- 五台全新服务器
- 全新安装mysql必须每台单独安装,因为数据库ID不同
- 五台主机分别命名:
pg0.zhipenghe.com
pg1.zhipenghe.com
pg2.zhipenghe.com
pg3.zhipenghe.com
pg4.zhipenghe.com - 每台配置好域名解析,也可使用DNS
搭建DNS服务器详情参阅:DNS服务器搭建
一主一从(M-S)(手动)
主服务器配置
一、准备数据
二、pg0.zhipenghe.com上的二进制日志开启
[root@pg0 ~]# vim /etc/my.cnf
[mysqld]
log_bin //开启二进制日志
server_id=1 //数据库id设置为1,每一台数据库id不能相同
三、创建复制数据用户
mysql> grant replication slave,replication client on *.* to 'rep'@'192.168.100.%' identified by 'Xyz@123456';
四、主服务器备份
有关备份请参阅:数据库备份
[root@pg0 ~]# mysqldump -p'Xyz@123456' --all-databases \
> --single-transacation \
> --master-data=2 \
> --flush-logs \
> >`date +%F`-mysql-all.sql
[root@pg0 ~]# ls
2021-05-16-mysql-all.sql
五、将备份文件拷贝到从服务器上
[root@pg0 ~]# scp -r 2021-05-16-mysql-all.sql pg1.zhipenghe.com:/tmp
观察二进制日志分割点
[root@pg0 ~]# vim 2020-05-16-mysql-all.sql
六、更新主服务器数据
mysql> insert into class.y2101 values (9,"JH",26,'1');
mysql> insert into class.y2101 values (10,"GW",19,'0');
从服务器配置
一、检查rep用户是否可用
[root@pg1 ~]# mysql -h pg0.zhipenghe.com -urep -p'Xyz@123456'
二、启动服务器序号
[root@pg1 ~]# vim /etc/my.cnf
[mysql]
server_id=2
[root@pg1 ~]# systemctl restart mysqld //重启服务是否正常
三、手动同步数据
mysql> set sql_log_bin=0
mysql> source /tmp/2021-05-16-mysql-all.sql
四、设置主服务器
mysql> change master to master_host='pg0.zhipenghe.com', //主服务器主机名
-> master_user='rep', //拷贝使用的用户
-> master_password='Xyz@123456', //密码
-> master_log_file='pg0-bin.000002', //从哪儿开始考
-> master_log_pos=154; //日志裁断的节点
mysql> start slave; //启动从设备
mysql> show slave status\G; //查看主服务器状态
如果查看到以下两行显示YES表示设置成功了
五、测试
在主服务器上更新数据,到从服务器查看
一主一从(M-S)(自动)
前面步骤与手动基本一毛一样
只需要在主和从的/etc/my.cnf配置文件中加入以下行数据:
[mysqld]
...
gtid_mode=ON //强制开启Gtid
enforce_gtid_consistency=1 //自动协商id
在设置主服务器的时候将代码改为
mysql> change master to master_host='pg0.zhipenghe.com',
-> master_user='rep',
-> master_password='Xyz@123456',
-> master_auto_position=1; //自动进行日志位置的记录
设置完成之后就可以进行测试了
双主双从(MM-SS)
双主
前言
- 前面的实验,主服务器单节点设置,假如主服务器故障会影响全局的写入时间,故设置双是主
- 目前已经设置了pg0为pg1的主服务器
- 只需要设置pg1为pg0的主服务器即可
设置pg1为pg0的主服务器
一、在pg1上进行授权
mysql> grant replication slave,replication client on *.* to 'rep'@'192.168.100.%' identified by 'Xyz@123456';
mysql> flush privileges;
二、设置pg0的主服务器
mysql> change master to master_host='pg1.zhipenghe.com',
-> master_user='rep',
-> master_password='Xyz@123456',
-> master_auto_position=1;
mysql> start slave;
mysql> show slave status\G;
三、测试
在pg0上插入数据在pg1上查看
在pg1上插入数据在pg0上查看
注意:这时还需要开启pg1上的二进制日志记录才能成功
双从
一、同步现有数据库
- pg0
[root@pg0 ~]# mysqldump -p'Xyz@123456' \
> --all-databases \
> --master-data=2 \
> --flush-logs \
> > `date +%F`-mysql-all.sql
[root@pg0 ~]# scp -r 2021-05-17-mysql-all.sql pg2.zhipenghe.com:/tmp
[root@pg0 ~]# scp -r 2021-05-17-mysql-all.sql pg3.zhipenghe.com:/tmp
- pg2
[root@pg2 ~]# mysql -p'Xyz@123456' < /tmp/2021-05-17-mysql-all.sql
- pg3
[root@pg3 ~]# mysql -p'Xyz@123456' < /tmp/2021-05-17-mysql-all.sql
二、启动从服务器id、gtid
- pg2
[root@pg2 ~]vim /etc/my.cnf
[mysqld]
server-id=3
gtid_mode=ON
enforce_gtid_consistency=1
master-info-repository=TABLE //把主的信息存在表里,安全
relay-log-info-repository=TABLE //把中继日志也存在表里,安全
[root@pg2 ~]# systemctl restart mysqld
- pg3
[root@pg3 ~]# vim /etc/my.cnf
[mysqld]
server-id=4
gtid_mode=ON
enforce_gtid_consistency=1
master-info-repository=TABLE //把主的信息存在表里,安全
relay-log-info-repository=TABLE //把中继日志也存在表里,安全
[root@pg3 ~]# systemctl restart mysqld
三、设置主服务器
- pg2
mysql> change master to master_host='pg0',
-> master_user='rep',
-> master_password='Xyz@123456',
-> master_auto_position=1
-> for channel 'pg0.zhipenghe.com'; //第一条通道
mysql> change master to master_host='pg1',
-> master_user='rep',
-> master_password='Xyz@123456',
-> master_auto_position=1
-> for channel 'pg1.zhipenghe.com'; //第二条通道
mysql> start slave;
mysql> show slave status\G;
- pg2
mysql> change master to master_host='pg0',
-> master_user='rep',
-> master_password='Xyz@123456',
-> master_auto_position=1
-> for channel 'pg0.zhipenghe.com'; //第一条通道
mysql> change master to master_host='pg1',
-> master_user='rep',
-> master_password='Xyz@123456',
-> master_auto_position=1
-> for channel 'pg1.zhipenghe.com'; //第二条通道
mysql> start slave;
mysql> show slave status\G;
四、测试
- pg0插入数据
- pg1插入数据
- pg2查看
- pg3查看