mysql复制技术、mysql集群

打印 上一主题 下一主题

主题 705|帖子 705|积分 2115

mysql复制技术/mysql集群


准备

1.四台虚拟机都关闭防火墙
  1. systemctl stop firewalld
  2. systemctl disable firewalld
复制代码
2.四台虚拟机都设置好host域名解析,在/etc/hosts文件中添加如下
  1. [root@mysql01 ~]# vim /etc/hosts
  2. 192.168.70.33 master1
  3. 192.168.70.34 master2
  4. 192.168.70.35 slave1
  5. 192.168.70.36 slave2
  6. 五台机器都ping一下网络
  7. [root@mysql01 ~]# ping master1
  8. PING master1 (192.168.70.33) 56(84) bytes of data.
  9. 64 bytes from master1 (192.168.70.33): icmp_seq=1 ttl=64 time=0.031 ms
  10. 64 bytes from master1 (192.168.70.33): icmp_seq=2 ttl=64 time=0.050 ms
  11. 64 bytes from master1 (192.168.70.33): icmp_seq=3 ttl=64 time=0.056 ms
复制代码
3.在干净的环境下安装好mysql(yum、二进制、源码都行)
​        四台mysql统一密码方便后续使用
  1. [root@mysql02 ~]# grep password /var/log/mysqld.log
  2. 2023-08-13T13:44:46.837257Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: 7R_e*/+_)(l8
  3. [root@mysql02 ~]# mysqladmin -uroot -p password
  4. Enter password:
  5. New password:
  6. Confirm new password:
复制代码
一、mysql M-S 传统

master设置

1.首先在master1中创建数据库、表 模拟服务器已经运行一段时间
  1. mysql> create database xux;
  2. Query OK, 1 row affected (0.00 sec)
  3. mysql> use xux;
  4. Database changed
  5. mysql> create table xux.t1(id int(10));
  6. Query OK, 0 rows affected, 1 warning (0.02 sec)
  7. mysql> insert into xux.t1 values(1),(2);
  8. Query OK, 2 rows affected (0.09 sec)
  9. Records: 2  Duplicates: 0  Warnings: 0
  10. mysql> select * from xux.t1;
  11. +------+
  12. | id   |
  13. +------+
  14. |    1 |
  15. |    2 |
  16. +------+
  17. 2 rows in set (0.00 sec)
复制代码
2.设置master的mysql配置
  1. 1.因为是备库中的i/o线程将主库中的二进制日志复制到中继日志中,所以需要打开二进制日志,同时设置好server-id。
  2. 在/etc/my.cnf文件下[mysqld]下面添加
  3. vim /etc/my.cnf
  4. [mysqld]
  5. log-bin
  6. server-id=1
  7. [root@mysql01 ~]# tail -2 /etc/my.cnf
  8. log-bin
  9. server-id=1
  10. 2.设置好后重启mysql
  11. systemctl restart mysqld
复制代码
3.创建复制用户
  1. mysql> CREATE USER 'rep'@'192.168.70.%' IDENTIFIED BY 'Xuxin_0709';
  2. mysql> GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'rep'@'192.168.70.%';
  3. Query OK, 0 rows affected (0.00 sec)
  4. mysql> FLUSH PRIVILEGES;
复制代码
4.备份数据
  1. [root@mysql01 ~]# mysqldump -u root -p 'Xuxin_0709' --all-databases --single-transaction --master-data=2 --flush-logs > `date +%F`-mysql-all.sql
复制代码
扩展(可忽略)
​        如果设置--master-data=1 后续slave设置主服务器可以不用填master_log_file和master_log_pos,但是数据库导入必须使用source导入
5.复制给slave
  1. [root@mysql01 ~]# scp ./2023-08-14-mysql-all.sql master2:/root
复制代码
6.再插入一些数据
  1. mysql> insert into xux.t1 values(3);
  2. Query OK, 1 row affected (0.01 sec)
  3. mysql> select * from xux.t1;
  4. +------+
  5. | id   |
  6. +------+
  7. |    1 |
  8. |    2 |
  9. |    3 |
  10. +------+
  11. 3 rows in set (0.00 sec)
复制代码
slave设置

1.测试授权的用户
  1. [root@mysql02 ~]# mysql -hmaster1 -urep -p'Xuxin_0709'
复制代码
2.开启server-id
  1. [root@mysql02 ~]# vim /etc/my.cnf
  2. [mysqld]
  3. server-id=2
  4. [root@mysql02 ~]# systemctl restart mysqld
复制代码
3.导入数据库
  1.         先进入mysql暂停log-bin日志记录,不记录导入数据的记录
  2. mysql> set sql_log_bin=0;
  3. Query OK, 0 rows affected (0.00 sec)
  4. 导入sql
  5. mysql> source 2023-08-14-mysql-all.sql
  6. 或者在linux界面导入
  7. [root@localhost ~]# mysql -uroot -p < /2023-08-14-mysql-all.sql
  8. mysql> select * from xux.t1;
  9. +------+
  10. | id   |
  11. +------+
  12. |    1 |
  13. |    2 |
  14. +------+
  15. 2 rows in set (0.00 sec)
复制代码
4.查看sql中的日志master_log_file和master_log_pos
​        [root@mysql01 ~]# vim 2023-08-14-mysql-all.sql

5.设置主服务器
  1. mysql> change master to master_host='master1',master_user='rep',master_password='Xuxin_0709',master_log_file='mysql01-bin.000002',master_log_pos=157;
复制代码
6.启动从设备并查看slave状态
  1. mysql> start slave;
  2. show slave status\G
复制代码

7.查看数据可以发现数据已同步
  1. mysql> select * from xux.t1;
  2. +------+
  3. | id   |
  4. +------+
  5. |    1 |
  6. |    2 |
  7. |    3 |
  8. +------+
  9. 3 rows in set (0.01 sec)
复制代码
测试

再来测试一下
在master1 xux.t1表中插入数据 看看slave机器会不会同步数据
1.在master1机器登录mysql插入数据
  1. mysql> insert into xux.t1 values(4);
  2. Query OK, 1 row affected (0.01 sec)
复制代码
2.在slave机器查看数据
  1. mysql> select * from xux.t1;
  2. +------+
  3. | id   |
  4. +------+
  5. |    1 |
  6. |    2 |
  7. |    3 |
  8. |    4 |
  9. +------+
  10. 4 rows in set (0.00 sec)
复制代码
二、mysql M-S GTID

准备

为接下来新的同步实验需要将之前的同步设置清空,也就是重置master2的mysql
  1. systemctl stop mysqld
  2. rm -rf /var/lib/mysql/*
  3. systemctl start mysqld
  4. grep password /var/log/mysqld.log
  5. mysql -uroot -p'w#lHVC_Rc30r'
  6. mysqladmin -uroot -p password
复制代码
master设置

1.启动二进制日志,服务器ID,GTID
由于我们之前配置过了id这里只需配置GTID。配置完后重启mysqld
  1. [root@mysql01 ~]# vim /etc/my.cnf
  2. gtid_mode=ON
  3. enforce_gtid_consistency=1
  4. [root@mysql01 ~]# systemctl restart mysqld
复制代码
2.授权复制用户rep(上面M-S传统已配置 这里忽略)
3.备份数据
为了实验方便这里把之前的sql备份文件删掉
  1. [root@mysql01 ~]# rm -rf 2023-08-14-mysql-all.sql
  2. 备份一份新的
  3. [root@mysql01 ~]# mysqldump -u root -p --all-databases --single-transaction --master-data=2 --flush-logs > `date +%F`-mysql-all.sql
  4. 传给master2
  5. [root@mysql01 ~]# scp ./2023-08-14-mysql-all.sql master2:/root/
复制代码
4.模拟数据变化
  1. mysql> insert into xux.t1 values(5);
  2. Query OK, 1 row affected (0.01 sec)
  3. mysql> select * from xux.t1;
  4. +------+
  5. | id   |
  6. +------+
  7. |    1 |
  8. |    2 |
  9. |    3 |
  10. |    4 |
  11. |    5 |
  12. +------+
  13. 5 rows in set (0.00 sec)
复制代码
slave设置

1.测试rep用户是否可用
  1. [root@mysql02 ~]# mysql -hmaster1 -urep -p'Xuxin_0709'
复制代码
2.启动二进制日志,服务器ID,GTID,配置完后重启mysqld
  1. [root@mysql02 ~]# vim /etc/my.cnf
  2. server-id=2
  3. log_bin
  4. gtid_mode=ON
  5. enforce_gtid_consistency=1
  6. [root@mysql01 ~]# systemctl restart mysqld
复制代码
3.恢复手动同步数据
  1. 先关闭log-bin日志记录mysql> set sql_log_bin=0;导入数据mysql> source /root/2023-08-14-mysql-all.sql;查询一下数据mysql> select * from xux.t1;
  2. +------+
  3. | id   |
  4. +------+
  5. |    1 |
  6. |    2 |
  7. |    3 |
  8. |    4 |
  9. +------+
  10. 4 rows in set (0.00 sec)
复制代码
4.设置主服务器
  1. mysql> change master to master_host='master1',master_user='rep',master_password='Xuxin_0709',master_auto_position=1;
复制代码
5.启动slave并查看数据
  1. mysql> start slave;
  2. Query OK, 0 rows affected, 1 warning (0.02 sec)
  3. mysql> select * from xux.t1;
  4. +------+
  5. | id   |
  6. +------+
  7. |    1 |
  8. |    2 |
  9. |    3 |
  10. |    4 |
  11. |    5 |
  12. +------+
  13. 5 rows in set (0.01 sec)
复制代码
三、mysql M-M-S-S

考虑到主服务器如果宕机,那个整个集群的写入能力将会受到影响,那么可以设置双主多从的方式,为数据做好保障。
M-M

因为前面大多数设置已经设置好了,下面是在上面已完成步骤的基础下操作
1.在master2上进行授权 (可忽略)
  1. 查看user表 发现之前已经创建用户并授权了 如果没有就创建用户并授权与上述操作一致不再赘述
  2. mysql> select user,host from mysql.user;
  3. +------------------+--------------+
  4. | user             | host         |
  5. +------------------+--------------+
  6. | rep              | 192.168.70.% |
  7. | mysql.infoschema | localhost    |
  8. | mysql.session    | localhost    |
  9. | mysql.sys        | localhost    |
  10. | root             | localhost    |
  11. +------------------+--------------+
  12. 5 rows in set (0.01 sec)
  13. 在master1上测试
  14. [root@mysql01 ~]# mysql -urep -hmaster2 -p'Xuxin_0709';
复制代码
2.配置master1
  1. mysql> change master to master_host='master2',master_user='rep',master_password='Xuxin_0709',master_auto_position=1;   //基于GTID
  2. 让master1也有从的功能,所以现在master1 master2都即是主,也是从。
  3. mysql> start slave;
复制代码
3.测试
  1. 在master2中插入数据
  2. mysql> insert into xux.t1 values(6);
  3. 在master1看数据是否会同步
  4. mysql> select * from xux.t1;
  5. +------+
  6. | id   |
  7. +------+
  8. |    1 |
  9. |    2 |
  10. |    3 |
  11. |    4 |
  12. |    5 |
  13. |    6 |
  14. +------+
  15. 6 rows in set (0.00 sec)
复制代码
S-S

1.先把master1数据备份 传给slave1 slave2
  1. [root@mysql01 ~]# mysqldump -u root -p'Xuxin_0709' --all-databases --single-transaction --master-data=2 --flush-logs > mmss-mysql-all.sql
  2. [root@mysql01 ~]# scp mmss-mysql-all.sql slave1:/root
  3. [root@mysql01 ~]# scp mmss-mysql-all.sql slave2:/root
复制代码
2.在slave1 slave2 导入数据(两台机器都导入数据)
  1. [root@mysql03 ~]# mmysql -uroot -p'Xuxin_0709' < mmss-mysql-all.sql
  2. [root@mysql04 ~]# mmysql -uroot -p'Xuxin_0709' < mmss-mysql-all.sql
复制代码
3.配置slave1 slave2 (从服务器没必要开启log-bin)并重启
  1. [root@mysql03 ~]# vim /etc/my.cnf
  2. server-id=3
  3. gtid_mode=ON
  4. enforce_gtid_consistency=1
  5. master-info-repository=TABLE
  6. relay-log-info-repository=TABLE
  7. [root@mysql04 ~]# vim /etc/my.cnf
  8. server-id=4
  9. gtid_mode=ON
  10. enforce_gtid_consistency=1
  11. master-info-repository=TABLE
  12. relay-log-info-repository=TABLE
  13. [root@mysql03 ~]# systemctl restart mysqld
  14. [root@mysql04 ~]# systemctl restart mysqld
复制代码
4.设置主服务器
slave1
  1. mysql> change master to master_host='master1',master_user='rep',master_password='Xuxin_0709',master_auto_position=1 for channel 'master1';
  2. mysql> change master to master_host='master2',master_user='rep',master_password='Xuxin_0709',master_auto_position=1 for channel 'master2';
  3. mysql> start slave;
  4. mysql> show slave status\G
复制代码
slave2
  1. mysql> change master to master_host='master1',master_user='rep',master_password='Xuxin_0709',master_auto_position=1 for channel 'master1';
  2. mysql> change master to master_host='master2',master_user='rep',master_password='Xuxin_0709',master_auto_position=1 for channel 'master2';
  3. mysql> start slave;
  4. mysql> show slave status\G
复制代码
5.测试
在master1 master2 变更数据
​        master1
  1. mysql> insert into xux.t1 values(7);
  2. 查看master2 slave1 slave2数据是否变化
  3. mysql> select * from xux.t1;
复制代码
​        master2
  1. mysql> insert into xux.t1 values(8);
  2. 查看master1 slave1 slave2数据是否变化
  3. mysql> select * from xux.t1;
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

西河刘卡车医

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表