Linux 搭建mysql读写分离:
1.关闭两台服务器的防火墙:systemctl stop firewalld
主从配置:
主服务器配置
1.配置my.cnf
(1).去掉log-bin=mysql-bin前的# //允许mysql使用binlog,开启主从复制(关键)。
(2).多个数据库的配置:
binlog-do-db=数据库名1
binlog-do-db=数据库名2
binlog-do-db=数据库名3
binlog-ignore-db=mysql(忽略mysql自身用的数据库)
(3).查看server-id 不能重复
(4).查看expire-log-day //binlog过期时间,默认为10天。
2.操作数据库
(1).创建一个授权的账号:
create user 'repl'@'%' identified with mysql_native_password by '123456'
GRANT REPLICATION SLAVE on *.* TO 'repl'@'%'
允许从服务器'10.121.0.220'使用'slave_account'及'123456'这个账号密码对主服务器的所有数据库*.*进行主从复制(REPLICATION SLAVE)
(2).重启mysql是上述配置生效:service mysql restart
(3).查看主服务器的binlog状态:show master status
记下File及Position下的值。以备在配置从服务器时使用。
注意:File:当前binlog的文件名,每重启一次mysql,就会生成一个新binlog文件
Position:当前binlog的指针位置
从服务器配置
1.配置my.cnf
(1)修改server-id=2 (该值不能与主服务器的server-id同)
(2)添加如下两行:
relay-log-index=slave-relay-bin.index (中继日志的索引文件)
relay-log=slave-relay-bin (中继日志的文件前缀)
(3)重启mysql使上述配置生效
(4)登录mysql: mysql -uroot -p你的密码
(5)停止主从复制服务: stop slave
(6)主从关联配置
change master to
master_host='10.121.0.110', #主服务器IP
master_user='repl', #主服务器访问从服务器的用户,即上述第三条第2小条第2子条所述帐号
master_password='123456', #主服务器访问从的密码,即上述第三条第2小条第2子条所述密码
master_log_file='mysql-bin.000008', #主服务器起始的binlog文件名,即图2的file
master_log_pos=107; #主服务器binlog起始位置,即图2的postion
(7)启动从服务: start slave
(8) 查看从服务的状态,判断从服务是否生效: show slave status\G; (G参数为纵向显示结果)
如果Slave_IO_Running和Slave_SQL_Running都显示YES,则表示从与主的读写通讯正常、主动复制已经运行,则表明我们主从复制已经设置成功
四、权限配置
虽然某些mysql版本不进行如下操作,可能也能正常运行,但我还是强列建议你设置。否则,必有安全之虑。
1、为master分配select、insert、update、delete权限
mysql>GRANT SELECT,INSERT,UPDATE,DELETE ON *.* TO '数据库的帐号'@'WEB服务器的IP' identified by '密码'。
注意,虽然master只负责写,但也必须有select权限。原因是使用事务时,需要从master查询,二是update/delete这些命令都需要使用select权限。
2、为slave分配select权限
mysql> GRANT SELECT ON *.* TO '数据库的帐号'@'WEB服务器的IP' identified by '密码';
这样设置也有一个弊端,就是当主宕机时,读写分离机制分主动将写操作转到从上来,这时,就会出现写不正常的情况。所以,slave要分配哪些权限,还看你自己选择。
五、防火墙配置
刚才我们为了调试方便,先关闭了防火墙,但这样做,非常很不安全。特别是数据库服务器,关系公司的身家性命,更不可小视。
主从复制的防火墙,还是比较好设置的,如果你只有一台web服务器,则只需要在主、从服务器的iptables里开放2个授权即可。先在主服务器执行如下命令:
# iptables INPUT -s 10.121.0.220 -j ACCEPT (允许从服务器访问)
# iptables INPUT -s 10.121.2.142 -j ACCEPT (允许web服务器访问)
# service iptables save (保存上述规则)
# service iptables restart (重启iptables)
在从中将第一条换成主的IP即可。
设置完后,再在从上用show slave status看看主从复制是否正常。
放行指定端口:
firewall-cmd --add-port=443/tcp --permanent
systemctl restart firewalld
firewall-cmd --query-port=443/tcp
放行指定IP:
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.60.155" accept"
systemctl restart firewalld
firewall-cmd --list-all
放行指定IP和端口:
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.60.155" port protocol="tcp" port="8090" accept"
systemctl restart firewalld
删除指定规则
firewall-cmd --permanent --remove-rich-rule="rule family="ipv4" source address="192.168.60.155" port protocol="tcp" port="8090" accept"
六、一些故障排除
设置过程中,可能会出现如下几个故障
(1) Slave_IO_Running: No
(2) Slave_IO_Running: Connect
(3)Last_IO_Error: error connecting to master 'slave-account@192.168.0.110:3306' - retry-time: 60 retries: 8640
其实上述故障,都是由IO不正常造成的,请从如下几个步骤着手检查。
a.配置完主或从的my.cnf后,是否重启了mysql服务。如果重启还不成功,则可以用reboot命令重启服务器后再试
b.change master那一步所填写的信息是否正确。
(4)Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server ids; these ids must be different for replication to work (or the --replicate-same-server-id option must be used on slave but this does not always make sense; please check the manual before using it).
如上是说主、从使用了相同的server-id,进入my.cnf检查,改正之,然后重启mysql服务。
1.打开(master)配置文件my.ini,在[mysql]的后面添加如下代码:
server-id=1 #master的标示
log-bin=mysql-bin #slave会基于此log-bin来做replication
binlog-do-db=test #用于master-slave的具体数据库
binlog_ignore_db=mysql #不用于master-slave的具体数据库
binlog_ignore_db=information_schema #和binlog-do-db一样,可以设置多个
2.进入(master)的mysql服务,输入以下命令:
show master status;
3.给从库复制权限
grant replication slave on *.* to 'slave'@'192.168.1.%' identified by '123456';
4.打开从库1的mysql安装目录,打开配置文件my.ini,在[mysql]的后面添加如下代码:
server-id=2 #比刚刚主库设定的server-id大就行了,且从库之间不能有一样
log-bin=mysql-bin #slave会基于此log-bin来做replication
replicate-do-db=test #用于master-slave的具体数据库
5.保存后启动从库1的mysql服务,进入mysql的命令行,输入如下代码:
stop slave;
再改变它的master:
change master to master_host='192.168.1.65',
master_port=3306,
master_user='slave',
master_password='123456',
master_log_file='mysql-bin.000040',
master_log_pos=717;
再启动它的slave:
start slave;
然后再输入如下代码,检查是否成功:
show slave status\G;