在Linux(CentOS7)下进行MySQL主从配置

大型网站为了软解大量的并发访问,除了在网站实现分布式负载均衡,远远不够。到了数据业务层、数据访问层,如果还是传统的数据结构,或者只是单单靠一台服务器来扛,如此多的数据库连接操作,数据库必然会崩溃,数据丢失的话,后果是不堪设想的。这时候,我们会考虑如何减少数据库的联接,一方面采用优秀的代码框架,进行代码的优化,采用优秀的数据缓存技术如:redis、memcached,如果资金丰厚的话,必然会想到架设服务器群,来分担主数据库的压力。这里讲一下利用MySQL主从配置,实现读写分离,减轻数据库压力。这种方式,在如今很多网站里都有使用。

准备工作

假设有两台Linux(CentOS7)服务器,都装有MySQL 5.x版本的数据库。

如果没有安装,可以参看

https://alexyanglong.github.io/2018/05/12/%E5%9C%A8Linux%EF%BC%88CentOS7%EF%BC%89%E4%B8%8B%E5%AE%89%E8%A3%85MySQL5.x/

里面有安装的详细步骤。

配置Master

修改配置文件

在/etc/my.cnf下

1
vim /etc/my.cnf

使用vim编辑器进行编辑,在 [mysqld] 下增加如下配置:

1
2
3
4
5
6
# Mysql-Master Config
server-id=200 # 设置主服务器的ID
innodb_flush_log_at_trx_commit=2 # 操作系统崩溃或者系统断电的情况下,上一秒钟所有事务数据才可能丢失
sync_binlog=1 # 开启binlog日志同步功能
log-bin=mysql-bin-200 # binlog日志文件名
binlog-do-db=xxxx # 这个表示只同步某个库,前提是主从服务器都有此数据库(如果没有此项,表示同步主服务器中所有的库)

修改完成之后,重启MySQL的服务

授权

1
mysql -uroot -p

进入数据库

执行下面的语句创建从机访问主机的用户名、密码并授权

1
2
grant replication slave on *.* to 'username'@'slave ip' identified by 'password';
# 授权给从数据库服务器,用户名,密码

查看主库的状态

1
show master status;
mysql-master-slave1
mysql-master-slave1

其中File是主机log-bin的日志文件,Position是主机现在执行SQL的点(这两个很重要,在配置从机时要使用),Binlog_Do_DB是主从同步的数据库,这里没有是因为之前没有指定要同步的数据库。

配置Slave

修改配置文件

修改从机的配置文件和主机差不多,也是在/etc/my.cnf中,增加如下内容:

1
2
3
4
5
# Mysql-Slave Config
server-id=201 # 从机服务器ID,注意要和主机不一样
innodb_flush_log_at_trx_commit=2
sync_binlog=1
log-bin=mysql-bin-201

重启数据库MySQL服务

启动从机

1
mysql -uroot -p

进入数据库

使用如下命令连接Master

1
change master to master_host='master ip',master_user='username' ,master_password='password', master_log_file='xxxx' ,master_log_pos=xxxx;

其中master ip 即为主服务器的ip,username、password为之前主机给从机授权的username、password,master_log_file、master_log_pos 为之前在主机中查看状态中的 File、Position。

启动从机

1
start slave; ##开启从库 (stop slave; 关闭从库)

查看连接状态

1
show slave status \G;  # Slave_IO_Running,Slave_SQL_Running 都为Yes的时候表示配置成功
mysql-master-slave2
mysql-master-slave2

验证主从

如果主服务器配置时没有指定数据库,可以在主服务器上创建一个数据库,看从机是否可以同步。

如果主服务器配置时指定了数据库,可以在主服务器的的这个库中创建一张表,看从机是否可以同步。