文章目录
一、数据库的简介
1.数据库的简介
数据库,简而言之可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据进行新增、查询、更新、删除等操作。
所谓“数据库”是以一定方式储存在一起、能与多个用户共享、具有尽可能小的冗余度、与应用程序彼此独立的数据集合。
2.数据库的分类
如今互联网公司最常用的是关系型数据库和非关系型数据库,关系型数据库是以二维表格的形式来存放数据,而非关系型数据库也被成为NoSQL数据库,NOSQL的本意是“Not Olnly SQL” 指的是非关系型数据库,而不是“No SQL”的意思,因此,NoSQL的产生并不是要彻底地否定非关系型数据库,而是作为传统关系型数据库的一个有效补充。NOSQL数据库在特定的场景下可以发挥出难以想象的高效率和高性能。
二、数据库的复制
1.复制的种类
一般可分为异步复制,半同步复制,组复制和全同步复制
2.主从复制的配置
一般主从复制默认使用的是异步复制
通常没说明指的都是异步,即主库执行完Commit后,在主库写入Binlog日志后即可成功返回客户端,无需等等Binlog日志传送给从库,一旦主库宕机,有可能会丢失日志。
实验环境:
server1(主):172.25.21.1
server2(从):172.25.21.2
本机使用的版本是mysql-5.7.24-1.el7.x86_64.rpm-bundle.tar
tar xf mysql-5.7.24-1.el7.x86_64.rpm-bundle.tar ##解压这个安装包,可以看到它是tar格式不是gz的
ls ##可以看到安装包和许多附加模块
rm -fr
yum install *.rpm -y ##安装mysql,安装的模块如下图所示(server1和server2上都要安装)
(1)server1(主)的配置:
vim /etc/my.cnf ##修改配置文件(主从复制时以2进制日志来同步数据的)
server-id=1 ##id不能相同,不然可能会发生冲突
log-bin=mysql-bin
systemctl start mysqld ##开启服务,会生成一个默认密码,安全初始化会用到这个初始密码
cat /var/log/mysqld.log | grep password ##查看第一次启动服务时生成的初始密码
mysql_secure_installation ##安全初始化,本机使用密码为Yy+12345,为了防止混乱,本次实验的所有密码都使用这个
##修改密码后第一个为no,其他全为yes
mysql -uroot -pYy+12345 ##进入数据库测试
mysql> CREATE USER 'repl'@'172.25.21.%' IDENTIFIED BY 'Yy+12345'; ##创建一个远程登陆的用户,这里是21网段
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'172.25.21.%'; ##赋予权限让它当作一个master用户
mysql> flush privileges; ##刷新数据
mysql> show master status; ##查看主节点状态
(2)server2(从)的配置:
vim /etc/my.cnf ##修改配置文件
server-id=2 ##因为只是个从节点,所以在最后只加入id就行
systemctl start mysqld ##开启服务,会生成一个默认密码,安全初始化会用到这个初始密码
cat /var/log/mysqld.log | grep password ##查看第一次启动服务时生成的初始密码
mysql_secure_installation ##安全初始化,本机使用密码为Yy+12345,为了防止混乱,本次实验的所有密码都使用这个
##修改密码后第一个为no,其他全为yes
mysql -uroot -pYy+12345 ##进入数据库测试
测试:在server1上建立一个表并插入数据来测试:
mysql> create database westos;
mysql> use westos;
mysql> CREATE TABLE linux (username varchar(50) not null,password varchar(50) not null);
mysql> insert into linux values('user1','123');
mysql> select * from linux; ##查看表中的数据
在server2上查看可以看到相同的数据
三、gtid复制(也属于主从复制)
1.简介
在基于GTID的复制中,首先从服务器会告诉主服务器已经在从服务器执行完了哪些事务的GTID值,然后主库会有把所有没有在从库上执行的事务,发送到从库上进行执行,并且使用GTID的复制可以保证同一个事务只在指定的从库上执行一次,这样可以避免由于偏移量的问题造成数据不一致。
2.配制方法(在上个实验的基础上做)
(1)server1上的配置:
vim /etc/my.cnf ##修改配置文件
systemctl restart mysqld ##重启服务
cat /var/lib/mysql/auto.cnf ##查看mysql服务的uuid
(2)server2上的配置:
vim /etc/my.cnf ##修改配置文件
systemctl restart mysqld ##重启服务
[root@server2 ~]# mysql -uroot -pYy+12345 ##进入数据库改变master
mysql> stop slave; ##先停止同步
mysql> change master to master_host='172.25.21.1',master_user='repl',master_password='Yy+12345',master_auto_position=1;
##改变同步方式
mysql> start slave; ##开启同步
mysql> show slave status\G; ##查看gtid是否开启
mysql> select * from mysql.gtid_executed; ##查看gtid上的uuid是否为server1的
注意:应该在server1上插入一条数据再查看server2是否开启
四、半同步复制的配置
1.简介
半同步复制时,为了保证主库上的每一个binlog事务都能够被可靠的复制到从库上,主库在每次事物成功提交时,并不及时反馈给前段应用用户,而是等待其中一个从库也接收到binlog事务并成功写入中继日志后,主库才返回commit操作成功给客户端。半同步复制保证了事务成功提交后,至少有两份日志记录,一份在主库的binlog,另一份在至少一个从库的中继日志relaylog上,从而更近一步保证了数据的完整性
而且在两个数据库配置完成后,它们都是master,只要在一次同步失败后,默认等待10秒钟没有等到第二个库来同步,就会把未响应的库变位从库,从半同步变位异步复制
2.半同步服务的配置
(1)server1的配置:
mysql -uroot -pYy+12345
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; ##安装模块
mysql> SELECT PLUGIN_NAME,PLUGIN_STATUS
-> FROM INFORMATION_SCHEMA.PLUGINS
-> WHERE PLUGIN_NAME LIKE '%semi%'; ##查看服务状态
mysql> SET GLOBAL rpl_semi_sync_master_enabled =1; ##开启服务
mysql> SHOW VARIABLES LIKE 'rpl_semi_sync%'; ##查看服务的信息
(2)server2的设置:
mysql -uroot -pYy+12345
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'; ##安装模块
mysql> SELECT PLUGIN_NAME,PLUGIN_STATUS
-> FROM INFORMATION_SCHEMA.PLUGINS
-> WHERE PLUGIN_NAME LIKE '%semi%'; ##查看服务状态
mysql> SET GLOBAL rpl_semi_sync_slave_enabled =1; ##开启服务
mysql> STOP SLAVE IO_THREAD;
mysql> START SLAVE IO_THREAD; ##重启IO线程
mysql> show slave status\G; ##查看线程状态是否为yes
(3)测试:关闭server2的slave,在server1上再次插入数据查看同步时间
mysql> stop slave;
五、组同步
1.简介
组复制在数据库层面上做到了,只要集群中大多数主机可用,则服务可用,也就是说3台服务器的集群,允许其中1台宕机。当一个节点出现问题时,自动把它踢出集群,不影响其他节点的工作
2.配置方法
需要三台主机来创建一个集群,都是master,但是只有server1是发起者
(1)server1的配置:
cat /var/lib/mysql/auto.cnf ##配置文件中的uuid不能和这个文件中的相同
vim /etc/my.cnf ##修改配置文件
systemctl restart mysqld
mysql -uroot -pYy+12345
mysql> SET SQL_LOG_BIN=0; ##停止复制开始操作,不然会导致数据不同步
mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'Yy+12345'; ##创建一个用户来组同步使用
mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
mysql> FLUSH PRIVILEGES;
mysql> SET SQL_LOG_BIN=1; ##开启同步复制
mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='Yy+12345' FOR CHANNEL 'group_replication_recovery';
mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so'; ##安装模块
mysql> SET GLOBAL group_replication_bootstrap_group=ON; ##发起者才开启
mysql> START GROUP_REPLICATION; ##开启组服务
mysql> SET GLOBAL group_replication_bootstrap_group=OFF; ##开启组服务后关闭
mysql> SELECT * FROM performance_schema.replication_group_members; ##查看节点状态
(2)server2的配置和server3的配置基本相同:
vim /etc/my.cnf ##修改配置文件
systemctl restart mysqld
mysql -uroot -pYy+12345 ##进入mysql设置
mysql> SET SQL_LOG_BIN=0; ##停止复制开始操作,不然会导致数据不同步
mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'Yy+12345'; ##创建一个用户来组同步使用
mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
mysql> FLUSH PRIVILEGES;
mysql> SET SQL_LOG_BIN=1; ##开启同步复制
mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='Yy+12345' FOR CHANNEL 'group_replication_recovery';
mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so'; ##安装模块
set global group_replication_allow_local_disjoint_gtids_join=on; ##因为在server1上已经建立了一张表
mysql> START GROUP_REPLICATION; ##开启组服务
mysql> SELECT * FROM performance_schema.replication_group_members; ##查看节点状态
3.当组节点查询状态时不是ONLINE时,解决办法
recoveryring的3种可能:
(1)uuid的问题
(2)数据不同步的问题
(3)主机解析有问题
但是一般都是数据不同步的问题,所以我们来解决一下数据不同步的问题
(1)首先将server1的mysql数据备份
mysqldump --all-databases --single-transaction --routines --events --host=127.0.0.1
--port=3306 --user=root --password=Yy+12345 > dadump.db ##备份所有数据
scp ./dadump.db server2:/root/ ##将备份发送给server2
(2)在server2上恢复数据
mysql -uroot -pYy+12345
reset master; ##清空远程日志再导入备份
stop slave ## 关闭复制
mysql -pYy+12345 < dbdump.db ##将备份数据导入
CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='Yy+12345' FOR CHANNEL 'group_replication_recovery';
start slave; ##打开复制
START GROUP_REPLICATION; ##开启服务后,查询ok