1.MySQL数据库
MySQL作为世界上使用最为广泛的数据库之一,免费是其原因之一。但不可忽略的是它本身的功能的确很强大。随着技术的发展,在实际的生产环境中,由单台MySQL数据库服务器不能满足实际的需求。此时数据库集群就很好的解决了这个问题了。
采用MySQL分布式集群,能够搭建一个高并发、负载均衡的集群服务器。在此之前我们必须要保证每台MySQL服务器里的数据同步。数据同步我们可以通过MySQL内部配置就可以轻松完成,主要有 主从(master slave )复制和主主复制。
1.1 主从复制
在MySQL集群环境中,可以分为主节点与从节点,通过主从复制可以实现数据备份、故障转移、MySQL集群、高可用、读写分离等。
MySQL的主从复制是MySQL本身自带的一个功能,不需要额外的第三方软件就可以实现,其复制功能并不是copy文件来实现的,而是借助binlog日志文件里面的SQL命令实现的主从复制,可以理解为我再Master端执行了一条SQL命令,那么在Salve端同样会执行一遍,从而达到主从复制的效果。
原理如下:
- 从库生成两个线程,一个I/O线程,一个SQL线程;
- I/O线程去请求主库 的binlog,并将得到的binlog日志写到relay log(中继日志) 文件中;
- 主库会生成一个 log dump 线程,用来给从库 i/o线程传binlog;
- SQL 线程,会读取relay log文件中的日志,并解析成具体操作,来实现主从的操作一致,而最终数据一致;
2.主从复制环境配置
首先准备两台服务器:
服务器 | ip |
---|---|
主数据库服务器 | 192.168.162.132 |
从数据库服务器 | 192.168.162.133 |
2.1 安装MySQL
在「192.168.162.132」和「192.168.162.133」上安装MySQL,此处不再详述,参考了文章:
安装完成,均可访问:
2.2 主MySQL服务器配置
1.配置my.cnf
vi /etc/my.cnf
新增以下内容:
server_id=132 ###服务器id
log-bin=mysql-bin ###开启日志文件
2. 重启mysql服务
service mysqld restart
mysql -u root -p
3. 验证是否已经配置成功
能够查询对应配置文件中的server_id 说明已经配置成功:
show variables like '%server_id%';
4.能够看到同步的文件,和行数说明已经配置成功
show master status;
2.3 从MySQL服务器配置
1.配置my.cnf
vi /etc/my.cnf
配置内容如下:
server_id=133 ###从服务器server_id
log-bin=mysql-bin ###日志文件同步方式
binlog_do_db=test ###同步数据库
2.重启mysql服务
service mysqld restart
mysql -u root -p
3.验证是否已经配置成功
能够查询对应配置文件中的server_id 说明已经配置成功
show variables like '%server_id%';
2.4 主从复制测试
1.从服务器同步主服务器配置
先查看主服务器状态:
show master status;
从服务器配置主服务器:
CHANGE MASTER TO master_host = '192.168.162.132',
master_user = 'root',
master_password = '123456',
master_log_file = 'mysql-bin.000001',
master_log_pos = 1148;
开始同步:
start slave;
4.查询同步状态
SHOW SLAVE STATUS
显示正在等待主节点发送:
2. 主服务器创建test数据库,新建表并插入数据:
create database test;
use test;
CREATE TABLE `t_user` (
`uuid` VARCHAR ( 200 ) NOT NULL,
`name` VARCHAR ( 50 ) DEFAULT NULL,
`age` INT ( 11 ) DEFAULT NULL,
`sex` VARCHAR ( 10 ) DEFAULT NULL,
PRIMARY KEY ( `uuid` )
);
INSERT INTO `test`.`t_user`(`uuid`, `name`, `age`, `sex`) VALUES ('0000-0000-0000-0001', 'zhangsan', 18, '0');
INSERT INTO `test`.`t_user`(`uuid`, `name`, `age`, `sex`) VALUES ('0000-0000-0000-0002', 'lisi', 20, '0');
3.验证
可以看到从服务器192.168.162.133已经从主服务器192.168.162.132里同步内容过来了:
现在我在主服务器添加一条数据:
INSERT INTO `test`.`t_user`(`uuid`, `name`, `age`, `sex`) VALUES ('0000-0000-0000-0003', 'wangwu', 30, '0');
可以看到从服务器133马上从132同步数据过去了。
2.4 注意事项
1. UUID冲突问题:
检查从服务器复制功能状态
SHOW SLAVE STATUS
如果在查询的日志中,出现错误:
Fatal error: The slave I/O thread stops because
master and slave have equal MySQL server UUIDs; these UUIDs must be
different for replication to work.
这是因为服务器克隆的时候交UUID产生了重复
解决办法(删除auto.cnf文件):
cd /var/lib/mysql
rm -rf auto.cnf
然后重启服务器即可:
service mysqld restart
2. 停止同步:
另外停止从服务器同步的命令:
stop slave;