目前大部分的主流数据库都提供主从热备功能,通过配置两台数据主从关系,可以将一台数据库服务的数据更新同步到另一台服务器上。
网站利用数据库的这一功能,实现数据库的读写分离,从而减轻数据库负载压力。
主数据库负责写操作,从数据库负责查
Mysql 的主从配置教程已经非常多了,但是不亲手实践一下,终究还是有点虚啊
材料两台服务器 Mysql 版本一致
我测试时使用版本为
[root@localhost etc]# mysql -V mysql Ver 14.14 Distrib 5.5.58, for Linux (x86_64) using readline 5.1
主库IP:192.168.0.88
从库IP:192.168.0.89
1、配置Master主服务器
连接数据库
mysql -uroot -proot
添加一个用于主从同步的用户 repl,并且密码是123456,并允许192.168.0.89 服务器可以通过远程访问Master,通过该用户读取二进制日志,实现数据同步
create user repl; ///repl用户必须具有REPLICATION SLAVE权限,除此之外没有必要添加不必要的权限 GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.0.89' IDENTIFIED BY '123456';
查找数据库配置文件一般为 my.cnf 位置在 /etc/my.cnf
不确定的可以使用 whereis my.* 搜索一下
[root@localhost /]# whereis my.* my: /etc/my.cnf
先将此文件备份
cd /etc cp my.cnf my.cnf.back
编辑此文件
vim my.cnf
主要找到两个地方 server-id 与 log-bin
#我的配置现在还是默认的,已经被注释了 #log-bin=mysql-bin #binlog_format=mixed #server-id = 1
然后把这俩个的注释打开。binlog_format 意思是日志格式,现在不是我的重点,先不管。如何设置具体可看这篇文章binlog_format 如何设置
log-bin=master-bin #binlog_format=mixed server-id = 1
保存之后,退出mysql,exit; 重启Mysql
service mysql restart;
重启之后,连接Mysql 查看 Master 主机状态
show master status\G
这里不需要加分号,加的话会多出一个错误 No query specified,成功情况下会出现以下内容;
这里的参数在配置从数据库时需要使用,Master 服务器就算配置完成了
mysql> show master status\G *************************** 1. row *************************** File: mysql-bin.000003 Position: 107 Binlog_Do_DB: Binlog_Ignore_DB: 1 row in set (0.00 sec) mysql>
2、配置从数据库
按照第一步找到mysql配置文件的路径,修改配置
vim /etc/my.cnf
将
#log-bin=mysql-bin #binlog_format=mixed #server-id = 1
修改成:
#log-bin=mysql-bin #binlog_format=mixed server-id = 2
从服务器没必要开启bin-log日志,所以 log-bin 也不用开
现在要测试下,从服务器与主服务器的通讯状态,
在从服务器的数据库 使用 主服务器刚刚创建的用户 repl 远程连接试下
mysql -urepl -p123456 -h 192.168.0.88
如果连接不成功,检查下 iptables,或者暂时关闭 iptable
// 查看已有规则 iptables -L //清除 iptable iptable -F
连接成功之后,继续从服务器的操作,注意是从服务器
重新连接从服务器Mysql,执行
CHANGE MASTER TO MASTER_HOST='192.168.0.88', MASTER_USER='repl', MASTER_PASSWORD='123456', MASTER_LOG_FILE='mysql-bin.000003', MASTER_LOG_POS= 107;
MASTER_LOG_FILE 与 MASTER_LOG_POS 的值为配置主服务器时的值(此处 各参数详解看这里),
如果不记得了可以在主服务器的Mysql 使用如下命令查看
show master status\G
执行成功,启动Slave
start slave;
查看主从同步状态
show slave status\G
成功的重要参考是上图两个 YES,简单的主从配置就可以了,详细的配置可以再了解了解
主库用来更新,从库用来查询,读写分离就ojbk啦~~
———————————————分割线—————————————————————
我在第一次配置的时候,最后一步也没有成功
此处 Slave_IO_Running: Connecting 并没有 yes
其实命令也给出了错误原因的,我的错误是主服务器拒绝连接
检查顺序
1、iptables 是否关闭
iptables -L
2、账号权限是否足够
主服务器Mysql
show grants for 'repl';
如权限有 REPLICATION SLAVE 那证明没问题
mysql> show grants for 'repl'; +-----------------------------------------------------------------------------------------------------------------+ | Grants for repl@% | +-----------------------------------------------------------------------------------------------------------------+ | GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%' IDENTIFIED BY PASSWORD '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9' | +-----------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec)
3、账号密码是否错误(一般是这个,注意不能有空格)
清空 researt slave 日志
mysql> stop slave; mysql> reset slave;
重新执行参数
CHANGE MASTER TO MASTER_HOST='192.168.0.88', MASTER_USER='repl1', MASTER_PASSWORD='123456', MASTER_LOG_FILE='mysql-bin.000003', MASTER_LOG_POS= 107;
重新查看结果
mysql> start slave; mysql> show slave status\G
4、MASTER_LOG_FILE ,MASTER_LOG_POS 不能错误
检查方式,主服务器执行 show master status\G
mysql> show master status\G 收工